ctxr-cli 0.33.0 → 0.35.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/README.md +40 -6
- package/dist/commands/archive.d.ts +5 -4
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +7 -7
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/catalog-show.d.ts +8 -0
- package/dist/commands/catalog-show.d.ts.map +1 -1
- package/dist/commands/catalog-show.js +29 -2
- package/dist/commands/catalog-show.js.map +1 -1
- package/dist/commands/context-gather.d.ts.map +1 -1
- package/dist/commands/context-gather.js +3 -2
- package/dist/commands/context-gather.js.map +1 -1
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +4 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/graph-build.d.ts +4 -1
- package/dist/commands/graph-build.d.ts.map +1 -1
- package/dist/commands/graph-build.js +14 -5
- package/dist/commands/graph-build.js.map +1 -1
- package/dist/commands/land.d.ts +27 -7
- package/dist/commands/land.d.ts.map +1 -1
- package/dist/commands/land.js +307 -32
- package/dist/commands/land.js.map +1 -1
- package/dist/commands/plugin-build.d.ts +33 -0
- package/dist/commands/plugin-build.d.ts.map +1 -0
- package/dist/commands/plugin-build.js +51 -0
- package/dist/commands/plugin-build.js.map +1 -0
- package/dist/commands/publish-check.d.ts.map +1 -1
- package/dist/commands/publish-check.js +35 -4
- package/dist/commands/publish-check.js.map +1 -1
- package/dist/commands/publish-gather.d.ts.map +1 -1
- package/dist/commands/publish-gather.js +2 -3
- package/dist/commands/publish-gather.js.map +1 -1
- package/dist/commands/review-list.d.ts +19 -5
- package/dist/commands/review-list.d.ts.map +1 -1
- package/dist/commands/review-list.js +55 -6
- package/dist/commands/review-list.js.map +1 -1
- package/dist/commands/rollup-gather.d.ts.map +1 -1
- package/dist/commands/rollup-gather.js +2 -3
- package/dist/commands/rollup-gather.js.map +1 -1
- package/dist/commands/second-opinion.d.ts +33 -0
- package/dist/commands/second-opinion.d.ts.map +1 -0
- package/dist/commands/second-opinion.js +56 -0
- package/dist/commands/second-opinion.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +14 -2
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session-discard.d.ts +18 -0
- package/dist/commands/session-discard.d.ts.map +1 -0
- package/dist/commands/session-discard.js +31 -0
- package/dist/commands/session-discard.js.map +1 -0
- package/dist/commands/session-list.d.ts +17 -6
- package/dist/commands/session-list.d.ts.map +1 -1
- package/dist/commands/session-list.js +31 -11
- package/dist/commands/session-list.js.map +1 -1
- package/dist/commands/session-rebase.d.ts +18 -0
- package/dist/commands/session-rebase.d.ts.map +1 -0
- package/dist/commands/session-rebase.js +43 -0
- package/dist/commands/session-rebase.js.map +1 -0
- package/dist/commands/session-start.d.ts +8 -0
- package/dist/commands/session-start.d.ts.map +1 -1
- package/dist/commands/session-start.js +52 -38
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/session-status.d.ts +17 -0
- package/dist/commands/session-status.d.ts.map +1 -0
- package/dist/commands/session-status.js +38 -0
- package/dist/commands/session-status.js.map +1 -0
- package/dist/commands/session-submit.d.ts +23 -0
- package/dist/commands/session-submit.d.ts.map +1 -0
- package/dist/commands/session-submit.js +42 -0
- package/dist/commands/session-submit.js.map +1 -0
- package/dist/commands/shared-stores-status.d.ts +24 -0
- package/dist/commands/shared-stores-status.d.ts.map +1 -0
- package/dist/commands/shared-stores-status.js +51 -0
- package/dist/commands/shared-stores-status.js.map +1 -0
- package/dist/commands/shared-stores-sync.d.ts +27 -0
- package/dist/commands/shared-stores-sync.d.ts.map +1 -0
- package/dist/commands/shared-stores-sync.js +115 -0
- package/dist/commands/shared-stores-sync.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +2 -4
- package/dist/commands/verify.js.map +1 -1
- package/dist/config/schema.d.ts +16 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +32 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/agents-doc.d.ts +10 -0
- package/dist/core/agents-doc.d.ts.map +1 -1
- package/dist/core/agents-doc.js +26 -1
- package/dist/core/agents-doc.js.map +1 -1
- package/dist/core/approval/decision.d.ts +39 -1
- package/dist/core/approval/decision.d.ts.map +1 -1
- package/dist/core/approval/decision.js +53 -6
- package/dist/core/approval/decision.js.map +1 -1
- package/dist/core/approval/session-group.d.ts +156 -0
- package/dist/core/approval/session-group.d.ts.map +1 -0
- package/dist/core/approval/session-group.js +359 -0
- package/dist/core/approval/session-group.js.map +1 -0
- package/dist/core/approval/session-marker.d.ts +79 -0
- package/dist/core/approval/session-marker.d.ts.map +1 -0
- package/dist/core/approval/session-marker.js +146 -0
- package/dist/core/approval/session-marker.js.map +1 -0
- package/dist/core/approval/store-forges.d.ts +15 -0
- package/dist/core/approval/store-forges.d.ts.map +1 -0
- package/dist/core/approval/store-forges.js +33 -0
- package/dist/core/approval/store-forges.js.map +1 -0
- package/dist/core/browse/approve.d.ts +8 -0
- package/dist/core/browse/approve.d.ts.map +1 -1
- package/dist/core/browse/approve.js +366 -48
- package/dist/core/browse/approve.js.map +1 -1
- package/dist/core/browse/link-resolver.d.ts +9 -4
- package/dist/core/browse/link-resolver.d.ts.map +1 -1
- package/dist/core/browse/link-resolver.js +12 -7
- package/dist/core/browse/link-resolver.js.map +1 -1
- package/dist/core/browse/review.d.ts +5 -0
- package/dist/core/browse/review.d.ts.map +1 -1
- package/dist/core/browse/review.js +8 -0
- package/dist/core/browse/review.js.map +1 -1
- package/dist/core/checks/integrity-checks.d.ts.map +1 -1
- package/dist/core/checks/integrity-checks.js +7 -1
- package/dist/core/checks/integrity-checks.js.map +1 -1
- package/dist/core/checks/manifest.d.ts.map +1 -1
- package/dist/core/checks/manifest.js +2 -0
- package/dist/core/checks/manifest.js.map +1 -1
- package/dist/core/checks/shared-stores-checks.d.ts +17 -0
- package/dist/core/checks/shared-stores-checks.d.ts.map +1 -0
- package/dist/core/checks/shared-stores-checks.js +84 -0
- package/dist/core/checks/shared-stores-checks.js.map +1 -0
- package/dist/core/errors.d.ts +17 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +21 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/forge/github.d.ts +14 -0
- package/dist/core/forge/github.d.ts.map +1 -1
- package/dist/core/forge/github.js +17 -0
- package/dist/core/forge/github.js.map +1 -1
- package/dist/core/fs/atomic.d.ts +3 -2
- package/dist/core/fs/atomic.d.ts.map +1 -1
- package/dist/core/fs/atomic.js +3 -2
- package/dist/core/fs/atomic.js.map +1 -1
- package/dist/core/git/fast-forward.d.ts +23 -0
- package/dist/core/git/fast-forward.d.ts.map +1 -0
- package/dist/core/git/fast-forward.js +38 -0
- package/dist/core/git/fast-forward.js.map +1 -0
- package/dist/core/git/repo.d.ts +11 -0
- package/dist/core/git/repo.d.ts.map +1 -1
- package/dist/core/git/repo.js +25 -0
- package/dist/core/git/repo.js.map +1 -1
- package/dist/core/graph/model.d.ts +27 -0
- package/dist/core/graph/model.d.ts.map +1 -1
- package/dist/core/graph/model.js +68 -2
- package/dist/core/graph/model.js.map +1 -1
- package/dist/core/graph/persist.d.ts.map +1 -1
- package/dist/core/graph/persist.js +3 -2
- package/dist/core/graph/persist.js.map +1 -1
- package/dist/core/mcp/cli-runner.d.ts +41 -0
- package/dist/core/mcp/cli-runner.d.ts.map +1 -0
- package/dist/core/mcp/cli-runner.js +81 -0
- package/dist/core/mcp/cli-runner.js.map +1 -0
- package/dist/core/mcp/jsonrpc.d.ts +13 -1
- package/dist/core/mcp/jsonrpc.d.ts.map +1 -1
- package/dist/core/mcp/jsonrpc.js +1 -1
- package/dist/core/mcp/jsonrpc.js.map +1 -1
- package/dist/core/mcp/member-sessions.d.ts +48 -0
- package/dist/core/mcp/member-sessions.d.ts.map +1 -0
- package/dist/core/mcp/member-sessions.js +85 -0
- package/dist/core/mcp/member-sessions.js.map +1 -0
- package/dist/core/mcp/ownership.d.ts +51 -0
- package/dist/core/mcp/ownership.d.ts.map +1 -0
- package/dist/core/mcp/ownership.js +101 -0
- package/dist/core/mcp/ownership.js.map +1 -0
- package/dist/core/mcp/paths.d.ts +48 -0
- package/dist/core/mcp/paths.d.ts.map +1 -0
- package/dist/core/mcp/paths.js +111 -0
- package/dist/core/mcp/paths.js.map +1 -0
- package/dist/core/mcp/sessions.d.ts +25 -50
- package/dist/core/mcp/sessions.d.ts.map +1 -1
- package/dist/core/mcp/sessions.js +31 -123
- package/dist/core/mcp/sessions.js.map +1 -1
- package/dist/core/mcp/tool-map.d.ts +94 -0
- package/dist/core/mcp/tool-map.d.ts.map +1 -0
- package/dist/core/mcp/tool-map.js +211 -0
- package/dist/core/mcp/tool-map.js.map +1 -0
- package/dist/core/mcp/tools/capture.d.ts +7 -2
- package/dist/core/mcp/tools/capture.d.ts.map +1 -1
- package/dist/core/mcp/tools/capture.js +69 -18
- package/dist/core/mcp/tools/capture.js.map +1 -1
- package/dist/core/mcp/tools/cli.d.ts +97 -0
- package/dist/core/mcp/tools/cli.d.ts.map +1 -0
- package/dist/core/mcp/tools/cli.js +271 -0
- package/dist/core/mcp/tools/cli.js.map +1 -0
- package/dist/core/mcp/tools/edit.d.ts +62 -28
- package/dist/core/mcp/tools/edit.d.ts.map +1 -1
- package/dist/core/mcp/tools/edit.js +182 -153
- package/dist/core/mcp/tools/edit.js.map +1 -1
- package/dist/core/mcp/tools/files.d.ts +37 -11
- package/dist/core/mcp/tools/files.d.ts.map +1 -1
- package/dist/core/mcp/tools/files.js +122 -100
- package/dist/core/mcp/tools/files.js.map +1 -1
- package/dist/core/mcp/tools/index.d.ts +12 -3
- package/dist/core/mcp/tools/index.d.ts.map +1 -1
- package/dist/core/mcp/tools/index.js +161 -58
- package/dist/core/mcp/tools/index.js.map +1 -1
- package/dist/core/mcp/tools/sessions.d.ts +145 -0
- package/dist/core/mcp/tools/sessions.d.ts.map +1 -0
- package/dist/core/mcp/tools/sessions.js +226 -0
- package/dist/core/mcp/tools/sessions.js.map +1 -0
- package/dist/core/notes/list.d.ts.map +1 -1
- package/dist/core/notes/list.js +5 -0
- package/dist/core/notes/list.js.map +1 -1
- package/dist/core/plugin/build.d.ts +70 -0
- package/dist/core/plugin/build.d.ts.map +1 -0
- package/dist/core/plugin/build.js +159 -0
- package/dist/core/plugin/build.js.map +1 -0
- package/dist/core/plugin/routes.d.ts +35 -0
- package/dist/core/plugin/routes.d.ts.map +1 -0
- package/dist/core/plugin/routes.js +77 -0
- package/dist/core/plugin/routes.js.map +1 -0
- package/dist/core/plugin/zip.d.ts +17 -0
- package/dist/core/plugin/zip.d.ts.map +1 -0
- package/dist/core/plugin/zip.js +75 -0
- package/dist/core/plugin/zip.js.map +1 -0
- package/dist/core/reconcile.d.ts.map +1 -1
- package/dist/core/reconcile.js +2 -1
- package/dist/core/reconcile.js.map +1 -1
- package/dist/core/retrieval/pass.d.ts.map +1 -1
- package/dist/core/retrieval/pass.js +5 -4
- package/dist/core/retrieval/pass.js.map +1 -1
- package/dist/core/rollup.d.ts.map +1 -1
- package/dist/core/rollup.js +2 -3
- package/dist/core/rollup.js.map +1 -1
- package/dist/core/root.d.ts.map +1 -1
- package/dist/core/root.js +33 -2
- package/dist/core/root.js.map +1 -1
- package/dist/core/second-opinion/environment.d.ts +21 -0
- package/dist/core/second-opinion/environment.d.ts.map +1 -0
- package/dist/core/second-opinion/environment.js +70 -0
- package/dist/core/second-opinion/environment.js.map +1 -0
- package/dist/core/second-opinion/judge.d.ts +29 -0
- package/dist/core/second-opinion/judge.d.ts.map +1 -0
- package/dist/core/second-opinion/judge.js +55 -0
- package/dist/core/second-opinion/judge.js.map +1 -0
- package/dist/core/second-opinion/launch.d.ts +16 -0
- package/dist/core/second-opinion/launch.d.ts.map +1 -0
- package/dist/core/second-opinion/launch.js +75 -0
- package/dist/core/second-opinion/launch.js.map +1 -0
- package/dist/core/second-opinion/lineup.d.ts +82 -0
- package/dist/core/second-opinion/lineup.d.ts.map +1 -0
- package/dist/core/second-opinion/lineup.js +113 -0
- package/dist/core/second-opinion/lineup.js.map +1 -0
- package/dist/core/second-opinion/modes.d.ts +98 -0
- package/dist/core/second-opinion/modes.d.ts.map +1 -0
- package/dist/core/second-opinion/modes.js +224 -0
- package/dist/core/second-opinion/modes.js.map +1 -0
- package/dist/core/second-opinion/prompts.d.ts +18 -0
- package/dist/core/second-opinion/prompts.d.ts.map +1 -0
- package/dist/core/second-opinion/prompts.js +65 -0
- package/dist/core/second-opinion/prompts.js.map +1 -0
- package/dist/core/session/commit.d.ts +29 -0
- package/dist/core/session/commit.d.ts.map +1 -0
- package/dist/core/session/commit.js +22 -0
- package/dist/core/session/commit.js.map +1 -0
- package/dist/core/session/discard.d.ts +24 -0
- package/dist/core/session/discard.d.ts.map +1 -0
- package/dist/core/session/discard.js +68 -0
- package/dist/core/session/discard.js.map +1 -0
- package/dist/core/session/list.d.ts +48 -0
- package/dist/core/session/list.d.ts.map +1 -0
- package/dist/core/session/list.js +55 -0
- package/dist/core/session/list.js.map +1 -0
- package/dist/core/session/rebase.d.ts +34 -0
- package/dist/core/session/rebase.d.ts.map +1 -0
- package/dist/core/session/rebase.js +87 -0
- package/dist/core/session/rebase.js.map +1 -0
- package/dist/core/session/remote.d.ts +80 -0
- package/dist/core/session/remote.d.ts.map +1 -0
- package/dist/core/session/remote.js +102 -0
- package/dist/core/session/remote.js.map +1 -0
- package/dist/core/session/resolve.d.ts +41 -0
- package/dist/core/session/resolve.d.ts.map +1 -0
- package/dist/core/session/resolve.js +109 -0
- package/dist/core/session/resolve.js.map +1 -0
- package/dist/core/session/start.d.ts +46 -0
- package/dist/core/session/start.d.ts.map +1 -0
- package/dist/core/session/start.js +33 -0
- package/dist/core/session/start.js.map +1 -0
- package/dist/core/session/status.d.ts +47 -0
- package/dist/core/session/status.d.ts.map +1 -0
- package/dist/core/session/status.js +55 -0
- package/dist/core/session/status.js.map +1 -0
- package/dist/core/session/submit.d.ts +67 -0
- package/dist/core/session/submit.d.ts.map +1 -0
- package/dist/core/session/submit.js +254 -0
- package/dist/core/session/submit.js.map +1 -0
- package/dist/core/shared-stores-location.d.ts +17 -0
- package/dist/core/shared-stores-location.d.ts.map +1 -0
- package/dist/core/shared-stores-location.js +22 -0
- package/dist/core/shared-stores-location.js.map +1 -0
- package/dist/core/shared-stores.d.ts +69 -0
- package/dist/core/shared-stores.d.ts.map +1 -0
- package/dist/core/shared-stores.js +100 -0
- package/dist/core/shared-stores.js.map +1 -0
- package/dist/core/skills.d.ts +20 -2
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +70 -13
- package/dist/core/skills.js.map +1 -1
- package/dist/run.d.ts +12 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +194 -55
- package/dist/run.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/templates/agents/shared-stores.md +11 -0
- package/templates/approve/copies-missing.md +1 -0
- package/templates/approve/elsewhere-heading.md +1 -0
- package/templates/approve/elsewhere-intro.md +1 -0
- package/templates/approve/homed-elsewhere.md +1 -0
- package/templates/approve/not-decider.md +1 -0
- package/templates/approve/part-heading.md +1 -0
- package/templates/approve/parts-changed.md +1 -0
- package/templates/approve/session-decision-note.md +1 -0
- package/templates/approve/session-intro.md +1 -0
- package/templates/approve/session-no-decision.md +1 -0
- package/templates/approve/store-unreachable.md +1 -0
- package/templates/land/resolver.md +2 -0
- package/templates/mcp/Delete.md +6 -0
- package/templates/mcp/Edit.md +6 -5
- package/templates/mcp/Glob.md +2 -2
- package/templates/mcp/Grep.md +2 -1
- package/templates/mcp/Move.md +7 -0
- package/templates/mcp/Read.md +4 -4
- package/templates/mcp/Write.md +4 -4
- package/templates/mcp/ctxr.md +7 -0
- package/templates/mcp/ctxr_write.md +8 -0
- package/templates/mcp/server-instructions.md +11 -3
- package/templates/mcp/session_discard.md +4 -0
- package/templates/mcp/session_list.md +7 -0
- package/templates/mcp/session_rebase.md +5 -0
- package/templates/mcp/session_start.md +7 -0
- package/templates/mcp/session_status.md +3 -0
- package/templates/mcp/session_submit.md +8 -0
- package/templates/plugin/README.md +13 -0
- package/templates/plugin/chatgpt-mcp.json +19 -0
- package/templates/plugin/chatgpt-plugin.json +13 -0
- package/templates/plugin/claude-mcp.json +8 -0
- package/templates/plugin/claude-plugin.json +6 -0
- package/templates/plugin/page.html +47 -0
- package/templates/second-opinion/poll-answer.md +7 -0
- package/templates/second-opinion/taste-panel.md +14 -0
- package/templates/session/pages/bare-route.md +2 -0
- package/templates/session/pages/block.md +8 -0
- package/templates/session/pages/condition-preview.md +1 -0
- package/templates/session/pages/condition.md +1 -0
- package/templates/session/pages/moved.md +1 -0
- package/templates/session/pages/stops-working.md +1 -0
- package/templates/session/pages/table-head-preview.md +2 -0
- package/templates/session/pages/table-head.md +2 -0
- package/templates/skills/ctxr-connection-finding.md +4 -1
- package/templates/skills/ctxr-land.md +26 -7
- package/templates/skills/ctxr-placement.md +10 -0
- package/templates/skills/ctxr-publish.md +2 -1
- package/templates/skills/ctxr-rollup.md +3 -0
- package/templates/skills/ctxr-second-opinion.md +52 -36
- package/templates/skills/ctxr-session-lifecycle.md +60 -33
- package/templates/skills/ctxr-submit.md +65 -56
- package/templates/skills/mcp/_preamble.md +44 -0
- package/dist/core/mcp/drafts.d.ts +0 -30
- package/dist/core/mcp/drafts.d.ts.map +0 -1
- package/dist/core/mcp/drafts.js +0 -52
- package/dist/core/mcp/drafts.js.map +0 -1
- package/templates/skills/ctxr-second-opinion/run.mjs +0 -542
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/critic-contract.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/lenses.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/architect.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/pragmatist.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/skeptic.md +0 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
import { lstat, mkdir, readFile, rm, unlink, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { rebaseInProgress } from '../../session/resolve.js';
|
|
5
|
+
import { runServerCli } from '../cli-runner.js';
|
|
6
|
+
import { ToolRefusal } from '../jsonrpc.js';
|
|
7
|
+
import { ownedSession, repoPrefixOf } from '../member-sessions.js';
|
|
8
|
+
import { protectedReason, protectedRefusal } from '../paths.js';
|
|
9
|
+
import { CTXR_READ_COMMANDS, CTXR_WRITE_COMMANDS, INPUT_ARGUMENT, matchCommand } from '../tool-map.js';
|
|
10
|
+
/**
|
|
11
|
+
* serve-the-session-lifecycle-to-chat-apps D4, D5 (remote-access spec,
|
|
12
|
+
* *`ctxr` and `ctxr_write` run allowlisted CLI commands confined to one
|
|
13
|
+
* checkout*): a skill's "run `ctxr lint`" works unchanged. `ctxr` runs a
|
|
14
|
+
* read-only command against the served commit or one of the caller's
|
|
15
|
+
* sessions; `ctxr_write` runs a writing one inside a session the caller owns.
|
|
16
|
+
* Each runs the server's own CLI with the checkout as its working directory
|
|
17
|
+
* and store root, without the server's forge credentials. Before anything
|
|
18
|
+
* runs, the subcommand must be on the tool's allowlist, the root option is
|
|
19
|
+
* refused, and every path-like argument must stay inside the checkout and off
|
|
20
|
+
* the protected paths. After a `ctxr_write` run, every protected path git
|
|
21
|
+
* shows it changed is restored and the call refused, whatever destination the
|
|
22
|
+
* command derived — the boundary does not rest on each command's own checks.
|
|
23
|
+
*/
|
|
24
|
+
export const CTXR_INPUT_SCHEMA = {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
args: { type: 'array', items: { type: 'string' }, description: `The command and its arguments, as you would type them after "ctxr", one item per argument, e.g. ["lint"] or ["catalog", "show", "--section", "projects"]. Read-only commands only: ${CTXR_READ_COMMANDS.join(', ')}.` },
|
|
28
|
+
session: { type: 'string', description: "Run in this session of yours (its directory name) instead of against the store's current commit." },
|
|
29
|
+
},
|
|
30
|
+
required: ['args'],
|
|
31
|
+
};
|
|
32
|
+
export const CTXR_WRITE_INPUT_SCHEMA = {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {
|
|
35
|
+
args: { type: 'array', items: { type: 'string' }, description: `The command and its arguments, one item per argument, e.g. ["ingest", "<root>raw/inbox/x.md", "--into", "<root>projects/kestrel.md", ...]. Writing commands only: ${CTXR_WRITE_COMMANDS.join(', ')}.` },
|
|
36
|
+
session: { type: 'string', description: 'The session of yours to run in (its directory name). Required.' },
|
|
37
|
+
input: { type: 'string', description: `Text for a command that reads a file (rollup write --content-file, session capture --proposal): pass "${INPUT_ARGUMENT}" as that argument and it is replaced with a file holding this text.` },
|
|
38
|
+
},
|
|
39
|
+
required: ['args', 'session'],
|
|
40
|
+
};
|
|
41
|
+
const MAX_ARGS = 64;
|
|
42
|
+
const MAX_ARG_CHARS = 8192;
|
|
43
|
+
/** D4: the `input` text is capped like `Write`'s content. */
|
|
44
|
+
const MAX_INPUT_BYTES = 256 * 1024;
|
|
45
|
+
const invalid = (message) => new ToolRefusal('mcp.invalid_arguments', message);
|
|
46
|
+
export function parseCliArgs(args, write) {
|
|
47
|
+
const argv = args.args;
|
|
48
|
+
if (!Array.isArray(argv) || argv.length === 0 || argv.some((a) => typeof a !== 'string'))
|
|
49
|
+
throw invalid('"args" is a non-empty list of strings: the command, then its arguments.');
|
|
50
|
+
if (argv.length > MAX_ARGS || argv.some((a) => a.length > MAX_ARG_CHARS || a.includes('\0')))
|
|
51
|
+
throw invalid(`"args" holds at most ${MAX_ARGS} arguments of at most ${MAX_ARG_CHARS} characters each.`);
|
|
52
|
+
const out = { args: [...argv] };
|
|
53
|
+
if (args.session !== undefined && args.session !== null) {
|
|
54
|
+
if (typeof args.session !== 'string' || args.session.trim() === '')
|
|
55
|
+
throw invalid('"session", when given, is the directory name of one of your sessions.');
|
|
56
|
+
out.session = args.session.trim();
|
|
57
|
+
}
|
|
58
|
+
else if (write) {
|
|
59
|
+
throw new ToolRefusal('mcp.no_session', '"session" is required: ctxr_write runs only inside one of your sessions. Call session_start first.');
|
|
60
|
+
}
|
|
61
|
+
if (args.input !== undefined && args.input !== null) {
|
|
62
|
+
if (!write)
|
|
63
|
+
throw invalid('"input" is for ctxr_write only.');
|
|
64
|
+
if (typeof args.input !== 'string')
|
|
65
|
+
throw invalid('"input" must be a string.');
|
|
66
|
+
if (Buffer.byteLength(args.input, 'utf8') > MAX_INPUT_BYTES)
|
|
67
|
+
throw invalid(`"input" is at most ${MAX_INPUT_BYTES} bytes.`);
|
|
68
|
+
out.input = args.input;
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
/** The root option, in either spelling, wherever it appears. */
|
|
73
|
+
function isRootOption(token) {
|
|
74
|
+
return token === '--root' || token.startsWith('--root=');
|
|
75
|
+
}
|
|
76
|
+
/** What a token says, if it could be a path: an option's `=` value, a bare argument; never an option name or prose. */
|
|
77
|
+
function pathCandidate(token) {
|
|
78
|
+
if (token.startsWith('-')) {
|
|
79
|
+
const eq = token.indexOf('=');
|
|
80
|
+
if (!token.startsWith('--') || eq === -1)
|
|
81
|
+
return null;
|
|
82
|
+
return { value: token.slice(eq + 1), prefix: token.slice(0, eq + 1) };
|
|
83
|
+
}
|
|
84
|
+
return { value: token, prefix: '' };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* D4: every argument after the command path, checked before anything runs.
|
|
88
|
+
* A path under the caller's session root is rewritten to the path inside the
|
|
89
|
+
* session, which is what the command sees as its store root; any other
|
|
90
|
+
* path-like argument must stay inside the checkout and off the protected paths.
|
|
91
|
+
*/
|
|
92
|
+
export function checkArguments(argv, allowlist, tool, config, sessionRoot) {
|
|
93
|
+
if (argv.some(isRootOption))
|
|
94
|
+
throw new ToolRefusal('mcp.root_option', 'The root option is not accepted: the command always runs against the checkout this tool chose.');
|
|
95
|
+
const command = matchCommand(argv, allowlist);
|
|
96
|
+
if (command === null) {
|
|
97
|
+
throw new ToolRefusal('mcp.command_not_allowed', `"${argv.join(' ')}" is not a command ${tool} runs. Put the command first; ${tool} runs: ${allowlist.join(', ')}.`, { allowed: [...allowlist] });
|
|
98
|
+
}
|
|
99
|
+
const words = command.split(' ').length;
|
|
100
|
+
const rewritten = argv.slice(0, words);
|
|
101
|
+
for (const token of argv.slice(words)) {
|
|
102
|
+
const candidate = pathCandidate(token);
|
|
103
|
+
if (candidate === null || candidate.value === INPUT_ARGUMENT || /\s/.test(candidate.value) || candidate.value === '') {
|
|
104
|
+
rewritten.push(token);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
let value = candidate.value.replace(/\\/g, '/');
|
|
108
|
+
if (sessionRoot !== null) {
|
|
109
|
+
const root = sessionRoot.replace(/\/+$/, '');
|
|
110
|
+
const bare = value.replace(/^\/+/, '');
|
|
111
|
+
if (bare === root)
|
|
112
|
+
value = '.';
|
|
113
|
+
else if (bare.startsWith(`${root}/`))
|
|
114
|
+
value = bare.slice(root.length + 1);
|
|
115
|
+
}
|
|
116
|
+
if (path.posix.isAbsolute(value) || /^[A-Za-z]:\//.test(value)) {
|
|
117
|
+
throw new ToolRefusal('mcp.path_outside_store', `"${candidate.value}" is an absolute path; name files relative to the store${sessionRoot === null ? '' : ` or under your session root ${sessionRoot}`}.`);
|
|
118
|
+
}
|
|
119
|
+
const normalized = path.posix.normalize(value);
|
|
120
|
+
if (normalized === '..' || normalized.startsWith('../'))
|
|
121
|
+
throw new ToolRefusal('mcp.path_outside_store', `"${candidate.value}" is outside the checkout this command runs in.`);
|
|
122
|
+
const reason = protectedReason(normalized.replace(/\/+$/, ''), config);
|
|
123
|
+
if (reason !== null && normalized !== '.')
|
|
124
|
+
throw protectedRefusal(candidate.value, reason);
|
|
125
|
+
rewritten.push(`${candidate.prefix}${value}`);
|
|
126
|
+
}
|
|
127
|
+
return { command, argv: rewritten };
|
|
128
|
+
}
|
|
129
|
+
/** D4: the server's environment without its forge credentials, with the checkout as the store root. */
|
|
130
|
+
export function childEnv(env, cwd, cacheDir) {
|
|
131
|
+
const child = {};
|
|
132
|
+
for (const [key, value] of Object.entries(env)) {
|
|
133
|
+
if (value === undefined)
|
|
134
|
+
continue;
|
|
135
|
+
if (/TOKEN/i.test(key) || key.startsWith('GH_') || key.startsWith('GITHUB_') || key.startsWith('CONTEXTURE_GITHUB_'))
|
|
136
|
+
continue;
|
|
137
|
+
if (key === 'CONTEXTURE_ROOT' || key === 'CONTEXTURE_STORE_ROOT' || key === 'GIT_ASKPASS' || key === 'SSH_ASKPASS' || key === 'SSH_AUTH_SOCK')
|
|
138
|
+
continue;
|
|
139
|
+
child[key] = value;
|
|
140
|
+
}
|
|
141
|
+
child.CONTEXTURE_STORE_ROOT = cwd;
|
|
142
|
+
// gh's own credential file is out of reach too: its configuration directory is one that does not exist.
|
|
143
|
+
child.GH_CONFIG_DIR = path.join(cacheDir, 'no-gh-config');
|
|
144
|
+
child.GIT_TERMINAL_PROMPT = '0';
|
|
145
|
+
return child;
|
|
146
|
+
}
|
|
147
|
+
/** `--no-input` always: nothing a tool runs may wait on a person. */
|
|
148
|
+
function finalArgv(argv) {
|
|
149
|
+
return argv.includes('--no-input') ? [...argv] : [...argv, '--no-input'];
|
|
150
|
+
}
|
|
151
|
+
export async function ctxrTool(ctx, email, args) {
|
|
152
|
+
if (args.session !== undefined) {
|
|
153
|
+
const session = await ownedSession(ctx.write, email, args.session);
|
|
154
|
+
const checked = checkArguments(args.args, CTXR_READ_COMMANDS, 'ctxr', ctx.write.config, session.root);
|
|
155
|
+
const cwd = session.ref.storeRoot;
|
|
156
|
+
const run = await runServerCli({ entry: ctx.entry, argv: finalArgv(checked.argv), cwd, env: childEnv(ctx.write.env, cwd, cacheDirOf(ctx.write, cwd)), timeoutMs: ctx.timeoutMs });
|
|
157
|
+
return { command: checked.command, args: checked.argv, ...run, ran_against: { session: session.name, root: session.root } };
|
|
158
|
+
}
|
|
159
|
+
return ctx.view.read(ctx.syncDeps, async (snapshot) => {
|
|
160
|
+
const checked = checkArguments(args.args, CTXR_READ_COMMANDS, 'ctxr', snapshot.store.config, null);
|
|
161
|
+
const cwd = snapshot.store.root;
|
|
162
|
+
const run = await runServerCli({ entry: ctx.entry, argv: finalArgv(checked.argv), cwd, env: childEnv(ctx.write.env, cwd, cacheDirOf(ctx.write, cwd)), timeoutMs: ctx.timeoutMs });
|
|
163
|
+
return { command: checked.command, args: checked.argv, ...run, ran_against: { commit: snapshot.head } };
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
function cacheDirOf(write, storeRoot) {
|
|
167
|
+
return path.join(storeRoot, write.config.derived.paths[0] ?? '.contexture/cache/', 'mcp');
|
|
168
|
+
}
|
|
169
|
+
/** A path's state for the after-run check: its content's hash, or absent. */
|
|
170
|
+
async function stateOf(file) {
|
|
171
|
+
const info = await lstat(file).catch(() => null);
|
|
172
|
+
if (info === null)
|
|
173
|
+
return 'absent';
|
|
174
|
+
if (info.isSymbolicLink())
|
|
175
|
+
return 'link';
|
|
176
|
+
if (!info.isFile())
|
|
177
|
+
return 'other';
|
|
178
|
+
return createHash('sha256').update(await readFile(file)).digest('hex');
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* The protected paths git shows changed in the session, other than derived
|
|
182
|
+
* ones, with each one's state. Rename sources count: moving a hook away
|
|
183
|
+
* changes the hooks directory as surely as writing one.
|
|
184
|
+
*/
|
|
185
|
+
async function protectedChanges(write, session) {
|
|
186
|
+
const prefix = await repoPrefixOf(write);
|
|
187
|
+
const { stdout } = await write.git.run(['status', '--porcelain=v1', '-z', '--untracked-files=all', '--no-renames'], { cwd: session.ref.path, allowFailure: true });
|
|
188
|
+
const found = new Map();
|
|
189
|
+
for (const field of stdout.split('\0')) {
|
|
190
|
+
if (field.length < 4)
|
|
191
|
+
continue;
|
|
192
|
+
const top = field.slice(3);
|
|
193
|
+
let reason;
|
|
194
|
+
if (!top.startsWith(prefix))
|
|
195
|
+
reason = 'outside';
|
|
196
|
+
else
|
|
197
|
+
reason = protectedReason(top.slice(prefix.length).replace(/\/+$/, ''), write.config);
|
|
198
|
+
if (reason === null || reason === 'derived')
|
|
199
|
+
continue;
|
|
200
|
+
found.set(top, { top, reason, state: await stateOf(path.join(session.ref.path, top)) });
|
|
201
|
+
}
|
|
202
|
+
return found;
|
|
203
|
+
}
|
|
204
|
+
/** Back to the session's own tip: from HEAD when HEAD has it, else removed. */
|
|
205
|
+
async function restorePath(write, session, top) {
|
|
206
|
+
const cwd = session.ref.path;
|
|
207
|
+
const inHead = (await write.git.run(['cat-file', '-e', `HEAD:${top}`], { cwd, allowFailure: true })).exitCode === 0;
|
|
208
|
+
if (inHead) {
|
|
209
|
+
await write.git.run(['restore', '--source=HEAD', '--staged', '--worktree', '--', top], { cwd, allowFailure: true });
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
await write.git.run(['rm', '-q', '--cached', '--ignore-unmatch', '--', top], { cwd, allowFailure: true });
|
|
213
|
+
await rm(path.join(cwd, top), { recursive: true, force: true });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/** Under the write mutex. */
|
|
217
|
+
export async function ctxrWriteTool(ctx, email, args) {
|
|
218
|
+
const session = await ownedSession(ctx.write, email, args.session);
|
|
219
|
+
if (await rebaseInProgress(ctx.write.git, session.ref.path)) {
|
|
220
|
+
throw new ToolRefusal('mcp.rebase_in_progress', `A rebase is in progress in ${session.name}; finish it with session_rebase (continue: true or abort: true) before running commands in it.`, { session: session.name });
|
|
221
|
+
}
|
|
222
|
+
const checked = checkArguments(args.args, CTXR_WRITE_COMMANDS, 'ctxr_write', ctx.write.config, session.root);
|
|
223
|
+
const usesInput = checked.argv.some((a) => a === INPUT_ARGUMENT || a.endsWith(`=${INPUT_ARGUMENT}`));
|
|
224
|
+
if (usesInput && args.input === undefined)
|
|
225
|
+
throw invalid(`An argument is "${INPUT_ARGUMENT}" but no "input" text was given.`);
|
|
226
|
+
const cwd = session.ref.storeRoot;
|
|
227
|
+
const cacheDir = cacheDirOf(ctx.write, cwd);
|
|
228
|
+
let inputFile = null;
|
|
229
|
+
let argv = checked.argv;
|
|
230
|
+
if (usesInput) {
|
|
231
|
+
await mkdir(cacheDir, { recursive: true });
|
|
232
|
+
inputFile = path.join(cacheDir, `input-${randomBytes(6).toString('hex')}.txt`);
|
|
233
|
+
await writeFile(inputFile, args.input, { flag: 'wx' });
|
|
234
|
+
argv = argv.map((a) => (a === INPUT_ARGUMENT ? inputFile : a.endsWith(`=${INPUT_ARGUMENT}`) ? `${a.slice(0, -INPUT_ARGUMENT.length)}${inputFile}` : a));
|
|
235
|
+
}
|
|
236
|
+
const before = await protectedChanges(ctx.write, session);
|
|
237
|
+
let run;
|
|
238
|
+
try {
|
|
239
|
+
run = await runServerCli({ entry: ctx.entry, argv: finalArgv(argv), cwd, env: childEnv(ctx.write.env, cwd, cacheDir), timeoutMs: ctx.timeoutMs });
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
if (inputFile !== null)
|
|
243
|
+
await unlink(inputFile).catch(() => undefined);
|
|
244
|
+
}
|
|
245
|
+
// D5, revision 7: whatever the command derived, a protected change it made does not stay.
|
|
246
|
+
const restored = [];
|
|
247
|
+
for (const [top, after] of await protectedChanges(ctx.write, session)) {
|
|
248
|
+
if (before.get(top)?.state === after.state)
|
|
249
|
+
continue;
|
|
250
|
+
await restorePath(ctx.write, session, top);
|
|
251
|
+
restored.push(top);
|
|
252
|
+
}
|
|
253
|
+
if (restored.length > 0) {
|
|
254
|
+
const prefix = await repoPrefixOf(ctx.write);
|
|
255
|
+
const shown = restored.map((top) => (top.startsWith(prefix) ? `${session.root}${top.slice(prefix.length)}` : top));
|
|
256
|
+
throw new ToolRefusal('mcp.path_protected', `The command changed ${shown.map((p) => `"${p}"`).join(', ')}, which cannot be changed from here, so ${restored.length === 1 ? 'that change was' : 'those changes were'} undone and the call refused. Other changes it made stay in the session.`, { paths: shown, exit_code: run.exit_code, stdout: run.stdout, stderr: run.stderr });
|
|
257
|
+
}
|
|
258
|
+
return { command: checked.command, args: checked.argv, ...run, ran_against: { session: session.name, root: session.root } };
|
|
259
|
+
}
|
|
260
|
+
export function renderCli(data) {
|
|
261
|
+
const r = data;
|
|
262
|
+
const against = 'session' in r.ran_against ? `session ${r.ran_against.session}` : `commit ${r.ran_against.commit.slice(0, 12)}`;
|
|
263
|
+
const head = r.timed_out ? `ctxr ${r.args.join(' ')} was stopped after the time limit (against ${against}).` : `ctxr ${r.args.join(' ')} exited ${r.exit_code} (against ${against}).`;
|
|
264
|
+
const parts = [head];
|
|
265
|
+
if (r.stdout !== '')
|
|
266
|
+
parts.push(r.stdout.replace(/\n$/, '') + (r.stdout_truncated ? '\n[output cut at the size limit]' : ''));
|
|
267
|
+
if (r.stderr !== '')
|
|
268
|
+
parts.push(`[stderr]\n${r.stderr.replace(/\n$/, '')}${r.stderr_truncated ? '\n[cut at the size limit]' : ''}`);
|
|
269
|
+
return parts.join('\n\n');
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../src/core/mcp/tools/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { McpView, SyncDeps } from '../sync.js';
|
|
1
|
+
import type { WriteDeps } from '../sessions.js';
|
|
3
2
|
/**
|
|
4
|
-
* serve-the-
|
|
5
|
-
* `Write`
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
3
|
+
* serve-the-session-lifecycle-to-chat-apps D1, D2, D5 (remote-access spec,
|
|
4
|
+
* *`Edit`, `Write`, `Move` and `Delete` change a member's own session and
|
|
5
|
+
* commit nothing*): Claude Code's Edit and Write, with their parameters
|
|
6
|
+
* unchanged, plus `Move` and `Delete` for the `git mv` and `git rm` a local
|
|
7
|
+
* agent runs. Each addresses a file under the root of a session the caller
|
|
8
|
+
* owns and changes that session's working tree only; nothing commits,
|
|
9
|
+
* pushes or opens a pull request until `session_submit`. Uncommitted rest
|
|
10
|
+
* between calls is the session's normal state, as the lifecycle skill says.
|
|
11
|
+
* The per-member draft these replaced is gone.
|
|
10
12
|
*/
|
|
11
13
|
export interface EditArgs {
|
|
12
14
|
file_path: string;
|
|
@@ -18,12 +20,19 @@ export interface WriteArgs {
|
|
|
18
20
|
file_path: string;
|
|
19
21
|
content: string;
|
|
20
22
|
}
|
|
23
|
+
export interface MoveArgs {
|
|
24
|
+
source_path: string;
|
|
25
|
+
destination_path: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DeleteArgs {
|
|
28
|
+
file_path: string;
|
|
29
|
+
}
|
|
21
30
|
export declare const EDIT_INPUT_SCHEMA: {
|
|
22
31
|
readonly type: 'object';
|
|
23
32
|
readonly properties: {
|
|
24
33
|
readonly file_path: {
|
|
25
34
|
readonly type: 'string';
|
|
26
|
-
readonly description:
|
|
35
|
+
readonly description: "The file to modify, under the session root session_start returned, e.g. \"<root>projects/kestrel.md\".";
|
|
27
36
|
};
|
|
28
37
|
readonly old_string: {
|
|
29
38
|
readonly type: 'string';
|
|
@@ -45,35 +54,60 @@ export declare const WRITE_INPUT_SCHEMA: {
|
|
|
45
54
|
readonly properties: {
|
|
46
55
|
readonly file_path: {
|
|
47
56
|
readonly type: 'string';
|
|
48
|
-
readonly description:
|
|
57
|
+
readonly description: "The new file to create, under the session root session_start returned, e.g. \"<root>projects/kestrel.md\".";
|
|
49
58
|
};
|
|
50
59
|
readonly content: {
|
|
51
60
|
readonly type: 'string';
|
|
52
|
-
readonly description: 'The content to write to the
|
|
61
|
+
readonly description: 'The content to write to the file';
|
|
53
62
|
};
|
|
54
63
|
};
|
|
55
64
|
readonly required: readonly ['file_path', 'content'];
|
|
56
65
|
};
|
|
66
|
+
export declare const MOVE_INPUT_SCHEMA: {
|
|
67
|
+
readonly type: 'object';
|
|
68
|
+
readonly properties: {
|
|
69
|
+
readonly source_path: {
|
|
70
|
+
readonly type: 'string';
|
|
71
|
+
readonly description: "The file to move, under the session root session_start returned, e.g. \"<root>projects/kestrel.md\".";
|
|
72
|
+
};
|
|
73
|
+
readonly destination_path: {
|
|
74
|
+
readonly type: 'string';
|
|
75
|
+
readonly description: 'Where it goes, under the same session root. Must not exist yet.';
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
readonly required: readonly ['source_path', 'destination_path'];
|
|
79
|
+
};
|
|
80
|
+
export declare const DELETE_INPUT_SCHEMA: {
|
|
81
|
+
readonly type: 'object';
|
|
82
|
+
readonly properties: {
|
|
83
|
+
readonly file_path: {
|
|
84
|
+
readonly type: 'string';
|
|
85
|
+
readonly description: "The file to delete, under the session root session_start returned, e.g. \"<root>projects/kestrel.md\".";
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
readonly required: readonly ['file_path'];
|
|
89
|
+
};
|
|
90
|
+
/** D5: `Edit` and `Write` stay text only, with this cap. */
|
|
91
|
+
export declare const MAX_CONTENT_BYTES: number;
|
|
57
92
|
export declare function parseEditArgs(args: Record<string, unknown>): EditArgs;
|
|
58
93
|
export declare function parseWriteArgs(args: Record<string, unknown>): WriteArgs;
|
|
59
|
-
export
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
export interface DraftResult {
|
|
94
|
+
export declare function parseMoveArgs(args: Record<string, unknown>): MoveArgs;
|
|
95
|
+
export declare function parseDeleteArgs(args: Record<string, unknown>): DeleteArgs;
|
|
96
|
+
export interface FileChangeResult {
|
|
97
|
+
/** The path as the tools address it: the session root, then the path inside it. */
|
|
65
98
|
file_path: string;
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
pull_request: {
|
|
71
|
-
number: number;
|
|
72
|
-
url: string;
|
|
73
|
-
};
|
|
74
|
-
approval_url: string;
|
|
99
|
+
session: string;
|
|
100
|
+
/** `Move` only: where the file went. */
|
|
101
|
+
destination_path?: string;
|
|
102
|
+
committed: false;
|
|
75
103
|
message: string;
|
|
76
104
|
}
|
|
77
|
-
|
|
78
|
-
export declare function
|
|
105
|
+
/** Under the write mutex. */
|
|
106
|
+
export declare function editTool(write: WriteDeps, email: string, args: EditArgs): Promise<FileChangeResult>;
|
|
107
|
+
/** Under the write mutex. Never overwrites. */
|
|
108
|
+
export declare function writeTool(write: WriteDeps, email: string, args: WriteArgs): Promise<FileChangeResult>;
|
|
109
|
+
/** Under the write mutex. A tracked file moves as `git mv` moves it, so the session shows a rename. */
|
|
110
|
+
export declare function moveTool(write: WriteDeps, email: string, args: MoveArgs): Promise<FileChangeResult>;
|
|
111
|
+
/** Under the write mutex. Destructive: the working-tree copy is gone, though a committed version stays in history. */
|
|
112
|
+
export declare function deleteTool(write: WriteDeps, email: string, args: DeleteArgs): Promise<FileChangeResult>;
|
|
79
113
|
//# sourceMappingURL=edit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../../src/core/mcp/tools/edit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../../src/core/mcp/tools/edit.ts"],"names":[],"mappings":"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"}
|