@ag-eco/agentplate-cli 0.13.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/LICENSE +21 -0
- package/README.md +462 -0
- package/agents/ap-co-creation.md +90 -0
- package/agents/builder.md +144 -0
- package/agents/coordinator.md +377 -0
- package/agents/lead.md +435 -0
- package/agents/merger.md +164 -0
- package/agents/monitor.md +214 -0
- package/agents/orchestrator.md +239 -0
- package/agents/reviewer.md +140 -0
- package/agents/scout.md +125 -0
- package/agents/supervisor.md +427 -0
- package/package.json +66 -0
- package/src/agents/capabilities.test.ts +85 -0
- package/src/agents/capabilities.ts +125 -0
- package/src/agents/checkpoint.test.ts +88 -0
- package/src/agents/checkpoint.ts +101 -0
- package/src/agents/copilot-hooks-deployer.test.ts +162 -0
- package/src/agents/copilot-hooks-deployer.ts +93 -0
- package/src/agents/guard-rules.test.ts +372 -0
- package/src/agents/guard-rules.ts +97 -0
- package/src/agents/headless-mail-injector.test.ts +709 -0
- package/src/agents/headless-mail-injector.ts +377 -0
- package/src/agents/headless-prompt.test.ts +102 -0
- package/src/agents/headless-prompt.ts +68 -0
- package/src/agents/hooks-deployer.test.ts +3119 -0
- package/src/agents/hooks-deployer.ts +804 -0
- package/src/agents/identity.test.ts +604 -0
- package/src/agents/identity.ts +384 -0
- package/src/agents/lifecycle.test.ts +196 -0
- package/src/agents/lifecycle.ts +183 -0
- package/src/agents/mail-poll-detect.test.ts +153 -0
- package/src/agents/mail-poll-detect.ts +73 -0
- package/src/agents/manifest.test.ts +1026 -0
- package/src/agents/manifest.ts +376 -0
- package/src/agents/overlay.test.ts +1058 -0
- package/src/agents/overlay.ts +490 -0
- package/src/agents/scope-detect.test.ts +190 -0
- package/src/agents/scope-detect.ts +146 -0
- package/src/agents/turn-lock.test.ts +181 -0
- package/src/agents/turn-lock.ts +235 -0
- package/src/agents/turn-runner-dispatch.test.ts +182 -0
- package/src/agents/turn-runner-dispatch.ts +105 -0
- package/src/agents/turn-runner.test.ts +2312 -0
- package/src/agents/turn-runner.ts +1383 -0
- package/src/beads/client.test.ts +217 -0
- package/src/beads/client.ts +230 -0
- package/src/beads/molecules.test.ts +338 -0
- package/src/beads/molecules.ts +198 -0
- package/src/commands/agents.test.ts +328 -0
- package/src/commands/agents.ts +299 -0
- package/src/commands/clean.test.ts +797 -0
- package/src/commands/clean.ts +791 -0
- package/src/commands/completions.test.ts +348 -0
- package/src/commands/completions.ts +981 -0
- package/src/commands/coordinator.test.ts +2975 -0
- package/src/commands/coordinator.ts +1841 -0
- package/src/commands/costs.test.ts +1183 -0
- package/src/commands/costs.ts +599 -0
- package/src/commands/dashboard.test.ts +954 -0
- package/src/commands/dashboard.ts +1212 -0
- package/src/commands/discover.test.ts +288 -0
- package/src/commands/discover.ts +202 -0
- package/src/commands/doctor.test.ts +303 -0
- package/src/commands/doctor.ts +311 -0
- package/src/commands/ecosystem.test.ts +226 -0
- package/src/commands/ecosystem.ts +248 -0
- package/src/commands/errors.test.ts +654 -0
- package/src/commands/errors.ts +197 -0
- package/src/commands/feed.test.ts +709 -0
- package/src/commands/feed.ts +260 -0
- package/src/commands/group.test.ts +475 -0
- package/src/commands/group.ts +546 -0
- package/src/commands/hooks.test.ts +458 -0
- package/src/commands/hooks.ts +263 -0
- package/src/commands/init.test.ts +1011 -0
- package/src/commands/init.ts +967 -0
- package/src/commands/inspect.test.ts +1239 -0
- package/src/commands/inspect.ts +648 -0
- package/src/commands/log.test.ts +1913 -0
- package/src/commands/log.ts +958 -0
- package/src/commands/logs.test.ts +801 -0
- package/src/commands/logs.ts +483 -0
- package/src/commands/mail.test.ts +1501 -0
- package/src/commands/mail.ts +848 -0
- package/src/commands/merge.test.ts +864 -0
- package/src/commands/merge.ts +381 -0
- package/src/commands/metrics.test.ts +458 -0
- package/src/commands/metrics.ts +129 -0
- package/src/commands/monitor.test.ts +191 -0
- package/src/commands/monitor.ts +409 -0
- package/src/commands/nudge.test.ts +579 -0
- package/src/commands/nudge.ts +646 -0
- package/src/commands/orchestrator.ts +42 -0
- package/src/commands/prime.test.ts +612 -0
- package/src/commands/prime.ts +359 -0
- package/src/commands/replay.test.ts +757 -0
- package/src/commands/replay.ts +231 -0
- package/src/commands/run.test.ts +469 -0
- package/src/commands/run.ts +353 -0
- package/src/commands/serve/agent-actions.test.ts +210 -0
- package/src/commands/serve/agent-actions.ts +192 -0
- package/src/commands/serve/build.test.ts +202 -0
- package/src/commands/serve/build.ts +206 -0
- package/src/commands/serve/coordinator-actions.test.ts +339 -0
- package/src/commands/serve/coordinator-actions.ts +410 -0
- package/src/commands/serve/dev.test.ts +168 -0
- package/src/commands/serve/dev.ts +117 -0
- package/src/commands/serve/mail-actions.test.ts +312 -0
- package/src/commands/serve/mail-actions.ts +167 -0
- package/src/commands/serve/rest.test.ts +1680 -0
- package/src/commands/serve/rest.ts +1130 -0
- package/src/commands/serve/static.ts +51 -0
- package/src/commands/serve/ws.test.ts +361 -0
- package/src/commands/serve/ws.ts +332 -0
- package/src/commands/serve.test.ts +459 -0
- package/src/commands/serve.ts +654 -0
- package/src/commands/sling.test.ts +1583 -0
- package/src/commands/sling.ts +1351 -0
- package/src/commands/spec.test.ts +179 -0
- package/src/commands/spec.ts +105 -0
- package/src/commands/status.test.ts +614 -0
- package/src/commands/status.ts +403 -0
- package/src/commands/stop.test.ts +964 -0
- package/src/commands/stop.ts +319 -0
- package/src/commands/supervisor.test.ts +185 -0
- package/src/commands/supervisor.ts +537 -0
- package/src/commands/trace.test.ts +762 -0
- package/src/commands/trace.ts +205 -0
- package/src/commands/update.test.ts +466 -0
- package/src/commands/update.ts +263 -0
- package/src/commands/upgrade.test.ts +48 -0
- package/src/commands/upgrade.ts +240 -0
- package/src/commands/watch.test.ts +257 -0
- package/src/commands/watch.ts +308 -0
- package/src/commands/worktree.test.ts +1297 -0
- package/src/commands/worktree.ts +451 -0
- package/src/config.test.ts +1535 -0
- package/src/config.ts +1064 -0
- package/src/doctor/agents.test.ts +523 -0
- package/src/doctor/agents.ts +399 -0
- package/src/doctor/config-check.test.ts +191 -0
- package/src/doctor/config-check.ts +183 -0
- package/src/doctor/consistency.test.ts +807 -0
- package/src/doctor/consistency.ts +347 -0
- package/src/doctor/databases.test.ts +350 -0
- package/src/doctor/databases.ts +243 -0
- package/src/doctor/dependencies.test.ts +296 -0
- package/src/doctor/dependencies.ts +272 -0
- package/src/doctor/ecosystem.test.ts +308 -0
- package/src/doctor/ecosystem.ts +156 -0
- package/src/doctor/logs.test.ts +253 -0
- package/src/doctor/logs.ts +295 -0
- package/src/doctor/merge-queue.test.ts +315 -0
- package/src/doctor/merge-queue.ts +167 -0
- package/src/doctor/providers.test.ts +409 -0
- package/src/doctor/providers.ts +250 -0
- package/src/doctor/serve.test.ts +95 -0
- package/src/doctor/serve.ts +86 -0
- package/src/doctor/structure.test.ts +423 -0
- package/src/doctor/structure.ts +285 -0
- package/src/doctor/types.ts +43 -0
- package/src/doctor/version.test.ts +241 -0
- package/src/doctor/version.ts +132 -0
- package/src/doctor/watchdog.test.ts +167 -0
- package/src/doctor/watchdog.ts +214 -0
- package/src/e2e/init-sling-lifecycle.test.ts +283 -0
- package/src/errors.test.ts +350 -0
- package/src/errors.ts +217 -0
- package/src/events/store.test.ts +660 -0
- package/src/events/store.ts +369 -0
- package/src/events/tailer.test.ts +719 -0
- package/src/events/tailer.ts +332 -0
- package/src/events/tool-filter.test.ts +330 -0
- package/src/events/tool-filter.ts +126 -0
- package/src/index.ts +533 -0
- package/src/insights/analyzer.test.ts +466 -0
- package/src/insights/analyzer.ts +203 -0
- package/src/insights/quality-gates.test.ts +141 -0
- package/src/insights/quality-gates.ts +156 -0
- package/src/json.test.ts +72 -0
- package/src/json.ts +53 -0
- package/src/loam/client.test.ts +752 -0
- package/src/loam/client.ts +664 -0
- package/src/logging/color.test.ts +252 -0
- package/src/logging/color.ts +105 -0
- package/src/logging/format.test.ts +110 -0
- package/src/logging/format.ts +255 -0
- package/src/logging/logger.test.ts +814 -0
- package/src/logging/logger.ts +266 -0
- package/src/logging/reporter.test.ts +259 -0
- package/src/logging/reporter.ts +110 -0
- package/src/logging/sanitizer.test.ts +190 -0
- package/src/logging/sanitizer.ts +57 -0
- package/src/logging/theme.ts +140 -0
- package/src/mail/broadcast.test.ts +204 -0
- package/src/mail/broadcast.ts +92 -0
- package/src/mail/client.test.ts +774 -0
- package/src/mail/client.ts +236 -0
- package/src/mail/store.test.ts +898 -0
- package/src/mail/store.ts +425 -0
- package/src/merge/lock.test.ts +149 -0
- package/src/merge/lock.ts +140 -0
- package/src/merge/predict.test.ts +387 -0
- package/src/merge/predict.ts +249 -0
- package/src/merge/queue.test.ts +426 -0
- package/src/merge/queue.ts +246 -0
- package/src/merge/resolver.test.ts +1993 -0
- package/src/merge/resolver.ts +926 -0
- package/src/metrics/pricing.test.ts +258 -0
- package/src/metrics/pricing.ts +135 -0
- package/src/metrics/store.test.ts +978 -0
- package/src/metrics/store.ts +501 -0
- package/src/metrics/summary.test.ts +398 -0
- package/src/metrics/summary.ts +178 -0
- package/src/metrics/transcript.test.ts +483 -0
- package/src/metrics/transcript.ts +114 -0
- package/src/runtimes/__fixtures__/claude-stream-fixture.ts +22 -0
- package/src/runtimes/aider.test.ts +124 -0
- package/src/runtimes/aider.ts +147 -0
- package/src/runtimes/amp.test.ts +164 -0
- package/src/runtimes/amp.ts +154 -0
- package/src/runtimes/claude.test.ts +1474 -0
- package/src/runtimes/claude.ts +579 -0
- package/src/runtimes/codex.test.ts +805 -0
- package/src/runtimes/codex.ts +273 -0
- package/src/runtimes/connections.test.ts +214 -0
- package/src/runtimes/connections.ts +103 -0
- package/src/runtimes/copilot.test.ts +707 -0
- package/src/runtimes/copilot.ts +316 -0
- package/src/runtimes/cursor.test.ts +497 -0
- package/src/runtimes/cursor.ts +205 -0
- package/src/runtimes/gemini.test.ts +537 -0
- package/src/runtimes/gemini.ts +243 -0
- package/src/runtimes/goose.test.ts +133 -0
- package/src/runtimes/goose.ts +157 -0
- package/src/runtimes/headless-connection.test.ts +264 -0
- package/src/runtimes/headless-connection.ts +158 -0
- package/src/runtimes/opencode.test.ts +325 -0
- package/src/runtimes/opencode.ts +188 -0
- package/src/runtimes/pi-guards.test.ts +486 -0
- package/src/runtimes/pi-guards.ts +367 -0
- package/src/runtimes/pi.test.ts +789 -0
- package/src/runtimes/pi.ts +305 -0
- package/src/runtimes/registry.test.ts +196 -0
- package/src/runtimes/registry.ts +99 -0
- package/src/runtimes/sapling.test.ts +1267 -0
- package/src/runtimes/sapling.ts +710 -0
- package/src/runtimes/types.ts +266 -0
- package/src/schema-consistency.test.ts +246 -0
- package/src/sessions/compat.test.ts +281 -0
- package/src/sessions/compat.ts +105 -0
- package/src/sessions/store.test.ts +1748 -0
- package/src/sessions/store.ts +858 -0
- package/src/test-helpers.test.ts +124 -0
- package/src/test-helpers.ts +145 -0
- package/src/test-setup.test.ts +31 -0
- package/src/test-setup.ts +28 -0
- package/src/tools/loam/api.ts +368 -0
- package/src/tools/loam/cli.ts +278 -0
- package/src/tools/loam/commands/add.ts +52 -0
- package/src/tools/loam/commands/archive.ts +214 -0
- package/src/tools/loam/commands/audit.ts +276 -0
- package/src/tools/loam/commands/compact.ts +1062 -0
- package/src/tools/loam/commands/completions.ts +79 -0
- package/src/tools/loam/commands/config.ts +381 -0
- package/src/tools/loam/commands/delete-domain.ts +121 -0
- package/src/tools/loam/commands/delete.ts +316 -0
- package/src/tools/loam/commands/diff.ts +200 -0
- package/src/tools/loam/commands/doctor.ts +1113 -0
- package/src/tools/loam/commands/edit.ts +226 -0
- package/src/tools/loam/commands/init.ts +31 -0
- package/src/tools/loam/commands/learn.ts +179 -0
- package/src/tools/loam/commands/move.ts +323 -0
- package/src/tools/loam/commands/onboard.ts +374 -0
- package/src/tools/loam/commands/outcome.ts +185 -0
- package/src/tools/loam/commands/prime.ts +688 -0
- package/src/tools/loam/commands/prune.ts +614 -0
- package/src/tools/loam/commands/query.ts +218 -0
- package/src/tools/loam/commands/rank.ts +180 -0
- package/src/tools/loam/commands/ready.ts +189 -0
- package/src/tools/loam/commands/record.ts +1210 -0
- package/src/tools/loam/commands/restore.ts +166 -0
- package/src/tools/loam/commands/search.ts +327 -0
- package/src/tools/loam/commands/setup.ts +887 -0
- package/src/tools/loam/commands/status.ts +103 -0
- package/src/tools/loam/commands/sync.ts +298 -0
- package/src/tools/loam/commands/update.ts +19 -0
- package/src/tools/loam/commands/upgrade.ts +93 -0
- package/src/tools/loam/commands/validate.ts +190 -0
- package/src/tools/loam/index.ts +62 -0
- package/src/tools/loam/log.ts +127 -0
- package/src/tools/loam/registry/builtins.ts +409 -0
- package/src/tools/loam/registry/custom.ts +431 -0
- package/src/tools/loam/registry/init.ts +55 -0
- package/src/tools/loam/registry/template.ts +40 -0
- package/src/tools/loam/registry/type-registry.ts +113 -0
- package/src/tools/loam/schemas/config-schema.ts +489 -0
- package/src/tools/loam/schemas/config.ts +245 -0
- package/src/tools/loam/schemas/index.ts +18 -0
- package/src/tools/loam/schemas/record-schema.ts +191 -0
- package/src/tools/loam/schemas/record.ts +115 -0
- package/src/tools/loam/utils/active-work.ts +205 -0
- package/src/tools/loam/utils/anchor-validity.ts +80 -0
- package/src/tools/loam/utils/archive.ts +146 -0
- package/src/tools/loam/utils/audit.ts +667 -0
- package/src/tools/loam/utils/bm25.ts +238 -0
- package/src/tools/loam/utils/budget.ts +142 -0
- package/src/tools/loam/utils/config.ts +344 -0
- package/src/tools/loam/utils/dir-anchors.ts +62 -0
- package/src/tools/loam/utils/domain-rules.ts +114 -0
- package/src/tools/loam/utils/expertise.ts +393 -0
- package/src/tools/loam/utils/format-helpers.ts +96 -0
- package/src/tools/loam/utils/format.ts +1234 -0
- package/src/tools/loam/utils/git-context.ts +50 -0
- package/src/tools/loam/utils/git.ts +183 -0
- package/src/tools/loam/utils/hooks.ts +299 -0
- package/src/tools/loam/utils/index.ts +52 -0
- package/src/tools/loam/utils/json-output.ts +13 -0
- package/src/tools/loam/utils/lock.ts +76 -0
- package/src/tools/loam/utils/markers.ts +48 -0
- package/src/tools/loam/utils/numeric-flags.ts +20 -0
- package/src/tools/loam/utils/palette.ts +44 -0
- package/src/tools/loam/utils/prime-ranking.ts +135 -0
- package/src/tools/loam/utils/recipe-discovery.ts +195 -0
- package/src/tools/loam/utils/runtime-flags.ts +28 -0
- package/src/tools/loam/utils/scoring.ts +94 -0
- package/src/tools/loam/utils/version.ts +116 -0
- package/src/tools/sprout/commands/block.ts +64 -0
- package/src/tools/sprout/commands/blocked.ts +86 -0
- package/src/tools/sprout/commands/close.ts +129 -0
- package/src/tools/sprout/commands/completions.ts +198 -0
- package/src/tools/sprout/commands/config.ts +238 -0
- package/src/tools/sprout/commands/create.ts +164 -0
- package/src/tools/sprout/commands/dep.ts +148 -0
- package/src/tools/sprout/commands/doctor.ts +979 -0
- package/src/tools/sprout/commands/init.ts +83 -0
- package/src/tools/sprout/commands/label.ts +178 -0
- package/src/tools/sprout/commands/list.ts +210 -0
- package/src/tools/sprout/commands/migrate.ts +133 -0
- package/src/tools/sprout/commands/onboard.ts +207 -0
- package/src/tools/sprout/commands/plan-show.ts +278 -0
- package/src/tools/sprout/commands/plan.ts +2526 -0
- package/src/tools/sprout/commands/prime.ts +399 -0
- package/src/tools/sprout/commands/ready.ts +245 -0
- package/src/tools/sprout/commands/search.ts +221 -0
- package/src/tools/sprout/commands/show.ts +277 -0
- package/src/tools/sprout/commands/stats.ts +146 -0
- package/src/tools/sprout/commands/sync.ts +134 -0
- package/src/tools/sprout/commands/tpl.ts +364 -0
- package/src/tools/sprout/commands/unblock.ts +115 -0
- package/src/tools/sprout/commands/update.ts +257 -0
- package/src/tools/sprout/commands/upgrade.ts +91 -0
- package/src/tools/sprout/config-schema.ts +152 -0
- package/src/tools/sprout/config.ts +355 -0
- package/src/tools/sprout/filter.ts +107 -0
- package/src/tools/sprout/format.ts +43 -0
- package/src/tools/sprout/id.ts +22 -0
- package/src/tools/sprout/index.ts +204 -0
- package/src/tools/sprout/log.ts +76 -0
- package/src/tools/sprout/markers.ts +22 -0
- package/src/tools/sprout/output.ts +121 -0
- package/src/tools/sprout/plan-backref.ts +93 -0
- package/src/tools/sprout/plan-context.ts +81 -0
- package/src/tools/sprout/plan-domain.ts +139 -0
- package/src/tools/sprout/plan-lifecycle.ts +65 -0
- package/src/tools/sprout/plan-loam.ts +207 -0
- package/src/tools/sprout/plan-schema.ts +209 -0
- package/src/tools/sprout/sort.ts +31 -0
- package/src/tools/sprout/store.ts +172 -0
- package/src/tools/sprout/types.ts +118 -0
- package/src/tools/sprout/validation.ts +119 -0
- package/src/tools/sprout/version.ts +1 -0
- package/src/tools/sprout/yaml.ts +387 -0
- package/src/tools/trellis/commands/archive.ts +87 -0
- package/src/tools/trellis/commands/completions.ts +610 -0
- package/src/tools/trellis/commands/config.ts +382 -0
- package/src/tools/trellis/commands/create.ts +252 -0
- package/src/tools/trellis/commands/diff.ts +150 -0
- package/src/tools/trellis/commands/doctor.ts +771 -0
- package/src/tools/trellis/commands/emit.ts +365 -0
- package/src/tools/trellis/commands/history.ts +83 -0
- package/src/tools/trellis/commands/import.ts +198 -0
- package/src/tools/trellis/commands/init.ts +81 -0
- package/src/tools/trellis/commands/list.ts +103 -0
- package/src/tools/trellis/commands/onboard.ts +156 -0
- package/src/tools/trellis/commands/pin.ts +172 -0
- package/src/tools/trellis/commands/prime.ts +193 -0
- package/src/tools/trellis/commands/render.ts +122 -0
- package/src/tools/trellis/commands/schema.ts +353 -0
- package/src/tools/trellis/commands/show.ts +115 -0
- package/src/tools/trellis/commands/stats.ts +65 -0
- package/src/tools/trellis/commands/sync.ts +112 -0
- package/src/tools/trellis/commands/tree.ts +123 -0
- package/src/tools/trellis/commands/update.ts +330 -0
- package/src/tools/trellis/commands/upgrade.ts +95 -0
- package/src/tools/trellis/commands/validate.ts +166 -0
- package/src/tools/trellis/config-schema.ts +81 -0
- package/src/tools/trellis/config.ts +108 -0
- package/src/tools/trellis/frontmatter.ts +348 -0
- package/src/tools/trellis/id.ts +24 -0
- package/src/tools/trellis/index.ts +209 -0
- package/src/tools/trellis/markers.ts +28 -0
- package/src/tools/trellis/output.ts +84 -0
- package/src/tools/trellis/render.ts +212 -0
- package/src/tools/trellis/store.ts +144 -0
- package/src/tools/trellis/types.ts +82 -0
- package/src/tools/trellis/validate.ts +199 -0
- package/src/tools/trellis/yaml.ts +309 -0
- package/src/tracker/beads.test.ts +454 -0
- package/src/tracker/beads.ts +56 -0
- package/src/tracker/factory.test.ts +90 -0
- package/src/tracker/factory.ts +65 -0
- package/src/tracker/sprout.test.ts +461 -0
- package/src/tracker/sprout.ts +182 -0
- package/src/tracker/types.ts +52 -0
- package/src/trellis/client.test.ts +107 -0
- package/src/trellis/client.ts +179 -0
- package/src/types.ts +970 -0
- package/src/utils/bin.test.ts +10 -0
- package/src/utils/bin.ts +37 -0
- package/src/utils/browser.test.ts +49 -0
- package/src/utils/browser.ts +48 -0
- package/src/utils/fs.test.ts +119 -0
- package/src/utils/fs.ts +62 -0
- package/src/utils/pid.test.ts +152 -0
- package/src/utils/pid.ts +130 -0
- package/src/utils/process-scan.test.ts +53 -0
- package/src/utils/process-scan.ts +76 -0
- package/src/utils/time.test.ts +43 -0
- package/src/utils/time.ts +37 -0
- package/src/utils/version.test.ts +33 -0
- package/src/utils/version.ts +70 -0
- package/src/version.ts +5 -0
- package/src/watchdog/daemon.test.ts +3721 -0
- package/src/watchdog/daemon.ts +1257 -0
- package/src/watchdog/health.test.ts +830 -0
- package/src/watchdog/health.ts +434 -0
- package/src/watchdog/triage.test.ts +205 -0
- package/src/watchdog/triage.ts +205 -0
- package/src/worktree/manager.test.ts +720 -0
- package/src/worktree/manager.ts +405 -0
- package/src/worktree/process.test.ts +172 -0
- package/src/worktree/process.ts +131 -0
- package/src/worktree/tmux.test.ts +1616 -0
- package/src/worktree/tmux.ts +721 -0
- package/templates/CLAUDE.md.tmpl +100 -0
- package/templates/copilot-hooks.json.tmpl +13 -0
- package/templates/hooks.json.tmpl +109 -0
- package/templates/overlay.md.tmpl +88 -0
- package/ui/dist/apple-touch-icon-bdy6teep.png +0 -0
- package/ui/dist/chunk-8s31f05k.css +1 -0
- package/ui/dist/chunk-vm5rz679.js +300 -0
- package/ui/dist/favicon-nzb39vza.svg +4 -0
- package/ui/dist/index.html +17 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { closeSync, openSync, renameSync, statSync, unlinkSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import type { Issue, Plan, Template } from "./types.ts";
|
|
5
|
+
import {
|
|
6
|
+
ISSUES_FILE,
|
|
7
|
+
LOCK_RETRY_MS,
|
|
8
|
+
LOCK_STALE_MS,
|
|
9
|
+
LOCK_TIMEOUT_MS,
|
|
10
|
+
PLANS_FILE,
|
|
11
|
+
TEMPLATES_FILE,
|
|
12
|
+
} from "./types.ts";
|
|
13
|
+
|
|
14
|
+
function lockFilePath(dataFilePath: string): string {
|
|
15
|
+
return `${dataFilePath}.lock`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async function acquireLock(dataFilePath: string): Promise<void> {
|
|
19
|
+
const lock = lockFilePath(dataFilePath);
|
|
20
|
+
const start = Date.now();
|
|
21
|
+
while (true) {
|
|
22
|
+
try {
|
|
23
|
+
const fd = openSync(lock, "wx");
|
|
24
|
+
closeSync(fd);
|
|
25
|
+
return;
|
|
26
|
+
} catch (err: unknown) {
|
|
27
|
+
const nodeErr = err as NodeJS.ErrnoException;
|
|
28
|
+
if (nodeErr.code !== "EEXIST") throw err;
|
|
29
|
+
// Check if stale
|
|
30
|
+
try {
|
|
31
|
+
const st = statSync(lock);
|
|
32
|
+
if (Date.now() - st.mtimeMs > LOCK_STALE_MS) {
|
|
33
|
+
unlinkSync(lock);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
} catch {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (Date.now() - start > LOCK_TIMEOUT_MS) {
|
|
40
|
+
throw new Error(`Timeout acquiring lock for ${dataFilePath}`);
|
|
41
|
+
}
|
|
42
|
+
await sleep(LOCK_RETRY_MS + Math.floor(Math.random() * LOCK_RETRY_MS));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function releaseLock(dataFilePath: string): void {
|
|
48
|
+
try {
|
|
49
|
+
unlinkSync(lockFilePath(dataFilePath));
|
|
50
|
+
} catch {
|
|
51
|
+
// best-effort
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function sleep(ms: number): Promise<void> {
|
|
56
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function withLock<T>(dataFilePath: string, fn: () => Promise<T>): Promise<T> {
|
|
60
|
+
await acquireLock(dataFilePath);
|
|
61
|
+
try {
|
|
62
|
+
return await fn();
|
|
63
|
+
} finally {
|
|
64
|
+
releaseLock(dataFilePath);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function parseJsonl<T>(content: string): T[] {
|
|
69
|
+
const results: T[] = [];
|
|
70
|
+
for (const line of content.split("\n")) {
|
|
71
|
+
const trimmed = line.trim();
|
|
72
|
+
if (!trimmed) continue;
|
|
73
|
+
try {
|
|
74
|
+
results.push(JSON.parse(trimmed) as T);
|
|
75
|
+
} catch {
|
|
76
|
+
// skip malformed lines
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return results;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function deduplicateById<T extends { id: string }>(items: T[]): T[] {
|
|
83
|
+
const map = new Map<string, T>();
|
|
84
|
+
for (const item of items) {
|
|
85
|
+
map.set(item.id, item); // last occurrence wins
|
|
86
|
+
}
|
|
87
|
+
return Array.from(map.values());
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export async function readIssues(sproutDir: string): Promise<Issue[]> {
|
|
91
|
+
const file = Bun.file(join(sproutDir, ISSUES_FILE));
|
|
92
|
+
if (!(await file.exists())) return [];
|
|
93
|
+
const content = await file.text();
|
|
94
|
+
return deduplicateById(parseJsonl<Issue>(content));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export async function writeIssues(sproutDir: string, issues: Issue[]): Promise<void> {
|
|
98
|
+
const filePath = join(sproutDir, ISSUES_FILE);
|
|
99
|
+
const tmpPath = `${filePath}.tmp.${randomBytes(4).toString("hex")}`;
|
|
100
|
+
const content = `${issues.map((i) => JSON.stringify(i)).join("\n")}\n`;
|
|
101
|
+
await Bun.write(tmpPath, content);
|
|
102
|
+
renameSync(tmpPath, filePath);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export async function appendIssue(sproutDir: string, issue: Issue): Promise<void> {
|
|
106
|
+
const filePath = join(sproutDir, ISSUES_FILE);
|
|
107
|
+
const tmpPath = `${filePath}.tmp.${randomBytes(4).toString("hex")}`;
|
|
108
|
+
const file = Bun.file(filePath);
|
|
109
|
+
const existing = (await file.exists()) ? await file.text() : "";
|
|
110
|
+
await Bun.write(tmpPath, `${existing + JSON.stringify(issue)}\n`);
|
|
111
|
+
renameSync(tmpPath, filePath);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export async function readTemplates(sproutDir: string): Promise<Template[]> {
|
|
115
|
+
const file = Bun.file(join(sproutDir, TEMPLATES_FILE));
|
|
116
|
+
if (!(await file.exists())) return [];
|
|
117
|
+
const content = await file.text();
|
|
118
|
+
return deduplicateById(parseJsonl<Template>(content));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export async function writeTemplates(sproutDir: string, templates: Template[]): Promise<void> {
|
|
122
|
+
const filePath = join(sproutDir, TEMPLATES_FILE);
|
|
123
|
+
const tmpPath = `${filePath}.tmp.${randomBytes(4).toString("hex")}`;
|
|
124
|
+
const content = `${templates.map((t) => JSON.stringify(t)).join("\n")}\n`;
|
|
125
|
+
await Bun.write(tmpPath, content);
|
|
126
|
+
renameSync(tmpPath, filePath);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export async function appendTemplate(sproutDir: string, template: Template): Promise<void> {
|
|
130
|
+
const filePath = join(sproutDir, TEMPLATES_FILE);
|
|
131
|
+
const tmpPath = `${filePath}.tmp.${randomBytes(4).toString("hex")}`;
|
|
132
|
+
const file = Bun.file(filePath);
|
|
133
|
+
const existing = (await file.exists()) ? await file.text() : "";
|
|
134
|
+
await Bun.write(tmpPath, `${existing + JSON.stringify(template)}\n`);
|
|
135
|
+
renameSync(tmpPath, filePath);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function issuesPath(sproutDir: string): string {
|
|
139
|
+
return join(sproutDir, ISSUES_FILE);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function templatesPath(sproutDir: string): string {
|
|
143
|
+
return join(sproutDir, TEMPLATES_FILE);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function plansPath(sproutDir: string): string {
|
|
147
|
+
return join(sproutDir, PLANS_FILE);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export async function readPlans(sproutDir: string): Promise<Plan[]> {
|
|
151
|
+
const file = Bun.file(join(sproutDir, PLANS_FILE));
|
|
152
|
+
if (!(await file.exists())) return [];
|
|
153
|
+
const content = await file.text();
|
|
154
|
+
return deduplicateById(parseJsonl<Plan>(content));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export async function writePlans(sproutDir: string, plans: Plan[]): Promise<void> {
|
|
158
|
+
const filePath = join(sproutDir, PLANS_FILE);
|
|
159
|
+
const tmpPath = `${filePath}.tmp.${randomBytes(4).toString("hex")}`;
|
|
160
|
+
const content = `${plans.map((p) => JSON.stringify(p)).join("\n")}\n`;
|
|
161
|
+
await Bun.write(tmpPath, content);
|
|
162
|
+
renameSync(tmpPath, filePath);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export async function appendPlan(sproutDir: string, plan: Plan): Promise<void> {
|
|
166
|
+
const filePath = join(sproutDir, PLANS_FILE);
|
|
167
|
+
const tmpPath = `${filePath}.tmp.${randomBytes(4).toString("hex")}`;
|
|
168
|
+
const file = Bun.file(filePath);
|
|
169
|
+
const existing = (await file.exists()) ? await file.text() : "";
|
|
170
|
+
await Bun.write(tmpPath, `${existing + JSON.stringify(plan)}\n`);
|
|
171
|
+
renameSync(tmpPath, filePath);
|
|
172
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
export interface Issue {
|
|
2
|
+
id: string;
|
|
3
|
+
title: string;
|
|
4
|
+
status: "open" | "in_progress" | "closed";
|
|
5
|
+
type: "task" | "bug" | "feature" | "epic";
|
|
6
|
+
priority: number;
|
|
7
|
+
assignee?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
closeReason?: string;
|
|
10
|
+
blocks?: string[];
|
|
11
|
+
blockedBy?: string[];
|
|
12
|
+
labels?: string[];
|
|
13
|
+
convoy?: string;
|
|
14
|
+
plan_id?: string;
|
|
15
|
+
plan_step_index?: number;
|
|
16
|
+
requires_plan?: boolean;
|
|
17
|
+
extensions?: Record<string, unknown>;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
updatedAt: string;
|
|
20
|
+
closedAt?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type PlanStatus = "draft" | "approved" | "active" | "done";
|
|
24
|
+
export type PlanOutcome = "success" | "partial" | "failure";
|
|
25
|
+
|
|
26
|
+
export interface Plan {
|
|
27
|
+
id: string;
|
|
28
|
+
seed: string;
|
|
29
|
+
template: string;
|
|
30
|
+
name?: string;
|
|
31
|
+
status: PlanStatus;
|
|
32
|
+
revision: number;
|
|
33
|
+
sections: Record<string, unknown>;
|
|
34
|
+
children: string[];
|
|
35
|
+
// Subset of `children` that were attached via adoption (existing_seed at
|
|
36
|
+
// submit time, or `sr plan adopt` post-submit) rather than fresh-spawned by
|
|
37
|
+
// the plan. Drives the "(adopted)" tag in `sr plan show` human output and
|
|
38
|
+
// is preserved across overwrites for children that survive the rewrite.
|
|
39
|
+
adoptedChildren?: string[];
|
|
40
|
+
outcome?: PlanOutcome;
|
|
41
|
+
outcomeNote?: string;
|
|
42
|
+
reviewedBy?: string;
|
|
43
|
+
createdAt: string;
|
|
44
|
+
updatedAt: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface TemplateStep {
|
|
48
|
+
title: string;
|
|
49
|
+
type?: string;
|
|
50
|
+
priority?: number;
|
|
51
|
+
plan_template?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface Template {
|
|
55
|
+
id: string;
|
|
56
|
+
name: string;
|
|
57
|
+
steps: TemplateStep[];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface Config {
|
|
61
|
+
project: string;
|
|
62
|
+
version: string;
|
|
63
|
+
max_plan_depth?: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// PLAN_SPEC.md:430 — display-only depth limit for `sr plan show` recursion.
|
|
67
|
+
export const DEFAULT_MAX_PLAN_DEPTH = 3;
|
|
68
|
+
|
|
69
|
+
// Plan template config — what `plan_templates:` in config.yaml resolves to.
|
|
70
|
+
// Compiled into AJV schema by src/plan-schema.ts (Phase 2 task sprout-6bd8).
|
|
71
|
+
export type SectionKindLiteral = "text" | "list" | "steps";
|
|
72
|
+
|
|
73
|
+
export interface SectionSpec {
|
|
74
|
+
required: boolean;
|
|
75
|
+
kind: SectionKindLiteral | Record<string, SectionSpec>;
|
|
76
|
+
prompt: string;
|
|
77
|
+
min_length?: number;
|
|
78
|
+
min?: number;
|
|
79
|
+
item?: "text" | Record<string, SectionSpec>;
|
|
80
|
+
loam_source?: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface PlanTemplate {
|
|
84
|
+
name: string;
|
|
85
|
+
description?: string;
|
|
86
|
+
sections: Record<string, SectionSpec>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const SECTION_KINDS: readonly SectionKindLiteral[] = ["text", "list", "steps"] as const;
|
|
90
|
+
|
|
91
|
+
export interface ConvoyStatus {
|
|
92
|
+
templateId: string;
|
|
93
|
+
total: number;
|
|
94
|
+
completed: number;
|
|
95
|
+
inProgress: number;
|
|
96
|
+
blocked: number;
|
|
97
|
+
issues: string[];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export const SPROUT_DIR_NAME = ".sprout";
|
|
101
|
+
export const ISSUES_FILE = "issues.jsonl";
|
|
102
|
+
export const TEMPLATES_FILE = "templates.jsonl";
|
|
103
|
+
export const PLANS_FILE = "plans.jsonl";
|
|
104
|
+
export const CONFIG_FILE = "config.yaml";
|
|
105
|
+
export const LOCK_STALE_MS = 30_000;
|
|
106
|
+
export const LOCK_RETRY_MS = 100;
|
|
107
|
+
export const LOCK_TIMEOUT_MS = 30_000;
|
|
108
|
+
|
|
109
|
+
export const VALID_TYPES = ["task", "bug", "feature", "epic"] as const;
|
|
110
|
+
export const VALID_STATUSES = ["open", "in_progress", "closed"] as const;
|
|
111
|
+
|
|
112
|
+
export const PRIORITY_LABELS: Record<number, string> = {
|
|
113
|
+
0: "Critical",
|
|
114
|
+
1: "High",
|
|
115
|
+
2: "Medium",
|
|
116
|
+
3: "Low",
|
|
117
|
+
4: "Backlog",
|
|
118
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// AJV-based plan validation primitives.
|
|
2
|
+
//
|
|
3
|
+
// This is the ONLY module that imports `ajv`, keeping the runtime-dep boundary
|
|
4
|
+
// tight (CLAUDE.md "Dependencies"). All later `sr plan` commands (submit,
|
|
5
|
+
// validate) consume `compileSchema` and `formatErrors` from here.
|
|
6
|
+
//
|
|
7
|
+
// API choice: `compileSchema` returns a `ValidatorFn` that runs the formatter
|
|
8
|
+
// under the hood. `formatErrors` is also exported so callers that already hold
|
|
9
|
+
// raw AJV errors can render them without recompiling a schema.
|
|
10
|
+
//
|
|
11
|
+
// Code-name convention (PLAN_SPEC.md:180–195): AJV `keyword` maps 1:1 onto the
|
|
12
|
+
// spec `code`, EXCEPT `minItems` normalizes to `min` to match the spec's
|
|
13
|
+
// `sections.steps` example. `minLength` stays as-is.
|
|
14
|
+
|
|
15
|
+
import Ajv, { type ErrorObject } from "ajv";
|
|
16
|
+
|
|
17
|
+
export interface ErrorEntry {
|
|
18
|
+
path: string;
|
|
19
|
+
code: string;
|
|
20
|
+
fix: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface PartialStateDiff {
|
|
24
|
+
errors: ErrorEntry[];
|
|
25
|
+
current: unknown;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type ValidatorFn = (
|
|
29
|
+
data: unknown,
|
|
30
|
+
) => { valid: true } | { valid: false; diff: PartialStateDiff };
|
|
31
|
+
|
|
32
|
+
export function compileSchema(schema: object): ValidatorFn {
|
|
33
|
+
const ajv = new Ajv({ allErrors: true, strict: true });
|
|
34
|
+
const validate = ajv.compile(schema);
|
|
35
|
+
return (data) => {
|
|
36
|
+
if (validate(data)) return { valid: true };
|
|
37
|
+
return { valid: false, diff: formatErrors(validate.errors ?? [], data) };
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function formatErrors(errs: ErrorObject[], submitted: unknown): PartialStateDiff {
|
|
42
|
+
return {
|
|
43
|
+
errors: errs.map((err) => toEntry(err, submitted)),
|
|
44
|
+
current: submitted,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function toEntry(err: ErrorObject, submitted: unknown): ErrorEntry {
|
|
49
|
+
const path = pathFor(err);
|
|
50
|
+
return {
|
|
51
|
+
path,
|
|
52
|
+
code: codeFor(err),
|
|
53
|
+
fix: fixFor(err, path, submitted),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function pathFor(err: ErrorObject): string {
|
|
58
|
+
const base = err.instancePath.replace(/^\//, "").replace(/\//g, ".");
|
|
59
|
+
if (err.keyword === "required") {
|
|
60
|
+
const prop = (err.params as { missingProperty?: string }).missingProperty;
|
|
61
|
+
if (prop) return base ? `${base}.${prop}` : prop;
|
|
62
|
+
}
|
|
63
|
+
return base;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function codeFor(err: ErrorObject): string {
|
|
67
|
+
if (err.keyword === "minItems") return "min";
|
|
68
|
+
return err.keyword;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function fixFor(err: ErrorObject, path: string, submitted: unknown): string {
|
|
72
|
+
const params = err.params as Record<string, unknown>;
|
|
73
|
+
switch (err.keyword) {
|
|
74
|
+
case "required": {
|
|
75
|
+
const prop = params.missingProperty as string | undefined;
|
|
76
|
+
return prop ? `add a '${prop}' field` : "add the missing required field";
|
|
77
|
+
}
|
|
78
|
+
case "minItems": {
|
|
79
|
+
const limit = Number(params.limit ?? 0);
|
|
80
|
+
const arr = valueAt(submitted, err.instancePath);
|
|
81
|
+
const got = Array.isArray(arr) ? arr.length : 0;
|
|
82
|
+
const need = Math.max(limit - got, 1);
|
|
83
|
+
const noun = need === 1 ? "entry" : "entries";
|
|
84
|
+
return `add at least ${need} more ${noun}`;
|
|
85
|
+
}
|
|
86
|
+
case "minLength": {
|
|
87
|
+
const limit = Number(params.limit ?? 0);
|
|
88
|
+
const where = path || "value";
|
|
89
|
+
return `expand '${where}' to at least ${limit} characters`;
|
|
90
|
+
}
|
|
91
|
+
case "type": {
|
|
92
|
+
const expected = params.type as string | string[] | undefined;
|
|
93
|
+
const expectedStr = Array.isArray(expected) ? expected.join(" or ") : expected;
|
|
94
|
+
const where = path || "value";
|
|
95
|
+
return expectedStr ? `'${where}' must be a ${expectedStr}` : `'${where}' has wrong type`;
|
|
96
|
+
}
|
|
97
|
+
default: {
|
|
98
|
+
const detail = Object.entries(params)
|
|
99
|
+
.map(([k, v]) => `${k}=${String(v)}`)
|
|
100
|
+
.join(", ");
|
|
101
|
+
const where = path ? `'${path}': ` : "";
|
|
102
|
+
return detail ? `${where}${err.keyword} (${detail})` : `${where}${err.keyword}`;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function valueAt(data: unknown, instancePath: string): unknown {
|
|
108
|
+
if (!instancePath) return data;
|
|
109
|
+
const parts = instancePath.split("/").filter(Boolean);
|
|
110
|
+
let cur: unknown = data;
|
|
111
|
+
for (const p of parts) {
|
|
112
|
+
if (cur && typeof cur === "object") {
|
|
113
|
+
cur = (cur as Record<string, unknown>)[p];
|
|
114
|
+
} else {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return cur;
|
|
119
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { VERSION } from "../../version.ts";
|