@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,56 @@
|
|
|
1
|
+
import { pushShows } from './compile-words.js';
|
|
2
|
+
/** A tag or release lookup, anywhere in the check's command. */
|
|
3
|
+
const VERSION_LOOKUP = /\bgit\s+ls-remote\b[^;&|\n]*\s(?:--tags\b|refs\/tags\/|v?\d+\.\d+)|\bgh\s+release\s+(?:view|list)\b|\bgit\s+tag\s+(?:-l|--list|--points-at|--contains)\b|\bgit\s+describe\b[^;&|\n]*\s--tags\b/;
|
|
4
|
+
const BARE_VERSION = /^\s*v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)\s*$/;
|
|
5
|
+
/** A bump that writes the next version into package.json, and a publish that reads it from there. */
|
|
6
|
+
const FROM_PACKAGE = /\b(?:npm|pnpm)\s+version\s+(?:major|minor|patch|premajor|preminor|prepatch|prerelease)\b|\byarn\s+version\s+--(?:major|minor|patch)\b|\b(?:npm|pnpm|yarn(?:\s+npm)?)\s+publish\b/;
|
|
7
|
+
const SAFE_DIR = /^[\w./@+-]*$/;
|
|
8
|
+
/** The version a check call printed: its CheckHit's, else an output that is one version alone. */
|
|
9
|
+
export function shownVersion(c) {
|
|
10
|
+
return c.check?.facts.version ?? BARE_VERSION.exec(c.tail ?? '')?.[1];
|
|
11
|
+
}
|
|
12
|
+
/** A check whose shown fact is a version. Tests and pushes are steps that double as the check, never a version read. */
|
|
13
|
+
export function versionShaped(c, fam) {
|
|
14
|
+
if (fam === 'npm-view')
|
|
15
|
+
return true;
|
|
16
|
+
if (fam === 'tests' || fam === 'push' || c.tool)
|
|
17
|
+
return false;
|
|
18
|
+
return VERSION_LOOKUP.test(c.cmd ?? '') || shownVersion(c) !== undefined;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The `{version}` param a version check shows, and the params with it. A version param the steps use, the one the
|
|
22
|
+
* check printed first; else a step that bumps or publishes from package.json gives `{version}`, read from that
|
|
23
|
+
* folder's package.json when the check runs (a `{version}` the check alone wrote takes that default). Null: no
|
|
24
|
+
* step names or makes the version.
|
|
25
|
+
*/
|
|
26
|
+
export function versionTie(steps, params, shown) {
|
|
27
|
+
const used = params.filter((p) => p.shape === 'version' && steps.some((s) => s.cmd.includes(`{${p.name}}`)));
|
|
28
|
+
if (used.length)
|
|
29
|
+
return { name: (used.find((p) => shown !== undefined && p.seen.includes(shown)) ?? used[0]).name, params };
|
|
30
|
+
const from = steps.find((s) => FROM_PACKAGE.test(s.cmd));
|
|
31
|
+
if (!from || !SAFE_DIR.test(from.cwd ?? ''))
|
|
32
|
+
return null;
|
|
33
|
+
const def = `$(node -p "require('./${from.cwd ? `${from.cwd.replace(/\/+$/, '')}/` : ''}package.json').version")`;
|
|
34
|
+
const inCheck = params.find((p) => p.shape === 'version');
|
|
35
|
+
if (inCheck)
|
|
36
|
+
return { name: inCheck.name, params: params.map((p) => (p === inCheck ? { ...p, default: def } : p)) };
|
|
37
|
+
return { name: 'version', params: [...params, { name: 'version', shape: 'version', default: def, seen: shown ? [shown] : [] }] };
|
|
38
|
+
}
|
|
39
|
+
/** Step 3: what the check shows. `version`: the tied param's name (D106). */
|
|
40
|
+
export function checkShowsFor(fam, checkCall, params, version) {
|
|
41
|
+
if (!checkCall)
|
|
42
|
+
return null;
|
|
43
|
+
if (version)
|
|
44
|
+
return `{${version}}`;
|
|
45
|
+
const hasParam = (n) => params.some((p) => p.name === n);
|
|
46
|
+
return {
|
|
47
|
+
'npm-view': hasParam('version') ? '{version}' : 'the new version',
|
|
48
|
+
deploy: checkCall.check?.facts.state ?? 'success',
|
|
49
|
+
'ls-remote': hasParam('sha') ? '{sha}' : 'the pushed commit',
|
|
50
|
+
tests: 'the tests pass',
|
|
51
|
+
query: 'rows come back',
|
|
52
|
+
'gh-checks': 'all checks pass',
|
|
53
|
+
push: pushShows(checkCall.check?.facts.branch, params),
|
|
54
|
+
}[fam] ?? null;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=compile-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-version.js","sourceRoot":"","sources":["../../src/skills/compile-version.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 4.5 step 5, split from compile.ts: which calls of a run fold into one wait
|
|
3
|
+
* (the same command polled until it read differently), and which earlier
|
|
4
|
+
* polls each wait swallows.
|
|
5
|
+
*/
|
|
6
|
+
import type { RunCall, RunSheet } from '../trace/types.js';
|
|
7
|
+
/** 4.5 step 5: which calls fold into a wait, and which earlier polls they swallow. */
|
|
8
|
+
export declare function findWaits(calls: RunCall[], ci: number | null, job: RunSheet['job']): Map<number, {
|
|
9
|
+
token: string | null;
|
|
10
|
+
polls: number[];
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=compile-waits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-waits.d.ts","sourceRoot":"","sources":["../../src/skills/compile-waits.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAO3D,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAoC3I"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { normalizeCommand } from '../trace/shell.js';
|
|
2
|
+
import { READ_ONLY_FAMILIES, checkFamilyOf } from '../trace/checks.js';
|
|
3
|
+
const LEADING_SLEEP = /^\s*sleep\s+\d+(?:\.\d+)?[smh]?\s*(?:;|&&)/;
|
|
4
|
+
const SLEEP_ONLY = /^\s*sleep\s+\d+(?:\.\d+)?[smh]?\s*$/;
|
|
5
|
+
/** 4.5 step 5: which calls fold into a wait, and which earlier polls they swallow. */
|
|
6
|
+
export function findWaits(calls, ci, job) {
|
|
7
|
+
const key = calls.map((c) => (c.cmd === null || c.cwd === null ? null : `${c.cwd}\u0000${normalizeCommand(c.cmd)}`));
|
|
8
|
+
const steps = [0];
|
|
9
|
+
for (const c of calls)
|
|
10
|
+
steps.push(steps[steps.length - 1] + (c.kind === 'step' ? 1 : 0));
|
|
11
|
+
const link = calls.map(() => -1);
|
|
12
|
+
const last = new Map();
|
|
13
|
+
key.forEach((k, i) => {
|
|
14
|
+
if (k === null)
|
|
15
|
+
return;
|
|
16
|
+
const j = last.get(k);
|
|
17
|
+
// Adjacent: only looks, plumbing and work of other commands in between.
|
|
18
|
+
if (j !== undefined && steps[i] - steps[j + 1] === 0)
|
|
19
|
+
link[i] = j;
|
|
20
|
+
last.set(k, i);
|
|
21
|
+
});
|
|
22
|
+
const isPrev = new Set(link.filter((j) => j >= 0));
|
|
23
|
+
const out = new Map();
|
|
24
|
+
for (let L = 0; L < calls.length; L++) {
|
|
25
|
+
if (link[L] < 0 || isPrev.has(L))
|
|
26
|
+
continue;
|
|
27
|
+
const group = [];
|
|
28
|
+
for (let g = L; g >= 0; g = link[g])
|
|
29
|
+
group.unshift(g);
|
|
30
|
+
const lastCall = calls[L];
|
|
31
|
+
const earlier = group.slice(0, -1);
|
|
32
|
+
if (lastCall.failed)
|
|
33
|
+
continue;
|
|
34
|
+
if (!earlier.every((e) => calls[e].failed || (calls[e].tail ?? '') !== (lastCall.tail ?? '')))
|
|
35
|
+
continue;
|
|
36
|
+
const fam = checkFamilyOf(lastCall.cmd, job);
|
|
37
|
+
let poll = false;
|
|
38
|
+
if (lastCall.kind === 'look')
|
|
39
|
+
poll = fam !== null && READ_ONLY_FAMILIES.has(fam);
|
|
40
|
+
else if (lastCall.kind === 'step') {
|
|
41
|
+
// A step that ran again is a retry unless the run was polling: a leading sleep, or a sleep call in between.
|
|
42
|
+
const between = calls.slice(group[0] + 1, L).some((c) => c.cmd !== null && SLEEP_ONLY.test(c.cmd));
|
|
43
|
+
poll = between || group.slice(1).some((g) => LEADING_SLEEP.test(calls[g].cmd ?? ''));
|
|
44
|
+
}
|
|
45
|
+
if (!poll)
|
|
46
|
+
continue;
|
|
47
|
+
const t = (lastCall.tail ?? '').trim();
|
|
48
|
+
out.set(L, { token: L === ci ? null : /^[\w.-]{1,24}$/.test(t) ? t : null, polls: earlier });
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=compile-waits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-waits.js","sourceRoot":"","sources":["../../src/skills/compile-waits.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,aAAa,GAAG,4CAA4C,CAAC;AACnE,MAAM,UAAU,GAAG,qCAAqC,CAAC;AAEzD,sFAAsF;AACtF,MAAM,UAAU,SAAS,CAAC,KAAgB,EAAE,EAAiB,EAAE,GAAoB;IACjF,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrH,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,wEAAwE;QACxE,IAAI,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,KAAK,CAAC;YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqD,CAAC;IACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE;YAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,QAAQ,CAAC,MAAM;YAAE,SAAS;QAC9B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAAE,SAAS;QAC1G,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAI,EAAE,GAAG,CAAC,CAAC;QAC9C,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM;YAAE,IAAI,GAAG,GAAG,KAAK,IAAI,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAC5E,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,4GAA4G;YAC5G,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpG,IAAI,GAAG,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The words around a compiled skill, from templates, never from a model
|
|
3
|
+
* (design 4.5 step 13, 2.1): its name, title, description, the asks that
|
|
4
|
+
* bring it back, what it is not for; the "show me" print; and a refusal in
|
|
5
|
+
* plain words.
|
|
6
|
+
*
|
|
7
|
+
* Pure: no files, no clock (dates come from the run sheet).
|
|
8
|
+
*/
|
|
9
|
+
import type { CheckHit, JobClass, RunCall, RunSheet } from '../trace/types.js';
|
|
10
|
+
import type { CompiledSkill, SkillStep } from './types.js';
|
|
11
|
+
export type CompileRefusal = 'no-steps' | 'too-long' | 'step-too-long' | 'multi-line' | 'never-save' | 'secret' | 'scratch-path' | 'outside-repo' | 'truncated' | 'no-check' | 'trivial' | 'helper-missing' | 'judgement' | 'answers-prompt';
|
|
12
|
+
/** At least one letter, so the digits of `trail skills keep 1 3` (init, 1b) can never be a name. */
|
|
13
|
+
export declare const NAME_RE: RegExp;
|
|
14
|
+
/** Names Trail's own commands use. store.ts (g4) re-exports this list. */
|
|
15
|
+
export declare const BUILT_IN_NAMES: ReadonlySet<string>;
|
|
16
|
+
/** Lesson and learning id shapes (`ls-` + 6 hex, `l-` + hex): `trail forget` reads them as ids first, so no skill takes one (D114 (2)). */
|
|
17
|
+
export declare const RESERVED_ID: RegExp;
|
|
18
|
+
/** NAME_RE, not built in, not an id's shape, and a valid Agent Skills name (no `--`, no trailing `-`). */
|
|
19
|
+
export declare function goodName(name: string): boolean;
|
|
20
|
+
/** 'Oct 27', in local time. */
|
|
21
|
+
export declare function monthDay(iso: string): string;
|
|
22
|
+
export declare const repoName: (key: string) => string;
|
|
23
|
+
export interface JobWords {
|
|
24
|
+
base: string;
|
|
25
|
+
title: string;
|
|
26
|
+
lead: string;
|
|
27
|
+
asks: string[];
|
|
28
|
+
statusAsks: string[];
|
|
29
|
+
dontUse: string;
|
|
30
|
+
}
|
|
31
|
+
/** Stable branches pushed, in order, from the calls the steps came from (`push origin beta` then `beta:prod` too). */
|
|
32
|
+
export declare function stableBranches(calls: RunCall[], jobWords: string[]): string[];
|
|
33
|
+
/**
|
|
34
|
+
* D71 b: the asks of a run with no job class, from the person's own typed save request: its words minus the save
|
|
35
|
+
* clause, scope words, values (a URL, a path, a version, a sha, a number) and filler, clause by clause, kept when a
|
|
36
|
+
* clause leaves 2 to 5 words. At most 2. [] when the request says only how to keep it.
|
|
37
|
+
*/
|
|
38
|
+
export declare function askPhrases(typed: string | null | undefined): string[];
|
|
39
|
+
/**
|
|
40
|
+
* D99: the job class an asked save names the skill after when the run's typed asks gave none. First the person's
|
|
41
|
+
* typed save request ("save this publish as a skill"), then the run's own commands: a step that publishes to a
|
|
42
|
+
* registry, checked with `npm view` (or not checked at all), is a release; pushes to stable branches are a ship.
|
|
43
|
+
* Null when neither says (the run keeps the first-step name). Judgement jobs never name a skill.
|
|
44
|
+
*/
|
|
45
|
+
export declare function askedJob(askedWith: string | null | undefined, steps: SkillStep[], calls: RunCall[], checkFamily: CheckHit['family'] | null): JobClass | null;
|
|
46
|
+
/** 4.5 step 13's table. `asked`: a job-less run's asks (D71 b), from `askPhrases`; never the run's own words. */
|
|
47
|
+
export declare function jobWords(sheet: RunSheet, steps: SkillStep[], extra?: {
|
|
48
|
+
calls?: RunCall[];
|
|
49
|
+
helperText?: string;
|
|
50
|
+
main?: string;
|
|
51
|
+
asked?: string[];
|
|
52
|
+
}): JobWords;
|
|
53
|
+
/** The base name, then -<repo>, then -2, -3 ...: the first that is a good name and free. */
|
|
54
|
+
export declare function freeName(base: string, repoKey: string, taken: (n: string) => boolean): string;
|
|
55
|
+
export declare function proposeName(sheet: RunSheet, steps: SkillStep[], taken: (n: string) => boolean): string;
|
|
56
|
+
/**
|
|
57
|
+
* fix-lab5: the asks as words after "asked" (or "you ask"), each the way it reads: "to publish, release or bump",
|
|
58
|
+
* "for integration tests, or to run the integration tests", "about regenerating the api client", "how many users".
|
|
59
|
+
* Asks next to each other that take the same word share it.
|
|
60
|
+
*/
|
|
61
|
+
export declare function askedWords(asks: string[]): string;
|
|
62
|
+
/** "<lead>, from the steps that worked on <Mon D>. Use when asked to <a, b or c>.", at most 300 characters. */
|
|
63
|
+
export declare function describe(lead: string, endedAt: string, asks: string[]): string;
|
|
64
|
+
/** D58 b: a left-out step as the draft shows it (`clean`: compile's step cleaning and paths), and where it ran. */
|
|
65
|
+
export declare function elsewhereLines(calls: RunCall[], repoKey: string, clean: (cmd: string) => string): Array<{
|
|
66
|
+
cmd: string;
|
|
67
|
+
where: string;
|
|
68
|
+
}>;
|
|
69
|
+
/** D59a: a joined sheet's compactions, its first start, and the steps whose every run came before the last compaction. */
|
|
70
|
+
export declare function carriedSteps(sheet: RunSheet, steps: SkillStep[]): NonNullable<CompiledSkill['carried']>;
|
|
71
|
+
/**
|
|
72
|
+
* D59b: a check read with a deploy status tool, not a command: what to read, the same way the run did.
|
|
73
|
+
* The deployment is named by the commit param when one holds its commit, else by its branch, else as the new commit.
|
|
74
|
+
*/
|
|
75
|
+
export declare function toolCheckWords(tool: string, facts: CheckHit['facts'], params: CompiledSkill['params']): string;
|
|
76
|
+
/** The "show me" text (2.1). */
|
|
77
|
+
export declare function draftText(c: CompiledSkill, sheet: RunSheet): string;
|
|
78
|
+
/** A refusal in plain words: "a step reads a credential file: `TOKEN=$(python3 -c …auth.json…)`". */
|
|
79
|
+
export declare function refusalWords(reason: CompileRefusal, detail: string): string;
|
|
80
|
+
/** D56a: what a push check shows, its branch as the param that holds it. */
|
|
81
|
+
export declare function pushShows(branch: string | undefined, params: CompiledSkill['params']): string;
|
|
82
|
+
//# sourceMappingURL=compile-words.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-words.d.ts","sourceRoot":"","sources":["../../src/skills/compile-words.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAU3D,MAAM,MAAM,cAAc,GACtB,UAAU,GAAG,UAAU,GAAG,eAAe,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAClF,cAAc,GAAG,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAE/H,oGAAoG;AACpG,eAAO,MAAM,OAAO,QAAiD,CAAC;AACtE,0EAA0E;AAC1E,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAE7C,CAAC;AAEH,2IAA2I;AAC3I,eAAO,MAAM,WAAW,QAA0C,CAAC;AAEnE,0GAA0G;AAC1G,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9C;AAGD,+BAA+B;AAC/B,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG5C;AAID,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,WAAwD,CAAC;AAI7F,MAAM,WAAW,QAAQ;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAU9H,sHAAsH;AACtH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAK7E;AA2BD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAgBrE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,CAO5J;AAED,iHAAiH;AACjH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAAG,QAAQ,CAgD/J;AAED,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAM7F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAEtG;AAmBD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAUjD;AAED,+GAA+G;AAC/G,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ9E;AAmCD,mHAAmH;AACnH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CASvI;AAED,0HAA0H;AAC1H,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAIvG;AAYD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAM,CAQ9G;AAED,gCAAgC;AAChC,wBAAgB,SAAS,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAqCnE;AAED,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAyB3E;AAED,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAM,CAI7F"}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import { programOf } from '../trace/shell.js';
|
|
2
|
+
import { factsFromCalls } from '../trace/checks.js';
|
|
3
|
+
import { flatLine } from '../notes/flatten.js';
|
|
4
|
+
import { cleanLine } from '../trace/redact.js';
|
|
5
|
+
import { STABLE_BRANCHES } from './params.js';
|
|
6
|
+
import { gatedGroups } from './risk.js';
|
|
7
|
+
import { askText, JUDGEMENT_JOBS, matchJob } from '../trace/jobs.js';
|
|
8
|
+
import { SAVE_REQUEST } from '../trace/typed.js';
|
|
9
|
+
/** At least one letter, so the digits of `trail skills keep 1 3` (init, 1b) can never be a name. */
|
|
10
|
+
export const NAME_RE = /^(?=[a-z0-9-]*[a-z])[a-z0-9][a-z0-9-]{1,47}$/;
|
|
11
|
+
/** Names Trail's own commands use. store.ts (g4) re-exports this list. */
|
|
12
|
+
export const BUILT_IN_NAMES = new Set([
|
|
13
|
+
'trail', 'graft', 'verify', 'run', 'init', 'review', 'skills', 'keep', 'forget', 'restore', 'add', 'show', 'draft', 'offers', 'help', 'on', 'off', 'promote', 'team', 'manual',
|
|
14
|
+
]);
|
|
15
|
+
/** Lesson and learning id shapes (`ls-` + 6 hex, `l-` + hex): `trail forget` reads them as ids first, so no skill takes one (D114 (2)). */
|
|
16
|
+
export const RESERVED_ID = /^(?:ls-[0-9a-f]{6}|l-[0-9a-f]{6,16})$/;
|
|
17
|
+
/** NAME_RE, not built in, not an id's shape, and a valid Agent Skills name (no `--`, no trailing `-`). */
|
|
18
|
+
export function goodName(name) {
|
|
19
|
+
return NAME_RE.test(name) && !/--|-$/.test(name) && !BUILT_IN_NAMES.has(name) && !RESERVED_ID.test(name);
|
|
20
|
+
}
|
|
21
|
+
const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
22
|
+
/** 'Oct 27', in local time. */
|
|
23
|
+
export function monthDay(iso) {
|
|
24
|
+
const d = new Date(iso);
|
|
25
|
+
return Number.isNaN(d.getTime()) ? 'an earlier day' : `${MONTHS[d.getMonth()]} ${d.getDate()}`;
|
|
26
|
+
}
|
|
27
|
+
const hm = (d) => `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;
|
|
28
|
+
const slug = (t) => t.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
29
|
+
export const repoName = (key) => key.split('/').filter(Boolean).pop() || 'this repo';
|
|
30
|
+
const cap = (w) => w.charAt(0).toUpperCase() + w.slice(1);
|
|
31
|
+
const joinWith = (items, last) => (items.length < 2 ? items.join('') : `${items.slice(0, -1).join(', ')} ${last} ${items[items.length - 1]}`);
|
|
32
|
+
const REGISTRIES = [
|
|
33
|
+
[/\b(?:npm|pnpm|yarn(?:\s+npm)?)\s+publish\b/, 'npm', 'npm'],
|
|
34
|
+
[/\btwine\s+upload\b/, 'pypi', 'PyPI'],
|
|
35
|
+
[/\bcargo\s+publish\b/, 'crates', 'crates.io'],
|
|
36
|
+
[/\bdocker\s+push\b/, 'docker', 'Docker'],
|
|
37
|
+
[/\bgem\s+push\b/, 'gem', 'RubyGems'],
|
|
38
|
+
];
|
|
39
|
+
/** Stable branches pushed, in order, from the calls the steps came from (`push origin beta` then `beta:prod` too). */
|
|
40
|
+
export function stableBranches(calls, jobWords) {
|
|
41
|
+
const pushed = factsFromCalls(calls.filter((c) => !c.failed), {}).pushedBranches.filter((b) => STABLE_BRANCHES.has(b));
|
|
42
|
+
const out = [...new Set(pushed)];
|
|
43
|
+
if (out.length)
|
|
44
|
+
return out;
|
|
45
|
+
return ['beta', 'staging', 'prod'].filter((b) => jobWords.includes(b));
|
|
46
|
+
}
|
|
47
|
+
/** The program the null-job name and title come from: the first step that isn't a wait. */
|
|
48
|
+
function mainProgram(steps) {
|
|
49
|
+
const s = steps.find((x) => !x.wait) ?? steps[0];
|
|
50
|
+
return s ? programOf(s.cmd) : null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The kind of tests the person asked for, in their own words ("run the integration tests"), from the job words their
|
|
54
|
+
* asks matched; null when they said only "the tests". Never the runner's name: nobody asked for "pytest tests".
|
|
55
|
+
*/
|
|
56
|
+
function testsTag(jobWordsSaid) {
|
|
57
|
+
return ['integration', 'e2e'].find((w) => jobWordsSaid.includes(w)) ?? null;
|
|
58
|
+
}
|
|
59
|
+
/** 4.6's stop words, and words that say how to keep a skill or how the job went, not what the job is. */
|
|
60
|
+
const ASK_SKIP = new Set(("a an the to and then please can could would you we i it its this that now also just so okay ok yes lets let's do some me my our for of on in at "
|
|
61
|
+
+ 'first again too as well be is are will save saved keep kept make made turn remember skill skills step steps next time later thanks thank '
|
|
62
|
+
+ 'great nice cool awesome perfect good pls works worked working done everything every all repo repos team when need needs want how what way '
|
|
63
|
+
+ 'us your they them he she was were been has have had there here').split(' '));
|
|
64
|
+
const KEEP_CLAUSE = new RegExp(SAVE_REQUEST.source, 'gi');
|
|
65
|
+
const SCOPE_CLAUSE = /\b(?:for|in|on|across)\s+(?:every|all(?:\s+my)?|this|the|my|our|each)\s+(?:repos?|repositories|team|mac|machine|laptop|projects?)\b|\beverywhere\b|\balways\b/g;
|
|
66
|
+
const CLAUSE_BREAK = /[,.;:!?()[\]"{}\n]+|\s(?:and then|then|so that|so|because|since|but)\s/;
|
|
67
|
+
/**
|
|
68
|
+
* D71 b: the asks of a run with no job class, from the person's own typed save request: its words minus the save
|
|
69
|
+
* clause, scope words, values (a URL, a path, a version, a sha, a number) and filler, clause by clause, kept when a
|
|
70
|
+
* clause leaves 2 to 5 words. At most 2. [] when the request says only how to keep it.
|
|
71
|
+
*/
|
|
72
|
+
export function askPhrases(typed) {
|
|
73
|
+
const t = askText(String(typed ?? '')).toLowerCase().replace(/[\u2018\u2019]/g, "'")
|
|
74
|
+
.replace(KEEP_CLAUSE, ' , ').replace(SCOPE_CLAUSE, ' , ')
|
|
75
|
+
.replace(/\b[a-z][a-z0-9+.-]*:\/\/\S+/g, ' ')
|
|
76
|
+
.replace(/\S*\w[./\\]\w\S*/g, ' ')
|
|
77
|
+
.replace(/(?<![\w-])(?=[0-9a-f]*\d)[0-9a-f]{7,40}(?![\w-])/g, ' ')
|
|
78
|
+
.replace(/(?<![\w-])#?\d[\w-]*/g, ' ');
|
|
79
|
+
const out = [];
|
|
80
|
+
for (const clause of t.split(CLAUSE_BREAK)) {
|
|
81
|
+
const words = clause.split(/[^a-z0-9-]+/).filter((w) => w.length >= 2 && /^[a-z]/.test(w) && !ASK_SKIP.has(w));
|
|
82
|
+
if (words.length < 2 || words.length > 5)
|
|
83
|
+
continue;
|
|
84
|
+
const phrase = words.join(' ');
|
|
85
|
+
if (!out.includes(phrase))
|
|
86
|
+
out.push(phrase);
|
|
87
|
+
if (out.length === 2)
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* D99: the job class an asked save names the skill after when the run's typed asks gave none. First the person's
|
|
94
|
+
* typed save request ("save this publish as a skill"), then the run's own commands: a step that publishes to a
|
|
95
|
+
* registry, checked with `npm view` (or not checked at all), is a release; pushes to stable branches are a ship.
|
|
96
|
+
* Null when neither says (the run keeps the first-step name). Judgement jobs never name a skill.
|
|
97
|
+
*/
|
|
98
|
+
export function askedJob(askedWith, steps, calls, checkFamily) {
|
|
99
|
+
const said = askedWith ? matchJob(String(askedWith).replace(KEEP_CLAUSE, ' , '))?.job ?? null : null;
|
|
100
|
+
if (said !== null && !JUDGEMENT_JOBS.has(said))
|
|
101
|
+
return said;
|
|
102
|
+
const text = steps.map((s) => s.cmd).join('\n');
|
|
103
|
+
if (REGISTRIES.some(([re]) => re.test(text)) && (checkFamily === 'npm-view' || checkFamily === null))
|
|
104
|
+
return 'release';
|
|
105
|
+
if (stableBranches(calls, []).length)
|
|
106
|
+
return 'ship';
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
/** 4.5 step 13's table. `asked`: a job-less run's asks (D71 b), from `askPhrases`; never the run's own words. */
|
|
110
|
+
export function jobWords(sheet, steps, extra = {}) {
|
|
111
|
+
const repo = repoName(sheet.repoKey);
|
|
112
|
+
const other = 'Jobs other than this one.';
|
|
113
|
+
const job = sheet.job;
|
|
114
|
+
if (job === 'release') {
|
|
115
|
+
const text = `${steps.map((s) => s.cmd).join('\n')}\n${extra.helperText ?? ''}`;
|
|
116
|
+
const reg = REGISTRIES.find(([re]) => re.test(text));
|
|
117
|
+
const asks = ['publish', 'release', 'bump', 'redo the publish'];
|
|
118
|
+
if (!reg)
|
|
119
|
+
return { base: 'release', title: `Release ${repo}`, lead: `Releases ${repo}`, asks, statusAsks: ['is it published', 'did it publish'], dontUse: 'Pre-releases, or packages other than the ones above.' };
|
|
120
|
+
return { base: `release-${reg[1]}`, title: `Release ${repo} to ${reg[2]}`, lead: `Publishes ${repo} to ${reg[2]}`, asks: [...asks, `ship to ${reg[1]}`], statusAsks: ['is it published', 'did it publish'], dontUse: 'Pre-releases, or packages other than the ones above.' };
|
|
121
|
+
}
|
|
122
|
+
if (job === 'ship') {
|
|
123
|
+
const b = stableBranches(extra.calls ?? steps.map((s, i) => ({ id: `s${i}`, cmd: s.cmd, failed: false })), sheet.jobWords);
|
|
124
|
+
const dontUse = 'Pushes to other branches, or other repos.';
|
|
125
|
+
if (b.length >= 2) {
|
|
126
|
+
const [b1, b2] = [b[0], b[b.length - 1]];
|
|
127
|
+
return {
|
|
128
|
+
base: `ship-${b1}-then-${b2}`, title: `Ship ${repo}: ${b1}, then ${b2}`, lead: `Ships ${repo} to ${b1}, then fast-forwards ${b2}`,
|
|
129
|
+
asks: [`push to ${b1}`, `ff to ${b2}`, `fast-forward ${b2}`, `promote to ${b2}`, `deploy to ${b2}`, `update ${b2}`, 'ship it'],
|
|
130
|
+
statusAsks: ['is it live', `is ${b2} updated`, 'did it deploy'], dontUse,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (b.length === 1) {
|
|
134
|
+
const one = b[0];
|
|
135
|
+
return { base: `ship-${one}`, title: `Ship ${repo} to ${one}`, lead: `Ships ${repo} to ${one}`, asks: [`push to ${one}`, `deploy to ${one}`, `update ${one}`, 'ship it'], statusAsks: ['is it live', `is ${one} updated`, 'did it deploy'], dontUse };
|
|
136
|
+
}
|
|
137
|
+
return { base: 'ship', title: `Ship ${repo}`, lead: `Ships ${repo}`, asks: ['ship it', 'deploy it'], statusAsks: ['is it live', 'did it deploy'], dontUse };
|
|
138
|
+
}
|
|
139
|
+
if (job === 'tests') {
|
|
140
|
+
const tag = testsTag(sheet.jobWords);
|
|
141
|
+
if (!tag)
|
|
142
|
+
return { base: 'run-tests', title: `Run ${repo}'s tests`, lead: `Runs ${repo}'s tests`, asks: ['run the tests'], statusAsks: ['did the tests pass'], dontUse: 'Other test suites.' };
|
|
143
|
+
return { base: `${tag}-tests`, title: `Run ${repo}'s ${tag} tests`, lead: `Runs ${repo}'s ${tag} tests`, asks: [`${tag} tests`, `run the ${tag} tests`], statusAsks: ['did the tests pass'], dontUse: 'Other test suites.' };
|
|
144
|
+
}
|
|
145
|
+
if (job === 'report') {
|
|
146
|
+
const w = sheet.jobWords.filter((x) => x !== 'report').slice(0, 2);
|
|
147
|
+
const dontUse = 'Other numbers or other tables.';
|
|
148
|
+
if (w.length === 2) {
|
|
149
|
+
const [w1, w2] = w;
|
|
150
|
+
return { base: `${w1}-${w2}-report`, title: `${cap(w1)} ${w2} report for ${repo}`, lead: `Reads the ${w1} ${w2} numbers for ${repo}`, asks: [`any ${w1} ${w2}`, `${w1} ${w2}`, `how many ${w2}`], statusAsks: [], dontUse };
|
|
151
|
+
}
|
|
152
|
+
if (w.length === 1)
|
|
153
|
+
return { base: `${w[0]}-report`, title: `${cap(w[0])} report for ${repo}`, lead: `Reads the ${w[0]} numbers for ${repo}`, asks: [w[0]], statusAsks: [], dontUse };
|
|
154
|
+
return { base: 'report', title: `Report for ${repo}`, lead: `Reads the numbers for ${repo}`, asks: ['report'], statusAsks: [], dontUse };
|
|
155
|
+
}
|
|
156
|
+
if (job === 'run-local')
|
|
157
|
+
return { base: 'run-locally', title: `Run ${repo} locally`, lead: `Starts ${repo} locally`, asks: ['open it locally', 'run it locally', 'localhost'], statusAsks: [], dontUse: other };
|
|
158
|
+
// A check that is a step (tests, a query, a push) is what the run was for: it names the skill.
|
|
159
|
+
const prog = (extra.main !== undefined ? programOf(extra.main) : null) ?? mainProgram(steps) ?? 'these commands';
|
|
160
|
+
// D71 b: a common word of the run ("done", "test", the repo's name) as an ask fired on unrelated prompts.
|
|
161
|
+
return { base: slug(prog) || 'steps', title: `Run ${prog} in ${repo}`, lead: `Runs ${prog} in ${repo}`, asks: extra.asked ?? [], statusAsks: [], dontUse: other };
|
|
162
|
+
}
|
|
163
|
+
/** The base name, then -<repo>, then -2, -3 ...: the first that is a good name and free. */
|
|
164
|
+
export function freeName(base, repoKey, taken) {
|
|
165
|
+
const fit = (n) => n.slice(0, 48).replace(/-+$/, '');
|
|
166
|
+
const b = goodName(fit(base)) ? fit(base) : fit(`run-${base}`);
|
|
167
|
+
const tries = [b, fit(`${b}-${slug(repoName(repoKey))}`)];
|
|
168
|
+
for (let n = 2; n < 100; n++)
|
|
169
|
+
tries.push(`${b.slice(0, 44).replace(/-+$/, '')}-${n}`);
|
|
170
|
+
return tries.find((n) => goodName(n) && !taken(n)) ?? `${b.slice(0, 40)}-${repoKey.length}`;
|
|
171
|
+
}
|
|
172
|
+
export function proposeName(sheet, steps, taken) {
|
|
173
|
+
return freeName(jobWords(sheet, steps).base, sheet.repoKey, taken);
|
|
174
|
+
}
|
|
175
|
+
/** Words an ask starts with when it is something to do: "asked to run the tests", "asked to publish". */
|
|
176
|
+
const ASK_VERBS = new Set(['run', 'rerun', 'push', 'ff', 'fast-forward', 'promote', 'deploy', 'update', 'ship', 'publish', 'release', 'bump', 'redo',
|
|
177
|
+
'open', 'start', 'restart', 'stop', 'build', 'rebuild', 'test', 'check', 'fix', 'merge', 'rebase', 'lint', 'format', 'generate', 'regenerate',
|
|
178
|
+
'install', 'upgrade', 'clean', 'reset', 'sync', 'pull', 'fetch', 'commit', 'tag', 'create', 'make', 'add', 'remove', 'delete', 'migrate', 'seed',
|
|
179
|
+
'serve', 'compile', 'pack', 'upload', 'download', 'review', 'refresh', 'roll', 'revert', 'cut', 'prepare', 'verify', 'show', 'list', 'count',
|
|
180
|
+
'get', 'find', 'read', 'send', 'do', 'try', 'tidy', 'trim', 'backup', 'restore', 'export', 'import', 'reindex', 'index', 'measure', 'profile']);
|
|
181
|
+
const ASK_QUESTION = /^(?:how|what|which|who|when|where|why|is|are|was|were|did|does|can)\b/i;
|
|
182
|
+
/** How one ask follows "asked" or "you ask": `to` a verb, a question bare, `about` a gerund, `for` anything else. */
|
|
183
|
+
function askLead(ask) {
|
|
184
|
+
const first = ask.trim().split(/\s+/)[0]?.toLowerCase() ?? '';
|
|
185
|
+
if (ASK_QUESTION.test(first))
|
|
186
|
+
return '';
|
|
187
|
+
if (/^\S+ tests$/i.test(ask.trim()))
|
|
188
|
+
return 'for';
|
|
189
|
+
if (ASK_VERBS.has(first))
|
|
190
|
+
return 'to';
|
|
191
|
+
return /\w{3,}ing$/.test(first) ? 'about' : 'for';
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* fix-lab5: the asks as words after "asked" (or "you ask"), each the way it reads: "to publish, release or bump",
|
|
195
|
+
* "for integration tests, or to run the integration tests", "about regenerating the api client", "how many users".
|
|
196
|
+
* Asks next to each other that take the same word share it.
|
|
197
|
+
*/
|
|
198
|
+
export function askedWords(asks) {
|
|
199
|
+
const groups = [];
|
|
200
|
+
for (const a of asks) {
|
|
201
|
+
const lead = askLead(a);
|
|
202
|
+
const last = groups[groups.length - 1];
|
|
203
|
+
if (last && last.lead === lead && lead !== '')
|
|
204
|
+
last.items.push(a);
|
|
205
|
+
else
|
|
206
|
+
groups.push({ lead, items: [a] });
|
|
207
|
+
}
|
|
208
|
+
const parts = groups.map((g) => `${g.lead ? `${g.lead} ` : ''}${joinWith(g.items, 'or')}`);
|
|
209
|
+
return parts.length < 2 ? parts.join('') : `${parts.slice(0, -1).join(', ')}, or ${parts[parts.length - 1]}`;
|
|
210
|
+
}
|
|
211
|
+
/** "<lead>, from the steps that worked on <Mon D>. Use when asked to <a, b or c>.", at most 300 characters. */
|
|
212
|
+
export function describe(lead, endedAt, asks) {
|
|
213
|
+
if (!asks.length)
|
|
214
|
+
return flatLine(`${lead}, from the steps that worked on ${monthDay(endedAt)}.`, 300);
|
|
215
|
+
const make = (a) => flatLine(`${lead}, from the steps that worked on ${monthDay(endedAt)}. Use when asked ${askedWords(a)}.`, 1000);
|
|
216
|
+
for (let n = asks.length; n >= 1; n--) {
|
|
217
|
+
const d = make(asks.slice(0, n));
|
|
218
|
+
if (d.length <= 300)
|
|
219
|
+
return d;
|
|
220
|
+
}
|
|
221
|
+
return flatLine(make(asks.slice(0, 1)), 300);
|
|
222
|
+
}
|
|
223
|
+
const split = (s) => (s ? s.split(' ; ').map((x) => x.trim()).filter(Boolean) : []);
|
|
224
|
+
function probeWords(p) {
|
|
225
|
+
let m;
|
|
226
|
+
if (p === 'git status --porcelain')
|
|
227
|
+
return 'no uncommitted changes (git status --porcelain)';
|
|
228
|
+
if ((m = /^git rev-parse --abbrev-ref HEAD = (\S+)$/.exec(p)))
|
|
229
|
+
return `on ${m[1]} (git rev-parse --abbrev-ref HEAD)`;
|
|
230
|
+
if ((m = /^command -v (\S+)$/.exec(p)))
|
|
231
|
+
return `${m[1]} is installed (${p})`;
|
|
232
|
+
if ((m = /^(?:test -\w|\[ -S) (\S+)/.exec(p)))
|
|
233
|
+
return `${m[1]} is there (${p})`;
|
|
234
|
+
if ((m = /^git rev-parse --verify (\S+)$/.exec(p)))
|
|
235
|
+
return `${m[1]} exists (${p})`;
|
|
236
|
+
return p;
|
|
237
|
+
}
|
|
238
|
+
const WAIT_TOKEN = /^s=\$SECONDS; until \[ "\$\((.*)\)" = "([^"]*)" \]; do /;
|
|
239
|
+
const WAIT_ANY = /^s=\$SECONDS; (until|while) (.*) >\/dev\/null 2>&1; do /;
|
|
240
|
+
function stepWords(s) {
|
|
241
|
+
if (s.wait) {
|
|
242
|
+
const t = WAIT_TOKEN.exec(s.cmd);
|
|
243
|
+
if (t)
|
|
244
|
+
return `wait up to 5 min until ${t[1]} shows ${t[2]}`;
|
|
245
|
+
const a = WAIT_ANY.exec(s.cmd);
|
|
246
|
+
if (a)
|
|
247
|
+
return a[1] === 'until' ? `wait up to 5 min until ${a[2]} works` : `wait up to 5 min while ${a[2]} still works`;
|
|
248
|
+
}
|
|
249
|
+
return s.bg ? `${s.cmd} (in the background)` : s.cmd;
|
|
250
|
+
}
|
|
251
|
+
const LEFT = [
|
|
252
|
+
['failed', (n) => `${n} that failed`],
|
|
253
|
+
['lookOnly', (n) => `${n} that only looked around`],
|
|
254
|
+
['duplicates', (n) => `${n} ${n === 1 ? 'repeat' : 'repeats'}`],
|
|
255
|
+
['plumbing', (n) => `${n} that only set up the shell`],
|
|
256
|
+
['work', (n) => `${n} that changed files`],
|
|
257
|
+
];
|
|
258
|
+
/** D58 b: a left-out step as the draft shows it (`clean`: compile's step cleaning and paths), and where it ran. */
|
|
259
|
+
export function elsewhereLines(calls, repoKey, clean) {
|
|
260
|
+
const out = [];
|
|
261
|
+
for (const c of calls) {
|
|
262
|
+
const text = c.cmd === null ? null : cleanLine(clean(c.cmd), 100);
|
|
263
|
+
const cmd = text ?? (c.truncated ? 'a command too long to show' : "a command Trail can't show (it held a secret)");
|
|
264
|
+
const where = c.key === null ? 'outside any repo' : c.key !== repoKey ? `in ${repoName(c.key)}` : "in a folder Trail couldn't follow";
|
|
265
|
+
if (!out.some((x) => x.cmd === cmd && x.where === where))
|
|
266
|
+
out.push({ cmd, where });
|
|
267
|
+
}
|
|
268
|
+
return out;
|
|
269
|
+
}
|
|
270
|
+
/** D59a: a joined sheet's compactions, its first start, and the steps whose every run came before the last compaction. */
|
|
271
|
+
export function carriedSteps(sheet, steps) {
|
|
272
|
+
const n = (sheet.joined ?? []).reduce((a, p) => a + p.calls, 0);
|
|
273
|
+
const before = new Set(sheet.calls.slice(0, n).map((c) => c.id));
|
|
274
|
+
return { compactions: sheet.joined?.length ?? 0, startedAt: sheet.startedAt, steps: steps.filter((s) => s.from?.length && s.from.every((id) => before.has(id))).map((s) => s.n) };
|
|
275
|
+
}
|
|
276
|
+
/** "step 2", "steps 1 and 2", "steps 1, 2 and 3". */
|
|
277
|
+
const stepList = (ns) => `${ns.length === 1 ? 'step' : 'steps'} ${joinWith(ns.map(String), 'and')}`;
|
|
278
|
+
/** D59a: the draft line for a job a compaction cut, and which steps ran before the (last) compaction. */
|
|
279
|
+
function carriedWords(k) {
|
|
280
|
+
const across = k.compactions === 1 ? 'a compaction' : `${k.compactions} compactions`;
|
|
281
|
+
const before = k.compactions === 1 ? 'before it' : 'before the last one';
|
|
282
|
+
return ` compaction the job ran across ${across}: ${k.steps.length ? `${stepList(k.steps)} ran ${before}, the rest after` : `every step ran after ${k.compactions === 1 ? 'it' : 'the last one'}`}`;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* D59b: a check read with a deploy status tool, not a command: what to read, the same way the run did.
|
|
286
|
+
* The deployment is named by the commit param when one holds its commit, else by its branch, else as the new commit.
|
|
287
|
+
*/
|
|
288
|
+
export function toolCheckWords(tool, facts, params) {
|
|
289
|
+
const [, server = '', name = tool] = /^mcp__(.+)__([^_].*)$/.exec(tool) ?? [];
|
|
290
|
+
const provider = /vercel/i.test(server) ? 'Vercel' : flatLine(server, 40) || 'the deploy';
|
|
291
|
+
const sha = facts.sha;
|
|
292
|
+
const commit = sha ? params.find((p) => p.shape === 'sha' && p.seen.some((v) => v.length >= 7 && (sha.startsWith(v) || v.startsWith(sha)))) : undefined;
|
|
293
|
+
const branch = facts.branch ? params.find((p) => p.seen.includes(facts.branch)) : undefined;
|
|
294
|
+
const target = commit ? `{${commit.name}}` : facts.branch ? `the newest commit on ${branch ? `{${branch.name}}` : facts.branch}` : 'the new commit';
|
|
295
|
+
return `read the ${provider} deployment for ${target} with ${name}`;
|
|
296
|
+
}
|
|
297
|
+
/** The "show me" text (2.1). */
|
|
298
|
+
export function draftText(c, sheet) {
|
|
299
|
+
const from = c.carried?.startedAt ?? sheet.startedAt;
|
|
300
|
+
const start = new Date(from);
|
|
301
|
+
const end = new Date(sheet.endedAt);
|
|
302
|
+
const sameDay = monthDay(from) === monthDay(sheet.endedAt);
|
|
303
|
+
const when = `${monthDay(from)}, ${hm(start)} to ${sameDay ? '' : `${monthDay(sheet.endedAt)}, `}${hm(end)}`;
|
|
304
|
+
const out = [`${c.name} · copied from the run that just ${sheet.checked ? 'worked' : 'ran'} (${when})`];
|
|
305
|
+
if (c.carried)
|
|
306
|
+
out.push(carriedWords(c.carried));
|
|
307
|
+
for (const x of split(c.meta['check-first']))
|
|
308
|
+
out.push(` check first ${x}`);
|
|
309
|
+
for (const x of split(c.meta.ready))
|
|
310
|
+
out.push(` ready ${probeWords(x)}`);
|
|
311
|
+
const groups = gatedGroups(c.steps);
|
|
312
|
+
for (const s of c.steps) {
|
|
313
|
+
const g = groups.find((x) => x.steps[0] === s.n);
|
|
314
|
+
if (g)
|
|
315
|
+
out.push(` ■ can't be undone: Claude Code asks you once, right before step ${s.n}${g.steps.length > 1 ? ` (it covers ${joinWith(g.steps.map(String), 'and')})` : ''}`);
|
|
316
|
+
out.push(` ${s.n} ${stepWords(s)}`);
|
|
317
|
+
}
|
|
318
|
+
if (!c.check)
|
|
319
|
+
out.push(' check none: no check ran in the run this came from');
|
|
320
|
+
else if (c.checkIsStep)
|
|
321
|
+
out.push(` check step ${[...c.steps].reverse().find((s) => s.cmd === c.check)?.n ?? c.steps.length} passing is the check`);
|
|
322
|
+
else if (c.meta['check-tool'])
|
|
323
|
+
out.push(` check ${c.check}: it should show ${c.checkShows ?? 'READY'}`);
|
|
324
|
+
else
|
|
325
|
+
out.push(` check ${c.check} ${c.checkShows ? `shows ${c.checkShows}` : 'works'}`);
|
|
326
|
+
for (const h of c.helpers)
|
|
327
|
+
out.push(` helper ${h.file}, copied into the skill from a temporary folder`);
|
|
328
|
+
for (const p of c.params) {
|
|
329
|
+
const seen = p.seen[0] ? `; it was ${p.seen[0]} this time` : '';
|
|
330
|
+
if (p.default?.startsWith('$('))
|
|
331
|
+
out.push(` {${p.name}} from what you type, or ${p.default.slice(2, -1)}${seen}`);
|
|
332
|
+
else if (p.default !== undefined)
|
|
333
|
+
out.push(` {${p.name}} from what you type, or ${p.default} as last time`);
|
|
334
|
+
else
|
|
335
|
+
out.push(` {${p.name}} from what you type${seen}`);
|
|
336
|
+
}
|
|
337
|
+
const away = c.elsewhere ?? [];
|
|
338
|
+
const total = Object.values(c.leftOut).reduce((a, b) => a + b, 0) + away.length;
|
|
339
|
+
const parts = LEFT.filter(([k]) => c.leftOut[k]).map(([k, f]) => f(c.leftOut[k]));
|
|
340
|
+
if (away.length)
|
|
341
|
+
parts.push(`${away.length} that ran outside this repo`);
|
|
342
|
+
if (total)
|
|
343
|
+
out.push(` left out ${total} ${total === 1 ? 'command' : 'commands'}: ${parts.join(', ')}`);
|
|
344
|
+
// D58 b: what ran elsewhere, so the person sees it before saying yes.
|
|
345
|
+
for (const e of away.slice(0, 6))
|
|
346
|
+
out.push(` elsewhere ${e.cmd} (${e.where})`);
|
|
347
|
+
if (away.length > 6)
|
|
348
|
+
out.push(` elsewhere and ${away.length - 6} more`);
|
|
349
|
+
out.push(` just for you, ${c.meta.applies === 'every repo' ? 'in every repo' : 'in this repo'} · nothing is shared or uploaded`);
|
|
350
|
+
return out.join('\n');
|
|
351
|
+
}
|
|
352
|
+
/** A refusal in plain words: "a step reads a credential file: `TOKEN=$(python3 -c …auth.json…)`". */
|
|
353
|
+
export function refusalWords(reason, detail) {
|
|
354
|
+
const d = flatLine(detail, 120);
|
|
355
|
+
switch (reason) {
|
|
356
|
+
case 'judgement':
|
|
357
|
+
return d === 'sweep'
|
|
358
|
+
? "going through PRs takes judgement each time, so Trail doesn't keep it as fixed steps"
|
|
359
|
+
: "getting checks green takes judgement each time, so Trail doesn't keep it as fixed steps";
|
|
360
|
+
case 'no-steps': return d === 'report'
|
|
361
|
+
? 'the numbers came from a script written inline, not from a command Trail can keep'
|
|
362
|
+
: 'no command in the run did the job itself: they only looked around, set up the shell or changed files';
|
|
363
|
+
case 'too-long': return d === 'overflow' ? 'the run had more commands than Trail keeps for one job' : `the job takes ${d || 'more than 12'} steps, and a skill holds at most 12`;
|
|
364
|
+
case 'step-too-long': return `a step is longer than 300 characters: \`${d}\``;
|
|
365
|
+
case 'multi-line': return /^(?:uses|needs|runs) [^`]*: `/.test(d) ? `a step ${d}` : `a step runs over several lines (a heredoc or an inline script): \`${d}\``;
|
|
366
|
+
case 'never-save': return d.startsWith('bug: ') ? `the skill file came out wrong (${d.slice(5)})` : `a step ${d}`;
|
|
367
|
+
case 'secret': return "a step holds a secret Trail can't turn into a variable name";
|
|
368
|
+
case 'scratch-path': return `a step uses a temporary file: \`${d}\``;
|
|
369
|
+
case 'outside-repo': return `a step ran outside this repo: \`${d}\``;
|
|
370
|
+
case 'truncated': return 'a step is over 2,000 characters';
|
|
371
|
+
case 'no-check': return d === 'version'
|
|
372
|
+
? "the check reads a version, but no step names or makes the version it should show, so it can't tell this release from the last one"
|
|
373
|
+
: 'nothing in the run checked that the job worked';
|
|
374
|
+
case 'trivial': return `every step is already a script in the repo (\`${d}\`), so there is nothing worked out to keep`;
|
|
375
|
+
case 'helper-missing': return `a step runs a temporary script that is gone now: \`${d}\``;
|
|
376
|
+
case 'answers-prompt': return `a step answers a login or confirmation prompt for the person: \`${d}\``;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/** D56a: what a push check shows, its branch as the param that holds it. */
|
|
380
|
+
export function pushShows(branch, params) {
|
|
381
|
+
const p = branch ? params.find((x) => x.seen.includes(branch)) : undefined;
|
|
382
|
+
const dst = p ? `{${p.name}}` : branch;
|
|
383
|
+
return dst ? `${dst} moved: git prints old..new -> ${dst}, not "Everything up-to-date"` : 'the branch moved: git prints old..new, not "Everything up-to-date"';
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=compile-words.js.map
|