@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,316 @@
|
|
|
1
|
+
// GitHub Copilot runtime adapter for agentplate's AgentRuntime interface.
|
|
2
|
+
// Implements the AgentRuntime contract for the `copilot` CLI (GitHub Copilot).
|
|
3
|
+
|
|
4
|
+
import { mkdir } from "node:fs/promises";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { deployCopilotHooks } from "../agents/copilot-hooks-deployer.ts";
|
|
8
|
+
import type { ResolvedModel } from "../types.ts";
|
|
9
|
+
import type {
|
|
10
|
+
AgentRuntime,
|
|
11
|
+
HooksDef,
|
|
12
|
+
OverlayContent,
|
|
13
|
+
ReadyState,
|
|
14
|
+
SpawnOpts,
|
|
15
|
+
TranscriptSummary,
|
|
16
|
+
} from "./types.ts";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Map of agentplate model aliases to fully-qualified Copilot model names.
|
|
20
|
+
*
|
|
21
|
+
* The copilot CLI rejects short aliases like "sonnet" and requires fully-qualified
|
|
22
|
+
* names like "claude-sonnet-4-6". Unknown names (e.g. "gpt-4o", "openrouter/gpt-5")
|
|
23
|
+
* are passed through unchanged.
|
|
24
|
+
*/
|
|
25
|
+
const MODEL_MAP: Record<string, string> = {
|
|
26
|
+
sonnet: "claude-sonnet-4-6",
|
|
27
|
+
opus: "claude-opus-4-6",
|
|
28
|
+
haiku: "claude-haiku-4-5",
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Add a worktree path to the Copilot trusted folders list.
|
|
33
|
+
*
|
|
34
|
+
* Reads `~/.config/github-copilot/config.json`, appends the worktreePath to
|
|
35
|
+
* the `trustedFolders` array if not already present, and writes back atomically.
|
|
36
|
+
* Creates the config directory if it does not exist.
|
|
37
|
+
*
|
|
38
|
+
* Exported for testability — callers can inject a custom configDir to avoid
|
|
39
|
+
* touching the real home directory in tests.
|
|
40
|
+
*
|
|
41
|
+
* @param worktreePath - Absolute path to the worktree to pre-trust
|
|
42
|
+
* @param configDir - Override the config directory (default: ~/.config/github-copilot)
|
|
43
|
+
*/
|
|
44
|
+
export async function ensureCopilotTrustedFolders(
|
|
45
|
+
worktreePath: string,
|
|
46
|
+
configDir: string = join(homedir(), ".config", "github-copilot"),
|
|
47
|
+
): Promise<void> {
|
|
48
|
+
const configPath = join(configDir, "config.json");
|
|
49
|
+
await mkdir(configDir, { recursive: true });
|
|
50
|
+
|
|
51
|
+
let config: Record<string, unknown> = {};
|
|
52
|
+
try {
|
|
53
|
+
config = JSON.parse(await Bun.file(configPath).text()) as Record<string, unknown>;
|
|
54
|
+
} catch {
|
|
55
|
+
// File doesn't exist or contains invalid JSON — start fresh.
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const trusted = Array.isArray(config.trustedFolders) ? (config.trustedFolders as string[]) : [];
|
|
59
|
+
if (!trusted.includes(worktreePath)) {
|
|
60
|
+
trusted.push(worktreePath);
|
|
61
|
+
config.trustedFolders = trusted;
|
|
62
|
+
await Bun.write(configPath, `${JSON.stringify(config, null, "\t")}\n`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* GitHub Copilot runtime adapter.
|
|
68
|
+
*
|
|
69
|
+
* Implements AgentRuntime for the `copilot` CLI (GitHub Copilot coding agent).
|
|
70
|
+
* Key differences from Claude Code:
|
|
71
|
+
* - Uses `--allow-all-tools` instead of `--permission-mode bypassPermissions`
|
|
72
|
+
* - No `--append-system-prompt` flag (ignored when provided)
|
|
73
|
+
* - Instruction file lives at `.github/copilot-instructions.md`
|
|
74
|
+
* - No hooks deployment (hooks param unused in deployConfig)
|
|
75
|
+
* - Transcript parser handles both Claude-style and Pi-style formats
|
|
76
|
+
*/
|
|
77
|
+
export class CopilotRuntime implements AgentRuntime {
|
|
78
|
+
/** Unique identifier for this runtime. */
|
|
79
|
+
readonly id = "copilot";
|
|
80
|
+
|
|
81
|
+
/** Stability level. Copilot adapter is experimental — not fully validated. */
|
|
82
|
+
readonly stability = "experimental" as const;
|
|
83
|
+
|
|
84
|
+
/** Relative path to the instruction file within a worktree. */
|
|
85
|
+
readonly instructionPath = ".github/copilot-instructions.md";
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Expand a model alias to a fully-qualified Copilot model name.
|
|
89
|
+
*
|
|
90
|
+
* Looks up the alias in MODEL_MAP. If not found, returns the model unchanged.
|
|
91
|
+
* This allows known aliases (sonnet, opus, haiku) to be resolved while
|
|
92
|
+
* passing through fully-qualified names (e.g. gpt-4o, openrouter/gpt-5).
|
|
93
|
+
*
|
|
94
|
+
* @param model - Short alias or fully-qualified model name
|
|
95
|
+
* @returns Fully-qualified model name accepted by the copilot CLI
|
|
96
|
+
*/
|
|
97
|
+
expandModel(model: string): string {
|
|
98
|
+
return MODEL_MAP[model] ?? model;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Build the shell command string to spawn an interactive Copilot agent.
|
|
103
|
+
*
|
|
104
|
+
* Maps SpawnOpts to `copilot` CLI flags:
|
|
105
|
+
* - `model` → `--model <model>` (aliases expanded via MODEL_MAP)
|
|
106
|
+
* - `permissionMode === "bypass"` → `--allow-all-tools`
|
|
107
|
+
* - `permissionMode === "ask"` → no permission flag added
|
|
108
|
+
* - `appendSystemPrompt` and `appendSystemPromptFile` are IGNORED —
|
|
109
|
+
* the `copilot` CLI has no equivalent flag.
|
|
110
|
+
*
|
|
111
|
+
* The `cwd` and `env` fields of SpawnOpts are handled by the tmux session
|
|
112
|
+
* creator, not embedded in the command string.
|
|
113
|
+
*
|
|
114
|
+
* @param opts - Spawn options (model, permissionMode; appendSystemPrompt ignored)
|
|
115
|
+
* @returns Shell command string suitable for tmux new-session -c
|
|
116
|
+
*/
|
|
117
|
+
buildSpawnCommand(opts: SpawnOpts): string {
|
|
118
|
+
let cmd = `copilot --model ${this.expandModel(opts.model)}`;
|
|
119
|
+
|
|
120
|
+
if (opts.permissionMode === "bypass") {
|
|
121
|
+
cmd += " --allow-all-tools";
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// appendSystemPrompt and appendSystemPromptFile are intentionally ignored.
|
|
125
|
+
// The copilot CLI has no --append-system-prompt equivalent.
|
|
126
|
+
|
|
127
|
+
return cmd;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Build the argv array for a headless one-shot Copilot invocation.
|
|
132
|
+
*
|
|
133
|
+
* Returns an argv array suitable for `Bun.spawn()`. The `-p` flag passes
|
|
134
|
+
* the prompt and `--allow-all-tools` grants full tool access. An optional
|
|
135
|
+
* `--model` flag can override the default model.
|
|
136
|
+
*
|
|
137
|
+
* Used by merge/resolver.ts and watchdog/triage.ts for AI-assisted operations.
|
|
138
|
+
*
|
|
139
|
+
* @param prompt - The prompt to pass via `-p`
|
|
140
|
+
* @param model - Optional model override
|
|
141
|
+
* @returns Argv array for Bun.spawn
|
|
142
|
+
*/
|
|
143
|
+
buildPrintCommand(prompt: string, model?: string): string[] {
|
|
144
|
+
const cmd = ["copilot", "-p", prompt, "--allow-all-tools"];
|
|
145
|
+
if (model !== undefined) {
|
|
146
|
+
cmd.push("--model", this.expandModel(model));
|
|
147
|
+
}
|
|
148
|
+
return cmd;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Deploy per-agent instructions and lifecycle hooks to a worktree.
|
|
153
|
+
*
|
|
154
|
+
* For Copilot this writes:
|
|
155
|
+
* - `.github/copilot-instructions.md` — the agent's task-specific overlay.
|
|
156
|
+
* Skipped when overlay is undefined.
|
|
157
|
+
* - `.github/hooks/hooks.json` — Copilot lifecycle hooks (onSessionStart).
|
|
158
|
+
*
|
|
159
|
+
* @param worktreePath - Absolute path to the agent's git worktree
|
|
160
|
+
* @param overlay - Overlay content to write as copilot-instructions.md, or undefined to skip
|
|
161
|
+
* @param hooks - Hook config providing agentName for hook command substitution
|
|
162
|
+
*/
|
|
163
|
+
async deployConfig(
|
|
164
|
+
worktreePath: string,
|
|
165
|
+
overlay: OverlayContent | undefined,
|
|
166
|
+
hooks: HooksDef,
|
|
167
|
+
): Promise<void> {
|
|
168
|
+
if (overlay) {
|
|
169
|
+
const githubDir = join(worktreePath, ".github");
|
|
170
|
+
await mkdir(githubDir, { recursive: true });
|
|
171
|
+
await Bun.write(join(githubDir, "copilot-instructions.md"), overlay.content);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Deploy Copilot lifecycle hooks (Phase 1: onSessionStart only).
|
|
175
|
+
await deployCopilotHooks(worktreePath, hooks.agentName);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Detect Copilot TUI readiness from a tmux pane content snapshot.
|
|
180
|
+
*
|
|
181
|
+
* Detection requires both a prompt indicator AND a status bar indicator
|
|
182
|
+
* (matched case-insensitively). No trust dialog phase exists for Copilot.
|
|
183
|
+
*
|
|
184
|
+
* - Prompt: U+276F (❯) or "copilot" in pane content (case-insensitive)
|
|
185
|
+
* - Status bar: "shift+tab" or "esc" in pane content (case-insensitive)
|
|
186
|
+
*
|
|
187
|
+
* @param paneContent - Captured tmux pane content to analyze
|
|
188
|
+
* @returns Current readiness phase (never "dialog" for Copilot)
|
|
189
|
+
*/
|
|
190
|
+
detectReady(paneContent: string): ReadyState {
|
|
191
|
+
const lower = paneContent.toLowerCase();
|
|
192
|
+
|
|
193
|
+
// Prompt indicator: ❯ character or "copilot" keyword in pane.
|
|
194
|
+
const hasPrompt = paneContent.includes("\u276f") || lower.includes("copilot");
|
|
195
|
+
|
|
196
|
+
// Status bar indicator: keyboard shortcut hints visible when TUI is ready.
|
|
197
|
+
const hasStatusBar = lower.includes("shift+tab") || lower.includes("esc");
|
|
198
|
+
|
|
199
|
+
if (hasPrompt && hasStatusBar) {
|
|
200
|
+
return { phase: "ready" };
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return { phase: "loading" };
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Parse a Copilot transcript JSONL file into normalized token usage.
|
|
208
|
+
*
|
|
209
|
+
* Handles two transcript formats:
|
|
210
|
+
* - Claude-style: `type === "assistant"` entries with `message.usage.input_tokens`
|
|
211
|
+
* and `message.usage.output_tokens`; model from `message.model`
|
|
212
|
+
* - Pi-style: `type === "message_end"` entries with top-level `inputTokens`
|
|
213
|
+
* and `outputTokens`
|
|
214
|
+
*
|
|
215
|
+
* Also checks the top-level `model` field on any entry for model identification.
|
|
216
|
+
* Returns null if the file does not exist or cannot be parsed.
|
|
217
|
+
*
|
|
218
|
+
* @param path - Absolute path to the transcript JSONL file
|
|
219
|
+
* @returns Aggregated token usage, or null if unavailable
|
|
220
|
+
*/
|
|
221
|
+
async parseTranscript(path: string): Promise<TranscriptSummary | null> {
|
|
222
|
+
const file = Bun.file(path);
|
|
223
|
+
if (!(await file.exists())) {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
try {
|
|
228
|
+
const text = await file.text();
|
|
229
|
+
const lines = text.split("\n").filter((l) => l.trim().length > 0);
|
|
230
|
+
|
|
231
|
+
let inputTokens = 0;
|
|
232
|
+
let outputTokens = 0;
|
|
233
|
+
let model = "";
|
|
234
|
+
|
|
235
|
+
for (const line of lines) {
|
|
236
|
+
let entry: Record<string, unknown>;
|
|
237
|
+
try {
|
|
238
|
+
entry = JSON.parse(line) as Record<string, unknown>;
|
|
239
|
+
} catch {
|
|
240
|
+
// Skip malformed lines — transcripts may have partial writes.
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Check top-level model field (Pi model_change and other events).
|
|
245
|
+
if (typeof entry.model === "string" && entry.model) {
|
|
246
|
+
model = entry.model;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (entry.type === "assistant") {
|
|
250
|
+
// Claude-style: message.usage.input_tokens / output_tokens.
|
|
251
|
+
const message = entry.message as Record<string, unknown> | undefined;
|
|
252
|
+
const usage = message?.usage as Record<string, unknown> | undefined;
|
|
253
|
+
if (typeof usage?.input_tokens === "number") {
|
|
254
|
+
inputTokens += usage.input_tokens;
|
|
255
|
+
}
|
|
256
|
+
if (typeof usage?.output_tokens === "number") {
|
|
257
|
+
outputTokens += usage.output_tokens;
|
|
258
|
+
}
|
|
259
|
+
// Model may also live inside message object.
|
|
260
|
+
if (typeof message?.model === "string" && message.model) {
|
|
261
|
+
model = message.model;
|
|
262
|
+
}
|
|
263
|
+
} else if (entry.type === "message_end") {
|
|
264
|
+
// Pi-style: top-level inputTokens / outputTokens.
|
|
265
|
+
if (typeof entry.inputTokens === "number") {
|
|
266
|
+
inputTokens += entry.inputTokens;
|
|
267
|
+
}
|
|
268
|
+
if (typeof entry.outputTokens === "number") {
|
|
269
|
+
outputTokens += entry.outputTokens;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return { inputTokens, outputTokens, model };
|
|
275
|
+
} catch {
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Build runtime-specific environment variables for model/provider routing.
|
|
282
|
+
*
|
|
283
|
+
* Returns the provider environment variables from the resolved model, or an
|
|
284
|
+
* empty object if none are set.
|
|
285
|
+
*
|
|
286
|
+
* @param model - Resolved model with optional provider env vars
|
|
287
|
+
* @returns Environment variable map (may be empty)
|
|
288
|
+
*/
|
|
289
|
+
buildEnv(model: ResolvedModel): Record<string, string> {
|
|
290
|
+
return model.env ?? {};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** Copilot does not produce transcript files. */
|
|
294
|
+
getTranscriptDir(_projectRoot: string): string | null {
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Pre-trust the worktree path in the Copilot config.
|
|
300
|
+
*
|
|
301
|
+
* Copilot shows an interactive folder trust dialog when it encounters a new
|
|
302
|
+
* worktree path. Pre-writing the path to ~/.config/github-copilot/config.json
|
|
303
|
+
* before spawn prevents this dialog from blocking the agent session.
|
|
304
|
+
*
|
|
305
|
+
* Errors are non-fatal: a warning is emitted to stderr and spawn continues.
|
|
306
|
+
*
|
|
307
|
+
* @param worktreePath - Absolute path to the agent's worktree
|
|
308
|
+
*/
|
|
309
|
+
async prepareWorktree(worktreePath: string): Promise<void> {
|
|
310
|
+
try {
|
|
311
|
+
await ensureCopilotTrustedFolders(worktreePath);
|
|
312
|
+
} catch {
|
|
313
|
+
process.stderr.write(`Warning: Could not pre-trust Copilot folder: ${worktreePath}\n`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|