@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,217 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { AgentError } from "../errors.ts";
|
|
4
|
+
import { cleanupTempDir, createTempGitRepo } from "../test-helpers.ts";
|
|
5
|
+
import { type BeadsClient, createBeadsClient } from "./client.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Check if the bd CLI is available on this machine (synchronous).
|
|
9
|
+
* Uses Bun.spawnSync so the result is available at test registration time
|
|
10
|
+
* for use with test.skipIf().
|
|
11
|
+
*/
|
|
12
|
+
function isBdAvailable(): boolean {
|
|
13
|
+
try {
|
|
14
|
+
const result = Bun.spawnSync(["bd", "--version"], {
|
|
15
|
+
stdout: "pipe",
|
|
16
|
+
stderr: "pipe",
|
|
17
|
+
});
|
|
18
|
+
return result.exitCode === 0;
|
|
19
|
+
} catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Initialize beads in a git repo directory.
|
|
26
|
+
*/
|
|
27
|
+
async function initBeads(cwd: string): Promise<void> {
|
|
28
|
+
const proc = Bun.spawn(["bd", "init"], {
|
|
29
|
+
cwd,
|
|
30
|
+
stdout: "pipe",
|
|
31
|
+
stderr: "pipe",
|
|
32
|
+
});
|
|
33
|
+
const exitCode = await proc.exited;
|
|
34
|
+
if (exitCode !== 0) {
|
|
35
|
+
const stderr = await new Response(proc.stderr).text();
|
|
36
|
+
throw new Error(`bd init failed: ${stderr}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const bdAvailable = isBdAvailable();
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Optimized test suite: uses a single shared repo (beforeAll) instead of
|
|
44
|
+
* creating a fresh repo per test. All 16 original tests share one repo
|
|
45
|
+
* since they create issues with unique IDs and use toContain/not.toContain
|
|
46
|
+
* assertions. This reduces setup from ~96 subprocess spawns to ~6.
|
|
47
|
+
*/
|
|
48
|
+
describe("createBeadsClient (integration)", () => {
|
|
49
|
+
let tempDir: string;
|
|
50
|
+
let client: BeadsClient;
|
|
51
|
+
|
|
52
|
+
// Pre-created issue IDs for tests that need existing issues
|
|
53
|
+
let openIssueId: string;
|
|
54
|
+
let claimedIssueId: string;
|
|
55
|
+
let closedIssueId: string;
|
|
56
|
+
|
|
57
|
+
beforeAll(async () => {
|
|
58
|
+
if (!bdAvailable) return;
|
|
59
|
+
// realpathSync resolves macOS /var -> /private/var symlink so paths match
|
|
60
|
+
tempDir = realpathSync(await createTempGitRepo());
|
|
61
|
+
await initBeads(tempDir);
|
|
62
|
+
client = createBeadsClient(tempDir);
|
|
63
|
+
|
|
64
|
+
// Pre-create issues used by read-only tests (list, ready, show)
|
|
65
|
+
openIssueId = await client.create("Pre-created open issue");
|
|
66
|
+
claimedIssueId = await client.create("Pre-created claimed issue");
|
|
67
|
+
await client.claim(claimedIssueId);
|
|
68
|
+
closedIssueId = await client.create("Pre-created closed issue");
|
|
69
|
+
await client.close(closedIssueId);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
afterAll(async () => {
|
|
73
|
+
if (!bdAvailable) return;
|
|
74
|
+
await cleanupTempDir(tempDir);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe("create", () => {
|
|
78
|
+
test.skipIf(!bdAvailable)("returns an issue ID", async () => {
|
|
79
|
+
const id = await client.create("Integration test issue");
|
|
80
|
+
|
|
81
|
+
expect(typeof id).toBe("string");
|
|
82
|
+
expect(id.length).toBeGreaterThan(0);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test.skipIf(!bdAvailable)("returns ID with type and priority options", async () => {
|
|
86
|
+
const id = await client.create("Typed issue", {
|
|
87
|
+
type: "bug",
|
|
88
|
+
priority: 1,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
expect(typeof id).toBe("string");
|
|
92
|
+
expect(id.length).toBeGreaterThan(0);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test.skipIf(!bdAvailable)("returns ID with description option", async () => {
|
|
96
|
+
const id = await client.create("Described issue", {
|
|
97
|
+
description: "A detailed description",
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
expect(typeof id).toBe("string");
|
|
101
|
+
expect(id.length).toBeGreaterThan(0);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
describe("show", () => {
|
|
106
|
+
test.skipIf(!bdAvailable)("returns issue details for a valid ID", async () => {
|
|
107
|
+
const id = await client.create("Show test issue", {
|
|
108
|
+
type: "task",
|
|
109
|
+
priority: 2,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const issue = await client.show(id);
|
|
113
|
+
|
|
114
|
+
expect(issue.id).toBe(id);
|
|
115
|
+
expect(issue.title).toBe("Show test issue");
|
|
116
|
+
expect(issue.status).toBe("open");
|
|
117
|
+
expect(issue.priority).toBe(2);
|
|
118
|
+
expect(issue.type).toBe("task");
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
describe("claim", () => {
|
|
123
|
+
test.skipIf(!bdAvailable)("changes issue status to in_progress and returns void", async () => {
|
|
124
|
+
const id = await client.create("Claim test issue");
|
|
125
|
+
|
|
126
|
+
const result = await client.claim(id);
|
|
127
|
+
expect(result).toBeUndefined();
|
|
128
|
+
|
|
129
|
+
const issue = await client.show(id);
|
|
130
|
+
expect(issue.status).toBe("in_progress");
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe("close", () => {
|
|
135
|
+
test.skipIf(!bdAvailable)("closes issues with and without reason", async () => {
|
|
136
|
+
const id1 = await client.create("Close test issue");
|
|
137
|
+
const id2 = await client.create("Close reason test");
|
|
138
|
+
|
|
139
|
+
await client.close(id1);
|
|
140
|
+
await client.close(id2, "Completed all acceptance criteria");
|
|
141
|
+
|
|
142
|
+
const issue1 = await client.show(id1);
|
|
143
|
+
expect(issue1.status).toBe("closed");
|
|
144
|
+
|
|
145
|
+
const issue2 = await client.show(id2);
|
|
146
|
+
expect(issue2.status).toBe("closed");
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe("list", () => {
|
|
151
|
+
test.skipIf(!bdAvailable)("returns all issues", async () => {
|
|
152
|
+
const issues = await client.list();
|
|
153
|
+
|
|
154
|
+
// Pre-created issues should be present (plus any from other tests)
|
|
155
|
+
expect(issues.length).toBeGreaterThanOrEqual(3);
|
|
156
|
+
const titles = issues.map((i) => i.title);
|
|
157
|
+
expect(titles).toContain("Pre-created open issue");
|
|
158
|
+
expect(titles).toContain("Pre-created claimed issue");
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test.skipIf(!bdAvailable)("filters by status", async () => {
|
|
162
|
+
const openIssues = await client.list({ status: "open" });
|
|
163
|
+
const openIds = openIssues.map((i) => i.id);
|
|
164
|
+
expect(openIds).toContain(openIssueId);
|
|
165
|
+
expect(openIds).not.toContain(claimedIssueId);
|
|
166
|
+
expect(openIds).not.toContain(closedIssueId);
|
|
167
|
+
|
|
168
|
+
const inProgressIssues = await client.list({ status: "in_progress" });
|
|
169
|
+
const inProgressIds = inProgressIssues.map((i) => i.id);
|
|
170
|
+
expect(inProgressIds).toContain(claimedIssueId);
|
|
171
|
+
expect(inProgressIds).not.toContain(openIssueId);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test.skipIf(!bdAvailable)("respects limit option", async () => {
|
|
175
|
+
const limited = await client.list({ limit: 1 });
|
|
176
|
+
expect(limited).toHaveLength(1);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
describe("ready", () => {
|
|
181
|
+
test.skipIf(!bdAvailable)(
|
|
182
|
+
"returns open unblocked issues but not claimed or closed",
|
|
183
|
+
async () => {
|
|
184
|
+
const readyIssues = await client.ready();
|
|
185
|
+
const readyIds = readyIssues.map((i) => i.id);
|
|
186
|
+
|
|
187
|
+
// Open issue should appear in ready
|
|
188
|
+
expect(readyIds).toContain(openIssueId);
|
|
189
|
+
// Claimed issue should not appear in ready
|
|
190
|
+
expect(readyIds).not.toContain(claimedIssueId);
|
|
191
|
+
// Closed issue should not appear in ready
|
|
192
|
+
expect(readyIds).not.toContain(closedIssueId);
|
|
193
|
+
},
|
|
194
|
+
);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
describe("error handling", () => {
|
|
198
|
+
test.skipIf(!bdAvailable)("show throws AgentError for nonexistent ID", async () => {
|
|
199
|
+
await expect(client.show("nonexistent-id")).rejects.toThrow(AgentError);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test.skipIf(!bdAvailable)(
|
|
203
|
+
"throws AgentError when bd is run without beads initialized",
|
|
204
|
+
async () => {
|
|
205
|
+
// Create a git repo without bd init — independent from shared repo
|
|
206
|
+
const bareDir = realpathSync(await createTempGitRepo());
|
|
207
|
+
const bareClient = createBeadsClient(bareDir);
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
await expect(bareClient.list()).rejects.toThrow(AgentError);
|
|
211
|
+
} finally {
|
|
212
|
+
await cleanupTempDir(bareDir);
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Beads (bd) CLI client.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the `bd` command-line tool for issue tracking operations.
|
|
5
|
+
* All commands use `--json` for parseable output where supported.
|
|
6
|
+
* Uses Bun.spawn — zero runtime dependencies.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { AgentError } from "../errors.ts";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A beads issue as returned by the bd CLI.
|
|
13
|
+
* Defined locally since it comes from an external CLI tool.
|
|
14
|
+
*/
|
|
15
|
+
export interface BeadIssue {
|
|
16
|
+
id: string;
|
|
17
|
+
title: string;
|
|
18
|
+
status: string;
|
|
19
|
+
priority: number;
|
|
20
|
+
type: string;
|
|
21
|
+
assignee?: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
blocks?: string[];
|
|
24
|
+
blockedBy?: string[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface BeadsClient {
|
|
28
|
+
/** List issues that are ready for work (open, unblocked). */
|
|
29
|
+
ready(options?: { mol?: string }): Promise<BeadIssue[]>;
|
|
30
|
+
|
|
31
|
+
/** Show details for a specific issue. */
|
|
32
|
+
show(id: string): Promise<BeadIssue>;
|
|
33
|
+
|
|
34
|
+
/** Create a new issue. Returns the new issue ID. */
|
|
35
|
+
create(
|
|
36
|
+
title: string,
|
|
37
|
+
options?: { type?: string; priority?: number; description?: string },
|
|
38
|
+
): Promise<string>;
|
|
39
|
+
|
|
40
|
+
/** Claim an issue (mark as in_progress). */
|
|
41
|
+
claim(id: string): Promise<void>;
|
|
42
|
+
|
|
43
|
+
/** Close an issue with an optional reason. */
|
|
44
|
+
close(id: string, reason?: string): Promise<void>;
|
|
45
|
+
|
|
46
|
+
/** List issues with optional filters. */
|
|
47
|
+
list(options?: { status?: string; limit?: number }): Promise<BeadIssue[]>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Run a shell command and capture its output.
|
|
52
|
+
*/
|
|
53
|
+
async function runCommand(
|
|
54
|
+
cmd: string[],
|
|
55
|
+
cwd: string,
|
|
56
|
+
): Promise<{ stdout: string; stderr: string; exitCode: number }> {
|
|
57
|
+
const proc = Bun.spawn(cmd, {
|
|
58
|
+
cwd,
|
|
59
|
+
stdout: "pipe",
|
|
60
|
+
stderr: "pipe",
|
|
61
|
+
});
|
|
62
|
+
const stdout = await new Response(proc.stdout).text();
|
|
63
|
+
const stderr = await new Response(proc.stderr).text();
|
|
64
|
+
const exitCode = await proc.exited;
|
|
65
|
+
return { stdout, stderr, exitCode };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Parse JSON output from a bd command.
|
|
70
|
+
* Handles the case where output may be empty or malformed.
|
|
71
|
+
*/
|
|
72
|
+
function parseJsonOutput<T>(stdout: string, context: string): T {
|
|
73
|
+
const trimmed = stdout.trim();
|
|
74
|
+
if (trimmed === "") {
|
|
75
|
+
throw new AgentError(`Empty output from bd ${context}`);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
return JSON.parse(trimmed) as T;
|
|
79
|
+
} catch {
|
|
80
|
+
throw new AgentError(
|
|
81
|
+
`Failed to parse JSON output from bd ${context}: ${trimmed.slice(0, 200)}`,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Raw issue shape from the bd CLI.
|
|
88
|
+
* bd uses `issue_type` instead of `type`.
|
|
89
|
+
*/
|
|
90
|
+
interface RawBeadIssue {
|
|
91
|
+
id: string;
|
|
92
|
+
title: string;
|
|
93
|
+
status: string;
|
|
94
|
+
priority: number;
|
|
95
|
+
issue_type?: string;
|
|
96
|
+
type?: string;
|
|
97
|
+
assignee?: string;
|
|
98
|
+
description?: string;
|
|
99
|
+
blocks?: string[];
|
|
100
|
+
blockedBy?: string[];
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Normalize a raw bd issue into a BeadIssue.
|
|
105
|
+
* Maps `issue_type` -> `type` to match the BeadIssue interface.
|
|
106
|
+
*/
|
|
107
|
+
function normalizeIssue(raw: RawBeadIssue): BeadIssue {
|
|
108
|
+
return {
|
|
109
|
+
id: raw.id,
|
|
110
|
+
title: raw.title,
|
|
111
|
+
status: raw.status,
|
|
112
|
+
priority: raw.priority,
|
|
113
|
+
type: raw.issue_type ?? raw.type ?? "unknown",
|
|
114
|
+
assignee: raw.assignee,
|
|
115
|
+
description: raw.description,
|
|
116
|
+
blocks: raw.blocks,
|
|
117
|
+
blockedBy: raw.blockedBy,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Create a BeadsClient bound to the given working directory.
|
|
123
|
+
*
|
|
124
|
+
* @param cwd - Working directory where bd commands should run
|
|
125
|
+
* @returns A BeadsClient instance wrapping the bd CLI
|
|
126
|
+
*/
|
|
127
|
+
export function createBeadsClient(cwd: string): BeadsClient {
|
|
128
|
+
async function runBd(
|
|
129
|
+
args: string[],
|
|
130
|
+
context: string,
|
|
131
|
+
): Promise<{ stdout: string; stderr: string }> {
|
|
132
|
+
const { stdout, stderr, exitCode } = await runCommand(["bd", ...args], cwd);
|
|
133
|
+
if (exitCode !== 0) {
|
|
134
|
+
throw new AgentError(`bd ${context} failed (exit ${exitCode}): ${stderr.trim()}`);
|
|
135
|
+
}
|
|
136
|
+
return { stdout, stderr };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
async ready(options) {
|
|
141
|
+
const args = ["ready", "--json"];
|
|
142
|
+
if (options?.mol) {
|
|
143
|
+
args.push("--mol", options.mol);
|
|
144
|
+
}
|
|
145
|
+
const { stdout } = await runBd(args, "ready");
|
|
146
|
+
const raw = parseJsonOutput<RawBeadIssue[]>(stdout, "ready");
|
|
147
|
+
return raw.map(normalizeIssue);
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
async show(id) {
|
|
151
|
+
const { stdout } = await runBd(["show", id, "--json"], `show ${id}`);
|
|
152
|
+
// bd show --json returns an array with a single element
|
|
153
|
+
const raw = parseJsonOutput<RawBeadIssue[]>(stdout, `show ${id}`);
|
|
154
|
+
const first = raw[0];
|
|
155
|
+
if (!first) {
|
|
156
|
+
throw new AgentError(`bd show ${id} returned empty array`);
|
|
157
|
+
}
|
|
158
|
+
return normalizeIssue(first);
|
|
159
|
+
},
|
|
160
|
+
|
|
161
|
+
async create(title, options) {
|
|
162
|
+
const args = ["create", title, "--json"];
|
|
163
|
+
if (options?.type) {
|
|
164
|
+
args.push("--type", options.type);
|
|
165
|
+
}
|
|
166
|
+
if (options?.priority !== undefined) {
|
|
167
|
+
args.push("--priority", String(options.priority));
|
|
168
|
+
}
|
|
169
|
+
if (options?.description) {
|
|
170
|
+
args.push("--description", options.description);
|
|
171
|
+
}
|
|
172
|
+
const { stdout } = await runBd(args, "create");
|
|
173
|
+
const result = parseJsonOutput<{ id: string }>(stdout, "create");
|
|
174
|
+
return result.id;
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
async claim(id) {
|
|
178
|
+
await runBd(["update", id, "--status", "in_progress"], `claim ${id}`);
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
async close(id, reason) {
|
|
182
|
+
const args = ["close", id];
|
|
183
|
+
if (reason) {
|
|
184
|
+
args.push("--reason", reason);
|
|
185
|
+
}
|
|
186
|
+
await runBd(args, `close ${id}`);
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
async list(options) {
|
|
190
|
+
const args = ["list", "--json"];
|
|
191
|
+
if (options?.status) {
|
|
192
|
+
args.push("--status", options.status);
|
|
193
|
+
}
|
|
194
|
+
if (options?.limit !== undefined) {
|
|
195
|
+
args.push("--limit", String(options.limit));
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
const { stdout } = await runBd(args, "list");
|
|
199
|
+
const trimmed = stdout.trim();
|
|
200
|
+
if (trimmed === "") return [];
|
|
201
|
+
const parsed: unknown = JSON.parse(trimmed);
|
|
202
|
+
if (Array.isArray(parsed)) {
|
|
203
|
+
// Flat format: RawBeadIssue[]
|
|
204
|
+
return (parsed as RawBeadIssue[]).map(normalizeIssue);
|
|
205
|
+
}
|
|
206
|
+
if (typeof parsed === "object" && parsed !== null) {
|
|
207
|
+
// Tree format: { mol: RawBeadIssue[] } — flatten all groups
|
|
208
|
+
const tree = parsed as Record<string, unknown>;
|
|
209
|
+
const issues: BeadIssue[] = [];
|
|
210
|
+
for (const group of Object.values(tree)) {
|
|
211
|
+
if (Array.isArray(group)) {
|
|
212
|
+
for (const item of group) {
|
|
213
|
+
issues.push(normalizeIssue(item as RawBeadIssue));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (issues.length > 0) return issues;
|
|
218
|
+
}
|
|
219
|
+
} catch {
|
|
220
|
+
// fall through to ready fallback
|
|
221
|
+
}
|
|
222
|
+
// Fallback: bd ready --json always returns a flat array
|
|
223
|
+
const { stdout: readyStdout } = await runBd(["ready", "--json"], "ready (list fallback)");
|
|
224
|
+
const readyTrimmed = readyStdout.trim();
|
|
225
|
+
if (readyTrimmed === "") return [];
|
|
226
|
+
const readyRaw = parseJsonOutput<RawBeadIssue[]>(readyTrimmed, "ready (list fallback)");
|
|
227
|
+
return readyRaw.map(normalizeIssue);
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|