@nanonets/graft 0.24.1 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -21
- package/dist/blast/render.js +1 -1
- package/dist/blast/render.js.map +1 -1
- package/dist/brand.js +1 -1
- package/dist/brand.js.map +1 -1
- package/dist/check/learning-edits.d.ts +18 -3
- package/dist/check/learning-edits.d.ts.map +1 -1
- package/dist/check/learning-edits.js +54 -10
- package/dist/check/learning-edits.js.map +1 -1
- package/dist/check/local-check.d.ts +7 -3
- package/dist/check/local-check.d.ts.map +1 -1
- package/dist/check/local-check.js +55 -11
- package/dist/check/local-check.js.map +1 -1
- package/dist/check/types.d.ts +11 -2
- package/dist/check/types.d.ts.map +1 -1
- package/dist/claude/format.d.ts +11 -7
- package/dist/claude/format.d.ts.map +1 -1
- package/dist/claude/format.js +50 -28
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hook-io.js +1 -1
- package/dist/claude/hook-io.js.map +1 -1
- package/dist/claude/hook-layers.d.ts +4 -2
- package/dist/claude/hook-layers.d.ts.map +1 -1
- package/dist/claude/hook-layers.js +21 -4
- package/dist/claude/hook-layers.js.map +1 -1
- package/dist/claude/hooks.d.ts +9 -32
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +154 -350
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.d.ts.map +1 -1
- package/dist/claude/init.js +56 -18
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/note-signals.d.ts +6 -0
- package/dist/claude/note-signals.d.ts.map +1 -1
- package/dist/claude/note-signals.js +14 -3
- package/dist/claude/note-signals.js.map +1 -1
- package/dist/claude/post-bash.d.ts +26 -0
- package/dist/claude/post-bash.d.ts.map +1 -0
- package/dist/claude/post-bash.js +191 -0
- package/dist/claude/post-bash.js.map +1 -0
- package/dist/claude/pre-bash-skills.d.ts +21 -0
- package/dist/claude/pre-bash-skills.d.ts.map +1 -0
- package/dist/claude/pre-bash-skills.js +253 -0
- package/dist/claude/pre-bash-skills.js.map +1 -0
- package/dist/claude/pre-bash.d.ts +50 -0
- package/dist/claude/pre-bash.d.ts.map +1 -0
- package/dist/claude/pre-bash.js +245 -0
- package/dist/claude/pre-bash.js.map +1 -0
- package/dist/claude/prompt-consent.d.ts +19 -0
- package/dist/claude/prompt-consent.d.ts.map +1 -0
- package/dist/claude/prompt-consent.js +14 -0
- package/dist/claude/prompt-consent.js.map +1 -0
- package/dist/claude/prompt-hook.d.ts +76 -0
- package/dist/claude/prompt-hook.d.ts.map +1 -0
- package/dist/claude/prompt-hook.js +303 -0
- package/dist/claude/prompt-hook.js.map +1 -0
- package/dist/claude/prompt-skills.d.ts +19 -0
- package/dist/claude/prompt-skills.d.ts.map +1 -0
- package/dist/claude/prompt-skills.js +305 -0
- package/dist/claude/prompt-skills.js.map +1 -0
- package/dist/claude/session-metrics.js +4 -4
- package/dist/claude/session-metrics.js.map +1 -1
- package/dist/claude/settings-merge.d.ts +10 -0
- package/dist/claude/settings-merge.d.ts.map +1 -1
- package/dist/claude/settings-merge.js +46 -17
- package/dist/claude/settings-merge.js.map +1 -1
- package/dist/claude/shim-template.d.ts.map +1 -1
- package/dist/claude/shim-template.js +86 -28
- package/dist/claude/shim-template.js.map +1 -1
- package/dist/claude/skill-template.d.ts +2 -0
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +53 -34
- package/dist/claude/skill-template.js.map +1 -1
- package/dist/claude/skill-use.d.ts +16 -0
- package/dist/claude/skill-use.d.ts.map +1 -0
- package/dist/claude/skill-use.js +78 -0
- package/dist/claude/skill-use.js.map +1 -0
- package/dist/claude/skills-wiring.d.ts +26 -0
- package/dist/claude/skills-wiring.d.ts.map +1 -0
- package/dist/claude/skills-wiring.js +110 -0
- package/dist/claude/skills-wiring.js.map +1 -0
- package/dist/claude/start-init.d.ts +13 -0
- package/dist/claude/start-init.d.ts.map +1 -0
- package/dist/claude/start-init.js +75 -0
- package/dist/claude/start-init.js.map +1 -0
- package/dist/claude/start-skills.d.ts +31 -0
- package/dist/claude/start-skills.d.ts.map +1 -0
- package/dist/claude/start-skills.js +274 -0
- package/dist/claude/start-skills.js.map +1 -0
- package/dist/claude/state.d.ts +19 -7
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js +59 -4
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/stop-skills.d.ts +23 -0
- package/dist/claude/stop-skills.d.ts.map +1 -0
- package/dist/claude/stop-skills.js +233 -0
- package/dist/claude/stop-skills.js.map +1 -0
- package/dist/claude/stop.d.ts +23 -0
- package/dist/claude/stop.d.ts.map +1 -0
- package/dist/claude/stop.js +219 -0
- package/dist/claude/stop.js.map +1 -0
- package/dist/claude/tally.d.ts +29 -41
- package/dist/claude/tally.d.ts.map +1 -1
- package/dist/claude/tally.js +111 -165
- package/dist/claude/tally.js.map +1 -1
- package/dist/claude/walls-hook.d.ts +52 -0
- package/dist/claude/walls-hook.d.ts.map +1 -0
- package/dist/claude/walls-hook.js +279 -0
- package/dist/claude/walls-hook.js.map +1 -0
- package/dist/cli-epilogue.d.ts.map +1 -1
- package/dist/cli-epilogue.js +24 -14
- package/dist/cli-epilogue.js.map +1 -1
- package/dist/cli-meta.js +3 -3
- package/dist/cli-meta.js.map +1 -1
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +8 -6
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +238 -402
- package/dist/cli.js.map +1 -1
- package/dist/cloud/head-learnings.d.ts +13 -0
- package/dist/cloud/head-learnings.d.ts.map +1 -0
- package/dist/cloud/head-learnings.js +84 -0
- package/dist/cloud/head-learnings.js.map +1 -0
- package/dist/cloud/lookup-activity.d.ts +5 -3
- package/dist/cloud/lookup-activity.d.ts.map +1 -1
- package/dist/cloud/lookup-activity.js +8 -8
- package/dist/cloud/lookup-activity.js.map +1 -1
- package/dist/cloud/nudge.d.ts +15 -7
- package/dist/cloud/nudge.d.ts.map +1 -1
- package/dist/cloud/nudge.js +42 -33
- package/dist/cloud/nudge.js.map +1 -1
- package/dist/cloud/onboarding.d.ts +37 -1
- package/dist/cloud/onboarding.d.ts.map +1 -1
- package/dist/cloud/onboarding.js +77 -1
- package/dist/cloud/onboarding.js.map +1 -1
- package/dist/cloud/other-repos.d.ts +39 -0
- package/dist/cloud/other-repos.d.ts.map +1 -0
- package/dist/cloud/other-repos.js +137 -0
- package/dist/cloud/other-repos.js.map +1 -0
- package/dist/cloud/pair.d.ts +17 -7
- package/dist/cloud/pair.d.ts.map +1 -1
- package/dist/cloud/pair.js +81 -60
- package/dist/cloud/pair.js.map +1 -1
- package/dist/cloud/workspace-sync.d.ts +67 -11
- package/dist/cloud/workspace-sync.d.ts.map +1 -1
- package/dist/cloud/workspace-sync.js +299 -55
- package/dist/cloud/workspace-sync.js.map +1 -1
- package/dist/cloud/workspace.d.ts +74 -10
- package/dist/cloud/workspace.d.ts.map +1 -1
- package/dist/cloud/workspace.js +96 -8
- package/dist/cloud/workspace.js.map +1 -1
- package/dist/hosts/claude-global.js +1 -1
- package/dist/hosts/claude-global.js.map +1 -1
- package/dist/hosts/codex-hooks.d.ts +6 -0
- package/dist/hosts/codex-hooks.d.ts.map +1 -1
- package/dist/hosts/codex-hooks.js +89 -16
- package/dist/hosts/codex-hooks.js.map +1 -1
- package/dist/hosts/codex-trust.d.ts +28 -0
- package/dist/hosts/codex-trust.d.ts.map +1 -0
- package/dist/hosts/codex-trust.js +280 -0
- package/dist/hosts/codex-trust.js.map +1 -0
- package/dist/hosts/cursor-hooks.d.ts.map +1 -1
- package/dist/hosts/cursor-hooks.js +3 -1
- package/dist/hosts/cursor-hooks.js.map +1 -1
- package/dist/init/candidates.d.ts +60 -0
- package/dist/init/candidates.d.ts.map +1 -0
- package/dist/init/candidates.js +202 -0
- package/dist/init/candidates.js.map +1 -0
- package/dist/init/claude-call.d.ts +51 -0
- package/dist/init/claude-call.d.ts.map +1 -0
- package/dist/init/claude-call.js +199 -0
- package/dist/init/claude-call.js.map +1 -0
- package/dist/init/discover-worker.d.ts +18 -0
- package/dist/init/discover-worker.d.ts.map +1 -0
- package/dist/init/discover-worker.js +111 -0
- package/dist/init/discover-worker.js.map +1 -0
- package/dist/init/handover.d.ts +16 -0
- package/dist/init/handover.d.ts.map +1 -0
- package/dist/init/handover.js +92 -0
- package/dist/init/handover.js.map +1 -0
- package/dist/init/howtos.d.ts +20 -0
- package/dist/init/howtos.d.ts.map +1 -0
- package/dist/init/howtos.js +90 -0
- package/dist/init/howtos.js.map +1 -0
- package/dist/init/init-record.d.ts +134 -0
- package/dist/init/init-record.d.ts.map +1 -0
- package/dist/init/init-record.js +339 -0
- package/dist/init/init-record.js.map +1 -0
- package/dist/init/install-paths.d.ts +6 -0
- package/dist/init/install-paths.d.ts.map +1 -0
- package/dist/init/install-paths.js +87 -0
- package/dist/init/install-paths.js.map +1 -0
- package/dist/init/keep-answer.d.ts +43 -0
- package/dist/init/keep-answer.d.ts.map +1 -0
- package/dist/init/keep-answer.js +118 -0
- package/dist/init/keep-answer.js.map +1 -0
- package/dist/init/keep-gate.d.ts +30 -0
- package/dist/init/keep-gate.d.ts.map +1 -0
- package/dist/init/keep-gate.js +178 -0
- package/dist/init/keep-gate.js.map +1 -0
- package/dist/init/keep-list.d.ts +67 -0
- package/dist/init/keep-list.d.ts.map +1 -0
- package/dist/init/keep-list.js +232 -0
- package/dist/init/keep-list.js.map +1 -0
- package/dist/init/keep.d.ts +52 -0
- package/dist/init/keep.d.ts.map +1 -0
- package/dist/init/keep.js +393 -0
- package/dist/init/keep.js.map +1 -0
- package/dist/init/look-back-mine.d.ts +37 -0
- package/dist/init/look-back-mine.d.ts.map +1 -0
- package/dist/init/look-back-mine.js +215 -0
- package/dist/init/look-back-mine.js.map +1 -0
- package/dist/init/look-back.d.ts +81 -0
- package/dist/init/look-back.d.ts.map +1 -0
- package/dist/init/look-back.js +170 -0
- package/dist/init/look-back.js.map +1 -0
- package/dist/init/miners.d.ts +46 -0
- package/dist/init/miners.d.ts.map +1 -0
- package/dist/init/miners.js +141 -0
- package/dist/init/miners.js.map +1 -0
- package/dist/init/name-call.d.ts +37 -0
- package/dist/init/name-call.d.ts.map +1 -0
- package/dist/init/name-call.js +151 -0
- package/dist/init/name-call.js.map +1 -0
- package/dist/init/plain-file.d.ts.map +1 -1
- package/dist/init/plain-file.js +3 -0
- package/dist/init/plain-file.js.map +1 -1
- package/dist/init/prefs.d.ts +70 -0
- package/dist/init/prefs.d.ts.map +1 -0
- package/dist/init/prefs.js +282 -0
- package/dist/init/prefs.js.map +1 -0
- package/dist/init/relay.d.ts +15 -0
- package/dist/init/relay.d.ts.map +1 -0
- package/dist/init/relay.js +15 -0
- package/dist/init/relay.js.map +1 -0
- package/dist/init/replay-runs.d.ts +121 -0
- package/dist/init/replay-runs.d.ts.map +1 -0
- package/dist/init/replay-runs.js +457 -0
- package/dist/init/replay-runs.js.map +1 -0
- package/dist/init/replay-tamper.d.ts +18 -0
- package/dist/init/replay-tamper.d.ts.map +1 -0
- package/dist/init/replay-tamper.js +87 -0
- package/dist/init/replay-tamper.js.map +1 -0
- package/dist/init/review-screen.d.ts +74 -0
- package/dist/init/review-screen.d.ts.map +1 -0
- package/dist/init/review-screen.js +258 -0
- package/dist/init/review-screen.js.map +1 -0
- package/dist/init/review-tty.d.ts +29 -0
- package/dist/init/review-tty.d.ts.map +1 -0
- package/dist/init/review-tty.js +218 -0
- package/dist/init/review-tty.js.map +1 -0
- package/dist/init/review.d.ts +12 -0
- package/dist/init/review.d.ts.map +1 -0
- package/dist/init/review.js +12 -0
- package/dist/init/review.js.map +1 -0
- package/dist/init/run.d.ts +87 -0
- package/dist/init/run.d.ts.map +1 -0
- package/dist/init/run.js +347 -0
- package/dist/init/run.js.map +1 -0
- package/dist/init/sessions.d.ts +63 -0
- package/dist/init/sessions.d.ts.map +1 -0
- package/dist/init/sessions.js +377 -0
- package/dist/init/sessions.js.map +1 -0
- package/dist/init/transcript.d.ts +81 -0
- package/dist/init/transcript.d.ts.map +1 -0
- package/dist/init/transcript.js +216 -0
- package/dist/init/transcript.js.map +1 -0
- package/dist/init/types.d.ts +139 -0
- package/dist/init/types.d.ts.map +1 -0
- package/dist/init/types.js +2 -0
- package/dist/init/types.js.map +1 -0
- package/dist/notes/cold-start.d.ts +5 -213
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +5 -654
- package/dist/notes/cold-start.js.map +1 -1
- package/dist/notes/edit-overlap.d.ts.map +1 -1
- package/dist/notes/edit-overlap.js +4 -1
- package/dist/notes/edit-overlap.js.map +1 -1
- package/dist/notes/notes.d.ts +8 -4
- package/dist/notes/notes.d.ts.map +1 -1
- package/dist/notes/notes.js +9 -7
- package/dist/notes/notes.js.map +1 -1
- package/dist/notes/pr-reviews.d.ts +4 -0
- package/dist/notes/pr-reviews.d.ts.map +1 -1
- package/dist/notes/pr-reviews.js +6 -5
- package/dist/notes/pr-reviews.js.map +1 -1
- package/dist/notes/repo-trail.d.ts +1 -1
- package/dist/notes/repo-trail.d.ts.map +1 -1
- package/dist/notes/repo-trail.js +24 -4
- package/dist/notes/repo-trail.js.map +1 -1
- package/dist/search/grep.d.ts.map +1 -1
- package/dist/search/grep.js +4 -2
- package/dist/search/grep.js.map +1 -1
- package/dist/search/user-regexp.d.ts +26 -0
- package/dist/search/user-regexp.d.ts.map +1 -0
- package/dist/search/user-regexp.js +150 -0
- package/dist/search/user-regexp.js.map +1 -0
- package/dist/skills/anchors-cli.d.ts +5 -0
- package/dist/skills/anchors-cli.d.ts.map +1 -1
- package/dist/skills/anchors-cli.js +7 -2
- package/dist/skills/anchors-cli.js.map +1 -1
- package/dist/skills/anchors-wide.js +2 -2
- package/dist/skills/anchors-wide.js.map +1 -1
- package/dist/skills/cli-skills-1b.d.ts +17 -0
- package/dist/skills/cli-skills-1b.d.ts.map +1 -0
- package/dist/skills/cli-skills-1b.js +166 -0
- package/dist/skills/cli-skills-1b.js.map +1 -0
- package/dist/skills/cli-skills-2.d.ts +35 -0
- package/dist/skills/cli-skills-2.d.ts.map +1 -0
- package/dist/skills/cli-skills-2.js +129 -0
- package/dist/skills/cli-skills-2.js.map +1 -0
- package/dist/skills/cli-skills-report-1b.d.ts +49 -0
- package/dist/skills/cli-skills-report-1b.d.ts.map +1 -0
- package/dist/skills/cli-skills-report-1b.js +191 -0
- package/dist/skills/cli-skills-report-1b.js.map +1 -0
- package/dist/skills/cli-skills-report.d.ts +86 -0
- package/dist/skills/cli-skills-report.d.ts.map +1 -0
- package/dist/skills/cli-skills-report.js +121 -0
- package/dist/skills/cli-skills-report.js.map +1 -0
- package/dist/skills/cli-skills.d.ts +30 -0
- package/dist/skills/cli-skills.d.ts.map +1 -0
- package/dist/skills/cli-skills.js +379 -0
- package/dist/skills/cli-skills.js.map +1 -0
- package/dist/skills/compile-split.d.ts.map +1 -1
- package/dist/skills/compile-split.js +18 -0
- package/dist/skills/compile-split.js.map +1 -1
- package/dist/skills/compile-words.d.ts +4 -1
- package/dist/skills/compile-words.d.ts.map +1 -1
- package/dist/skills/compile-words.js +68 -8
- package/dist/skills/compile-words.js.map +1 -1
- package/dist/skills/compile.d.ts +7 -0
- package/dist/skills/compile.d.ts.map +1 -1
- package/dist/skills/compile.js +17 -0
- package/dist/skills/compile.js.map +1 -1
- package/dist/skills/credit.d.ts +86 -0
- package/dist/skills/credit.d.ts.map +1 -0
- package/dist/skills/credit.js +259 -0
- package/dist/skills/credit.js.map +1 -0
- package/dist/skills/fold-gated.d.ts +3 -0
- package/dist/skills/fold-gated.d.ts.map +1 -0
- package/dist/skills/fold-gated.js +78 -0
- package/dist/skills/fold-gated.js.map +1 -0
- package/dist/skills/fold.d.ts +87 -0
- package/dist/skills/fold.d.ts.map +1 -0
- package/dist/skills/fold.js +348 -0
- package/dist/skills/fold.js.map +1 -0
- package/dist/skills/follow-learnings.d.ts +128 -0
- package/dist/skills/follow-learnings.d.ts.map +1 -0
- package/dist/skills/follow-learnings.js +278 -0
- package/dist/skills/follow-learnings.js.map +1 -0
- package/dist/skills/learning-steps.d.ts +43 -0
- package/dist/skills/learning-steps.d.ts.map +1 -0
- package/dist/skills/learning-steps.js +294 -0
- package/dist/skills/learning-steps.js.map +1 -0
- package/dist/skills/lesson-gate.d.ts +25 -0
- package/dist/skills/lesson-gate.d.ts.map +1 -0
- package/dist/skills/lesson-gate.js +316 -0
- package/dist/skills/lesson-gate.js.map +1 -0
- package/dist/skills/offer-drift.d.ts +35 -0
- package/dist/skills/offer-drift.d.ts.map +1 -0
- package/dist/skills/offer-drift.js +98 -0
- package/dist/skills/offer-drift.js.map +1 -0
- package/dist/skills/offer-lesson.d.ts +31 -0
- package/dist/skills/offer-lesson.d.ts.map +1 -0
- package/dist/skills/offer-lesson.js +123 -0
- package/dist/skills/offer-lesson.js.map +1 -0
- package/dist/skills/offer-lines.d.ts +40 -0
- package/dist/skills/offer-lines.d.ts.map +1 -0
- package/dist/skills/offer-lines.js +80 -0
- package/dist/skills/offer-lines.js.map +1 -0
- package/dist/skills/offer-moment.d.ts +102 -0
- package/dist/skills/offer-moment.d.ts.map +1 -0
- package/dist/skills/offer-moment.js +260 -0
- package/dist/skills/offer-moment.js.map +1 -0
- package/dist/skills/offer-repair.d.ts +36 -0
- package/dist/skills/offer-repair.d.ts.map +1 -0
- package/dist/skills/offer-repair.js +212 -0
- package/dist/skills/offer-repair.js.map +1 -0
- package/dist/skills/offer-retire.d.ts +53 -0
- package/dist/skills/offer-retire.d.ts.map +1 -0
- package/dist/skills/offer-retire.js +149 -0
- package/dist/skills/offer-retire.js.map +1 -0
- package/dist/skills/offer-update.d.ts +54 -0
- package/dist/skills/offer-update.d.ts.map +1 -0
- package/dist/skills/offer-update.js +115 -0
- package/dist/skills/offer-update.js.map +1 -0
- package/dist/skills/offer-words-1b.d.ts +32 -0
- package/dist/skills/offer-words-1b.d.ts.map +1 -0
- package/dist/skills/offer-words-1b.js +80 -0
- package/dist/skills/offer-words-1b.js.map +1 -0
- package/dist/skills/offer-words-2.d.ts +123 -0
- package/dist/skills/offer-words-2.d.ts.map +1 -0
- package/dist/skills/offer-words-2.js +194 -0
- package/dist/skills/offer-words-2.js.map +1 -0
- package/dist/skills/offer-words.d.ts +65 -0
- package/dist/skills/offer-words.d.ts.map +1 -0
- package/dist/skills/offer-words.js +205 -0
- package/dist/skills/offer-words.js.map +1 -0
- package/dist/skills/offers.d.ts +66 -0
- package/dist/skills/offers.d.ts.map +1 -0
- package/dist/skills/offers.js +284 -0
- package/dist/skills/offers.js.map +1 -0
- package/dist/skills/runblock.d.ts +2 -0
- package/dist/skills/runblock.d.ts.map +1 -1
- package/dist/skills/runblock.js +11 -6
- package/dist/skills/runblock.js.map +1 -1
- package/dist/skills/save-gate.d.ts +64 -0
- package/dist/skills/save-gate.d.ts.map +1 -0
- package/dist/skills/save-gate.js +354 -0
- package/dist/skills/save-gate.js.map +1 -0
- package/dist/skills/save-verify.d.ts +59 -0
- package/dist/skills/save-verify.d.ts.map +1 -0
- package/dist/skills/save-verify.js +390 -0
- package/dist/skills/save-verify.js.map +1 -0
- package/dist/skills/settings.d.ts +12 -2
- package/dist/skills/settings.d.ts.map +1 -1
- package/dist/skills/settings.js +24 -2
- package/dist/skills/settings.js.map +1 -1
- package/dist/skills/skills.d.ts +26 -8
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +105 -52
- package/dist/skills/skills.js.map +1 -1
- package/dist/skills/types.d.ts +8 -0
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/skills/update-gate.d.ts +36 -0
- package/dist/skills/update-gate.d.ts.map +1 -0
- package/dist/skills/update-gate.js +357 -0
- package/dist/skills/update-gate.js.map +1 -0
- package/dist/skills/update-plan.d.ts +40 -0
- package/dist/skills/update-plan.d.ts.map +1 -0
- package/dist/skills/update-plan.js +196 -0
- package/dist/skills/update-plan.js.map +1 -0
- package/dist/skills/value-line.d.ts +94 -0
- package/dist/skills/value-line.d.ts.map +1 -0
- package/dist/skills/value-line.js +355 -0
- package/dist/skills/value-line.js.map +1 -0
- package/dist/telemetry/contract.d.ts +15 -1
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +80 -11
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/gate.js +4 -4
- package/dist/telemetry/gate.js.map +1 -1
- package/dist/telemetry/index.d.ts +1 -1
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +1 -1
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/notice.js +5 -5
- package/dist/telemetry/notice.js.map +1 -1
- package/dist/telemetry/queue.d.ts.map +1 -1
- package/dist/telemetry/queue.js +7 -7
- package/dist/telemetry/queue.js.map +1 -1
- package/dist/telemetry/track.d.ts.map +1 -1
- package/dist/telemetry/track.js +4 -3
- package/dist/telemetry/track.js.map +1 -1
- package/dist/trace/checks.d.ts.map +1 -1
- package/dist/trace/checks.js +10 -2
- package/dist/trace/checks.js.map +1 -1
- package/dist/trace/gate-file.d.ts +1 -1
- package/dist/trace/gate-file.d.ts.map +1 -1
- package/dist/trace/gate-file.js +3 -3
- package/dist/trace/gate-file.js.map +1 -1
- package/dist/upkeep-run.d.ts.map +1 -1
- package/dist/upkeep-run.js +2 -23
- package/dist/upkeep-run.js.map +1 -1
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +2 -3
- package/dist/upkeep.js.map +1 -1
- package/dist/util/private-fs.d.ts +6 -0
- package/dist/util/private-fs.d.ts.map +1 -1
- package/dist/util/private-fs.js +9 -1
- package/dist/util/private-fs.js.map +1 -1
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +17 -3
- package/dist/util/state.js.map +1 -1
- package/package.json +1 -1
- package/dist/skills/found-skill.d.ts +0 -35
- package/dist/skills/found-skill.d.ts.map +0 -1
- package/dist/skills/found-skill.js +0 -66
- package/dist/skills/found-skill.js.map +0 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Claude Code to run: `claude` on PATH, else a standalone install's copy,
|
|
3
|
+
* else the newest copy the VS Code, Cursor, VS Code Insiders or Windsurf
|
|
4
|
+
* extension keeps. Someone who only uses the extension has no `claude` on
|
|
5
|
+
* PATH, and without this their past sessions are never read. Null when
|
|
6
|
+
* there's none.
|
|
7
|
+
*/
|
|
8
|
+
export declare function claudeBin(home?: string, onPath?: () => boolean): string | null;
|
|
9
|
+
/** Whether there's a Claude Code to run, on PATH or not. */
|
|
10
|
+
export declare function hasClaude(home?: string): boolean;
|
|
11
|
+
/** Why Claude Code gave no answer. */
|
|
12
|
+
export type ClaudeFailure = "not_signed_in" | "not_installed" | "timed_out" | "refused" | "failed";
|
|
13
|
+
/** What one call came back with: the findings, or why there are none (with Claude Code's own short words, when it said any). */
|
|
14
|
+
export type ClaudeAnswer<T> = {
|
|
15
|
+
ok: true;
|
|
16
|
+
findings: T[];
|
|
17
|
+
costUsd?: number;
|
|
18
|
+
} | {
|
|
19
|
+
ok: false;
|
|
20
|
+
why: ClaudeFailure;
|
|
21
|
+
said?: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* One headless Claude Code call with the person's own login: no tools, no MCP
|
|
25
|
+
* servers, no slash commands, nothing saved as a session (so this run never
|
|
26
|
+
* shows up as a past session), from a scratch folder so no repo's CLAUDE.md or
|
|
27
|
+
* hooks load. `TRAIL_NO_HOOKS` keeps trail's own user-level hooks quiet too.
|
|
28
|
+
* The caller brings its system prompt and schema, with `findings` at the top.
|
|
29
|
+
* Never rejects: a failure comes back with its reason.
|
|
30
|
+
*/
|
|
31
|
+
export declare function callClaude<T>(bin: string, prompt: string, model: string, timeoutMs: number, ask: {
|
|
32
|
+
system: string;
|
|
33
|
+
schema: object;
|
|
34
|
+
}): Promise<ClaudeAnswer<T>>;
|
|
35
|
+
/** `callClaude` for callers that only need the answer: null when there's none. */
|
|
36
|
+
export declare function askClaude<T>(bin: string, prompt: string, model: string, timeoutMs: number, ask: {
|
|
37
|
+
system: string;
|
|
38
|
+
schema: object;
|
|
39
|
+
}): Promise<{
|
|
40
|
+
findings: T[];
|
|
41
|
+
costUsd?: number;
|
|
42
|
+
} | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Why `what` couldn't be read, in plain words with what to do about it.
|
|
45
|
+
* "couldn't read" never stands alone: the reason comes first.
|
|
46
|
+
*/
|
|
47
|
+
export declare function whyLine(f: {
|
|
48
|
+
why: ClaudeFailure;
|
|
49
|
+
said?: string;
|
|
50
|
+
}, what: string): string;
|
|
51
|
+
//# sourceMappingURL=claude-call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-call.d.ts","sourceRoot":"","sources":["../../src/init/claude-call.ts"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,GAAE,MAAkB,EAAE,MAAM,GAAE,MAAM,OAAsB,GAAG,MAAM,GAAG,IAAI,CAqBvG;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,sCAAsC;AACtC,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,eAAe,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEnG,gIAAgI;AAChI,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,aAAa,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAoC/H;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CA+D1B;AAED,kFAAkF;AAClF,wBAAsB,SAAS,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC;IAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAGrD;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE;IAAE,GAAG,EAAE,aAAa,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBtF"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asking the person's own Claude Code, headless, for `trail init`: finding a
|
|
3
|
+
* copy to run and making the one call.
|
|
4
|
+
*/
|
|
5
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
6
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
7
|
+
import { homedir, tmpdir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { flatLine } from "../notes/flatten.js";
|
|
10
|
+
/** Whether `claude` (Claude Code) is on PATH. */
|
|
11
|
+
function claudeOnPath() {
|
|
12
|
+
const r = spawnSync("claude", ["--version"], { stdio: "ignore", timeout: 10_000 });
|
|
13
|
+
return r.status === 0;
|
|
14
|
+
}
|
|
15
|
+
/** `[2, 1, 296]` from `anthropic.claude-code-2.1.296-darwin-arm64`; null for anything else. */
|
|
16
|
+
function extensionVersion(name) {
|
|
17
|
+
const m = /^anthropic\.claude-code-(\d+)\.(\d+)\.(\d+)/.exec(name);
|
|
18
|
+
return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The Claude Code to run: `claude` on PATH, else a standalone install's copy,
|
|
22
|
+
* else the newest copy the VS Code, Cursor, VS Code Insiders or Windsurf
|
|
23
|
+
* extension keeps. Someone who only uses the extension has no `claude` on
|
|
24
|
+
* PATH, and without this their past sessions are never read. Null when
|
|
25
|
+
* there's none.
|
|
26
|
+
*/
|
|
27
|
+
export function claudeBin(home = homedir(), onPath = claudeOnPath) {
|
|
28
|
+
if (onPath())
|
|
29
|
+
return "claude";
|
|
30
|
+
const exe = process.platform === "win32" ? "claude.exe" : "claude";
|
|
31
|
+
for (const p of [join(home, ".local", "bin", exe), join(home, ".claude", "local", exe)])
|
|
32
|
+
if (existsSync(p))
|
|
33
|
+
return p;
|
|
34
|
+
const copies = [];
|
|
35
|
+
for (const editor of [".vscode", ".cursor", ".vscode-insiders", ".windsurf"]) {
|
|
36
|
+
const dir = join(home, editor, "extensions");
|
|
37
|
+
let names = [];
|
|
38
|
+
try {
|
|
39
|
+
names = readdirSync(dir);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
for (const name of names) {
|
|
45
|
+
const version = extensionVersion(name);
|
|
46
|
+
const path = join(dir, name, "resources", "native-binary", exe);
|
|
47
|
+
if (version && existsSync(path))
|
|
48
|
+
copies.push({ version, path });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
copies.sort((a, b) => b.version[0] - a.version[0] || b.version[1] - a.version[1] || b.version[2] - a.version[2]);
|
|
52
|
+
return copies[0]?.path ?? null;
|
|
53
|
+
}
|
|
54
|
+
/** Whether there's a Claude Code to run, on PATH or not. */
|
|
55
|
+
export function hasClaude(home) {
|
|
56
|
+
return claudeBin(home) !== null;
|
|
57
|
+
}
|
|
58
|
+
/** The CLI's words for a login that's missing or expired. */
|
|
59
|
+
const NOT_SIGNED_IN = /not logged in|please run \/login|log ?in again|failed to authenticate|authentication|oauth|invalid api key|unauthori[sz]ed|\b401\b/i;
|
|
60
|
+
/** The CLI's words when it ran but won't do this one: limits, credit, a refusal. */
|
|
61
|
+
const REFUSED = /limit|quota|credit|balance|overloaded|refus|not allowed|policy|can't help|cannot help/i;
|
|
62
|
+
const SAID_CHARS = 80;
|
|
63
|
+
/** How long a call past its time gets to stop on SIGTERM before it's killed. */
|
|
64
|
+
const KILL_GRACE_MS = 2000;
|
|
65
|
+
/** Claude Code's own message, on one short line, or undefined. A usage limit's reset stamp (`…|1760000000`) is left off. */
|
|
66
|
+
function saidOf(text) {
|
|
67
|
+
const line = text.replace(/\|\d{9,}\b/g, "").replace(/\s+/g, " ").trim();
|
|
68
|
+
if (!line)
|
|
69
|
+
return undefined;
|
|
70
|
+
return line.length > SAID_CHARS ? `${line.slice(0, SAID_CHARS - 1)}…` : line;
|
|
71
|
+
}
|
|
72
|
+
/** Why a finished call gave no findings, from its JSON result or its plain output. */
|
|
73
|
+
function failureOf(out, err) {
|
|
74
|
+
let result = "";
|
|
75
|
+
try {
|
|
76
|
+
const r = JSON.parse(out);
|
|
77
|
+
// A run that broke mid-way lists its errors instead of a result.
|
|
78
|
+
const errors = Array.isArray(r.errors) ? r.errors.filter((e) => typeof e === "string") : [];
|
|
79
|
+
result = typeof r.result === "string" && r.result ? r.result : errors.join("; ");
|
|
80
|
+
if (r.api_error_status === 401)
|
|
81
|
+
return { why: "not_signed_in" };
|
|
82
|
+
if (!r.is_error && !NOT_SIGNED_IN.test(result))
|
|
83
|
+
return { why: "refused", ...(saidOf(result) ? { said: saidOf(result) } : {}) };
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
result = `${out}\n${err}`;
|
|
87
|
+
}
|
|
88
|
+
if (NOT_SIGNED_IN.test(result) || NOT_SIGNED_IN.test(err))
|
|
89
|
+
return { why: "not_signed_in" };
|
|
90
|
+
const said = saidOf(result) ?? saidOf(err);
|
|
91
|
+
if (REFUSED.test(result))
|
|
92
|
+
return { why: "refused", ...(said ? { said } : {}) };
|
|
93
|
+
return { why: "failed", ...(said ? { said } : {}) };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* One headless Claude Code call with the person's own login: no tools, no MCP
|
|
97
|
+
* servers, no slash commands, nothing saved as a session (so this run never
|
|
98
|
+
* shows up as a past session), from a scratch folder so no repo's CLAUDE.md or
|
|
99
|
+
* hooks load. `TRAIL_NO_HOOKS` keeps trail's own user-level hooks quiet too.
|
|
100
|
+
* The caller brings its system prompt and schema, with `findings` at the top.
|
|
101
|
+
* Never rejects: a failure comes back with its reason.
|
|
102
|
+
*/
|
|
103
|
+
export function callClaude(bin, prompt, model, timeoutMs, ask) {
|
|
104
|
+
return new Promise((done) => {
|
|
105
|
+
const args = [
|
|
106
|
+
"-p",
|
|
107
|
+
"--model", model,
|
|
108
|
+
"--output-format", "json",
|
|
109
|
+
"--json-schema", JSON.stringify(ask.schema),
|
|
110
|
+
"--system-prompt", ask.system,
|
|
111
|
+
"--tools", "",
|
|
112
|
+
"--strict-mcp-config",
|
|
113
|
+
"--no-session-persistence",
|
|
114
|
+
"--disable-slash-commands",
|
|
115
|
+
];
|
|
116
|
+
let finished = false;
|
|
117
|
+
const finish = (answer) => {
|
|
118
|
+
if (finished)
|
|
119
|
+
return;
|
|
120
|
+
finished = true;
|
|
121
|
+
clearTimeout(timer);
|
|
122
|
+
done(answer);
|
|
123
|
+
};
|
|
124
|
+
let timedOut = false;
|
|
125
|
+
let timer;
|
|
126
|
+
let child;
|
|
127
|
+
try {
|
|
128
|
+
child = spawn(bin, args, { cwd: tmpdir(), env: { ...process.env, TRAIL_NO_HOOKS: "1" }, stdio: ["pipe", "pipe", "pipe"] });
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
finish({ ok: false, why: e?.code === "ENOENT" ? "not_installed" : "failed" });
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
let out = "";
|
|
135
|
+
let err = "";
|
|
136
|
+
timer = setTimeout(() => {
|
|
137
|
+
timedOut = true;
|
|
138
|
+
child.kill("SIGTERM");
|
|
139
|
+
// One that ignores the signal is killed, and init goes on either way: it never hangs here.
|
|
140
|
+
setTimeout(() => {
|
|
141
|
+
child.kill("SIGKILL");
|
|
142
|
+
child.stdout.destroy();
|
|
143
|
+
child.stderr.destroy();
|
|
144
|
+
finish({ ok: false, why: "timed_out" });
|
|
145
|
+
}, KILL_GRACE_MS).unref();
|
|
146
|
+
}, timeoutMs);
|
|
147
|
+
child.stdout.on("data", (b) => (out += b.toString("utf8")));
|
|
148
|
+
// Only a little of stderr: enough for the CLI's own reason, never a whole log.
|
|
149
|
+
child.stderr.on("data", (b) => {
|
|
150
|
+
if (err.length < 4096)
|
|
151
|
+
err += b.toString("utf8");
|
|
152
|
+
});
|
|
153
|
+
child.on("error", (e) => finish({ ok: false, why: e?.code === "ENOENT" || e?.code === "EACCES" ? "not_installed" : "failed" }));
|
|
154
|
+
child.on("close", () => {
|
|
155
|
+
if (timedOut)
|
|
156
|
+
return finish({ ok: false, why: "timed_out" });
|
|
157
|
+
try {
|
|
158
|
+
const r = JSON.parse(out);
|
|
159
|
+
if (!r.is_error && r.structured_output) {
|
|
160
|
+
return finish({ ok: true, findings: r.structured_output.findings ?? [], ...(typeof r.total_cost_usd === "number" ? { costUsd: r.total_cost_usd } : {}) });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
/* not JSON: the CLI's own words say why */
|
|
165
|
+
}
|
|
166
|
+
finish({ ok: false, ...failureOf(out, err) });
|
|
167
|
+
});
|
|
168
|
+
child.stdin.on("error", () => { });
|
|
169
|
+
child.stdin.end(prompt);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/** `callClaude` for callers that only need the answer: null when there's none. */
|
|
173
|
+
export async function askClaude(bin, prompt, model, timeoutMs, ask) {
|
|
174
|
+
const a = await callClaude(bin, prompt, model, timeoutMs, ask);
|
|
175
|
+
return a.ok ? { findings: a.findings, ...(a.costUsd !== undefined ? { costUsd: a.costUsd } : {}) } : null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Why `what` couldn't be read, in plain words with what to do about it.
|
|
179
|
+
* "couldn't read" never stands alone: the reason comes first.
|
|
180
|
+
*/
|
|
181
|
+
export function whyLine(f, what) {
|
|
182
|
+
// Plain `trail init` won't look back again once it has, so every retry points at --look-back; Claude Code's own
|
|
183
|
+
// words are one flat line of at most 80 characters, double quotes made single (as the naming call's, b6 review).
|
|
184
|
+
const said = f.said ? flatLine(f.said, 80).replace(/["\u201c\u201d]/g, "'") : "";
|
|
185
|
+
const again = "To try again: trail init --look-back";
|
|
186
|
+
switch (f.why) {
|
|
187
|
+
case "not_signed_in":
|
|
188
|
+
return `Claude Code isn't signed in on this terminal, so trail couldn't read ${what}. Run claude auth login, then trail init --look-back.`;
|
|
189
|
+
case "not_installed":
|
|
190
|
+
return `Claude Code isn't installed on this machine, so trail couldn't read ${what}. Install it, then run trail init --look-back.`;
|
|
191
|
+
case "timed_out":
|
|
192
|
+
return `Claude Code took longer than 3 minutes to answer, so trail stopped reading ${what}. ${again}`;
|
|
193
|
+
case "refused":
|
|
194
|
+
return `Claude Code said no${said ? ` ("${said}")` : ""}, so trail couldn't read ${what}. ${again}`;
|
|
195
|
+
default:
|
|
196
|
+
return `Claude Code stopped with an error${said ? ` ("${said}")` : ""}, so trail couldn't read ${what}. ${again}`;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=claude-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-call.js","sourceRoot":"","sources":["../../src/init/claude-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type LookBackOpts, type LookBackResult } from "./look-back-mine.js";
|
|
2
|
+
import { type Discovery } from "./sessions.js";
|
|
3
|
+
/** `discoverSessions(repo, home, now, env)` in a worker thread, under the Trail home `env` names. Never rejects. */
|
|
4
|
+
export declare function discoverOffThread(repo: string, home: string, env?: NodeJS.ProcessEnv): Promise<Discovery>;
|
|
5
|
+
type Progress = NonNullable<LookBackOpts["onProgress"]>;
|
|
6
|
+
/**
|
|
7
|
+
* The no-model look-back (design 4.1 to 4.5) in a worker: discovery, replay, miners, how-tos and candidates, with
|
|
8
|
+
* progress every 2 s. Never rejects: a worker that can't start (or can't load this module) runs it here; one that dies or overruns its cap by
|
|
9
|
+
* 30 s gives an empty look-back that says so.
|
|
10
|
+
*/
|
|
11
|
+
export declare function lookBackOffThread(dir: string, opts: {
|
|
12
|
+
env: NodeJS.ProcessEnv;
|
|
13
|
+
capMs: number;
|
|
14
|
+
skills: boolean;
|
|
15
|
+
onProgress?: Progress;
|
|
16
|
+
}): Promise<LookBackResult>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=discover-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-worker.d.ts","sourceRoot":"","sources":["../../src/init/discover-worker.ts"],"names":[],"mappings":"AAQA,OAAO,EAAY,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAQjE,oHAAoH;AACpH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,SAAS,CAAC,CAsBtH;AAED,KAAK,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAC5G,UAAU,CAAC,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CA6ClD"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovery and the look-back off the main thread: `trail init` keeps wiring
|
|
3
|
+
* and building the graph (and its spinner keeps turning) while a worker
|
|
4
|
+
* reads the transcripts. The worker is this same module, started on its own
|
|
5
|
+
* file; anything that goes wrong with the thread falls back to reading on
|
|
6
|
+
* the main thread.
|
|
7
|
+
*/
|
|
8
|
+
import { isMainThread, parentPort, workerData, Worker } from "node:worker_threads";
|
|
9
|
+
import { lookBack } from "./look-back-mine.js";
|
|
10
|
+
import { discoverSessions } from "./sessions.js";
|
|
11
|
+
const TAG = "trailDiscover";
|
|
12
|
+
const LOOK = "trailLookBack";
|
|
13
|
+
/** Past the cap, how long the main thread waits for the worker's answer before it gives up on it. */
|
|
14
|
+
const GRACE_MS = 30_000;
|
|
15
|
+
/** `discoverSessions(repo, home, now, env)` in a worker thread, under the Trail home `env` names. Never rejects. */
|
|
16
|
+
export function discoverOffThread(repo, home, env = process.env) {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
let settled = false;
|
|
19
|
+
const done = (d) => {
|
|
20
|
+
if (settled)
|
|
21
|
+
return;
|
|
22
|
+
settled = true;
|
|
23
|
+
resolve(d);
|
|
24
|
+
};
|
|
25
|
+
const here = () => {
|
|
26
|
+
if (!settled)
|
|
27
|
+
done(discoverSessions(repo, home, new Date(), env));
|
|
28
|
+
};
|
|
29
|
+
let worker;
|
|
30
|
+
try {
|
|
31
|
+
worker = new Worker(new URL(import.meta.url), { workerData: { [TAG]: { repo, home, env: { ...env } } } });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
setImmediate(here);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
worker.once("message", (d) => done(d));
|
|
38
|
+
worker.once("error", here);
|
|
39
|
+
worker.once("exit", here);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The no-model look-back (design 4.1 to 4.5) in a worker: discovery, replay, miners, how-tos and candidates, with
|
|
44
|
+
* progress every 2 s. Never rejects: a worker that can't start (or can't load this module) runs it here; one that dies or overruns its cap by
|
|
45
|
+
* 30 s gives an empty look-back that says so.
|
|
46
|
+
*/
|
|
47
|
+
export function lookBackOffThread(dir, opts) {
|
|
48
|
+
const { onProgress, ...plain } = opts;
|
|
49
|
+
const empty = (why) => ({
|
|
50
|
+
sessions: [], skipped: [], days: 0, from: null, to: null, parent: 0, candidates: [], alreadyKept: { here: 0, elsewhere: [] }, howtos: [], ms: 0,
|
|
51
|
+
errors: [`couldn't read your past sessions this time (${why})`],
|
|
52
|
+
});
|
|
53
|
+
return new Promise((resolve) => {
|
|
54
|
+
let settled = false;
|
|
55
|
+
let timer;
|
|
56
|
+
const done = (lb) => {
|
|
57
|
+
if (settled)
|
|
58
|
+
return;
|
|
59
|
+
settled = true;
|
|
60
|
+
if (timer)
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
resolve(lb);
|
|
63
|
+
};
|
|
64
|
+
let worker;
|
|
65
|
+
try {
|
|
66
|
+
worker = new Worker(new URL(import.meta.url), { workerData: { [LOOK]: { dir, opts: { ...plain, env: { ...plain.env } } } } });
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
setImmediate(() => done(lookBack(dir, opts)));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
timer = setTimeout(() => {
|
|
73
|
+
done(empty("out of time"));
|
|
74
|
+
void worker.terminate();
|
|
75
|
+
}, Math.max(0, opts.capMs) + GRACE_MS);
|
|
76
|
+
timer.unref?.();
|
|
77
|
+
worker.on("message", (m) => {
|
|
78
|
+
if (m?.progress && onProgress) {
|
|
79
|
+
try {
|
|
80
|
+
onProgress(m.progress);
|
|
81
|
+
}
|
|
82
|
+
catch { /* a progress line never stops the look-back */ }
|
|
83
|
+
}
|
|
84
|
+
if (m?.done)
|
|
85
|
+
done(m.done);
|
|
86
|
+
});
|
|
87
|
+
worker.once("error", (e) => {
|
|
88
|
+
// A worker that can't load this module (Node 20 runs a .ts source only on the main thread) never started: run it here.
|
|
89
|
+
if (e?.code === "ERR_UNKNOWN_FILE_EXTENSION") {
|
|
90
|
+
if (!settled)
|
|
91
|
+
done(lookBack(dir, opts));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
done(empty(e instanceof Error ? e.message.slice(0, 80) : "the reader stopped"));
|
|
95
|
+
});
|
|
96
|
+
worker.once("exit", () => done(empty("the reader stopped")));
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (!isMainThread && workerData && typeof workerData === "object") {
|
|
100
|
+
const data = workerData;
|
|
101
|
+
if (TAG in data) {
|
|
102
|
+
const { repo, home, env } = data[TAG];
|
|
103
|
+
parentPort?.postMessage(discoverSessions(repo, home, new Date(), env ?? process.env));
|
|
104
|
+
}
|
|
105
|
+
else if (LOOK in data) {
|
|
106
|
+
const { dir, opts } = data[LOOK];
|
|
107
|
+
const lb = lookBack(dir, { ...opts, onProgress: (p) => parentPort?.postMessage({ progress: p }) });
|
|
108
|
+
parentPort?.postMessage({ done: lb });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=discover-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-worker.js","sourceRoot":"","sources":["../../src/init/discover-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type PendingItem } from './init-record.js';
|
|
2
|
+
import type { InitItem } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* A pending item as the relay shows it again: its plain name, or the person's line read now by its pointer (title ''
|
|
5
|
+
* when that line is gone). Shared with `trail keep`, which names the same items.
|
|
6
|
+
*/
|
|
7
|
+
export declare function pendingAsItem(p: PendingItem, env: NodeJS.ProcessEnv): InitItem;
|
|
8
|
+
/**
|
|
9
|
+
* The context to add at this session's start, or null. Writes the record: `handedAt` and `handover` the first time;
|
|
10
|
+
* `pending` dropped when another session already had it. Never throws.
|
|
11
|
+
*/
|
|
12
|
+
export declare function initHandover(repoKey: string, session: {
|
|
13
|
+
id: string;
|
|
14
|
+
transcriptPath: string | null;
|
|
15
|
+
}, env?: NodeJS.ProcessEnv, now?: Date): string | null;
|
|
16
|
+
//# sourceMappingURL=handover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handover.d.ts","sourceRoot":"","sources":["../../src/init/handover.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAyD,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM3G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,QAAQ,CAW9E;AAUD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,EACxI,GAAG,GAAE,IAAiB,GAAG,MAAM,GAAG,IAAI,CAkCvC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The init handover (design 3.1 step 10, 4.8, J02 leg C), for b7's
|
|
3
|
+
* SessionStart to call: when a relay's list waits unanswered, the next
|
|
4
|
+
* interactive session in this repo gets the same list once, numbers
|
|
5
|
+
* unchanged, titles rebuilt from the record (a preference's line read again
|
|
6
|
+
* by its pointer), and the record notes that session and its transcript's
|
|
7
|
+
* size, from which the keep gate reads (R22). A later session says nothing
|
|
8
|
+
* and drops the list: its items become never-shown (P10).
|
|
9
|
+
*
|
|
10
|
+
* Light on purpose (it runs inside the SessionStart budget): the record, at
|
|
11
|
+
* most 5 positioned reads, no replay or compile. When a list waits to be
|
|
12
|
+
* handed over, the session's own transcript tail is read once (keep-list's
|
|
13
|
+
* `findList`): the session that showed the list, resumed, is not handed it
|
|
14
|
+
* again (fix-lab5).
|
|
15
|
+
*/
|
|
16
|
+
import { statSync } from 'node:fs';
|
|
17
|
+
import { directive } from '../skills/directive-words.js';
|
|
18
|
+
import { HOOK_RECORD_WAIT_MS, readInitRecord, updateInitRecord } from './init-record.js';
|
|
19
|
+
import { leadWords, replyNamesList } from './keep-answer.js';
|
|
20
|
+
import { isInitCommand } from './keep-gate.js';
|
|
21
|
+
import { findList, typedLine } from './keep-list.js';
|
|
22
|
+
import { prefText } from './prefs.js';
|
|
23
|
+
import { fill, INIT_COPY, relayBlock, repoNameOf } from './review-screen.js';
|
|
24
|
+
/**
|
|
25
|
+
* A pending item as the relay shows it again: its plain name, or the person's line read now by its pointer (title ''
|
|
26
|
+
* when that line is gone). Shared with `trail keep`, which names the same items.
|
|
27
|
+
*/
|
|
28
|
+
export function pendingAsItem(p, env) {
|
|
29
|
+
let title = p.plainName;
|
|
30
|
+
if (p.kind === 'preference') {
|
|
31
|
+
const ref = p.pref?.refs[0];
|
|
32
|
+
const text = ref ? typedLine(ref, env) : null;
|
|
33
|
+
title = text ? prefText(text).slice(0, 120) : '';
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
...p, title, description: '', evidence: [], rank: 0, nameWords: p.kind === 'preference' ? leadWords(title) : p.nameWords,
|
|
37
|
+
...(p.skill ? { skill: { src: p.skill.src, ...(p.skill.branches ? { branches: p.skill.branches } : {}) } } : {}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** This session's transcript already holds a clean `trail init` call's list naming every pending item. */
|
|
41
|
+
function holdsList(path, all) {
|
|
42
|
+
if (!path)
|
|
43
|
+
return false;
|
|
44
|
+
const found = findList(path, isInitCommand, null);
|
|
45
|
+
const list = found?.list;
|
|
46
|
+
return !!list && list.via === 'init-call' && replyNamesList(list.text, all.map((i) => ({ n: i.n, nameWords: i.nameWords })));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The context to add at this session's start, or null. Writes the record: `handedAt` and `handover` the first time;
|
|
50
|
+
* `pending` dropped when another session already had it. Never throws.
|
|
51
|
+
*/
|
|
52
|
+
export function initHandover(repoKey, session, env = process.env, now = new Date()) {
|
|
53
|
+
try {
|
|
54
|
+
const r = readInitRecord(repoKey, env);
|
|
55
|
+
if (!r.pending.length || !r.shownAt || !r.pendingFrom)
|
|
56
|
+
return null;
|
|
57
|
+
if (r.handedAt) {
|
|
58
|
+
if (r.handover?.session !== session.id) {
|
|
59
|
+
updateInitRecord(repoKey, (x) => {
|
|
60
|
+
x.pending = [];
|
|
61
|
+
x.pendingFrom = null;
|
|
62
|
+
x.shownAt = null;
|
|
63
|
+
x.handedAt = null;
|
|
64
|
+
x.handover = null;
|
|
65
|
+
}, env, HOOK_RECORD_WAIT_MS);
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const items = r.pending.slice(0, 5).map((p) => pendingAsItem(p, env)).filter((x) => x.title !== '');
|
|
70
|
+
if (!items.length)
|
|
71
|
+
return null;
|
|
72
|
+
// fix-lab5: the session that showed this list, resumed (every `claude -p` turn is one), already holds it. Handing
|
|
73
|
+
// it over again would make the person's next typed line read as before the list. Another session still gets it.
|
|
74
|
+
if (holdsList(session.transcriptPath, r.pending.map((p) => pendingAsItem(p, env))))
|
|
75
|
+
return null;
|
|
76
|
+
let offset = 0;
|
|
77
|
+
try {
|
|
78
|
+
offset = session.transcriptPath ? statSync(session.transcriptPath).size : 0;
|
|
79
|
+
}
|
|
80
|
+
catch { /* no transcript yet: from its start */ }
|
|
81
|
+
updateInitRecord(repoKey, (x) => {
|
|
82
|
+
x.handedAt = now.toISOString();
|
|
83
|
+
x.handover = { session: session.id, offset };
|
|
84
|
+
}, env, HOOK_RECORD_WAIT_MS);
|
|
85
|
+
const block = relayBlock(items, repoNameOf(repoKey), true);
|
|
86
|
+
return [directive(null, fill(INIT_COPY.handover, { k: items.length })), ...block.slice(1)].join('\n');
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=handover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handover.js","sourceRoot":"","sources":["../../src/init/handover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAoB,MAAM,kBAAkB,CAAC;AAC3G,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAG7E;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,CAAc,EAAE,GAAsB;IAClE,IAAI,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9C,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC;IACD,OAAO;QACL,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QACxH,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAA+C,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClJ,CAAC;AAChB,CAAC;AAED,0GAA0G;AAC1G,SAAS,SAAS,CAAC,IAAmB,EAAE,GAAe;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC;IACzB,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,WAAW,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/H,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAAsD,EAAE,MAAyB,OAAO,CAAC,GAAG,EACxI,MAAY,IAAI,IAAI,EAAE;IACtB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QACnE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;gBACvC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oBAC9B,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC;oBACf,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;oBACrB,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;oBACjB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;oBAClB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACpB,CAAC,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QACpG,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC/B,kHAAkH;QAClH,gHAAgH;QAChH,IAAI,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAChG,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC,CAAC,uCAAuC,CAAC,CAAC;QACnD,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YAC9B,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YAC/B,CAAC,CAAC,QAAQ,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;QAC/C,CAAC,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAS,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { JobClass } from '../trace/types.js';
|
|
2
|
+
/** Reads ~/.claude/projects/<key>/memory/*.md for each discovered project key. Never writes. */
|
|
3
|
+
export declare function readHowtos(projectKeys: string[], claudeHome: string): Array<{
|
|
4
|
+
file: string;
|
|
5
|
+
text: string;
|
|
6
|
+
}>;
|
|
7
|
+
/**
|
|
8
|
+
* Evidence for a skill candidate: the first how-to with a paragraph that names one of the job's programs and one of
|
|
9
|
+
* its words (`npm publish` with release). The file name, or null.
|
|
10
|
+
*/
|
|
11
|
+
export declare function howtoDescribes(h: Array<{
|
|
12
|
+
file: string;
|
|
13
|
+
text: string;
|
|
14
|
+
}>, job: JobClass, programs: string[]): string | null;
|
|
15
|
+
/** True when a how-to line already says the preference (content-word Jaccard 0.5, 4.4 step 5). */
|
|
16
|
+
export declare function howtoKnows(h: Array<{
|
|
17
|
+
file: string;
|
|
18
|
+
text: string;
|
|
19
|
+
}>, prefText: string): boolean;
|
|
20
|
+
//# sourceMappingURL=howtos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"howtos.d.ts","sourceRoot":"","sources":["../../src/init/howtos.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA8BlD,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB3G;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAWzH;AAED,kGAAkG;AAClG,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO9F"}
|