@nanonets/graft 0.24.0 → 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/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/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.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/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-hook-util.d.ts +25 -0
- package/dist/claude/skills-hook-util.d.ts.map +1 -0
- package/dist/claude/skills-hook-util.js +71 -0
- package/dist/claude/skills-hook-util.js.map +1 -0
- package/dist/claude/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 +24 -0
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +44 -11
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +475 -390
- 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 +18 -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 +15 -7
- package/dist/cloud/nudge.d.ts.map +1 -1
- package/dist/cloud/nudge.js +45 -33
- package/dist/cloud/nudge.js.map +1 -1
- package/dist/cloud/onboarding.d.ts +273 -0
- package/dist/cloud/onboarding.d.ts.map +1 -0
- package/dist/cloud/onboarding.js +612 -0
- package/dist/cloud/onboarding.js.map +1 -0
- 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 +86 -0
- package/dist/cloud/pair.d.ts.map +1 -0
- package/dist/cloud/pair.js +270 -0
- package/dist/cloud/pair.js.map +1 -0
- package/dist/cloud/workspace-sync.d.ts +75 -11
- package/dist/cloud/workspace-sync.d.ts.map +1 -1
- package/dist/cloud/workspace-sync.js +409 -53
- package/dist/cloud/workspace-sync.js.map +1 -1
- package/dist/cloud/workspace.d.ts +95 -10
- package/dist/cloud/workspace.d.ts.map +1 -1
- package/dist/cloud/workspace.js +112 -9
- 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 +39 -4
- 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/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/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 +11 -0
- package/dist/init/plain-file.d.ts.map +1 -0
- package/dist/init/plain-file.js +83 -0
- package/dist/init/plain-file.js.map +1 -0
- 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/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 +5 -184
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +5 -575
- 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/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/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/replace.d.ts +14 -0
- package/dist/notes/replace.d.ts.map +1 -0
- package/dist/notes/replace.js +38 -0
- package/dist/notes/replace.js.map +1 -0
- package/dist/notes/repo-notes-dir.d.ts +2 -0
- package/dist/notes/repo-notes-dir.d.ts.map +1 -0
- package/dist/notes/repo-notes-dir.js +16 -0
- package/dist/notes/repo-notes-dir.js.map +1 -0
- package/dist/notes/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 +38 -0
- package/dist/skills/anchors-cli.d.ts.map +1 -0
- package/dist/skills/anchors-cli.js +279 -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/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/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 +550 -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 +85 -0
- package/dist/skills/compile-words.d.ts.map +1 -0
- package/dist/skills/compile-words.js +445 -0
- package/dist/skills/compile-words.js.map +1 -0
- package/dist/skills/compile.d.ts +42 -0
- package/dist/skills/compile.d.ts.map +1 -0
- package/dist/skills/compile.js +505 -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/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/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/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/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/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/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/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/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/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/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/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 +47 -0
- package/dist/skills/runblock.d.ts.map +1 -0
- package/dist/skills/runblock.js +227 -0
- package/dist/skills/runblock.js.map +1 -0
- 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-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/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 +48 -0
- package/dist/skills/settings.d.ts.map +1 -0
- package/dist/skills/settings.js +155 -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 +28 -8
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +106 -53
- package/dist/skills/skills.js.map +1 -1
- package/dist/skills/staleness.d.ts +27 -0
- package/dist/skills/staleness.d.ts.map +1 -0
- package/dist/skills/staleness.js +178 -0
- package/dist/skills/staleness.js.map +1 -0
- package/dist/skills/state.d.ts +36 -0
- package/dist/skills/state.d.ts.map +1 -0
- package/dist/skills/state.js +259 -0
- package/dist/skills/state.js.map +1 -0
- package/dist/skills/store-fs.d.ts +77 -0
- package/dist/skills/store-fs.d.ts.map +1 -0
- package/dist/skills/store-fs.js +194 -0
- package/dist/skills/store-fs.js.map +1 -0
- package/dist/skills/store-held.d.ts +44 -0
- package/dist/skills/store-held.d.ts.map +1 -0
- package/dist/skills/store-held.js +147 -0
- package/dist/skills/store-held.js.map +1 -0
- package/dist/skills/store.d.ts +73 -0
- package/dist/skills/store.d.ts.map +1 -0
- package/dist/skills/store.js +279 -0
- package/dist/skills/store.js.map +1 -0
- package/dist/skills/types.d.ts +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/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/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/skills/versions-fs.d.ts +45 -0
- package/dist/skills/versions-fs.d.ts.map +1 -0
- package/dist/skills/versions-fs.js +234 -0
- package/dist/skills/versions-fs.js.map +1 -0
- package/dist/skills/versions.d.ts +56 -0
- package/dist/skills/versions.d.ts.map +1 -0
- package/dist/skills/versions.js +351 -0
- package/dist/skills/versions.js.map +1 -0
- package/dist/telemetry/contract.d.ts +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 +63 -0
- package/dist/trace/checks.d.ts.map +1 -0
- package/dist/trace/checks.js +495 -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/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/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,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Housekeeping for the skills files under `~/.trail` (design 1.3, 2): at most
|
|
3
|
+
* once an hour per machine, old run sheets (7 days), session files (30 days),
|
|
4
|
+
* receipts (1 day), held items shown more than 24 hours ago, and probe
|
|
5
|
+
* results older than 10 minutes. Re-exported from `skill-session.ts`.
|
|
6
|
+
*/
|
|
7
|
+
import { readdirSync, rmSync, statSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { readJsonSafe, trailPath, withLock, writePrivate } from '../util/private-fs.js';
|
|
10
|
+
import { pruneRunSheets } from './run-sheets.js';
|
|
11
|
+
const HOUR = 3600_000;
|
|
12
|
+
const DAY = 24 * HOUR;
|
|
13
|
+
/** Files in `dir` (not folders) whose mtime is older than `ms`, removed. */
|
|
14
|
+
function dropOld(dir, ms, now, keep = () => false) {
|
|
15
|
+
let names;
|
|
16
|
+
try {
|
|
17
|
+
names = readdirSync(dir);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
for (const name of names) {
|
|
23
|
+
if (keep(name))
|
|
24
|
+
continue;
|
|
25
|
+
const p = join(dir, name);
|
|
26
|
+
try {
|
|
27
|
+
const st = statSync(p);
|
|
28
|
+
if (st.isFile() && now.getTime() - st.mtimeMs > ms)
|
|
29
|
+
rmSync(p, { force: true });
|
|
30
|
+
}
|
|
31
|
+
catch { /* gone already */ }
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Held items shown more than 24 h ago (held/<name>/held.json `shownAt`). */
|
|
35
|
+
function dropShownHeld(dir, now) {
|
|
36
|
+
let names;
|
|
37
|
+
try {
|
|
38
|
+
names = readdirSync(dir);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
for (const name of names) {
|
|
44
|
+
if (name.startsWith('.'))
|
|
45
|
+
continue;
|
|
46
|
+
const held = readJsonSafe(join(dir, name, 'held.json'));
|
|
47
|
+
const shown = typeof held?.shownAt === 'string' ? Date.parse(held.shownAt) : NaN;
|
|
48
|
+
if (!Number.isNaN(shown) && now.getTime() - shown > DAY) {
|
|
49
|
+
try {
|
|
50
|
+
rmSync(join(dir, name), { recursive: true, force: true });
|
|
51
|
+
}
|
|
52
|
+
catch { /* next time */ }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** state/probes.json entries `{ at }` older than 10 minutes, under `entries` or at the top level. */
|
|
57
|
+
function dropOldProbes(path, now) {
|
|
58
|
+
const raw = readJsonSafe(path);
|
|
59
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
60
|
+
return;
|
|
61
|
+
const box = raw.entries && typeof raw.entries === 'object' && !Array.isArray(raw.entries) ? raw.entries : raw;
|
|
62
|
+
let changed = false;
|
|
63
|
+
for (const [k, v] of Object.entries(box)) {
|
|
64
|
+
const at = v && typeof v === 'object' ? Date.parse(String(v.at)) : NaN;
|
|
65
|
+
if (!Number.isNaN(at) && now.getTime() - at > 10 * 60_000) {
|
|
66
|
+
delete box[k];
|
|
67
|
+
changed = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (changed)
|
|
71
|
+
writePrivate(path, JSON.stringify(raw));
|
|
72
|
+
}
|
|
73
|
+
/** At most once an hour (state/housekeeping.json): pruneRunSheets; sessions/*.json and their .gate.json and
|
|
74
|
+
* .post.jsonl (and crash leftovers beside them) older than 30 days; receipts older than 1 day; held items shown more than 24 h ago;
|
|
75
|
+
* expired state/probes.json entries. */
|
|
76
|
+
export function housekeeping(now = new Date(), env) {
|
|
77
|
+
const mark = trailPath(env, 'state', 'housekeeping.json');
|
|
78
|
+
const last = readJsonSafe(mark);
|
|
79
|
+
const lastAt = typeof last?.at === 'string' ? Date.parse(last.at) : NaN;
|
|
80
|
+
if (!Number.isNaN(lastAt) && now.getTime() - lastAt < HOUR && now.getTime() >= lastAt)
|
|
81
|
+
return;
|
|
82
|
+
// One process does it; another one meanwhile skips it.
|
|
83
|
+
withLock(mark, () => {
|
|
84
|
+
writePrivate(mark, JSON.stringify({ at: now.toISOString() }));
|
|
85
|
+
pruneRunSheets(now, env);
|
|
86
|
+
// Every file: a session's state, gate and marks, and what a crash left beside them (.lock, .steal, .stale, .tmp).
|
|
87
|
+
dropOld(trailPath(env, 'sessions'), 30 * DAY, now);
|
|
88
|
+
dropOld(trailPath(env, 'receipts'), DAY, now, (n) => !n.endsWith('.json'));
|
|
89
|
+
dropShownHeld(trailPath(env, 'held'), now);
|
|
90
|
+
dropOldProbes(trailPath(env, 'state', 'probes.json'), now);
|
|
91
|
+
}, 0);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=housekeeping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"housekeeping.js","sourceRoot":"","sources":["../../src/trace/housekeeping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The job vocabulary (design 4.14): which short typed asks name a job, from a
|
|
3
|
+
* fixed list of verb classes ported from the mining's lexicon. Only canonical
|
|
4
|
+
* words and values of known shapes leave this file, never the typed text.
|
|
5
|
+
*
|
|
6
|
+
* An ask is a job only when it is 25 words or fewer, not a status or history
|
|
7
|
+
* question ("did you push?", "is it live", "..., right?") and not a problem
|
|
8
|
+
* report ("prod is broken", "why ..."). Fenced code, quoted lines and very
|
|
9
|
+
* long lines are pasted context, not the ask, and are dropped first.
|
|
10
|
+
*
|
|
11
|
+
* Tuned on one person's prompts; the real near misses live in the private
|
|
12
|
+
* lab, and every test here is synthetic. Pure: no files, no clock.
|
|
13
|
+
*/
|
|
14
|
+
import type { CheckFamily, JobClass, JobMatch, PromptParams } from './types.js';
|
|
15
|
+
type JobDef = {
|
|
16
|
+
job: JobClass;
|
|
17
|
+
pattern: RegExp;
|
|
18
|
+
exclude?: RegExp;
|
|
19
|
+
vocab: Record<string, string>;
|
|
20
|
+
noun: string;
|
|
21
|
+
checkWords: string[];
|
|
22
|
+
};
|
|
23
|
+
export declare const JOB_CLASSES: ReadonlyArray<JobDef>;
|
|
24
|
+
/** Jobs that can reach moment 2, and the check families that fit each (4.2). */
|
|
25
|
+
export declare const OFFER_FAMILIES: Readonly<Partial<Record<JobClass, CheckFamily[]>>>;
|
|
26
|
+
/** pr-green and sweep: judgement loops, left out by spec 23. Never offered, never compiled. */
|
|
27
|
+
export declare const JUDGEMENT_JOBS: ReadonlySet<JobClass>;
|
|
28
|
+
/** Lead words may stack ("ok so did it..."); a tag that asks for a yes ("..., didn't it?") is a status question too. */
|
|
29
|
+
export declare const STATUS_OR_HISTORY: RegExp;
|
|
30
|
+
export declare const PROBLEM_REPORT: RegExp;
|
|
31
|
+
export declare const MAX_ASK_WORDS = 25;
|
|
32
|
+
/**
|
|
33
|
+
* The person's own ask in a typed message: fenced code blocks (an unclosed one
|
|
34
|
+
* runs to the end), quoted lines (`>`) and lines of 800 characters or more
|
|
35
|
+
* dropped. Every matcher of typed text reads this, not the raw message.
|
|
36
|
+
*/
|
|
37
|
+
export declare function askText(typed: string): string;
|
|
38
|
+
export declare function wordCount(text: string): number;
|
|
39
|
+
export declare function isStatusOrHistory(text: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Job of a typed ask, or null. Applies the 25-word cap, the status/history filter and the problem filter. `hasBranch`:
|
|
42
|
+
* whether the repo has a branch by a name, for "deploy it to <branch>" (D136 (3)); without it only beta, prod and
|
|
43
|
+
* staging name a ship.
|
|
44
|
+
*/
|
|
45
|
+
export declare function matchJob(typedText: string, opts?: {
|
|
46
|
+
anyLength?: boolean;
|
|
47
|
+
hasBranch?: (name: string) => boolean;
|
|
48
|
+
}): JobMatch | null;
|
|
49
|
+
/** Shape values in a typed ask (semver, sha, #PR, port, branch after 'branch', date). */
|
|
50
|
+
export declare function promptParams(typedText: string): PromptParams;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/trace/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAmChF,KAAK,MAAM,GAAG;IAAE,GAAG,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAMtI,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,MAAM,CA2D7C,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAE5E,CAAC;AAEH,+FAA+F;AAC/F,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,QAAQ,CAA4C,CAAC;AAE9F,wHAAwH;AACxH,eAAO,MAAM,iBAAiB,QACsU,CAAC;AACrW,eAAO,MAAM,cAAc,QAAmI,CAAC;AAC/J,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAKD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAAO,GAAG,QAAQ,GAAG,IAAI,CAqBtI;AAID,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAiB5D"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/** Words that may sit between "run" and "tests": never a conjunction or another verb ("run it and write tests"). */
|
|
2
|
+
const GAP = String.raw `(?:(?!(?:and|then|or|but|to|write|add|fix|create|update|make|remove|delete|skip)\b)[\w./:-]+ ){0,3}?`;
|
|
3
|
+
const RUNNER = String.raw `(?:npm|pnpm|yarn|bun)(?: run)? test\b|npx (?:vitest|jest|playwright test)\b|go test\b|cargo test\b|make test\w*|python3? -m pytest\b|pytest\b|bats\b|rspec\b|jest\b|vitest\b`;
|
|
4
|
+
/** D136 (3): up to 2 words naming what to test before a runner ("sql-output bats"), never a verb that sets it up. */
|
|
5
|
+
const NAMED = String.raw `(?:(?!(?:and|then|or|but|to|write|add|fix|create|update|make|remove|delete|skip|install|configure|set|setup|upgrade|migrate|use|switch|what|how|which|why)\b)[\w./:-]+ ){0,2}?`;
|
|
6
|
+
/** The tests job (4.14, D56b). */
|
|
7
|
+
const TESTS = new RegExp([
|
|
8
|
+
String.raw `\b(?:re-?run|re run|run|kick off|execute)\b (?:the |all (?:of )?(?:the )?|our |my |these |those )?${GAP}(?:tests?|test ?suites?|suites?|specs?)\b`,
|
|
9
|
+
String.raw `\b(?:run|re-?run)\b (?:\S+ ){0,2}?(?:${RUNNER})`,
|
|
10
|
+
String.raw `^\s*(?:please |can you |could you |pls )?(?:${RUNNER})`,
|
|
11
|
+
// D136 (3): "sql-output bats please", "api tests", "sql-output tests please": the whole ask names what to test.
|
|
12
|
+
String.raw `^\s*(?:please |can you |could you |pls )?(?:the )?${NAMED}(?:bats|rspec|pytest|jest|vitest)\b(?: (?:please|pls|again|now))?\s*[.!]*$`,
|
|
13
|
+
String.raw `^\s*(?:please |pls )?(?:the )?(?!(?:write|add|fix|new|more|unit|my|our|your|these|those|some|any|no)\b)[\w./:-]+ tests?(?: (?:please|pls|again|now))?\s*[.!]*$`,
|
|
14
|
+
String.raw `\bmake sure (?:that )?(?:the |all (?:the )?)?(?:\w+ )?tests? (?:still )?(?:pass|are passing|are green|go green)\b`,
|
|
15
|
+
String.raw `\bget (?:the |all (?:the )?)?(?:\w+ )?tests? (?:passing|green|to pass)\b`,
|
|
16
|
+
String.raw `\b(?:integration|e2e|end-to-end|smoke|regression|acceptance) tests?\b`,
|
|
17
|
+
String.raw `\btest (?:it|this|that|everything|all(?: of (?:it|this))?) before (?:push|commit|merg|ship|deploy)\w*`,
|
|
18
|
+
].join('|'));
|
|
19
|
+
/**
|
|
20
|
+
* Not the tests job: how-to and wh- questions, a status question with no lead verb ("integration tests
|
|
21
|
+
* green?"), writing or changing tests, a test environment or account, testing it yourself.
|
|
22
|
+
*/
|
|
23
|
+
const TESTS_NOT = new RegExp([
|
|
24
|
+
String.raw `^\s*(?:(?:ok(?:ay)?|so|and|hmm)[\s,]+)*(?:how|what|which|where|when|why|who)\b`,
|
|
25
|
+
String.raw `\b(?:tests?|suites?|specs?)\b[^?]{0,30}\b(?:pass\w*|green|red|fail\w*|ok|done|finish\w*|running|broken)\s*\?\s*$`,
|
|
26
|
+
String.raw `\b(?:write|writing|add|adding|create|fix|fixing|update|remove|delete|skip|mock|refactor|rewrite|cover)\w* (?:\w+ ){0,3}?(?:tests?|specs?)\b`,
|
|
27
|
+
String.raw `\btest (?:env|environment|channel|account|data|mode|user|key|card|server|db|database|webhook|token|number|payment)s?\b`,
|
|
28
|
+
String.raw `\b(?:myself|yourself|ourselves)\b|\bfor (?:me|us|him|her|them) to (?:re-?)?(?:run|test)\b`,
|
|
29
|
+
String.raw `\b(?:install|configure|set ?up|upgrade|migrate|switch)\w* (?:\w+ ){0,3}?(?:to )?(?:bats|rspec|pytest|jest|vitest)\b`,
|
|
30
|
+
].join('|'));
|
|
31
|
+
/** D136 (3): ship or deploy (it) to a named place: the ship job when the repo has a branch by that name. */
|
|
32
|
+
const SHIP_TO = /\b(?:ship|deploy)\w*(?: (?:it|this|that|them))? to (?:the )?([\w./-]+)/;
|
|
33
|
+
/** Surface forms to canonical words, one map per class. */
|
|
34
|
+
const words = (pairs) => Object.fromEntries(Object.entries(pairs).flatMap(([canon, forms]) => [canon, ...forms].map((f) => [f, canon])));
|
|
35
|
+
export const JOB_CLASSES = [
|
|
36
|
+
{
|
|
37
|
+
job: 'release',
|
|
38
|
+
pattern: /\b(publish\w*|re-?publish|release\w* (a |the )?(new |next )?(version|ver|patch|minor|major)|cut (a |that |the )?release|redo the (npm )?publish|npm publish|bump (the )?version)\b/,
|
|
39
|
+
exclude: /publish\w* (on|to) (the )?(web|website)|call it publish|publishable|\brelease (the )?notes\b|\b(i|we)( have|'ve| had)? (already )?released\b/,
|
|
40
|
+
vocab: words({ publish: ['publishing', 'published', 'publishes', 'republish', 're-publish'], release: ['releases', 'releasing'], bump: ['bumping'], npm: [] }),
|
|
41
|
+
noun: 'release',
|
|
42
|
+
checkWords: ['published', 'released', 'out', 'live', 'up'],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
job: 'ship',
|
|
46
|
+
pattern: /\b(push|puch|ff|fast.?forward|promote|deploy|ship|merge|update|move|get)\w* (\w+ ){0,4}(to |for |on |in |into )?(the )?(beta|prod|production|staging)\b|\bff to prod\b|\bupdate prod\b|^\s*(please )?ship it\b/,
|
|
47
|
+
exclude: /not working on (prod|beta)/,
|
|
48
|
+
vocab: words({
|
|
49
|
+
push: ['pushed', 'pushing', 'puch'], ff: ['fast-forward', 'fastforward'], promote: ['promoted'], deploy: ['deploying', 'deployed'], ship: ['shipping'],
|
|
50
|
+
merge: ['merged'], update: ['updated'], beta: [], prod: ['production'], staging: [],
|
|
51
|
+
}),
|
|
52
|
+
noun: 'ship',
|
|
53
|
+
checkWords: ['live', 'deployed', 'updated', 'up', 'out', 'green'],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
job: 'pr-green',
|
|
57
|
+
pattern: /\b(ci\b|ci's|checks? (are |is )?fail\w*|failing (tests|checks)|failed tests|review comments|nitpicks|make (the )?ci (go )?green|ci goes? green|review.?bot)/,
|
|
58
|
+
vocab: words({ ci: ["ci's"], checks: ['check'], review: ['reviews'] }),
|
|
59
|
+
noun: 'CI fix',
|
|
60
|
+
checkWords: [],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
job: 'sweep',
|
|
64
|
+
pattern: /\b(go through|sweep|verify|check)\b.{0,40}\b(all|other|more|newer|backlog|recent)\b.{0,25}\b(prs|pull requests|issues)\b|\bclose (more )?(issues|prs)\b/,
|
|
65
|
+
vocab: words({ sweep: [], prs: ['pull-requests'], issues: [] }),
|
|
66
|
+
noun: 'PR sweep',
|
|
67
|
+
checkWords: [],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
job: 'run-local',
|
|
71
|
+
pattern: /\b(open (it|this|the \w+)? ?(locally|in (the )?browser|on (a )?local)|localhost|local server|run it locally|open locally)\b/,
|
|
72
|
+
vocab: words({ open: [], locally: [], localhost: [] }),
|
|
73
|
+
noun: 'local run',
|
|
74
|
+
checkWords: [],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
job: 'report',
|
|
78
|
+
pattern: /\b(any new (users|people)|new users? (since|till|through|we have|came)|how many (new )?(users|people) (have|came|joined))\b/,
|
|
79
|
+
vocab: words({ new: [], users: ['user', 'people'], signups: ['signup'] }),
|
|
80
|
+
noun: 'report',
|
|
81
|
+
checkWords: [],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
// D56b, rebuilt from real asks: none said "run the integration tests"; they said "run the tests", "rerun
|
|
85
|
+
// the e2e tests", named the runner, or "make sure the tests pass". "Test this thoroughly end to end" is a
|
|
86
|
+
// feature check the agent designs each time, not a test run, so it stays out.
|
|
87
|
+
job: 'tests',
|
|
88
|
+
pattern: TESTS,
|
|
89
|
+
exclude: TESTS_NOT,
|
|
90
|
+
vocab: words({ integration: [], e2e: ['end-to-end'], tests: ['test', 'suite', 'suites', 'specs', 'spec'] }),
|
|
91
|
+
noun: 'test run',
|
|
92
|
+
checkWords: ['passing', 'green', 'pass', 'passed'],
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
/** Jobs that can reach moment 2, and the check families that fit each (4.2). */
|
|
96
|
+
export const OFFER_FAMILIES = Object.freeze({
|
|
97
|
+
release: ['npm-view'], ship: ['deploy', 'ls-remote', 'push'], tests: ['tests'], report: ['query'],
|
|
98
|
+
});
|
|
99
|
+
/** pr-green and sweep: judgement loops, left out by spec 23. Never offered, never compiled. */
|
|
100
|
+
export const JUDGEMENT_JOBS = new Set(['pr-green', 'sweep']);
|
|
101
|
+
/** Lead words may stack ("ok so did it..."); a tag that asks for a yes ("..., didn't it?") is a status question too. */
|
|
102
|
+
export const STATUS_OR_HISTORY = /^\s*(?:(?:okay|ok|so|and|also|hey|btw|wait|hmm|tell(?: me)?)[\s,]+)*(did|is|was|has|have|are|were|does|how did|what did|when did|where did)\b|\b(did (you|we)|is it (live|done|published|deployed|out|up|green)|how did (we|you)|check (now )?if)\b|\b(right|correct)\?\s*$|\b(?:is|are|was|were|did|does|do|has|have)n'?t (?:it|they|we|you|that|he|she)\?\s*$/i;
|
|
103
|
+
export const PROBLEM_REPORT = /\b(not working|(does|did|do)n'?t work|did not work|does not work|went wrong|still (broken|failing|not)|is broken)\b|^\s*why\b/i;
|
|
104
|
+
export const MAX_ASK_WORDS = 25;
|
|
105
|
+
/**
|
|
106
|
+
* The person's own ask in a typed message: fenced code blocks (an unclosed one
|
|
107
|
+
* runs to the end), quoted lines (`>`) and lines of 800 characters or more
|
|
108
|
+
* dropped. Every matcher of typed text reads this, not the raw message.
|
|
109
|
+
*/
|
|
110
|
+
export function askText(typed) {
|
|
111
|
+
const t = String(typed ?? '').replace(/```[\s\S]*?(?:```|$)/g, '\n');
|
|
112
|
+
return t.split(/\r?\n/).filter((l) => !/^\s*>/.test(l) && l.length < 800).join('\n').trim();
|
|
113
|
+
}
|
|
114
|
+
export function wordCount(text) {
|
|
115
|
+
return String(text ?? '').split(/\s+/).filter(Boolean).length;
|
|
116
|
+
}
|
|
117
|
+
export function isStatusOrHistory(text) {
|
|
118
|
+
return STATUS_OR_HISTORY.test(askText(text));
|
|
119
|
+
}
|
|
120
|
+
const URL = /\b[a-z][a-z0-9+.-]*:\/\/\S+/gi;
|
|
121
|
+
const VERSION = /\bv?\d+\.\d+\.\d+(?:-[0-9a-z.]+)?\b/gi;
|
|
122
|
+
/**
|
|
123
|
+
* Job of a typed ask, or null. Applies the 25-word cap, the status/history filter and the problem filter. `hasBranch`:
|
|
124
|
+
* whether the repo has a branch by a name, for "deploy it to <branch>" (D136 (3)); without it only beta, prod and
|
|
125
|
+
* staging name a ship.
|
|
126
|
+
*/
|
|
127
|
+
export function matchJob(typedText, opts = {}) {
|
|
128
|
+
const ask = askText(typedText);
|
|
129
|
+
// The cap is for matching skills; D120 (1)'s continuation of the open run's own job reads any length.
|
|
130
|
+
if (!ask || (!opts.anyLength && wordCount(ask) > MAX_ASK_WORDS))
|
|
131
|
+
return null;
|
|
132
|
+
if (STATUS_OR_HISTORY.test(ask) || PROBLEM_REPORT.test(ask))
|
|
133
|
+
return null;
|
|
134
|
+
const t = ask.toLowerCase().replace(URL, ' url ').replace(VERSION, ' ver ').replace(/\bfast forward/g, 'fast-forward').replace(/\s+/g, ' ').trim();
|
|
135
|
+
for (const c of JOB_CLASSES) {
|
|
136
|
+
if (!c.pattern.test(t) || c.exclude?.test(t))
|
|
137
|
+
continue;
|
|
138
|
+
const found = [];
|
|
139
|
+
for (const w of t.split(/[^a-z0-9'-]+/)) {
|
|
140
|
+
const canon = c.vocab[w] ?? c.vocab[w.replace(/'s$/, '')];
|
|
141
|
+
if (canon && !found.includes(canon))
|
|
142
|
+
found.push(canon);
|
|
143
|
+
}
|
|
144
|
+
return { job: c.job, words: found };
|
|
145
|
+
}
|
|
146
|
+
const to = opts.hasBranch ? SHIP_TO.exec(t) : null;
|
|
147
|
+
if (to && opts.hasBranch(to[1].replace(/[.]+$/, ''))) {
|
|
148
|
+
const ship = JOB_CLASSES.find((c) => c.job === 'ship');
|
|
149
|
+
if (!ship.exclude?.test(t))
|
|
150
|
+
return { job: 'ship', words: [...new Set(t.split(/[^a-z0-9'-]+/).map((w) => ship.vocab[w]).filter((w) => !!w))] };
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const NOT_A_BRANCH = new Set(['to', 'and', 'the', 'is', 'of', 'for', 'from', 'then', 'with', 'in', 'on', 'it', 'so', 'a', 'name', 'called', 'named']);
|
|
155
|
+
/** Shape values in a typed ask (semver, sha, #PR, port, branch after 'branch', date). */
|
|
156
|
+
export function promptParams(typedText) {
|
|
157
|
+
const t = askText(typedText);
|
|
158
|
+
const out = {};
|
|
159
|
+
const version = /\bv?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.]+)?)\b/.exec(t);
|
|
160
|
+
if (version)
|
|
161
|
+
out.version = version[1].replace(/\.$/, '');
|
|
162
|
+
for (const m of t.matchAll(/\b[0-9a-f]{7,40}\b/g)) {
|
|
163
|
+
if (/\d/.test(m[0]) && /[a-f]/.test(m[0])) {
|
|
164
|
+
out.sha = m[0];
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const pr = /(?:^|\s)#(\d+)\b|\bpr\s*#?(\d+)\b|\/pull\/(\d+)/i.exec(t);
|
|
169
|
+
if (pr)
|
|
170
|
+
out.pr = pr[1] ?? pr[2] ?? pr[3];
|
|
171
|
+
const port = /\b(?:localhost|127\.0\.0\.1|0\.0\.0\.0):(\d{2,5})\b|--port[= ](\d{2,5})\b|\bPORT=(\d{2,5})\b|\bport (\d{2,5})\b/i.exec(t);
|
|
172
|
+
if (port)
|
|
173
|
+
out.port = port[1] ?? port[2] ?? port[3] ?? port[4];
|
|
174
|
+
const branch = /\bbranch(?: called| named)? ([\w./-]+)/i.exec(t);
|
|
175
|
+
if (branch && !NOT_A_BRANCH.has(branch[1].toLowerCase()) && branch[1].length >= 2)
|
|
176
|
+
out.branch = branch[1];
|
|
177
|
+
const date = /\b20\d\d-\d\d-\d\d\b/.exec(t);
|
|
178
|
+
if (date)
|
|
179
|
+
out.date = date[0];
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/trace/jobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-repo.d.ts","sourceRoot":"","sources":["../../src/trace/known-repo.ts"],"names":[],"mappings":"AA0CA,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAO9H"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D117 (3), J16: is this a repo Trail knows? It has a `.trail/` folder (trail
|
|
3
|
+
* init made it, or the team committed one), or its key is in
|
|
4
|
+
* `~/.trail/repos/index.json` (a root commit's key, or an alias either side).
|
|
5
|
+
* Outside one, the global hooks keep no pool and make no offers there; walls
|
|
6
|
+
* and guardrails still apply everywhere.
|
|
7
|
+
*
|
|
8
|
+
* Reads only: one stat and one small JSON file, no git, no process.
|
|
9
|
+
*/
|
|
10
|
+
import { realpathSync, statSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { trailHome } from '../notes/trail-home.js';
|
|
13
|
+
import { readJsonSafe, trailPath } from '../util/private-fs.js';
|
|
14
|
+
function isDir(p) {
|
|
15
|
+
try {
|
|
16
|
+
return statSync(p).isDirectory();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** `<checkout>/.trail` is a folder and not the Trail home itself (a home folder that is a work tree). */
|
|
23
|
+
function hasTrailFolder(checkout, env) {
|
|
24
|
+
const dot = join(checkout, '.trail');
|
|
25
|
+
if (!isDir(dot))
|
|
26
|
+
return false;
|
|
27
|
+
try {
|
|
28
|
+
return realpathSync(dot) !== realpathSync(trailHome(env));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function inIndex(key, env) {
|
|
35
|
+
const raw = readJsonSafe(trailPath(env, 'repos', 'index.json'));
|
|
36
|
+
if (!raw || typeof raw !== 'object')
|
|
37
|
+
return false;
|
|
38
|
+
const map = (v) => (v && typeof v === 'object' && !Array.isArray(v) ? v : {});
|
|
39
|
+
const aliases = map(raw.aliases);
|
|
40
|
+
if (Object.prototype.hasOwnProperty.call(aliases, key) || Object.values(aliases).includes(key))
|
|
41
|
+
return true;
|
|
42
|
+
return Object.values(map(raw.roots)).includes(key);
|
|
43
|
+
}
|
|
44
|
+
/** Never throws: a read that fails knows nothing. */
|
|
45
|
+
export function repoKnown(key, checkout, env) {
|
|
46
|
+
try {
|
|
47
|
+
if (checkout && hasTrailFolder(checkout, env))
|
|
48
|
+
return true;
|
|
49
|
+
return typeof key === 'string' && key !== '' && inIndex(key, env);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=known-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-repo.js","sourceRoot":"","sources":["../../src/trace/known-repo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEhE,SAAS,KAAK,CAAC,CAAS;IACtB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,yGAAyG;AACzG,SAAS,cAAc,CAAC,QAAgB,EAAE,GAAsB;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,GAAsB;IAClD,MAAM,GAAG,GAAG,YAAY,CAAyC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IACxG,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,GAAG,GAAG,CAAC,CAAU,EAA2B,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7I,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5G,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,SAAS,CAAC,GAA8B,EAAE,QAAmC,EAAE,GAAsB;IACnH,IAAI,CAAC;QACH,IAAI,QAAQ,IAAI,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3D,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { JobClass, JobMatch } from './types.js';
|
|
2
|
+
export interface PoolDay {
|
|
3
|
+
d: string;
|
|
4
|
+
s: string;
|
|
5
|
+
costly: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface PoolEntry {
|
|
8
|
+
words: string[];
|
|
9
|
+
days: PoolDay[];
|
|
10
|
+
lastGoodRun: string | null;
|
|
11
|
+
lastSeen: string;
|
|
12
|
+
shownAtInit: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface PoolFile {
|
|
15
|
+
v: 1;
|
|
16
|
+
jobs: Partial<Record<JobClass, PoolEntry>>;
|
|
17
|
+
}
|
|
18
|
+
export interface RepeatVerdict {
|
|
19
|
+
ok: boolean;
|
|
20
|
+
sessionDays: number;
|
|
21
|
+
dates: number;
|
|
22
|
+
costlyDays: number;
|
|
23
|
+
need: number;
|
|
24
|
+
}
|
|
25
|
+
/** join(trailHome, 'repos', ...repoKey.split('/'), 'pool.json'): the same folder as repoPlace(..).dir. */
|
|
26
|
+
export declare function poolPath(repoKey: string, env?: NodeJS.ProcessEnv): string;
|
|
27
|
+
export declare function readPool(repoKey: string, env?: NodeJS.ProcessEnv): PoolFile;
|
|
28
|
+
/** Adds or updates the (d, s) day for a job (costly OR-ed), prunes days older than 45 and entries unseen for 45 days. Locked; null when the lock timed out. */
|
|
29
|
+
export declare function notePoolDay(repoKey: string, m: JobMatch, day: PoolDay, goodRun: string | null, env?: NodeJS.ProcessEnv, now?: Date): PoolEntry | null;
|
|
30
|
+
/** 3rd session-day in 45 days (4th when extraDay), at least 2 of them costly. */
|
|
31
|
+
export declare function repeatedEnough(e: PoolEntry, extraDay: boolean, now?: Date): RepeatVerdict;
|
|
32
|
+
/** Every job counted in the last 45 days, every repo, for `trail skills` (2.10). */
|
|
33
|
+
export declare function watching(env?: NodeJS.ProcessEnv, now?: Date): Array<{
|
|
34
|
+
repoKey: string;
|
|
35
|
+
job: JobClass;
|
|
36
|
+
sessionDays: number;
|
|
37
|
+
costlyDays: number;
|
|
38
|
+
need: number;
|
|
39
|
+
}>;
|
|
40
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/trace/pool.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,OAAO;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE;AAClE,MAAM,WAAW,SAAS;IAAG,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE;AACnI,MAAM,WAAW,QAAQ;IAAG,CAAC,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;CAAE;AAC9E,MAAM,WAAW,aAAa;IAAG,EAAE,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAepH,0GAA0G;AAC1G,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAGzE;AA6BD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,QAAQ,CAE3E;AAED,+JAA+J;AAC/J,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,SAAS,GAAG,IAAI,CAyBjK;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAE,IAAiB,GAAG,aAAa,CASrG;AA4BD,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAa1K"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pool (design 2.3): for one repo, the days each job came back, kept in
|
|
3
|
+
* `~/.trail/repos/<key>/pool.json` beside phase 0's repo folder. A day is a
|
|
4
|
+
* session-day: the local date a run started on and the session's hash, with
|
|
5
|
+
* whether that run cost much (5+ tool calls or a failure). Job words from a
|
|
6
|
+
* fixed vocabulary and days only: no prompt text, no commands.
|
|
7
|
+
*
|
|
8
|
+
* Only jobs that can reach moment 2 are counted (release, ship, tests,
|
|
9
|
+
* report). A job is due an offer on its 3rd session-day in the last 45 days
|
|
10
|
+
* counting today (the 4th under the governor), at least 2 of them costly.
|
|
11
|
+
* Days older than that are dropped on every write.
|
|
12
|
+
*/
|
|
13
|
+
import { readdirSync, statSync } from 'node:fs';
|
|
14
|
+
import { join, relative, sep } from 'node:path';
|
|
15
|
+
import { localDate, readSettings } from '../skills/settings.js';
|
|
16
|
+
import { readJsonSafe, trailPath, withLock, writePrivate } from '../util/private-fs.js';
|
|
17
|
+
import { OFFER_FAMILIES } from './jobs.js';
|
|
18
|
+
/** The window: today and the 44 days before it. */
|
|
19
|
+
const WINDOW_DAYS = 45;
|
|
20
|
+
const MAX_WORDS = 12;
|
|
21
|
+
const DATE = /^\d{4}-\d{2}-\d{2}$/;
|
|
22
|
+
/** The first local date inside the 45-day window that ends today. */
|
|
23
|
+
function windowStart(now) {
|
|
24
|
+
const d = new Date(now.getFullYear(), now.getMonth(), now.getDate() - (WINDOW_DAYS - 1), 12);
|
|
25
|
+
return localDate(d);
|
|
26
|
+
}
|
|
27
|
+
const offerJob = (job) => Object.prototype.hasOwnProperty.call(OFFER_FAMILIES, job);
|
|
28
|
+
/** join(trailHome, 'repos', ...repoKey.split('/'), 'pool.json'): the same folder as repoPlace(..).dir. */
|
|
29
|
+
export function poolPath(repoKey, env) {
|
|
30
|
+
const parts = String(repoKey).split('/').filter((p) => p && p !== '.' && p !== '..');
|
|
31
|
+
return trailPath(env, 'repos', ...parts, 'pool.json');
|
|
32
|
+
}
|
|
33
|
+
function cleanEntry(v) {
|
|
34
|
+
if (!v || typeof v !== 'object' || Array.isArray(v))
|
|
35
|
+
return null;
|
|
36
|
+
const e = v;
|
|
37
|
+
const days = Array.isArray(e.days)
|
|
38
|
+
? e.days.filter((d) => !!d && typeof d.d === 'string' && DATE.test(d.d) && typeof d.s === 'string').map((d) => ({ d: d.d, s: d.s, costly: d.costly === true }))
|
|
39
|
+
: [];
|
|
40
|
+
return {
|
|
41
|
+
words: Array.isArray(e.words) ? e.words.filter((w) => typeof w === 'string').slice(0, MAX_WORDS) : [],
|
|
42
|
+
days,
|
|
43
|
+
lastGoodRun: typeof e.lastGoodRun === 'string' ? e.lastGoodRun : null,
|
|
44
|
+
lastSeen: typeof e.lastSeen === 'string' ? e.lastSeen : days.map((d) => d.d).sort().at(-1) ?? '',
|
|
45
|
+
shownAtInit: e.shownAtInit === true,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parsePool(raw) {
|
|
49
|
+
const jobs = {};
|
|
50
|
+
const r = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
|
|
51
|
+
if (r.jobs && typeof r.jobs === 'object' && !Array.isArray(r.jobs)) {
|
|
52
|
+
for (const [job, v] of Object.entries(r.jobs)) {
|
|
53
|
+
const e = cleanEntry(v);
|
|
54
|
+
if (e && offerJob(job))
|
|
55
|
+
jobs[job] = e;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return { v: 1, jobs };
|
|
59
|
+
}
|
|
60
|
+
export function readPool(repoKey, env) {
|
|
61
|
+
return parsePool(readJsonSafe(poolPath(repoKey, env)));
|
|
62
|
+
}
|
|
63
|
+
/** Adds or updates the (d, s) day for a job (costly OR-ed), prunes days older than 45 and entries unseen for 45 days. Locked; null when the lock timed out. */
|
|
64
|
+
export function notePoolDay(repoKey, m, day, goodRun, env, now = new Date()) {
|
|
65
|
+
if (!offerJob(m.job) || !DATE.test(day.d))
|
|
66
|
+
return null;
|
|
67
|
+
const path = poolPath(repoKey, env);
|
|
68
|
+
const from = windowStart(now);
|
|
69
|
+
const done = withLock(path, () => {
|
|
70
|
+
const raw = readJsonSafe(path);
|
|
71
|
+
const keep = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
|
|
72
|
+
const pool = parsePool(raw);
|
|
73
|
+
const e = pool.jobs[m.job] ?? { words: [], days: [], lastGoodRun: null, lastSeen: day.d, shownAtInit: false };
|
|
74
|
+
for (const w of m.words)
|
|
75
|
+
if (e.words.length < MAX_WORDS && !e.words.includes(w))
|
|
76
|
+
e.words.push(w);
|
|
77
|
+
const same = e.days.find((x) => x.d === day.d && x.s === day.s);
|
|
78
|
+
if (same)
|
|
79
|
+
same.costly = same.costly || day.costly;
|
|
80
|
+
else
|
|
81
|
+
e.days.push({ d: day.d, s: day.s, costly: day.costly });
|
|
82
|
+
e.days.sort((a, b) => (a.d < b.d ? -1 : a.d > b.d ? 1 : 0));
|
|
83
|
+
if (goodRun)
|
|
84
|
+
e.lastGoodRun = goodRun;
|
|
85
|
+
if (day.d > e.lastSeen)
|
|
86
|
+
e.lastSeen = day.d;
|
|
87
|
+
pool.jobs[m.job] = e;
|
|
88
|
+
for (const [job, entry] of Object.entries(pool.jobs)) {
|
|
89
|
+
entry.days = entry.days.filter((x) => x.d >= from);
|
|
90
|
+
if (!entry.days.length || entry.lastSeen < from)
|
|
91
|
+
delete pool.jobs[job];
|
|
92
|
+
}
|
|
93
|
+
writePrivate(path, JSON.stringify({ ...keep, v: 1, jobs: pool.jobs }));
|
|
94
|
+
return pool.jobs[m.job] ?? null;
|
|
95
|
+
});
|
|
96
|
+
return done.ok ? done.value : null;
|
|
97
|
+
}
|
|
98
|
+
/** 3rd session-day in 45 days (4th when extraDay), at least 2 of them costly. */
|
|
99
|
+
export function repeatedEnough(e, extraDay, now = new Date()) {
|
|
100
|
+
const from = windowStart(now);
|
|
101
|
+
const today = localDate(now);
|
|
102
|
+
const days = e.days.filter((x) => x.d >= from && x.d <= today);
|
|
103
|
+
const sessionDays = new Set(days.map((x) => `${x.d}|${x.s}`)).size;
|
|
104
|
+
const costlyDays = new Set(days.filter((x) => x.costly).map((x) => `${x.d}|${x.s}`)).size;
|
|
105
|
+
const dates = new Set(days.map((x) => x.d)).size;
|
|
106
|
+
const need = extraDay ? 4 : 3;
|
|
107
|
+
return { ok: sessionDays >= need && costlyDays >= 2, sessionDays, dates, costlyDays, need };
|
|
108
|
+
}
|
|
109
|
+
/** The governor from the settings cache (4.13 step 7): 3 or more answers lately, fewer than 1 in 3 a yes. */
|
|
110
|
+
function governorOn(env) {
|
|
111
|
+
const nine = readSettings(env).lastNine;
|
|
112
|
+
return nine.length >= 3 && nine.filter((a) => a === 'yes').length * 3 < nine.length;
|
|
113
|
+
}
|
|
114
|
+
/** Every pool.json under `dir`, as repo keys (the folders between `repos/` and the file). */
|
|
115
|
+
function poolKeys(root, dir, depth, out) {
|
|
116
|
+
if (depth > 6)
|
|
117
|
+
return;
|
|
118
|
+
let names;
|
|
119
|
+
try {
|
|
120
|
+
names = readdirSync(dir);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
for (const name of names) {
|
|
126
|
+
const p = join(dir, name);
|
|
127
|
+
if (name === 'pool.json')
|
|
128
|
+
out.push(relative(root, dir).split(sep).join('/'));
|
|
129
|
+
else if (!name.startsWith('.')) {
|
|
130
|
+
try {
|
|
131
|
+
if (statSync(p).isDirectory())
|
|
132
|
+
poolKeys(root, p, depth + 1, out);
|
|
133
|
+
}
|
|
134
|
+
catch { /* gone */ }
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Every job counted in the last 45 days, every repo, for `trail skills` (2.10). */
|
|
139
|
+
export function watching(env, now = new Date()) {
|
|
140
|
+
const root = trailPath(env, 'repos');
|
|
141
|
+
const keys = [];
|
|
142
|
+
poolKeys(root, root, 0, keys);
|
|
143
|
+
const extra = keys.length ? governorOn(env) : false;
|
|
144
|
+
const out = [];
|
|
145
|
+
for (const repoKey of keys.filter(Boolean)) {
|
|
146
|
+
for (const [job, e] of Object.entries(readPool(repoKey, env).jobs)) {
|
|
147
|
+
const v = repeatedEnough(e, extra, now);
|
|
148
|
+
if (v.sessionDays > 0)
|
|
149
|
+
out.push({ repoKey, job, sessionDays: v.sessionDays, costlyDays: v.costlyDays, need: v.need });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=pool.js.map
|