@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,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Held items (`~/.trail/held/<name>/`, design 2): a save Trail could not
|
|
3
|
+
* trust, because the person never said yes or because it came from a host
|
|
4
|
+
* where Trail can't check which steps ran. A held item is never read by
|
|
5
|
+
* recall. It is shown once, at the next `startup` or `resume` of another
|
|
6
|
+
* session than the one that held it (`session`, D93; `shownAt`), stays
|
|
7
|
+
* keepable for 24 hours after that showing, and is then deleted (by
|
|
8
|
+
* housekeeping, or here when kept). Only the person keeps one
|
|
9
|
+
* (`trail skills keep <name>`, checked by `personAtTerminal`).
|
|
10
|
+
*
|
|
11
|
+
* `held/<name>/SKILL.md` is the skill as it would have been saved; its
|
|
12
|
+
* `held.json` says why it was held, where it came from, and when it was shown.
|
|
13
|
+
*/
|
|
14
|
+
import { renameSync, rmSync, readdirSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { readJsonSafe, writePrivate } from '../util/private-fs.js';
|
|
17
|
+
import { parseSkillMd, renderSkillMd, skillHash } from './skillmd.js';
|
|
18
|
+
import { checkSaveName, freeId, heldDir, lstatOrNull, personalRef, privateDir, readCapped, safeName, skillsDir, startSkill, stepsTotal, takenAtHome, tryStoreLock, underStoreLock, writeSkillFolder, } from './store-fs.js';
|
|
19
|
+
const KEEP_MS = 24 * 3600_000;
|
|
20
|
+
/** One held item as Trail wrote it: a real folder (never a link) with a valid held.json; null otherwise. */
|
|
21
|
+
function heldAt(name, env) {
|
|
22
|
+
if (!safeName(name))
|
|
23
|
+
return null;
|
|
24
|
+
const dir = join(heldDir(env), name);
|
|
25
|
+
if (!lstatOrNull(dir)?.isDirectory())
|
|
26
|
+
return null;
|
|
27
|
+
const f = readJsonSafe(join(dir, 'held.json'));
|
|
28
|
+
if (!f || typeof f !== 'object' || f.name !== name || (f.why !== 'no-yes' && f.why !== 'host') || typeof f.repoKey !== 'string' || typeof f.at !== 'string')
|
|
29
|
+
return null;
|
|
30
|
+
if (f.shownAt !== null && typeof f.shownAt !== 'string')
|
|
31
|
+
return null;
|
|
32
|
+
return { ...f, dir };
|
|
33
|
+
}
|
|
34
|
+
const toItem = (f) => ({
|
|
35
|
+
name: f.name, why: f.why, host: String(f.host ?? ''), job: f.job ?? null, repoKey: f.repoKey, at: f.at, shownAt: f.shownAt, dir: f.dir,
|
|
36
|
+
runId: typeof f.runId === 'string' ? f.runId : null,
|
|
37
|
+
session: typeof f.session === 'string' ? f.session : null,
|
|
38
|
+
});
|
|
39
|
+
/** Shown and more than 24 h ago: no longer keepable. */
|
|
40
|
+
const expired = (f, now) => f.shownAt !== null && now.getTime() - Date.parse(f.shownAt) >= KEEP_MS;
|
|
41
|
+
/** Every held item Trail wrote, whatever its age, oldest first. */
|
|
42
|
+
export function allHeld(env) {
|
|
43
|
+
let names;
|
|
44
|
+
try {
|
|
45
|
+
names = readdirSync(heldDir(env));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
return names.filter((n) => !n.startsWith('.')).flatMap((n) => {
|
|
51
|
+
const f = heldAt(n, env);
|
|
52
|
+
return f ? [toItem(f)] : [];
|
|
53
|
+
}).sort((a, b) => a.at.localeCompare(b.at) || a.name.localeCompare(b.name));
|
|
54
|
+
}
|
|
55
|
+
/** Writes held/<name>/SKILL.md (+ scripts/) and held.json, replacing a held item of the same name. */
|
|
56
|
+
export function saveHeld(c, why, meta, env, now = new Date()) {
|
|
57
|
+
checkSaveName(c.name);
|
|
58
|
+
return underStoreLock(env, () => {
|
|
59
|
+
privateDir(heldDir(env));
|
|
60
|
+
const dir = join(heldDir(env), c.name);
|
|
61
|
+
rmSync(dir, { recursive: true, force: true }); // a link is removed, never followed
|
|
62
|
+
writeSkillFolder(dir, c, renderSkillMd(c), { lessons: false });
|
|
63
|
+
const f = {
|
|
64
|
+
v: 1, name: c.name, why, host: meta.host, job: meta.job, repoKey: meta.repoKey, at: now.toISOString(), shownAt: null,
|
|
65
|
+
id: c.meta.trail, runId: c.source.runId, ...(meta.session ? { session: meta.session } : {}), source: { commands: c.source.commands, failed: c.source.failed, at: c.source.at }, stepsTotal: stepsTotal(c),
|
|
66
|
+
};
|
|
67
|
+
writePrivate(join(dir, 'held.json'), JSON.stringify(f, null, 2));
|
|
68
|
+
return toItem({ ...f, dir });
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/** Held items not shown yet, and shown ones younger than 24 h (still keepable). */
|
|
72
|
+
export function listHeld(env, now = new Date()) {
|
|
73
|
+
return allHeld(env).filter((h) => !expired(h, now));
|
|
74
|
+
}
|
|
75
|
+
/** Hook bookkeeping (SessionStart): a busy store leaves it unshown, to be shown next time. */
|
|
76
|
+
export function markHeldShown(name, env, now = new Date()) {
|
|
77
|
+
tryStoreLock(env, () => {
|
|
78
|
+
const f = heldAt(name, env);
|
|
79
|
+
if (!f || f.shownAt !== null)
|
|
80
|
+
return;
|
|
81
|
+
const { dir, ...file } = f;
|
|
82
|
+
writePrivate(join(dir, 'held.json'), JSON.stringify({ ...file, shownAt: now.toISOString() }, null, 2));
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
export function dropHeld(name, env) {
|
|
86
|
+
if (!safeName(name))
|
|
87
|
+
return;
|
|
88
|
+
tryStoreLock(env, () => {
|
|
89
|
+
const dir = join(heldDir(env), name);
|
|
90
|
+
if (lstatOrNull(dir))
|
|
91
|
+
rmSync(dir, { recursive: true, force: true });
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The person keeps a held item: it moves into skills/<name> as a candidate they asked for (ledger `saved`, consent
|
|
96
|
+
* `asked`, no steps verified: the transcript was not read again). Refused for anyone but the person, an unknown or
|
|
97
|
+
* expired item, or a name a personal skill, a host's skill or Trail itself already uses.
|
|
98
|
+
*/
|
|
99
|
+
export function keepHeld(name, person, env, now = new Date()) {
|
|
100
|
+
if (!person.ok)
|
|
101
|
+
return { ok: false, reason: 'not-a-person' };
|
|
102
|
+
if (!safeName(name))
|
|
103
|
+
return { ok: false, reason: 'unknown' };
|
|
104
|
+
return underStoreLock(env, () => {
|
|
105
|
+
const f = heldAt(name, env);
|
|
106
|
+
// Trail wrote held/<name>/SKILL.md itself: a link there is not its file.
|
|
107
|
+
const own = f && !expired(f, now) && lstatOrNull(join(f.dir, 'SKILL.md'))?.isFile();
|
|
108
|
+
const text = own ? readCapped(join(f.dir, 'SKILL.md')) : null;
|
|
109
|
+
let parsed = text === null ? null : parseSkillMd(text, name);
|
|
110
|
+
if (!f || text === null || !parsed)
|
|
111
|
+
return { ok: false, reason: 'unknown' };
|
|
112
|
+
if (takenAtHome(name, env))
|
|
113
|
+
return { ok: false, reason: 'name-taken' };
|
|
114
|
+
const dir = join(skillsDir(env), name);
|
|
115
|
+
renameSync(f.dir, dir);
|
|
116
|
+
let file = text;
|
|
117
|
+
try {
|
|
118
|
+
rmSync(join(dir, 'held.json'), { force: true });
|
|
119
|
+
privateDir(join(dir, 'scripts'));
|
|
120
|
+
privateDir(join(dir, 'lessons'));
|
|
121
|
+
const id = freeId(parsed.meta.trail, name, env);
|
|
122
|
+
if (id !== parsed.meta.trail) {
|
|
123
|
+
file = text.replace(/^(\s+trail:\s*)"[^"\n]*"\s*$/m, `$1"${id}"`);
|
|
124
|
+
writePrivate(join(dir, 'SKILL.md'), file);
|
|
125
|
+
parsed = parseSkillMd(file, name) ?? parsed;
|
|
126
|
+
}
|
|
127
|
+
startSkill(id, {
|
|
128
|
+
name, from: 'asked', runId: f.runId ?? null, hash: skillHash(file), source: f.source ?? null, version: parsed.meta.version,
|
|
129
|
+
consent: 'asked', stepsVerified: 0, stepsTotal: typeof f.stepsTotal === 'number' ? f.stepsTotal : parsed.steps.length, now, env,
|
|
130
|
+
});
|
|
131
|
+
return { ok: true, ref: personalRef(id, name, parsed.meta.applies ?? null, env) };
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
// Put the held item back as it was, so the person can keep it once the state is free.
|
|
135
|
+
try {
|
|
136
|
+
if (file !== text)
|
|
137
|
+
writePrivate(join(dir, 'SKILL.md'), text);
|
|
138
|
+
renameSync(dir, f.dir);
|
|
139
|
+
const { dir: _dir, ...held } = f;
|
|
140
|
+
writePrivate(join(f.dir, 'held.json'), JSON.stringify(held, null, 2));
|
|
141
|
+
}
|
|
142
|
+
catch { /* left in skills/ without state: listed, and the person can forget it */ }
|
|
143
|
+
throw e;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=store-held.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-held.js","sourceRoot":"","sources":["../../src/skills/store-held.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { JobClass } from '../trace/types.js';
|
|
2
|
+
import type { CompiledSkill, ParsedSkill, SkillFrom, SkillRef } from './types.js';
|
|
3
|
+
export { BUILT_IN_NAMES } from './compile-words.js';
|
|
4
|
+
export { newSkillId } from './store-fs.js';
|
|
5
|
+
export { dropHeld, keepHeld, listHeld, markHeldShown, saveHeld, type HeldItem } from './store-held.js';
|
|
6
|
+
export { personAtTerminal, type PersonCheck, type PersonDeps, type PsRow } from './person.js';
|
|
7
|
+
export declare function personalSkillsDir(env?: NodeJS.ProcessEnv): string;
|
|
8
|
+
export interface ScopeCtx {
|
|
9
|
+
repoKeys: string[];
|
|
10
|
+
checkout: string;
|
|
11
|
+
env?: NodeJS.ProcessEnv;
|
|
12
|
+
}
|
|
13
|
+
/** Personal skills that apply to any of repoKeys or 'every repo', then repo (stub), then team (stub). Follows symlinks. Excludes held, retired and settings.skillsOff. */
|
|
14
|
+
export declare function listSkills(ctx: ScopeCtx): SkillRef[];
|
|
15
|
+
/** Every personal skill regardless of applies (for `trail skills`). */
|
|
16
|
+
export declare function listAllPersonal(env?: NodeJS.ProcessEnv): SkillRef[];
|
|
17
|
+
/** Repo skills (`.agents/skills/*` with `metadata.trail`, committed HEAD only): phase 3, so none in 1a. */
|
|
18
|
+
export declare function listRepoSkills(_checkout: string): SkillRef[];
|
|
19
|
+
/** Team skills (`~/.trail/teams/<team>/skills`, the team repo's default branch): phase 3, so none in 1a. */
|
|
20
|
+
export declare function listTeamSkills(_repoKeys: string[], _env?: NodeJS.ProcessEnv): SkillRef[];
|
|
21
|
+
/**
|
|
22
|
+
* The skill's SKILL.md, parsed (null when missing, not a file, over 64 KB, or not Trail's). A personal needs-fix
|
|
23
|
+
* skill whose file no longer has the hash Trail wrote was changed by hand, and goes back to what it was (4.8).
|
|
24
|
+
*/
|
|
25
|
+
export declare function readSkill(ref: SkillRef, known?: {
|
|
26
|
+
status?: string;
|
|
27
|
+
} | null): ParsedSkill | null;
|
|
28
|
+
export declare function findSkill(name: string, ctx: ScopeCtx): SkillRef | null;
|
|
29
|
+
/**
|
|
30
|
+
* Where the name is taken: 'personal' | 'retired' | 'held' | 'repo' | 'team' | 'host' (~/.claude/skills, ~/.agents/skills,
|
|
31
|
+
* <checkout>/.claude/skills, <checkout>/.agents/skills) | 'built-in'; null when free. 'invalid' for a name that is not
|
|
32
|
+
* one folder name. In the checkout, a Trail skill (`metadata.trail`) is 'repo', anything else 'host'.
|
|
33
|
+
*/
|
|
34
|
+
export declare function nameTaken(name: string, ctx: ScopeCtx): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* Moment 2's "a Trail skill covers it" (4.12 condition 3): a skill in scope with this job and status candidate,
|
|
37
|
+
* active or needs-fix, or a held item for this repo and job not yet shown. Retired never covers. A skill the person
|
|
38
|
+
* turned off still covers its job: an offer would only make a second one.
|
|
39
|
+
*/
|
|
40
|
+
export declare function jobCovered(job: JobClass, ctx: ScopeCtx): boolean;
|
|
41
|
+
/** Writes skills/<name>/SKILL.md (+ scripts/, empty lessons/), the state entry (candidate, source counts), ledger 'saved'. Locked. */
|
|
42
|
+
export declare function savePersonal(c: CompiledSkill, opts: {
|
|
43
|
+
from: SkillFrom;
|
|
44
|
+
runId: string;
|
|
45
|
+
consent: 'offer-yes' | 'asked' | 'init';
|
|
46
|
+
stepsVerified: number;
|
|
47
|
+
env?: NodeJS.ProcessEnv;
|
|
48
|
+
now?: Date;
|
|
49
|
+
}): SkillRef;
|
|
50
|
+
/**
|
|
51
|
+
* Moves skills/<name> to skills/.retired/<name>-<YYYY-MM-DD>/ (`-2`, `-3` the same day); status retired, prevStatus kept.
|
|
52
|
+
* Phase 2 (4.9): the retire proposal's and drift's retire pass `reason: 'retire-offer'` (the ledger status line's
|
|
53
|
+
* reason) and a hook's short `waitMs`; a busy store throws, as for the person.
|
|
54
|
+
*/
|
|
55
|
+
export declare function forgetSkill(name: string, env?: NodeJS.ProcessEnv, now?: Date, o?: {
|
|
56
|
+
reason?: 'forget' | 'retire-offer';
|
|
57
|
+
waitMs?: number;
|
|
58
|
+
}): {
|
|
59
|
+
ok: true;
|
|
60
|
+
to: string;
|
|
61
|
+
} | {
|
|
62
|
+
ok: false;
|
|
63
|
+
reason: 'unknown';
|
|
64
|
+
};
|
|
65
|
+
/** The newest retired copy back to skills/<name>, with the status it had (needs-fix when it was, else prevStatus). */
|
|
66
|
+
export declare function restoreSkill(name: string, env?: NodeJS.ProcessEnv, now?: Date): {
|
|
67
|
+
ok: true;
|
|
68
|
+
ref: SkillRef;
|
|
69
|
+
} | {
|
|
70
|
+
ok: false;
|
|
71
|
+
reason: 'unknown' | 'name-taken';
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/skills/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The skill store (design 1.4 and 2, spec 5 and 6). Personal skills live in
|
|
3
|
+
* `~/.trail/skills/<name>/` (SKILL.md, scripts/, lessons/), each applying to
|
|
4
|
+
* one repo or to every repo; what changes about them per person is in
|
|
5
|
+
* `state/skills.json` (state.ts) and their history in the ledger. Repo skills
|
|
6
|
+
* (`.agents/skills` in the checkout) and team skills (`~/.trail/teams`) are
|
|
7
|
+
* modelled in every type, and their lists are empty until phase 3.
|
|
8
|
+
*
|
|
9
|
+
* Listing follows links (a skill folder kept elsewhere and linked in is
|
|
10
|
+
* listed); writing never goes through one: a save makes a new folder, never
|
|
11
|
+
* fills one that is there; forget and restore move a folder (or the link
|
|
12
|
+
* itself) whole. Held items (store-held.ts) are never listed here, so recall
|
|
13
|
+
* never sees them. Files 0600, folders 0700.
|
|
14
|
+
*/
|
|
15
|
+
import { readdirSync, renameSync, rmSync } from 'node:fs';
|
|
16
|
+
import { basename, join } from 'node:path';
|
|
17
|
+
import { trailPath } from '../util/private-fs.js';
|
|
18
|
+
import { parseSkillMd, renderSkillMd, skillHash } from './skillmd.js';
|
|
19
|
+
import { BUILT_IN_NAMES } from './compile-words.js';
|
|
20
|
+
import { readSettings, localDate } from './settings.js';
|
|
21
|
+
import { appendLedger } from './ledger.js';
|
|
22
|
+
import { getSkillState, handEdited, readSkillsState, updateSkillState } from './state.js';
|
|
23
|
+
import { checkSaveName, freeId, heldDir, homeSkillDirs, lstatOrNull, personalRef, privateDir, readCapped, retiredDir, safeName, skillsDir, startSkill, statOrNull, stepsTotal, takenAtHome, underStoreLock, writeSkillFolder, } from './store-fs.js';
|
|
24
|
+
import { allHeld } from './store-held.js';
|
|
25
|
+
export { BUILT_IN_NAMES } from './compile-words.js';
|
|
26
|
+
export { newSkillId } from './store-fs.js';
|
|
27
|
+
export { dropHeld, keepHeld, listHeld, markHeldShown, saveHeld } from './store-held.js';
|
|
28
|
+
export { personAtTerminal } from './person.js';
|
|
29
|
+
export function personalSkillsDir(env) {
|
|
30
|
+
return skillsDir(env);
|
|
31
|
+
}
|
|
32
|
+
/** Every Trail skill folder in skills/ (links followed), by name; folders without `metadata.trail` are not Trail's. */
|
|
33
|
+
function personalEntries(env) {
|
|
34
|
+
let names;
|
|
35
|
+
try {
|
|
36
|
+
names = readdirSync(skillsDir(env));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
const out = [];
|
|
42
|
+
for (const name of names.sort()) {
|
|
43
|
+
if (name.startsWith('.') || !safeName(name) || !statOrNull(join(skillsDir(env), name))?.isDirectory())
|
|
44
|
+
continue;
|
|
45
|
+
const text = readCapped(join(skillsDir(env), name, 'SKILL.md'));
|
|
46
|
+
const skill = text === null ? null : parseSkillMd(text, name);
|
|
47
|
+
if (skill)
|
|
48
|
+
out.push({ ref: personalRef(skill.meta.trail, name, skill.meta.applies ?? null, env), skill });
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
const appliesTo = (applies, keys) => !applies || applies.toLowerCase() === 'every repo' || keys.has(applies.toLowerCase());
|
|
53
|
+
/** Personal skills that apply to any of repoKeys or 'every repo', then repo (stub), then team (stub). Follows symlinks. Excludes held, retired and settings.skillsOff. */
|
|
54
|
+
export function listSkills(ctx) {
|
|
55
|
+
const keys = new Set(ctx.repoKeys.map((k) => k.toLowerCase()));
|
|
56
|
+
const off = new Set(readSettings(ctx.env).skillsOff);
|
|
57
|
+
const state = readSkillsState(ctx.env).skills;
|
|
58
|
+
const personal = personalEntries(ctx.env)
|
|
59
|
+
.filter((e) => appliesTo(e.ref.applies, keys) && !off.has(e.ref.name) && state[e.ref.id]?.status !== 'retired')
|
|
60
|
+
.map((e) => e.ref);
|
|
61
|
+
return [...personal, ...listRepoSkills(ctx.checkout), ...listTeamSkills(ctx.repoKeys, ctx.env)];
|
|
62
|
+
}
|
|
63
|
+
/** Every personal skill regardless of applies (for `trail skills`). */
|
|
64
|
+
export function listAllPersonal(env) {
|
|
65
|
+
return personalEntries(env).map((e) => e.ref);
|
|
66
|
+
}
|
|
67
|
+
/** Repo skills (`.agents/skills/*` with `metadata.trail`, committed HEAD only): phase 3, so none in 1a. */
|
|
68
|
+
export function listRepoSkills(_checkout) {
|
|
69
|
+
return []; // phase 3
|
|
70
|
+
}
|
|
71
|
+
/** Team skills (`~/.trail/teams/<team>/skills`, the team repo's default branch): phase 3, so none in 1a. */
|
|
72
|
+
export function listTeamSkills(_repoKeys, _env) {
|
|
73
|
+
return []; // phase 3
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The skill's SKILL.md, parsed (null when missing, not a file, over 64 KB, or not Trail's). A personal needs-fix
|
|
77
|
+
* skill whose file no longer has the hash Trail wrote was changed by hand, and goes back to what it was (4.8).
|
|
78
|
+
*/
|
|
79
|
+
export function readSkill(ref, known) {
|
|
80
|
+
const text = readCapped(ref.file);
|
|
81
|
+
const skill = text === null ? null : parseSkillMd(text, basename(ref.dir));
|
|
82
|
+
if (skill && ref.scope === 'personal') {
|
|
83
|
+
// The state file sits beside skills/ in the same Trail home: <home>/skills/<name> -> <home>.
|
|
84
|
+
const env = { TRAIL_HOME: join(ref.dir, '..', '..') };
|
|
85
|
+
try {
|
|
86
|
+
// `known`: the state the caller already read for this skill (recall reads 200 skills against one state file).
|
|
87
|
+
const status = known !== undefined ? known?.status : getSkillState(skill.meta.trail, env)?.status;
|
|
88
|
+
if (status === 'needs-fix')
|
|
89
|
+
handEdited(skill.meta.trail, skill.hash, env);
|
|
90
|
+
}
|
|
91
|
+
catch { /* the skill still reads */ }
|
|
92
|
+
}
|
|
93
|
+
return skill;
|
|
94
|
+
}
|
|
95
|
+
export function findSkill(name, ctx) {
|
|
96
|
+
return listSkills(ctx).find((r) => r.name === name) ?? null;
|
|
97
|
+
}
|
|
98
|
+
/** What follows `<name>` in a retired copy's folder name: `-<date>`, then `-2`, `-3` the same day. */
|
|
99
|
+
const RETIRED_TAIL = /^-(\d{4}-\d{2}-\d{2})(?:-(\d+))?$/;
|
|
100
|
+
/** The retired copies of a name, newest first: `.retired/<name>-<date>` then `-2`, `-3` the same day. */
|
|
101
|
+
function retiredCopies(name, env) {
|
|
102
|
+
let names;
|
|
103
|
+
try {
|
|
104
|
+
names = readdirSync(retiredDir(env));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
return names.flatMap((n) => {
|
|
110
|
+
// A prefix check, not a regex built from the name: no character in it can mean anything.
|
|
111
|
+
const m = n.startsWith(name) ? RETIRED_TAIL.exec(n.slice(name.length)) : null;
|
|
112
|
+
return m ? [{ n, day: m[1], k: Number(m[2] ?? 1) }] : [];
|
|
113
|
+
}).sort((a, b) => b.day.localeCompare(a.day) || b.k - a.k).map((x) => x.n);
|
|
114
|
+
}
|
|
115
|
+
/** Is SKILL.md in this folder Trail's (`metadata.trail`)? */
|
|
116
|
+
const trailMarked = (dir) => {
|
|
117
|
+
const text = readCapped(join(dir, 'SKILL.md'));
|
|
118
|
+
return text !== null && parseSkillMd(text, basename(dir)) !== null;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Where the name is taken: 'personal' | 'retired' | 'held' | 'repo' | 'team' | 'host' (~/.claude/skills, ~/.agents/skills,
|
|
122
|
+
* <checkout>/.claude/skills, <checkout>/.agents/skills) | 'built-in'; null when free. 'invalid' for a name that is not
|
|
123
|
+
* one folder name. In the checkout, a Trail skill (`metadata.trail`) is 'repo', anything else 'host'.
|
|
124
|
+
*/
|
|
125
|
+
export function nameTaken(name, ctx) {
|
|
126
|
+
if (!safeName(name))
|
|
127
|
+
return 'invalid';
|
|
128
|
+
if (BUILT_IN_NAMES.has(name))
|
|
129
|
+
return 'built-in';
|
|
130
|
+
const env = ctx.env;
|
|
131
|
+
if (lstatOrNull(join(skillsDir(env), name)))
|
|
132
|
+
return 'personal';
|
|
133
|
+
if (retiredCopies(name, env).length)
|
|
134
|
+
return 'retired';
|
|
135
|
+
if (lstatOrNull(join(heldDir(env), name)))
|
|
136
|
+
return 'held';
|
|
137
|
+
if (ctx.checkout) {
|
|
138
|
+
for (const d of [join(ctx.checkout, '.agents', 'skills'), join(ctx.checkout, '.claude', 'skills')]) {
|
|
139
|
+
if (lstatOrNull(join(d, name)))
|
|
140
|
+
return trailMarked(join(d, name)) ? 'repo' : 'host';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
let teams = [];
|
|
144
|
+
try {
|
|
145
|
+
teams = readdirSync(trailPath(env, 'teams'));
|
|
146
|
+
}
|
|
147
|
+
catch { /* no team joined */ }
|
|
148
|
+
if (teams.some((t) => safeName(t) && lstatOrNull(join(trailPath(env, 'teams'), t, 'skills', name))))
|
|
149
|
+
return 'team';
|
|
150
|
+
if (homeSkillDirs(env).some((d) => lstatOrNull(join(d, name))))
|
|
151
|
+
return 'host';
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Moment 2's "a Trail skill covers it" (4.12 condition 3): a skill in scope with this job and status candidate,
|
|
156
|
+
* active or needs-fix, or a held item for this repo and job not yet shown. Retired never covers. A skill the person
|
|
157
|
+
* turned off still covers its job: an offer would only make a second one.
|
|
158
|
+
*/
|
|
159
|
+
export function jobCovered(job, ctx) {
|
|
160
|
+
const keys = new Set(ctx.repoKeys.map((k) => k.toLowerCase()));
|
|
161
|
+
const state = readSkillsState(ctx.env).skills;
|
|
162
|
+
const live = personalEntries(ctx.env).some((e) => e.skill.meta.job === job && appliesTo(e.ref.applies, keys) && (state[e.ref.id]?.status ?? 'candidate') !== 'retired');
|
|
163
|
+
if (live)
|
|
164
|
+
return true;
|
|
165
|
+
return allHeld(ctx.env).some((h) => h.shownAt === null && h.job === job && keys.has(h.repoKey.toLowerCase()));
|
|
166
|
+
}
|
|
167
|
+
/** Writes skills/<name>/SKILL.md (+ scripts/, empty lessons/), the state entry (candidate, source counts), ledger 'saved'. Locked. */
|
|
168
|
+
export function savePersonal(c, opts) {
|
|
169
|
+
checkSaveName(c.name);
|
|
170
|
+
const env = opts.env;
|
|
171
|
+
const now = opts.now ?? new Date();
|
|
172
|
+
return underStoreLock(env, () => {
|
|
173
|
+
const id = freeId(c.meta.trail, c.name, env);
|
|
174
|
+
const skill = id === c.meta.trail ? c : { ...c, meta: { ...c.meta, trail: id } };
|
|
175
|
+
const text = renderSkillMd(skill);
|
|
176
|
+
const dir = join(skillsDir(env), c.name);
|
|
177
|
+
writeSkillFolder(dir, skill, text, { lessons: true });
|
|
178
|
+
try {
|
|
179
|
+
startSkill(id, {
|
|
180
|
+
name: c.name, from: opts.from, runId: opts.runId, hash: skillHash(text), version: skill.meta.version,
|
|
181
|
+
source: { commands: c.source.commands, failed: c.source.failed, at: c.source.at },
|
|
182
|
+
consent: opts.consent, stepsVerified: opts.stepsVerified, stepsTotal: stepsTotal(c), now, env,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
catch (e) {
|
|
186
|
+
rmSync(dir, { recursive: true, force: true }); // made just now: a skill with no state is undone whole
|
|
187
|
+
throw e;
|
|
188
|
+
}
|
|
189
|
+
return personalRef(id, c.name, skill.meta.applies ?? null, env);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/** The skill's id from its SKILL.md, or null. */
|
|
193
|
+
const idIn = (dir) => {
|
|
194
|
+
const text = readCapped(join(dir, 'SKILL.md'));
|
|
195
|
+
return text === null ? null : parseSkillMd(text, basename(dir))?.meta.trail ?? null;
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Moves skills/<name> to skills/.retired/<name>-<YYYY-MM-DD>/ (`-2`, `-3` the same day); status retired, prevStatus kept.
|
|
199
|
+
* Phase 2 (4.9): the retire proposal's and drift's retire pass `reason: 'retire-offer'` (the ledger status line's
|
|
200
|
+
* reason) and a hook's short `waitMs`; a busy store throws, as for the person.
|
|
201
|
+
*/
|
|
202
|
+
export function forgetSkill(name, env, now = new Date(), o = {}) {
|
|
203
|
+
if (!safeName(name))
|
|
204
|
+
return { ok: false, reason: 'unknown' };
|
|
205
|
+
const reason = o.reason === 'retire-offer' ? 'retire-offer' : 'forget';
|
|
206
|
+
return underStoreLock(env, () => {
|
|
207
|
+
const dir = join(skillsDir(env), name);
|
|
208
|
+
if (!lstatOrNull(dir))
|
|
209
|
+
return { ok: false, reason: 'unknown' };
|
|
210
|
+
const id = idIn(dir);
|
|
211
|
+
privateDir(retiredDir(env));
|
|
212
|
+
const day = localDate(now);
|
|
213
|
+
let to = join(retiredDir(env), `${name}-${day}`);
|
|
214
|
+
for (let k = 2; lstatOrNull(to); k++)
|
|
215
|
+
to = join(retiredDir(env), `${name}-${day}-${k}`);
|
|
216
|
+
renameSync(dir, to);
|
|
217
|
+
if (id)
|
|
218
|
+
moveStatus(id, reason, now, env);
|
|
219
|
+
return { ok: true, to };
|
|
220
|
+
}, o.waitMs);
|
|
221
|
+
}
|
|
222
|
+
/** The newest retired copy back to skills/<name>, with the status it had (needs-fix when it was, else prevStatus). */
|
|
223
|
+
export function restoreSkill(name, env, now = new Date()) {
|
|
224
|
+
if (!safeName(name))
|
|
225
|
+
return { ok: false, reason: 'unknown' };
|
|
226
|
+
return underStoreLock(env, () => {
|
|
227
|
+
const [copy] = retiredCopies(name, env);
|
|
228
|
+
if (!copy)
|
|
229
|
+
return { ok: false, reason: 'unknown' };
|
|
230
|
+
if (takenAtHome(name, env))
|
|
231
|
+
return { ok: false, reason: 'name-taken' };
|
|
232
|
+
const dir = join(skillsDir(env), name);
|
|
233
|
+
renameSync(join(retiredDir(env), copy), dir);
|
|
234
|
+
const text = readCapped(join(dir, 'SKILL.md'));
|
|
235
|
+
const skill = text === null ? null : parseSkillMd(text, name);
|
|
236
|
+
const id = skill?.meta.trail ?? null;
|
|
237
|
+
if (id)
|
|
238
|
+
moveStatus(id, 'restore', now, env);
|
|
239
|
+
return { ok: true, ref: personalRef(id ?? '', name, skill?.meta.applies ?? null, env) };
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Forget: retired, remembering what it was (a needs-fix skill keeps the status before it and its why, so restore can
|
|
244
|
+
* bring needs-fix back). Restore: back to needs-fix when it carries a why, else to prevStatus (candidate when unknown).
|
|
245
|
+
*/
|
|
246
|
+
function moveStatus(id, reason, now, env) {
|
|
247
|
+
let line = null;
|
|
248
|
+
const next = updateSkillState(id, (s) => {
|
|
249
|
+
if (!s)
|
|
250
|
+
return undefined;
|
|
251
|
+
if (reason !== 'restore') {
|
|
252
|
+
if (s.status === 'retired')
|
|
253
|
+
return s;
|
|
254
|
+
if (s.status !== 'needs-fix') {
|
|
255
|
+
s.prevStatus = s.status;
|
|
256
|
+
delete s.statusWhy;
|
|
257
|
+
delete s.fixHash;
|
|
258
|
+
}
|
|
259
|
+
line = { from: s.status, to: 'retired' };
|
|
260
|
+
s.status = 'retired';
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
if (s.status !== 'retired')
|
|
264
|
+
return s;
|
|
265
|
+
const to = s.statusWhy ? 'needs-fix' : s.prevStatus && s.prevStatus !== 'retired' && s.prevStatus !== 'needs-fix' ? s.prevStatus : 'candidate';
|
|
266
|
+
line = { from: 'retired', to };
|
|
267
|
+
s.status = to;
|
|
268
|
+
}
|
|
269
|
+
return s;
|
|
270
|
+
}, env);
|
|
271
|
+
const l = line;
|
|
272
|
+
if (next && l) {
|
|
273
|
+
try {
|
|
274
|
+
appendLedger(id, { at: now.toISOString(), event: 'status', skill: id, from: l.from, to: l.to, reason }, env);
|
|
275
|
+
}
|
|
276
|
+
catch { /* the state is the truth */ }
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/skills/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EACL,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAChI,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,GAClF,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAiB,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,gBAAgB,EAAiD,MAAM,aAAa,CAAC;AAE9F,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACvD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAMD,uHAAuH;AACvH,SAAS,eAAe,CAAC,GAAuB;IAC9C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE;YAAE,SAAS;QAChH,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,OAAsB,EAAE,IAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAEvJ,0KAA0K;AAC1K,MAAM,UAAU,UAAU,CAAC,GAAa;IACtC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;SACtC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC;SAC9G,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,EAAE,CAAC,CAAC,UAAU;AACvB,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,cAAc,CAAC,SAAmB,EAAE,IAAwB;IAC1E,OAAO,EAAE,CAAC,CAAC,UAAU;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAa,EAAE,KAAkC;IACzE,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3E,IAAI,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACtC,6FAA6F;QAC7F,MAAM,GAAG,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,8GAA8G;YAC9G,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAClG,IAAI,MAAM,KAAK,WAAW;gBAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,GAAa;IACnD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;AAC9D,CAAC;AAED,sGAAsG;AACtG,MAAM,YAAY,GAAG,mCAAmC,CAAC;AAEzD,yGAAyG;AACzG,SAAS,aAAa,CAAC,IAAY,EAAE,GAAuB;IAC1D,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACzB,yFAAyF;QACzF,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,6DAA6D;AAC7D,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAE;IAClC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,OAAO,IAAI,KAAK,IAAI,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;AACrE,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,GAAa;IACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAChD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IAC/D,IAAI,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACtD,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACzD,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YACnG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAAE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACtF,CAAC;IACH,CAAC;IACD,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACnH,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAa,EAAE,GAAa;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC;IACxH,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAChH,CAAC;AAED,sIAAsI;AACtI,MAAM,UAAU,YAAY,CAAC,CAAgB,EAAE,IAA6I;IAC1L,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACnC,OAAO,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;QACjF,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,UAAU,CAAC,EAAE,EAAE;gBACb,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;gBACpG,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE;gBACjF,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG;aAC9F,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,uDAAuD;YACtG,MAAM,CAAC,CAAC;QACV,CAAC;QACD,OAAO,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iDAAiD;AACjD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;IAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;AACtF,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,GAAuB,EAAE,MAAY,IAAI,IAAI,EAAE,EACvF,IAA6D,EAAE;IAC/D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvE,OAAO,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAC;QACjF,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QACxF,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACpB,IAAI,EAAE;YAAE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,OAAO,EAAE,EAAE,EAAE,IAAa,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;AACf,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,GAAuB,EAAE,MAAY,IAAI,IAAI,EAAE;IACxF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7D,OAAO,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAC;QACrE,IAAI,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,MAAM,EAAE,YAAqB,EAAE,CAAC;QACzF,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACvC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;QACrC,IAAI,EAAE;YAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,EAAE,EAAE,EAAE,IAAa,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;IACnG,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,EAAU,EAAE,MAA6C,EAAE,GAAS,EAAE,GAAuB;IAC/G,IAAI,IAAI,GAAkD,IAAI,CAAC;IAC/D,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;QACtC,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC7B,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;gBACxB,OAAO,CAAC,CAAC,SAAS,CAAC;gBACnB,OAAO,CAAC,CAAC,OAAO,CAAC;YACnB,CAAC;YACD,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;YACzC,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,CAAC,CAAC;YACrC,MAAM,EAAE,GAAgB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;YAC5J,IAAI,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YAC/B,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,EAAE,GAAG,CAAC,CAAC;IACR,MAAM,CAAC,GAAG,IAAqD,CAAC;IAChE,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACd,IAAI,CAAC;YAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IAC9J,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** The top-level keys the spec allows. */
|
|
2
|
+
export declare const SPEC_KEYS: readonly string[];
|
|
3
|
+
export declare const NAME_MAX = 64;
|
|
4
|
+
export declare const DESCRIPTION_MAX = 1024;
|
|
5
|
+
export declare const COMPATIBILITY_MAX = 500;
|
|
6
|
+
/**
|
|
7
|
+
* Every way `text` (a SKILL.md) breaks the spec, for a skill in the folder
|
|
8
|
+
* `folderName`. Empty when it is valid.
|
|
9
|
+
*/
|
|
10
|
+
export declare function skillProblems(text: string, folderName: string): string[];
|
|
11
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/skills/validate.ts"],"names":[],"mappings":"AAkBA,0CAA0C;AAC1C,eAAO,MAAM,SAAS,EAAE,SAAS,MAAM,EAAqF,CAAC;AAE7H,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAgCrC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAwCxE"}
|