@nanonets/graft 0.24.0 → 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/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/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/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/cli-picker.d.ts +24 -0
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +36 -5
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +278 -29
- 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/graph/native.d.ts +2 -0
- package/dist/graph/native.d.ts.map +1 -1
- package/dist/graph/native.js +29 -4
- package/dist/graph/native.js.map +1 -1
- package/dist/hosts/claude-global.d.ts +14 -0
- package/dist/hosts/claude-global.d.ts.map +1 -1
- package/dist/hosts/claude-global.js +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/cold-start.d.ts +30 -1
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +98 -19
- package/dist/notes/cold-start.js.map +1 -1
- package/dist/notes/every-repo.d.ts +18 -0
- package/dist/notes/every-repo.d.ts.map +1 -0
- package/dist/notes/every-repo.js +86 -0
- package/dist/notes/every-repo.js.map +1 -0
- package/dist/notes/guardrails.d.ts +8 -0
- package/dist/notes/guardrails.d.ts.map +1 -0
- package/dist/notes/guardrails.js +38 -0
- package/dist/notes/guardrails.js.map +1 -0
- package/dist/notes/lesson-index.d.ts +13 -0
- package/dist/notes/lesson-index.d.ts.map +1 -0
- package/dist/notes/lesson-index.js +135 -0
- package/dist/notes/lesson-index.js.map +1 -0
- package/dist/notes/linked-learnings.d.ts +8 -0
- package/dist/notes/linked-learnings.d.ts.map +1 -0
- package/dist/notes/linked-learnings.js +113 -0
- package/dist/notes/linked-learnings.js.map +1 -0
- package/dist/notes/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/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/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/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/person.d.ts +34 -0
- package/dist/skills/person.d.ts.map +1 -0
- package/dist/skills/person.js +102 -0
- package/dist/skills/person.js.map +1 -0
- package/dist/skills/probe-clean.d.ts +9 -0
- package/dist/skills/probe-clean.d.ts.map +1 -0
- package/dist/skills/probe-clean.js +48 -0
- package/dist/skills/probe-clean.js.map +1 -0
- package/dist/skills/probes.d.ts +26 -0
- package/dist/skills/probes.d.ts.map +1 -0
- package/dist/skills/probes.js +225 -0
- package/dist/skills/probes.js.map +1 -0
- package/dist/skills/recall.d.ts +119 -0
- package/dist/skills/recall.d.ts.map +1 -0
- package/dist/skills/recall.js +370 -0
- package/dist/skills/recall.js.map +1 -0
- package/dist/skills/receipts.d.ts +44 -0
- package/dist/skills/receipts.d.ts.map +1 -0
- package/dist/skills/receipts.js +223 -0
- package/dist/skills/receipts.js.map +1 -0
- package/dist/skills/run-checkout.d.ts +4 -0
- package/dist/skills/run-checkout.d.ts.map +1 -0
- package/dist/skills/run-checkout.js +37 -0
- package/dist/skills/run-checkout.js.map +1 -0
- package/dist/skills/runblock.d.ts +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/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/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/housekeeping.d.ts +5 -0
- package/dist/trace/housekeeping.d.ts.map +1 -0
- package/dist/trace/housekeeping.js +93 -0
- package/dist/trace/housekeeping.js.map +1 -0
- package/dist/trace/jobs.d.ts +52 -0
- package/dist/trace/jobs.d.ts.map +1 -0
- package/dist/trace/jobs.js +182 -0
- package/dist/trace/jobs.js.map +1 -0
- package/dist/trace/known-repo.d.ts +3 -0
- package/dist/trace/known-repo.d.ts.map +1 -0
- package/dist/trace/known-repo.js +55 -0
- package/dist/trace/known-repo.js.map +1 -0
- package/dist/trace/pool.d.ts +40 -0
- package/dist/trace/pool.d.ts.map +1 -0
- package/dist/trace/pool.js +154 -0
- package/dist/trace/pool.js.map +1 -0
- package/dist/trace/repairs.d.ts +27 -0
- package/dist/trace/repairs.d.ts.map +1 -0
- package/dist/trace/repairs.js +303 -0
- package/dist/trace/repairs.js.map +1 -0
- package/dist/trace/run-calls.d.ts +82 -0
- package/dist/trace/run-calls.d.ts.map +1 -0
- package/dist/trace/run-calls.js +331 -0
- package/dist/trace/run-calls.js.map +1 -0
- package/dist/trace/run-join.d.ts +20 -0
- package/dist/trace/run-join.d.ts.map +1 -0
- package/dist/trace/run-join.js +99 -0
- package/dist/trace/run-join.js.map +1 -0
- package/dist/trace/run-sheets.d.ts +26 -0
- package/dist/trace/run-sheets.d.ts.map +1 -0
- package/dist/trace/run-sheets.js +145 -0
- package/dist/trace/run-sheets.js.map +1 -0
- package/dist/trace/run-turns.d.ts +24 -0
- package/dist/trace/run-turns.d.ts.map +1 -0
- package/dist/trace/run-turns.js +67 -0
- package/dist/trace/run-turns.js.map +1 -0
- package/dist/trace/run-verdict.d.ts +24 -0
- package/dist/trace/run-verdict.d.ts.map +1 -0
- package/dist/trace/run-verdict.js +176 -0
- package/dist/trace/run-verdict.js.map +1 -0
- package/dist/trace/runs.d.ts +54 -0
- package/dist/trace/runs.d.ts.map +1 -0
- package/dist/trace/runs.js +501 -0
- package/dist/trace/runs.js.map +1 -0
- package/dist/trace/skill-session.d.ts +64 -0
- package/dist/trace/skill-session.d.ts.map +1 -0
- package/dist/trace/skill-session.js +232 -0
- package/dist/trace/skill-session.js.map +1 -0
- package/dist/trace/tamper.d.ts +12 -0
- package/dist/trace/tamper.d.ts.map +1 -0
- package/dist/trace/tamper.js +405 -0
- package/dist/trace/tamper.js.map +1 -0
- package/dist/trace/typed.d.ts +30 -0
- package/dist/trace/typed.d.ts.map +1 -0
- package/dist/trace/typed.js +132 -0
- package/dist/trace/typed.js.map +1 -0
- package/dist/trace/wall-state.d.ts +86 -0
- package/dist/trace/wall-state.d.ts.map +1 -0
- package/dist/trace/wall-state.js +279 -0
- package/dist/trace/wall-state.js.map +1 -0
- package/dist/trace/walls.d.ts +40 -0
- package/dist/trace/walls.d.ts.map +1 -0
- package/dist/trace/walls.js +318 -0
- package/dist/trace/walls.js.map +1 -0
- package/dist/vendor/tree-sitter-swift/LICENSE +21 -0
- package/dist/vendor/tree-sitter-swift/node-types.json +30694 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/darwin-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/darwin-x64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/linux-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/linux-x64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/win32-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/win32-x64/tree-sitter-swift.node +0 -0
- package/package.json +6 -3
- package/scripts/stamp-telemetry-key.mjs +8 -5
- package/scripts/vendor-grammars.mjs +35 -0
|
@@ -0,0 +1,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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { renderSkillMd, skillHash } from './skillmd.js';
|
|
2
|
+
/** The `# ` heading after the front matter, or null. */
|
|
3
|
+
function titleOf(text) {
|
|
4
|
+
const lines = String(text ?? '').split('\n');
|
|
5
|
+
let i = 0;
|
|
6
|
+
if (lines[0]?.trim() === '---') {
|
|
7
|
+
i = lines.findIndex((l, k) => k > 0 && l.trim() === '---');
|
|
8
|
+
if (i < 0)
|
|
9
|
+
return null;
|
|
10
|
+
i++;
|
|
11
|
+
}
|
|
12
|
+
for (; i < lines.length; i++) {
|
|
13
|
+
const m = /^#\s+(.*?)\s*$/.exec(lines[i]);
|
|
14
|
+
if (m)
|
|
15
|
+
return m[1];
|
|
16
|
+
if (/^##\s/.test(lines[i]))
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
/** The line under "## Check it worked": "Step N, `…`, is the check" or "`…` is the check" means the check is a step. */
|
|
22
|
+
function checkReadsAsStep(text) {
|
|
23
|
+
const m = /\n## Check it worked\s*\n([^\n]*)/.exec(String(text ?? ''));
|
|
24
|
+
return !!m && /^(?:Step \d+, )?`.*`,? is the check\b/.test(m[1]);
|
|
25
|
+
}
|
|
26
|
+
function base(parsed, title, checkIsStep, source, helpers) {
|
|
27
|
+
const check = parsed.check ?? '';
|
|
28
|
+
return {
|
|
29
|
+
name: parsed.name,
|
|
30
|
+
title,
|
|
31
|
+
description: parsed.description,
|
|
32
|
+
meta: { ...parsed.meta },
|
|
33
|
+
steps: parsed.steps.map((s) => ({ n: s.n, cmd: s.cmd, gated: s.gated, bg: s.bg, wait: s.wait })),
|
|
34
|
+
check,
|
|
35
|
+
checkShows: check ? parsed.checkShows : null,
|
|
36
|
+
checkIsStep: checkIsStep && !!check,
|
|
37
|
+
ifFails: [...parsed.ifFails],
|
|
38
|
+
dontUse: parsed.dontUse,
|
|
39
|
+
params: parsed.params.map((p) => ({ ...p, seen: [...p.seen] })),
|
|
40
|
+
helpers,
|
|
41
|
+
leftOut: { failed: 0, lookOnly: 0, duplicates: 0, plumbing: 0, work: 0 },
|
|
42
|
+
source,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A SKILL.md Trail wrote, back to the CompiledSkill that renders it. null unless renderSkillMd(result) === text exactly,
|
|
47
|
+
* or when `parsed` is not this text's parse. `helpers` are the names in scripts/ (content '': a fold never writes
|
|
48
|
+
* scripts/, 4.5); `runId` is the state's run, when the caller has it.
|
|
49
|
+
*/
|
|
50
|
+
export function rebuildCompiled(text, parsed, extra) {
|
|
51
|
+
try {
|
|
52
|
+
const src = String(text ?? '');
|
|
53
|
+
if (!parsed || parsed.hash !== skillHash(src))
|
|
54
|
+
return null;
|
|
55
|
+
const title = titleOf(src);
|
|
56
|
+
if (title === null)
|
|
57
|
+
return null;
|
|
58
|
+
const s = extra?.source;
|
|
59
|
+
const source = { runId: String(extra?.runId ?? ''), commands: s?.commands ?? 0, failed: s?.failed ?? 0, at: s?.at ?? '' };
|
|
60
|
+
const helpers = (extra?.helpers ?? []).filter((f) => typeof f === 'string' && f).map((file) => ({ file, from: `scripts/${file}`, content: '' }));
|
|
61
|
+
const first = checkReadsAsStep(src);
|
|
62
|
+
for (const asStep of [first, !first]) {
|
|
63
|
+
const c = base(parsed, title, asStep, source, helpers);
|
|
64
|
+
if (renderSkillMd(c) === src)
|
|
65
|
+
return c;
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Same, without the exact round trip: for a proposal beside a hand-edited file (4.6). null when it has no steps. */
|
|
74
|
+
export function rebuildLoose(text, parsed) {
|
|
75
|
+
try {
|
|
76
|
+
if (!parsed || !parsed.steps.length)
|
|
77
|
+
return null;
|
|
78
|
+
const src = String(text ?? '');
|
|
79
|
+
return base(parsed, titleOf(src) ?? parsed.name, checkReadsAsStep(src), { runId: '', commands: 0, failed: 0, at: '' }, []);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=skill-rebuild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-rebuild.js","sourceRoot":"","sources":["../../src/skills/skill-rebuild.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CompiledSkill, ParsedSkill, SkillMeta } from './types.js';
|
|
2
|
+
export declare const GATED_PREFIX = "Can't be undone (Claude Code asks the person first): ";
|
|
3
|
+
export declare const WAIT_NOTE = "(a wait: run it in the background if it may take over 2 minutes)";
|
|
4
|
+
export declare const BG_NOTE = "(in the background)";
|
|
5
|
+
export declare const NO_CHECK = "No check ran in the run this came from.";
|
|
6
|
+
export declare const NOTHING_FAILED = "Nothing failed in the run this came from.";
|
|
7
|
+
/** D59b: a check read with a deploy status tool (`check-tool`), not run as a command. */
|
|
8
|
+
export declare const TOOL_CHECK = "Check the deployment the same way the run did: ";
|
|
9
|
+
/** A command on one line: breaks become spaces, hidden characters go; spaces inside it are kept. */
|
|
10
|
+
export declare function oneLine(text: string): string;
|
|
11
|
+
export declare function renderSkillMd(c: CompiledSkill): string;
|
|
12
|
+
/** D116 item 5: the lines of `metadata.before-you-start`, each one flat line. */
|
|
13
|
+
export declare function beforeYouStart(meta: Pick<SkillMeta, 'before-you-start'>): string[];
|
|
14
|
+
export declare function skillHash(text: string): string;
|
|
15
|
+
/** Through phase 0's matter(): null on `refused` (anchors, aliases, non-scalars) or when there is no `metadata.trail` key. */
|
|
16
|
+
export declare function parseSkillMd(text: string, folderName: string): ParsedSkill | null;
|
|
17
|
+
//# sourceMappingURL=skillmd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillmd.d.ts","sourceRoot":"","sources":["../../src/skills/skillmd.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAS,SAAS,EAAa,MAAM,YAAY,CAAC;AAM1F,eAAO,MAAM,YAAY,0DAA0D,CAAC;AACpF,eAAO,MAAM,SAAS,qEAAqE,CAAC;AAC5F,eAAO,MAAM,OAAO,wBAAwB,CAAC;AAC7C,eAAO,MAAM,QAAQ,4CAA4C,CAAC;AAClE,eAAO,MAAM,cAAc,8CAA8C,CAAC;AAC1E,yFAAyF;AACzF,eAAO,MAAM,UAAU,oDAAoD,CAAC;AAY5E,oGAAoG;AACpG,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAkBD,wBAAgB,aAAa,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAgDtD;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,GAAG,MAAM,EAAE,CAElF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAsBD,8HAA8H;AAC9H,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAiEjF"}
|