Skip to content

v0.6.0: install fixes, client-agnostic backend, view port option#192

Open
riley0227 wants to merge 16 commits intomainfrom
dev-integration
Open

v0.6.0: install fixes, client-agnostic backend, view port option#192
riley0227 wants to merge 16 commits intomainfrom
dev-integration

Conversation

@riley0227
Copy link
Copy Markdown
Contributor

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)

  • Uninstall ix: rm -rf ~/.ix
  • Run curl -fsSL https://ix-infra.com/install.sh | sh
  • Verify backend starts (Docker containers healthy)
  • Verify ix CLI extracts and runs: ix status

Note: This requires a new release tag to produce a fixed tarball. Until then, test CLI from source:

cd Ix && npm install && npm run build && npm link

2. Client-agnostic backend (#189)

  • ix map --silent in a project — verify source_uri is workspace-relative (no absolute HOME paths)
  • ix ingest works with the new multi-source detection
  • ix load command works
  • Docker compose has no host bind mounts (check docker inspect on memory-layer container)

3. View port option (#186)

  • ix view --port 9090 — verify compass opens on custom port
  • ix view — verify default port still works

4. Node version guard (#188)

  • With Node < 18: verify ix shows a clear error message instead of crashing
  • API fetch errors show unwrapped messages instead of raw response objects

TannerTorrey3 and others added 15 commits April 6, 2026 20:59
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.
- 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 &amp; last to prevent double-unescaping (CodeQL: double
  escaping or unescaping)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants