@nanonets/graft 0.23.1 → 0.24.1
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 +4 -4
- package/dist/ai/crux.d.ts +31 -3
- package/dist/ai/crux.d.ts.map +1 -1
- package/dist/ai/crux.js +88 -10
- package/dist/ai/crux.js.map +1 -1
- package/dist/ai/llm/openai.d.ts +101 -0
- package/dist/ai/llm/openai.d.ts.map +1 -1
- package/dist/ai/llm/openai.js +396 -6
- package/dist/ai/llm/openai.js.map +1 -1
- package/dist/ai/llm/recover-tool.d.ts +2 -0
- package/dist/ai/llm/recover-tool.d.ts.map +1 -1
- package/dist/ai/llm/recover-tool.js +1 -1
- package/dist/ai/llm/recover-tool.js.map +1 -1
- package/dist/ai/synthesize.d.ts.map +1 -1
- package/dist/ai/synthesize.js +100 -1
- package/dist/ai/synthesize.js.map +1 -1
- 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/claude/format.js +1 -1
- 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/hooks.d.ts +0 -18
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +24 -77
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.js +3 -3
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/note-signals.d.ts +28 -0
- package/dist/claude/note-signals.d.ts.map +1 -0
- package/dist/claude/note-signals.js +325 -0
- package/dist/claude/note-signals.js.map +1 -0
- package/dist/claude/shim-template.d.ts.map +1 -1
- package/dist/claude/shim-template.js +10 -4
- package/dist/claude/shim-template.js.map +1 -1
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +49 -18
- package/dist/claude/skill-template.js.map +1 -1
- 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/state.d.ts +4 -3
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/sync-run.js +1 -1
- package/dist/claude/sync-run.js.map +1 -1
- package/dist/cli-picker.d.ts +36 -5
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +60 -13
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +406 -64
- package/dist/cli.js.map +1 -1
- package/dist/cloud/lookup-activity.d.ts +16 -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.map +1 -1
- package/dist/cloud/nudge.js +3 -0
- package/dist/cloud/nudge.js.map +1 -1
- package/dist/cloud/onboarding.d.ts +237 -0
- package/dist/cloud/onboarding.d.ts.map +1 -0
- package/dist/cloud/onboarding.js +536 -0
- package/dist/cloud/onboarding.js.map +1 -0
- package/dist/cloud/pair.d.ts +76 -0
- package/dist/cloud/pair.d.ts.map +1 -0
- package/dist/cloud/pair.js +249 -0
- package/dist/cloud/pair.js.map +1 -0
- package/dist/cloud/workspace-sync.d.ts +10 -2
- package/dist/cloud/workspace-sync.d.ts.map +1 -1
- package/dist/cloud/workspace-sync.js +119 -7
- package/dist/cloud/workspace-sync.js.map +1 -1
- package/dist/cloud/workspace.d.ts +22 -1
- package/dist/cloud/workspace.d.ts.map +1 -1
- package/dist/cloud/workspace.js +16 -1
- package/dist/cloud/workspace.js.map +1 -1
- package/dist/context/batches.d.ts +29 -0
- package/dist/context/batches.d.ts.map +1 -0
- package/dist/context/batches.js +130 -0
- package/dist/context/batches.js.map +1 -0
- package/dist/context/build.d.ts +7 -2
- package/dist/context/build.d.ts.map +1 -1
- package/dist/context/build.js +84 -50
- package/dist/context/build.js.map +1 -1
- package/dist/context/node-file.d.ts.map +1 -1
- package/dist/context/node-file.js +41 -4
- package/dist/context/node-file.js.map +1 -1
- package/dist/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -0
- package/dist/engine.js.map +1 -1
- package/dist/graph/cards.d.ts.map +1 -1
- package/dist/graph/cards.js +9 -4
- package/dist/graph/cards.js.map +1 -1
- package/dist/graph/enrich.d.ts.map +1 -1
- package/dist/graph/enrich.js +8 -3
- package/dist/graph/enrich.js.map +1 -1
- package/dist/graph/generic.d.ts.map +1 -1
- package/dist/graph/generic.js +207 -6
- package/dist/graph/generic.js.map +1 -1
- package/dist/graph/lsp/client.d.ts +18 -0
- package/dist/graph/lsp/client.d.ts.map +1 -1
- package/dist/graph/lsp/client.js +40 -2
- package/dist/graph/lsp/client.js.map +1 -1
- package/dist/graph/lsp/enrich.d.ts.map +1 -1
- package/dist/graph/lsp/enrich.js +9 -1
- package/dist/graph/lsp/enrich.js.map +1 -1
- package/dist/graph/lsp/registry.d.ts +7 -0
- package/dist/graph/lsp/registry.d.ts.map +1 -1
- package/dist/graph/lsp/registry.js +27 -2
- package/dist/graph/lsp/registry.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/graph/queries/gleam.scm +51 -0
- package/dist/graph/resolve.d.ts.map +1 -1
- package/dist/graph/resolve.js +65 -3
- package/dist/graph/resolve.js.map +1 -1
- package/dist/graph/workspace-cli.d.ts +2 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -1
- package/dist/graph/workspace-cli.js +1 -1
- package/dist/graph/workspace-cli.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 +38 -3
- package/dist/hosts/claude-global.js.map +1 -1
- 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/plain-file.d.ts +11 -0
- package/dist/init/plain-file.d.ts.map +1 -0
- package/dist/init/plain-file.js +80 -0
- package/dist/init/plain-file.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/branches.d.ts +7 -1
- package/dist/notes/branches.d.ts.map +1 -1
- package/dist/notes/branches.js +31 -3
- package/dist/notes/branches.js.map +1 -1
- package/dist/notes/cold-start.d.ts +42 -3
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +144 -24
- package/dist/notes/cold-start.js.map +1 -1
- package/dist/notes/credit.d.ts +37 -0
- package/dist/notes/credit.d.ts.map +1 -0
- package/dist/notes/credit.js +78 -0
- package/dist/notes/credit.js.map +1 -0
- 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/find-notes.d.ts +17 -0
- package/dist/notes/find-notes.d.ts.map +1 -0
- package/dist/notes/find-notes.js +48 -0
- package/dist/notes/find-notes.js.map +1 -0
- package/dist/notes/flatten.d.ts +31 -0
- package/dist/notes/flatten.d.ts.map +1 -0
- package/dist/notes/flatten.js +73 -0
- package/dist/notes/flatten.js.map +1 -0
- package/dist/notes/git-facts.d.ts +2 -0
- package/dist/notes/git-facts.d.ts.map +1 -1
- package/dist/notes/git-facts.js +6 -0
- package/dist/notes/git-facts.js.map +1 -1
- 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/home.d.ts +24 -6
- package/dist/notes/home.d.ts.map +1 -1
- package/dist/notes/home.js +82 -15
- package/dist/notes/home.js.map +1 -1
- package/dist/notes/learning-fields.d.ts +102 -0
- package/dist/notes/learning-fields.d.ts.map +1 -0
- package/dist/notes/learning-fields.js +214 -0
- package/dist/notes/learning-fields.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/memory-notes.d.ts +71 -0
- package/dist/notes/memory-notes.d.ts.map +1 -0
- package/dist/notes/memory-notes.js +239 -0
- package/dist/notes/memory-notes.js.map +1 -0
- package/dist/notes/note-gate.d.ts +42 -0
- package/dist/notes/note-gate.d.ts.map +1 -0
- package/dist/notes/note-gate.js +181 -0
- package/dist/notes/note-gate.js.map +1 -0
- package/dist/notes/notes.d.ts +29 -85
- package/dist/notes/notes.d.ts.map +1 -1
- package/dist/notes/notes.js +69 -254
- package/dist/notes/notes.js.map +1 -1
- package/dist/notes/pr-reviews.d.ts +35 -7
- package/dist/notes/pr-reviews.d.ts.map +1 -1
- package/dist/notes/pr-reviews.js +156 -46
- 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/secrets.d.ts +28 -0
- package/dist/notes/secrets.d.ts.map +1 -0
- package/dist/notes/secrets.js +362 -0
- package/dist/notes/secrets.js.map +1 -0
- package/dist/notes/targets.d.ts +37 -0
- package/dist/notes/targets.d.ts.map +1 -0
- package/dist/notes/targets.js +108 -0
- package/dist/notes/targets.js.map +1 -0
- package/dist/notes/team-check.d.ts +22 -0
- package/dist/notes/team-check.d.ts.map +1 -0
- package/dist/notes/team-check.js +130 -0
- package/dist/notes/team-check.js.map +1 -0
- package/dist/notes/trail-home.d.ts +3 -0
- package/dist/notes/trail-home.d.ts.map +1 -0
- package/dist/notes/trail-home.js +12 -0
- package/dist/notes/trail-home.js.map +1 -0
- package/dist/skills/anchors-cli.d.ts +33 -0
- package/dist/skills/anchors-cli.d.ts.map +1 -0
- package/dist/skills/anchors-cli.js +274 -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/answers-prompt.d.ts +13 -0
- package/dist/skills/answers-prompt.d.ts.map +1 -0
- package/dist/skills/answers-prompt.js +83 -0
- package/dist/skills/answers-prompt.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/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 +532 -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 +82 -0
- package/dist/skills/compile-words.d.ts.map +1 -0
- package/dist/skills/compile-words.js +385 -0
- package/dist/skills/compile-words.js.map +1 -0
- package/dist/skills/compile.d.ts +35 -0
- package/dist/skills/compile.d.ts.map +1 -0
- package/dist/skills/compile.js +488 -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/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/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/found-skill.d.ts +35 -0
- package/dist/skills/found-skill.d.ts.map +1 -0
- package/dist/skills/found-skill.js +66 -0
- package/dist/skills/found-skill.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/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/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/never-save.d.ts +5 -0
- package/dist/skills/never-save.d.ts.map +1 -0
- package/dist/skills/never-save.js +158 -0
- package/dist/skills/never-save.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/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/params.d.ts +39 -0
- package/dist/skills/params.d.ts.map +1 -0
- package/dist/skills/params.js +275 -0
- package/dist/skills/params.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/ran-less.d.ts +5 -0
- package/dist/skills/ran-less.d.ts.map +1 -0
- package/dist/skills/ran-less.js +51 -0
- package/dist/skills/ran-less.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/risk-delta.d.ts +32 -0
- package/dist/skills/risk-delta.d.ts.map +1 -0
- package/dist/skills/risk-delta.js +56 -0
- package/dist/skills/risk-delta.js.map +1 -0
- package/dist/skills/risk.d.ts +73 -0
- package/dist/skills/risk.d.ts.map +1 -0
- package/dist/skills/risk.js +396 -0
- package/dist/skills/risk.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 +45 -0
- package/dist/skills/runblock.d.ts.map +1 -0
- package/dist/skills/runblock.js +222 -0
- package/dist/skills/runblock.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/settings.d.ts +38 -0
- package/dist/skills/settings.d.ts.map +1 -0
- package/dist/skills/settings.js +133 -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 +2 -0
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +1 -1
- 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 +422 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.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/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.map +1 -1
- package/dist/telemetry/contract.js +8 -6
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/notice.d.ts.map +1 -1
- package/dist/telemetry/notice.js +3 -1
- package/dist/telemetry/notice.js.map +1 -1
- package/dist/trace/check-reads.d.ts +36 -0
- package/dist/trace/check-reads.d.ts.map +1 -0
- package/dist/trace/check-reads.js +57 -0
- package/dist/trace/check-reads.js.map +1 -0
- package/dist/trace/checks.d.ts +63 -0
- package/dist/trace/checks.d.ts.map +1 -0
- package/dist/trace/checks.js +487 -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/host.d.ts +40 -0
- package/dist/trace/host.d.ts.map +1 -0
- package/dist/trace/host.js +84 -0
- package/dist/trace/host.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/redact.d.ts +8 -0
- package/dist/trace/redact.d.ts.map +1 -0
- package/dist/trace/redact.js +63 -0
- package/dist/trace/redact.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/seen-cache.d.ts +9 -0
- package/dist/trace/seen-cache.d.ts.map +1 -0
- package/dist/trace/seen-cache.js +46 -0
- package/dist/trace/seen-cache.js.map +1 -0
- package/dist/trace/shell-scan.d.ts +52 -0
- package/dist/trace/shell-scan.d.ts.map +1 -0
- package/dist/trace/shell-scan.js +318 -0
- package/dist/trace/shell-scan.js.map +1 -0
- package/dist/trace/shell-words.d.ts +91 -0
- package/dist/trace/shell-words.d.ts.map +1 -0
- package/dist/trace/shell-words.js +558 -0
- package/dist/trace/shell-words.js.map +1 -0
- package/dist/trace/shell.d.ts +91 -0
- package/dist/trace/shell.d.ts.map +1 -0
- package/dist/trace/shell.js +435 -0
- package/dist/trace/shell.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/state.d.ts +27 -0
- package/dist/trace/state.d.ts.map +1 -0
- package/dist/trace/state.js +98 -0
- package/dist/trace/state.js.map +1 -0
- package/dist/trace/tamper-code.d.ts +9 -0
- package/dist/trace/tamper-code.d.ts.map +1 -0
- package/dist/trace/tamper-code.js +174 -0
- package/dist/trace/tamper-code.js.map +1 -0
- package/dist/trace/tamper-git.d.ts +12 -0
- package/dist/trace/tamper-git.d.ts.map +1 -0
- package/dist/trace/tamper-git.js +77 -0
- package/dist/trace/tamper-git.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/types.d.ts +477 -0
- package/dist/trace/types.d.ts.map +1 -0
- package/dist/trace/types.js +12 -0
- package/dist/trace/types.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-glob.d.ts +11 -0
- package/dist/trace/walls-glob.d.ts.map +1 -0
- package/dist/trace/walls-glob.js +264 -0
- package/dist/trace/walls-glob.js.map +1 -0
- package/dist/trace/walls-quoted.d.ts +25 -0
- package/dist/trace/walls-quoted.d.ts.map +1 -0
- package/dist/trace/walls-quoted.js +81 -0
- package/dist/trace/walls-quoted.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.d.ts +1 -1
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +4 -1
- package/dist/upkeep.js.map +1 -1
- package/dist/util/actions-folder.d.ts +2 -0
- package/dist/util/actions-folder.d.ts.map +1 -0
- package/dist/util/actions-folder.js +9 -0
- package/dist/util/actions-folder.js.map +1 -0
- package/dist/util/front-matter.d.ts +31 -4
- package/dist/util/front-matter.d.ts.map +1 -1
- package/dist/util/front-matter.js +95 -3
- package/dist/util/front-matter.js.map +1 -1
- package/dist/util/private-file.d.ts +14 -0
- package/dist/util/private-file.d.ts.map +1 -0
- package/dist/util/private-file.js +82 -0
- package/dist/util/private-file.js.map +1 -0
- package/dist/util/private-fs.d.ts +25 -0
- package/dist/util/private-fs.d.ts.map +1 -0
- package/dist/util/private-fs.js +253 -0
- package/dist/util/private-fs.js.map +1 -0
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +3 -0
- 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/dist/viewer/app.js +2 -2
- package/package.json +10 -7
- package/scripts/run-tests.mjs +14 -2
- package/scripts/stamp-telemetry-key.mjs +8 -5
- package/scripts/vendor-grammars.mjs +35 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lessons (design 1.3, 2.3, 4.14 steps 2 and 5, 4.16, spec 7 and 13): one
|
|
3
|
+
* line the person kept on a skill after correcting it, or about a wall a
|
|
4
|
+
* fix got past. A lesson on a skill rides at the end of the skill's run
|
|
5
|
+
* block; a wall lesson (no skill) is a learning of kind `lesson` that only
|
|
6
|
+
* `lastTimeText` reads (R47), every repo for a machine wall and this repo's
|
|
7
|
+
* personal folder for git-https-auth (R49).
|
|
8
|
+
*
|
|
9
|
+
* The correction phrase is deterministic: the person's own clause, a few
|
|
10
|
+
* fixed forms, nothing a model wrote. Lesson text is one flattened line of at
|
|
11
|
+
* most 200 characters, with a leading `[trail]` or `[graft]` gone, when it is
|
|
12
|
+
* written and again when it is read (a lesson file can be edited by hand).
|
|
13
|
+
*
|
|
14
|
+
* Files 0600 in 0700 folders, every path under `trailPath(env)` (0 rule 11),
|
|
15
|
+
* never written through a link.
|
|
16
|
+
*/
|
|
17
|
+
import { randomBytes, createHash } from 'node:crypto';
|
|
18
|
+
import { existsSync, lstatSync, readdirSync, readFileSync } from 'node:fs';
|
|
19
|
+
import { basename, join, relative, sep } from 'node:path';
|
|
20
|
+
import { flatLine } from '../notes/flatten.js';
|
|
21
|
+
import { matter } from '../util/front-matter.js';
|
|
22
|
+
import { EVERY_REPO, liveLessons, newLearningId, readLearningFields, WALL_CLASSES } from '../notes/learning-fields.js';
|
|
23
|
+
import { renderNote } from '../notes/notes.js';
|
|
24
|
+
import { everyRepoDir, writeEveryRepo } from '../notes/every-repo.js';
|
|
25
|
+
import { repoNotesDir } from '../notes/repo-notes-dir.js';
|
|
26
|
+
import { lessonNotesIn } from '../notes/lesson-index.js';
|
|
27
|
+
import { trailPath, writePrivate } from '../util/private-fs.js';
|
|
28
|
+
import { privateDir, safeName, skillsDir } from './store-fs.js';
|
|
29
|
+
import { ownFolder } from './own-folder.js';
|
|
30
|
+
import { gatedKind } from './risk.js';
|
|
31
|
+
import { neverSave } from './never-save.js';
|
|
32
|
+
import { askText } from '../trace/jobs.js';
|
|
33
|
+
export const LESSON_MAX = 200;
|
|
34
|
+
const MAX_FILE = 4 * 1024;
|
|
35
|
+
const MAX_FILES = 50;
|
|
36
|
+
const NEWEST = 3;
|
|
37
|
+
const LESSON_ID = /^ls-[0-9a-f]{6}$/;
|
|
38
|
+
const DATE = /^\d{4}-\d{2}-\d{2}$/;
|
|
39
|
+
const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
40
|
+
/** Walls about the machine, not one repo (spec 2, R49): their lessons hold in every repo. */
|
|
41
|
+
const REPO_WALLS = new Set(['git-https-auth']);
|
|
42
|
+
/** The words a lesson reaches the agent and the person in (J07, 4.14, 4.15). Information, tied to the skill (D88). */
|
|
43
|
+
export const LESSON_COPY = {
|
|
44
|
+
line: 'Lesson (the person, {date}): {text}',
|
|
45
|
+
offerFirst: 'You corrected {skill}: {said}.',
|
|
46
|
+
offerSecond: 'Add a lesson to it, just for you: "{lesson}"? (yes / no)',
|
|
47
|
+
saved: "✓ lesson added to {skill}, just for you · it rides at the end of the skill's steps · undo: trail forget {id}",
|
|
48
|
+
savedWall: '✓ lesson kept, just for you {where} · Trail shows it when "{fixed}" comes back · undo: trail forget {id}',
|
|
49
|
+
};
|
|
50
|
+
const fill = (t, v) => t.replace(/\{(\w+)\}/g, (m, k) => v[k] ?? m);
|
|
51
|
+
/* ----------------------------------------------------------- the phrase */
|
|
52
|
+
/**
|
|
53
|
+
* Words a correction often starts with before its clause ("no, it didn't ..."). Not 'also': that is a form. A `no`
|
|
54
|
+
* that starts "no need to", "no reason to" ... is the clause's own negation, never an interjection: dropping it
|
|
55
|
+
* would turn "no need to run the tests" into the lesson "run the tests" (review).
|
|
56
|
+
*/
|
|
57
|
+
const LEAD = /^(?:(?:no(?!\s+(?:need|reason|point|use|more|longer|way|one|matter|problem|worries|thanks|rush|idea)\b)|nope|oh|hey|wait|actually|but|and|so|ok|okay|hmm|um|well|please|sorry)\b[\s,.!:;-]*)+/i;
|
|
58
|
+
/** A tag question at the clause's end (", right", ", did it"): not part of the lesson. */
|
|
59
|
+
const TAG = /,\s*(?:right|ok(?:ay)?|yeah|yes|no|eh|huh|(?:did|didn'?t|does|doesn'?t|is|isn'?t|was|wasn'?t)\s+(?:it|you))\s*$/i;
|
|
60
|
+
/** Every line break flatLine knows: the person's clause ends at the first (what follows can be a pasted log). */
|
|
61
|
+
const BREAK = /\r\n|[\n\r\u000b\u000c\u0085\u2028\u2029]/;
|
|
62
|
+
/** A comma before a new subject ends the clause ("don't publish locally, it breaks CI"). */
|
|
63
|
+
const NEW_SUBJECT = /,\s*(?:(?:and|but|so|then)\s+)?(?:i|you|we|it|they|he|she|that|this|there|which)\b/i;
|
|
64
|
+
const QUESTION = /^(?:did|does|can|could|would|will|is|are|was|were|why|what|how|where|when|who|which|shall)\b|^(?:do|have|has)\s+(?:you|we|i|they|it)\b/i;
|
|
65
|
+
const MODAL = /^(?:also|need to|needs to|have to|has to|should|must)(?:\s+|$)/i;
|
|
66
|
+
const CLAUSE_MAX = 80;
|
|
67
|
+
const FORMS = [
|
|
68
|
+
{ re: /^(?:it|you)\s+(?:didn'?t|did not|forgot to|never)\s+(.+)$/i, make: (m) => ({ lesson: `${m[1]} too`, kind: 'lesson' }) },
|
|
69
|
+
{
|
|
70
|
+
re: /^(?:you\s+)?(?:also|need to|have to|should|must)\s+(.+)$/i,
|
|
71
|
+
make: (m) => {
|
|
72
|
+
let rest = m[1];
|
|
73
|
+
while (MODAL.test(rest))
|
|
74
|
+
rest = rest.replace(MODAL, '');
|
|
75
|
+
return rest ? { lesson: rest, kind: 'lesson' } : null;
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
{ re: /^(?:don'?t forget to|do not forget to|remember to|make sure to)\s+(.+)$/i, make: (m) => ({ lesson: m[1], kind: 'lesson' }) },
|
|
79
|
+
{ re: /^(?:don'?t|do not|never)\s+(.+)$/i, make: (m) => ({ lesson: `never ${m[1]}`, kind: 'guardrail' }) },
|
|
80
|
+
{
|
|
81
|
+
re: /\bask (?:me )?first\b/i,
|
|
82
|
+
make: (m) => {
|
|
83
|
+
const rest = m.input.replace(/\bask (?:me )?first\b/i, ' ').replace(/^\s*(?:(?:always|please)\s+)*/i, '').replace(/\s+/g, ' ').trim()
|
|
84
|
+
.replace(/^before\s+/i, '').replace(/[\s,.;:!]+$/, '');
|
|
85
|
+
return rest ? { lesson: `ask first before ${rest}`, kind: 'guardrail' } : null;
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
/** The person's clause: leading interjections gone, cut at `.`, `;`, `!`, `?`, a comma before a new subject, or 80 chars. Null for a question. */
|
|
90
|
+
function clauseOf(typed) {
|
|
91
|
+
// The first line with words: a paste after it is not the clause (review). Quoted ('>') lines and fenced blocks are
|
|
92
|
+
// what the person quoted, not their words (askText, b4 review).
|
|
93
|
+
const first = askText(typed.slice(0, 8000)).replace(/[\u2018\u2019]/g, "'").split(BREAK).find((l) => l.trim()) ?? '';
|
|
94
|
+
let t = flatLine(first, 2000).replace(LEAD, '').trim();
|
|
95
|
+
const end = /[.;!?]/.exec(t);
|
|
96
|
+
if (end) {
|
|
97
|
+
if (end[0] === '?')
|
|
98
|
+
return null;
|
|
99
|
+
t = t.slice(0, end.index);
|
|
100
|
+
}
|
|
101
|
+
const sub = NEW_SUBJECT.exec(t);
|
|
102
|
+
if (sub)
|
|
103
|
+
t = t.slice(0, sub.index);
|
|
104
|
+
if (t.length > CLAUSE_MAX) {
|
|
105
|
+
const cut = t.slice(0, CLAUSE_MAX + 1);
|
|
106
|
+
const sp = cut.lastIndexOf(' ');
|
|
107
|
+
t = sp > 0 ? cut.slice(0, sp) : t.slice(0, CLAUSE_MAX);
|
|
108
|
+
}
|
|
109
|
+
t = t.replace(TAG, '').replace(/[\s,:-]+$/, '').trim();
|
|
110
|
+
if (!t || QUESTION.test(t))
|
|
111
|
+
return null;
|
|
112
|
+
return t;
|
|
113
|
+
}
|
|
114
|
+
/** The correction forms of 4.14 step 2, first match. Null when none matches. */
|
|
115
|
+
export function correctionPhrase(typed) {
|
|
116
|
+
if (typeof typed !== 'string')
|
|
117
|
+
return null;
|
|
118
|
+
const said = clauseOf(typed);
|
|
119
|
+
if (!said)
|
|
120
|
+
return null;
|
|
121
|
+
for (const f of FORMS) {
|
|
122
|
+
const m = f.re.exec(said);
|
|
123
|
+
if (!m)
|
|
124
|
+
continue;
|
|
125
|
+
const made = f.make(m);
|
|
126
|
+
if (!made)
|
|
127
|
+
return null;
|
|
128
|
+
const lesson = made.lesson.replace(/\s+/g, ' ').trim();
|
|
129
|
+
// The person's clause and the lesson made from it are both held to lessonRefused ("no need to ask first").
|
|
130
|
+
return lesson && !lessonRefused(said) && !lessonRefused(lesson) ? { said, lesson, kind: made.kind } : null;
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
/* ------------------------------------------------------------- the text */
|
|
135
|
+
const escapeRe = (t) => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
136
|
+
/** A value of 2+ chars back to `{name}`, longest first, never inside a longer number or word. */
|
|
137
|
+
function putParamsBack(cmd, params) {
|
|
138
|
+
let out = cmd;
|
|
139
|
+
const pairs = Object.entries(params).filter(([, v]) => typeof v === 'string' && v.length >= 2).sort((a, b) => b[1].length - a[1].length);
|
|
140
|
+
// At a word's start, or right after a lone `v` ("v1.4.3").
|
|
141
|
+
const start = '(?:(?<![0-9A-Za-z_.])|(?<=(?:^|[^0-9A-Za-z_.])v))';
|
|
142
|
+
for (const [name, v] of pairs)
|
|
143
|
+
out = out.replace(new RegExp(`${start}${escapeRe(v)}(?![0-9A-Za-z_])`, 'g'), `{${name}}`);
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
/** `{lesson}: {fix command}` (params put back), or `{lesson}` alone; one line, at most 200, no leading marker. A cut command is never kept. */
|
|
147
|
+
export function lessonText(phrase, fixCmd, params) {
|
|
148
|
+
const lesson = flatLine(phrase.lesson, LESSON_MAX);
|
|
149
|
+
if (fixCmd) {
|
|
150
|
+
const fix = flatLine(putParamsBack(String(fixCmd), params ?? {}), 4000);
|
|
151
|
+
const both = flatLine(`${lesson}: ${fix}`, 4000);
|
|
152
|
+
if (fix && both.length <= LESSON_MAX)
|
|
153
|
+
return both;
|
|
154
|
+
}
|
|
155
|
+
return lesson;
|
|
156
|
+
}
|
|
157
|
+
export function lessonSha(text) {
|
|
158
|
+
return createHash('sha256').update(String(text ?? '')).digest('hex');
|
|
159
|
+
}
|
|
160
|
+
export function newLessonId() {
|
|
161
|
+
return `ls-${randomBytes(3).toString('hex')}`;
|
|
162
|
+
}
|
|
163
|
+
/* ------------------------------------------------------------ the files */
|
|
164
|
+
const GUARDRAIL_START = /^(?:never|don'?t|do not|ask first)\b/i;
|
|
165
|
+
const kindOf = (text, said) => (said === 'guardrail' || GUARDRAIL_START.test(text) ? 'guardrail' : 'lesson');
|
|
166
|
+
/** "never ask first", "don't wait for my yes": a never / don't that has the agent not ask. */
|
|
167
|
+
const NO_ASK = /^(?:never|don'?t|do not)\s+(?:(?!without\b)\w+\s+){0,2}?(?:ask\w*|confirm\w*|prompt\w*|wait\s+for|check\s+with)\b/i;
|
|
168
|
+
/** "skip the confirmation", "stop asking", "run it without asking", "not ask for approval". */
|
|
169
|
+
const SKIP_ASK = /\b(skip\w*|bypass\w*|stop|without|no need to|not|avoid\w*)\s+(?:\w+\s+){0,2}?(?:ask\w*|confirm\w*|prompt\w*|approv\w*|permission|(?:my|a|the|their)\s+yes)\b/gi;
|
|
170
|
+
/**
|
|
171
|
+
* Talk of asking the person: ask me / first / before / for my yes, confirm with, check with me, approval, my yes,
|
|
172
|
+
* wait for me. Not a wall's own words ("the HTTPS push asking for a username"): that is a program asking, not the
|
|
173
|
+
* person being asked.
|
|
174
|
+
*/
|
|
175
|
+
const ASK_TALK = new RegExp([
|
|
176
|
+
String.raw `\bask(?:s|ed|ing)?\b(?=\s*(?:$|[,.;:!?]|(?:me|us|them|the person|first|before|again)\b|for\s+(?:my|a|an|the|their|your|any)\s+(?:yes|ok|okay|go-ahead|approval|permission|confirmation|sign-off)\b))`,
|
|
177
|
+
String.raw `\bconfirm(?:s|ed|ing)?\b(?=\s*(?:$|[,.;:!?]|(?:with|first|before)\b))`,
|
|
178
|
+
String.raw `\bcheck(?:s|ed|ing)?\s+with\s+(?:me|us|them|the person)\b`,
|
|
179
|
+
String.raw `\b(?:approval|permission|confirmation|sign-off|go-ahead)\b`,
|
|
180
|
+
String.raw `\b(?:my|a|the|their|your)\s+(?:yes|ok|okay)\b`,
|
|
181
|
+
String.raw `\bwait(?:s|ed|ing)?\s+for\s+(?:me|my|a|the|their|your)\b`,
|
|
182
|
+
].join('|'), 'i');
|
|
183
|
+
/** What a lesson may say before its ask: "you should", "please", "so". */
|
|
184
|
+
const ASK_LEAD = /^(?:(?:please|so|just|you|we)\s+)*(?:(?:should|must|need to|needs to|have to|has to|also)\s+)*/i;
|
|
185
|
+
const WHO = String.raw `(?:me|us|them|the person)`;
|
|
186
|
+
/** The forms that add asking (D111): "ask first before X", "always ask before X", "never X without asking". */
|
|
187
|
+
const ADDS_ASK = [
|
|
188
|
+
new RegExp(String.raw `^(?:always\s+)?ask\s+(?:${WHO}\s+)?(?:first\s+)?before\s+(.+)$`, 'i'),
|
|
189
|
+
new RegExp(String.raw `^always\s+(?:ask|check\s+with\s+${WHO}|confirm\s+with\s+${WHO})(?:\s+${WHO})?(?:\s+first)?$`, 'i'),
|
|
190
|
+
new RegExp(String.raw `^(?:never|don'?t|do not)\s+(.+?)\s+(?:without|before|until)\s+(?:asking(?:\s+${WHO})?|you\s+ask(?:\s+${WHO})?|i\s+(?:say\s+yes|confirm|approve)|(?:my|a|an)\s+(?:yes|ok|okay|approval|go-ahead)|confirming(?:\s+with\s+${WHO})?|confirmation|approval|permission|checking\s+with\s+${WHO})(?:\s+first)?$`, 'i'),
|
|
191
|
+
];
|
|
192
|
+
/** A negation inside what the ask is for ("ask first before you don't need to") turns the ask around. */
|
|
193
|
+
const ASK_NEG = /\b(?:not|no|never|needn'?t|without)\b|n'?t\b/i;
|
|
194
|
+
/** D111: the text talks about asking the person, and is not one of the forms that add asking. */
|
|
195
|
+
function asksWithoutAdding(t) {
|
|
196
|
+
if (!ASK_TALK.test(t))
|
|
197
|
+
return false;
|
|
198
|
+
const core = t.replace(ASK_LEAD, '').replace(/[\s.!]+$/, '');
|
|
199
|
+
return !ADDS_ASK.some((re) => {
|
|
200
|
+
const m = re.exec(core);
|
|
201
|
+
// What the ask is for, up to the fix command (`{lesson}: {fix}`), whose flags (`--no-sign`) are no negation.
|
|
202
|
+
return m !== null && !(m[1] !== undefined && ASK_NEG.test(m[1].split(': ')[0]));
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Why a lesson's text can't reach the agent, or null (D88, D101, 4.14 step 3): it tells the agent not to ask or
|
|
207
|
+
* confirm (Trail never says that; Claude Code asks before a step that can't be undone), it talks about asking
|
|
208
|
+
* without adding asking (D111: "you don't need to ask first" must never come back as an ask turned around), a
|
|
209
|
+
* command the risk rules never keep, or, unless it is a guardrail that forbids it ("never npm publish from a
|
|
210
|
+
* laptop"), a gated command the block would show with no ask. The same rule for a new lesson's phrase and for a
|
|
211
|
+
* lesson file read back.
|
|
212
|
+
*/
|
|
213
|
+
export function lessonRefused(text) {
|
|
214
|
+
const t = flatLine(text, 4000);
|
|
215
|
+
const guard = GUARDRAIL_START.test(t);
|
|
216
|
+
if (NO_ASK.test(t))
|
|
217
|
+
return 'skips the ask';
|
|
218
|
+
// "never publish without asking" asks: a never / don't before `without` is the person's own double negative.
|
|
219
|
+
for (const m of t.matchAll(SKIP_ASK))
|
|
220
|
+
if (!(guard && /^without$/i.test(m[1])))
|
|
221
|
+
return 'skips the ask';
|
|
222
|
+
if (asksWithoutAdding(t))
|
|
223
|
+
return 'talks about asking without adding it';
|
|
224
|
+
const never = neverSave(t);
|
|
225
|
+
if (never)
|
|
226
|
+
return never;
|
|
227
|
+
if (!guard && gatedKind(t))
|
|
228
|
+
return 'runs a step that cannot be undone';
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
const isWall = (v) => WALL_CLASSES.includes(v);
|
|
232
|
+
const one = (v) => (typeof v === 'string' ? v : v instanceof Date ? v.toISOString().slice(0, 10) : '');
|
|
233
|
+
/** The first free `<date>[-n].md` style name in `dir` (lstat: a link counts as taken). */
|
|
234
|
+
function freeName(dir, stem, numbered) {
|
|
235
|
+
for (let n = 1; n < 1000; n++) {
|
|
236
|
+
const name = numbered ? `${stem}-${n}.md` : n === 1 ? `${stem}.md` : `${stem}-${n}.md`;
|
|
237
|
+
let taken = true;
|
|
238
|
+
try {
|
|
239
|
+
lstatSync(join(dir, name));
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
taken = false;
|
|
243
|
+
}
|
|
244
|
+
if (!taken)
|
|
245
|
+
return name;
|
|
246
|
+
}
|
|
247
|
+
throw new Error('trail: too many lessons on one day');
|
|
248
|
+
}
|
|
249
|
+
/** Throws when `dir` or a folder between the Trail home and it is a link: a planted link would carry the lesson out (b4 review). */
|
|
250
|
+
function noLinkTo(dir, env) {
|
|
251
|
+
const home = trailPath(env);
|
|
252
|
+
const rel = relative(home, dir);
|
|
253
|
+
if (!rel || rel.startsWith('..'))
|
|
254
|
+
return ownFolder(dir);
|
|
255
|
+
let at = home;
|
|
256
|
+
for (const part of rel.split(sep))
|
|
257
|
+
ownFolder((at = join(at, part)));
|
|
258
|
+
}
|
|
259
|
+
function wallLearning(l, text, repoKey, env) {
|
|
260
|
+
const wall = l.wall;
|
|
261
|
+
const input = { title: flatLine(text, 80), body: text, author: '', date: l.at, kind: 'lesson', src: l.src, wall };
|
|
262
|
+
if (!REPO_WALLS.has(wall)) {
|
|
263
|
+
// D114 (1): the every-repo folder follows the every-repo writer's rule (a link into a Trail checkout is refused there).
|
|
264
|
+
const dir = everyRepoDir(env);
|
|
265
|
+
const name = existsSync(dir) ? freeName(dir, `lesson-${wall}-${l.at}`, false) : `lesson-${wall}-${l.at}.md`;
|
|
266
|
+
return writeEveryRepo(input, name, env);
|
|
267
|
+
}
|
|
268
|
+
const dir = repoNotesDir(repoKey, env);
|
|
269
|
+
noLinkTo(dir, env);
|
|
270
|
+
privateDir(dir);
|
|
271
|
+
const name = freeName(dir, `${l.at}-lesson-${wall}`, false);
|
|
272
|
+
const note = {
|
|
273
|
+
title: input.title, author: '', date: l.at, touches: [], body: text,
|
|
274
|
+
...readLearningFields({ ...input, id: newLearningId(name), scope: 'personal', applies: repoKey, status: 'active' }, name),
|
|
275
|
+
};
|
|
276
|
+
writePrivate(join(dir, name), renderNote(note));
|
|
277
|
+
return join(dir, name);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* skills/<name>/lessons/<date>-<n>.md for a skill (never written through a link); for a wall-only lesson a learning
|
|
281
|
+
* of kind lesson (every-repo for a machine wall, the repo's personal folder for git-https-auth, R49). Returns the path.
|
|
282
|
+
*/
|
|
283
|
+
export function writeLesson(l, repoKey, env) {
|
|
284
|
+
const text = flatLine(l.text, LESSON_MAX);
|
|
285
|
+
if (!text)
|
|
286
|
+
throw new Error('trail: a lesson needs its text');
|
|
287
|
+
if (!DATE.test(String(l.at)))
|
|
288
|
+
throw new Error('trail: a lesson needs its date');
|
|
289
|
+
if (l.skill === null || l.skill === undefined) {
|
|
290
|
+
if (!isWall(l.wall))
|
|
291
|
+
throw new Error('trail: a lesson needs a skill or a wall');
|
|
292
|
+
return wallLearning({ ...l, src: l.src === 'correction' ? 'correction' : 'repair' }, text, repoKey, env);
|
|
293
|
+
}
|
|
294
|
+
if (!safeName(l.skill))
|
|
295
|
+
throw new Error(`trail: not a skill name: ${flatLine(l.skill, 60)}`);
|
|
296
|
+
ownFolder(skillsDir(env));
|
|
297
|
+
const dir = join(skillsDir(env), l.skill);
|
|
298
|
+
let st;
|
|
299
|
+
try {
|
|
300
|
+
st = lstatSync(dir);
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
throw new Error(`trail: no skill called ${l.skill}`);
|
|
304
|
+
}
|
|
305
|
+
if (st.isSymbolicLink())
|
|
306
|
+
throw new Error(`trail: ${dir} is a link; Trail won't write a lesson through it.`);
|
|
307
|
+
if (!st.isDirectory())
|
|
308
|
+
throw new Error(`trail: no skill called ${l.skill}`);
|
|
309
|
+
const lessons = join(dir, 'lessons');
|
|
310
|
+
ownFolder(lessons);
|
|
311
|
+
privateDir(lessons);
|
|
312
|
+
const name = freeName(lessons, l.at, true);
|
|
313
|
+
const id = LESSON_ID.test(l.id) ? l.id : newLessonId();
|
|
314
|
+
const front = ['---', `id: ${JSON.stringify(id)}`, `kind: ${JSON.stringify(kindOf(text, l.kind))}`, `skill: ${JSON.stringify(l.skill)}`,
|
|
315
|
+
`src: ${JSON.stringify(l.src === 'repair' ? 'repair' : 'correction')}`, `at: ${JSON.stringify(l.at)}`];
|
|
316
|
+
if (isWall(l.wall))
|
|
317
|
+
front.push(`wall: ${JSON.stringify(l.wall)}`);
|
|
318
|
+
writePrivate(join(lessons, name), `${[...front, '---', text].join('\n')}\n`);
|
|
319
|
+
return join(lessons, name);
|
|
320
|
+
}
|
|
321
|
+
/** One lesson file, or null: a regular file (not a link) of at most 4 KB, with front matter, a date and text. The kind is the text's (spec 13). */
|
|
322
|
+
function readLessonFile(path, skill) {
|
|
323
|
+
try {
|
|
324
|
+
const st = lstatSync(path);
|
|
325
|
+
if (!st.isFile() || st.size > MAX_FILE)
|
|
326
|
+
return null;
|
|
327
|
+
const fm = matter(readFileSync(path, 'utf8'), { scalars: ['id', 'kind', 'skill', 'src', 'at', 'wall'] });
|
|
328
|
+
if (fm.refused)
|
|
329
|
+
return null;
|
|
330
|
+
const d = fm.data;
|
|
331
|
+
const text = flatLine(String(fm.content ?? ''), LESSON_MAX);
|
|
332
|
+
const at = DATE.test(one(d.at)) ? one(d.at) : /^(\d{4}-\d{2}-\d{2})-\d+\.md$/.exec(basename(path))?.[1] ?? '';
|
|
333
|
+
if (!text || !at)
|
|
334
|
+
return null;
|
|
335
|
+
const id = LESSON_ID.test(one(d.id)) ? one(d.id) : `ls-${createHash('sha256').update(basename(path)).digest('hex').slice(0, 6)}`;
|
|
336
|
+
return { id, skill, at, text, kind: kindOf(text), src: d.src === 'repair' ? 'repair' : 'correction', wall: isWall(d.wall) ? d.wall : null };
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/** `2026-11-03-10.md` after `2026-11-03-2.md`: by name with its numbers as numbers. */
|
|
343
|
+
const byName = (a, b) => a.localeCompare(b, 'en', { numeric: true });
|
|
344
|
+
/** The lessons in `<skillDir>/lessons/` (never through a link), oldest first; the newest 50 files read. */
|
|
345
|
+
export function readLessons(skillDir) {
|
|
346
|
+
let names;
|
|
347
|
+
try {
|
|
348
|
+
if (!lstatSync(join(skillDir, 'lessons')).isDirectory())
|
|
349
|
+
return [];
|
|
350
|
+
names = readdirSync(join(skillDir, 'lessons')).filter((n) => n.endsWith('.md') && !n.startsWith('.')).sort(byName).slice(-MAX_FILES);
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
return [];
|
|
354
|
+
}
|
|
355
|
+
const skill = basename(skillDir);
|
|
356
|
+
return names.map((n) => readLessonFile(join(skillDir, 'lessons', n), skill)).filter((l) => l !== null)
|
|
357
|
+
.sort((a, b) => a.at.localeCompare(b.at));
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* The live lessons kept for a wall class here: every-repo ones, then this repo's (oldest first). For lastTimeText
|
|
361
|
+
* (4.10). D117 (4): read through the mtime-keyed lesson index; `write` (Stop, session start) keeps what changed.
|
|
362
|
+
*/
|
|
363
|
+
export function wallLessons(cls, repoKey, env, opts = {}) {
|
|
364
|
+
const dirs = [everyRepoDir(env)];
|
|
365
|
+
try {
|
|
366
|
+
dirs.push(repoNotesDir(repoKey, env));
|
|
367
|
+
}
|
|
368
|
+
catch { /* no repo key */ }
|
|
369
|
+
const [everyNotes = [], mineNotes = []] = lessonNotesIn(dirs, env, opts);
|
|
370
|
+
const mine = mineNotes.filter((n) => !n.applies || n.applies.toLowerCase() === repoKey.toLowerCase());
|
|
371
|
+
const every = everyNotes.filter((n) => !n.applies || n.applies === EVERY_REPO);
|
|
372
|
+
return liveLessons([...every, ...mine]).filter((n) => n.wall === cls).flatMap((n) => {
|
|
373
|
+
const text = flatLine(n.body, LESSON_MAX);
|
|
374
|
+
// A hand edit is held to the run block's rule (lessonRefused): the agent reads this text too.
|
|
375
|
+
return text && !lessonRefused(text) ? [{ id: n.id, skill: null, at: n.date, text, kind: kindOf(text), src: n.src === 'correction' ? 'correction' : 'repair', wall: cls }] : [];
|
|
376
|
+
}).sort((a, b) => a.at.localeCompare(b.at));
|
|
377
|
+
}
|
|
378
|
+
/* ------------------------------------------------------------ the lines */
|
|
379
|
+
/** 'Nov 3' for a local date. */
|
|
380
|
+
function dayOf(d) {
|
|
381
|
+
const m = DATE.exec(d) ? d.split('-').map(Number) : null;
|
|
382
|
+
return m ? `${MONTHS[m[1] - 1] ?? 'Jan'} ${m[2]}` : 'an earlier day';
|
|
383
|
+
}
|
|
384
|
+
/** A guardrail-kind lesson (never trimmed from a block): so marked, or its text starts with never / don't / ask first. */
|
|
385
|
+
export const isGuardrailLesson = (l) => kindOf(flatLine(l.text, LESSON_MAX), l.kind) === 'guardrail';
|
|
386
|
+
/** Guardrail-kind lessons first (never trimmed), then up to 3 newest lessons, oldest of them first (4.16, J07). */
|
|
387
|
+
/** One lesson's line (`Lesson (the person, Nov 3): ...`). */
|
|
388
|
+
export const lessonLine = (l) => fill(LESSON_COPY.line, { date: dayOf(l.at), text: flatLine(l.text, LESSON_MAX) });
|
|
389
|
+
export function lessonLines(lessons) {
|
|
390
|
+
const line = lessonLine;
|
|
391
|
+
const byDate = [...lessons].sort((a, b) => a.at.localeCompare(b.at));
|
|
392
|
+
const guard = byDate.filter(isGuardrailLesson);
|
|
393
|
+
const rest = byDate.filter((l) => !guard.includes(l)).slice(-NEWEST);
|
|
394
|
+
return [...guard, ...rest].map(line).filter((l) => !/: $/.test(l));
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=lessons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lessons.js","sourceRoot":"","sources":["../../src/skills/lessons.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Reason a command can never be in a skill (4.11), or null. */
|
|
2
|
+
export declare function neverSave(cmd: string): string | null;
|
|
3
|
+
/** 4.10 backstop: a password written out after a flag that takes one. The fold names most secrets; these it can't tell from a word. */
|
|
4
|
+
export declare function literalPassword(cmd: string): boolean;
|
|
5
|
+
//# sourceMappingURL=never-save.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never-save.d.ts","sourceRoot":"","sources":["../../src/skills/never-save.ts"],"names":[],"mappings":"AA2HA,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWpD;AAaD,uIAAuI;AACvI,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGpD"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Never save (design 4.11, spec 10): a command a skill may never hold, so a
|
|
3
|
+
* run with one gives no skill at all (sudo, a download piped into a shell,
|
|
4
|
+
* `rm -rf` on a variable or a home path, a force push to a shared branch, a
|
|
5
|
+
* credential file, destructive SQL off this machine, anything that messages
|
|
6
|
+
* people, Trail itself), and the 4.10 password backstop. Split from risk.ts,
|
|
7
|
+
* whose gated list and agent guard the PreToolUse fast path loads; this file
|
|
8
|
+
* is for the save side only.
|
|
9
|
+
*/
|
|
10
|
+
import { isTrailCommand } from '../trace/shell.js';
|
|
11
|
+
import { argsAfter, pushes, unknownDst, word, written } from './risk.js';
|
|
12
|
+
const LOCAL_HOSTS = /^(?:localhost|127\.0\.0\.1|::1|\[::1\])$/i;
|
|
13
|
+
const escapeRe = (t) => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
14
|
+
/** Hosts a database command names: `-h x`, `--host=x`, `host=x`, `scheme://user@x:port`. */
|
|
15
|
+
function namedHosts(cmd) {
|
|
16
|
+
const hosts = [];
|
|
17
|
+
for (const m of cmd.matchAll(/(?:^|\s)(?:-h|--host)(?:=|\s+)['"]?([^\s'"/;]+)/g))
|
|
18
|
+
hosts.push(m[1]);
|
|
19
|
+
for (const m of cmd.matchAll(/\bhost=['"]?([^\s'";]+)/gi))
|
|
20
|
+
hosts.push(m[1]);
|
|
21
|
+
for (const m of cmd.matchAll(/\b[a-z][a-z0-9+.-]*:\/\/(?:[^\s/@'"]*@)?(\[[^\]]+\]|[^\s/:'"?]+)/gi))
|
|
22
|
+
hosts.push(m[1]);
|
|
23
|
+
return hosts;
|
|
24
|
+
}
|
|
25
|
+
/** A target `rm -r` or `find -delete` must never get: a variable, a {param}, home, an absolute path, the whole folder. */
|
|
26
|
+
const wildTarget = (t) => t !== '{}' && (/^[$~/]|^\.\.(?:\/|$)/.test(t) || /\$|`|\{[A-Za-z_]\w*\}/.test(t) || /^(?:\.\/?|(?:\.\/)?\*)$/.test(t));
|
|
27
|
+
function rmWild(text) {
|
|
28
|
+
const rms = [...text.matchAll(word('rm'))];
|
|
29
|
+
for (const [i, m] of rms.entries()) {
|
|
30
|
+
let recursive = false;
|
|
31
|
+
let opts = true;
|
|
32
|
+
const targets = [];
|
|
33
|
+
for (const w of argsAfter(text, m.index + m[0].length, rms[i + 1]?.index)) {
|
|
34
|
+
if (opts && w === '--')
|
|
35
|
+
opts = false;
|
|
36
|
+
else if (opts && /^-[a-zA-Z]+$/.test(w))
|
|
37
|
+
recursive ||= /[rR]/.test(w);
|
|
38
|
+
else if (opts && /^--[\w-]+$/.test(w))
|
|
39
|
+
recursive ||= w === '--recursive';
|
|
40
|
+
else
|
|
41
|
+
targets.push(w);
|
|
42
|
+
}
|
|
43
|
+
if (!recursive)
|
|
44
|
+
continue;
|
|
45
|
+
// `xargs rm -rf`: the targets come from elsewhere.
|
|
46
|
+
if (!targets.length ? /\bxargs\b[^;&|\n]*$/.test(text.slice(0, m.index)) : targets.some(wildTarget))
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
const finds = [...text.matchAll(word('find'))];
|
|
50
|
+
for (const [i, m] of finds.entries()) {
|
|
51
|
+
const w = argsAfter(text, m.index + m[0].length, finds[i + 1]?.index);
|
|
52
|
+
const roots = w.slice(0, Math.max(0, w.findIndex((x) => /^[-(!]/.test(x))));
|
|
53
|
+
const deletes = w.includes('-delete') || w.some((x, i) => /^-(?:exec|execdir|ok|okdir)$/.test(x) && /(?:^|\/)rm$/.test(w[i + 1] ?? ''));
|
|
54
|
+
// `find . -name x -exec rm {} +` is fine; a root the skill can't know is not.
|
|
55
|
+
if (deletes && roots.some((t) => /^[$~/{]/.test(t) || /\$|`/.test(t)))
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const SHARED = new Set(['main', 'master', 'prod', 'production', 'beta', 'dev', 'develop', 'staging', 'trunk']);
|
|
61
|
+
const forcePushShared = (c) => pushes(c).some((p) => p.force && p.dsts.some((d) => SHARED.has(d.toLowerCase()) || unknownDst(d)));
|
|
62
|
+
const SUDO = /(?:^|[^\w./-])(?:[\w./-]*\/)?(?:sudo|doas|pkexec)(?![\w-])/i;
|
|
63
|
+
const SHELL_WORD = String.raw `(?:sudo\s+(?:-\S+\s+)*)?(?:env\s+(?:\S+=\S*\s+)*)?(?:[\w./-]*\/)?`;
|
|
64
|
+
const DOWNLOAD = [
|
|
65
|
+
new RegExp(String.raw `\b(?:curl|wget)\b[^\n]*?(?<!\|)\|(?!\|)\s*${SHELL_WORD}(?:ba|z|da|k|fi)?sh\b`, 'i'),
|
|
66
|
+
new RegExp(String.raw `\b(?:curl|wget)\b[^\n]*?(?<!\|)\|(?!\|)\s*${SHELL_WORD}(?:python[\d.]*|node|perl|ruby|php)(?:\s+-)?\s*(?=$|[;&|)\n])`, 'i'),
|
|
67
|
+
/(?:\b(?:ba|z|da|k)?sh|\bsource|(?:^|[\s;&|(])\.)\s+<\(\s*(?:curl|wget)\b/i,
|
|
68
|
+
/\b(?:(?:ba|z|da|k)?sh\s+-\w*c|eval)\s+["']?(?:\$\(|`)\s*(?:curl|wget)\b/i,
|
|
69
|
+
];
|
|
70
|
+
/** `curl -o x.sh URL && sh x.sh`, `wget URL -O s.sh; chmod +x s.sh; ./s.sh`: a download saved to a file, then run. */
|
|
71
|
+
function downloadThenRun(text) {
|
|
72
|
+
for (const m of text.matchAll(/\b(curl|wget)\b([^;&|\n]*)/gi)) {
|
|
73
|
+
const [, tool, args] = m;
|
|
74
|
+
const files = new Set();
|
|
75
|
+
const named = /(?:\s-[a-zA-Z]*o\s*|\s--output[= ]\s*|\s-O\s*(?=[^\s-])|\s--output-document[= ]\s*)['"]?([^\s'";&|]+)/.exec(args)?.[1];
|
|
76
|
+
if (named && named !== '-' && named !== '/dev/null')
|
|
77
|
+
files.add(named);
|
|
78
|
+
// `wget URL` and `curl -O URL` save under the link's own name.
|
|
79
|
+
const remote = /^wget$/i.test(tool) ? !/\s-[a-zA-Z]*O\b|--output-document/.test(args) : /\s-[a-zA-Z]*O\b|--remote-name\b/.test(args);
|
|
80
|
+
if (remote)
|
|
81
|
+
for (const u of args.matchAll(/https?:\/\/\S*\/([^\s/'"?#]+)/g))
|
|
82
|
+
files.add(u[1]);
|
|
83
|
+
const after = text.slice(m.index + m[0].length);
|
|
84
|
+
for (const f of files) {
|
|
85
|
+
const e = escapeRe(f.replace(/^\.\//, '').split('/').pop());
|
|
86
|
+
// Run as a program, or handed to a shell, `source`, `.` or `chmod +x`: at the start of a command.
|
|
87
|
+
const run = new RegExp(String.raw `(?:^|[;&|(\n]|&&|\|\|)\s*(?:(?:(?:ba|z|da|k)?sh|source|\.|chmod\s+\S*x)\s+)?['"]?(?:\.?\.?\/[^\s'"]*\/|\.\/)?${e}['"]?(?=\s|$|[;&|)])`);
|
|
88
|
+
const plainName = new RegExp(String.raw `(?:^|[;&|(\n]|&&|\|\|)\s*(?:(?:ba|z|da|k)?sh|source|\.|chmod\s+\S*x)\s+['"]?${e}['"]?(?=\s|$|[;&|)])`);
|
|
89
|
+
if (plainName.test(after) || (run.test(after) && new RegExp(String.raw `(?:^|[\s;&|(])\.{0,2}\/(?:[^\s'"]*\/)?${e}(?=\s|$|[;&|)'"])`).test(after)))
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
const CREDENTIAL = /(?:\.npmrc|\.netrc|\.aws\/(?:credentials|sso\/cache|cli\/cache)|(?<![\w.])\.ssh\/|\.git-credentials|\.docker\/config\.json|gh\/hosts\.yml|com\.vercel\.cli\/auth\.json|\.config\/gcloud|Library\/Keychains|\.kube\/config|\.pypirc|\.gem\/credentials|\.cargo\/credentials|\.pgpass|\.my\.cnf|credentials\.tfrc\.json|\.terraformrc|\.config\/hub\b|\.azure\/|\.password-store|\.vault-token)/i;
|
|
96
|
+
/**
|
|
97
|
+
* Commands that store a credential they were handed where every later command picks it up. Logging in at
|
|
98
|
+
* the browser (`npm login`, `gh auth login`) needs the person there, holds no secret in the step, and is how
|
|
99
|
+
* a release gets past an expired token: not on this list, but gated (D93, `login`), so it is never run unasked.
|
|
100
|
+
*/
|
|
101
|
+
const CREDENTIAL_WRITE = /\bnpm\s+config\s+set\s+\S*_(?:auth|password)|\b(?:docker|podman|helm\s+registry)\s+login\b[^;&|\n]*\s(?:-p|--password(?:-stdin)?)\b|\baws\s+configure\s+set\b|\bgit\s+credential\s+(?:approve|store)\b|\bgit\s+config\b[^;&|\n]*\bcredential\.helper\b|\bsecurity\s+add-(?:generic|internet)-password\b/i;
|
|
102
|
+
/** Commands that print a stored credential. */
|
|
103
|
+
const CREDENTIAL_READ = /\bgh\s+auth\s+token\b|\bgit\s+credential\s+fill\b|\bsecurity\s+(?:find|delete)-(?:generic|internet)-password\b|\bsecurity\s+dump-keychain\b|\bop\s+(?:read|item\s+get)\b|\bgcloud\s+auth\s+print-(?:access|identity)-token\b|\bheroku\s+auth:token\b|\bpass\s+show\b|\bvault\s+(?:read|kv\s+get)\b/i;
|
|
104
|
+
const DESTRUCTIVE_SQL = /\b(?:drop\s+(?:table|database|schema|view|materialized\s+view|index|owned|role|user|function|type|sequence|extension)|truncate(?!\s+-)|delete\s+from|alter\s+table\b[^;]*?\bdrop)\b|\bdropdb\b|\bflush(?:all|db)\b|\bdropDatabase\s*\(|\.drop(?:Collection)?\s*\(\s*\)|\bdeleteMany\s*\(\s*\{\s*\}\s*\)|\bsupabase\s+db\s+reset\b[^;&|\n]*--(?:linked|db-url)|\bprisma\s+(?:migrate\s+reset|db\s+push\b[^;&|\n]*--(?:force-reset|accept-data-loss))|\brails\s+db:(?:drop|reset)\b/i;
|
|
105
|
+
const MESSAGES = /\b(?:sendmail|mail\s+-s|mailx|mutt|msmtp|swaks|twilio)\b|\bgit\s+send-email\b|hooks\.slack\.com|\bslack\s+chat\b|graph\.facebook\.com|discord(?:app)?\.com\/api\/webhooks|api\.telegram\.org\/bot|api\.(?:sendgrid\.com|mailgun\.net|postmarkapp\.com|resend\.com)|\bgh\s+(?:issue\s+(?:create|comment)|pr\s+(?:comment|review))\b/i;
|
|
106
|
+
/** `gh api` that writes: a POST/PATCH/PUT, or fields (`-f`, `-F`, `--input`) without `-X GET`. */
|
|
107
|
+
function ghApiWrite(c) {
|
|
108
|
+
if (!/\bgh\s+api\b/i.test(c))
|
|
109
|
+
return false;
|
|
110
|
+
if (/\bgh\s+api\s+graphql\b/i.test(c))
|
|
111
|
+
return /\bmutation\b[\s\S]*?\b(?:add|create|submit|update)\w*(?:Comment|Review|Issue|Discussion)\w*\b/i.test(c);
|
|
112
|
+
const method = /(?:-X|--method)[\s=]+([A-Z]+)/i.exec(c)?.[1]?.toUpperCase();
|
|
113
|
+
const writes = method ? method !== 'GET' : /(?:^|\s)(?:-f|-F|--field|--raw-field|--input)(?=[\s=])/.test(c);
|
|
114
|
+
return writes && /\/(?:comments|reviews|issues|messages|replies)\b/i.test(c);
|
|
115
|
+
}
|
|
116
|
+
/** Trail run by a wrapper `isTrailCommand` doesn't open: `eval "trail …"`, `xargs trail`, `find -exec trail`. */
|
|
117
|
+
const TRAIL_VIA = /(?:\beval|\bxargs(?:\s+-\S+(?:\s+[^\s-]\S*)?)*|(?<!\S)-(?:exec|execdir|ok|okdir))\s+["']?(?:trail|graft|trail-code)\b/i;
|
|
118
|
+
const NEVER = [
|
|
119
|
+
['runs sudo', (c) => SUDO.test(c)],
|
|
120
|
+
['pipes a download into a shell', (c) => DOWNLOAD.some((re) => re.test(c)) || downloadThenRun(c)],
|
|
121
|
+
['runs rm -rf on a variable or a home path', rmWild],
|
|
122
|
+
['force-pushes a shared branch', forcePushShared],
|
|
123
|
+
['touches a credential file', (c) => CREDENTIAL.test(c) || CREDENTIAL_WRITE.test(c) || CREDENTIAL_READ.test(c)],
|
|
124
|
+
['runs destructive SQL off this machine', (c) => DESTRUCTIVE_SQL.test(c)
|
|
125
|
+
&& (namedHosts(c).some((h) => !LOCAL_HOSTS.test(h)) || !/(?:^|[;&|(]\s*)docker\s+exec\b/i.test(c))],
|
|
126
|
+
['messages people or submits to an outside service', (c) => MESSAGES.test(c) || ghApiWrite(c)],
|
|
127
|
+
['runs Trail itself', (c) => isTrailCommand(c) || TRAIL_VIA.test(c)],
|
|
128
|
+
];
|
|
129
|
+
/** Reason a command can never be in a skill (4.11), or null. */
|
|
130
|
+
export function neverSave(cmd) {
|
|
131
|
+
const c = String(cmd ?? '');
|
|
132
|
+
for (const [why, hit] of NEVER) {
|
|
133
|
+
if (!hit(c))
|
|
134
|
+
continue;
|
|
135
|
+
if (why === 'touches a credential file') {
|
|
136
|
+
const writes = CREDENTIAL_WRITE.test(c) || />>?\s*\S*(?:\.npmrc|\.netrc|credentials|\.ssh\/|config\.json|hosts\.yml|auth\.json|\.kube\/config|\.pypirc|\.pgpass)|\b(?:cp|mv|tee|ln)\b|security\s+add-/i.test(c);
|
|
137
|
+
return writes ? 'writes a credential file' : 'reads a credential file';
|
|
138
|
+
}
|
|
139
|
+
return why;
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
const PASSWORD_AT = [
|
|
144
|
+
/\b(?:mysql|mysqldump|mysqladmin|mariadb|mariadb-dump)\b[^;&|\n]*?\s-p(?=\S)(\S+)/i,
|
|
145
|
+
/\b(?:mysql|mysqldump|mysqladmin|mariadb)\b[^;&|\n]*?\s--password=(\S+)/i,
|
|
146
|
+
/\b(?:docker|podman|nerdctl|buildah|skopeo|oras)\s+login\b[^;&|\n]*?\s(?:-p|--password)(?:=|\s+)(\S+)/i,
|
|
147
|
+
/\bhelm\s+registry\s+login\b[^;&|\n]*?\s(?:-p|--password)(?:=|\s+)(\S+)/i,
|
|
148
|
+
/\bsshpass\s+-p\s*(\S+)/i,
|
|
149
|
+
/\bredis-cli\b[^;&|\n]*?\s(?:-a|--pass)\s+(\S+)/i,
|
|
150
|
+
/\b(?:echo|printf)\s+(?:-n\s+)?(\S+)\s*\|[^;&\n]*--password-stdin\b/i,
|
|
151
|
+
/\b(?:PGPASSWORD|MYSQL_PWD|REDISCLI_AUTH|SSHPASS)=(\S+)/,
|
|
152
|
+
];
|
|
153
|
+
/** 4.10 backstop: a password written out after a flag that takes one. The fold names most secrets; these it can't tell from a word. */
|
|
154
|
+
export function literalPassword(cmd) {
|
|
155
|
+
const c = String(cmd ?? '');
|
|
156
|
+
return PASSWORD_AT.some((re) => { const v = re.exec(c)?.[1]; return v !== undefined && written(v); });
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=never-save.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never-save.js","sourceRoot":"","sources":["../../src/skills/never-save.ts"],"names":[],"mappings":"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"}
|