@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,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for ap discover command.
|
|
3
|
+
*
|
|
4
|
+
* Tests cover the pure functions and command structure.
|
|
5
|
+
* The coordinator session startup is not tested here (requires tmux and
|
|
6
|
+
* external processes). Use dependency injection via DiscoverDeps to test
|
|
7
|
+
* that discoverCommand() delegates correctly.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, expect, test } from "bun:test";
|
|
11
|
+
import { ValidationError } from "../errors.ts";
|
|
12
|
+
import type { CoordinatorSessionOptions } from "./coordinator.ts";
|
|
13
|
+
import {
|
|
14
|
+
buildDiscoveryBeacon,
|
|
15
|
+
buildScoutArgs,
|
|
16
|
+
createDiscoverCommand,
|
|
17
|
+
DISCOVERY_CATEGORIES,
|
|
18
|
+
type DiscoverDeps,
|
|
19
|
+
discoverCommand,
|
|
20
|
+
VALID_CATEGORY_NAMES,
|
|
21
|
+
} from "./discover.ts";
|
|
22
|
+
|
|
23
|
+
describe("DISCOVERY_CATEGORIES", () => {
|
|
24
|
+
test("has exactly 6 categories", () => {
|
|
25
|
+
expect(DISCOVERY_CATEGORIES).toHaveLength(6);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("each category has name, subject, and body", () => {
|
|
29
|
+
for (const category of DISCOVERY_CATEGORIES) {
|
|
30
|
+
expect(category.name).toBeTruthy();
|
|
31
|
+
expect(category.subject).toBeTruthy();
|
|
32
|
+
expect(category.body).toBeTruthy();
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("contains all expected category names", () => {
|
|
37
|
+
const names = DISCOVERY_CATEGORIES.map((c) => c.name);
|
|
38
|
+
expect(names).toContain("architecture");
|
|
39
|
+
expect(names).toContain("dependencies");
|
|
40
|
+
expect(names).toContain("testing");
|
|
41
|
+
expect(names).toContain("apis");
|
|
42
|
+
expect(names).toContain("config");
|
|
43
|
+
expect(names).toContain("implicit");
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe("VALID_CATEGORY_NAMES", () => {
|
|
48
|
+
test("contains all 6 category names", () => {
|
|
49
|
+
expect(VALID_CATEGORY_NAMES.size).toBe(6);
|
|
50
|
+
expect(VALID_CATEGORY_NAMES.has("architecture")).toBe(true);
|
|
51
|
+
expect(VALID_CATEGORY_NAMES.has("dependencies")).toBe(true);
|
|
52
|
+
expect(VALID_CATEGORY_NAMES.has("testing")).toBe(true);
|
|
53
|
+
expect(VALID_CATEGORY_NAMES.has("apis")).toBe(true);
|
|
54
|
+
expect(VALID_CATEGORY_NAMES.has("config")).toBe(true);
|
|
55
|
+
expect(VALID_CATEGORY_NAMES.has("implicit")).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("does not contain invalid category names", () => {
|
|
59
|
+
expect(VALID_CATEGORY_NAMES.has("unknown")).toBe(false);
|
|
60
|
+
expect(VALID_CATEGORY_NAMES.has("")).toBe(false);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe("buildScoutArgs()", () => {
|
|
65
|
+
test("returns correct args array for a category", () => {
|
|
66
|
+
const category = DISCOVERY_CATEGORIES[0];
|
|
67
|
+
if (!category) throw new Error("DISCOVERY_CATEGORIES is empty");
|
|
68
|
+
const args = buildScoutArgs(category, "task-123", "discover-coordinator");
|
|
69
|
+
expect(args).toContain("ap");
|
|
70
|
+
expect(args).toContain("sling");
|
|
71
|
+
expect(args).toContain("task-123");
|
|
72
|
+
expect(args).toContain("--capability");
|
|
73
|
+
expect(args).toContain("scout");
|
|
74
|
+
expect(args).toContain("--name");
|
|
75
|
+
expect(args).toContain(`discover-${category.name}`);
|
|
76
|
+
expect(args).toContain("--profile");
|
|
77
|
+
expect(args).toContain("ap-discovery");
|
|
78
|
+
expect(args).toContain("--parent");
|
|
79
|
+
expect(args).toContain("discover-coordinator");
|
|
80
|
+
expect(args).toContain("--skip-task-check");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe("buildDiscoveryBeacon()", () => {
|
|
85
|
+
test("includes coordinator name", () => {
|
|
86
|
+
const beacon = buildDiscoveryBeacon(DISCOVERY_CATEGORIES, "discover-coordinator");
|
|
87
|
+
expect(beacon).toContain("discover-coordinator");
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("includes all active category names", () => {
|
|
91
|
+
const beacon = buildDiscoveryBeacon(DISCOVERY_CATEGORIES, "discover-coordinator");
|
|
92
|
+
for (const cat of DISCOVERY_CATEGORIES) {
|
|
93
|
+
expect(beacon).toContain(cat.name);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test("includes timestamp marker", () => {
|
|
98
|
+
const beacon = buildDiscoveryBeacon(DISCOVERY_CATEGORIES, "discover-coordinator");
|
|
99
|
+
expect(beacon).toContain("[AGENTPLATE]");
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test("excludes skipped categories", () => {
|
|
103
|
+
const active = DISCOVERY_CATEGORIES.filter((c) => c.name !== "testing");
|
|
104
|
+
const beacon = buildDiscoveryBeacon(active, "discover-coordinator");
|
|
105
|
+
// All active categories present
|
|
106
|
+
for (const cat of active) {
|
|
107
|
+
expect(beacon).toContain(cat.name);
|
|
108
|
+
}
|
|
109
|
+
// The skipped category body text should not appear as a standalone discovery target
|
|
110
|
+
// (the name "testing" may appear inside other category descriptions, so check body)
|
|
111
|
+
const testingCat = DISCOVERY_CATEGORIES.find((c) => c.name === "testing");
|
|
112
|
+
if (!testingCat) throw new Error("testing category not found");
|
|
113
|
+
expect(beacon).not.toContain(testingCat.body);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("includes startup instructions", () => {
|
|
117
|
+
const beacon = buildDiscoveryBeacon(DISCOVERY_CATEGORIES, "discover-coordinator");
|
|
118
|
+
expect(beacon).toContain("loam prime");
|
|
119
|
+
expect(beacon).toContain("spawn one lead per");
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe("createDiscoverCommand()", () => {
|
|
124
|
+
test("returns a Command with name 'discover'", () => {
|
|
125
|
+
const cmd = createDiscoverCommand();
|
|
126
|
+
expect(cmd.name()).toBe("discover");
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test("has --skip option", () => {
|
|
130
|
+
const cmd = createDiscoverCommand();
|
|
131
|
+
const option = cmd.options.find((o) => o.long === "--skip");
|
|
132
|
+
expect(option).toBeDefined();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("has --name option", () => {
|
|
136
|
+
const cmd = createDiscoverCommand();
|
|
137
|
+
const option = cmd.options.find((o) => o.long === "--name");
|
|
138
|
+
expect(option).toBeDefined();
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test("has --task-id option", () => {
|
|
142
|
+
const cmd = createDiscoverCommand();
|
|
143
|
+
const option = cmd.options.find((o) => o.long === "--task-id");
|
|
144
|
+
expect(option).toBeDefined();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("has --json option", () => {
|
|
148
|
+
const cmd = createDiscoverCommand();
|
|
149
|
+
const option = cmd.options.find((o) => o.long === "--json");
|
|
150
|
+
expect(option).toBeDefined();
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test("has --attach option", () => {
|
|
154
|
+
const cmd = createDiscoverCommand();
|
|
155
|
+
const option = cmd.options.find((o) => o.long === "--attach");
|
|
156
|
+
expect(option).toBeDefined();
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("has --watchdog option", () => {
|
|
160
|
+
const cmd = createDiscoverCommand();
|
|
161
|
+
const option = cmd.options.find((o) => o.long === "--watchdog");
|
|
162
|
+
expect(option).toBeDefined();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test("has a description", () => {
|
|
166
|
+
const cmd = createDiscoverCommand();
|
|
167
|
+
expect(cmd.description()).toBeTruthy();
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
describe("discoverCommand() skip validation", () => {
|
|
172
|
+
test("throws ValidationError for invalid category name", async () => {
|
|
173
|
+
await expect(discoverCommand({ skip: "notacategory" })).rejects.toThrow(ValidationError);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test("throws ValidationError for mixed valid and invalid categories", async () => {
|
|
177
|
+
await expect(discoverCommand({ skip: "architecture,notacategory" })).rejects.toThrow(
|
|
178
|
+
ValidationError,
|
|
179
|
+
);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
test("throws ValidationError when all categories are skipped", async () => {
|
|
183
|
+
const allCategories = DISCOVERY_CATEGORIES.map((c) => c.name).join(",");
|
|
184
|
+
await expect(discoverCommand({ skip: allCategories })).rejects.toThrow(ValidationError);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test("throws ValidationError with helpful message for invalid category", async () => {
|
|
188
|
+
let thrownError: unknown;
|
|
189
|
+
try {
|
|
190
|
+
await discoverCommand({ skip: "badcategory" });
|
|
191
|
+
} catch (err) {
|
|
192
|
+
thrownError = err;
|
|
193
|
+
}
|
|
194
|
+
expect(thrownError).toBeInstanceOf(ValidationError);
|
|
195
|
+
const ve = thrownError as ValidationError;
|
|
196
|
+
expect(ve.message).toContain("badcategory");
|
|
197
|
+
expect(ve.message).toContain("Valid categories");
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
describe("discoverCommand() delegation", () => {
|
|
202
|
+
test("calls startCoordinatorSession with ap-discovery profile", async () => {
|
|
203
|
+
let capturedOpts: CoordinatorSessionOptions | undefined;
|
|
204
|
+
const deps: DiscoverDeps = {
|
|
205
|
+
_startCoordinatorSession: async (opts) => {
|
|
206
|
+
capturedOpts = opts;
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
await discoverCommand({ attach: false }, deps);
|
|
211
|
+
|
|
212
|
+
expect(capturedOpts).toBeDefined();
|
|
213
|
+
expect(capturedOpts?.profile).toBe("ap-discovery");
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
test("uses default coordinator name 'discover-coordinator'", async () => {
|
|
217
|
+
let capturedOpts: CoordinatorSessionOptions | undefined;
|
|
218
|
+
const deps: DiscoverDeps = {
|
|
219
|
+
_startCoordinatorSession: async (opts) => {
|
|
220
|
+
capturedOpts = opts;
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
await discoverCommand({ attach: false }, deps);
|
|
225
|
+
|
|
226
|
+
expect(capturedOpts?.coordinatorName).toBe("discover-coordinator");
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
test("uses custom name when provided", async () => {
|
|
230
|
+
let capturedOpts: CoordinatorSessionOptions | undefined;
|
|
231
|
+
const deps: DiscoverDeps = {
|
|
232
|
+
_startCoordinatorSession: async (opts) => {
|
|
233
|
+
capturedOpts = opts;
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
await discoverCommand({ name: "my-discover", attach: false }, deps);
|
|
238
|
+
|
|
239
|
+
expect(capturedOpts?.coordinatorName).toBe("my-discover");
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test("beacon builder returns string containing active category names", async () => {
|
|
243
|
+
let capturedOpts: CoordinatorSessionOptions | undefined;
|
|
244
|
+
const deps: DiscoverDeps = {
|
|
245
|
+
_startCoordinatorSession: async (opts) => {
|
|
246
|
+
capturedOpts = opts;
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
await discoverCommand({ skip: "testing,config,implicit", attach: false }, deps);
|
|
251
|
+
|
|
252
|
+
expect(capturedOpts?.beaconBuilder).toBeDefined();
|
|
253
|
+
const beacon = capturedOpts?.beaconBuilder?.("bd") ?? "";
|
|
254
|
+
expect(beacon).toContain("architecture");
|
|
255
|
+
expect(beacon).toContain("dependencies");
|
|
256
|
+
expect(beacon).toContain("apis");
|
|
257
|
+
// Skipped categories should not appear as category targets in the beacon
|
|
258
|
+
const testingCat = DISCOVERY_CATEGORIES.find((c) => c.name === "testing");
|
|
259
|
+
if (!testingCat) throw new Error("testing category not found");
|
|
260
|
+
expect(beacon).not.toContain(testingCat.body);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
test("sets monitor: false", async () => {
|
|
264
|
+
let capturedOpts: CoordinatorSessionOptions | undefined;
|
|
265
|
+
const deps: DiscoverDeps = {
|
|
266
|
+
_startCoordinatorSession: async (opts) => {
|
|
267
|
+
capturedOpts = opts;
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
await discoverCommand({ attach: false }, deps);
|
|
272
|
+
|
|
273
|
+
expect(capturedOpts?.monitor).toBe(false);
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test("forwards watchdog option", async () => {
|
|
277
|
+
let capturedOpts: CoordinatorSessionOptions | undefined;
|
|
278
|
+
const deps: DiscoverDeps = {
|
|
279
|
+
_startCoordinatorSession: async (opts) => {
|
|
280
|
+
capturedOpts = opts;
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
await discoverCommand({ watchdog: true, attach: false }, deps);
|
|
285
|
+
|
|
286
|
+
expect(capturedOpts?.watchdog).toBe(true);
|
|
287
|
+
});
|
|
288
|
+
});
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: ap discover
|
|
3
|
+
*
|
|
4
|
+
* Launches a coordinator session with the ap-discovery profile to explore a
|
|
5
|
+
* brownfield codebase and produce structured loam records. The coordinator
|
|
6
|
+
* autonomously spawns leads, which spawn scouts per category, synthesizes
|
|
7
|
+
* results, and writes loam records.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { Command } from "commander";
|
|
11
|
+
import { ValidationError } from "../errors.ts";
|
|
12
|
+
import type { CoordinatorDeps, CoordinatorSessionOptions } from "./coordinator.ts";
|
|
13
|
+
import { startCoordinatorSession } from "./coordinator.ts";
|
|
14
|
+
|
|
15
|
+
/** A single discovery category with its research focus. */
|
|
16
|
+
export interface DiscoveryCategory {
|
|
17
|
+
name: string;
|
|
18
|
+
subject: string;
|
|
19
|
+
body: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** All discovery categories that scouts will explore. */
|
|
23
|
+
export const DISCOVERY_CATEGORIES: DiscoveryCategory[] = [
|
|
24
|
+
{
|
|
25
|
+
name: "architecture",
|
|
26
|
+
subject: "Discover: architecture",
|
|
27
|
+
body: "Explore directory structure, module boundaries, layering conventions, and design patterns. Identify the core architectural style (monolith, layered, hexagonal, etc.), note major subsystems and their relationships, and document any implicit layering rules or boundary conventions.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "dependencies",
|
|
31
|
+
subject: "Discover: dependencies",
|
|
32
|
+
body: "Catalog all npm packages, CLI tool dependencies, and version constraints. Identify runtime vs dev dependencies, note any unusual or pinned versions, and flag deprecated or potentially problematic packages. Document any external CLIs invoked as subprocesses.",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "testing",
|
|
36
|
+
subject: "Discover: testing",
|
|
37
|
+
body: "Map the test framework, file locations, mock strategy, and coverage gaps. Identify what test runner is used, where tests live relative to source, what mocking patterns are used (and why), and which subsystems lack adequate test coverage.",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "apis",
|
|
41
|
+
subject: "Discover: apis",
|
|
42
|
+
body: "Document exported functions and types, interfaces, error handling patterns, and CLI structure. Identify the public API surface, note how errors are typed and propagated, and document any conventions around return types or async patterns.",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "config",
|
|
46
|
+
subject: "Discover: config",
|
|
47
|
+
body: "Catalog config file formats, environment variables, loading and validation patterns, and default values. Note how configuration is structured (YAML, JSON, env), how it's validated at runtime, and what the expected defaults are.",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "implicit",
|
|
51
|
+
subject: "Discover: implicit",
|
|
52
|
+
body: "Surface naming conventions, error handling style, TODOs, and unwritten rules. Look for patterns in variable naming, file naming, comment style, and any informal conventions that aren't documented. Note recurring TODOs or FIXMEs that indicate known debt.",
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
/** Set of valid category names for validation. */
|
|
57
|
+
export const VALID_CATEGORY_NAMES: ReadonlySet<string> = new Set(
|
|
58
|
+
DISCOVERY_CATEGORIES.map((c) => c.name),
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
export interface DiscoverOptions {
|
|
62
|
+
skip?: string;
|
|
63
|
+
name?: string;
|
|
64
|
+
taskId?: string;
|
|
65
|
+
attach?: boolean;
|
|
66
|
+
watchdog?: boolean;
|
|
67
|
+
json?: boolean;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Dependency injection for discoverCommand. Used in tests. */
|
|
71
|
+
export interface DiscoverDeps {
|
|
72
|
+
_startCoordinatorSession?: (
|
|
73
|
+
opts: CoordinatorSessionOptions,
|
|
74
|
+
deps: CoordinatorDeps,
|
|
75
|
+
) => Promise<void>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Parse and validate the --skip option, returning a set of category names to skip. */
|
|
79
|
+
function parseSkipCategories(skip: string | undefined): Set<string> {
|
|
80
|
+
if (!skip) return new Set();
|
|
81
|
+
const names = skip
|
|
82
|
+
.split(",")
|
|
83
|
+
.map((s) => s.trim())
|
|
84
|
+
.filter((s) => s.length > 0);
|
|
85
|
+
const invalid = names.filter((n) => !VALID_CATEGORY_NAMES.has(n));
|
|
86
|
+
if (invalid.length > 0) {
|
|
87
|
+
throw new ValidationError(
|
|
88
|
+
`Invalid category name(s): ${invalid.join(", ")}. Valid categories: ${[...VALID_CATEGORY_NAMES].join(", ")}`,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return new Set(names);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Build the discovery beacon — the initial prompt sent to the discover coordinator
|
|
96
|
+
* after Claude Code initializes. Instructs it to spawn one lead per category.
|
|
97
|
+
*/
|
|
98
|
+
export function buildDiscoveryBeacon(
|
|
99
|
+
categories: DiscoveryCategory[],
|
|
100
|
+
coordinatorName: string,
|
|
101
|
+
): string {
|
|
102
|
+
const timestamp = new Date().toISOString();
|
|
103
|
+
const categoryNames = categories.map((c) => c.name).join(", ");
|
|
104
|
+
const categoryDetails = categories.map((c) => `${c.name}: ${c.body}`).join(" | ");
|
|
105
|
+
const parts = [
|
|
106
|
+
`[AGENTPLATE] ${coordinatorName} (coordinator) ${timestamp}`,
|
|
107
|
+
`Role: discovery coordinator | Categories: ${categoryNames}`,
|
|
108
|
+
`Startup: run loam prime, then spawn one lead per active category. Each lead spawns a scout to explore its category area. After all scouts report back, synthesize findings into loam records.`,
|
|
109
|
+
`Categories: ${categoryDetails}`,
|
|
110
|
+
];
|
|
111
|
+
return parts.join(" — ");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Build the scout args for a given discovery category and task ID.
|
|
116
|
+
* Kept for reference and for callers that need per-category sling arguments.
|
|
117
|
+
*/
|
|
118
|
+
export function buildScoutArgs(
|
|
119
|
+
category: DiscoveryCategory,
|
|
120
|
+
taskId: string,
|
|
121
|
+
parentName: string,
|
|
122
|
+
): string[] {
|
|
123
|
+
return [
|
|
124
|
+
"ap",
|
|
125
|
+
"sling",
|
|
126
|
+
taskId,
|
|
127
|
+
"--capability",
|
|
128
|
+
"scout",
|
|
129
|
+
"--name",
|
|
130
|
+
`discover-${category.name}`,
|
|
131
|
+
"--profile",
|
|
132
|
+
"ap-discovery",
|
|
133
|
+
"--parent",
|
|
134
|
+
parentName,
|
|
135
|
+
"--depth",
|
|
136
|
+
"1",
|
|
137
|
+
"--skip-task-check",
|
|
138
|
+
];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Main handler for ap discover. */
|
|
142
|
+
export async function discoverCommand(
|
|
143
|
+
opts: DiscoverOptions,
|
|
144
|
+
deps: DiscoverDeps = {},
|
|
145
|
+
): Promise<void> {
|
|
146
|
+
const json = opts.json ?? false;
|
|
147
|
+
const coordinatorName = opts.name ?? "discover-coordinator";
|
|
148
|
+
|
|
149
|
+
// Validate and parse skip list
|
|
150
|
+
const skipSet = parseSkipCategories(opts.skip);
|
|
151
|
+
const categories = DISCOVERY_CATEGORIES.filter((c) => !skipSet.has(c.name));
|
|
152
|
+
|
|
153
|
+
if (categories.length === 0) {
|
|
154
|
+
throw new ValidationError("All categories skipped — nothing to discover.");
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const attach = opts.attach !== undefined ? opts.attach : !!process.stdout.isTTY;
|
|
158
|
+
|
|
159
|
+
const startSession = deps._startCoordinatorSession ?? startCoordinatorSession;
|
|
160
|
+
|
|
161
|
+
await startSession(
|
|
162
|
+
{
|
|
163
|
+
json,
|
|
164
|
+
attach,
|
|
165
|
+
watchdog: opts.watchdog ?? false,
|
|
166
|
+
monitor: false,
|
|
167
|
+
profile: "ap-discovery",
|
|
168
|
+
coordinatorName,
|
|
169
|
+
beaconBuilder: (_trackerCli) => buildDiscoveryBeacon(categories, coordinatorName),
|
|
170
|
+
},
|
|
171
|
+
{},
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Commander command factory. */
|
|
176
|
+
export function createDiscoverCommand(): Command {
|
|
177
|
+
return new Command("discover")
|
|
178
|
+
.description("Discover a brownfield codebase via coordinator-driven scout swarm")
|
|
179
|
+
.option(
|
|
180
|
+
"--skip <categories>",
|
|
181
|
+
"Skip specific categories (comma-separated: architecture,dependencies,testing,apis,config,implicit)",
|
|
182
|
+
)
|
|
183
|
+
.option("--name <name>", "Coordinator agent name (default: discover-coordinator)")
|
|
184
|
+
.option("--task-id <id>", "Task ID (unused — kept for backward compatibility)")
|
|
185
|
+
.option("--attach", "Always attach to tmux session after start")
|
|
186
|
+
.option("--no-attach", "Never attach to tmux session after start")
|
|
187
|
+
.option("--watchdog", "Auto-start watchdog daemon with coordinator")
|
|
188
|
+
.option("--json", "Output as JSON")
|
|
189
|
+
.action(
|
|
190
|
+
async (opts: {
|
|
191
|
+
skip?: string;
|
|
192
|
+
name?: string;
|
|
193
|
+
taskId?: string;
|
|
194
|
+
attach?: boolean;
|
|
195
|
+
watchdog?: boolean;
|
|
196
|
+
json?: boolean;
|
|
197
|
+
}) => {
|
|
198
|
+
const attach = opts.attach !== undefined ? opts.attach : !!process.stdout.isTTY;
|
|
199
|
+
await discoverCommand({ ...opts, attach });
|
|
200
|
+
},
|
|
201
|
+
);
|
|
202
|
+
}
|