@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,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: ap hooks install|uninstall|status
|
|
3
|
+
*
|
|
4
|
+
* Manages orchestrator hooks in .claude/settings.local.json.
|
|
5
|
+
* Hooks are sourced from .agentplate/hooks.json (generated by ap init).
|
|
6
|
+
*
|
|
7
|
+
* This keeps the canonical hook configuration in .agentplate/ while placing
|
|
8
|
+
* a minimal copy in .claude/ only when the user explicitly opts in.
|
|
9
|
+
* Running `ap init` alone does NOT modify .claude/ — the user must
|
|
10
|
+
* run `ap hooks install` as a separate step.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { mkdir, unlink } from "node:fs/promises";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { Command } from "commander";
|
|
16
|
+
import { loadConfig } from "../config.ts";
|
|
17
|
+
import { ValidationError } from "../errors.ts";
|
|
18
|
+
import { jsonOutput } from "../json.ts";
|
|
19
|
+
import { printHint, printSuccess, printWarning } from "../logging/color.ts";
|
|
20
|
+
|
|
21
|
+
interface HookEntry {
|
|
22
|
+
matcher: string;
|
|
23
|
+
hooks: ReadonlyArray<{ type: string; command: string }>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isDuplicateEntry(a: HookEntry, b: HookEntry): boolean {
|
|
27
|
+
if (a.matcher !== b.matcher) return false;
|
|
28
|
+
if (a.hooks.length !== b.hooks.length) return false;
|
|
29
|
+
return a.hooks.every((cmd, i) => {
|
|
30
|
+
const bCmd = b.hooks[i];
|
|
31
|
+
return bCmd !== undefined && bCmd.type === cmd.type && bCmd.command === cmd.command;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Merge two hook maps by event type, deduplicating entries with identical
|
|
37
|
+
* matcher + command list pairs. Preserves all existing entries and appends
|
|
38
|
+
* only non-duplicate incoming entries per event type.
|
|
39
|
+
*/
|
|
40
|
+
export function mergeHooksByEventType(
|
|
41
|
+
existing: Record<string, unknown[]>,
|
|
42
|
+
incoming: Record<string, unknown[]>,
|
|
43
|
+
): Record<string, unknown[]> {
|
|
44
|
+
const merged: Record<string, unknown[]> = { ...existing };
|
|
45
|
+
|
|
46
|
+
for (const [eventType, incomingEntries] of Object.entries(incoming)) {
|
|
47
|
+
if (!(eventType in merged)) {
|
|
48
|
+
merged[eventType] = incomingEntries;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const existingEntries = merged[eventType] ?? [];
|
|
53
|
+
const toAdd: unknown[] = [];
|
|
54
|
+
|
|
55
|
+
for (const entry of incomingEntries) {
|
|
56
|
+
const incomingEntry = entry as HookEntry;
|
|
57
|
+
const isDupe = existingEntries.some((e) => isDuplicateEntry(e as HookEntry, incomingEntry));
|
|
58
|
+
if (!isDupe) {
|
|
59
|
+
toAdd.push(entry);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
merged[eventType] = [...existingEntries, ...toAdd];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return merged;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Install orchestrator hooks from .agentplate/hooks.json to .claude/settings.local.json.
|
|
71
|
+
*
|
|
72
|
+
* Reads the canonical hook config from .agentplate/hooks.json and writes it to
|
|
73
|
+
* .claude/settings.local.json where Claude Code discovers it. Preserves any
|
|
74
|
+
* existing non-hooks keys in the target file.
|
|
75
|
+
*/
|
|
76
|
+
async function installHooks(force: boolean): Promise<void> {
|
|
77
|
+
const cwd = process.cwd();
|
|
78
|
+
const config = await loadConfig(cwd);
|
|
79
|
+
const projectRoot = config.project.root;
|
|
80
|
+
|
|
81
|
+
// Read source hooks from .agentplate/hooks.json
|
|
82
|
+
const sourcePath = join(projectRoot, ".agentplate", "hooks.json");
|
|
83
|
+
const sourceFile = Bun.file(sourcePath);
|
|
84
|
+
if (!(await sourceFile.exists())) {
|
|
85
|
+
throw new ValidationError("No hooks.json found in .agentplate/. Run 'ap init' first.", {
|
|
86
|
+
field: "source",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const sourceContent = await sourceFile.text();
|
|
91
|
+
const sourceHooks = JSON.parse(sourceContent) as Record<string, unknown>;
|
|
92
|
+
|
|
93
|
+
// Check target .claude/settings.local.json
|
|
94
|
+
const targetDir = join(projectRoot, ".claude");
|
|
95
|
+
const targetPath = join(targetDir, "settings.local.json");
|
|
96
|
+
const targetFile = Bun.file(targetPath);
|
|
97
|
+
|
|
98
|
+
let targetConfig: Record<string, unknown> = {};
|
|
99
|
+
if (await targetFile.exists()) {
|
|
100
|
+
const existingContent = await targetFile.text();
|
|
101
|
+
const existing = JSON.parse(existingContent) as Record<string, unknown>;
|
|
102
|
+
|
|
103
|
+
if (existing.hooks && !force) {
|
|
104
|
+
process.stdout.write(
|
|
105
|
+
"Hooks already present in .claude/settings.local.json\nUse --force to overwrite.\n",
|
|
106
|
+
);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Preserve non-hooks keys (e.g., env settings)
|
|
111
|
+
targetConfig = existing;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Merge: set hooks from source, preserve other keys
|
|
115
|
+
const existingHooks = targetConfig.hooks as Record<string, unknown[]> | undefined;
|
|
116
|
+
const incomingHooks = sourceHooks.hooks as Record<string, unknown[]>;
|
|
117
|
+
targetConfig.hooks = existingHooks
|
|
118
|
+
? mergeHooksByEventType(existingHooks, incomingHooks)
|
|
119
|
+
: incomingHooks;
|
|
120
|
+
|
|
121
|
+
// Write
|
|
122
|
+
await mkdir(targetDir, { recursive: true });
|
|
123
|
+
await Bun.write(targetPath, `${JSON.stringify(targetConfig, null, "\t")}\n`);
|
|
124
|
+
|
|
125
|
+
printSuccess("Installed orchestrator hooks");
|
|
126
|
+
printHint("Source: .agentplate/hooks.json");
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Remove orchestrator hooks from .claude/settings.local.json.
|
|
131
|
+
*
|
|
132
|
+
* If hooks were the only content, removes the file entirely.
|
|
133
|
+
* Otherwise, preserves other keys and only removes the hooks key.
|
|
134
|
+
*/
|
|
135
|
+
async function uninstallHooks(): Promise<void> {
|
|
136
|
+
const cwd = process.cwd();
|
|
137
|
+
const config = await loadConfig(cwd);
|
|
138
|
+
const projectRoot = config.project.root;
|
|
139
|
+
|
|
140
|
+
const targetPath = join(projectRoot, ".claude", "settings.local.json");
|
|
141
|
+
const targetFile = Bun.file(targetPath);
|
|
142
|
+
|
|
143
|
+
if (!(await targetFile.exists())) {
|
|
144
|
+
printWarning("No .claude/settings.local.json found", "nothing to uninstall");
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const content = await targetFile.text();
|
|
149
|
+
const parsed = JSON.parse(content) as Record<string, unknown>;
|
|
150
|
+
|
|
151
|
+
if (!parsed.hooks) {
|
|
152
|
+
process.stdout.write(
|
|
153
|
+
"No hooks found in .claude/settings.local.json \u2014 nothing to uninstall.\n",
|
|
154
|
+
);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Separate hooks from other settings
|
|
159
|
+
const { hooks: _hooks, ...rest } = parsed;
|
|
160
|
+
|
|
161
|
+
const remainingKeys = Object.keys(rest);
|
|
162
|
+
if (remainingKeys.length === 0) {
|
|
163
|
+
await unlink(targetPath);
|
|
164
|
+
printSuccess("Removed hooks from settings.local.json");
|
|
165
|
+
} else {
|
|
166
|
+
await Bun.write(targetPath, `${JSON.stringify(rest, null, "\t")}\n`);
|
|
167
|
+
printSuccess("Removed hooks from settings.local.json");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Show hooks installation status.
|
|
173
|
+
*/
|
|
174
|
+
async function statusHooks(json: boolean): Promise<void> {
|
|
175
|
+
const cwd = process.cwd();
|
|
176
|
+
const config = await loadConfig(cwd);
|
|
177
|
+
const projectRoot = config.project.root;
|
|
178
|
+
|
|
179
|
+
const sourcePath = join(projectRoot, ".agentplate", "hooks.json");
|
|
180
|
+
const targetPath = join(projectRoot, ".claude", "settings.local.json");
|
|
181
|
+
|
|
182
|
+
const sourceExists = await Bun.file(sourcePath).exists();
|
|
183
|
+
const targetExists = await Bun.file(targetPath).exists();
|
|
184
|
+
|
|
185
|
+
let installed = false;
|
|
186
|
+
if (targetExists) {
|
|
187
|
+
const content = await Bun.file(targetPath).text();
|
|
188
|
+
const parsed = JSON.parse(content) as Record<string, unknown>;
|
|
189
|
+
installed = !!parsed.hooks;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (json) {
|
|
193
|
+
jsonOutput("hooks status", { sourceExists, installed });
|
|
194
|
+
} else {
|
|
195
|
+
process.stdout.write(
|
|
196
|
+
`Hooks source (.agentplate/hooks.json): ${sourceExists ? "present" : "missing"}\n`,
|
|
197
|
+
);
|
|
198
|
+
process.stdout.write(
|
|
199
|
+
`Hooks installed (.claude/settings.local.json): ${installed ? "yes" : "no"}\n`,
|
|
200
|
+
);
|
|
201
|
+
if (!installed && sourceExists) {
|
|
202
|
+
printHint("Run ap hooks install to install");
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export function createHooksCommand(): Command {
|
|
208
|
+
const cmd = new Command("hooks").description("Manage orchestrator hooks");
|
|
209
|
+
|
|
210
|
+
cmd
|
|
211
|
+
.command("install")
|
|
212
|
+
.description("Install orchestrator hooks to .claude/settings.local.json")
|
|
213
|
+
.option("--force", "Overwrite existing hooks")
|
|
214
|
+
.action(async (opts: { force?: boolean }) => {
|
|
215
|
+
await installHooks(opts.force ?? false);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
cmd
|
|
219
|
+
.command("uninstall")
|
|
220
|
+
.description("Remove orchestrator hooks from .claude/settings.local.json")
|
|
221
|
+
.action(async () => {
|
|
222
|
+
await uninstallHooks();
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
cmd
|
|
226
|
+
.command("status")
|
|
227
|
+
.description("Check if hooks are installed")
|
|
228
|
+
.option("--json", "Output as JSON")
|
|
229
|
+
.action(async (opts: { json?: boolean }) => {
|
|
230
|
+
await statusHooks(opts.json ?? false);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
return cmd;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Entry point for `ap hooks <subcommand>`.
|
|
238
|
+
*/
|
|
239
|
+
export async function hooksCommand(args: string[]): Promise<void> {
|
|
240
|
+
const cmd = createHooksCommand();
|
|
241
|
+
cmd.exitOverride();
|
|
242
|
+
|
|
243
|
+
if (args.length === 0) {
|
|
244
|
+
process.stdout.write(cmd.helpInformation());
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
try {
|
|
249
|
+
await cmd.parseAsync(args, { from: "user" });
|
|
250
|
+
} catch (err: unknown) {
|
|
251
|
+
if (err && typeof err === "object" && "code" in err) {
|
|
252
|
+
const code = (err as { code: string }).code;
|
|
253
|
+
if (code === "commander.helpDisplayed" || code === "commander.version") {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
if (code === "commander.unknownCommand") {
|
|
257
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
258
|
+
throw new ValidationError(message, { field: "subcommand" });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
throw err;
|
|
262
|
+
}
|
|
263
|
+
}
|