@flyingrobots/graft 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +135 -0
- package/README.md +1 -1
- package/dist/adapters/json-text-decoder.d.ts +3 -0
- package/dist/adapters/json-text-decoder.d.ts.map +1 -0
- package/dist/adapters/json-text-decoder.js +12 -0
- package/dist/adapters/json-text-decoder.js.map +1 -0
- package/dist/adapters/node-paths.d.ts +3 -0
- package/dist/adapters/node-paths.d.ts.map +1 -0
- package/dist/adapters/node-paths.js +29 -0
- package/dist/adapters/node-paths.js.map +1 -0
- package/dist/adapters/repo-paths.d.ts.map +1 -1
- package/dist/adapters/repo-paths.js +40 -5
- package/dist/adapters/repo-paths.js.map +1 -1
- package/dist/api/tool-bridge.d.ts +1 -1
- package/dist/api/tool-bridge.d.ts.map +1 -1
- package/dist/api/tool-bridge.js +1 -1
- package/dist/api/tool-bridge.js.map +1 -1
- package/dist/cli/cli-error.d.ts.map +1 -1
- package/dist/cli/cli-error.js +47 -10
- package/dist/cli/cli-error.js.map +1 -1
- package/dist/cli/command-parser.d.ts +12 -3
- package/dist/cli/command-parser.d.ts.map +1 -1
- package/dist/cli/command-parser.js +161 -2
- package/dist/cli/command-parser.js.map +1 -1
- package/dist/cli/daemon-status-model.d.ts +87 -0
- package/dist/cli/daemon-status-model.d.ts.map +1 -0
- package/dist/cli/daemon-status-model.js +142 -0
- package/dist/cli/daemon-status-model.js.map +1 -0
- package/dist/cli/daemon-status-render.d.ts +3 -0
- package/dist/cli/daemon-status-render.d.ts.map +1 -0
- package/dist/cli/daemon-status-render.js +100 -0
- package/dist/cli/daemon-status-render.js.map +1 -0
- package/dist/cli/daemon-status.d.ts +7 -0
- package/dist/cli/daemon-status.d.ts.map +1 -0
- package/dist/cli/daemon-status.js +79 -0
- package/dist/cli/daemon-status.js.map +1 -0
- package/dist/cli/git-graft-enhance-model.d.ts +67 -0
- package/dist/cli/git-graft-enhance-model.d.ts.map +1 -0
- package/dist/cli/git-graft-enhance-model.js +55 -0
- package/dist/cli/git-graft-enhance-model.js.map +1 -0
- package/dist/cli/git-graft-enhance-render.d.ts +3 -0
- package/dist/cli/git-graft-enhance-render.d.ts.map +1 -0
- package/dist/cli/git-graft-enhance-render.js +29 -0
- package/dist/cli/git-graft-enhance-render.js.map +1 -0
- package/dist/cli/git-graft-enhance.d.ts +14 -0
- package/dist/cli/git-graft-enhance.d.ts.map +1 -0
- package/dist/cli/git-graft-enhance.js +29 -0
- package/dist/cli/git-graft-enhance.js.map +1 -0
- package/dist/cli/index-cmd.d.ts.map +1 -1
- package/dist/cli/index-cmd.js +18 -21
- package/dist/cli/index-cmd.js.map +1 -1
- package/dist/cli/index-model.d.ts +5 -9
- package/dist/cli/index-model.d.ts.map +1 -1
- package/dist/cli/index-model.js +20 -18
- package/dist/cli/index-model.js.map +1 -1
- package/dist/cli/init-client-config.d.ts +12 -7
- package/dist/cli/init-client-config.d.ts.map +1 -1
- package/dist/cli/init-client-config.js +105 -43
- package/dist/cli/init-client-config.js.map +1 -1
- package/dist/cli/init-model.d.ts +9 -2
- package/dist/cli/init-model.d.ts.map +1 -1
- package/dist/cli/init-model.js +52 -4
- package/dist/cli/init-model.js.map +1 -1
- package/dist/cli/init-render.d.ts.map +1 -1
- package/dist/cli/init-render.js +2 -2
- package/dist/cli/init-render.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +11 -9
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/json-document.d.ts +5 -0
- package/dist/cli/json-document.d.ts.map +1 -1
- package/dist/cli/json-document.js +9 -0
- package/dist/cli/json-document.js.map +1 -1
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +49 -7
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/migrate-local-history.d.ts.map +1 -1
- package/dist/cli/migrate-local-history.js +3 -2
- package/dist/cli/migrate-local-history.js.map +1 -1
- package/dist/cli/peer-command.d.ts +1 -1
- package/dist/cli/peer-command.d.ts.map +1 -1
- package/dist/cli/peer-command.js +1 -1
- package/dist/cli/peer-command.js.map +1 -1
- package/dist/contracts/capabilities.d.ts +5 -5
- package/dist/contracts/capabilities.d.ts.map +1 -1
- package/dist/contracts/capabilities.js +89 -0
- package/dist/contracts/capabilities.js.map +1 -1
- package/dist/contracts/causal-ontology.d.ts +17 -17
- package/dist/contracts/json-object.d.ts +0 -1
- package/dist/contracts/json-object.d.ts.map +1 -1
- package/dist/contracts/json-object.js +0 -10
- package/dist/contracts/json-object.js.map +1 -1
- package/dist/contracts/output-schema-cli.d.ts +277 -25
- package/dist/contracts/output-schema-cli.d.ts.map +1 -1
- package/dist/contracts/output-schema-cli.js +35 -3
- package/dist/contracts/output-schema-cli.js.map +1 -1
- package/dist/contracts/output-schema-fragments.d.ts +212 -87
- package/dist/contracts/output-schema-fragments.d.ts.map +1 -1
- package/dist/contracts/output-schema-fragments.js +49 -2
- package/dist/contracts/output-schema-fragments.js.map +1 -1
- package/dist/contracts/output-schema-mcp.d.ts +372 -47
- package/dist/contracts/output-schema-mcp.d.ts.map +1 -1
- package/dist/contracts/output-schema-mcp.js +217 -1
- package/dist/contracts/output-schema-mcp.js.map +1 -1
- package/dist/contracts/output-schema-meta.d.ts +2 -2
- package/dist/contracts/output-schema-meta.d.ts.map +1 -1
- package/dist/contracts/output-schemas.d.ts +7 -7
- package/dist/contracts/output-schemas.d.ts.map +1 -1
- package/dist/contracts/output-schemas.js +294 -6
- package/dist/contracts/output-schemas.js.map +1 -1
- package/dist/git/diff.d.ts +11 -0
- package/dist/git/diff.d.ts.map +1 -1
- package/dist/git/diff.js +50 -6
- package/dist/git/diff.js.map +1 -1
- package/dist/mcp/burden.d.ts.map +1 -1
- package/dist/mcp/burden.js +9 -0
- package/dist/mcp/burden.js.map +1 -1
- package/dist/mcp/context.d.ts +3 -2
- package/dist/mcp/context.d.ts.map +1 -1
- package/dist/mcp/context.js +2 -37
- package/dist/mcp/context.js.map +1 -1
- package/dist/mcp/daemon-server.d.ts +2 -0
- package/dist/mcp/daemon-server.d.ts.map +1 -1
- package/dist/mcp/daemon-server.js +6 -1
- package/dist/mcp/daemon-server.js.map +1 -1
- package/dist/mcp/daemon-session-host.d.ts +1 -0
- package/dist/mcp/daemon-session-host.d.ts.map +1 -1
- package/dist/mcp/daemon-session-host.js +3 -0
- package/dist/mcp/daemon-session-host.js.map +1 -1
- package/dist/mcp/daemon-stdio-bridge.d.ts +1 -0
- package/dist/mcp/daemon-stdio-bridge.d.ts.map +1 -1
- package/dist/mcp/daemon-stdio-bridge.js +1 -0
- package/dist/mcp/daemon-stdio-bridge.js.map +1 -1
- package/dist/mcp/monitor-tick-job.d.ts +1 -0
- package/dist/mcp/monitor-tick-job.d.ts.map +1 -1
- package/dist/mcp/monitor-tick-job.js +84 -29
- package/dist/mcp/monitor-tick-job.js.map +1 -1
- package/dist/mcp/monitor-types.d.ts +1 -1
- package/dist/mcp/monitor-types.d.ts.map +1 -1
- package/dist/mcp/persisted-local-history-graph.d.ts +2 -2
- package/dist/mcp/persisted-local-history-graph.d.ts.map +1 -1
- package/dist/mcp/persisted-local-history-graph.js +3 -2
- package/dist/mcp/persisted-local-history-graph.js.map +1 -1
- package/dist/mcp/persisted-local-history.d.ts +5 -5
- package/dist/mcp/persisted-local-history.js +2 -2
- package/dist/mcp/persisted-local-history.js.map +1 -1
- package/dist/mcp/persistent-monitor-runtime.d.ts +1 -0
- package/dist/mcp/persistent-monitor-runtime.d.ts.map +1 -1
- package/dist/mcp/persistent-monitor-runtime.js +35 -0
- package/dist/mcp/persistent-monitor-runtime.js.map +1 -1
- package/dist/mcp/repo-tool-worker-context.d.ts.map +1 -1
- package/dist/mcp/repo-tool-worker-context.js +5 -2
- package/dist/mcp/repo-tool-worker-context.js.map +1 -1
- package/dist/mcp/server-context.d.ts.map +1 -1
- package/dist/mcp/server-context.js +13 -0
- package/dist/mcp/server-context.js.map +1 -1
- package/dist/mcp/server-tool-access.d.ts +1 -1
- package/dist/mcp/server-tool-access.d.ts.map +1 -1
- package/dist/mcp/server-tool-access.js +3 -1
- package/dist/mcp/server-tool-access.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +5 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-registry.d.ts.map +1 -1
- package/dist/mcp/tool-registry.js +18 -0
- package/dist/mcp/tool-registry.js.map +1 -1
- package/dist/mcp/tools/code-find.d.ts.map +1 -1
- package/dist/mcp/tools/code-find.js +20 -0
- package/dist/mcp/tools/code-find.js.map +1 -1
- package/dist/mcp/tools/code-show.d.ts.map +1 -1
- package/dist/mcp/tools/code-show.js +24 -0
- package/dist/mcp/tools/code-show.js.map +1 -1
- package/dist/mcp/tools/diagnostic-models.d.ts +2 -0
- package/dist/mcp/tools/diagnostic-models.d.ts.map +1 -1
- package/dist/mcp/tools/doctor.d.ts.map +1 -1
- package/dist/mcp/tools/doctor.js +18 -1
- package/dist/mcp/tools/doctor.js.map +1 -1
- package/dist/mcp/tools/export-surface-diff.d.ts +3 -0
- package/dist/mcp/tools/export-surface-diff.d.ts.map +1 -0
- package/dist/mcp/tools/export-surface-diff.js +24 -0
- package/dist/mcp/tools/export-surface-diff.js.map +1 -0
- package/dist/mcp/tools/file-outline.js +1 -1
- package/dist/mcp/tools/file-outline.js.map +1 -1
- package/dist/mcp/tools/graft-edit.d.ts +3 -0
- package/dist/mcp/tools/graft-edit.d.ts.map +1 -0
- package/dist/mcp/tools/graft-edit.js +192 -0
- package/dist/mcp/tools/graft-edit.js.map +1 -0
- package/dist/mcp/tools/knowledge-map.d.ts +3 -0
- package/dist/mcp/tools/knowledge-map.d.ts.map +1 -0
- package/dist/mcp/tools/knowledge-map.js +31 -0
- package/dist/mcp/tools/knowledge-map.js.map +1 -0
- package/dist/mcp/tools/monitor-nudge.d.ts +3 -0
- package/dist/mcp/tools/monitor-nudge.d.ts.map +1 -0
- package/dist/mcp/tools/monitor-nudge.js +17 -0
- package/dist/mcp/tools/monitor-nudge.js.map +1 -0
- package/dist/mcp/tools/precision-warp.d.ts +3 -3
- package/dist/mcp/tools/precision-warp.d.ts.map +1 -1
- package/dist/mcp/tools/precision-warp.js +24 -15
- package/dist/mcp/tools/precision-warp.js.map +1 -1
- package/dist/mcp/tools/refactor-difficulty.d.ts +3 -0
- package/dist/mcp/tools/refactor-difficulty.d.ts.map +1 -0
- package/dist/mcp/tools/refactor-difficulty.js +36 -0
- package/dist/mcp/tools/refactor-difficulty.js.map +1 -0
- package/dist/mcp/tools/safe-read.js +2 -2
- package/dist/mcp/tools/safe-read.js.map +1 -1
- package/dist/mcp/tools/structural-blame.d.ts +3 -0
- package/dist/mcp/tools/structural-blame.d.ts.map +1 -0
- package/dist/mcp/tools/structural-blame.js +44 -0
- package/dist/mcp/tools/structural-blame.js.map +1 -0
- package/dist/mcp/tools/structural-churn.d.ts +3 -0
- package/dist/mcp/tools/structural-churn.d.ts.map +1 -0
- package/dist/mcp/tools/structural-churn.js +28 -0
- package/dist/mcp/tools/structural-churn.js.map +1 -0
- package/dist/mcp/tools/structural-log.d.ts +3 -0
- package/dist/mcp/tools/structural-log.d.ts.map +1 -0
- package/dist/mcp/tools/structural-log.js +38 -0
- package/dist/mcp/tools/structural-log.js.map +1 -0
- package/dist/mcp/tools/structural-review.d.ts +3 -0
- package/dist/mcp/tools/structural-review.d.ts.map +1 -0
- package/dist/mcp/tools/structural-review.js +55 -0
- package/dist/mcp/tools/structural-review.js.map +1 -0
- package/dist/mcp/warp-pool.d.ts +4 -4
- package/dist/mcp/warp-pool.d.ts.map +1 -1
- package/dist/mcp/warp-pool.js.map +1 -1
- package/dist/mcp/workspace-router-model.d.ts +2 -2
- package/dist/mcp/workspace-router-model.d.ts.map +1 -1
- package/dist/mcp/workspace-router-runtime.d.ts +3 -3
- package/dist/mcp/workspace-router-runtime.d.ts.map +1 -1
- package/dist/mcp/workspace-router-runtime.js +4 -1
- package/dist/mcp/workspace-router-runtime.js.map +1 -1
- package/dist/mcp/workspace-router.d.ts +3 -2
- package/dist/mcp/workspace-router.d.ts.map +1 -1
- package/dist/mcp/workspace-router.js +6 -0
- package/dist/mcp/workspace-router.js.map +1 -1
- package/dist/operations/adaptive-projection.d.ts +22 -0
- package/dist/operations/adaptive-projection.d.ts.map +1 -0
- package/dist/operations/adaptive-projection.js +36 -0
- package/dist/operations/adaptive-projection.js.map +1 -0
- package/dist/operations/agent-handoff.d.ts +25 -0
- package/dist/operations/agent-handoff.d.ts.map +1 -0
- package/dist/operations/agent-handoff.js +36 -0
- package/dist/operations/agent-handoff.js.map +1 -0
- package/dist/operations/capture-range.d.ts +33 -0
- package/dist/operations/capture-range.d.ts.map +1 -0
- package/dist/operations/capture-range.js +45 -0
- package/dist/operations/capture-range.js.map +1 -0
- package/dist/operations/conversation-primer.d.ts +27 -0
- package/dist/operations/conversation-primer.d.ts.map +1 -0
- package/dist/operations/conversation-primer.js +52 -0
- package/dist/operations/conversation-primer.js.map +1 -0
- package/dist/operations/cross-session-resume.d.ts +28 -0
- package/dist/operations/cross-session-resume.d.ts.map +1 -0
- package/dist/operations/cross-session-resume.js +79 -0
- package/dist/operations/cross-session-resume.js.map +1 -0
- package/dist/operations/deterministic-replay.d.ts +39 -0
- package/dist/operations/deterministic-replay.d.ts.map +1 -0
- package/dist/operations/deterministic-replay.js +90 -0
- package/dist/operations/deterministic-replay.js.map +1 -0
- package/dist/operations/export-surface-diff.d.ts +36 -0
- package/dist/operations/export-surface-diff.d.ts.map +1 -0
- package/dist/operations/export-surface-diff.js +298 -0
- package/dist/operations/export-surface-diff.js.map +1 -0
- package/dist/operations/footprint-parallelism.d.ts +25 -0
- package/dist/operations/footprint-parallelism.d.ts.map +1 -0
- package/dist/operations/footprint-parallelism.js +79 -0
- package/dist/operations/footprint-parallelism.js.map +1 -0
- package/dist/operations/graft-diff.d.ts.map +1 -1
- package/dist/operations/graft-diff.js +14 -7
- package/dist/operations/graft-diff.js.map +1 -1
- package/dist/operations/horizon-of-readability.d.ts +23 -0
- package/dist/operations/horizon-of-readability.d.ts.map +1 -0
- package/dist/operations/horizon-of-readability.js +39 -0
- package/dist/operations/horizon-of-readability.js.map +1 -0
- package/dist/operations/import-reference-impact.d.ts +13 -0
- package/dist/operations/import-reference-impact.d.ts.map +1 -0
- package/dist/operations/import-reference-impact.js +101 -0
- package/dist/operations/import-reference-impact.js.map +1 -0
- package/dist/operations/knowledge-map.d.ts +30 -0
- package/dist/operations/knowledge-map.d.ts.map +1 -0
- package/dist/operations/knowledge-map.js +64 -0
- package/dist/operations/knowledge-map.js.map +1 -0
- package/dist/operations/observation-cache.d.ts +8 -2
- package/dist/operations/observation-cache.d.ts.map +1 -1
- package/dist/operations/observation-cache.js +17 -5
- package/dist/operations/observation-cache.js.map +1 -1
- package/dist/operations/projection-safety.d.ts +31 -0
- package/dist/operations/projection-safety.d.ts.map +1 -0
- package/dist/operations/projection-safety.js +77 -0
- package/dist/operations/projection-safety.js.map +1 -0
- package/dist/operations/repo-workspace.js +3 -3
- package/dist/operations/repo-workspace.js.map +1 -1
- package/dist/operations/semantic-drift.d.ts +27 -0
- package/dist/operations/semantic-drift.d.ts.map +1 -0
- package/dist/operations/semantic-drift.js +46 -0
- package/dist/operations/semantic-drift.js.map +1 -0
- package/dist/operations/session-filtration.d.ts +36 -0
- package/dist/operations/session-filtration.d.ts.map +1 -0
- package/dist/operations/session-filtration.js +48 -0
- package/dist/operations/session-filtration.js.map +1 -0
- package/dist/operations/session-replay.d.ts +17 -0
- package/dist/operations/session-replay.d.ts.map +1 -0
- package/dist/operations/session-replay.js +59 -0
- package/dist/operations/session-replay.js.map +1 -0
- package/dist/operations/sludge-detector.d.ts +45 -0
- package/dist/operations/sludge-detector.d.ts.map +1 -0
- package/dist/operations/sludge-detector.js +278 -0
- package/dist/operations/sludge-detector.js.map +1 -0
- package/dist/operations/structural-blame.d.ts +67 -0
- package/dist/operations/structural-blame.d.ts.map +1 -0
- package/dist/operations/structural-blame.js +111 -0
- package/dist/operations/structural-blame.js.map +1 -0
- package/dist/operations/structural-review.d.ts +47 -0
- package/dist/operations/structural-review.d.ts.map +1 -0
- package/dist/operations/structural-review.js +225 -0
- package/dist/operations/structural-review.js.map +1 -0
- package/dist/operations/teaching-hints.d.ts +18 -0
- package/dist/operations/teaching-hints.d.ts.map +1 -0
- package/dist/operations/teaching-hints.js +35 -0
- package/dist/operations/teaching-hints.js.map +1 -0
- package/dist/parser/diff.d.ts +2 -0
- package/dist/parser/diff.d.ts.map +1 -1
- package/dist/parser/diff.js +7 -0
- package/dist/parser/diff.js.map +1 -1
- package/dist/ports/paths.d.ts +17 -0
- package/dist/ports/paths.d.ts.map +1 -0
- package/dist/ports/{warp.js → paths.js} +2 -2
- package/dist/ports/paths.js.map +1 -0
- package/dist/warp/ast-emitter.d.ts +28 -0
- package/dist/warp/ast-emitter.d.ts.map +1 -0
- package/dist/warp/ast-emitter.js +90 -0
- package/dist/warp/ast-emitter.js.map +1 -0
- package/dist/warp/ast-import-resolver.d.ts +13 -0
- package/dist/warp/ast-import-resolver.d.ts.map +1 -0
- package/dist/warp/ast-import-resolver.js +259 -0
- package/dist/warp/ast-import-resolver.js.map +1 -0
- package/dist/warp/commit-meta.d.ts +8 -0
- package/dist/warp/commit-meta.d.ts.map +1 -0
- package/dist/warp/commit-meta.js +13 -0
- package/dist/warp/commit-meta.js.map +1 -0
- package/dist/warp/context.d.ts +10 -0
- package/dist/warp/context.d.ts.map +1 -0
- package/dist/warp/context.js +26 -0
- package/dist/warp/context.js.map +1 -0
- package/dist/warp/dead-symbols.d.ts +40 -0
- package/dist/warp/dead-symbols.d.ts.map +1 -0
- package/dist/warp/dead-symbols.js +127 -0
- package/dist/warp/dead-symbols.js.map +1 -0
- package/dist/warp/drift-sentinel.d.ts +30 -0
- package/dist/warp/drift-sentinel.d.ts.map +1 -0
- package/dist/warp/drift-sentinel.js +65 -0
- package/dist/warp/drift-sentinel.js.map +1 -0
- package/dist/warp/index-head.d.ts +32 -0
- package/dist/warp/index-head.d.ts.map +1 -0
- package/dist/warp/index-head.js +245 -0
- package/dist/warp/index-head.js.map +1 -0
- package/dist/warp/observers.d.ts +6 -6
- package/dist/warp/observers.d.ts.map +1 -1
- package/dist/warp/observers.js +5 -4
- package/dist/warp/observers.js.map +1 -1
- package/dist/warp/open.d.ts +5 -4
- package/dist/warp/open.d.ts.map +1 -1
- package/dist/warp/open.js +24 -49
- package/dist/warp/open.js.map +1 -1
- package/dist/warp/outline-diff-trailer.d.ts +26 -0
- package/dist/warp/outline-diff-trailer.d.ts.map +1 -0
- package/dist/warp/outline-diff-trailer.js +68 -0
- package/dist/warp/outline-diff-trailer.js.map +1 -0
- package/dist/warp/refactor-difficulty.d.ts +38 -0
- package/dist/warp/refactor-difficulty.d.ts.map +1 -0
- package/dist/warp/refactor-difficulty.js +169 -0
- package/dist/warp/refactor-difficulty.js.map +1 -0
- package/dist/warp/references.d.ts +22 -0
- package/dist/warp/references.d.ts.map +1 -0
- package/dist/warp/references.js +57 -0
- package/dist/warp/references.js.map +1 -0
- package/dist/warp/stale-docs.d.ts +56 -0
- package/dist/warp/stale-docs.d.ts.map +1 -0
- package/dist/warp/stale-docs.js +149 -0
- package/dist/warp/stale-docs.js.map +1 -0
- package/dist/warp/structural-drift-detection.d.ts +49 -0
- package/dist/warp/structural-drift-detection.d.ts.map +1 -0
- package/dist/warp/structural-drift-detection.js +51 -0
- package/dist/warp/structural-drift-detection.js.map +1 -0
- package/dist/warp/structural-queries.d.ts +49 -0
- package/dist/warp/structural-queries.d.ts.map +1 -0
- package/dist/warp/structural-queries.js +175 -0
- package/dist/warp/structural-queries.js.map +1 -0
- package/dist/warp/symbol-timeline.d.ts +34 -0
- package/dist/warp/symbol-timeline.d.ts.map +1 -0
- package/dist/warp/symbol-timeline.js +127 -0
- package/dist/warp/symbol-timeline.js.map +1 -0
- package/dist/warp/traverse-hydrate.d.ts +23 -0
- package/dist/warp/traverse-hydrate.d.ts.map +1 -0
- package/dist/warp/traverse-hydrate.js +39 -0
- package/dist/warp/traverse-hydrate.js.map +1 -0
- package/dist/warp/warp-reference-count.d.ts +19 -0
- package/dist/warp/warp-reference-count.d.ts.map +1 -0
- package/dist/warp/warp-reference-count.js +32 -0
- package/dist/warp/warp-reference-count.js.map +1 -0
- package/dist/warp/warp-structural-blame.d.ts +20 -0
- package/dist/warp/warp-structural-blame.d.ts.map +1 -0
- package/dist/warp/warp-structural-blame.js +43 -0
- package/dist/warp/warp-structural-blame.js.map +1 -0
- package/dist/warp/warp-structural-churn.d.ts +30 -0
- package/dist/warp/warp-structural-churn.d.ts.map +1 -0
- package/dist/warp/warp-structural-churn.js +213 -0
- package/dist/warp/warp-structural-churn.js.map +1 -0
- package/dist/warp/warp-structural-log.d.ts +35 -0
- package/dist/warp/warp-structural-log.d.ts.map +1 -0
- package/dist/warp/warp-structural-log.js +104 -0
- package/dist/warp/warp-structural-log.js.map +1 -0
- package/docs/CLI.md +68 -4
- package/docs/MCP.md +23 -0
- package/docs/SETUP.md +101 -20
- package/package.json +5 -3
- package/src/adapters/json-text-decoder.ts +11 -0
- package/src/adapters/node-paths.ts +35 -0
- package/src/adapters/repo-paths.ts +45 -4
- package/src/api/tool-bridge.ts +2 -1
- package/src/cli/cli-error.ts +49 -10
- package/src/cli/command-parser.ts +185 -3
- package/src/cli/daemon-status-model.ts +238 -0
- package/src/cli/daemon-status-render.ts +102 -0
- package/src/cli/daemon-status.ts +100 -0
- package/src/cli/git-graft-enhance-model.ts +131 -0
- package/src/cli/git-graft-enhance-render.ts +33 -0
- package/src/cli/git-graft-enhance.ts +54 -0
- package/src/cli/index-cmd.ts +18 -22
- package/src/cli/index-model.ts +21 -22
- package/src/cli/init-client-config.ts +167 -38
- package/src/cli/init-model.ts +57 -2
- package/src/cli/init-render.ts +2 -2
- package/src/cli/init.ts +11 -9
- package/src/cli/json-document.ts +11 -0
- package/src/cli/main.ts +53 -6
- package/src/cli/migrate-local-history.ts +3 -2
- package/src/cli/peer-command.ts +2 -1
- package/src/contracts/capabilities.ts +90 -0
- package/src/contracts/json-object.ts +1 -11
- package/src/contracts/output-schema-cli.ts +36 -3
- package/src/contracts/output-schema-fragments.ts +52 -2
- package/src/contracts/output-schema-mcp.ts +219 -0
- package/src/contracts/output-schemas.ts +300 -6
- package/src/git/diff.ts +61 -0
- package/src/mcp/burden.ts +9 -0
- package/src/mcp/context.ts +5 -42
- package/src/mcp/daemon-server.ts +8 -1
- package/src/mcp/daemon-session-host.ts +4 -0
- package/src/mcp/daemon-stdio-bridge.ts +2 -0
- package/src/mcp/monitor-tick-job.ts +90 -39
- package/src/mcp/monitor-types.ts +1 -1
- package/src/mcp/persisted-local-history-graph.ts +5 -4
- package/src/mcp/persisted-local-history.ts +2 -2
- package/src/mcp/persistent-monitor-runtime.ts +37 -0
- package/src/mcp/repo-tool-worker-context.ts +5 -2
- package/src/mcp/server-context.ts +15 -2
- package/src/mcp/server-tool-access.ts +4 -1
- package/src/mcp/server.ts +8 -3
- package/src/mcp/tool-registry.ts +18 -0
- package/src/mcp/tools/code-find.ts +23 -0
- package/src/mcp/tools/code-show.ts +27 -0
- package/src/mcp/tools/diagnostic-models.ts +2 -0
- package/src/mcp/tools/doctor.ts +18 -1
- package/src/mcp/tools/export-surface-diff.ts +26 -0
- package/src/mcp/tools/file-outline.ts +1 -1
- package/src/mcp/tools/graft-edit.ts +276 -0
- package/src/mcp/tools/knowledge-map.ts +34 -0
- package/src/mcp/tools/monitor-nudge.ts +19 -0
- package/src/mcp/tools/precision-warp.ts +27 -16
- package/src/mcp/tools/refactor-difficulty.ts +42 -0
- package/src/mcp/tools/safe-read.ts +2 -2
- package/src/mcp/tools/structural-blame.ts +55 -0
- package/src/mcp/tools/structural-churn.ts +28 -0
- package/src/mcp/tools/structural-log.ts +41 -0
- package/src/mcp/tools/structural-review.ts +63 -0
- package/src/mcp/warp-pool.ts +6 -6
- package/src/mcp/workspace-router-model.ts +2 -2
- package/src/mcp/workspace-router-runtime.ts +11 -8
- package/src/mcp/workspace-router.ts +9 -2
- package/src/operations/adaptive-projection.ts +54 -0
- package/src/operations/agent-handoff.ts +59 -0
- package/src/operations/capture-range.ts +64 -0
- package/src/operations/conversation-primer.ts +82 -0
- package/src/operations/cross-session-resume.ts +104 -0
- package/src/operations/deterministic-replay.ts +143 -0
- package/src/operations/export-surface-diff.ts +355 -0
- package/src/operations/footprint-parallelism.ts +98 -0
- package/src/operations/graft-diff.ts +14 -7
- package/src/operations/horizon-of-readability.ts +60 -0
- package/src/operations/import-reference-impact.ts +143 -0
- package/src/operations/knowledge-map.ts +96 -0
- package/src/operations/observation-cache.ts +20 -4
- package/src/operations/projection-safety.ts +111 -0
- package/src/operations/repo-workspace.ts +3 -3
- package/src/operations/semantic-drift.ts +70 -0
- package/src/operations/session-filtration.ts +76 -0
- package/src/operations/session-replay.ts +73 -0
- package/src/operations/sludge-detector.ts +356 -0
- package/src/operations/structural-blame.ts +197 -0
- package/src/operations/structural-review.ts +317 -0
- package/src/operations/teaching-hints.ts +52 -0
- package/src/parser/diff.ts +7 -0
- package/src/ports/paths.ts +22 -0
- package/src/warp/ast-emitter.ts +133 -0
- package/src/warp/ast-import-resolver.ts +333 -0
- package/src/warp/commit-meta.ts +19 -0
- package/src/warp/context.ts +48 -0
- package/src/warp/dead-symbols.ts +174 -0
- package/src/warp/drift-sentinel.ts +101 -0
- package/src/warp/index-head.ts +348 -0
- package/src/warp/observers.ts +8 -7
- package/src/warp/open.ts +40 -66
- package/src/warp/outline-diff-trailer.ts +100 -0
- package/src/warp/plumbing.d.ts +11 -2
- package/src/warp/refactor-difficulty.ts +257 -0
- package/src/warp/references.ts +77 -0
- package/src/warp/stale-docs.ts +210 -0
- package/src/warp/structural-drift-detection.ts +97 -0
- package/src/warp/structural-queries.ts +258 -0
- package/src/warp/symbol-timeline.ts +209 -0
- package/src/warp/traverse-hydrate.ts +61 -0
- package/src/warp/warp-reference-count.ts +47 -0
- package/src/warp/warp-structural-blame.ts +65 -0
- package/src/warp/warp-structural-churn.ts +309 -0
- package/src/warp/warp-structural-log.ts +149 -0
- package/dist/ports/warp.d.ts +0 -45
- package/dist/ports/warp.d.ts.map +0 -1
- package/dist/ports/warp.js.map +0 -1
- package/dist/warp/identity-resolver.d.ts +0 -14
- package/dist/warp/identity-resolver.d.ts.map +0 -1
- package/dist/warp/identity-resolver.js +0 -31
- package/dist/warp/identity-resolver.js.map +0 -1
- package/dist/warp/indexer-git.d.ts +0 -22
- package/dist/warp/indexer-git.d.ts.map +0 -1
- package/dist/warp/indexer-git.js +0 -148
- package/dist/warp/indexer-git.js.map +0 -1
- package/dist/warp/indexer-graph.d.ts +0 -17
- package/dist/warp/indexer-graph.d.ts.map +0 -1
- package/dist/warp/indexer-graph.js +0 -179
- package/dist/warp/indexer-graph.js.map +0 -1
- package/dist/warp/indexer-model.d.ts +0 -51
- package/dist/warp/indexer-model.d.ts.map +0 -1
- package/dist/warp/indexer-model.js +0 -21
- package/dist/warp/indexer-model.js.map +0 -1
- package/dist/warp/indexer.d.ts +0 -9
- package/dist/warp/indexer.d.ts.map +0 -1
- package/dist/warp/indexer.js +0 -112
- package/dist/warp/indexer.js.map +0 -1
- package/dist/warp/symbol-identity.d.ts +0 -11
- package/dist/warp/symbol-identity.d.ts.map +0 -1
- package/dist/warp/symbol-identity.js +0 -67
- package/dist/warp/symbol-identity.js.map +0 -1
- package/src/ports/warp.ts +0 -55
- package/src/warp/identity-resolver.ts +0 -35
- package/src/warp/indexer-git.ts +0 -182
- package/src/warp/indexer-graph.ts +0 -276
- package/src/warp/indexer-model.ts +0 -69
- package/src/warp/indexer.ts +0 -186
- package/src/warp/symbol-identity.ts +0 -100
|
@@ -3,8 +3,12 @@ import * as path from "node:path";
|
|
|
3
3
|
import {
|
|
4
4
|
GRAFT_HOOKS_CONFIG,
|
|
5
5
|
GRAFT_MCP_SERVER,
|
|
6
|
+
GraftMcpServer,
|
|
6
7
|
InitAction,
|
|
8
|
+
isGraftMcpServerEntryForRuntime,
|
|
7
9
|
type GraftHookMatcher,
|
|
10
|
+
type JsonObjectValue,
|
|
11
|
+
type JsonValue,
|
|
8
12
|
} from "./init-model.js";
|
|
9
13
|
import {
|
|
10
14
|
JsonArrayNode,
|
|
@@ -14,28 +18,33 @@ import {
|
|
|
14
18
|
class JsonMcpConfigDocument {
|
|
15
19
|
constructor(
|
|
16
20
|
private readonly document: JsonObjectDocument,
|
|
17
|
-
private readonly server:
|
|
21
|
+
private readonly server: GraftMcpServer,
|
|
22
|
+
private readonly updateExisting: boolean,
|
|
18
23
|
) {}
|
|
19
24
|
|
|
20
25
|
static create(
|
|
21
26
|
filePath: string,
|
|
22
27
|
label: string,
|
|
23
|
-
server:
|
|
28
|
+
server: GraftMcpServer,
|
|
29
|
+
updateExisting: boolean,
|
|
24
30
|
): JsonMcpConfigDocument {
|
|
25
31
|
return new JsonMcpConfigDocument(
|
|
26
32
|
JsonObjectDocument.create(filePath, label, server.toJsonMcpConfig()),
|
|
27
33
|
server,
|
|
34
|
+
updateExisting,
|
|
28
35
|
);
|
|
29
36
|
}
|
|
30
37
|
|
|
31
38
|
static open(
|
|
32
39
|
filePath: string,
|
|
33
40
|
label: string,
|
|
34
|
-
server:
|
|
41
|
+
server: GraftMcpServer,
|
|
42
|
+
updateExisting: boolean,
|
|
35
43
|
): JsonMcpConfigDocument {
|
|
36
44
|
return new JsonMcpConfigDocument(
|
|
37
45
|
JsonObjectDocument.open(filePath, label),
|
|
38
46
|
server,
|
|
47
|
+
updateExisting,
|
|
39
48
|
);
|
|
40
49
|
}
|
|
41
50
|
|
|
@@ -46,6 +55,15 @@ class JsonMcpConfigDocument {
|
|
|
46
55
|
ensureGraftServer(): InitAction {
|
|
47
56
|
const root = this.document.root();
|
|
48
57
|
const servers = root.ensureObject("mcpServers");
|
|
58
|
+
const existing = servers.toJsonValue()[this.server.name];
|
|
59
|
+
if (existing !== undefined) {
|
|
60
|
+
if (isGraftMcpServerEntryForRuntime(existing, this.server.runtime) || !this.updateExisting) {
|
|
61
|
+
return InitAction.exists(this.document.label, "already has graft mcp server");
|
|
62
|
+
}
|
|
63
|
+
servers.set(this.server.name, this.server.toJsonServerEntry());
|
|
64
|
+
this.document.write();
|
|
65
|
+
return InitAction.append(this.document.label, `updated graft mcp server runtime to ${this.server.runtime}`);
|
|
66
|
+
}
|
|
49
67
|
if (servers.has(this.server.name)) {
|
|
50
68
|
return InitAction.exists(this.document.label, "already has graft mcp server");
|
|
51
69
|
}
|
|
@@ -58,28 +76,33 @@ class JsonMcpConfigDocument {
|
|
|
58
76
|
class ContinueMcpConfigDocument {
|
|
59
77
|
constructor(
|
|
60
78
|
private readonly document: JsonObjectDocument,
|
|
61
|
-
private readonly server:
|
|
79
|
+
private readonly server: GraftMcpServer,
|
|
80
|
+
private readonly updateExisting: boolean,
|
|
62
81
|
) {}
|
|
63
82
|
|
|
64
83
|
static create(
|
|
65
84
|
filePath: string,
|
|
66
85
|
label: string,
|
|
67
|
-
server:
|
|
86
|
+
server: GraftMcpServer,
|
|
87
|
+
updateExisting: boolean,
|
|
68
88
|
): ContinueMcpConfigDocument {
|
|
69
89
|
return new ContinueMcpConfigDocument(
|
|
70
90
|
JsonObjectDocument.create(filePath, label, server.toContinueConfig()),
|
|
71
91
|
server,
|
|
92
|
+
updateExisting,
|
|
72
93
|
);
|
|
73
94
|
}
|
|
74
95
|
|
|
75
96
|
static open(
|
|
76
97
|
filePath: string,
|
|
77
98
|
label: string,
|
|
78
|
-
server:
|
|
99
|
+
server: GraftMcpServer,
|
|
100
|
+
updateExisting: boolean,
|
|
79
101
|
): ContinueMcpConfigDocument {
|
|
80
102
|
return new ContinueMcpConfigDocument(
|
|
81
103
|
JsonObjectDocument.open(filePath, label),
|
|
82
104
|
server,
|
|
105
|
+
updateExisting,
|
|
83
106
|
);
|
|
84
107
|
}
|
|
85
108
|
|
|
@@ -90,11 +113,16 @@ class ContinueMcpConfigDocument {
|
|
|
90
113
|
ensureGraftServer(): InitAction {
|
|
91
114
|
const root = this.document.root();
|
|
92
115
|
const servers = root.ensureArray("mcpServers");
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
.
|
|
96
|
-
if (
|
|
97
|
-
|
|
116
|
+
const existingEntries = servers.objectEntries();
|
|
117
|
+
const existing = existingEntries
|
|
118
|
+
.find((entry) => entry.node.stringValue("name") === this.server.name);
|
|
119
|
+
if (existing !== undefined) {
|
|
120
|
+
if (isContinueServerEntryForRuntime(existing.node.toJsonValue(), this.server.runtime) || !this.updateExisting) {
|
|
121
|
+
return InitAction.exists(this.document.label, "already has graft mcp server");
|
|
122
|
+
}
|
|
123
|
+
servers.set(existing.index, this.server.toContinueServerEntry());
|
|
124
|
+
this.document.write();
|
|
125
|
+
return InitAction.append(this.document.label, `updated graft mcp server runtime to ${this.server.runtime}`);
|
|
98
126
|
}
|
|
99
127
|
servers.push(this.server.toContinueServerEntry());
|
|
100
128
|
this.document.write();
|
|
@@ -180,12 +208,15 @@ class ClaudeHooksDocument {
|
|
|
180
208
|
export function ensureCodexStartupTimeout(
|
|
181
209
|
existing: string,
|
|
182
210
|
): { content: string; changed: boolean } {
|
|
211
|
+
const ensured = ensureCodexMcpServerBlock(existing, GRAFT_MCP_SERVER, false);
|
|
212
|
+
return { content: ensured.content, changed: ensured.changed };
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function codexBlockBounds(lines: readonly string[]): { start: number; end: number } | undefined {
|
|
183
216
|
const marker = "[mcp_servers.graft]";
|
|
184
|
-
const timeoutLine = `startup_timeout_sec = ${String(GRAFT_MCP_SERVER.codexStartupTimeoutSec)}`;
|
|
185
|
-
const lines = existing.split("\n");
|
|
186
217
|
const blockStart = lines.findIndex((line) => line.trim() === marker);
|
|
187
218
|
if (blockStart === -1) {
|
|
188
|
-
return
|
|
219
|
+
return undefined;
|
|
189
220
|
}
|
|
190
221
|
|
|
191
222
|
let blockEnd = lines.length;
|
|
@@ -197,53 +228,143 @@ export function ensureCodexStartupTimeout(
|
|
|
197
228
|
}
|
|
198
229
|
}
|
|
199
230
|
|
|
231
|
+
return { start: blockStart, end: blockEnd };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function replaceOrInsertLine(
|
|
235
|
+
lines: string[],
|
|
236
|
+
bounds: { readonly start: number; readonly end: number },
|
|
237
|
+
predicate: (line: string) => boolean,
|
|
238
|
+
value: string,
|
|
239
|
+
): { end: number; changed: boolean } {
|
|
240
|
+
const index = lines
|
|
241
|
+
.slice(bounds.start + 1, bounds.end)
|
|
242
|
+
.findIndex(predicate);
|
|
243
|
+
if (index === -1) {
|
|
244
|
+
lines.splice(bounds.end, 0, value);
|
|
245
|
+
return { end: bounds.end + 1, changed: true };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const absoluteIndex = bounds.start + 1 + index;
|
|
249
|
+
if (lines[absoluteIndex] === value) {
|
|
250
|
+
return { end: bounds.end, changed: false };
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
lines[absoluteIndex] = value;
|
|
254
|
+
return { end: bounds.end, changed: true };
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export function ensureCodexMcpServerBlock(
|
|
258
|
+
existing: string,
|
|
259
|
+
server: GraftMcpServer,
|
|
260
|
+
updateExisting: boolean,
|
|
261
|
+
): { content: string; changed: boolean; detail?: string | undefined } {
|
|
262
|
+
const lines = existing.split("\n");
|
|
263
|
+
const bounds = codexBlockBounds(lines);
|
|
264
|
+
if (bounds === undefined) {
|
|
265
|
+
return { content: existing, changed: false };
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
let changed = false;
|
|
269
|
+
let runtimeChanged = false;
|
|
270
|
+
let blockEnd = bounds.end;
|
|
271
|
+
if (updateExisting) {
|
|
272
|
+
const command = replaceOrInsertLine(
|
|
273
|
+
lines,
|
|
274
|
+
{ start: bounds.start, end: blockEnd },
|
|
275
|
+
(line) => line.trim().startsWith("command"),
|
|
276
|
+
`command = "${server.command}"`,
|
|
277
|
+
);
|
|
278
|
+
runtimeChanged = command.changed;
|
|
279
|
+
changed = command.changed;
|
|
280
|
+
blockEnd = command.end;
|
|
281
|
+
|
|
282
|
+
const args = replaceOrInsertLine(
|
|
283
|
+
lines,
|
|
284
|
+
{ start: bounds.start, end: blockEnd },
|
|
285
|
+
(line) => line.trim().startsWith("args"),
|
|
286
|
+
server.toCodexTomlArgsLine(),
|
|
287
|
+
);
|
|
288
|
+
runtimeChanged = runtimeChanged || args.changed;
|
|
289
|
+
changed = changed || args.changed;
|
|
290
|
+
blockEnd = args.end;
|
|
291
|
+
}
|
|
292
|
+
|
|
200
293
|
const hasTimeout = lines
|
|
201
|
-
.slice(
|
|
294
|
+
.slice(bounds.start + 1, blockEnd)
|
|
202
295
|
.some((line) => line.trim().startsWith("startup_timeout_sec"));
|
|
203
|
-
if (hasTimeout) {
|
|
204
|
-
|
|
296
|
+
if (!hasTimeout) {
|
|
297
|
+
lines.splice(blockEnd, 0, `startup_timeout_sec = ${String(server.codexStartupTimeoutSec)}`);
|
|
298
|
+
changed = true;
|
|
205
299
|
}
|
|
206
300
|
|
|
207
|
-
lines.splice(blockEnd, 0, timeoutLine);
|
|
208
301
|
return {
|
|
209
302
|
content: lines.join("\n"),
|
|
210
|
-
changed
|
|
303
|
+
changed,
|
|
304
|
+
...(runtimeChanged ? { detail: `updated graft mcp server runtime to ${server.runtime}` } : {}),
|
|
211
305
|
};
|
|
212
306
|
}
|
|
213
307
|
|
|
214
|
-
function
|
|
308
|
+
function isContinueServerEntryForRuntime(value: JsonObjectValue, runtime: GraftMcpServer["runtime"]): boolean {
|
|
309
|
+
const { name, ...entry } = value;
|
|
310
|
+
void name;
|
|
311
|
+
return isGraftMcpServerEntryForRuntime(entry as JsonValue, runtime);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function ensureJsonMcpConfig(
|
|
315
|
+
filePath: string,
|
|
316
|
+
label: string,
|
|
317
|
+
server: GraftMcpServer,
|
|
318
|
+
updateExisting: boolean,
|
|
319
|
+
): InitAction {
|
|
215
320
|
if (!fs.existsSync(filePath)) {
|
|
216
|
-
const created = JsonMcpConfigDocument.create(filePath, label,
|
|
321
|
+
const created = JsonMcpConfigDocument.create(filePath, label, server, updateExisting);
|
|
217
322
|
created.write();
|
|
218
323
|
return InitAction.create(label, "wrote graft mcp server");
|
|
219
324
|
}
|
|
220
325
|
return JsonMcpConfigDocument
|
|
221
|
-
.open(filePath, label,
|
|
326
|
+
.open(filePath, label, server, updateExisting)
|
|
222
327
|
.ensureGraftServer();
|
|
223
328
|
}
|
|
224
329
|
|
|
225
|
-
export function mergeClaudeMcpConfig(
|
|
330
|
+
export function mergeClaudeMcpConfig(
|
|
331
|
+
cwd: string,
|
|
332
|
+
server = GRAFT_MCP_SERVER,
|
|
333
|
+
updateExisting = false,
|
|
334
|
+
): InitAction {
|
|
226
335
|
const label = ".mcp.json";
|
|
227
336
|
const filePath = path.join(cwd, label);
|
|
228
|
-
return ensureJsonMcpConfig(filePath, label);
|
|
337
|
+
return ensureJsonMcpConfig(filePath, label, server, updateExisting);
|
|
229
338
|
}
|
|
230
339
|
|
|
231
|
-
export function mergeCursorMcpConfig(
|
|
340
|
+
export function mergeCursorMcpConfig(
|
|
341
|
+
cwd: string,
|
|
342
|
+
server = GRAFT_MCP_SERVER,
|
|
343
|
+
updateExisting = false,
|
|
344
|
+
): InitAction {
|
|
232
345
|
const label = ".cursor/mcp.json";
|
|
233
346
|
const filePath = path.join(cwd, ".cursor", "mcp.json");
|
|
234
|
-
return ensureJsonMcpConfig(filePath, label);
|
|
347
|
+
return ensureJsonMcpConfig(filePath, label, server, updateExisting);
|
|
235
348
|
}
|
|
236
349
|
|
|
237
|
-
export function mergeWindsurfMcpConfig(
|
|
350
|
+
export function mergeWindsurfMcpConfig(
|
|
351
|
+
cwd: string,
|
|
352
|
+
server = GRAFT_MCP_SERVER,
|
|
353
|
+
updateExisting = false,
|
|
354
|
+
): InitAction {
|
|
238
355
|
const label = ".codeium/windsurf/mcp_config.json";
|
|
239
356
|
const filePath = path.join(cwd, ".codeium", "windsurf", "mcp_config.json");
|
|
240
|
-
return ensureJsonMcpConfig(filePath, label);
|
|
357
|
+
return ensureJsonMcpConfig(filePath, label, server, updateExisting);
|
|
241
358
|
}
|
|
242
359
|
|
|
243
|
-
export function mergeClineMcpConfig(
|
|
360
|
+
export function mergeClineMcpConfig(
|
|
361
|
+
cwd: string,
|
|
362
|
+
server = GRAFT_MCP_SERVER,
|
|
363
|
+
updateExisting = false,
|
|
364
|
+
): InitAction {
|
|
244
365
|
const label = ".vscode/cline_mcp_settings.json";
|
|
245
366
|
const filePath = path.join(cwd, ".vscode", "cline_mcp_settings.json");
|
|
246
|
-
return ensureJsonMcpConfig(filePath, label);
|
|
367
|
+
return ensureJsonMcpConfig(filePath, label, server, updateExisting);
|
|
247
368
|
}
|
|
248
369
|
|
|
249
370
|
export function mergeClaudeHooksConfig(cwd: string): InitAction {
|
|
@@ -257,35 +378,43 @@ export function mergeClaudeHooksConfig(cwd: string): InitAction {
|
|
|
257
378
|
return ClaudeHooksDocument.open(filePath, label, GRAFT_HOOKS_CONFIG).ensureGraftHooks();
|
|
258
379
|
}
|
|
259
380
|
|
|
260
|
-
export function mergeContinueMcpConfig(
|
|
381
|
+
export function mergeContinueMcpConfig(
|
|
382
|
+
cwd: string,
|
|
383
|
+
server = GRAFT_MCP_SERVER,
|
|
384
|
+
updateExisting = false,
|
|
385
|
+
): InitAction {
|
|
261
386
|
const label = ".continue/config.json";
|
|
262
387
|
const filePath = path.join(cwd, ".continue", "config.json");
|
|
263
388
|
if (!fs.existsSync(filePath)) {
|
|
264
|
-
const created = ContinueMcpConfigDocument.create(filePath, label,
|
|
389
|
+
const created = ContinueMcpConfigDocument.create(filePath, label, server, updateExisting);
|
|
265
390
|
created.write();
|
|
266
391
|
return InitAction.create(label, "wrote graft mcp server");
|
|
267
392
|
}
|
|
268
393
|
return ContinueMcpConfigDocument
|
|
269
|
-
.open(filePath, label,
|
|
394
|
+
.open(filePath, label, server, updateExisting)
|
|
270
395
|
.ensureGraftServer();
|
|
271
396
|
}
|
|
272
397
|
|
|
273
|
-
export function mergeCodexMcpConfig(
|
|
398
|
+
export function mergeCodexMcpConfig(
|
|
399
|
+
cwd: string,
|
|
400
|
+
server = GRAFT_MCP_SERVER,
|
|
401
|
+
updateExisting = false,
|
|
402
|
+
): InitAction {
|
|
274
403
|
const label = ".codex/config.toml";
|
|
275
404
|
const filePath = path.join(cwd, ".codex", "config.toml");
|
|
276
405
|
const marker = "[mcp_servers.graft]";
|
|
277
406
|
if (!fs.existsSync(filePath)) {
|
|
278
407
|
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
279
|
-
fs.writeFileSync(filePath,
|
|
408
|
+
fs.writeFileSync(filePath, server.toCodexTomlBlock());
|
|
280
409
|
return InitAction.create(label, "wrote graft mcp server");
|
|
281
410
|
}
|
|
282
411
|
|
|
283
412
|
const existing = fs.readFileSync(filePath, "utf-8");
|
|
284
413
|
if (existing.includes(marker)) {
|
|
285
|
-
const ensured =
|
|
414
|
+
const ensured = ensureCodexMcpServerBlock(existing, server, updateExisting);
|
|
286
415
|
if (ensured.changed) {
|
|
287
416
|
fs.writeFileSync(filePath, ensured.content);
|
|
288
|
-
return InitAction.append(label, "added graft startup timeout");
|
|
417
|
+
return InitAction.append(label, ensured.detail ?? "added graft startup timeout");
|
|
289
418
|
}
|
|
290
419
|
return InitAction.exists(label, "already has graft mcp server");
|
|
291
420
|
}
|
|
@@ -293,7 +422,7 @@ export function mergeCodexMcpConfig(cwd: string): InitAction {
|
|
|
293
422
|
const separator = existing.endsWith("\n") ? "\n" : "\n\n";
|
|
294
423
|
fs.writeFileSync(
|
|
295
424
|
filePath,
|
|
296
|
-
`${existing}${separator}${
|
|
425
|
+
`${existing}${separator}${server.toCodexTomlBlock()}`,
|
|
297
426
|
);
|
|
298
427
|
return InitAction.append(label, "appended graft mcp server");
|
|
299
428
|
}
|
package/src/cli/init-model.ts
CHANGED
|
@@ -7,6 +7,7 @@ export interface JsonObjectValue {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
type InitActionKind = "exists" | "create" | "append";
|
|
10
|
+
export type GraftMcpRuntime = "repo-local" | "daemon";
|
|
10
11
|
|
|
11
12
|
export class InitAction {
|
|
12
13
|
constructor(
|
|
@@ -54,9 +55,33 @@ function consumeFlag(args: string[], flag: string): boolean {
|
|
|
54
55
|
return true;
|
|
55
56
|
}
|
|
56
57
|
|
|
58
|
+
function consumeOption(args: string[], flag: string): string | undefined {
|
|
59
|
+
const index = args.indexOf(flag);
|
|
60
|
+
if (index === -1) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
if (index === args.length - 1) {
|
|
64
|
+
throw new Error(`Missing value for ${flag}`);
|
|
65
|
+
}
|
|
66
|
+
const [value] = args.splice(index, 2).slice(1);
|
|
67
|
+
return value;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function parseMcpRuntime(raw: string | undefined): { runtime: GraftMcpRuntime; explicit: boolean } {
|
|
71
|
+
if (raw === undefined) {
|
|
72
|
+
return { runtime: "repo-local", explicit: false };
|
|
73
|
+
}
|
|
74
|
+
if (raw === "repo-local" || raw === "daemon") {
|
|
75
|
+
return { runtime: raw, explicit: true };
|
|
76
|
+
}
|
|
77
|
+
throw new Error(`--mcp-runtime must be repo-local or daemon, got ${raw}`);
|
|
78
|
+
}
|
|
79
|
+
|
|
57
80
|
export class ParsedInitArgs {
|
|
58
81
|
constructor(
|
|
59
82
|
readonly json: boolean,
|
|
83
|
+
readonly mcpRuntime: GraftMcpRuntime,
|
|
84
|
+
readonly mcpRuntimeExplicit: boolean,
|
|
60
85
|
readonly writeClaudeMcp: boolean,
|
|
61
86
|
readonly writeClaudeHooks: boolean,
|
|
62
87
|
readonly writeTargetGitHooks: boolean,
|
|
@@ -69,8 +94,11 @@ export class ParsedInitArgs {
|
|
|
69
94
|
|
|
70
95
|
static parse(rawArgs: readonly string[]): ParsedInitArgs {
|
|
71
96
|
const args = [...rawArgs];
|
|
97
|
+
const runtime = parseMcpRuntime(consumeOption(args, "--mcp-runtime"));
|
|
72
98
|
const parsed = new ParsedInitArgs(
|
|
73
99
|
consumeFlag(args, "--json"),
|
|
100
|
+
runtime.runtime,
|
|
101
|
+
runtime.explicit,
|
|
74
102
|
consumeFlag(args, "--write-claude-mcp"),
|
|
75
103
|
consumeFlag(args, "--write-claude-hooks"),
|
|
76
104
|
consumeFlag(args, "--write-target-git-hooks"),
|
|
@@ -101,9 +129,16 @@ export class ParsedInitArgs {
|
|
|
101
129
|
export class GraftMcpServer {
|
|
102
130
|
readonly name = "graft";
|
|
103
131
|
readonly command = "npx";
|
|
104
|
-
readonly args = ["-y", "@flyingrobots/graft", "serve"] as const;
|
|
105
132
|
readonly codexStartupTimeoutSec = 120;
|
|
106
133
|
|
|
134
|
+
constructor(readonly runtime: GraftMcpRuntime = "repo-local") {}
|
|
135
|
+
|
|
136
|
+
get args(): readonly string[] {
|
|
137
|
+
return this.runtime === "daemon"
|
|
138
|
+
? ["-y", "@flyingrobots/graft", "serve", "--runtime", "daemon"]
|
|
139
|
+
: ["-y", "@flyingrobots/graft", "serve"];
|
|
140
|
+
}
|
|
141
|
+
|
|
107
142
|
toJsonServerEntry(): JsonObjectValue {
|
|
108
143
|
return {
|
|
109
144
|
command: this.command,
|
|
@@ -137,11 +172,15 @@ export class GraftMcpServer {
|
|
|
137
172
|
return [
|
|
138
173
|
"[mcp_servers.graft]",
|
|
139
174
|
"command = \"npx\"",
|
|
140
|
-
|
|
175
|
+
this.toCodexTomlArgsLine(),
|
|
141
176
|
`startup_timeout_sec = ${String(this.codexStartupTimeoutSec)}`,
|
|
142
177
|
"",
|
|
143
178
|
].join("\n");
|
|
144
179
|
}
|
|
180
|
+
|
|
181
|
+
toCodexTomlArgsLine(): string {
|
|
182
|
+
return `args = [${this.args.map((arg) => `"${arg}"`).join(", ")}]`;
|
|
183
|
+
}
|
|
145
184
|
}
|
|
146
185
|
|
|
147
186
|
export class GraftHookCommand {
|
|
@@ -227,3 +266,19 @@ export function isJsonObjectValue(value: unknown): value is JsonObjectValue {
|
|
|
227
266
|
export function cloneJsonValue<T>(value: T): T {
|
|
228
267
|
return JSON.parse(JSON.stringify(value)) as T;
|
|
229
268
|
}
|
|
269
|
+
|
|
270
|
+
export function isGraftMcpServerEntryForRuntime(
|
|
271
|
+
value: JsonValue | undefined,
|
|
272
|
+
runtime: GraftMcpRuntime,
|
|
273
|
+
): boolean {
|
|
274
|
+
if (!isJsonObjectValue(value)) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
const command = value["command"];
|
|
278
|
+
const args = value["args"];
|
|
279
|
+
const expected = new GraftMcpServer(runtime);
|
|
280
|
+
return command === expected.command
|
|
281
|
+
&& Array.isArray(args)
|
|
282
|
+
&& args.length === expected.args.length
|
|
283
|
+
&& args.every((arg, index) => arg === expected.args[index]);
|
|
284
|
+
}
|
package/src/cli/init-render.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CanonicalJsonCodec } from "../adapters/canonical-json.js";
|
|
2
2
|
import { attachCliSchemaMeta, validateCliOutput } from "../contracts/output-schemas.js";
|
|
3
|
-
import { GRAFT_HOOKS_CONFIG,
|
|
3
|
+
import { GRAFT_HOOKS_CONFIG, InitFailure, InitResult, ParsedInitArgs, type JsonObjectValue } from "./init-model.js";
|
|
4
4
|
|
|
5
5
|
const codec = new CanonicalJsonCodec();
|
|
6
6
|
|
|
@@ -37,7 +37,7 @@ export function renderInitText(result: InitResult, args: ParsedInitArgs, writer:
|
|
|
37
37
|
if (!args.writesAnyMcpConfig) {
|
|
38
38
|
writeLine(writer, "Done. Add graft to your MCP config:");
|
|
39
39
|
writeLine(writer);
|
|
40
|
-
writeLine(writer, indentJson(
|
|
40
|
+
writeLine(writer, indentJson(result.suggestedMcpServer.toJsonMcpConfig()));
|
|
41
41
|
writeLine(writer);
|
|
42
42
|
writeLine(writer, "Use explicit --write-*-mcp flags or --write-claude-hooks");
|
|
43
43
|
writeLine(writer, "or --write-target-git-hooks for one-step bootstrap into project-local config files.");
|
package/src/cli/init.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as path from "node:path";
|
|
2
2
|
import { appendIfMissing, ensureTargetGitHooks, mergeClaudeHooksConfig, mergeClaudeMcpConfig, mergeClineMcpConfig, mergeCodexMcpConfig, mergeContinueMcpConfig, mergeCursorMcpConfig, mergeWindsurfMcpConfig, writeIfMissing } from "./init-bootstrap.js";
|
|
3
3
|
import { writeCliError } from "./cli-error.js";
|
|
4
|
-
import { GRAFT_HOOKS_CONFIG,
|
|
4
|
+
import { GRAFT_HOOKS_CONFIG, GraftMcpServer, InitFailure, InitResult, ParsedInitArgs } from "./init-model.js";
|
|
5
5
|
import { emitInitJson, renderInitText } from "./init-render.js";
|
|
6
6
|
|
|
7
7
|
const GRAFTIGNORE_TEMPLATE = `# Graft ignore patterns — files matching these are refused by safe_read.
|
|
@@ -45,6 +45,8 @@ export interface RunInitOptions {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
function initProject(cwd: string, args: ParsedInitArgs): InitResult {
|
|
48
|
+
const mcpServer = new GraftMcpServer(args.mcpRuntime);
|
|
49
|
+
const updateExistingMcp = args.mcpRuntimeExplicit;
|
|
48
50
|
const actions = [
|
|
49
51
|
writeIfMissing(path.join(cwd, ".graftignore"), GRAFTIGNORE_TEMPLATE, ".graftignore"),
|
|
50
52
|
appendIfMissing(path.join(cwd, ".gitignore"), ".graft/", GITIGNORE_ENTRY, ".gitignore"),
|
|
@@ -52,7 +54,7 @@ function initProject(cwd: string, args: ParsedInitArgs): InitResult {
|
|
|
52
54
|
];
|
|
53
55
|
|
|
54
56
|
if (args.writeClaudeMcp) {
|
|
55
|
-
actions.push(mergeClaudeMcpConfig(cwd));
|
|
57
|
+
actions.push(mergeClaudeMcpConfig(cwd, mcpServer, updateExistingMcp));
|
|
56
58
|
}
|
|
57
59
|
if (args.writeClaudeHooks) {
|
|
58
60
|
actions.push(mergeClaudeHooksConfig(cwd));
|
|
@@ -61,7 +63,7 @@ function initProject(cwd: string, args: ParsedInitArgs): InitResult {
|
|
|
61
63
|
actions.push(...ensureTargetGitHooks(cwd));
|
|
62
64
|
}
|
|
63
65
|
if (args.writeCodexMcp) {
|
|
64
|
-
actions.push(mergeCodexMcpConfig(cwd));
|
|
66
|
+
actions.push(mergeCodexMcpConfig(cwd, mcpServer, updateExistingMcp));
|
|
65
67
|
actions.push(
|
|
66
68
|
appendIfMissing(
|
|
67
69
|
path.join(cwd, "AGENTS.md"),
|
|
@@ -72,19 +74,19 @@ function initProject(cwd: string, args: ParsedInitArgs): InitResult {
|
|
|
72
74
|
);
|
|
73
75
|
}
|
|
74
76
|
if (args.writeCursorMcp) {
|
|
75
|
-
actions.push(mergeCursorMcpConfig(cwd));
|
|
77
|
+
actions.push(mergeCursorMcpConfig(cwd, mcpServer, updateExistingMcp));
|
|
76
78
|
}
|
|
77
79
|
if (args.writeWindsurfMcp) {
|
|
78
|
-
actions.push(mergeWindsurfMcpConfig(cwd));
|
|
80
|
+
actions.push(mergeWindsurfMcpConfig(cwd, mcpServer, updateExistingMcp));
|
|
79
81
|
}
|
|
80
82
|
if (args.writeContinueMcp) {
|
|
81
|
-
actions.push(mergeContinueMcpConfig(cwd));
|
|
83
|
+
actions.push(mergeContinueMcpConfig(cwd, mcpServer, updateExistingMcp));
|
|
82
84
|
}
|
|
83
85
|
if (args.writeClineMcp) {
|
|
84
|
-
actions.push(mergeClineMcpConfig(cwd));
|
|
86
|
+
actions.push(mergeClineMcpConfig(cwd, mcpServer, updateExistingMcp));
|
|
85
87
|
}
|
|
86
88
|
|
|
87
|
-
return new InitResult(cwd, actions, GRAFT_HOOKS_CONFIG,
|
|
89
|
+
return new InitResult(cwd, actions, GRAFT_HOOKS_CONFIG, mcpServer);
|
|
88
90
|
}
|
|
89
91
|
|
|
90
92
|
export function runInit(options: RunInitOptions = {}): void {
|
|
@@ -110,7 +112,7 @@ export function runInit(options: RunInitOptions = {}): void {
|
|
|
110
112
|
}
|
|
111
113
|
writeCliError(stderr, message, {
|
|
112
114
|
usage:
|
|
113
|
-
"graft init [--json] [--write-claude-mcp] [--write-claude-hooks] "
|
|
115
|
+
"graft init [--json] [--mcp-runtime <repo-local|daemon>] [--write-claude-mcp] [--write-claude-hooks] "
|
|
114
116
|
+ "[--write-target-git-hooks] [--write-codex-mcp] [--write-cursor-mcp] "
|
|
115
117
|
+ "[--write-windsurf-mcp] [--write-continue-mcp] [--write-cline-mcp]",
|
|
116
118
|
nextSteps: [
|
package/src/cli/json-document.ts
CHANGED
|
@@ -36,9 +36,20 @@ export class JsonArrayNode {
|
|
|
36
36
|
);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
objectEntries(): { index: number; node: JsonObjectNode }[] {
|
|
40
|
+
return this.value.map((item, index) => ({
|
|
41
|
+
index,
|
|
42
|
+
node: JsonObjectNode.fromUnknown(item, this.label, [...this.pointer, `[${String(index)}]`]),
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
|
|
39
46
|
push(value: JsonValue): void {
|
|
40
47
|
this.value.push(cloneJsonValue(value));
|
|
41
48
|
}
|
|
49
|
+
|
|
50
|
+
set(index: number, value: JsonValue): void {
|
|
51
|
+
this.value[index] = cloneJsonValue(value);
|
|
52
|
+
}
|
|
42
53
|
}
|
|
43
54
|
|
|
44
55
|
export class JsonObjectNode {
|
package/src/cli/main.ts
CHANGED
|
@@ -7,13 +7,19 @@ import {
|
|
|
7
7
|
cliCommandMcpTool,
|
|
8
8
|
} from "../contracts/output-schemas.js";
|
|
9
9
|
import { startDaemonServer, type GraftDaemonServer } from "../mcp/daemon-server.js";
|
|
10
|
+
import { startDaemonBackedStdioBridge, type StartDaemonBackedStdioBridgeOptions } from "../mcp/daemon-stdio-bridge.js";
|
|
10
11
|
import { startStdioServer } from "../mcp/stdio-server.js";
|
|
11
12
|
import {
|
|
12
13
|
parseCommand,
|
|
13
14
|
parseDaemonCommand,
|
|
14
15
|
parseGlobalOptions,
|
|
16
|
+
parseServeCommand,
|
|
15
17
|
} from "./command-parser.js";
|
|
16
18
|
import { describeCliFailure, writeCliError } from "./cli-error.js";
|
|
19
|
+
import { readDaemonStatusSnapshot, type ReadDaemonStatusOptions } from "./daemon-status.js";
|
|
20
|
+
import { buildDaemonStatusModel, type DaemonStatusReadSnapshot } from "./daemon-status-model.js";
|
|
21
|
+
import { renderDaemonStatus } from "./daemon-status-render.js";
|
|
22
|
+
import { runGitGraftEnhance, type GitGraftEnhancePeerInvoker } from "./git-graft-enhance.js";
|
|
17
23
|
import { runIndex } from "./index-cmd.js";
|
|
18
24
|
import { runInit } from "./init.js";
|
|
19
25
|
import { runLocalHistoryDag } from "./local-history-dag.js";
|
|
@@ -28,7 +34,10 @@ export interface RunCliOptions {
|
|
|
28
34
|
stdout?: Writer | undefined;
|
|
29
35
|
stderr?: Writer | undefined;
|
|
30
36
|
startServer?: ((cwd: string) => Promise<void>) | undefined;
|
|
37
|
+
startDaemonBridge?: ((options: StartDaemonBackedStdioBridgeOptions) => Promise<void>) | undefined;
|
|
31
38
|
startDaemon?: ((options: { socketPath?: string | undefined }) => Promise<GraftDaemonServer>) | undefined;
|
|
39
|
+
readDaemonStatus?: ((options: ReadDaemonStatusOptions) => Promise<DaemonStatusReadSnapshot>) | undefined;
|
|
40
|
+
invokeGitGraftEnhancePeer?: GitGraftEnhancePeerInvoker | undefined;
|
|
32
41
|
}
|
|
33
42
|
|
|
34
43
|
function renderHelp(writer: Writer): void {
|
|
@@ -39,8 +48,11 @@ function renderHelp(writer: Writer): void {
|
|
|
39
48
|
writeLine(writer, "Global options:");
|
|
40
49
|
writeLine(writer, " --cwd <path> Run a command against another repo root");
|
|
41
50
|
writeLine(writer, " help Show this help");
|
|
42
|
-
writeLine(writer, " serve Start the MCP stdio server");
|
|
51
|
+
writeLine(writer, " serve Start the repo-local MCP stdio server");
|
|
52
|
+
writeLine(writer, " serve --runtime daemon");
|
|
53
|
+
writeLine(writer, " Start stdio bridge to the local graft daemon");
|
|
43
54
|
writeLine(writer, " daemon Start the local MCP daemon");
|
|
55
|
+
writeLine(writer, " daemon status Show read-only daemon status");
|
|
44
56
|
writeLine(writer);
|
|
45
57
|
|
|
46
58
|
const grouped = new Map<string, { path: readonly string[]; description: string }[]>();
|
|
@@ -96,18 +108,37 @@ export async function runCli(options: RunCliOptions = {}): Promise<void> {
|
|
|
96
108
|
}
|
|
97
109
|
|
|
98
110
|
if (argv[0] === "serve") {
|
|
99
|
-
|
|
111
|
+
try {
|
|
112
|
+
const parsedServe = parseServeCommand(cwd, argv.slice(1));
|
|
113
|
+
if (parsedServe.runtime === "daemon") {
|
|
114
|
+
await (options.startDaemonBridge ?? startDaemonBackedStdioBridge)({
|
|
115
|
+
...(parsedServe.socketPath !== undefined ? { socketPath: parsedServe.socketPath } : {}),
|
|
116
|
+
...(parsedServe.spawnIfMissing !== undefined ? { spawnIfMissing: parsedServe.spawnIfMissing } : {}),
|
|
117
|
+
});
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
await (options.startServer ?? startStdioServer)(cwd);
|
|
121
|
+
} catch (err: unknown) {
|
|
100
122
|
process.exitCode = 1;
|
|
101
|
-
writeCliError(stderr,
|
|
102
|
-
return;
|
|
123
|
+
writeCliError(stderr, err instanceof Error ? err.message : String(err), describeCliFailure(argv));
|
|
103
124
|
}
|
|
104
|
-
await (options.startServer ?? startStdioServer)(cwd);
|
|
105
125
|
return;
|
|
106
126
|
}
|
|
107
127
|
|
|
108
128
|
if (argv[0] === "daemon") {
|
|
109
129
|
try {
|
|
110
|
-
const
|
|
130
|
+
const parsedDaemon = parseDaemonCommand(cwd, argv.slice(1));
|
|
131
|
+
if (parsedDaemon.action === "status") {
|
|
132
|
+
const snapshot = await (options.readDaemonStatus ?? readDaemonStatusSnapshot)({
|
|
133
|
+
cwd,
|
|
134
|
+
...(parsedDaemon.socketPath !== undefined ? { socketPath: parsedDaemon.socketPath } : {}),
|
|
135
|
+
});
|
|
136
|
+
writeLine(stdout, renderDaemonStatus(buildDaemonStatusModel({ cwd, snapshot })));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const daemon = await (options.startDaemon ?? startDaemonServer)(
|
|
140
|
+
parsedDaemon.socketPath === undefined ? {} : { socketPath: parsedDaemon.socketPath },
|
|
141
|
+
);
|
|
111
142
|
writeLine(stdout, `Daemon listening on ${daemon.socketPath}`);
|
|
112
143
|
} catch (err: unknown) {
|
|
113
144
|
process.exitCode = 1;
|
|
@@ -137,6 +168,22 @@ export async function runCli(options: RunCliOptions = {}): Promise<void> {
|
|
|
137
168
|
});
|
|
138
169
|
return;
|
|
139
170
|
}
|
|
171
|
+
if (parsed.command === "git_graft_enhance") {
|
|
172
|
+
const since = parsed.args["since"];
|
|
173
|
+
const head = parsed.args["head"];
|
|
174
|
+
if (typeof since !== "string") {
|
|
175
|
+
throw new Error("Missing --since");
|
|
176
|
+
}
|
|
177
|
+
await runGitGraftEnhance({
|
|
178
|
+
cwd,
|
|
179
|
+
since,
|
|
180
|
+
...(typeof head === "string" ? { head } : {}),
|
|
181
|
+
json: parsed.json,
|
|
182
|
+
stdout,
|
|
183
|
+
invokePeer: options.invokeGitGraftEnhancePeer,
|
|
184
|
+
});
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
140
187
|
const tool = cliCommandMcpTool(parsed.command);
|
|
141
188
|
if (tool === null) {
|
|
142
189
|
throw new Error(`Command ${cliCommandKey(cliCommandPath(parsed.command))} has no MCP peer`);
|