@nanonets/graft 0.24.0 → 0.25.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 +26 -21
- package/dist/ask/ask.d.ts +8 -0
- package/dist/ask/ask.d.ts.map +1 -1
- package/dist/ask/ask.js +33 -12
- package/dist/ask/ask.js.map +1 -1
- package/dist/blast/render.js +1 -1
- package/dist/blast/render.js.map +1 -1
- package/dist/brand.js +1 -1
- package/dist/brand.js.map +1 -1
- package/dist/check/learning-edits.d.ts +18 -3
- package/dist/check/learning-edits.d.ts.map +1 -1
- package/dist/check/learning-edits.js +54 -10
- package/dist/check/learning-edits.js.map +1 -1
- package/dist/check/local-check.d.ts +7 -3
- package/dist/check/local-check.d.ts.map +1 -1
- package/dist/check/local-check.js +55 -11
- package/dist/check/local-check.js.map +1 -1
- package/dist/check/types.d.ts +11 -2
- package/dist/check/types.d.ts.map +1 -1
- package/dist/claude/format.d.ts +11 -7
- package/dist/claude/format.d.ts.map +1 -1
- package/dist/claude/format.js +50 -28
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hook-io.d.ts +44 -0
- package/dist/claude/hook-io.d.ts.map +1 -0
- package/dist/claude/hook-io.js +144 -0
- package/dist/claude/hook-io.js.map +1 -0
- package/dist/claude/hook-layers.d.ts +4 -2
- package/dist/claude/hook-layers.d.ts.map +1 -1
- package/dist/claude/hook-layers.js +21 -4
- package/dist/claude/hook-layers.js.map +1 -1
- package/dist/claude/hooks.d.ts +9 -32
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +154 -350
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.d.ts.map +1 -1
- package/dist/claude/init.js +56 -18
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/note-signals.d.ts +6 -0
- package/dist/claude/note-signals.d.ts.map +1 -1
- package/dist/claude/note-signals.js +14 -3
- package/dist/claude/note-signals.js.map +1 -1
- package/dist/claude/post-bash.d.ts +26 -0
- package/dist/claude/post-bash.d.ts.map +1 -0
- package/dist/claude/post-bash.js +191 -0
- package/dist/claude/post-bash.js.map +1 -0
- package/dist/claude/pre-bash-skills.d.ts +21 -0
- package/dist/claude/pre-bash-skills.d.ts.map +1 -0
- package/dist/claude/pre-bash-skills.js +253 -0
- package/dist/claude/pre-bash-skills.js.map +1 -0
- package/dist/claude/pre-bash.d.ts +50 -0
- package/dist/claude/pre-bash.d.ts.map +1 -0
- package/dist/claude/pre-bash.js +245 -0
- package/dist/claude/pre-bash.js.map +1 -0
- package/dist/claude/prompt-consent.d.ts +19 -0
- package/dist/claude/prompt-consent.d.ts.map +1 -0
- package/dist/claude/prompt-consent.js +14 -0
- package/dist/claude/prompt-consent.js.map +1 -0
- package/dist/claude/prompt-hook.d.ts +76 -0
- package/dist/claude/prompt-hook.d.ts.map +1 -0
- package/dist/claude/prompt-hook.js +303 -0
- package/dist/claude/prompt-hook.js.map +1 -0
- package/dist/claude/prompt-skills.d.ts +19 -0
- package/dist/claude/prompt-skills.d.ts.map +1 -0
- package/dist/claude/prompt-skills.js +305 -0
- package/dist/claude/prompt-skills.js.map +1 -0
- package/dist/claude/session-metrics.js +4 -4
- package/dist/claude/session-metrics.js.map +1 -1
- package/dist/claude/settings-merge.d.ts +10 -0
- package/dist/claude/settings-merge.d.ts.map +1 -1
- package/dist/claude/settings-merge.js +46 -17
- package/dist/claude/settings-merge.js.map +1 -1
- package/dist/claude/shim-template.d.ts.map +1 -1
- package/dist/claude/shim-template.js +86 -28
- package/dist/claude/shim-template.js.map +1 -1
- package/dist/claude/skill-template.d.ts +2 -0
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +53 -34
- package/dist/claude/skill-template.js.map +1 -1
- package/dist/claude/skill-use.d.ts +16 -0
- package/dist/claude/skill-use.d.ts.map +1 -0
- package/dist/claude/skill-use.js +78 -0
- package/dist/claude/skill-use.js.map +1 -0
- package/dist/claude/skills-hook-util.d.ts +25 -0
- package/dist/claude/skills-hook-util.d.ts.map +1 -0
- package/dist/claude/skills-hook-util.js +71 -0
- package/dist/claude/skills-hook-util.js.map +1 -0
- package/dist/claude/skills-wiring.d.ts +26 -0
- package/dist/claude/skills-wiring.d.ts.map +1 -0
- package/dist/claude/skills-wiring.js +110 -0
- package/dist/claude/skills-wiring.js.map +1 -0
- package/dist/claude/start-init.d.ts +13 -0
- package/dist/claude/start-init.d.ts.map +1 -0
- package/dist/claude/start-init.js +75 -0
- package/dist/claude/start-init.js.map +1 -0
- package/dist/claude/start-skills.d.ts +31 -0
- package/dist/claude/start-skills.d.ts.map +1 -0
- package/dist/claude/start-skills.js +274 -0
- package/dist/claude/start-skills.js.map +1 -0
- package/dist/claude/state.d.ts +19 -7
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js +59 -4
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/stop-skills.d.ts +23 -0
- package/dist/claude/stop-skills.d.ts.map +1 -0
- package/dist/claude/stop-skills.js +233 -0
- package/dist/claude/stop-skills.js.map +1 -0
- package/dist/claude/stop.d.ts +23 -0
- package/dist/claude/stop.d.ts.map +1 -0
- package/dist/claude/stop.js +219 -0
- package/dist/claude/stop.js.map +1 -0
- package/dist/claude/tally.d.ts +29 -41
- package/dist/claude/tally.d.ts.map +1 -1
- package/dist/claude/tally.js +111 -165
- package/dist/claude/tally.js.map +1 -1
- package/dist/claude/walls-hook.d.ts +52 -0
- package/dist/claude/walls-hook.d.ts.map +1 -0
- package/dist/claude/walls-hook.js +279 -0
- package/dist/claude/walls-hook.js.map +1 -0
- package/dist/cli-epilogue.d.ts.map +1 -1
- package/dist/cli-epilogue.js +24 -14
- package/dist/cli-epilogue.js.map +1 -1
- package/dist/cli-meta.js +3 -3
- package/dist/cli-meta.js.map +1 -1
- package/dist/cli-picker.d.ts +24 -0
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +44 -11
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +475 -390
- package/dist/cli.js.map +1 -1
- package/dist/cloud/head-learnings.d.ts +13 -0
- package/dist/cloud/head-learnings.d.ts.map +1 -0
- package/dist/cloud/head-learnings.js +84 -0
- package/dist/cloud/head-learnings.js.map +1 -0
- package/dist/cloud/lookup-activity.d.ts +18 -0
- package/dist/cloud/lookup-activity.d.ts.map +1 -0
- package/dist/cloud/lookup-activity.js +56 -0
- package/dist/cloud/lookup-activity.js.map +1 -0
- package/dist/cloud/nudge.d.ts +15 -7
- package/dist/cloud/nudge.d.ts.map +1 -1
- package/dist/cloud/nudge.js +45 -33
- package/dist/cloud/nudge.js.map +1 -1
- package/dist/cloud/onboarding.d.ts +273 -0
- package/dist/cloud/onboarding.d.ts.map +1 -0
- package/dist/cloud/onboarding.js +612 -0
- package/dist/cloud/onboarding.js.map +1 -0
- package/dist/cloud/other-repos.d.ts +39 -0
- package/dist/cloud/other-repos.d.ts.map +1 -0
- package/dist/cloud/other-repos.js +137 -0
- package/dist/cloud/other-repos.js.map +1 -0
- package/dist/cloud/pair.d.ts +86 -0
- package/dist/cloud/pair.d.ts.map +1 -0
- package/dist/cloud/pair.js +270 -0
- package/dist/cloud/pair.js.map +1 -0
- package/dist/cloud/workspace-sync.d.ts +75 -11
- package/dist/cloud/workspace-sync.d.ts.map +1 -1
- package/dist/cloud/workspace-sync.js +409 -53
- package/dist/cloud/workspace-sync.js.map +1 -1
- package/dist/cloud/workspace.d.ts +95 -10
- package/dist/cloud/workspace.d.ts.map +1 -1
- package/dist/cloud/workspace.js +112 -9
- package/dist/cloud/workspace.js.map +1 -1
- package/dist/graph/native.d.ts +2 -0
- package/dist/graph/native.d.ts.map +1 -1
- package/dist/graph/native.js +29 -4
- package/dist/graph/native.js.map +1 -1
- package/dist/hosts/claude-global.d.ts +14 -0
- package/dist/hosts/claude-global.d.ts.map +1 -1
- package/dist/hosts/claude-global.js +39 -4
- package/dist/hosts/claude-global.js.map +1 -1
- package/dist/hosts/codex-hooks.d.ts +6 -0
- package/dist/hosts/codex-hooks.d.ts.map +1 -1
- package/dist/hosts/codex-hooks.js +89 -16
- package/dist/hosts/codex-hooks.js.map +1 -1
- package/dist/hosts/codex-trust.d.ts +28 -0
- package/dist/hosts/codex-trust.d.ts.map +1 -0
- package/dist/hosts/codex-trust.js +280 -0
- package/dist/hosts/codex-trust.js.map +1 -0
- package/dist/hosts/cursor-hooks.d.ts.map +1 -1
- package/dist/hosts/cursor-hooks.js +3 -1
- package/dist/hosts/cursor-hooks.js.map +1 -1
- package/dist/init/candidates.d.ts +60 -0
- package/dist/init/candidates.d.ts.map +1 -0
- package/dist/init/candidates.js +202 -0
- package/dist/init/candidates.js.map +1 -0
- package/dist/init/claude-call.d.ts +51 -0
- package/dist/init/claude-call.d.ts.map +1 -0
- package/dist/init/claude-call.js +199 -0
- package/dist/init/claude-call.js.map +1 -0
- package/dist/init/discover-worker.d.ts +18 -0
- package/dist/init/discover-worker.d.ts.map +1 -0
- package/dist/init/discover-worker.js +111 -0
- package/dist/init/discover-worker.js.map +1 -0
- package/dist/init/handover.d.ts +16 -0
- package/dist/init/handover.d.ts.map +1 -0
- package/dist/init/handover.js +92 -0
- package/dist/init/handover.js.map +1 -0
- package/dist/init/howtos.d.ts +20 -0
- package/dist/init/howtos.d.ts.map +1 -0
- package/dist/init/howtos.js +90 -0
- package/dist/init/howtos.js.map +1 -0
- package/dist/init/init-record.d.ts +134 -0
- package/dist/init/init-record.d.ts.map +1 -0
- package/dist/init/init-record.js +339 -0
- package/dist/init/init-record.js.map +1 -0
- package/dist/init/install-paths.d.ts +6 -0
- package/dist/init/install-paths.d.ts.map +1 -0
- package/dist/init/install-paths.js +87 -0
- package/dist/init/install-paths.js.map +1 -0
- package/dist/init/install-record.d.ts +21 -0
- package/dist/init/install-record.d.ts.map +1 -0
- package/dist/init/install-record.js +144 -0
- package/dist/init/install-record.js.map +1 -0
- package/dist/init/keep-answer.d.ts +43 -0
- package/dist/init/keep-answer.d.ts.map +1 -0
- package/dist/init/keep-answer.js +118 -0
- package/dist/init/keep-answer.js.map +1 -0
- package/dist/init/keep-gate.d.ts +30 -0
- package/dist/init/keep-gate.d.ts.map +1 -0
- package/dist/init/keep-gate.js +178 -0
- package/dist/init/keep-gate.js.map +1 -0
- package/dist/init/keep-list.d.ts +67 -0
- package/dist/init/keep-list.d.ts.map +1 -0
- package/dist/init/keep-list.js +232 -0
- package/dist/init/keep-list.js.map +1 -0
- package/dist/init/keep.d.ts +52 -0
- package/dist/init/keep.d.ts.map +1 -0
- package/dist/init/keep.js +393 -0
- package/dist/init/keep.js.map +1 -0
- package/dist/init/look-back-mine.d.ts +37 -0
- package/dist/init/look-back-mine.d.ts.map +1 -0
- package/dist/init/look-back-mine.js +215 -0
- package/dist/init/look-back-mine.js.map +1 -0
- package/dist/init/look-back.d.ts +81 -0
- package/dist/init/look-back.d.ts.map +1 -0
- package/dist/init/look-back.js +170 -0
- package/dist/init/look-back.js.map +1 -0
- package/dist/init/miners.d.ts +46 -0
- package/dist/init/miners.d.ts.map +1 -0
- package/dist/init/miners.js +141 -0
- package/dist/init/miners.js.map +1 -0
- package/dist/init/name-call.d.ts +37 -0
- package/dist/init/name-call.d.ts.map +1 -0
- package/dist/init/name-call.js +151 -0
- package/dist/init/name-call.js.map +1 -0
- package/dist/init/plain-file.d.ts +11 -0
- package/dist/init/plain-file.d.ts.map +1 -0
- package/dist/init/plain-file.js +83 -0
- package/dist/init/plain-file.js.map +1 -0
- package/dist/init/prefs.d.ts +70 -0
- package/dist/init/prefs.d.ts.map +1 -0
- package/dist/init/prefs.js +282 -0
- package/dist/init/prefs.js.map +1 -0
- package/dist/init/relay.d.ts +15 -0
- package/dist/init/relay.d.ts.map +1 -0
- package/dist/init/relay.js +15 -0
- package/dist/init/relay.js.map +1 -0
- package/dist/init/replay-runs.d.ts +121 -0
- package/dist/init/replay-runs.d.ts.map +1 -0
- package/dist/init/replay-runs.js +457 -0
- package/dist/init/replay-runs.js.map +1 -0
- package/dist/init/replay-tamper.d.ts +18 -0
- package/dist/init/replay-tamper.d.ts.map +1 -0
- package/dist/init/replay-tamper.js +87 -0
- package/dist/init/replay-tamper.js.map +1 -0
- package/dist/init/review-screen.d.ts +74 -0
- package/dist/init/review-screen.d.ts.map +1 -0
- package/dist/init/review-screen.js +258 -0
- package/dist/init/review-screen.js.map +1 -0
- package/dist/init/review-tty.d.ts +29 -0
- package/dist/init/review-tty.d.ts.map +1 -0
- package/dist/init/review-tty.js +218 -0
- package/dist/init/review-tty.js.map +1 -0
- package/dist/init/review.d.ts +12 -0
- package/dist/init/review.d.ts.map +1 -0
- package/dist/init/review.js +12 -0
- package/dist/init/review.js.map +1 -0
- package/dist/init/run.d.ts +87 -0
- package/dist/init/run.d.ts.map +1 -0
- package/dist/init/run.js +347 -0
- package/dist/init/run.js.map +1 -0
- package/dist/init/sessions.d.ts +63 -0
- package/dist/init/sessions.d.ts.map +1 -0
- package/dist/init/sessions.js +377 -0
- package/dist/init/sessions.js.map +1 -0
- package/dist/init/transcript.d.ts +81 -0
- package/dist/init/transcript.d.ts.map +1 -0
- package/dist/init/transcript.js +216 -0
- package/dist/init/transcript.js.map +1 -0
- package/dist/init/types.d.ts +139 -0
- package/dist/init/types.d.ts.map +1 -0
- package/dist/init/types.js +2 -0
- package/dist/init/types.js.map +1 -0
- package/dist/mcp/brains.d.ts +72 -0
- package/dist/mcp/brains.d.ts.map +1 -0
- package/dist/mcp/brains.js +220 -0
- package/dist/mcp/brains.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +40 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +7 -2
- package/dist/mcp/tools.js.map +1 -1
- package/dist/notes/cold-start.d.ts +5 -184
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +5 -575
- package/dist/notes/cold-start.js.map +1 -1
- package/dist/notes/edit-overlap.d.ts.map +1 -1
- package/dist/notes/edit-overlap.js +4 -1
- package/dist/notes/edit-overlap.js.map +1 -1
- package/dist/notes/every-repo.d.ts +18 -0
- package/dist/notes/every-repo.d.ts.map +1 -0
- package/dist/notes/every-repo.js +86 -0
- package/dist/notes/every-repo.js.map +1 -0
- package/dist/notes/guardrails.d.ts +8 -0
- package/dist/notes/guardrails.d.ts.map +1 -0
- package/dist/notes/guardrails.js +38 -0
- package/dist/notes/guardrails.js.map +1 -0
- package/dist/notes/lesson-index.d.ts +13 -0
- package/dist/notes/lesson-index.d.ts.map +1 -0
- package/dist/notes/lesson-index.js +135 -0
- package/dist/notes/lesson-index.js.map +1 -0
- package/dist/notes/linked-learnings.d.ts +8 -0
- package/dist/notes/linked-learnings.d.ts.map +1 -0
- package/dist/notes/linked-learnings.js +113 -0
- package/dist/notes/linked-learnings.js.map +1 -0
- package/dist/notes/notes.d.ts +8 -4
- package/dist/notes/notes.d.ts.map +1 -1
- package/dist/notes/notes.js +9 -7
- package/dist/notes/notes.js.map +1 -1
- package/dist/notes/pr-reviews.d.ts +4 -0
- package/dist/notes/pr-reviews.d.ts.map +1 -1
- package/dist/notes/pr-reviews.js +6 -5
- package/dist/notes/pr-reviews.js.map +1 -1
- package/dist/notes/replace.d.ts +14 -0
- package/dist/notes/replace.d.ts.map +1 -0
- package/dist/notes/replace.js +38 -0
- package/dist/notes/replace.js.map +1 -0
- package/dist/notes/repo-notes-dir.d.ts +2 -0
- package/dist/notes/repo-notes-dir.d.ts.map +1 -0
- package/dist/notes/repo-notes-dir.js +16 -0
- package/dist/notes/repo-notes-dir.js.map +1 -0
- package/dist/notes/repo-trail.d.ts +1 -1
- package/dist/notes/repo-trail.d.ts.map +1 -1
- package/dist/notes/repo-trail.js +24 -4
- package/dist/notes/repo-trail.js.map +1 -1
- package/dist/search/grep.d.ts.map +1 -1
- package/dist/search/grep.js +4 -2
- package/dist/search/grep.js.map +1 -1
- package/dist/search/user-regexp.d.ts +26 -0
- package/dist/search/user-regexp.d.ts.map +1 -0
- package/dist/search/user-regexp.js +150 -0
- package/dist/search/user-regexp.js.map +1 -0
- package/dist/skills/anchors-cli.d.ts +38 -0
- package/dist/skills/anchors-cli.d.ts.map +1 -0
- package/dist/skills/anchors-cli.js +279 -0
- package/dist/skills/anchors-cli.js.map +1 -0
- package/dist/skills/anchors-git.d.ts +29 -0
- package/dist/skills/anchors-git.d.ts.map +1 -0
- package/dist/skills/anchors-git.js +241 -0
- package/dist/skills/anchors-git.js.map +1 -0
- package/dist/skills/anchors-wide.d.ts +25 -0
- package/dist/skills/anchors-wide.d.ts.map +1 -0
- package/dist/skills/anchors-wide.js +481 -0
- package/dist/skills/anchors-wide.js.map +1 -0
- package/dist/skills/anchors.d.ts +32 -0
- package/dist/skills/anchors.d.ts.map +1 -0
- package/dist/skills/anchors.js +485 -0
- package/dist/skills/anchors.js.map +1 -0
- package/dist/skills/check-result.d.ts +26 -0
- package/dist/skills/check-result.d.ts.map +1 -0
- package/dist/skills/check-result.js +46 -0
- package/dist/skills/check-result.js.map +1 -0
- package/dist/skills/cli-skills-1b.d.ts +17 -0
- package/dist/skills/cli-skills-1b.d.ts.map +1 -0
- package/dist/skills/cli-skills-1b.js +166 -0
- package/dist/skills/cli-skills-1b.js.map +1 -0
- package/dist/skills/cli-skills-2.d.ts +35 -0
- package/dist/skills/cli-skills-2.d.ts.map +1 -0
- package/dist/skills/cli-skills-2.js +129 -0
- package/dist/skills/cli-skills-2.js.map +1 -0
- package/dist/skills/cli-skills-report-1b.d.ts +49 -0
- package/dist/skills/cli-skills-report-1b.d.ts.map +1 -0
- package/dist/skills/cli-skills-report-1b.js +191 -0
- package/dist/skills/cli-skills-report-1b.js.map +1 -0
- package/dist/skills/cli-skills-report.d.ts +86 -0
- package/dist/skills/cli-skills-report.d.ts.map +1 -0
- package/dist/skills/cli-skills-report.js +121 -0
- package/dist/skills/cli-skills-report.js.map +1 -0
- package/dist/skills/cli-skills.d.ts +30 -0
- package/dist/skills/cli-skills.d.ts.map +1 -0
- package/dist/skills/cli-skills.js +379 -0
- package/dist/skills/cli-skills.js.map +1 -0
- package/dist/skills/codex-sandbox.d.ts +6 -0
- package/dist/skills/codex-sandbox.d.ts.map +1 -0
- package/dist/skills/codex-sandbox.js +55 -0
- package/dist/skills/codex-sandbox.js.map +1 -0
- package/dist/skills/compile-split.d.ts +57 -0
- package/dist/skills/compile-split.d.ts.map +1 -0
- package/dist/skills/compile-split.js +550 -0
- package/dist/skills/compile-split.js.map +1 -0
- package/dist/skills/compile-version.d.ts +37 -0
- package/dist/skills/compile-version.d.ts.map +1 -0
- package/dist/skills/compile-version.js +56 -0
- package/dist/skills/compile-version.js.map +1 -0
- package/dist/skills/compile-waits.d.ts +12 -0
- package/dist/skills/compile-waits.d.ts.map +1 -0
- package/dist/skills/compile-waits.js +52 -0
- package/dist/skills/compile-waits.js.map +1 -0
- package/dist/skills/compile-words.d.ts +85 -0
- package/dist/skills/compile-words.d.ts.map +1 -0
- package/dist/skills/compile-words.js +445 -0
- package/dist/skills/compile-words.js.map +1 -0
- package/dist/skills/compile.d.ts +42 -0
- package/dist/skills/compile.d.ts.map +1 -0
- package/dist/skills/compile.js +505 -0
- package/dist/skills/compile.js.map +1 -0
- package/dist/skills/credit-facts.d.ts +8 -0
- package/dist/skills/credit-facts.d.ts.map +1 -0
- package/dist/skills/credit-facts.js +32 -0
- package/dist/skills/credit-facts.js.map +1 -0
- package/dist/skills/credit.d.ts +86 -0
- package/dist/skills/credit.d.ts.map +1 -0
- package/dist/skills/credit.js +259 -0
- package/dist/skills/credit.js.map +1 -0
- package/dist/skills/directive-words.d.ts +11 -0
- package/dist/skills/directive-words.d.ts.map +1 -0
- package/dist/skills/directive-words.js +33 -0
- package/dist/skills/directive-words.js.map +1 -0
- package/dist/skills/fidelity.d.ts +42 -0
- package/dist/skills/fidelity.d.ts.map +1 -0
- package/dist/skills/fidelity.js +138 -0
- package/dist/skills/fidelity.js.map +1 -0
- package/dist/skills/fold-gated.d.ts +3 -0
- package/dist/skills/fold-gated.d.ts.map +1 -0
- package/dist/skills/fold-gated.js +78 -0
- package/dist/skills/fold-gated.js.map +1 -0
- package/dist/skills/fold.d.ts +87 -0
- package/dist/skills/fold.d.ts.map +1 -0
- package/dist/skills/fold.js +348 -0
- package/dist/skills/fold.js.map +1 -0
- package/dist/skills/follow-learnings.d.ts +128 -0
- package/dist/skills/follow-learnings.d.ts.map +1 -0
- package/dist/skills/follow-learnings.js +278 -0
- package/dist/skills/follow-learnings.js.map +1 -0
- package/dist/skills/forget-notice.d.ts +44 -0
- package/dist/skills/forget-notice.d.ts.map +1 -0
- package/dist/skills/forget-notice.js +131 -0
- package/dist/skills/forget-notice.js.map +1 -0
- package/dist/skills/front-version.d.ts +12 -0
- package/dist/skills/front-version.d.ts.map +1 -0
- package/dist/skills/front-version.js +87 -0
- package/dist/skills/front-version.js.map +1 -0
- package/dist/skills/host-facts.d.ts +51 -0
- package/dist/skills/host-facts.d.ts.map +1 -0
- package/dist/skills/host-facts.js +134 -0
- package/dist/skills/host-facts.js.map +1 -0
- package/dist/skills/learning-steps.d.ts +43 -0
- package/dist/skills/learning-steps.d.ts.map +1 -0
- package/dist/skills/learning-steps.js +294 -0
- package/dist/skills/learning-steps.js.map +1 -0
- package/dist/skills/ledger.d.ts +43 -0
- package/dist/skills/ledger.d.ts.map +1 -0
- package/dist/skills/ledger.js +336 -0
- package/dist/skills/ledger.js.map +1 -0
- package/dist/skills/lesson-gate.d.ts +25 -0
- package/dist/skills/lesson-gate.d.ts.map +1 -0
- package/dist/skills/lesson-gate.js +316 -0
- package/dist/skills/lesson-gate.js.map +1 -0
- package/dist/skills/lessons.d.ts +60 -0
- package/dist/skills/lessons.d.ts.map +1 -0
- package/dist/skills/lessons.js +396 -0
- package/dist/skills/lessons.js.map +1 -0
- package/dist/skills/offer-answers.d.ts +20 -0
- package/dist/skills/offer-answers.d.ts.map +1 -0
- package/dist/skills/offer-answers.js +51 -0
- package/dist/skills/offer-answers.js.map +1 -0
- package/dist/skills/offer-drift.d.ts +35 -0
- package/dist/skills/offer-drift.d.ts.map +1 -0
- package/dist/skills/offer-drift.js +98 -0
- package/dist/skills/offer-drift.js.map +1 -0
- package/dist/skills/offer-lesson.d.ts +31 -0
- package/dist/skills/offer-lesson.d.ts.map +1 -0
- package/dist/skills/offer-lesson.js +123 -0
- package/dist/skills/offer-lesson.js.map +1 -0
- package/dist/skills/offer-lines.d.ts +40 -0
- package/dist/skills/offer-lines.d.ts.map +1 -0
- package/dist/skills/offer-lines.js +80 -0
- package/dist/skills/offer-lines.js.map +1 -0
- package/dist/skills/offer-moment.d.ts +102 -0
- package/dist/skills/offer-moment.d.ts.map +1 -0
- package/dist/skills/offer-moment.js +260 -0
- package/dist/skills/offer-moment.js.map +1 -0
- package/dist/skills/offer-repair.d.ts +36 -0
- package/dist/skills/offer-repair.d.ts.map +1 -0
- package/dist/skills/offer-repair.js +212 -0
- package/dist/skills/offer-repair.js.map +1 -0
- package/dist/skills/offer-retire.d.ts +53 -0
- package/dist/skills/offer-retire.d.ts.map +1 -0
- package/dist/skills/offer-retire.js +149 -0
- package/dist/skills/offer-retire.js.map +1 -0
- package/dist/skills/offer-update.d.ts +54 -0
- package/dist/skills/offer-update.d.ts.map +1 -0
- package/dist/skills/offer-update.js +115 -0
- package/dist/skills/offer-update.js.map +1 -0
- package/dist/skills/offer-words-1b.d.ts +32 -0
- package/dist/skills/offer-words-1b.d.ts.map +1 -0
- package/dist/skills/offer-words-1b.js +80 -0
- package/dist/skills/offer-words-1b.js.map +1 -0
- package/dist/skills/offer-words-2.d.ts +123 -0
- package/dist/skills/offer-words-2.d.ts.map +1 -0
- package/dist/skills/offer-words-2.js +194 -0
- package/dist/skills/offer-words-2.js.map +1 -0
- package/dist/skills/offer-words.d.ts +65 -0
- package/dist/skills/offer-words.d.ts.map +1 -0
- package/dist/skills/offer-words.js +205 -0
- package/dist/skills/offer-words.js.map +1 -0
- package/dist/skills/offers.d.ts +66 -0
- package/dist/skills/offers.d.ts.map +1 -0
- package/dist/skills/offers.js +284 -0
- package/dist/skills/offers.js.map +1 -0
- package/dist/skills/own-folder.d.ts +9 -0
- package/dist/skills/own-folder.d.ts.map +1 -0
- package/dist/skills/own-folder.js +36 -0
- package/dist/skills/own-folder.js.map +1 -0
- package/dist/skills/person.d.ts +34 -0
- package/dist/skills/person.d.ts.map +1 -0
- package/dist/skills/person.js +102 -0
- package/dist/skills/person.js.map +1 -0
- package/dist/skills/probe-clean.d.ts +9 -0
- package/dist/skills/probe-clean.d.ts.map +1 -0
- package/dist/skills/probe-clean.js +48 -0
- package/dist/skills/probe-clean.js.map +1 -0
- package/dist/skills/probes.d.ts +26 -0
- package/dist/skills/probes.d.ts.map +1 -0
- package/dist/skills/probes.js +225 -0
- package/dist/skills/probes.js.map +1 -0
- package/dist/skills/recall.d.ts +119 -0
- package/dist/skills/recall.d.ts.map +1 -0
- package/dist/skills/recall.js +370 -0
- package/dist/skills/recall.js.map +1 -0
- package/dist/skills/receipts.d.ts +44 -0
- package/dist/skills/receipts.d.ts.map +1 -0
- package/dist/skills/receipts.js +223 -0
- package/dist/skills/receipts.js.map +1 -0
- package/dist/skills/run-checkout.d.ts +4 -0
- package/dist/skills/run-checkout.d.ts.map +1 -0
- package/dist/skills/run-checkout.js +37 -0
- package/dist/skills/run-checkout.js.map +1 -0
- package/dist/skills/runblock.d.ts +47 -0
- package/dist/skills/runblock.d.ts.map +1 -0
- package/dist/skills/runblock.js +227 -0
- package/dist/skills/runblock.js.map +1 -0
- package/dist/skills/save-gate.d.ts +64 -0
- package/dist/skills/save-gate.d.ts.map +1 -0
- package/dist/skills/save-gate.js +354 -0
- package/dist/skills/save-gate.js.map +1 -0
- package/dist/skills/save-parse.d.ts +42 -0
- package/dist/skills/save-parse.d.ts.map +1 -0
- package/dist/skills/save-parse.js +172 -0
- package/dist/skills/save-parse.js.map +1 -0
- package/dist/skills/save-store.d.ts +12 -0
- package/dist/skills/save-store.d.ts.map +1 -0
- package/dist/skills/save-store.js +22 -0
- package/dist/skills/save-store.js.map +1 -0
- package/dist/skills/save-verify.d.ts +59 -0
- package/dist/skills/save-verify.d.ts.map +1 -0
- package/dist/skills/save-verify.js +390 -0
- package/dist/skills/save-verify.js.map +1 -0
- package/dist/skills/settings.d.ts +48 -0
- package/dist/skills/settings.d.ts.map +1 -0
- package/dist/skills/settings.js +155 -0
- package/dist/skills/settings.js.map +1 -0
- package/dist/skills/skill-diff.d.ts +40 -0
- package/dist/skills/skill-diff.d.ts.map +1 -0
- package/dist/skills/skill-diff.js +191 -0
- package/dist/skills/skill-diff.js.map +1 -0
- package/dist/skills/skill-file.d.ts +24 -0
- package/dist/skills/skill-file.d.ts.map +1 -0
- package/dist/skills/skill-file.js +97 -0
- package/dist/skills/skill-file.js.map +1 -0
- package/dist/skills/skill-rebuild.d.ts +27 -0
- package/dist/skills/skill-rebuild.d.ts.map +1 -0
- package/dist/skills/skill-rebuild.js +85 -0
- package/dist/skills/skill-rebuild.js.map +1 -0
- package/dist/skills/skillmd.d.ts +17 -0
- package/dist/skills/skillmd.d.ts.map +1 -0
- package/dist/skills/skillmd.js +219 -0
- package/dist/skills/skillmd.js.map +1 -0
- package/dist/skills/skills.d.ts +28 -8
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +106 -53
- package/dist/skills/skills.js.map +1 -1
- package/dist/skills/staleness.d.ts +27 -0
- package/dist/skills/staleness.d.ts.map +1 -0
- package/dist/skills/staleness.js +178 -0
- package/dist/skills/staleness.js.map +1 -0
- package/dist/skills/state.d.ts +36 -0
- package/dist/skills/state.d.ts.map +1 -0
- package/dist/skills/state.js +259 -0
- package/dist/skills/state.js.map +1 -0
- package/dist/skills/store-fs.d.ts +77 -0
- package/dist/skills/store-fs.d.ts.map +1 -0
- package/dist/skills/store-fs.js +194 -0
- package/dist/skills/store-fs.js.map +1 -0
- package/dist/skills/store-held.d.ts +44 -0
- package/dist/skills/store-held.d.ts.map +1 -0
- package/dist/skills/store-held.js +147 -0
- package/dist/skills/store-held.js.map +1 -0
- package/dist/skills/store.d.ts +73 -0
- package/dist/skills/store.d.ts.map +1 -0
- package/dist/skills/store.js +279 -0
- package/dist/skills/store.js.map +1 -0
- package/dist/skills/types.d.ts +8 -0
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/skills/update-gate.d.ts +36 -0
- package/dist/skills/update-gate.d.ts.map +1 -0
- package/dist/skills/update-gate.js +357 -0
- package/dist/skills/update-gate.js.map +1 -0
- package/dist/skills/update-plan.d.ts +40 -0
- package/dist/skills/update-plan.d.ts.map +1 -0
- package/dist/skills/update-plan.js +196 -0
- package/dist/skills/update-plan.js.map +1 -0
- package/dist/skills/validate.d.ts +11 -0
- package/dist/skills/validate.d.ts.map +1 -0
- package/dist/skills/validate.js +112 -0
- package/dist/skills/validate.js.map +1 -0
- package/dist/skills/value-line.d.ts +94 -0
- package/dist/skills/value-line.d.ts.map +1 -0
- package/dist/skills/value-line.js +355 -0
- package/dist/skills/value-line.js.map +1 -0
- package/dist/skills/versions-fs.d.ts +45 -0
- package/dist/skills/versions-fs.d.ts.map +1 -0
- package/dist/skills/versions-fs.js +234 -0
- package/dist/skills/versions-fs.js.map +1 -0
- package/dist/skills/versions.d.ts +56 -0
- package/dist/skills/versions.d.ts.map +1 -0
- package/dist/skills/versions.js +351 -0
- package/dist/skills/versions.js.map +1 -0
- package/dist/telemetry/contract.d.ts +15 -1
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +80 -11
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/gate.js +4 -4
- package/dist/telemetry/gate.js.map +1 -1
- package/dist/telemetry/index.d.ts +1 -1
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +1 -1
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/notice.js +5 -5
- package/dist/telemetry/notice.js.map +1 -1
- package/dist/telemetry/queue.d.ts.map +1 -1
- package/dist/telemetry/queue.js +7 -7
- package/dist/telemetry/queue.js.map +1 -1
- package/dist/telemetry/track.d.ts.map +1 -1
- package/dist/telemetry/track.js +4 -3
- package/dist/telemetry/track.js.map +1 -1
- package/dist/trace/checks.d.ts +63 -0
- package/dist/trace/checks.d.ts.map +1 -0
- package/dist/trace/checks.js +495 -0
- package/dist/trace/checks.js.map +1 -0
- package/dist/trace/claude.d.ts +124 -0
- package/dist/trace/claude.d.ts.map +1 -0
- package/dist/trace/claude.js +303 -0
- package/dist/trace/claude.js.map +1 -0
- package/dist/trace/codex-exec.d.ts +22 -0
- package/dist/trace/codex-exec.d.ts.map +1 -0
- package/dist/trace/codex-exec.js +129 -0
- package/dist/trace/codex-exec.js.map +1 -0
- package/dist/trace/codex-meta.d.ts +23 -0
- package/dist/trace/codex-meta.d.ts.map +1 -0
- package/dist/trace/codex-meta.js +112 -0
- package/dist/trace/codex-meta.js.map +1 -0
- package/dist/trace/codex.d.ts +33 -0
- package/dist/trace/codex.d.ts.map +1 -0
- package/dist/trace/codex.js +485 -0
- package/dist/trace/codex.js.map +1 -0
- package/dist/trace/cursor.d.ts +16 -0
- package/dist/trace/cursor.d.ts.map +1 -0
- package/dist/trace/cursor.js +133 -0
- package/dist/trace/cursor.js.map +1 -0
- package/dist/trace/dialect.d.ts +43 -0
- package/dist/trace/dialect.d.ts.map +1 -0
- package/dist/trace/dialect.js +95 -0
- package/dist/trace/dialect.js.map +1 -0
- package/dist/trace/epochs.d.ts +10 -0
- package/dist/trace/epochs.d.ts.map +1 -0
- package/dist/trace/epochs.js +16 -0
- package/dist/trace/epochs.js.map +1 -0
- package/dist/trace/failure.d.ts +15 -0
- package/dist/trace/failure.d.ts.map +1 -0
- package/dist/trace/failure.js +69 -0
- package/dist/trace/failure.js.map +1 -0
- package/dist/trace/gate-file.d.ts +71 -0
- package/dist/trace/gate-file.d.ts.map +1 -0
- package/dist/trace/gate-file.js +329 -0
- package/dist/trace/gate-file.js.map +1 -0
- package/dist/trace/guard-fast.d.ts +22 -0
- package/dist/trace/guard-fast.d.ts.map +1 -0
- package/dist/trace/guard-fast.js +213 -0
- package/dist/trace/guard-fast.js.map +1 -0
- package/dist/trace/housekeeping.d.ts +5 -0
- package/dist/trace/housekeeping.d.ts.map +1 -0
- package/dist/trace/housekeeping.js +93 -0
- package/dist/trace/housekeeping.js.map +1 -0
- package/dist/trace/jobs.d.ts +52 -0
- package/dist/trace/jobs.d.ts.map +1 -0
- package/dist/trace/jobs.js +182 -0
- package/dist/trace/jobs.js.map +1 -0
- package/dist/trace/known-repo.d.ts +3 -0
- package/dist/trace/known-repo.d.ts.map +1 -0
- package/dist/trace/known-repo.js +55 -0
- package/dist/trace/known-repo.js.map +1 -0
- package/dist/trace/pool.d.ts +40 -0
- package/dist/trace/pool.d.ts.map +1 -0
- package/dist/trace/pool.js +154 -0
- package/dist/trace/pool.js.map +1 -0
- package/dist/trace/repairs.d.ts +27 -0
- package/dist/trace/repairs.d.ts.map +1 -0
- package/dist/trace/repairs.js +303 -0
- package/dist/trace/repairs.js.map +1 -0
- package/dist/trace/run-calls.d.ts +82 -0
- package/dist/trace/run-calls.d.ts.map +1 -0
- package/dist/trace/run-calls.js +331 -0
- package/dist/trace/run-calls.js.map +1 -0
- package/dist/trace/run-join.d.ts +20 -0
- package/dist/trace/run-join.d.ts.map +1 -0
- package/dist/trace/run-join.js +99 -0
- package/dist/trace/run-join.js.map +1 -0
- package/dist/trace/run-sheets.d.ts +26 -0
- package/dist/trace/run-sheets.d.ts.map +1 -0
- package/dist/trace/run-sheets.js +145 -0
- package/dist/trace/run-sheets.js.map +1 -0
- package/dist/trace/run-turns.d.ts +24 -0
- package/dist/trace/run-turns.d.ts.map +1 -0
- package/dist/trace/run-turns.js +67 -0
- package/dist/trace/run-turns.js.map +1 -0
- package/dist/trace/run-verdict.d.ts +24 -0
- package/dist/trace/run-verdict.d.ts.map +1 -0
- package/dist/trace/run-verdict.js +176 -0
- package/dist/trace/run-verdict.js.map +1 -0
- package/dist/trace/runs.d.ts +54 -0
- package/dist/trace/runs.d.ts.map +1 -0
- package/dist/trace/runs.js +501 -0
- package/dist/trace/runs.js.map +1 -0
- package/dist/trace/skill-session.d.ts +64 -0
- package/dist/trace/skill-session.d.ts.map +1 -0
- package/dist/trace/skill-session.js +232 -0
- package/dist/trace/skill-session.js.map +1 -0
- package/dist/trace/tamper.d.ts +12 -0
- package/dist/trace/tamper.d.ts.map +1 -0
- package/dist/trace/tamper.js +405 -0
- package/dist/trace/tamper.js.map +1 -0
- package/dist/trace/typed.d.ts +30 -0
- package/dist/trace/typed.d.ts.map +1 -0
- package/dist/trace/typed.js +132 -0
- package/dist/trace/typed.js.map +1 -0
- package/dist/trace/wall-state.d.ts +86 -0
- package/dist/trace/wall-state.d.ts.map +1 -0
- package/dist/trace/wall-state.js +279 -0
- package/dist/trace/wall-state.js.map +1 -0
- package/dist/trace/walls.d.ts +40 -0
- package/dist/trace/walls.d.ts.map +1 -0
- package/dist/trace/walls.js +318 -0
- package/dist/trace/walls.js.map +1 -0
- package/dist/upkeep-run.d.ts.map +1 -1
- package/dist/upkeep-run.js +2 -23
- package/dist/upkeep-run.js.map +1 -1
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +2 -3
- package/dist/upkeep.js.map +1 -1
- package/dist/util/private-fs.d.ts +6 -0
- package/dist/util/private-fs.d.ts.map +1 -1
- package/dist/util/private-fs.js +9 -1
- package/dist/util/private-fs.js.map +1 -1
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +17 -3
- package/dist/util/state.js.map +1 -1
- package/dist/vendor/tree-sitter-swift/LICENSE +21 -0
- package/dist/vendor/tree-sitter-swift/node-types.json +30694 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/darwin-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/darwin-x64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/linux-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/linux-x64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/win32-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/win32-x64/tree-sitter-swift.node +0 -0
- package/package.json +6 -3
- package/scripts/stamp-telemetry-key.mjs +8 -5
- package/scripts/vendor-grammars.mjs +35 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D120 (2): the install record, `<trail home>/state/installed/<checkout hash>.json`:
|
|
3
|
+
* the repo paths `trail init` wrote in one checkout, each with the sha256 of what
|
|
4
|
+
* it wrote (null for a file it deleted). The clean-tree ready probe ignores a
|
|
5
|
+
* dirty path only while it is in this record and still holds those bytes, so any
|
|
6
|
+
* later edit blocks again.
|
|
7
|
+
*
|
|
8
|
+
* A path counts as init's when init changed it and it was clean in git just
|
|
9
|
+
* before (or the last record already had it, unchanged since). A path the person
|
|
10
|
+
* had dirty before init stays theirs, whatever init then wrote into it. Links,
|
|
11
|
+
* FIFOs and files over 1 MB are never recorded or vouched for.
|
|
12
|
+
*/
|
|
13
|
+
import { spawnSync } from 'node:child_process';
|
|
14
|
+
import { createHash } from 'node:crypto';
|
|
15
|
+
import { closeSync, fstatSync, lstatSync, readSync, realpathSync } from 'node:fs';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { trailPath, writePrivate } from '../util/private-fs.js';
|
|
18
|
+
import { openPlain, readPlain } from './plain-file.js';
|
|
19
|
+
const MAX_FILE = 1024 * 1024;
|
|
20
|
+
const MAX_PATHS = 200;
|
|
21
|
+
const REL = /^(?!\/)(?!.*(?:^|\/)\.\.?(?:\/|$))[\w.@+-]+(?:\/[\w.@+-]+)*$/;
|
|
22
|
+
const SHA = /^[0-9a-f]{64}$/;
|
|
23
|
+
function real(checkout) {
|
|
24
|
+
try {
|
|
25
|
+
return realpathSync.native(checkout);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return checkout;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function installRecordPath(checkout, env) {
|
|
32
|
+
const key = createHash('sha256').update(real(checkout)).digest('hex').slice(0, 16);
|
|
33
|
+
return trailPath(env, 'state', 'installed', `${key}.json`);
|
|
34
|
+
}
|
|
35
|
+
/** The sha256 of a plain file's bytes; null when nothing is there; false for a link, a FIFO, a folder or a big file. */
|
|
36
|
+
export function fileSha(path) {
|
|
37
|
+
try {
|
|
38
|
+
if (!lstatSync(path).isFile())
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
let fd = -1;
|
|
45
|
+
try {
|
|
46
|
+
fd = openPlain(path);
|
|
47
|
+
const size = fstatSync(fd).size;
|
|
48
|
+
if (size > MAX_FILE)
|
|
49
|
+
return false;
|
|
50
|
+
const buf = Buffer.alloc(size);
|
|
51
|
+
let off = 0;
|
|
52
|
+
while (off < size) {
|
|
53
|
+
const n = readSync(fd, buf, off, size - off, off);
|
|
54
|
+
if (n <= 0)
|
|
55
|
+
break;
|
|
56
|
+
off += n;
|
|
57
|
+
}
|
|
58
|
+
return createHash('sha256').update(buf.subarray(0, off)).digest('hex');
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
if (fd >= 0)
|
|
65
|
+
closeSync(fd);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** The record for this checkout, or null when there is none or it names another checkout. */
|
|
69
|
+
export function readInstallRecord(checkout, env) {
|
|
70
|
+
let raw;
|
|
71
|
+
try {
|
|
72
|
+
const text = readPlain(installRecordPath(checkout, env), MAX_FILE);
|
|
73
|
+
if (text === null)
|
|
74
|
+
return null;
|
|
75
|
+
raw = JSON.parse(text);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
const r = raw;
|
|
81
|
+
if (!r || r.v !== 1 || r.checkout !== real(checkout) || !r.files || typeof r.files !== 'object' || Array.isArray(r.files))
|
|
82
|
+
return null;
|
|
83
|
+
const out = {};
|
|
84
|
+
for (const [rel, sha] of Object.entries(r.files).slice(0, MAX_PATHS)) {
|
|
85
|
+
if (REL.test(rel) && (sha === null || (typeof sha === 'string' && SHA.test(sha))))
|
|
86
|
+
out[rel] = sha;
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
/** Whether `rel` is a path init recorded here that still holds what init left (absent, for one it deleted). */
|
|
91
|
+
export function initLeftIt(files, checkout, rel) {
|
|
92
|
+
if (!files || !Object.hasOwn(files, rel) || !REL.test(rel))
|
|
93
|
+
return false;
|
|
94
|
+
return fileSha(join(checkout, rel)) === files[rel];
|
|
95
|
+
}
|
|
96
|
+
/** The paths of `git status --porcelain -z` (a rename's both sides), for the paths asked about. */
|
|
97
|
+
function dirtyPaths(checkout, rels, env) {
|
|
98
|
+
if (!rels.length)
|
|
99
|
+
return new Set();
|
|
100
|
+
const r = spawnSync('git', ['status', '--porcelain', '-z', '--untracked-files=all', '--', ...rels], {
|
|
101
|
+
cwd: checkout, encoding: 'utf8', timeout: 10_000, env: { ...env, GIT_OPTIONAL_LOCKS: '0', GIT_TERMINAL_PROMPT: '0' },
|
|
102
|
+
});
|
|
103
|
+
if (r.status !== 0 || typeof r.stdout !== 'string')
|
|
104
|
+
return null;
|
|
105
|
+
const out = new Set();
|
|
106
|
+
const parts = r.stdout.split('\0');
|
|
107
|
+
for (let i = 0; i < parts.length; i++) {
|
|
108
|
+
const p = parts[i];
|
|
109
|
+
if (p.length < 4)
|
|
110
|
+
continue;
|
|
111
|
+
out.add(p.slice(3));
|
|
112
|
+
if (p[0] === 'R' || p[0] === 'C')
|
|
113
|
+
out.add(parts[++i] ?? '');
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/** Before init writes: what each path holds, which were dirty already, and the last record. */
|
|
118
|
+
export function snapInstall(checkout, rels, env = process.env) {
|
|
119
|
+
const list = [...new Set(rels.filter((r) => REL.test(r)))].slice(0, MAX_PATHS);
|
|
120
|
+
const dirty = dirtyPaths(checkout, list, env);
|
|
121
|
+
const before = new Map(list.map((rel) => [rel, fileSha(join(checkout, rel))]));
|
|
122
|
+
// When git can't say, every path counts as dirty: nothing is vouched for that the probe couldn't check either.
|
|
123
|
+
return { checkout, rels: list, before, dirty: dirty ?? new Set(list), prior: readInstallRecord(checkout, env) };
|
|
124
|
+
}
|
|
125
|
+
/** After init wrote: record the paths it made its own, and return them. */
|
|
126
|
+
export function recordInstall(snap, env = process.env) {
|
|
127
|
+
const files = {};
|
|
128
|
+
for (const rel of snap.rels) {
|
|
129
|
+
const before = snap.before.get(rel);
|
|
130
|
+
const after = fileSha(join(snap.checkout, rel));
|
|
131
|
+
if (before === false || after === false)
|
|
132
|
+
continue;
|
|
133
|
+
const vouched = !!snap.prior && Object.hasOwn(snap.prior, rel) && snap.prior[rel] === before;
|
|
134
|
+
if (vouched || (before !== after && !snap.dirty.has(rel)))
|
|
135
|
+
files[rel] = after ?? null;
|
|
136
|
+
}
|
|
137
|
+
// Nothing init wrote, and nothing there before: no record at all.
|
|
138
|
+
const kept = Object.keys(files);
|
|
139
|
+
if (!kept.length && !snap.prior)
|
|
140
|
+
return kept;
|
|
141
|
+
writePrivate(installRecordPath(snap.checkout, env), `${JSON.stringify({ v: 1, checkout: real(snap.checkout), files }, null, 2)}\n`);
|
|
142
|
+
return kept;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=install-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-record.js","sourceRoot":"","sources":["../../src/init/install-record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The person's answer to init's list, and whether the agent showed that
|
|
3
|
+
* list (design 4.9 steps 3 and 4). Shared by the PreToolUse keep gate and
|
|
4
|
+
* `trail keep`'s CLI half, so both decide the same way. No imports beyond
|
|
5
|
+
* node: the gate loads this on the hook's path.
|
|
6
|
+
*
|
|
7
|
+
* - `parseKeepAnswer`: whole-message forms only. Numbers joined by spaces,
|
|
8
|
+
* commas, `and` or `&`, with `keep`, `just`, `only` or `please` around
|
|
9
|
+
* them; `all`; `none`. Anything else ("sure do whats recommended here",
|
|
10
|
+
* "the release one") is no answer: Trail needs the numbers the person typed.
|
|
11
|
+
* - `replyNamesList`: every item is named as `{n}.` followed by its name
|
|
12
|
+
* words, in any wording around them, so a list of the agent's own whose
|
|
13
|
+
* numbers point at other items is not the list (R22).
|
|
14
|
+
*/
|
|
15
|
+
import type { KeepAnswer } from './types.js';
|
|
16
|
+
/** The answer a typed message gives, or null when it isn't one of the whole-message forms. */
|
|
17
|
+
export declare function parseKeepAnswer(typed: string): KeepAnswer | null;
|
|
18
|
+
/**
|
|
19
|
+
* Every item of the list is named in `reply` as `{n}.` followed by its name words (4.9 step 3, R22), and no number
|
|
20
|
+
* of the list is followed by another item's name words without its own (b6 review): "I'd pick 1. no-timeout" after
|
|
21
|
+
* the real list would point the person's "1" at item 2.
|
|
22
|
+
*/
|
|
23
|
+
export declare function replyNamesList(reply: string, items: Array<{
|
|
24
|
+
n: number;
|
|
25
|
+
nameWords: string[];
|
|
26
|
+
}>): boolean;
|
|
27
|
+
export declare function leadWords(line: string): string[];
|
|
28
|
+
/** The command's numbers are within what the person typed (4.9 step 5). */
|
|
29
|
+
export declare function withinAnswer(asked: KeepAnswer, typed: KeepAnswer, listed: number[]): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* The words `trail keep` gets from the text after it, the way the shell hands them over: redirections dropped, and
|
|
32
|
+
* everything from the first `;`, `&`, `|`, `)`, quote, backtick or newline on is another command (`| cat`,
|
|
33
|
+
* `; echo done`, `&& echo ok`), returned as `more`. Shared by the PreToolUse gate and the CLI half (fix-lab5).
|
|
34
|
+
*/
|
|
35
|
+
export declare function keepWords(text: string): {
|
|
36
|
+
words: string[];
|
|
37
|
+
more: string;
|
|
38
|
+
};
|
|
39
|
+
/** `trail keep`'s own arguments as an answer: numbers, `all` or `none`; null for anything else. Shell noise in them is read past (keepWords). */
|
|
40
|
+
export declare function keepArgs(args: string[]): KeepAnswer | null;
|
|
41
|
+
/** "1 and 3", "all", "none": the typed answer in words for a deny reason. */
|
|
42
|
+
export declare function answerWords(a: KeepAnswer): string;
|
|
43
|
+
//# sourceMappingURL=keep-answer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keep-answer.d.ts","sourceRoot":"","sources":["../../src/init/keep-answer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAUhE;AAgCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,GAAG,OAAO,CAMvG;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhD;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAO5F;AAQD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAKzE;AAED,iJAAiJ;AACjJ,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI,CAO1D;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAKjD"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
const NUMS = /^(?:(?:please|keep|just|only)\s+)*(\d{1,2}(?:\s*(?:,|&|\band\b|\s)\s*\d{1,2})*)(?:\s+please)?$/;
|
|
2
|
+
const ALL = /^(?:please\s+)?(?:keep\s+)?all(?:\s+of\s+them)?(?:\s+please)?$/;
|
|
3
|
+
const NONE = /^(?:(?:keep\s+)?(?:none|nothing)|no)$/;
|
|
4
|
+
/** The answer a typed message gives, or null when it isn't one of the whole-message forms. */
|
|
5
|
+
export function parseKeepAnswer(typed) {
|
|
6
|
+
if (typeof typed !== 'string' || typed.length > 200)
|
|
7
|
+
return null;
|
|
8
|
+
const t = typed.toLowerCase().replace(/[‘’]/g, "'").replace(/\s+/g, ' ').trim().replace(/[.!]+$/, '').trim();
|
|
9
|
+
if (!t)
|
|
10
|
+
return null;
|
|
11
|
+
if (NONE.test(t))
|
|
12
|
+
return { none: true };
|
|
13
|
+
if (ALL.test(t))
|
|
14
|
+
return { all: true };
|
|
15
|
+
const m = NUMS.exec(t);
|
|
16
|
+
if (!m)
|
|
17
|
+
return null;
|
|
18
|
+
const numbers = [...new Set((m[1].match(/\d{1,2}/g) ?? []).map(Number))].filter((n) => n >= 1).sort((a, b) => a - b);
|
|
19
|
+
return numbers.length ? { numbers } : null;
|
|
20
|
+
}
|
|
21
|
+
/** Words as the list check compares them: lowercase, curly quotes straightened, split like the candidates' lead words. */
|
|
22
|
+
function tokens(text) {
|
|
23
|
+
return text.toLowerCase().replace(/[‘’]/g, "'").split(/[^a-z0-9'+-]+/).map((w) => w.replace(/^'+|'+$/g, '')).filter(Boolean);
|
|
24
|
+
}
|
|
25
|
+
/** Whether `want` appears in `have` in order (other words may sit between). */
|
|
26
|
+
function inOrder(have, want) {
|
|
27
|
+
let k = 0;
|
|
28
|
+
for (const w of have)
|
|
29
|
+
if (k < want.length && w === want[k].toLowerCase().replace(/^'+|'+$/g, ''))
|
|
30
|
+
k++;
|
|
31
|
+
return k === want.length;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The text after each `{n}.` marker up to the next marker or line end. A marker is a number of one or two digits
|
|
35
|
+
* and a dot that is not part of a longer number (`1.` yes, `1.2` and `21.` for 1 no).
|
|
36
|
+
*/
|
|
37
|
+
function segments(text) {
|
|
38
|
+
const out = new Map();
|
|
39
|
+
for (const line of text.split('\n')) {
|
|
40
|
+
const marks = [...line.matchAll(/(?:^|[^\w.])(\d{1,2})\.(?!\d)/g)];
|
|
41
|
+
marks.forEach((m, k) => {
|
|
42
|
+
const start = m.index + m[0].length;
|
|
43
|
+
const end = k + 1 < marks.length ? marks[k + 1].index : line.length;
|
|
44
|
+
const n = Number(m[1]);
|
|
45
|
+
out.set(n, [...(out.get(n) ?? []), tokens(line.slice(start, end))]);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Every item of the list is named in `reply` as `{n}.` followed by its name words (4.9 step 3, R22), and no number
|
|
52
|
+
* of the list is followed by another item's name words without its own (b6 review): "I'd pick 1. no-timeout" after
|
|
53
|
+
* the real list would point the person's "1" at item 2.
|
|
54
|
+
*/
|
|
55
|
+
export function replyNamesList(reply, items) {
|
|
56
|
+
if (typeof reply !== 'string' || !items.length)
|
|
57
|
+
return false;
|
|
58
|
+
const segs = segments(reply);
|
|
59
|
+
if (!items.every((it) => it.nameWords.length > 0 && (segs.get(it.n) ?? []).some((s) => inOrder(s, it.nameWords))))
|
|
60
|
+
return false;
|
|
61
|
+
return items.every((it) => (segs.get(it.n) ?? []).every((s) => inOrder(s, it.nameWords)
|
|
62
|
+
|| !items.some((o) => o.n !== it.n && o.nameWords.length > 0 && inOrder(s, o.nameWords))));
|
|
63
|
+
}
|
|
64
|
+
/** Lead words of a preference's line, as the candidates make them (candidates.ts): the first 4 that aren't stop words. */
|
|
65
|
+
const STOP = new Set(['a', 'an', 'the', 'to', 'of', 'in', 'on', 'for', 'and', 'or', 'it', 'this', 'that', 'is', 'be', 'with', 'please', 'here', 'i', 'you', 'we']);
|
|
66
|
+
export function leadWords(line) {
|
|
67
|
+
return line.toLowerCase().split(/[^a-z0-9'+-]+/).filter((w) => w && !STOP.has(w)).slice(0, 4);
|
|
68
|
+
}
|
|
69
|
+
/** The command's numbers are within what the person typed (4.9 step 5). */
|
|
70
|
+
export function withinAnswer(asked, typed, listed) {
|
|
71
|
+
if ('none' in asked)
|
|
72
|
+
return 'none' in typed;
|
|
73
|
+
if ('none' in typed)
|
|
74
|
+
return false;
|
|
75
|
+
if ('all' in typed)
|
|
76
|
+
return true;
|
|
77
|
+
const ok = new Set(typed.numbers);
|
|
78
|
+
const want = 'all' in asked ? listed : asked.numbers;
|
|
79
|
+
return want.length > 0 && want.every((n) => ok.has(n));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A redirection (`2>&1`, `>/dev/null`, `> out.txt`, `&>/dev/null`, `2>>log`, `< /dev/null`): it changes where the
|
|
83
|
+
* output goes, never what `trail keep` is asked. Linear: one pass, no nested repeats.
|
|
84
|
+
*/
|
|
85
|
+
const REDIRECT = /(^|\s)(?:\d+|&)?(?:>>?|<)(?:&(?:\d+|-)|\s*[^\s;&|<>()`'"]+)?(?=\s|$|[;&|)])/g;
|
|
86
|
+
/**
|
|
87
|
+
* The words `trail keep` gets from the text after it, the way the shell hands them over: redirections dropped, and
|
|
88
|
+
* everything from the first `;`, `&`, `|`, `)`, quote, backtick or newline on is another command (`| cat`,
|
|
89
|
+
* `; echo done`, `&& echo ok`), returned as `more`. Shared by the PreToolUse gate and the CLI half (fix-lab5).
|
|
90
|
+
*/
|
|
91
|
+
export function keepWords(text) {
|
|
92
|
+
const s = String(text ?? '').slice(0, 4096).replace(REDIRECT, '$1 ');
|
|
93
|
+
const cut = s.search(/[;&|)`'"\n]/);
|
|
94
|
+
const head = cut < 0 ? s : s.slice(0, cut);
|
|
95
|
+
return { words: head.split(/[\s,]+/).filter(Boolean), more: cut < 0 ? '' : s.slice(cut) };
|
|
96
|
+
}
|
|
97
|
+
/** `trail keep`'s own arguments as an answer: numbers, `all` or `none`; null for anything else. Shell noise in them is read past (keepWords). */
|
|
98
|
+
export function keepArgs(args) {
|
|
99
|
+
const words = keepWords(args.map(String).join(' ')).words.map((w) => w.toLowerCase());
|
|
100
|
+
if (words.length === 1 && words[0] === 'none')
|
|
101
|
+
return { none: true };
|
|
102
|
+
if (words.length === 1 && words[0] === 'all')
|
|
103
|
+
return { all: true };
|
|
104
|
+
if (!words.length || !words.every((w) => /^\d{1,2}$/.test(w)))
|
|
105
|
+
return null;
|
|
106
|
+
const numbers = [...new Set(words.map(Number))].filter((n) => n >= 1).sort((a, b) => a - b);
|
|
107
|
+
return numbers.length === words.length ? { numbers } : null;
|
|
108
|
+
}
|
|
109
|
+
/** "1 and 3", "all", "none": the typed answer in words for a deny reason. */
|
|
110
|
+
export function answerWords(a) {
|
|
111
|
+
if ('none' in a)
|
|
112
|
+
return 'none';
|
|
113
|
+
if ('all' in a)
|
|
114
|
+
return 'all';
|
|
115
|
+
const n = a.numbers.map(String);
|
|
116
|
+
return n.length < 2 ? n.join('') : `${n.slice(0, -1).join(', ')} and ${n[n.length - 1]}`;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=keep-answer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keep-answer.js","sourceRoot":"","sources":["../../src/init/keep-answer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { PreBashDecision } from '../claude/pre-bash.js';
|
|
2
|
+
import { type InitRecord } from './init-record.js';
|
|
3
|
+
import type { KeepAnswer } from './types.js';
|
|
4
|
+
export { TAIL_BYTES } from './keep-list.js';
|
|
5
|
+
export declare function isKeepCommand(command: string): boolean;
|
|
6
|
+
/** Whether a shell command runs `trail init`. */
|
|
7
|
+
export declare function isInitCommand(command: string): boolean;
|
|
8
|
+
export declare const WAIT = "Wait for the person's answer before running trail keep: show them the list trail init printed, as written, and run trail keep only with the numbers they choose. Don't choose for them.";
|
|
9
|
+
export declare const CUT = "Show the person the list trail init printed: run trail init again without a pipe or redirect, then ask them.";
|
|
10
|
+
export declare const SHOW_LIST = "Show the person the whole list as trail init printed it, numbers and names, then ask which to keep.";
|
|
11
|
+
export declare const NEED_NUMBERS = "Trail needs the numbers the person typed. Ask them which numbers to keep, or none.";
|
|
12
|
+
export declare const NOT_THIS_LIST = "That list isn't the one waiting in this repo: run trail init again, show the person its list as written, then ask them.";
|
|
13
|
+
export declare const CHANGED = "This session changed Trail's own files after the list, so Trail won't keep anything from it. Run trail init again and show the person its list.";
|
|
14
|
+
/**
|
|
15
|
+
* What `trail keep` asks for in this command, or null when its words aren't numbers, all or none. `trail keep 1 2>&1`
|
|
16
|
+
* and `trail keep 1 | cat` ask for 1 (fix-lab5); a second `trail keep` asking for something else is no answer.
|
|
17
|
+
*/
|
|
18
|
+
export declare function keepCommandAnswer(command: string): KeepAnswer | null;
|
|
19
|
+
/** `trail keep --help` or `-h`, with or without a redirect or a reader after it: usage only, never denied (B4, P36). Not when another `trail keep` is chained on. */
|
|
20
|
+
export declare function keepHelp(command: string): boolean;
|
|
21
|
+
/** The pending items with their name words; a preference's rebuilt from the person's line, read again by its pointer. */
|
|
22
|
+
export declare function pendingNames(r: InitRecord, env: NodeJS.ProcessEnv): Array<{
|
|
23
|
+
n: number;
|
|
24
|
+
nameWords: string[];
|
|
25
|
+
}>;
|
|
26
|
+
/** receipts/<session-id>.keep.json */
|
|
27
|
+
export declare function keepReceiptPath(sessionId: string, env?: NodeJS.ProcessEnv): string;
|
|
28
|
+
/** The decision for a Bash call: deny a `trail keep` the person hasn't answered for, null (and a receipt) to let it run. Never throws. */
|
|
29
|
+
export declare function keepDecision(input: unknown, _dir: string, env?: NodeJS.ProcessEnv, now?: Date): PreBashDecision | null;
|
|
30
|
+
//# sourceMappingURL=keep-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keep-gate.d.ts","sourceRoot":"","sources":["../../src/init/keep-gate.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAIpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAQ5C,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,eAAO,MAAM,IAAI,4LAC0K,CAAC;AAC5L,eAAO,MAAM,GAAG,iHAAiH,CAAC;AAClI,eAAO,MAAM,SAAS,wGAAwG,CAAC;AAC/H,eAAO,MAAM,YAAY,uFAAuF,CAAC;AACjH,eAAO,MAAM,aAAa,4HAA4H,CAAC;AACvJ,eAAO,MAAM,OAAO,oJAAoJ,CAAC;AAUzK;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAMpE;AAED,qKAAqK;AACrK,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED,yHAAyH;AACzH,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAO7G;AAKD,sCAAsC;AACtC,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAElF;AAgBD,0IAA0I;AAC1I,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,GAAG,GAAE,IAAiB,GAAG,eAAe,GAAG,IAAI,CA2D/I"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The PreToolUse check for `trail keep` (design 4.9, PreToolUse half): an
|
|
3
|
+
* agent may keep init's items only with the numbers the person typed after
|
|
4
|
+
* seeing the list.
|
|
5
|
+
*
|
|
6
|
+
* 1. `trail keep --help` / `-h` pass, nothing else checked (B4, P36).
|
|
7
|
+
* 2. The list (keep-list.ts, R22): the newest clean `trail init` call's own
|
|
8
|
+
* result, or this session's handover offset from the init record. A
|
|
9
|
+
* `trail init | tail` (or a redirect) is denied with words that say to run
|
|
10
|
+
* it plainly. No list: phase 0's wait reason.
|
|
11
|
+
* 3. The agent's text between the list and the person's next typed line
|
|
12
|
+
* names every pending item as `{n}.` and its name words.
|
|
13
|
+
* 4. That typed line is a whole-message answer (numbers, all, none).
|
|
14
|
+
* 5. The command's numbers are within it.
|
|
15
|
+
* 6. On allow it writes the KeepReceipt `trail keep`'s CLI half needs (R23)
|
|
16
|
+
* and returns null. The write is idempotent: both registered copies of the
|
|
17
|
+
* hook may run it, and the second finds the same receipt there.
|
|
18
|
+
*
|
|
19
|
+
* Loaded lazily by `pre-bash.ts` `keepReply`, only for a command that says
|
|
20
|
+
* `keep`. Fails open (null) on a payload that isn't Claude Code's or a
|
|
21
|
+
* transcript it can't read; then no receipt is written and the CLI holds.
|
|
22
|
+
*/
|
|
23
|
+
import { createHash } from 'node:crypto';
|
|
24
|
+
import { detectHost } from '../trace/host.js';
|
|
25
|
+
import { readJsonSafe, trailPath, writePrivate } from '../util/private-fs.js';
|
|
26
|
+
import { listInitRecords } from './init-record.js';
|
|
27
|
+
import { answerWords, keepArgs, keepWords, leadWords, parseKeepAnswer, replyNamesList, withinAnswer } from './keep-answer.js';
|
|
28
|
+
import { afterList, findList, typedLine } from './keep-list.js';
|
|
29
|
+
import { prefText } from './prefs.js';
|
|
30
|
+
export { TAIL_BYTES } from './keep-list.js';
|
|
31
|
+
/** `trail <sub> …` however it's spelled: through a path, npx, node on the built file, inside `bash -c "…"`, after env assignments or `cd … &&`, with global options before the subcommand. */
|
|
32
|
+
const run = (sub) => new RegExp(`(?:^|[\\s;&|(\`'"/=])(?:trail|graft|trail-code)(?:\\.[cm]?[jt]s)?['"]?\\s+(?:--?[\\w-]+(?:=\\S+|\\s+(?!${sub}\\b)[^\\s-]\\S*)?\\s+)*${sub}(?=$|[\\s;&|)'"\`])`);
|
|
33
|
+
const KEEP = run('keep');
|
|
34
|
+
const INIT = run('init');
|
|
35
|
+
export function isKeepCommand(command) {
|
|
36
|
+
return KEEP.test(command);
|
|
37
|
+
}
|
|
38
|
+
/** Whether a shell command runs `trail init`. */
|
|
39
|
+
export function isInitCommand(command) {
|
|
40
|
+
return INIT.test(command);
|
|
41
|
+
}
|
|
42
|
+
export const WAIT = "Wait for the person's answer before running trail keep: show them the list trail init printed, as written, and run trail keep only with the numbers they choose. Don't choose for them.";
|
|
43
|
+
export const CUT = 'Show the person the list trail init printed: run trail init again without a pipe or redirect, then ask them.';
|
|
44
|
+
export const SHOW_LIST = 'Show the person the whole list as trail init printed it, numbers and names, then ask which to keep.';
|
|
45
|
+
export const NEED_NUMBERS = 'Trail needs the numbers the person typed. Ask them which numbers to keep, or none.';
|
|
46
|
+
export const NOT_THIS_LIST = "That list isn't the one waiting in this repo: run trail init again, show the person its list as written, then ask them.";
|
|
47
|
+
export const CHANGED = "This session changed Trail's own files after the list, so Trail won't keep anything from it. Run trail init again and show the person its list.";
|
|
48
|
+
const typedOnly = (a) => `The person typed ${answerWords(a)}; keep only those.`;
|
|
49
|
+
/** What `trail keep` asks for in this command, or null when its words aren't numbers, all or none. */
|
|
50
|
+
/** Every `trail keep` in the command, as the words each one gets (keepWords: redirections and trailing commands read past). */
|
|
51
|
+
function keepCalls(command) {
|
|
52
|
+
const all = new RegExp(KEEP.source, 'g');
|
|
53
|
+
return [...String(command).slice(0, 64 * 1024).matchAll(all)].slice(0, 8).map((m) => keepWords(command.slice(m.index + m[0].length)).words);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* What `trail keep` asks for in this command, or null when its words aren't numbers, all or none. `trail keep 1 2>&1`
|
|
57
|
+
* and `trail keep 1 | cat` ask for 1 (fix-lab5); a second `trail keep` asking for something else is no answer.
|
|
58
|
+
*/
|
|
59
|
+
export function keepCommandAnswer(command) {
|
|
60
|
+
const calls = keepCalls(command);
|
|
61
|
+
if (!calls.length)
|
|
62
|
+
return null;
|
|
63
|
+
const answers = calls.map((w) => keepArgs(w));
|
|
64
|
+
const first = answers[0];
|
|
65
|
+
return first && answers.every((a) => JSON.stringify(a) === JSON.stringify(first)) ? first : null;
|
|
66
|
+
}
|
|
67
|
+
/** `trail keep --help` or `-h`, with or without a redirect or a reader after it: usage only, never denied (B4, P36). Not when another `trail keep` is chained on. */
|
|
68
|
+
export function keepHelp(command) {
|
|
69
|
+
const calls = keepCalls(command);
|
|
70
|
+
return calls.length === 1 && calls[0].length === 1 && /^(?:--help|-h)$/.test(calls[0][0]);
|
|
71
|
+
}
|
|
72
|
+
/** The pending items with their name words; a preference's rebuilt from the person's line, read again by its pointer. */
|
|
73
|
+
export function pendingNames(r, env) {
|
|
74
|
+
return r.pending.map((p) => {
|
|
75
|
+
if (p.kind !== 'preference')
|
|
76
|
+
return { n: p.n, nameWords: p.nameWords };
|
|
77
|
+
const ref = p.pref?.refs[0];
|
|
78
|
+
const text = ref ? typedLine(ref, env) : null;
|
|
79
|
+
return { n: p.n, nameWords: text ? leadWords(prefText(text).slice(0, 120)) : [] };
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const fileId = (sessionId) => /^[A-Za-z0-9_-][A-Za-z0-9._-]{0,127}$/.test(sessionId) ? sessionId : `h-${createHash('sha256').update(sessionId).digest('hex').slice(0, 16)}`;
|
|
83
|
+
/** receipts/<session-id>.keep.json */
|
|
84
|
+
export function keepReceiptPath(sessionId, env) {
|
|
85
|
+
return trailPath(env, 'receipts', `${fileId(sessionId)}.keep.json`);
|
|
86
|
+
}
|
|
87
|
+
const sameAnswer = (a, b) => a.session === b.session && a.toolUseId === b.toolUseId && a.list.offset === b.list.offset && a.list.initRunId === b.list.initRunId
|
|
88
|
+
&& a.typed.offset === b.typed.offset && a.typed.lineSha === b.typed.lineSha && a.replySha === b.replySha && JSON.stringify(a.numbers) === JSON.stringify(b.numbers);
|
|
89
|
+
/** Writes the receipt unless the same one, unused, is already there (the other hook copy wrote it). */
|
|
90
|
+
function writeKeepReceipt(r, env) {
|
|
91
|
+
const path = keepReceiptPath(r.session, env);
|
|
92
|
+
const cur = readJsonSafe(path);
|
|
93
|
+
if (cur && cur.usedAt === null && sameAnswer(cur, r))
|
|
94
|
+
return;
|
|
95
|
+
writePrivate(path, `${JSON.stringify(r, null, 2)}\n`);
|
|
96
|
+
}
|
|
97
|
+
const deny = (reason) => ({ permissionDecision: 'deny', reason });
|
|
98
|
+
/** The decision for a Bash call: deny a `trail keep` the person hasn't answered for, null (and a receipt) to let it run. Never throws. */
|
|
99
|
+
export function keepDecision(input, _dir, env = process.env, now = new Date()) {
|
|
100
|
+
try {
|
|
101
|
+
if (!input || typeof input !== 'object' || Array.isArray(input))
|
|
102
|
+
return null;
|
|
103
|
+
const payload = input;
|
|
104
|
+
const command = payload.tool_input?.command;
|
|
105
|
+
if (typeof command !== 'string' || !isKeepCommand(command))
|
|
106
|
+
return null;
|
|
107
|
+
// Another host's transcript isn't Claude Code's to read.
|
|
108
|
+
if (detectHost(payload).host !== 'claude')
|
|
109
|
+
return null;
|
|
110
|
+
if (keepHelp(command) && !isInitCommand(command))
|
|
111
|
+
return null;
|
|
112
|
+
if (isInitCommand(command))
|
|
113
|
+
return deny(WAIT);
|
|
114
|
+
const path = payload.transcript_path;
|
|
115
|
+
const session = typeof payload.session_id === 'string' ? payload.session_id : '';
|
|
116
|
+
if (typeof path !== 'string' || !path || !session)
|
|
117
|
+
return null;
|
|
118
|
+
// Every record on this machine, not the cwd's repo: resolving the repo would load the notes layer on the hook's path.
|
|
119
|
+
const records = listInitRecords(env);
|
|
120
|
+
const handed = records.filter((x) => x.record.handover?.session === session && x.record.pending.length && x.record.pendingFrom)
|
|
121
|
+
.sort((a, b) => b.record.handover.offset - a.record.handover.offset)[0];
|
|
122
|
+
const found = findList(path, isInitCommand, handed ? { offset: handed.record.handover.offset } : null);
|
|
123
|
+
if (!found)
|
|
124
|
+
return null;
|
|
125
|
+
if (found.cut !== null)
|
|
126
|
+
return deny(CUT);
|
|
127
|
+
const list = found.list;
|
|
128
|
+
if (!list)
|
|
129
|
+
return deny(WAIT);
|
|
130
|
+
let record = null;
|
|
131
|
+
let items = [];
|
|
132
|
+
if (list.via === 'handover') {
|
|
133
|
+
record = handed.record;
|
|
134
|
+
items = pendingNames(record, env);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// The record whose waiting list is the one this call printed, newest first.
|
|
138
|
+
for (const x of records.filter((r) => r.record.pending.length && r.record.pendingFrom).sort((a, b) => String(b.record.shownAt).localeCompare(String(a.record.shownAt)))) {
|
|
139
|
+
const names = pendingNames(x.record, env);
|
|
140
|
+
if (replyNamesList(list.text, names)) {
|
|
141
|
+
record = x.record;
|
|
142
|
+
items = names;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (!record || !record.pendingFrom)
|
|
148
|
+
return deny(NOT_THIS_LIST);
|
|
149
|
+
const after = afterList(path, list, env);
|
|
150
|
+
if (!after)
|
|
151
|
+
return null;
|
|
152
|
+
if (after.tampered)
|
|
153
|
+
return deny(CHANGED);
|
|
154
|
+
if (!after.typed)
|
|
155
|
+
return deny(WAIT);
|
|
156
|
+
if (!replyNamesList(after.reply, items))
|
|
157
|
+
return deny(SHOW_LIST);
|
|
158
|
+
const typed = parseKeepAnswer(after.typed.text);
|
|
159
|
+
if (!typed)
|
|
160
|
+
return deny(NEED_NUMBERS);
|
|
161
|
+
const asked = keepCommandAnswer(command);
|
|
162
|
+
if (!asked)
|
|
163
|
+
return deny(NEED_NUMBERS);
|
|
164
|
+
if (!withinAnswer(asked, typed, record.pending.map((p) => p.n)))
|
|
165
|
+
return deny(typedOnly(typed));
|
|
166
|
+
writeKeepReceipt({
|
|
167
|
+
v: 1, kind: 'keep', session, transcriptPath: path, toolUseId: typeof payload.tool_use_id === 'string' ? payload.tool_use_id : '',
|
|
168
|
+
list: { offset: list.offset, initRunId: record.pendingFrom, via: list.via },
|
|
169
|
+
typed: { offset: after.typed.offset, lineSha: after.typed.lineSha }, replySha: after.replySha,
|
|
170
|
+
numbers: 'none' in asked ? 'none' : 'all' in asked ? 'all' : asked.numbers, at: now.toISOString(), verdict: 'live', usedAt: null,
|
|
171
|
+
}, env);
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=keep-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keep-gate.js","sourceRoot":"","sources":["../../src/init/keep-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** How much of the transcript is read: the list is printed moments before the answer. */
|
|
2
|
+
export declare const TAIL_BYTES: number;
|
|
3
|
+
/** Whole lines with their byte offsets, from `from` (a line start) or the last `bytes` of the file; null when unreadable. */
|
|
4
|
+
export declare function linesFrom(path: string, opts: {
|
|
5
|
+
from?: number;
|
|
6
|
+
bytes?: number;
|
|
7
|
+
}): Array<{
|
|
8
|
+
line: string;
|
|
9
|
+
offset: number;
|
|
10
|
+
}> | null;
|
|
11
|
+
/**
|
|
12
|
+
* A Bash command that only runs `trail init`: Trail's own (1a's `onlyTrail`), with no pipe that could cut its list,
|
|
13
|
+
* and nothing else beside it but leading `cd`s (b6 review): `trail init; echo …`, `echo …; trail init --help` or
|
|
14
|
+
* `trail init && cat saved.txt` would put text of the agent's own in the same result as the list.
|
|
15
|
+
*/
|
|
16
|
+
export declare function initOnly(command: string): boolean;
|
|
17
|
+
export interface ListAt {
|
|
18
|
+
via: 'init-call' | 'handover';
|
|
19
|
+
/** The tool_result line's offset (init call), or the handover's recorded offset. */
|
|
20
|
+
offset: number;
|
|
21
|
+
/** The tool result's text (init call); '' for a handover. */
|
|
22
|
+
text: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The newest list in the transcript's tail: a clean `trail init` call's result, or this session's handover offset.
|
|
26
|
+
* `cut` when the newest `trail init` call is newer than any list and its output is not a list (a pipe, a redirect,
|
|
27
|
+
* another command with it). Null when there is none, or the transcript can't be read.
|
|
28
|
+
*/
|
|
29
|
+
export declare function findList(path: string, isInit: (command: string) => boolean, handover: {
|
|
30
|
+
offset: number;
|
|
31
|
+
} | null): {
|
|
32
|
+
list: ListAt | null;
|
|
33
|
+
cut: number | null;
|
|
34
|
+
} | null;
|
|
35
|
+
export interface AfterList {
|
|
36
|
+
/** The agent's text between the list and the person's newest typed line, joined by newlines. */
|
|
37
|
+
reply: string;
|
|
38
|
+
replySha: string;
|
|
39
|
+
typed: {
|
|
40
|
+
offset: number;
|
|
41
|
+
lineSha: string;
|
|
42
|
+
text: string;
|
|
43
|
+
} | null;
|
|
44
|
+
/** A call after the list wrote Trail's or the host's files. */
|
|
45
|
+
tampered: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* What follows the list: read from its offset (an init call's result line is skipped). The answer is the person's
|
|
49
|
+
* newest typed line after the list (b6 review): the relay itself invites "Show one in full", so a first line that asks
|
|
50
|
+
* to see an item must not lock the list; a later change of mind ("actually none") wins over earlier numbers. The
|
|
51
|
+
* reply is the agent's text from the list up to that line.
|
|
52
|
+
*/
|
|
53
|
+
export declare function afterList(path: string, list: {
|
|
54
|
+
offset: number;
|
|
55
|
+
via: 'init-call' | 'handover';
|
|
56
|
+
}, env?: NodeJS.ProcessEnv): AfterList | null;
|
|
57
|
+
/**
|
|
58
|
+
* The person's line a pointer names, read again: replay-runs' `typedAt` rules (a transcript in Claude Code's projects
|
|
59
|
+
* folder reached with no link, the line at the offset with the same sha, a line the person typed), in this light
|
|
60
|
+
* file so the hook's keep check never loads the replay and compile (R11). Null otherwise.
|
|
61
|
+
*/
|
|
62
|
+
export declare function typedLine(ref: {
|
|
63
|
+
t: string;
|
|
64
|
+
o: number;
|
|
65
|
+
s: string;
|
|
66
|
+
}, env?: NodeJS.ProcessEnv): string | null;
|
|
67
|
+
//# sourceMappingURL=keep-list.d.ts.map
|