v0.6.0: install fixes, client-agnostic backend, view port option#192
Open
v0.6.0: install fixes, client-agnostic backend, view port option#192
Conversation
The watch command now triggers a map recalculation after each successful file ingestion, keeping the architectural hierarchy up to date as code changes. In polling mode, the map is recalculated once per batch rather than per file. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Add InstanceAuth/InstanceConfig types and instances/active fields to IxConfig - getEndpoint() now resolves active cloud instance endpoint - getAuthToken() reads JWT from stored instance auth - storeAuth()/clearAuth() for credential management - refreshAuthIfNeeded() with 2-min buffer auto-refresh - IxClient auto-resolves auth token on construction - Bearer header attached to all API requests when authenticated Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add branch support to watch and patch types - Add optional branchId field to GraphPatchPayload - Add --branch flag to ix watch for branch-scoped ingestion - Thread branchId through both event-based and polling watch modes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: enhance GitHub transforms with source attrs and cross-entity edges - Add source/github_type/is_bug attrs to all GitHub-ingested nodes - Add parseFixesRefs() to extract "fixes #N"/"closes #N" from PR text - transformPR now generates RESOLVES edges linking PRs to referenced issues - Preserves existing kind mappings (issues→intent, PRs→decision, commits→doc) - Update tests: 7 tests covering new attrs, RESOLVES edges, parseFixesRefs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add Jira integration transforms and tests Add jira/ module with auth (token resolution), fetch (REST API + Agile API types, status mapping, transitions), and transform (ticket→intent, epic→goal, sprint→plan, comments, PART_OF edges). Includes 8 tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add embedding service and patch enrichment for semantic context engine Phase 1 client-side support for the semantic context engine: - EmbeddingService wrapping Voyage AI API with batch support and per-NodeKind content strategies - enrichPatchWithEmbeddings() post-processor that injects vector embeddings into UpsertNode ops - Enable ArangoDB experimental vector index flag in standalone docker-compose - Add .ix-worktrees/ to gitignore Embeddings are computed at ingestion time and stored in node attrs. Gracefully degrades when VOYAGE_API_KEY is not set — patches pass through unchanged. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add ix load command and multi-source content detection Thin CLI client for semantic ingestion: detect source type → fetch content → POST to backend /v1/load. Supports tweets, arxiv papers, PDFs, images, webpages, chat exports, and local files. Remove client-side embedding code (moved to ix-semantic-extraction service). Update docker-compose with ollama + semantic-extraction services. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: add auth header to abandonBranch fetch call Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…causes Users on Node 18 hit a bare "fetch failed" during ix map with no hint at the underlying cause. Root causes: (1) no engines field or runtime check, so install and startup succeed silently on EOL Node, and (2) ix map's error handler printed err.message, discarding the real transport error that undici stashes in err.cause. - Add engines.node >=20 to ix-cli/package.json - Add runtime Node major-version guard in ix-cli/src/cli/main.ts that exits early with an actionable message on Node <20 - Add formatFetchError in ix-cli/src/cli/errors.ts that unwraps err.cause for fetch TypeErrors, exposing codes like ECONNRESET / UND_ERR_SOCKET - Use formatFetchError at both error sites in ix-cli/src/cli/commands/map.ts - Document Node 20+ in README Requirements section
Node 18's bundled undici 5.x has a 300s headersTimeout default that silently kills long-running fetch calls like /v1/map, causing the reported "fetch failed" with no actionable detail. Node 20's undici 6.x fixed this. Node 18 is also EOL as of April 2025. The runtime guard in main.ts already enforces >=20, but the install scripts, build script, setup script, and requirements.txt still allowed 18 — meaning users could install successfully on Node 18 only to hit a cryptic failure at runtime. Updated: - scripts/install/install.sh (NODE_MIN_MAJOR) - scripts/install/install.ps1 ($NodeMinMajor) - scripts/build-cli.sh (version check + error message) - scripts/dev/setup.sh (hint text) - requirements.txt (node>=20, comment)
- Add -p shorthand alias for --port - Detect port conflicts before spawning the server - Verify server readiness after spawn instead of assuming success - Track port alongside PID in compass.json for accurate status display
Revert over-engineered STATE_FILE/readiness-signal refactor and keep only the minimal port-related additions: -p/--port on the parent view command, and a pre-flight isPortInUse check with a helpful error.
NEEDS HEAVY REVIEW: "needs heavy review as didnt verify this change for
additional bug for all of this, this could be completely wrong"
Client half of the client/backend separation. The backend no longer needs
host filesystem access; this side makes the client emit workspace-relative
paths as the canonical source_uri so no absolute host paths ever leave the
client process.
Client:
- core-ingestion/src/types.ts, ix-cli/src/client/types.ts:
PatchSource gains an optional workspaceId field. Documented that source.uri
is now a workspace-relative POSIX path, not an absolute host path.
- ix-cli/src/cli/commands/ingest.ts:
Compute workspaceRoot + workspaceId (SHA-256 of workspaceRoot abs path)
once per run. Convert absolute paths to workspace-relative before
dispatching to parseFile, buildGlobalResolutionIndex, and the parse pool,
so every deterministic node/patch/edge/chunk ID hashes relative paths.
Keep absolute paths only for local fs reads. Tag every built patch's
source with workspaceId. loadExistingHashes now queries the backend with
relative paths and maps the response back onto absolute keys.
On ingest startup, compare backend /v1/health schema_version against
CLIENT_EXPECTED_SCHEMA_VERSION=2 and force full re-ingest on mismatch
(node IDs change when the graph format flips from absolute to relative).
- ix-cli/src/cli/config.ts:
New absoluteFromSourceUri helper — joins a workspace-relative source_uri
against the active workspace root so commands that need to open files off
disk (ix read) can still do so.
- ix-cli/src/cli/format.ts:
relativePath now treats already-relative input as a no-op.
- ix-cli/src/cli/commands/read.ts:
Resolves sourceUri via absoluteFromSourceUri before any fs.* call so the
graph's workspace-relative paths still map to real files.
Infra:
- docker-compose.standalone.yml:
Removed the HOME bind mount (source: ${IX_HOST_MOUNT_ROOT:-$HOME},
target: $HOME, read_only: true) from the memory-layer service. The backend
is now client-agnostic and never reads host files. Closes the privacy hole
where the entire user HOME directory was bind-mounted into the backend
container.
- scripts/backend.sh, scripts/dev/shutdown.sh, scripts/install/install.sh:
Removed the IX_HOST_MOUNT_ROOT / IX_CONTAINER_MOUNT_ROOT exports that fed
that bind mount. dc() helpers remain so Windows/MINGW compose dispatch
still works.
Requires the matching ix-memory-layer change (StalenessDetector rewrite +
schema_version bump) on feat/client-agnostic-backend.
Every modified file carries a "NEEDS HEAVY REVIEW" banner. This change has
NOT been verified end-to-end and may be completely wrong — reviewers should
treat every line as suspect until validated against a real ingest + ix read
round-trip with the client-agnostic backend image.
cp -r preserves npm workspace symlinks in node_modules, which causes macOS tar to fail with 'Cannot extract through symlink' errors. Use cp -rL to dereference symlinks so tarballs contain real files.
…-error-unwrap' into dev-integration
…into dev-integration
- Remove unused IxClient import in load.ts - Replace regex-based script/style stripping with iterative stripBlocks to handle nested/malformed tags (CodeQL: bad HTML filtering regexp, incomplete multi-character sanitization) - Decode & last to prevent double-unescaping (CodeQL: double escaping or unescaping)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Integration of 4 PRs for testing before merging to main:
Source branches are preserved — nothing is closed or deleted.
Test plan
1. Fresh install (tarball symlink fix + Docker arm64 fix)
rm -rf ~/.ixcurl -fsSL https://ix-infra.com/install.sh | shixCLI extracts and runs:ix statusNote: This requires a new release tag to produce a fixed tarball. Until then, test CLI from source:
2. Client-agnostic backend (#189)
ix map --silentin a project — verify source_uri is workspace-relative (no absolute HOME paths)ix ingestworks with the new multi-source detectionix loadcommand worksdocker inspecton memory-layer container)3. View port option (#186)
ix view --port 9090— verify compass opens on custom portix view— verify default port still works4. Node version guard (#188)
ixshows a clear error message instead of crashing