@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,133 @@
|
|
|
1
|
+
import { isTestHome } from './host-facts.js';
|
|
2
|
+
import { readJsonSafe, trailPath, withLock, writePrivate } from '../util/private-fs.js';
|
|
3
|
+
export { isTestHome, labInteractive } from './host-facts.js';
|
|
4
|
+
export const DEFAULT_SETTINGS = Object.freeze({
|
|
5
|
+
v: 1, skills: 'off', onSince: null, offers: 'on', offersOffAt: null, offRepos: Object.freeze([]),
|
|
6
|
+
pausedUntil: Object.freeze({}), skillsOff: Object.freeze([]),
|
|
7
|
+
lastNine: Object.freeze([]), governorSaidAt: null,
|
|
8
|
+
});
|
|
9
|
+
/** How long a person's command waits for the file; a hook's bookkeeping waits less. */
|
|
10
|
+
const PERSON_WAIT_MS = 1000;
|
|
11
|
+
const HOOK_WAIT_MS = 200;
|
|
12
|
+
const ANSWERS = new Set(['yes', 'no', 'none']);
|
|
13
|
+
function settingsPath(env) {
|
|
14
|
+
return trailPath(env, 'settings.json');
|
|
15
|
+
}
|
|
16
|
+
const strOrNull = (v) => (typeof v === 'string' ? v : null);
|
|
17
|
+
const strings = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === 'string') : []);
|
|
18
|
+
/** The known fields of whatever was on disk, each its default when missing or of the wrong shape. */
|
|
19
|
+
function fromRaw(raw) {
|
|
20
|
+
const r = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
|
|
21
|
+
const paused = {};
|
|
22
|
+
if (r.pausedUntil && typeof r.pausedUntil === 'object' && !Array.isArray(r.pausedUntil)) {
|
|
23
|
+
for (const [k, v] of Object.entries(r.pausedUntil))
|
|
24
|
+
if (typeof v === 'string')
|
|
25
|
+
paused[k] = v;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
v: 1,
|
|
29
|
+
skills: r.skills === 'on' ? 'on' : 'off',
|
|
30
|
+
onSince: strOrNull(r.onSince),
|
|
31
|
+
offers: r.offers === 'off' ? 'off' : 'on',
|
|
32
|
+
offersOffAt: strOrNull(r.offersOffAt),
|
|
33
|
+
offRepos: strings(r.offRepos),
|
|
34
|
+
pausedUntil: paused,
|
|
35
|
+
skillsOff: strings(r.skillsOff),
|
|
36
|
+
lastNine: (Array.isArray(r.lastNine) ? r.lastNine : []).filter((a) => ANSWERS.has(a)).slice(-9),
|
|
37
|
+
governorSaidAt: strOrNull(r.governorSaidAt),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Defaults on a missing or bad file; unknown keys are kept on every write. */
|
|
41
|
+
export function readSettings(env) {
|
|
42
|
+
return fromRaw(readJsonSafe(settingsPath(env)));
|
|
43
|
+
}
|
|
44
|
+
/** Read, change, write back under the file's lock, keeping keys this version doesn't know. */
|
|
45
|
+
function update(env, change, waitMs) {
|
|
46
|
+
const path = settingsPath(env);
|
|
47
|
+
const done = withLock(path, () => {
|
|
48
|
+
const raw = readJsonSafe(path);
|
|
49
|
+
const keep = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
|
|
50
|
+
const s = fromRaw(raw);
|
|
51
|
+
change(s);
|
|
52
|
+
writePrivate(path, `${JSON.stringify({ ...keep, ...s }, null, 2)}\n`);
|
|
53
|
+
return s;
|
|
54
|
+
}, waitMs);
|
|
55
|
+
if (!done.ok)
|
|
56
|
+
throw new Error('trail: the skills settings are busy (another trail command is writing them). Try again.');
|
|
57
|
+
return done.value;
|
|
58
|
+
}
|
|
59
|
+
/** TRAIL_TEST_NOW (ISO) in a test home only; else new Date(). */
|
|
60
|
+
export function trailNow(env = process.env) {
|
|
61
|
+
const fixed = env.TRAIL_TEST_NOW;
|
|
62
|
+
if (fixed && isTestHome(env)) {
|
|
63
|
+
const d = new Date(fixed);
|
|
64
|
+
if (!Number.isNaN(d.getTime()))
|
|
65
|
+
return d;
|
|
66
|
+
}
|
|
67
|
+
return new Date();
|
|
68
|
+
}
|
|
69
|
+
/** The local calendar date `YYYY-MM-DD` of a time: days (pauses, session-days, last worked) are the person's days. */
|
|
70
|
+
export function localDate(at) {
|
|
71
|
+
const d = typeof at === 'string' ? new Date(at) : at;
|
|
72
|
+
const two = (n) => String(n).padStart(2, '0');
|
|
73
|
+
return `${d.getFullYear()}-${two(d.getMonth() + 1)}-${two(d.getDate())}`;
|
|
74
|
+
}
|
|
75
|
+
// Person-only setters. Only src/skills/cli-skills.ts imports these (a static test, G0).
|
|
76
|
+
/** onSince = now when it turns on. */
|
|
77
|
+
export function setSkills(on, env, now = new Date()) {
|
|
78
|
+
return update(env, (s) => {
|
|
79
|
+
if (on && (s.skills !== 'on' || s.onSince === null))
|
|
80
|
+
s.onSince = now.toISOString();
|
|
81
|
+
s.skills = on ? 'on' : 'off';
|
|
82
|
+
}, PERSON_WAIT_MS);
|
|
83
|
+
}
|
|
84
|
+
/** here: adds or removes that repo key in offRepos; a global off sets offersOffAt. */
|
|
85
|
+
export function setOffers(on, here, env, now = new Date()) {
|
|
86
|
+
return update(env, (s) => {
|
|
87
|
+
if (here !== null) {
|
|
88
|
+
s.offRepos = s.offRepos.filter((k) => k !== here);
|
|
89
|
+
if (!on)
|
|
90
|
+
s.offRepos.push(here);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (!on && s.offers !== 'off')
|
|
94
|
+
s.offersOffAt = now.toISOString();
|
|
95
|
+
if (on)
|
|
96
|
+
s.offersOffAt = null;
|
|
97
|
+
s.offers = on ? 'on' : 'off';
|
|
98
|
+
}, PERSON_WAIT_MS);
|
|
99
|
+
}
|
|
100
|
+
export function setSkillOff(name, off, env) {
|
|
101
|
+
return update(env, (s) => {
|
|
102
|
+
s.skillsOff = s.skillsOff.filter((n) => n !== name);
|
|
103
|
+
if (off)
|
|
104
|
+
s.skillsOff.push(name);
|
|
105
|
+
}, PERSON_WAIT_MS);
|
|
106
|
+
}
|
|
107
|
+
// Bookkeeping writers. Only src/skills/offers.ts imports these (the same test).
|
|
108
|
+
export function pauseRepo(repoKey, until, env) {
|
|
109
|
+
return update(env, (s) => {
|
|
110
|
+
s.pausedUntil = { ...s.pausedUntil, [repoKey]: localDate(until) };
|
|
111
|
+
}, HOOK_WAIT_MS);
|
|
112
|
+
}
|
|
113
|
+
export function noteGovernor(lastNine, saidAt, env) {
|
|
114
|
+
return update(env, (s) => {
|
|
115
|
+
s.lastNine = lastNine.filter((a) => ANSWERS.has(a)).slice(-9);
|
|
116
|
+
s.governorSaidAt = saidAt;
|
|
117
|
+
}, HOOK_WAIT_MS);
|
|
118
|
+
}
|
|
119
|
+
export function skillsOn(env) {
|
|
120
|
+
return readSettings(env).skills === 'on';
|
|
121
|
+
}
|
|
122
|
+
export function offersHere(repoKey, now = new Date(), env) {
|
|
123
|
+
const s = readSettings(env);
|
|
124
|
+
if (s.offers === 'off')
|
|
125
|
+
return { ok: false, why: 'off' };
|
|
126
|
+
if (s.offRepos.includes(repoKey))
|
|
127
|
+
return { ok: false, why: 'off-here' };
|
|
128
|
+
const until = s.pausedUntil[repoKey];
|
|
129
|
+
if (until && until > localDate(now))
|
|
130
|
+
return { ok: false, why: 'paused' };
|
|
131
|
+
return { ok: true };
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/skills/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The line diff of two skill files, the size gate a fold must pass (phase 2
|
|
3
|
+
* design 4.3, spec 13), and the printed diff a person reads for `show me`, a
|
|
4
|
+
* proposal beside a hand-edited file, or (phase 3) a new file in a repo.
|
|
5
|
+
*
|
|
6
|
+
* Pure and bounded: texts over 64 KB, or a changed middle too big to align
|
|
7
|
+
* cheaply, are read as all removed and all added, never line by line.
|
|
8
|
+
*/
|
|
9
|
+
import type { CompiledSkill } from './types.js';
|
|
10
|
+
export interface LineDiff {
|
|
11
|
+
removed: string[];
|
|
12
|
+
added: string[];
|
|
13
|
+
hunks: Array<{
|
|
14
|
+
at: number;
|
|
15
|
+
del: string[];
|
|
16
|
+
add: string[];
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
/** Spec 13: a fold changes at most 800 characters, and at most 40% of the file. */
|
|
20
|
+
export declare const FOLD_MAX_CHARS = 800;
|
|
21
|
+
export declare const FOLD_MAX_SHARE = 0.4;
|
|
22
|
+
/** LCS on lines. A hunk's `at` is how many lines of `a` come before it (0-based). */
|
|
23
|
+
export declare function lineDiff(a: string, b: string): LineDiff;
|
|
24
|
+
/**
|
|
25
|
+
* 4.3 as D131 changed it: the characters an edit changes (every removed and added line, its line break counted), step
|
|
26
|
+
* numbers taken out first, so one inserted step anywhere costs about its own length. `share` is of the file as it is.
|
|
27
|
+
*/
|
|
28
|
+
export declare function sizeGate(before: string, after: string): {
|
|
29
|
+
chars: number;
|
|
30
|
+
share: number;
|
|
31
|
+
ok: boolean;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* A unified diff (3 lines of context), at most `maxLines` lines with the more-lines line, step text as it is. '' when
|
|
35
|
+
* the texts are equal. Each line at most 400 characters, control characters and bidi marks as escapes (review). An empty `a` prints a new file: phase 3's `renderNewFileDiff` prints through it.
|
|
36
|
+
*/
|
|
37
|
+
export declare function printDiff(a: string, b: string, labels: [string, string], maxLines?: number): string;
|
|
38
|
+
/** The Run lines a change touches, for "1 line changes": per hunk the larger of what goes and what comes. */
|
|
39
|
+
export declare function runLinesChanged(before: CompiledSkill, after: CompiledSkill): number;
|
|
40
|
+
//# sourceMappingURL=skill-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-diff.d.ts","sourceRoot":"","sources":["../../src/skills/skill-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,MAAM,WAAW,QAAQ;IAAG,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE;AAE5H,mFAAmF;AACnF,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,cAAc,MAAM,CAAC;AAyDlC,qFAAqF;AACrF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,CAWvD;AAWD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,CAMrG;AAmBD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,SAAkB,GAAG,MAAM,CAoC5G;AAKD,6GAA6G;AAC7G,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAGnF"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { oneLine } from './skillmd.js';
|
|
2
|
+
import { MAX_SKILL_BYTES } from './store-fs.js';
|
|
3
|
+
/** Spec 13: a fold changes at most 800 characters, and at most 40% of the file. */
|
|
4
|
+
export const FOLD_MAX_CHARS = 800;
|
|
5
|
+
export const FOLD_MAX_SHARE = 0.4;
|
|
6
|
+
/** The printed diff's default length, the more-lines line included. */
|
|
7
|
+
const PRINT_MAX_LINES = 40;
|
|
8
|
+
const CONTEXT = 3;
|
|
9
|
+
/** Cells of the alignment table after the common start and end are taken off; past it the middle is one hunk. */
|
|
10
|
+
const MAX_CELLS = 4_000_000;
|
|
11
|
+
/** Lines of a text; a trailing line break ends the last line, it doesn't start an empty one. '' has none. */
|
|
12
|
+
function linesOf(text) {
|
|
13
|
+
const t = String(text ?? '');
|
|
14
|
+
if (!t)
|
|
15
|
+
return [];
|
|
16
|
+
const out = t.split('\n');
|
|
17
|
+
if (out[out.length - 1] === '')
|
|
18
|
+
out.pop();
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
/** The edit script of the middle (LCS, a table of at most MAX_CELLS); past it, all removed then all added. */
|
|
22
|
+
function middleOps(a, b) {
|
|
23
|
+
const n = a.length;
|
|
24
|
+
const m = b.length;
|
|
25
|
+
if (!n || !m || n * m > MAX_CELLS)
|
|
26
|
+
return [...a.map((line) => ({ kind: '-', line })), ...b.map((line) => ({ kind: '+', line }))];
|
|
27
|
+
const w = m + 1;
|
|
28
|
+
const t = new Uint32Array((n + 1) * w);
|
|
29
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
30
|
+
for (let j = m - 1; j >= 0; j--) {
|
|
31
|
+
t[i * w + j] = a[i] === b[j] ? t[(i + 1) * w + j + 1] + 1 : Math.max(t[(i + 1) * w + j], t[i * w + j + 1]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const ops = [];
|
|
35
|
+
let i = 0;
|
|
36
|
+
let j = 0;
|
|
37
|
+
while (i < n && j < m) {
|
|
38
|
+
if (a[i] === b[j]) {
|
|
39
|
+
ops.push({ kind: '=', line: a[i] });
|
|
40
|
+
i++;
|
|
41
|
+
j++;
|
|
42
|
+
}
|
|
43
|
+
else if (t[(i + 1) * w + j] >= t[i * w + j + 1])
|
|
44
|
+
ops.push({ kind: '-', line: a[i++] });
|
|
45
|
+
else
|
|
46
|
+
ops.push({ kind: '+', line: b[j++] });
|
|
47
|
+
}
|
|
48
|
+
while (i < n)
|
|
49
|
+
ops.push({ kind: '-', line: a[i++] });
|
|
50
|
+
while (j < m)
|
|
51
|
+
ops.push({ kind: '+', line: b[j++] });
|
|
52
|
+
return ops;
|
|
53
|
+
}
|
|
54
|
+
function editScript(a, b) {
|
|
55
|
+
const la = linesOf(a);
|
|
56
|
+
const lb = linesOf(b);
|
|
57
|
+
if (Buffer.byteLength(String(a ?? '')) > MAX_SKILL_BYTES || Buffer.byteLength(String(b ?? '')) > MAX_SKILL_BYTES) {
|
|
58
|
+
return [...la.map((line) => ({ kind: '-', line })), ...lb.map((line) => ({ kind: '+', line }))];
|
|
59
|
+
}
|
|
60
|
+
let pre = 0;
|
|
61
|
+
while (pre < la.length && pre < lb.length && la[pre] === lb[pre])
|
|
62
|
+
pre++;
|
|
63
|
+
let post = 0;
|
|
64
|
+
while (post < la.length - pre && post < lb.length - pre && la[la.length - 1 - post] === lb[lb.length - 1 - post])
|
|
65
|
+
post++;
|
|
66
|
+
const same = (l) => l.map((line) => ({ kind: '=', line }));
|
|
67
|
+
return [...same(la.slice(0, pre)), ...middleOps(la.slice(pre, la.length - post), lb.slice(pre, lb.length - post)), ...same(la.slice(la.length - post))];
|
|
68
|
+
}
|
|
69
|
+
/** LCS on lines. A hunk's `at` is how many lines of `a` come before it (0-based). */
|
|
70
|
+
export function lineDiff(a, b) {
|
|
71
|
+
const out = { removed: [], added: [], hunks: [] };
|
|
72
|
+
let at = 0;
|
|
73
|
+
let open = null;
|
|
74
|
+
for (const op of editScript(a, b)) {
|
|
75
|
+
if (op.kind === '=') {
|
|
76
|
+
open = null;
|
|
77
|
+
at++;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (!open) {
|
|
81
|
+
open = { at, del: [], add: [] };
|
|
82
|
+
out.hunks.push(open);
|
|
83
|
+
}
|
|
84
|
+
if (op.kind === '-') {
|
|
85
|
+
open.del.push(op.line);
|
|
86
|
+
out.removed.push(op.line);
|
|
87
|
+
at++;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
open.add.push(op.line);
|
|
91
|
+
out.added.push(op.line);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* D131: step numbers read as one mark, so a renumber alone changes no line: a Run line's `N. `, the check line's
|
|
98
|
+
* `Step N, ` and an If it fails line's `what worked was step N.`.
|
|
99
|
+
*/
|
|
100
|
+
const unnumbered = (text) => String(text ?? '').split('\n').map((l) => l
|
|
101
|
+
.replace(/^\d+\. /, '#. ')
|
|
102
|
+
.replace(/^Step \d+, /, 'Step #, ')
|
|
103
|
+
.replace(/\bwhat worked was step \d+\./, 'what worked was step #.')).join('\n');
|
|
104
|
+
/**
|
|
105
|
+
* 4.3 as D131 changed it: the characters an edit changes (every removed and added line, its line break counted), step
|
|
106
|
+
* numbers taken out first, so one inserted step anywhere costs about its own length. `share` is of the file as it is.
|
|
107
|
+
*/
|
|
108
|
+
export function sizeGate(before, after) {
|
|
109
|
+
const d = lineDiff(unnumbered(before), unnumbered(after));
|
|
110
|
+
const chars = [...d.removed, ...d.added].reduce((n, l) => n + l.length + 1, 0);
|
|
111
|
+
const len = String(before ?? '').length;
|
|
112
|
+
const share = len ? chars / len : chars ? 1 : 0;
|
|
113
|
+
return { chars, share, ok: chars <= FOLD_MAX_CHARS && share <= FOLD_MAX_SHARE };
|
|
114
|
+
}
|
|
115
|
+
/** A printed line's length cap: a 2 MB line (a binary file, a minified blob) is cut, never printed whole (review). */
|
|
116
|
+
const PRINT_MAX_LINE = 400;
|
|
117
|
+
/**
|
|
118
|
+
* Control characters, bidi marks and line separators, printed as escapes (review): a file a person or a teammate
|
|
119
|
+
* edited can hold an ESC sequence (a terminal title, a clipboard write) or a right-to-left mark that shows other text
|
|
120
|
+
* than the bytes. Trail's own files never hold one (oneLine drops them), so a skill's text prints as it is.
|
|
121
|
+
*/
|
|
122
|
+
const UNSAFE = /[\u0000-\u0008\u000b-\u001f\u007f-\u009f\u061c\u200e\u200f\u2028\u2029\u202a-\u202e\u2066-\u2069\ufeff]/g;
|
|
123
|
+
const escapeOne = (ch) => (ch === '\r' ? '\\r' : `\\u${ch.charCodeAt(0).toString(16).padStart(4, '0')}`);
|
|
124
|
+
const shown = (line) => {
|
|
125
|
+
const t = line.length > PRINT_MAX_LINE * 2 ? line.slice(0, PRINT_MAX_LINE * 2) : line;
|
|
126
|
+
const e = t.replace(UNSAFE, escapeOne);
|
|
127
|
+
return e.length > PRINT_MAX_LINE || t.length < line.length ? `${e.slice(0, PRINT_MAX_LINE)}…` : e;
|
|
128
|
+
};
|
|
129
|
+
const range = (start, count) => `${count === 0 ? start : start + 1},${count}`;
|
|
130
|
+
/**
|
|
131
|
+
* A unified diff (3 lines of context), at most `maxLines` lines with the more-lines line, step text as it is. '' when
|
|
132
|
+
* the texts are equal. Each line at most 400 characters, control characters and bidi marks as escapes (review). An empty `a` prints a new file: phase 3's `renderNewFileDiff` prints through it.
|
|
133
|
+
*/
|
|
134
|
+
export function printDiff(a, b, labels, maxLines = PRINT_MAX_LINES) {
|
|
135
|
+
const ops = editScript(a, b);
|
|
136
|
+
if (!ops.some((o) => o.kind !== '='))
|
|
137
|
+
return '';
|
|
138
|
+
// Each op with its place in a and b; hunks are runs of changes with the context around them, merged when they touch.
|
|
139
|
+
const at = [];
|
|
140
|
+
let ai = 0;
|
|
141
|
+
let bi = 0;
|
|
142
|
+
for (const o of ops) {
|
|
143
|
+
at.push({ ai, bi });
|
|
144
|
+
if (o.kind !== '+')
|
|
145
|
+
ai++;
|
|
146
|
+
if (o.kind !== '-')
|
|
147
|
+
bi++;
|
|
148
|
+
}
|
|
149
|
+
const out = [`--- ${oneLine(labels[0])}`, `+++ ${oneLine(labels[1])}`];
|
|
150
|
+
let k = 0;
|
|
151
|
+
while (k < ops.length) {
|
|
152
|
+
if (ops[k].kind === '=') {
|
|
153
|
+
k++;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const start = Math.max(0, k - CONTEXT);
|
|
157
|
+
let end = k;
|
|
158
|
+
for (;;) {
|
|
159
|
+
while (end < ops.length && ops[end].kind !== '=')
|
|
160
|
+
end++;
|
|
161
|
+
let gap = end;
|
|
162
|
+
while (gap < ops.length && ops[gap].kind === '=')
|
|
163
|
+
gap++;
|
|
164
|
+
if (gap < ops.length && gap - end <= CONTEXT * 2) {
|
|
165
|
+
end = gap;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
end = Math.min(ops.length, end + CONTEXT);
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
const part = ops.slice(start, end);
|
|
172
|
+
const aCount = part.filter((o) => o.kind !== '+').length;
|
|
173
|
+
const bCount = part.filter((o) => o.kind !== '-').length;
|
|
174
|
+
out.push(`@@ -${range(at[start].ai, aCount)} +${range(at[start].bi, bCount)} @@`);
|
|
175
|
+
for (const o of part)
|
|
176
|
+
out.push(`${o.kind === '=' ? ' ' : o.kind}${shown(o.line)}`);
|
|
177
|
+
k = end;
|
|
178
|
+
}
|
|
179
|
+
const max = Math.max(3, Math.floor(maxLines));
|
|
180
|
+
if (out.length <= max)
|
|
181
|
+
return out.join('\n');
|
|
182
|
+
return [...out.slice(0, max - 1), `… ${out.length - (max - 1)} more lines`].join('\n');
|
|
183
|
+
}
|
|
184
|
+
/** A Run line without its number: what the step is, so a renumber alone changes no line. */
|
|
185
|
+
const stepKey = (s) => `${s.gated ? 'G ' : ''}${oneLine(s.cmd)}${s.wait ? ' (wait)' : s.bg ? ' (bg)' : ''}`;
|
|
186
|
+
/** The Run lines a change touches, for "1 line changes": per hunk the larger of what goes and what comes. */
|
|
187
|
+
export function runLinesChanged(before, after) {
|
|
188
|
+
const text = (c) => c.steps.map(stepKey).join('\n') + (c.steps.length ? '\n' : '');
|
|
189
|
+
return lineDiff(text(before), text(after)).hunks.reduce((n, h) => n + Math.max(h.del.length, h.add.length), 0);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=skill-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-diff.js","sourceRoot":"","sources":["../../src/skills/skill-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `metadata.trail` value a takeaway skill gets: `s-` and 6 hex digits
|
|
3
|
+
* from its name. The same name always gets the same one, so a skill that is
|
|
4
|
+
* marked twice (on two machines) is marked alike.
|
|
5
|
+
*/
|
|
6
|
+
export declare function skillMark(name: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Whether Trail may rewrite the SKILL.md `text` (front matter `data`, kept in
|
|
9
|
+
* the repo or on this machine): see the top of this file.
|
|
10
|
+
*/
|
|
11
|
+
export declare function trailOwned(text: string, data: Record<string, unknown>, where: "repo" | "home"): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Rewrite `file` at `version` with `body`. In the front matter only
|
|
14
|
+
* `metadata.version` changes (an old top-level `version` moves there), and a
|
|
15
|
+
* skill without `metadata.trail` gets `mark`, so it stays Trail's once the old
|
|
16
|
+
* `version` line is gone. A BOM is dropped: the reference validator refuses
|
|
17
|
+
* one. False, and the file untouched, when its front matter can't be found.
|
|
18
|
+
*/
|
|
19
|
+
export declare function rewriteSkill(file: string, version: number, body: string, mark: string): boolean;
|
|
20
|
+
/** `path`, or the nearest folder above it that is there (a dangling link counts as there). */
|
|
21
|
+
export declare function nearestThere(path: string): string;
|
|
22
|
+
/** Whether `path`, every link followed, is inside `root` (links followed too). False when either can't be resolved. */
|
|
23
|
+
export declare function within(path: string, root: string): boolean;
|
|
24
|
+
//# sourceMappingURL=skill-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-file.d.ts","sourceRoot":"","sources":["../../src/skills/skill-file.ts"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAsBD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CASvG;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO/F;AAED,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASjD;AAED,uHAAuH;AACvH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO1D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One SKILL.md on disk: whether it is Trail's to rewrite, and the rewrite.
|
|
3
|
+
*
|
|
4
|
+
* A skill is Trail's when its front matter says so (`metadata.trail`, the one
|
|
5
|
+
* key spec section 6 gives Trail), when it is kept on this machine in
|
|
6
|
+
* ~/.trail (only Trail writes there), or when an older Trail already versioned
|
|
7
|
+
* it with a top-level `version: 3` line. Trail never rewrites any other
|
|
8
|
+
* SKILL.md: a skill someone wrote by hand stays exactly as they wrote it, and
|
|
9
|
+
* its corrections reach the agent through `trail skills show` instead.
|
|
10
|
+
*
|
|
11
|
+
* The rewrite finds the front matter the way the reader does (gray-matter
|
|
12
|
+
* skips a BOM and spaces after a fence), keeps the file's line ends, and
|
|
13
|
+
* leaves the file alone when it can't find both fences, so a skill never
|
|
14
|
+
* loses its name or description to a rewrite.
|
|
15
|
+
*
|
|
16
|
+
* A skill file is read or written only where its links keep it inside its
|
|
17
|
+
* own root, the repo's checkout or ~/.trail (`within`).
|
|
18
|
+
*/
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
import { lstatSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
|
|
21
|
+
import { dirname, isAbsolute, relative, sep } from "node:path";
|
|
22
|
+
import { withMetadataVersion } from "./front-version.js";
|
|
23
|
+
/**
|
|
24
|
+
* The `metadata.trail` value a takeaway skill gets: `s-` and 6 hex digits
|
|
25
|
+
* from its name. The same name always gets the same one, so a skill that is
|
|
26
|
+
* marked twice (on two machines) is marked alike.
|
|
27
|
+
*/
|
|
28
|
+
export function skillMark(name) {
|
|
29
|
+
return `s-${createHash("sha1").update(`skill:${name}`).digest("hex").slice(0, 6)}`;
|
|
30
|
+
}
|
|
31
|
+
/** Where `text`'s front matter is, or null when it doesn't open and close with a `---` line. */
|
|
32
|
+
function front(text) {
|
|
33
|
+
const lines = text.replace(/^/, "").split(/\r?\n/);
|
|
34
|
+
const fence = (l) => l !== undefined && l.trimEnd() === "---";
|
|
35
|
+
if (!fence(lines[0]))
|
|
36
|
+
return null;
|
|
37
|
+
const close = lines.findIndex((l, i) => i > 0 && fence(l));
|
|
38
|
+
return close === -1 ? null : { lines, close, eol: text.includes("\r\n") ? "\r\n" : "\n" };
|
|
39
|
+
}
|
|
40
|
+
/** The line an older Trail wrote at the top level, and nothing a person would write by hand for a version ("1.0", "1.0.0"). */
|
|
41
|
+
const OLD_VERSION_LINE = /^version:[ \t]*\d+[ \t]*$/;
|
|
42
|
+
/**
|
|
43
|
+
* Whether Trail may rewrite the SKILL.md `text` (front matter `data`, kept in
|
|
44
|
+
* the repo or on this machine): see the top of this file.
|
|
45
|
+
*/
|
|
46
|
+
export function trailOwned(text, data, where) {
|
|
47
|
+
if (where === "home")
|
|
48
|
+
return true;
|
|
49
|
+
const meta = data.metadata;
|
|
50
|
+
if (typeof meta === "object" && meta !== null && !Array.isArray(meta)) {
|
|
51
|
+
const mark = meta.trail;
|
|
52
|
+
if (typeof mark === "string" && mark.trim())
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
const f = front(text);
|
|
56
|
+
return f !== null && f.lines.slice(1, f.close).some((l) => OLD_VERSION_LINE.test(l));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Rewrite `file` at `version` with `body`. In the front matter only
|
|
60
|
+
* `metadata.version` changes (an old top-level `version` moves there), and a
|
|
61
|
+
* skill without `metadata.trail` gets `mark`, so it stays Trail's once the old
|
|
62
|
+
* `version` line is gone. A BOM is dropped: the reference validator refuses
|
|
63
|
+
* one. False, and the file untouched, when its front matter can't be found.
|
|
64
|
+
*/
|
|
65
|
+
export function rewriteSkill(file, version, body, mark) {
|
|
66
|
+
const f = front(readFileSync(file, "utf8"));
|
|
67
|
+
if (!f)
|
|
68
|
+
return false;
|
|
69
|
+
const fm = withMetadataVersion(f.lines.slice(1, f.close), version, mark);
|
|
70
|
+
const text = `---\n${fm.join("\n")}\n---\n\n${body.trim()}\n`;
|
|
71
|
+
writeFileSync(file, f.eol === "\n" ? text : text.replace(/\r?\n/g, f.eol));
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
/** `path`, or the nearest folder above it that is there (a dangling link counts as there). */
|
|
75
|
+
export function nearestThere(path) {
|
|
76
|
+
for (let p = path;; p = dirname(p)) {
|
|
77
|
+
try {
|
|
78
|
+
lstatSync(p);
|
|
79
|
+
return p;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
if (dirname(p) === p)
|
|
83
|
+
return p;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Whether `path`, every link followed, is inside `root` (links followed too). False when either can't be resolved. */
|
|
88
|
+
export function within(path, root) {
|
|
89
|
+
try {
|
|
90
|
+
const rel = relative(realpathSync(root), realpathSync(path));
|
|
91
|
+
return rel === "" || (rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=skill-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-file.js","sourceRoot":"","sources":["../../src/skills/skill-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A SKILL.md back to the CompiledSkill that renders it (phase 2 design 4.4,
|
|
3
|
+
* P11). A skill's fields depend on each other (the steps, `confirm-before`,
|
|
4
|
+
* `needs`, the check line's "Step N", `version`), so a fold never edits the
|
|
5
|
+
* text: it rebuilds the CompiledSkill, changes its steps and renders again.
|
|
6
|
+
* That is only safe when the renderer gives back exactly the file Trail
|
|
7
|
+
* wrote, so `rebuildCompiled` returns null unless the round trip is byte for
|
|
8
|
+
* byte. `rebuildLoose` reads a hand-edited file as Trail reads it, for a
|
|
9
|
+
* proposal beside it (4.6); nothing it returns is ever written over that file.
|
|
10
|
+
*
|
|
11
|
+
* Pure: no disk. The source and the helper names come from the caller (the
|
|
12
|
+
* skill's state and its scripts/ folder).
|
|
13
|
+
*/
|
|
14
|
+
import type { CompiledSkill, ParsedSkill, SkillState } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* A SKILL.md Trail wrote, back to the CompiledSkill that renders it. null unless renderSkillMd(result) === text exactly,
|
|
17
|
+
* or when `parsed` is not this text's parse. `helpers` are the names in scripts/ (content '': a fold never writes
|
|
18
|
+
* scripts/, 4.5); `runId` is the state's run, when the caller has it.
|
|
19
|
+
*/
|
|
20
|
+
export declare function rebuildCompiled(text: string, parsed: ParsedSkill, extra: {
|
|
21
|
+
source: SkillState['source'];
|
|
22
|
+
helpers: string[];
|
|
23
|
+
runId?: string | null;
|
|
24
|
+
}): CompiledSkill | null;
|
|
25
|
+
/** Same, without the exact round trip: for a proposal beside a hand-edited file (4.6). null when it has no steps. */
|
|
26
|
+
export declare function rebuildLoose(text: string, parsed: ParsedSkill): CompiledSkill | null;
|
|
27
|
+
//# sourceMappingURL=skill-rebuild.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-rebuild.d.ts","sourceRoot":"","sources":["../../src/skills/skill-rebuild.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8CzE;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,aAAa,GAAG,IAAI,CAkB1K;AAED,qHAAqH;AACrH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,IAAI,CAQpF"}
|