@flyingrobots/graft 0.7.0 → 0.8.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 +153 -0
- package/README.md +33 -17
- package/bin/graft.js +26 -26
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -1
- package/dist/cli/cli-error.d.ts.map +1 -1
- package/dist/cli/cli-error.js +22 -3
- package/dist/cli/cli-error.js.map +1 -1
- package/dist/cli/command-parser.d.ts.map +1 -1
- package/dist/cli/command-parser.js +62 -6
- package/dist/cli/command-parser.js.map +1 -1
- package/dist/cli/dead-symbols-render.d.ts +2 -0
- package/dist/cli/dead-symbols-render.d.ts.map +1 -0
- package/dist/cli/dead-symbols-render.js +23 -0
- package/dist/cli/dead-symbols-render.js.map +1 -0
- package/dist/cli/doctor-render.d.ts +2 -0
- package/dist/cli/doctor-render.d.ts.map +1 -0
- package/dist/cli/doctor-render.js +80 -0
- package/dist/cli/doctor-render.js.map +1 -0
- package/dist/cli/entrypoint.d.ts +1 -0
- package/dist/cli/entrypoint.d.ts.map +1 -1
- package/dist/cli/entrypoint.js +1 -0
- package/dist/cli/entrypoint.js.map +1 -1
- package/dist/cli/git-graft-enhance-model.d.ts +33 -3
- package/dist/cli/git-graft-enhance-model.d.ts.map +1 -1
- package/dist/cli/git-graft-enhance-model.js +38 -0
- package/dist/cli/git-graft-enhance-model.js.map +1 -1
- package/dist/cli/git-graft-enhance-render.d.ts.map +1 -1
- package/dist/cli/git-graft-enhance-render.js +13 -0
- package/dist/cli/git-graft-enhance-render.js.map +1 -1
- package/dist/cli/git-graft-enhance.d.ts.map +1 -1
- package/dist/cli/git-graft-enhance.js +44 -1
- package/dist/cli/git-graft-enhance.js.map +1 -1
- package/dist/cli/index-cmd.d.ts +1 -0
- package/dist/cli/index-cmd.d.ts.map +1 -1
- package/dist/cli/index-cmd.js +3 -0
- package/dist/cli/index-cmd.js.map +1 -1
- package/dist/cli/init-client-config.d.ts.map +1 -1
- package/dist/cli/init-client-config.js +40 -4
- package/dist/cli/init-client-config.js.map +1 -1
- package/dist/cli/init-model.js +2 -2
- package/dist/cli/init-model.js.map +1 -1
- package/dist/cli/json-document.d.ts +1 -0
- package/dist/cli/json-document.d.ts.map +1 -1
- package/dist/cli/json-document.js +3 -0
- package/dist/cli/json-document.js.map +1 -1
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +24 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/peer-command.d.ts.map +1 -1
- package/dist/cli/peer-command.js +25 -0
- package/dist/cli/peer-command.js.map +1 -1
- package/dist/cli/review-cooldown.d.ts +15 -0
- package/dist/cli/review-cooldown.d.ts.map +1 -0
- package/dist/cli/review-cooldown.js +136 -0
- package/dist/cli/review-cooldown.js.map +1 -0
- package/dist/cli/structural-blame-render.d.ts +2 -0
- package/dist/cli/structural-blame-render.d.ts.map +1 -0
- package/dist/cli/structural-blame-render.js +39 -0
- package/dist/cli/structural-blame-render.js.map +1 -0
- package/dist/cli/structural-review-render.d.ts +2 -0
- package/dist/cli/structural-review-render.d.ts.map +1 -0
- package/dist/cli/structural-review-render.js +56 -0
- package/dist/cli/structural-review-render.js.map +1 -0
- package/dist/cli/structural-test-coverage-render.d.ts +2 -0
- package/dist/cli/structural-test-coverage-render.d.ts.map +1 -0
- package/dist/cli/structural-test-coverage-render.js +46 -0
- package/dist/cli/structural-test-coverage-render.js.map +1 -0
- package/dist/contracts/capabilities.d.ts +9 -6
- package/dist/contracts/capabilities.d.ts.map +1 -1
- package/dist/contracts/capabilities.js +40 -1
- package/dist/contracts/capabilities.js.map +1 -1
- package/dist/contracts/causal-ontology.d.ts +17 -17
- package/dist/contracts/output-schema-cli.d.ts +103 -41
- package/dist/contracts/output-schema-cli.d.ts.map +1 -1
- package/dist/contracts/output-schema-cli.js +29 -0
- package/dist/contracts/output-schema-cli.js.map +1 -1
- package/dist/contracts/output-schema-fragments.d.ts +76 -76
- package/dist/contracts/output-schema-mcp.d.ts +87 -62
- package/dist/contracts/output-schema-mcp.d.ts.map +1 -1
- package/dist/contracts/output-schema-mcp.js +43 -21
- 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 +69 -1
- package/dist/contracts/output-schemas.js.map +1 -1
- package/dist/git/version-guard.d.ts +17 -0
- package/dist/git/version-guard.d.ts.map +1 -0
- package/dist/git/version-guard.js +51 -0
- package/dist/git/version-guard.js.map +1 -0
- package/dist/hooks/posttooluse-read.js +3 -3
- package/dist/hooks/posttooluse-read.js.map +1 -1
- package/dist/hooks/pretooluse-read.js +1 -1
- package/dist/hooks/pretooluse-read.js.map +1 -1
- package/dist/mcp/burden.d.ts.map +1 -1
- package/dist/mcp/burden.js +2 -0
- package/dist/mcp/burden.js.map +1 -1
- package/dist/mcp/daemon-server.d.ts.map +1 -1
- package/dist/mcp/daemon-server.js +2 -0
- package/dist/mcp/daemon-server.js.map +1 -1
- package/dist/mcp/daemon-worker-child-pool.d.ts +2 -0
- package/dist/mcp/daemon-worker-child-pool.d.ts.map +1 -1
- package/dist/mcp/daemon-worker-child-pool.js +10 -3
- package/dist/mcp/daemon-worker-child-pool.js.map +1 -1
- package/dist/mcp/daemon-worker-pool.d.ts +1 -1
- package/dist/mcp/daemon-worker-pool.d.ts.map +1 -1
- package/dist/mcp/daemon-worker-pool.js +1 -1
- package/dist/mcp/daemon-worker-pool.js.map +1 -1
- package/dist/mcp/persisted-local-history-graph.d.ts.map +1 -1
- package/dist/mcp/persisted-local-history-graph.js +2 -1
- package/dist/mcp/persisted-local-history-graph.js.map +1 -1
- package/dist/mcp/persisted-local-history.d.ts +5 -5
- package/dist/mcp/repo-tool-job.d.ts.map +1 -1
- package/dist/mcp/repo-tool-job.js +2 -0
- package/dist/mcp/repo-tool-job.js.map +1 -1
- package/dist/mcp/server-invocation.d.ts.map +1 -1
- package/dist/mcp/server-invocation.js +206 -147
- package/dist/mcp/server-invocation.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +184 -116
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/stdio-server.d.ts.map +1 -1
- package/dist/mcp/stdio-server.js +2 -0
- package/dist/mcp/stdio-server.js.map +1 -1
- package/dist/mcp/tool-registry.d.ts.map +1 -1
- package/dist/mcp/tool-registry.js +4 -0
- package/dist/mcp/tool-registry.js.map +1 -1
- package/dist/mcp/tools/changed-since.d.ts.map +1 -1
- package/dist/mcp/tools/changed-since.js +10 -3
- package/dist/mcp/tools/changed-since.js.map +1 -1
- package/dist/mcp/tools/dead-symbols.d.ts +3 -0
- package/dist/mcp/tools/dead-symbols.d.ts.map +1 -0
- package/dist/mcp/tools/dead-symbols.js +33 -0
- package/dist/mcp/tools/dead-symbols.js.map +1 -0
- package/dist/mcp/tools/map.d.ts.map +1 -1
- package/dist/mcp/tools/map.js +2 -0
- package/dist/mcp/tools/map.js.map +1 -1
- package/dist/mcp/tools/precision-warp.d.ts.map +1 -1
- package/dist/mcp/tools/precision-warp.js +2 -6
- package/dist/mcp/tools/precision-warp.js.map +1 -1
- package/dist/mcp/tools/refactor-difficulty.d.ts.map +1 -1
- package/dist/mcp/tools/refactor-difficulty.js +2 -0
- package/dist/mcp/tools/refactor-difficulty.js.map +1 -1
- package/dist/mcp/tools/safe-read.d.ts.map +1 -1
- package/dist/mcp/tools/safe-read.js +10 -105
- package/dist/mcp/tools/safe-read.js.map +1 -1
- package/dist/mcp/tools/structural-test-coverage.d.ts +3 -0
- package/dist/mcp/tools/structural-test-coverage.d.ts.map +1 -0
- package/dist/mcp/tools/structural-test-coverage.js +35 -0
- package/dist/mcp/tools/structural-test-coverage.js.map +1 -0
- package/dist/operations/cached-file.d.ts +6 -2
- package/dist/operations/cached-file.d.ts.map +1 -1
- package/dist/operations/cached-file.js +30 -6
- package/dist/operations/cached-file.js.map +1 -1
- package/dist/operations/export-surface-diff.d.ts.map +1 -1
- package/dist/operations/export-surface-diff.js +2 -0
- package/dist/operations/export-surface-diff.js.map +1 -1
- package/dist/operations/file-outline.js +2 -2
- package/dist/operations/file-outline.js.map +1 -1
- package/dist/operations/graft-diff.d.ts.map +1 -1
- package/dist/operations/graft-diff.js +2 -0
- package/dist/operations/graft-diff.js.map +1 -1
- package/dist/operations/projection-safety.d.ts.map +1 -1
- package/dist/operations/projection-safety.js +2 -0
- package/dist/operations/projection-safety.js.map +1 -1
- package/dist/operations/repo-workspace.d.ts.map +1 -1
- package/dist/operations/repo-workspace.js +26 -8
- package/dist/operations/repo-workspace.js.map +1 -1
- package/dist/operations/review-cooldown-status.d.ts +27 -0
- package/dist/operations/review-cooldown-status.d.ts.map +1 -0
- package/dist/operations/review-cooldown-status.js +115 -0
- package/dist/operations/review-cooldown-status.js.map +1 -0
- package/dist/operations/safe-read.js +2 -2
- package/dist/operations/safe-read.js.map +1 -1
- package/dist/operations/sludge-detector.d.ts.map +1 -1
- package/dist/operations/sludge-detector.js +2 -1
- package/dist/operations/sludge-detector.js.map +1 -1
- package/dist/operations/structural-review.js +8 -8
- package/dist/operations/structural-review.js.map +1 -1
- package/dist/operations/structural-test-coverage-map.d.ts +44 -0
- package/dist/operations/structural-test-coverage-map.d.ts.map +1 -0
- package/dist/operations/structural-test-coverage-map.js +331 -0
- package/dist/operations/structural-test-coverage-map.js.map +1 -0
- package/dist/operations/structured-buffer-compare.d.ts.map +1 -1
- package/dist/operations/structured-buffer-compare.js +4 -1
- package/dist/operations/structured-buffer-compare.js.map +1 -1
- package/dist/operations/structured-buffer-model.d.ts +15 -13
- package/dist/operations/structured-buffer-model.d.ts.map +1 -1
- package/dist/operations/structured-buffer-model.js +24 -5
- package/dist/operations/structured-buffer-model.js.map +1 -1
- package/dist/operations/structured-buffer-query.d.ts.map +1 -1
- package/dist/operations/structured-buffer-query.js +21 -12
- package/dist/operations/structured-buffer-query.js.map +1 -1
- package/dist/parser/extractors/common.d.ts +16 -0
- package/dist/parser/extractors/common.d.ts.map +1 -0
- package/dist/parser/extractors/common.js +23 -0
- package/dist/parser/extractors/common.js.map +1 -0
- package/dist/parser/extractors/go.d.ts +18 -0
- package/dist/parser/extractors/go.d.ts.map +1 -0
- package/dist/parser/extractors/go.js +200 -0
- package/dist/parser/extractors/go.js.map +1 -0
- package/dist/parser/extractors/graphql.d.ts +26 -0
- package/dist/parser/extractors/graphql.d.ts.map +1 -0
- package/dist/parser/extractors/graphql.js +239 -0
- package/dist/parser/extractors/graphql.js.map +1 -0
- package/dist/parser/extractors/index.d.ts +4 -0
- package/dist/parser/extractors/index.d.ts.map +1 -0
- package/dist/parser/extractors/index.js +26 -0
- package/dist/parser/extractors/index.js.map +1 -0
- package/dist/parser/extractors/json.d.ts +10 -0
- package/dist/parser/extractors/json.d.ts.map +1 -0
- package/dist/parser/extractors/json.js +75 -0
- package/dist/parser/extractors/json.js.map +1 -0
- package/dist/parser/extractors/python.d.ts +16 -0
- package/dist/parser/extractors/python.d.ts.map +1 -0
- package/dist/parser/extractors/python.js +145 -0
- package/dist/parser/extractors/python.js.map +1 -0
- package/dist/parser/extractors/rust.d.ts +12 -0
- package/dist/parser/extractors/rust.d.ts.map +1 -0
- package/dist/parser/extractors/rust.js +122 -0
- package/dist/parser/extractors/rust.js.map +1 -0
- package/dist/parser/extractors/toml.d.ts +10 -0
- package/dist/parser/extractors/toml.d.ts.map +1 -0
- package/dist/parser/extractors/toml.js +74 -0
- package/dist/parser/extractors/toml.js.map +1 -0
- package/dist/parser/extractors/typescript.d.ts +13 -0
- package/dist/parser/extractors/typescript.d.ts.map +1 -0
- package/dist/parser/extractors/typescript.js +179 -0
- package/dist/parser/extractors/typescript.js.map +1 -0
- package/dist/parser/extractors/yaml.d.ts +13 -0
- package/dist/parser/extractors/yaml.d.ts.map +1 -0
- package/dist/parser/extractors/yaml.js +93 -0
- package/dist/parser/extractors/yaml.js.map +1 -0
- package/dist/parser/lang.d.ts +2 -2
- package/dist/parser/lang.d.ts.map +1 -1
- package/dist/parser/lang.js +19 -1
- package/dist/parser/lang.js.map +1 -1
- package/dist/parser/outline.d.ts +4 -0
- package/dist/parser/outline.d.ts.map +1 -1
- package/dist/parser/outline.js +32 -221
- package/dist/parser/outline.js.map +1 -1
- package/dist/parser/runtime.d.ts +7 -0
- package/dist/parser/runtime.d.ts.map +1 -1
- package/dist/parser/runtime.js +99 -10
- package/dist/parser/runtime.js.map +1 -1
- package/dist/parser/types.d.ts +1 -1
- package/dist/parser/types.d.ts.map +1 -1
- package/dist/parser/types.js.map +1 -1
- package/dist/ports/provenance-timeline.d.ts +10 -0
- package/dist/ports/provenance-timeline.d.ts.map +1 -0
- package/dist/ports/provenance-timeline.js +17 -0
- package/dist/ports/provenance-timeline.js.map +1 -0
- package/dist/ports/semantic-enrichment.d.ts +47 -0
- package/dist/ports/semantic-enrichment.d.ts.map +1 -0
- package/dist/ports/semantic-enrichment.js +2 -0
- package/dist/ports/semantic-enrichment.js.map +1 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +3 -1
- package/dist/version.js.map +1 -1
- package/dist/warp/ast-import-resolver.d.ts.map +1 -1
- package/dist/warp/ast-import-resolver.js +2 -1
- package/dist/warp/ast-import-resolver.js.map +1 -1
- package/dist/warp/dead-symbols.d.ts.map +1 -1
- package/dist/warp/dead-symbols.js +4 -7
- package/dist/warp/dead-symbols.js.map +1 -1
- package/dist/warp/index-head.d.ts +4 -0
- package/dist/warp/index-head.d.ts.map +1 -1
- package/dist/warp/index-head.js +255 -22
- package/dist/warp/index-head.js.map +1 -1
- package/dist/warp/observers.d.ts.map +1 -1
- package/dist/warp/observers.js +3 -2
- package/dist/warp/observers.js.map +1 -1
- package/dist/warp/refactor-difficulty.d.ts.map +1 -1
- package/dist/warp/refactor-difficulty.js +4 -9
- package/dist/warp/refactor-difficulty.js.map +1 -1
- package/dist/warp/references.d.ts.map +1 -1
- package/dist/warp/references.js +2 -1
- package/dist/warp/references.js.map +1 -1
- package/dist/warp/semantic-enrichment.d.ts +14 -0
- package/dist/warp/semantic-enrichment.d.ts.map +1 -0
- package/dist/warp/semantic-enrichment.js +55 -0
- package/dist/warp/semantic-enrichment.js.map +1 -0
- package/dist/warp/structural-queries.d.ts.map +1 -1
- package/dist/warp/structural-queries.js +7 -14
- package/dist/warp/structural-queries.js.map +1 -1
- package/dist/warp/sym-id-codec.d.ts +14 -0
- package/dist/warp/sym-id-codec.d.ts.map +1 -0
- package/dist/warp/sym-id-codec.js +47 -0
- package/dist/warp/sym-id-codec.js.map +1 -0
- package/dist/warp/symbol-timeline.d.ts.map +1 -1
- package/dist/warp/symbol-timeline.js +6 -14
- package/dist/warp/symbol-timeline.js.map +1 -1
- package/dist/warp/warp-structural-churn.d.ts.map +1 -1
- package/dist/warp/warp-structural-churn.js +6 -10
- package/dist/warp/warp-structural-churn.js.map +1 -1
- package/dist/warp/warp-structural-log.d.ts.map +1 -1
- package/dist/warp/warp-structural-log.js +8 -10
- package/dist/warp/warp-structural-log.js.map +1 -1
- package/docs/CLI.md +63 -5
- package/docs/MCP.md +2 -1
- package/docs/SETUP.md +11 -7
- package/package.json +12 -4
- package/src/adapters/canonical-json.ts +0 -56
- package/src/adapters/json-text-decoder.ts +0 -11
- package/src/adapters/node-fs.ts +0 -43
- package/src/adapters/node-git.ts +0 -47
- package/src/adapters/node-paths.ts +0 -35
- package/src/adapters/node-process-runner.ts +0 -27
- package/src/adapters/repo-paths.ts +0 -63
- package/src/adapters/rotating-ndjson-log.ts +0 -66
- package/src/api/index.ts +0 -107
- package/src/api/repo-local-graft.ts +0 -21
- package/src/api/repo-workspace.ts +0 -34
- package/src/api/tool-bridge.ts +0 -22
- package/src/cli/activity-render.ts +0 -112
- package/src/cli/cli-error.ts +0 -192
- package/src/cli/command-parser.ts +0 -484
- package/src/cli/daemon-status-model.ts +0 -238
- package/src/cli/daemon-status-render.ts +0 -102
- package/src/cli/daemon-status.ts +0 -100
- package/src/cli/entrypoint.ts +0 -18
- package/src/cli/git-graft-enhance-model.ts +0 -131
- package/src/cli/git-graft-enhance-render.ts +0 -33
- package/src/cli/git-graft-enhance.ts +0 -54
- package/src/cli/index-cmd.ts +0 -90
- package/src/cli/index-model.ts +0 -75
- package/src/cli/init-bootstrap.ts +0 -47
- package/src/cli/init-client-config.ts +0 -428
- package/src/cli/init-model.ts +0 -284
- package/src/cli/init-render.ts +0 -54
- package/src/cli/init-target-hooks.ts +0 -93
- package/src/cli/init.ts +0 -124
- package/src/cli/json-document.ts +0 -155
- package/src/cli/local-history-dag-model.ts +0 -437
- package/src/cli/local-history-dag-render.ts +0 -133
- package/src/cli/local-history-dag.ts +0 -103
- package/src/cli/main.ts +0 -197
- package/src/cli/migrate-local-history.ts +0 -119
- package/src/cli/peer-command.ts +0 -60
- package/src/contracts/capabilities.ts +0 -540
- package/src/contracts/causal-ontology.ts +0 -627
- package/src/contracts/causal-surface-next-action.ts +0 -18
- package/src/contracts/json-object.ts +0 -18
- package/src/contracts/mcp-runtime.ts +0 -16
- package/src/contracts/output-schema-cli.ts +0 -103
- package/src/contracts/output-schema-fragments.ts +0 -881
- package/src/contracts/output-schema-mcp.ts +0 -501
- package/src/contracts/output-schema-meta.ts +0 -119
- package/src/contracts/output-schemas.ts +0 -1524
- package/src/git/diff.ts +0 -161
- package/src/git/target-git-hook-bootstrap.ts +0 -56
- package/src/guards/stream-boundary.ts +0 -110
- package/src/hooks/posttooluse-read.ts +0 -54
- package/src/hooks/pretooluse-read.ts +0 -52
- package/src/hooks/read-governor.ts +0 -95
- package/src/hooks/read-messages.ts +0 -53
- package/src/hooks/shared.ts +0 -168
- package/src/index.ts +0 -1
- package/src/mcp/burden.ts +0 -132
- package/src/mcp/cache.ts +0 -7
- package/src/mcp/cached-file.ts +0 -1
- package/src/mcp/context.ts +0 -150
- package/src/mcp/control-plane/authz-storage.ts +0 -129
- package/src/mcp/control-plane/session-registry.ts +0 -115
- package/src/mcp/control-plane/status-projection.ts +0 -76
- package/src/mcp/control-plane/types.ts +0 -144
- package/src/mcp/daemon-bootstrap.ts +0 -100
- package/src/mcp/daemon-control-plane.ts +0 -310
- package/src/mcp/daemon-job-scheduler.ts +0 -279
- package/src/mcp/daemon-repos.ts +0 -99
- package/src/mcp/daemon-server.ts +0 -172
- package/src/mcp/daemon-session-host.ts +0 -234
- package/src/mcp/daemon-stdio-bridge.ts +0 -262
- package/src/mcp/daemon-worker-child-pool.ts +0 -213
- package/src/mcp/daemon-worker-inline-pool.ts +0 -46
- package/src/mcp/daemon-worker-pool.ts +0 -7
- package/src/mcp/daemon-worker-process.ts +0 -52
- package/src/mcp/daemon-worker-types.ts +0 -66
- package/src/mcp/metrics.ts +0 -176
- package/src/mcp/monitor-health.ts +0 -83
- package/src/mcp/monitor-persistence.ts +0 -54
- package/src/mcp/monitor-tick-job.ts +0 -153
- package/src/mcp/monitor-types.ts +0 -103
- package/src/mcp/persisted-local-history-graph.ts +0 -592
- package/src/mcp/persisted-local-history-policy.ts +0 -501
- package/src/mcp/persisted-local-history-views.ts +0 -250
- package/src/mcp/persisted-local-history.ts +0 -1621
- package/src/mcp/persistent-monitor-runtime.ts +0 -482
- package/src/mcp/policy.ts +0 -75
- package/src/mcp/receipt.ts +0 -201
- package/src/mcp/repo-concurrency.ts +0 -392
- package/src/mcp/repo-overview/filter.ts +0 -44
- package/src/mcp/repo-overview/types.ts +0 -63
- package/src/mcp/repo-overview/view-projection.ts +0 -90
- package/src/mcp/repo-state-git.ts +0 -247
- package/src/mcp/repo-state-observation.ts +0 -203
- package/src/mcp/repo-state-transition.ts +0 -151
- package/src/mcp/repo-state-types.ts +0 -107
- package/src/mcp/repo-state.ts +0 -146
- package/src/mcp/repo-tool-job.ts +0 -102
- package/src/mcp/repo-tool-worker-context.ts +0 -215
- package/src/mcp/repo-workspace.ts +0 -21
- package/src/mcp/run-capture-config.ts +0 -33
- package/src/mcp/runtime-causal-context.ts +0 -72
- package/src/mcp/runtime-observability.ts +0 -217
- package/src/mcp/runtime-staged-target.ts +0 -161
- package/src/mcp/runtime-workspace-overlay.ts +0 -255
- package/src/mcp/secret-scrub.ts +0 -89
- package/src/mcp/semantic-transition-guidance.ts +0 -60
- package/src/mcp/semantic-transition-summary.ts +0 -130
- package/src/mcp/server-context.ts +0 -236
- package/src/mcp/server-invocation.ts +0 -388
- package/src/mcp/server-tool-access.ts +0 -148
- package/src/mcp/server.ts +0 -270
- package/src/mcp/stdio-server.ts +0 -26
- package/src/mcp/stdio.ts +0 -3
- package/src/mcp/tool-registry.ts +0 -98
- package/src/mcp/tools/activity-view.ts +0 -325
- package/src/mcp/tools/budget.ts +0 -23
- package/src/mcp/tools/causal-attach.ts +0 -67
- package/src/mcp/tools/causal-status.ts +0 -58
- package/src/mcp/tools/changed-since.ts +0 -71
- package/src/mcp/tools/code-find.ts +0 -192
- package/src/mcp/tools/code-refs.ts +0 -470
- package/src/mcp/tools/code-show.ts +0 -289
- package/src/mcp/tools/daemon-monitors.ts +0 -14
- package/src/mcp/tools/daemon-repos.ts +0 -22
- package/src/mcp/tools/daemon-sessions.ts +0 -14
- package/src/mcp/tools/daemon-status.ts +0 -12
- package/src/mcp/tools/diagnostic-models.ts +0 -97
- package/src/mcp/tools/doctor.ts +0 -83
- package/src/mcp/tools/explain.ts +0 -84
- package/src/mcp/tools/export-surface-diff.ts +0 -26
- package/src/mcp/tools/file-outline.ts +0 -67
- package/src/mcp/tools/git-files.ts +0 -73
- package/src/mcp/tools/graft-diff.ts +0 -35
- package/src/mcp/tools/graft-edit.ts +0 -276
- package/src/mcp/tools/knowledge-map.ts +0 -34
- package/src/mcp/tools/map-collector.ts +0 -338
- package/src/mcp/tools/map.ts +0 -185
- package/src/mcp/tools/monitor-nudge.ts +0 -19
- package/src/mcp/tools/monitor-pause.ts +0 -18
- package/src/mcp/tools/monitor-resume.ts +0 -18
- package/src/mcp/tools/monitor-start.ts +0 -20
- package/src/mcp/tools/monitor-stop.ts +0 -18
- package/src/mcp/tools/precision-live.ts +0 -158
- package/src/mcp/tools/precision-match.ts +0 -54
- package/src/mcp/tools/precision-paths.ts +0 -59
- package/src/mcp/tools/precision-query.ts +0 -127
- package/src/mcp/tools/precision-show.ts +0 -86
- package/src/mcp/tools/precision-visibility.ts +0 -44
- package/src/mcp/tools/precision-warp.ts +0 -101
- package/src/mcp/tools/precision.ts +0 -21
- package/src/mcp/tools/read-range.ts +0 -28
- package/src/mcp/tools/refactor-difficulty.ts +0 -42
- package/src/mcp/tools/run-capture.ts +0 -149
- package/src/mcp/tools/safe-read.ts +0 -148
- package/src/mcp/tools/since.ts +0 -53
- package/src/mcp/tools/state.ts +0 -39
- package/src/mcp/tools/stats.ts +0 -24
- package/src/mcp/tools/structural-blame.ts +0 -55
- package/src/mcp/tools/structural-churn.ts +0 -28
- package/src/mcp/tools/structural-log.ts +0 -41
- package/src/mcp/tools/structural-review.ts +0 -63
- package/src/mcp/tools/workspace-authorizations.ts +0 -14
- package/src/mcp/tools/workspace-authorize.ts +0 -20
- package/src/mcp/tools/workspace-bind.ts +0 -25
- package/src/mcp/tools/workspace-rebind.ts +0 -25
- package/src/mcp/tools/workspace-revoke.ts +0 -18
- package/src/mcp/tools/workspace-status.ts +0 -12
- package/src/mcp/warp-pool.ts +0 -36
- package/src/mcp/workspace-read-observation-model.ts +0 -48
- package/src/mcp/workspace-read-observation.ts +0 -103
- package/src/mcp/workspace-router-capability.ts +0 -32
- package/src/mcp/workspace-router-history.ts +0 -233
- package/src/mcp/workspace-router-model.ts +0 -131
- package/src/mcp/workspace-router-resolution.ts +0 -71
- package/src/mcp/workspace-router-runtime.ts +0 -246
- package/src/mcp/workspace-router.ts +0 -688
- package/src/metrics/logger.ts +0 -40
- package/src/metrics/types.ts +0 -40
- package/src/operations/adaptive-projection.ts +0 -54
- package/src/operations/agent-handoff.ts +0 -59
- package/src/operations/cached-file.ts +0 -40
- package/src/operations/capture-range.ts +0 -64
- package/src/operations/conversation-primer.ts +0 -82
- package/src/operations/cross-session-resume.ts +0 -104
- package/src/operations/deterministic-replay.ts +0 -143
- package/src/operations/diff-identity.ts +0 -127
- package/src/operations/export-surface-diff.ts +0 -355
- package/src/operations/file-outline.ts +0 -48
- package/src/operations/footprint-parallelism.ts +0 -98
- package/src/operations/graft-diff.ts +0 -169
- package/src/operations/horizon-of-readability.ts +0 -60
- package/src/operations/import-reference-impact.ts +0 -143
- package/src/operations/knowledge-map.ts +0 -96
- package/src/operations/observation-cache.ts +0 -165
- package/src/operations/projection-safety.ts +0 -111
- package/src/operations/read-range.ts +0 -64
- package/src/operations/repo-workspace.ts +0 -339
- package/src/operations/result-dto.ts +0 -23
- package/src/operations/safe-read.ts +0 -118
- package/src/operations/semantic-drift.ts +0 -70
- package/src/operations/session-filtration.ts +0 -76
- package/src/operations/session-replay.ts +0 -73
- package/src/operations/sludge-detector.ts +0 -356
- package/src/operations/state.ts +0 -66
- package/src/operations/structural-blame.ts +0 -197
- package/src/operations/structural-review.ts +0 -317
- package/src/operations/structured-buffer-compare.ts +0 -429
- package/src/operations/structured-buffer-model.ts +0 -456
- package/src/operations/structured-buffer-query.ts +0 -794
- package/src/operations/structured-buffer.ts +0 -181
- package/src/operations/teaching-hints.ts +0 -52
- package/src/parser/diff.ts +0 -320
- package/src/parser/lang.ts +0 -71
- package/src/parser/markdown.ts +0 -197
- package/src/parser/outline.ts +0 -316
- package/src/parser/runtime.ts +0 -71
- package/src/parser/types.ts +0 -75
- package/src/policy/evaluate.ts +0 -178
- package/src/policy/graftignore.ts +0 -6
- package/src/policy/types.ts +0 -87
- package/src/ports/codec.ts +0 -13
- package/src/ports/filesystem.ts +0 -18
- package/src/ports/git.ts +0 -16
- package/src/ports/guards.ts +0 -68
- package/src/ports/paths.ts +0 -22
- package/src/ports/process-runner.ts +0 -22
- package/src/release/security-gate.ts +0 -102
- package/src/session/tracker.ts +0 -145
- package/src/session/types.ts +0 -23
- package/src/version.ts +0 -3
- package/src/warp/ast-emitter.ts +0 -133
- package/src/warp/ast-import-resolver.ts +0 -333
- package/src/warp/commit-meta.ts +0 -19
- package/src/warp/context.ts +0 -48
- package/src/warp/dead-symbols.ts +0 -174
- package/src/warp/drift-sentinel.ts +0 -101
- package/src/warp/index-head.ts +0 -348
- package/src/warp/observers.ts +0 -101
- package/src/warp/open.ts +0 -67
- package/src/warp/outline-diff-trailer.ts +0 -100
- package/src/warp/plumbing.d.ts +0 -24
- package/src/warp/refactor-difficulty.ts +0 -257
- package/src/warp/references.ts +0 -77
- package/src/warp/stale-docs.ts +0 -210
- package/src/warp/structural-drift-detection.ts +0 -97
- package/src/warp/structural-queries.ts +0 -258
- package/src/warp/symbol-timeline.ts +0 -209
- package/src/warp/traverse-hydrate.ts +0 -61
- package/src/warp/warp-reference-count.ts +0 -47
- package/src/warp/warp-structural-blame.ts +0 -65
- package/src/warp/warp-structural-churn.ts +0 -309
- package/src/warp/warp-structural-log.ts +0 -149
- package/src/warp/writer-id.ts +0 -30
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warp-structural-log.js","sourceRoot":"","sources":["../../src/warp/warp-structural-log.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAI9E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"warp-structural-log.js","sourceRoot":"","sources":["../../src/warp/warp-structural-log.ts"],"names":[],"mappings":"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"}
|
package/docs/CLI.md
CHANGED
|
@@ -14,10 +14,12 @@ flowchart LR
|
|
|
14
14
|
B --> B6[index]
|
|
15
15
|
B --> B7[migrate local-history]
|
|
16
16
|
B --> B8[enhance]
|
|
17
|
+
B --> B9[review]
|
|
17
18
|
C --> C1[read]
|
|
18
19
|
C --> C2[struct]
|
|
19
20
|
C --> C3[symbol]
|
|
20
21
|
C --> C4[diag]
|
|
22
|
+
C --> C5[review]
|
|
21
23
|
```
|
|
22
24
|
|
|
23
25
|
## What it is for
|
|
@@ -27,6 +29,10 @@ flowchart LR
|
|
|
27
29
|
- read-only daemon status inspection via `graft daemon status`
|
|
28
30
|
- bounded, lazy WARP refresh via `graft index --path <path>`
|
|
29
31
|
- one-time legacy import via `graft migrate local-history`
|
|
32
|
+
- human-facing structural review summaries via `graft review`
|
|
33
|
+
- review-loop readiness via `graft review cooldown`
|
|
34
|
+
- structural/reference test coverage maps via `graft struct test-coverage`
|
|
35
|
+
- dead-symbol cleanup candidates via `graft struct dead-symbols`
|
|
30
36
|
- Git-facing structural review summaries via `git graft enhance`
|
|
31
37
|
- local debugging and dogfooding of MCP peer commands
|
|
32
38
|
- human-facing inspection of bounded state such as:
|
|
@@ -35,12 +41,14 @@ flowchart LR
|
|
|
35
41
|
- `graft diag doctor`
|
|
36
42
|
- `graft doctor --sludge`
|
|
37
43
|
- `graft diag stats`
|
|
44
|
+
- `graft symbol history`
|
|
38
45
|
- `graft symbol difficulty`
|
|
39
46
|
|
|
40
47
|
## Core namespaces
|
|
41
48
|
- `read` — bounded reads and change checks
|
|
42
|
-
- `struct` — structural diff / since / map
|
|
43
|
-
- `symbol` — precision show / find / blame / difficulty
|
|
49
|
+
- `struct` — structural diff / since / map / review / test-coverage / dead-symbols
|
|
50
|
+
- `symbol` — precision show / find / blame / history / difficulty
|
|
51
|
+
- `review` — structural review and review-loop readiness
|
|
44
52
|
- `diag` — activity, local-history-dag, doctor, explain, stats, capture
|
|
45
53
|
|
|
46
54
|
## Release-facing commands
|
|
@@ -55,9 +63,18 @@ graft diag activity --json
|
|
|
55
63
|
graft diag local-history-dag --json
|
|
56
64
|
graft diag doctor --json
|
|
57
65
|
graft doctor --sludge --json
|
|
66
|
+
graft review --base HEAD~1
|
|
67
|
+
graft review --base origin/main --head HEAD --json
|
|
68
|
+
graft review cooldown --pr 48
|
|
69
|
+
graft review cooldown --comments-file comments.json --now 2026-05-05T15:10:00.000Z --json
|
|
58
70
|
graft symbol find 'create*' --json
|
|
71
|
+
graft symbol history createUser --path src/users.ts
|
|
59
72
|
graft symbol difficulty createUser --path src/users.ts --json
|
|
60
73
|
graft struct diff --json
|
|
74
|
+
graft struct test-coverage --src src --tests test
|
|
75
|
+
graft struct test-coverage --src src --tests test --json
|
|
76
|
+
graft struct dead-symbols --limit 20
|
|
77
|
+
graft struct dead-symbols --limit 20 --json
|
|
61
78
|
git graft enhance --since HEAD~1
|
|
62
79
|
git-graft enhance --since HEAD~1
|
|
63
80
|
git-graft enhance --since HEAD~1 --json
|
|
@@ -73,14 +90,55 @@ pnpm graft diag activity
|
|
|
73
90
|
|
|
74
91
|
Bare `graft ...` only works when the package is installed or linked onto your `PATH`.
|
|
75
92
|
|
|
93
|
+
`graft review --base <ref> [--head <ref>] [--json]` renders the
|
|
94
|
+
repo-local structural review summary backed by the same `graft_review`
|
|
95
|
+
model as MCP and `graft struct review`. Human output separates
|
|
96
|
+
structural files from formatting, test, docs, and config churn. JSON
|
|
97
|
+
output keeps the schema-validated `graft.cli.struct_review` payload for
|
|
98
|
+
agents. GitHub PR-number resolution and comment posting are intentionally
|
|
99
|
+
outside this first slice; check out or fetch the PR branch and compare
|
|
100
|
+
refs locally.
|
|
101
|
+
|
|
102
|
+
`graft review cooldown [--pr <number>] [--comments-file <path>] [--now
|
|
103
|
+
<iso>] [--json]` reads PR comments, detects CodeRabbit rate-limit
|
|
104
|
+
markers, and reports whether another automated review request is ready,
|
|
105
|
+
still cooling down, or unknown. Without `--comments-file` it shells out
|
|
106
|
+
to `gh pr view [<number>] --json comments`; fixtures can use
|
|
107
|
+
`--comments-file` to validate the same logic without network or GitHub
|
|
108
|
+
state. Human output includes local timestamps; JSON output keeps the
|
|
109
|
+
schema-validated `graft.cli.review_cooldown` payload.
|
|
110
|
+
|
|
111
|
+
`graft struct test-coverage [--src <path>] [--tests <path>] [--json]`
|
|
112
|
+
renders a structural/reference coverage map for exported source symbols.
|
|
113
|
+
The default paths are `src` and `test`. Human output lists summary
|
|
114
|
+
counts, limitations, and per-symbol `covered` / `uncovered` status.
|
|
115
|
+
JSON output keeps the schema-validated
|
|
116
|
+
`graft.cli.struct_test_coverage` payload. This command does not run
|
|
117
|
+
tests or claim line, branch, statement, or execution coverage; imports
|
|
118
|
+
and mentions in test files can count as structural references.
|
|
119
|
+
|
|
120
|
+
`graft struct dead-symbols [--limit <n>] [--json]` lists symbols removed
|
|
121
|
+
from indexed WARP history and not subsequently re-added. Human output is
|
|
122
|
+
intended for cleanup and API-surface shrinkage review; JSON output keeps
|
|
123
|
+
the schema-validated `graft.cli.struct_dead_symbols` payload backed by
|
|
124
|
+
the `graft_dead_symbols` MCP peer.
|
|
125
|
+
|
|
126
|
+
`graft symbol history <symbol> [--path <path>] [--json]` renders the
|
|
127
|
+
same provenance-backed history as `graft symbol blame`, with a
|
|
128
|
+
timeline-first human view over creation, signature-change, and reference
|
|
129
|
+
facts. JSON output remains the schema-validated `graft.cli.symbol_blame`
|
|
130
|
+
payload so the alias does not create a second wire shape for the same
|
|
131
|
+
WARP truth.
|
|
132
|
+
|
|
76
133
|
`git graft enhance --since <ref> [--head <ref>] [--json]` is the
|
|
77
134
|
installed Git external-command form for the release-facing structural
|
|
78
135
|
review aggregator. `git-graft enhance --since <ref>` is the direct
|
|
79
136
|
package binary form. Both route through the same top-level `enhance`
|
|
80
137
|
parser path. The command composes the shipped structural-since and
|
|
81
|
-
export-surface facts into a concise review summary
|
|
82
|
-
|
|
83
|
-
|
|
138
|
+
export-surface facts into a concise review summary, plus bounded
|
|
139
|
+
provenance hints for changed symbols when WARP blame data is available.
|
|
140
|
+
It does not wrap arbitrary Git subcommands or expand into unbounded
|
|
141
|
+
reference traversal or write-tool behavior.
|
|
84
142
|
|
|
85
143
|
`graft diag activity` is the current human-facing between-commit surface. It reports bounded local `artifact_history`, not canonical provenance, and now renders a textual operator summary by default. Use `--json` when you want the structured machine-readable form.
|
|
86
144
|
|
package/docs/MCP.md
CHANGED
|
@@ -63,7 +63,8 @@ flow:
|
|
|
63
63
|
## Key Tool Groups
|
|
64
64
|
- **Bounded Reads**: `safe_read`, `file_outline`, `read_range`, `changed_since`
|
|
65
65
|
- **Governed Edits**: `graft_edit`
|
|
66
|
-
- **Structural History**: `graft_diff`, `graft_since`, `graft_map
|
|
66
|
+
- **Structural History**: `graft_diff`, `graft_since`, `graft_map`,
|
|
67
|
+
`graft_review`, `graft_test_coverage`, `graft_dead_symbols`
|
|
67
68
|
- **Structural Metrics**: `graft_churn`, `graft_difficulty`
|
|
68
69
|
- **Precision**: `code_show`, `code_find`, `code_refs`
|
|
69
70
|
- **Activity & Footing**: `activity_view`, `causal_status`, `causal_attach`, `doctor`
|
package/docs/SETUP.md
CHANGED
|
@@ -424,7 +424,7 @@ Add to `.claude/settings.json` in your project root:
|
|
|
424
424
|
"hooks": [
|
|
425
425
|
{
|
|
426
426
|
"type": "command",
|
|
427
|
-
"command": "node
|
|
427
|
+
"command": "node node_modules/@flyingrobots/graft/dist/hooks/pretooluse-read.js"
|
|
428
428
|
}
|
|
429
429
|
]
|
|
430
430
|
}
|
|
@@ -435,7 +435,7 @@ Add to `.claude/settings.json` in your project root:
|
|
|
435
435
|
"hooks": [
|
|
436
436
|
{
|
|
437
437
|
"type": "command",
|
|
438
|
-
"command": "node
|
|
438
|
+
"command": "node node_modules/@flyingrobots/graft/dist/hooks/posttooluse-read.js"
|
|
439
439
|
}
|
|
440
440
|
]
|
|
441
441
|
}
|
|
@@ -450,12 +450,16 @@ Project-local shortcut:
|
|
|
450
450
|
npx @flyingrobots/graft init --write-claude-hooks
|
|
451
451
|
```
|
|
452
452
|
|
|
453
|
-
|
|
454
|
-
|
|
453
|
+
Rerunning this command also upgrades generated v0.7.0 hook commands
|
|
454
|
+
that pointed at `src/hooks/*.ts` to the published `dist/hooks/*.js`
|
|
455
|
+
entry points.
|
|
455
456
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
457
|
+
If developing graft itself, run `pnpm build` and replace the
|
|
458
|
+
`node_modules/...` paths with local paths:
|
|
459
|
+
|
|
460
|
+
```text
|
|
461
|
+
dist/hooks/pretooluse-read.js (PreToolUse)
|
|
462
|
+
dist/hooks/posttooluse-read.js (PostToolUse)
|
|
459
463
|
```
|
|
460
464
|
|
|
461
465
|
### PreToolUse — ban enforcement
|
package/package.json
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flyingrobots/graft",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Context governor and between-commit activity surface for coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.30.0",
|
|
7
7
|
"main": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
|
+
"sideEffects": [
|
|
10
|
+
"dist/parser/runtime.js",
|
|
11
|
+
"dist/operations/structured-buffer-model.js"
|
|
12
|
+
],
|
|
9
13
|
"exports": {
|
|
10
14
|
".": {
|
|
11
15
|
"types": "./dist/index.d.ts",
|
|
@@ -20,7 +24,6 @@
|
|
|
20
24
|
"files": [
|
|
21
25
|
"bin/",
|
|
22
26
|
"dist/",
|
|
23
|
-
"src/",
|
|
24
27
|
"ADVANCED_GUIDE.md",
|
|
25
28
|
"ARCHITECTURE.md",
|
|
26
29
|
"CHANGELOG.md",
|
|
@@ -37,6 +40,7 @@
|
|
|
37
40
|
"graft": "node ./bin/graft.js",
|
|
38
41
|
"build": "tsc -p tsconfig.build.json",
|
|
39
42
|
"prepack": "pnpm build",
|
|
43
|
+
"prepublishOnly": "pnpm release:check",
|
|
40
44
|
"test": "tsx scripts/run-isolated-tests.ts",
|
|
41
45
|
"test:local": "vitest run",
|
|
42
46
|
"test:watch": "vitest",
|
|
@@ -86,8 +90,8 @@
|
|
|
86
90
|
"@git-stunts/plumbing": "^2.8.0",
|
|
87
91
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
88
92
|
"picomatch": "^4.0.4",
|
|
93
|
+
"tree-sitter-graphql-grammar-wasm": "1.0.1",
|
|
89
94
|
"tree-sitter-wasms": "0.1.13",
|
|
90
|
-
"tsx": "^4.21.0",
|
|
91
95
|
"web-tree-sitter": "^0.20.8",
|
|
92
96
|
"zod": "4.3.6"
|
|
93
97
|
},
|
|
@@ -97,6 +101,7 @@
|
|
|
97
101
|
"@types/picomatch": "^4.0.2",
|
|
98
102
|
"eslint": "^10.1.0",
|
|
99
103
|
"globals": "^17.4.0",
|
|
104
|
+
"tsx": "^4.21.0",
|
|
100
105
|
"typescript": "^6.0.2",
|
|
101
106
|
"typescript-eslint": "^8.58.0",
|
|
102
107
|
"vite": "^8.0.5",
|
|
@@ -106,7 +111,10 @@
|
|
|
106
111
|
"onlyBuiltDependencies": [],
|
|
107
112
|
"overrides": {
|
|
108
113
|
"vite": "^8.0.5",
|
|
109
|
-
"hono": "
|
|
114
|
+
"hono": "4.12.18",
|
|
115
|
+
"fast-uri": "3.1.2",
|
|
116
|
+
"ip-address": "10.2.0",
|
|
117
|
+
"postcss": "8.5.12"
|
|
110
118
|
}
|
|
111
119
|
}
|
|
112
120
|
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// CanonicalJsonCodec — deterministic JSON with sorted keys
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
//
|
|
5
|
-
// Subset of RFC 8785 (JSON Canonicalization Scheme):
|
|
6
|
-
// - Object keys sorted lexicographically at every nesting level
|
|
7
|
-
// - Compact output (no whitespace)
|
|
8
|
-
// - Deterministic: same data always produces the same string
|
|
9
|
-
//
|
|
10
|
-
// Enables stable hashes, diffable logs, reproducible receipts.
|
|
11
|
-
// ---------------------------------------------------------------------------
|
|
12
|
-
|
|
13
|
-
import type { JsonCodec } from "../ports/codec.js";
|
|
14
|
-
|
|
15
|
-
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
16
|
-
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
const proto = Object.getPrototypeOf(value) as unknown;
|
|
20
|
-
return proto === Object.prototype || proto === null;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function sortDeep(value: unknown, seen = new WeakSet()): unknown {
|
|
24
|
-
if (value === null || typeof value !== "object") {
|
|
25
|
-
return value;
|
|
26
|
-
}
|
|
27
|
-
if (!isPlainObject(value) && !Array.isArray(value)) {
|
|
28
|
-
return value;
|
|
29
|
-
}
|
|
30
|
-
if (seen.has(value)) {
|
|
31
|
-
throw new TypeError("Converting circular structure to JSON");
|
|
32
|
-
}
|
|
33
|
-
seen.add(value);
|
|
34
|
-
try {
|
|
35
|
-
if (Array.isArray(value)) {
|
|
36
|
-
return value.map((v) => sortDeep(v, seen));
|
|
37
|
-
}
|
|
38
|
-
const sorted: Record<string, unknown> = {};
|
|
39
|
-
for (const key of Object.keys(value).sort()) {
|
|
40
|
-
sorted[key] = sortDeep(value[key], seen);
|
|
41
|
-
}
|
|
42
|
-
return sorted;
|
|
43
|
-
} finally {
|
|
44
|
-
seen.delete(value);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export class CanonicalJsonCodec implements JsonCodec {
|
|
49
|
-
encode(value: unknown): string {
|
|
50
|
-
return JSON.stringify(sortDeep(value));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
decode(data: string): unknown {
|
|
54
|
-
return JSON.parse(data) as unknown;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { type JsonObject, parseJsonObject } from "../contracts/json-object.js";
|
|
2
|
-
|
|
3
|
-
export function parseJsonTextObject(text: string, label: string): JsonObject {
|
|
4
|
-
let parsed: unknown;
|
|
5
|
-
try {
|
|
6
|
-
parsed = JSON.parse(text) as unknown;
|
|
7
|
-
} catch {
|
|
8
|
-
throw new Error(`${label} was not valid JSON`);
|
|
9
|
-
}
|
|
10
|
-
return parseJsonObject(parsed, label);
|
|
11
|
-
}
|
package/src/adapters/node-fs.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// Node.js filesystem adapter — implements the FileSystem port
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
|
|
5
|
-
import * as fs from "node:fs";
|
|
6
|
-
import * as fsp from "node:fs/promises";
|
|
7
|
-
import type { FileSystem } from "../ports/filesystem.js";
|
|
8
|
-
|
|
9
|
-
class NodeFileSystem implements FileSystem {
|
|
10
|
-
readFile(path: string, encoding: "utf-8"): Promise<string>;
|
|
11
|
-
readFile(path: string): Promise<Buffer>;
|
|
12
|
-
readFile(path: string, encoding?: "utf-8"): Promise<string | Buffer> {
|
|
13
|
-
if (encoding !== undefined) return fsp.readFile(path, encoding);
|
|
14
|
-
return fsp.readFile(path);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
readdir(path: string): Promise<string[]> {
|
|
18
|
-
return fsp.readdir(path);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
writeFile(path: string, data: string, encoding: "utf-8"): Promise<void> {
|
|
22
|
-
return fsp.writeFile(path, data, encoding);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
appendFile(path: string, data: string, encoding: "utf-8"): Promise<void> {
|
|
26
|
-
return fsp.appendFile(path, data, encoding);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async mkdir(path: string, options: { recursive: true }): Promise<void> {
|
|
30
|
-
await fsp.mkdir(path, options);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async stat(path: string): Promise<{ size: number }> {
|
|
34
|
-
const s = await fsp.stat(path);
|
|
35
|
-
return { size: s.size };
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
readFileSync(path: string, encoding: "utf-8"): string {
|
|
39
|
-
return fs.readFileSync(path, encoding);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export const nodeFs: FileSystem = new NodeFileSystem();
|
package/src/adapters/node-git.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// NodeGitClient — implements the GitClient port via GitPlumbing
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
|
|
5
|
-
import GitPlumbing from "@git-stunts/plumbing";
|
|
6
|
-
import type { GitClient, GitRunRequest } from "../ports/git.js";
|
|
7
|
-
|
|
8
|
-
class NodeGitClient implements GitClient {
|
|
9
|
-
private readonly clients = new Map<string, GitPlumbing>();
|
|
10
|
-
|
|
11
|
-
private resolveClient(cwd: string): GitPlumbing {
|
|
12
|
-
const cached = this.clients.get(cwd);
|
|
13
|
-
if (cached !== undefined) return cached;
|
|
14
|
-
const created = GitPlumbing.createDefault({ cwd });
|
|
15
|
-
this.clients.set(cwd, created);
|
|
16
|
-
return created;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
async run(request: GitRunRequest) {
|
|
20
|
-
try {
|
|
21
|
-
const plumbing = this.resolveClient(request.cwd);
|
|
22
|
-
const stream = await plumbing.executeStream({ args: [...request.args] });
|
|
23
|
-
const stdout = await stream.collect({
|
|
24
|
-
asString: true,
|
|
25
|
-
...(request.maxBufferBytes !== undefined ? { maxBytes: request.maxBufferBytes } : {}),
|
|
26
|
-
});
|
|
27
|
-
const finished = await stream.finished;
|
|
28
|
-
const error = "error" in finished && finished.error instanceof Error ? finished.error : undefined;
|
|
29
|
-
return {
|
|
30
|
-
status: finished.code,
|
|
31
|
-
stdout: typeof stdout === "string" ? stdout : new TextDecoder().decode(stdout),
|
|
32
|
-
stderr: finished.stderr,
|
|
33
|
-
...(error !== undefined ? { error } : {}),
|
|
34
|
-
};
|
|
35
|
-
} catch (error: unknown) {
|
|
36
|
-
const normalized = error instanceof Error ? error : new Error(String(error));
|
|
37
|
-
return {
|
|
38
|
-
status: 1,
|
|
39
|
-
stdout: "",
|
|
40
|
-
stderr: normalized.message,
|
|
41
|
-
error: normalized,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export const nodeGit: GitClient = new NodeGitClient();
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// Node PathOps adapter — implements PathOps using node:path
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
|
|
5
|
-
import * as path from "node:path";
|
|
6
|
-
import type { PathOps } from "../ports/paths.js";
|
|
7
|
-
|
|
8
|
-
function toForwardSlash(p: string): string {
|
|
9
|
-
return p.replaceAll("\\", "/");
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function stripTrailingSlash(p: string): string {
|
|
13
|
-
if (p === "/") return p;
|
|
14
|
-
return p.endsWith("/") ? p.slice(0, -1) : p;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function normalizeImpl(p: string): string {
|
|
18
|
-
return stripTrailingSlash(toForwardSlash(path.normalize(p)));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const nodePathOps: PathOps = {
|
|
22
|
-
normalize(p: string): string {
|
|
23
|
-
return normalizeImpl(p);
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
isWithin(filePath: string, directory: string): boolean {
|
|
27
|
-
const normFile = normalizeImpl(filePath);
|
|
28
|
-
const normDir = normalizeImpl(directory);
|
|
29
|
-
return normFile === normDir || normFile.startsWith(`${normDir}/`);
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
join(...segments: string[]): string {
|
|
33
|
-
return normalizeImpl(path.join(...segments));
|
|
34
|
-
},
|
|
35
|
-
};
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// NodeProcessRunner — implements the ProcessRunner port
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
|
|
5
|
-
import { spawnSync } from "node:child_process";
|
|
6
|
-
import type { ProcessRunRequest, ProcessRunResult, ProcessRunner } from "../ports/process-runner.js";
|
|
7
|
-
|
|
8
|
-
class NodeProcessRunner implements ProcessRunner {
|
|
9
|
-
run(request: ProcessRunRequest): ProcessRunResult {
|
|
10
|
-
const result = spawnSync(request.command, [...request.args], {
|
|
11
|
-
cwd: request.cwd,
|
|
12
|
-
encoding: "utf-8",
|
|
13
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
14
|
-
...(request.timeoutMs !== undefined ? { timeout: request.timeoutMs } : {}),
|
|
15
|
-
...(request.maxBufferBytes !== undefined ? { maxBuffer: request.maxBufferBytes } : {}),
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
return {
|
|
19
|
-
status: result.status,
|
|
20
|
-
stdout: typeof result.stdout === "string" ? result.stdout : "",
|
|
21
|
-
stderr: typeof result.stderr === "string" ? result.stderr : "",
|
|
22
|
-
...(result.error !== undefined ? { error: result.error } : {}),
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export const nodeProcessRunner: ProcessRunner = new NodeProcessRunner();
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
|
|
4
|
-
function pathEscapesRoot(root: string, target: string): boolean {
|
|
5
|
-
const relative = path.relative(root, target);
|
|
6
|
-
return relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function realPathOrSelf(target: string): string {
|
|
10
|
-
try {
|
|
11
|
-
return fs.realpathSync.native(target);
|
|
12
|
-
} catch {
|
|
13
|
-
return target;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function nearestExistingAncestor(target: string): string {
|
|
18
|
-
let current = target;
|
|
19
|
-
while (current.length > 0) {
|
|
20
|
-
try {
|
|
21
|
-
fs.lstatSync(current);
|
|
22
|
-
return current;
|
|
23
|
-
} catch {
|
|
24
|
-
const parent = path.dirname(current);
|
|
25
|
-
if (parent === current) {
|
|
26
|
-
return current;
|
|
27
|
-
}
|
|
28
|
-
current = parent;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return target;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function createRepoPathResolver(projectRoot: string): (input: string) => string {
|
|
35
|
-
const normalizedRoot = path.resolve(projectRoot);
|
|
36
|
-
const realProjectRoot = realPathOrSelf(normalizedRoot);
|
|
37
|
-
|
|
38
|
-
return (input: string): string => {
|
|
39
|
-
const resolved = path.isAbsolute(input)
|
|
40
|
-
? path.resolve(input)
|
|
41
|
-
: path.resolve(normalizedRoot, input);
|
|
42
|
-
|
|
43
|
-
if (pathEscapesRoot(normalizedRoot, resolved)) {
|
|
44
|
-
throw new Error(`Path traversal blocked: ${input}`);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const realAncestor = realPathOrSelf(nearestExistingAncestor(resolved));
|
|
48
|
-
if (pathEscapesRoot(realProjectRoot, realAncestor)) {
|
|
49
|
-
throw new Error(`Path traversal blocked: ${input}`);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return resolved;
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function toRepoPolicyPath(projectRoot: string, filePath: string): string {
|
|
57
|
-
const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(projectRoot, filePath);
|
|
58
|
-
const relativePath = path.relative(projectRoot, absolutePath);
|
|
59
|
-
if (relativePath.length === 0 || relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
|
|
60
|
-
return absolutePath;
|
|
61
|
-
}
|
|
62
|
-
return relativePath.split(path.sep).join("/");
|
|
63
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import * as path from "node:path";
|
|
2
|
-
import type { JsonCodec } from "../ports/codec.js";
|
|
3
|
-
import type { FileSystem } from "../ports/filesystem.js";
|
|
4
|
-
|
|
5
|
-
export interface RotatingNdjsonLogOptions {
|
|
6
|
-
readonly fs: FileSystem;
|
|
7
|
-
readonly codec: JsonCodec;
|
|
8
|
-
readonly logPath: string;
|
|
9
|
-
readonly maxBytes?: number;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const DEFAULT_MAX_BYTES = 1_048_576;
|
|
13
|
-
|
|
14
|
-
export class RotatingNdjsonLog {
|
|
15
|
-
private readonly fs: FileSystem;
|
|
16
|
-
private readonly codec: JsonCodec;
|
|
17
|
-
private readonly logPath: string;
|
|
18
|
-
private readonly maxBytes: number;
|
|
19
|
-
|
|
20
|
-
constructor(options: RotatingNdjsonLogOptions) {
|
|
21
|
-
this.fs = options.fs;
|
|
22
|
-
this.codec = options.codec;
|
|
23
|
-
this.logPath = options.logPath;
|
|
24
|
-
this.maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
async append(entry: object): Promise<void> {
|
|
28
|
-
const line = this.codec.encode(entry) + "\n";
|
|
29
|
-
const dir = path.dirname(this.logPath);
|
|
30
|
-
await this.fs.mkdir(dir, { recursive: true });
|
|
31
|
-
await this.fs.appendFile(this.logPath, line, "utf-8");
|
|
32
|
-
await this.rotateIfNeeded();
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
private async rotateIfNeeded(): Promise<void> {
|
|
36
|
-
let stat: { size: number };
|
|
37
|
-
try {
|
|
38
|
-
stat = await this.fs.stat(this.logPath);
|
|
39
|
-
} catch {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (stat.size <= this.maxBytes) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const content = await this.fs.readFile(this.logPath, "utf-8");
|
|
48
|
-
const lines = content.trimEnd().split("\n");
|
|
49
|
-
let kept = lines.slice(Math.ceil(lines.length / 2));
|
|
50
|
-
|
|
51
|
-
// If slicing left nothing (e.g. a single oversized entry), skip rotation —
|
|
52
|
-
// the file is already at minimum size (one entry).
|
|
53
|
-
if (kept.length === 0) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
let result = kept.join("\n") + "\n";
|
|
58
|
-
|
|
59
|
-
while (Buffer.byteLength(result, "utf-8") > this.maxBytes && kept.length > 1) {
|
|
60
|
-
kept = kept.slice(Math.ceil(kept.length / 2));
|
|
61
|
-
result = kept.join("\n") + "\n";
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
await this.fs.writeFile(this.logPath, result, "utf-8");
|
|
65
|
-
}
|
|
66
|
-
}
|