supipowers 1.5.3 → 2.0.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.
Files changed (340) hide show
  1. package/README.md +14 -8
  2. package/bin/install.mjs +20 -5
  3. package/bin/install.ts +95 -0
  4. package/package.json +8 -4
  5. package/skills/context-mode/SKILL.md +17 -10
  6. package/skills/harness/SKILL.md +94 -0
  7. package/skills/ui-design/SKILL.md +63 -0
  8. package/skills/ui-design/sub-agent-templates/component-builder.md +29 -0
  9. package/skills/ui-design/sub-agent-templates/design-critic.md +46 -0
  10. package/skills/ui-design/sub-agent-templates/pencil/component-builder.md +29 -0
  11. package/skills/ui-design/sub-agent-templates/pencil/design-critic.md +42 -0
  12. package/skills/ui-design/sub-agent-templates/pencil/section-assembler.md +27 -0
  13. package/skills/ui-design/sub-agent-templates/section-assembler.md +27 -0
  14. package/skills/ultraplan-discover/SKILL.md +96 -0
  15. package/skills/ultraplan-intake/SKILL.md +89 -0
  16. package/skills/ultraplan-research/SKILL.md +129 -0
  17. package/skills/ultraplan-review/SKILL.md +86 -0
  18. package/skills/ultraplan-review-scope/SKILL.md +111 -0
  19. package/skills/ultraplan-review-structure/SKILL.md +120 -0
  20. package/skills/ultraplan-review-tdd/SKILL.md +142 -0
  21. package/skills/ultraplan-scout/SKILL.md +110 -0
  22. package/skills/ultraplan-synthesize/SKILL.md +124 -0
  23. package/src/{quality/ai-session.ts → ai/final-message.ts} +27 -0
  24. package/src/ai/schema-text.ts +129 -0
  25. package/src/ai/structured-output.ts +274 -0
  26. package/src/ai/template.ts +27 -0
  27. package/src/bootstrap.ts +63 -28
  28. package/src/commands/agents.ts +131 -42
  29. package/src/commands/ai-review.ts +251 -30
  30. package/src/commands/clear.ts +434 -0
  31. package/src/commands/commit.ts +1 -0
  32. package/src/commands/config.ts +242 -44
  33. package/src/commands/context.ts +55 -28
  34. package/src/commands/doctor.ts +234 -6
  35. package/src/commands/fix-pr.ts +306 -131
  36. package/src/commands/generate.ts +111 -21
  37. package/src/commands/memory.ts +192 -0
  38. package/src/commands/model-picker.ts +28 -21
  39. package/src/commands/model.ts +18 -8
  40. package/src/commands/optimize-context.ts +408 -29
  41. package/src/commands/plan.ts +2 -0
  42. package/src/commands/qa.ts +312 -137
  43. package/src/commands/release.ts +259 -76
  44. package/src/commands/review.ts +293 -59
  45. package/src/commands/status.ts +200 -13
  46. package/src/commands/supi.ts +3 -35
  47. package/src/commands/ui-design.ts +394 -0
  48. package/src/commands/ultraplan.ts +1518 -0
  49. package/src/commands/update.ts +86 -0
  50. package/src/config/defaults.ts +62 -0
  51. package/src/config/loader.ts +448 -60
  52. package/src/config/schema.ts +108 -2
  53. package/src/context/optimizer.ts +25 -33
  54. package/src/context/rule-renderer.ts +223 -0
  55. package/src/context/savings.ts +258 -0
  56. package/src/context/startup-check.ts +380 -0
  57. package/src/context/startup-optimizer.ts +355 -0
  58. package/src/context/tokenignore.ts +146 -0
  59. package/src/context-mode/cache-handle.ts +49 -0
  60. package/src/context-mode/cache-preview.ts +71 -0
  61. package/src/context-mode/cache-store.ts +738 -0
  62. package/src/context-mode/compressor.ts +131 -26
  63. package/src/context-mode/dedup.ts +108 -0
  64. package/src/context-mode/detector.ts +35 -4
  65. package/src/context-mode/event-extractor.ts +14 -12
  66. package/src/context-mode/event-store.ts +91 -36
  67. package/src/context-mode/hooks.ts +798 -56
  68. package/src/context-mode/knowledge/store.ts +255 -11
  69. package/src/context-mode/memory-store.ts +325 -0
  70. package/src/context-mode/metrics-recorder.ts +158 -0
  71. package/src/context-mode/metrics-store.ts +765 -0
  72. package/src/context-mode/model.ts +24 -0
  73. package/src/context-mode/processor-keys.ts +29 -0
  74. package/src/context-mode/processors/build.ts +66 -0
  75. package/src/context-mode/processors/docker.ts +57 -0
  76. package/src/context-mode/processors/git.ts +111 -0
  77. package/src/context-mode/processors/json.ts +112 -0
  78. package/src/context-mode/processors/k8s.ts +67 -0
  79. package/src/context-mode/processors/lint.ts +67 -0
  80. package/src/context-mode/processors/log.ts +86 -0
  81. package/src/context-mode/processors/registry.ts +116 -0
  82. package/src/context-mode/processors/test-runner.ts +102 -0
  83. package/src/context-mode/processors/types.ts +20 -0
  84. package/src/context-mode/repomap.ts +400 -0
  85. package/src/context-mode/routing.ts +97 -24
  86. package/src/context-mode/sandbox/runners.ts +5 -1
  87. package/src/context-mode/snapshot-builder.ts +106 -11
  88. package/src/context-mode/source-hash.ts +173 -0
  89. package/src/context-mode/tool-name.ts +11 -0
  90. package/src/context-mode/tools.ts +654 -22
  91. package/src/context-mode/web/fetcher.ts +31 -12
  92. package/src/debug/logger.ts +2 -1
  93. package/src/deps/registry.ts +1 -1
  94. package/src/discipline/failure-summarizer.ts +170 -0
  95. package/src/discipline/failure-taxonomy.ts +131 -0
  96. package/src/discipline/workflow-invariants.ts +125 -0
  97. package/src/discovery/index.ts +31 -0
  98. package/src/discovery/lsp.ts +87 -0
  99. package/src/discovery/rank.ts +144 -0
  100. package/src/discovery/sources.ts +89 -0
  101. package/src/discovery/workflow.ts +87 -0
  102. package/src/docs/contracts.ts +39 -0
  103. package/src/docs/drift.ts +117 -87
  104. package/src/fix-pr/assessment.ts +200 -0
  105. package/src/fix-pr/contracts.ts +47 -0
  106. package/src/fix-pr/fetch-comments.ts +80 -0
  107. package/src/fix-pr/prompt-builder.ts +58 -40
  108. package/src/fix-pr/scripts/exec.ts +34 -0
  109. package/src/fix-pr/scripts/trigger-review.ts +106 -0
  110. package/src/fix-pr/scripts/wait-and-check.ts +108 -0
  111. package/src/fix-pr/types.ts +4 -0
  112. package/src/git/branch-finish.ts +5 -0
  113. package/src/git/commit-contract.ts +83 -0
  114. package/src/git/commit.ts +121 -184
  115. package/src/git/status.ts +62 -8
  116. package/src/harness/anti_slop/architecture-parser.ts +210 -0
  117. package/src/harness/anti_slop/backend-factory.ts +30 -0
  118. package/src/harness/anti_slop/backend.ts +140 -0
  119. package/src/harness/anti_slop/desloppify-adapter.ts +319 -0
  120. package/src/harness/anti_slop/fallow-adapter.ts +305 -0
  121. package/src/harness/anti_slop/installer.ts +227 -0
  122. package/src/harness/anti_slop/queue.ts +216 -0
  123. package/src/harness/anti_slop/recommend.ts +84 -0
  124. package/src/harness/anti_slop/score.ts +180 -0
  125. package/src/harness/anti_slop/synthetic-edit-test.ts +128 -0
  126. package/src/harness/artifacts/agents-md.ts +88 -0
  127. package/src/harness/artifacts/checks-wiring.ts +57 -0
  128. package/src/harness/artifacts/docs-tree.ts +79 -0
  129. package/src/harness/artifacts/lint-configs.ts +136 -0
  130. package/src/harness/artifacts/review-agents.ts +67 -0
  131. package/src/harness/bare-entry.ts +108 -0
  132. package/src/harness/command.ts +1010 -0
  133. package/src/harness/default-agents/design.md +23 -0
  134. package/src/harness/default-agents/discover.md +18 -0
  135. package/src/harness/default-agents/implement.md +24 -0
  136. package/src/harness/default-agents/plan.md +19 -0
  137. package/src/harness/default-agents/research.md +21 -0
  138. package/src/harness/default-agents/validate.md +22 -0
  139. package/src/harness/gc/reporter.ts +28 -0
  140. package/src/harness/gc/runner.ts +136 -0
  141. package/src/harness/hooks/layer-context-inject.ts +155 -0
  142. package/src/harness/hooks/post-session-sweep.ts +130 -0
  143. package/src/harness/hooks/pre-edit-dupe-probe.ts +224 -0
  144. package/src/harness/hooks/register.ts +118 -0
  145. package/src/harness/model.ts +117 -0
  146. package/src/harness/pipeline.ts +348 -0
  147. package/src/harness/project-paths.ts +235 -0
  148. package/src/harness/stage-runner.ts +107 -0
  149. package/src/harness/stages/design.ts +386 -0
  150. package/src/harness/stages/discover.ts +454 -0
  151. package/src/harness/stages/implement.ts +162 -0
  152. package/src/harness/stages/plan.ts +335 -0
  153. package/src/harness/stages/research.ts +263 -0
  154. package/src/harness/stages/validate.ts +684 -0
  155. package/src/harness/storage.ts +467 -0
  156. package/src/harness/tools.ts +426 -0
  157. package/src/lsp/bridge.ts +56 -95
  158. package/src/lsp/capabilities.ts +108 -0
  159. package/src/lsp/contracts.ts +35 -0
  160. package/src/lsp/detector.ts +8 -12
  161. package/src/markdown-frontmatter.ts +68 -0
  162. package/src/mempalace/bridge.ts +129 -0
  163. package/src/mempalace/config.ts +75 -0
  164. package/src/mempalace/format.ts +163 -0
  165. package/src/mempalace/hooks.ts +370 -0
  166. package/src/mempalace/installer-helper.ts +194 -0
  167. package/src/mempalace/python/mempalace_bridge.py +440 -0
  168. package/src/mempalace/runtime.ts +565 -0
  169. package/src/mempalace/schema.ts +264 -0
  170. package/src/mempalace/session-summary.ts +198 -0
  171. package/src/mempalace/tool.ts +186 -0
  172. package/src/mempalace/uv.ts +256 -0
  173. package/src/migrate/runner.ts +354 -0
  174. package/src/planning/approval-flow.ts +206 -9
  175. package/src/planning/plan-writer-prompt.ts +4 -3
  176. package/src/planning/planning-ask-tool.ts +39 -0
  177. package/src/planning/render-markdown.ts +74 -0
  178. package/src/planning/spec.ts +42 -0
  179. package/src/planning/system-prompt.ts +11 -8
  180. package/src/planning/validate.ts +84 -0
  181. package/src/platform/omp.ts +15 -2
  182. package/src/platform/system-prompt.ts +37 -0
  183. package/src/platform/test-utils.ts +3 -0
  184. package/src/platform/types.ts +6 -1
  185. package/src/qa/config.ts +12 -6
  186. package/src/qa/detect-app-type.ts +13 -6
  187. package/src/qa/matrix.ts +12 -6
  188. package/src/qa/prompt-builder.ts +28 -30
  189. package/src/qa/scripts/dev-server-utils.ts +72 -0
  190. package/src/qa/scripts/run-e2e-tests.ts +226 -0
  191. package/src/qa/scripts/start-dev-server.ts +138 -0
  192. package/src/qa/scripts/stop-dev-server.ts +77 -0
  193. package/src/qa/session.ts +13 -7
  194. package/src/quality/ai-setup.ts +27 -25
  195. package/src/quality/contracts.ts +34 -0
  196. package/src/quality/gates/ai-review.ts +20 -58
  197. package/src/quality/gates/command.ts +249 -46
  198. package/src/quality/review-gates.ts +18 -2
  199. package/src/quality/runner.ts +63 -22
  200. package/src/quality/schemas.ts +37 -2
  201. package/src/quality/setup.ts +96 -16
  202. package/src/release/changelog.ts +1 -1
  203. package/src/release/channels/custom.ts +13 -3
  204. package/src/release/channels/types.ts +5 -0
  205. package/src/release/contracts.ts +90 -0
  206. package/src/release/executor.ts +122 -45
  207. package/src/release/prompt.ts +18 -2
  208. package/src/release/targets.ts +86 -0
  209. package/src/release/version.ts +96 -71
  210. package/src/review/agent-loader.ts +221 -109
  211. package/src/review/fixer.ts +10 -6
  212. package/src/review/multi-agent-runner.ts +114 -13
  213. package/src/review/output.ts +12 -139
  214. package/src/review/runner.ts +12 -6
  215. package/src/review/scope.ts +144 -24
  216. package/src/review/types.ts +1 -20
  217. package/src/review/validator.ts +12 -6
  218. package/src/storage/fix-pr-sessions.ts +21 -14
  219. package/src/storage/plans.ts +14 -5
  220. package/src/storage/qa-sessions.ts +25 -19
  221. package/src/storage/reliability-metrics.ts +180 -0
  222. package/src/storage/reports.ts +8 -7
  223. package/src/storage/review-sessions.ts +55 -20
  224. package/src/tool-catalog/active-tool-controller.ts +164 -0
  225. package/src/tool-catalog/active-tool-planner.ts +212 -0
  226. package/src/tool-catalog/tool-groups.ts +102 -0
  227. package/src/types.ts +1399 -5
  228. package/src/ui-design/backend-adapter.ts +78 -0
  229. package/src/ui-design/backends/local-html.ts +82 -0
  230. package/src/ui-design/backends/pencil-mcp.ts +111 -0
  231. package/src/ui-design/components-scanner.ts +124 -0
  232. package/src/ui-design/config.ts +55 -0
  233. package/src/ui-design/pen-scanner.ts +95 -0
  234. package/src/ui-design/pen-selector.ts +72 -0
  235. package/src/ui-design/prompt-builder.ts +73 -0
  236. package/src/ui-design/scanner.ts +136 -0
  237. package/src/ui-design/session.ts +974 -0
  238. package/src/ui-design/system-prompt.ts +312 -0
  239. package/src/ui-design/tokens-scanner.ts +181 -0
  240. package/src/ui-design/types.ts +96 -0
  241. package/src/ultraplan/agent-catalog.ts +522 -0
  242. package/src/ultraplan/authoring/agent-catalog.ts +310 -0
  243. package/src/ultraplan/authoring/authoring-tools.ts +552 -0
  244. package/src/ultraplan/authoring/command-handlers.ts +339 -0
  245. package/src/ultraplan/authoring/markdown.ts +510 -0
  246. package/src/ultraplan/authoring/model.ts +162 -0
  247. package/src/ultraplan/authoring/pipeline.ts +319 -0
  248. package/src/ultraplan/authoring/stage-runner.ts +141 -0
  249. package/src/ultraplan/authoring/stages/approve.ts +249 -0
  250. package/src/ultraplan/authoring/stages/discover.ts +289 -0
  251. package/src/ultraplan/authoring/stages/intake.ts +203 -0
  252. package/src/ultraplan/authoring/stages/research.ts +399 -0
  253. package/src/ultraplan/authoring/stages/review.ts +333 -0
  254. package/src/ultraplan/authoring/stages/scout.ts +188 -0
  255. package/src/ultraplan/authoring/stages/synthesize.ts +348 -0
  256. package/src/ultraplan/authoring/storage.ts +594 -0
  257. package/src/ultraplan/authoring/synth-gate.ts +165 -0
  258. package/src/ultraplan/authoring-draft.ts +653 -0
  259. package/src/ultraplan/authoring-persist.ts +180 -0
  260. package/src/ultraplan/authoring-tool.ts +608 -0
  261. package/src/ultraplan/authoring-wizard.ts +587 -0
  262. package/src/ultraplan/batch/merge.ts +98 -0
  263. package/src/ultraplan/batch/planner.ts +150 -0
  264. package/src/ultraplan/batch/presenter.ts +97 -0
  265. package/src/ultraplan/batch/storage.ts +420 -0
  266. package/src/ultraplan/batch/supervisor.ts +317 -0
  267. package/src/ultraplan/batch/worker.ts +26 -0
  268. package/src/ultraplan/batch/worktree.ts +110 -0
  269. package/src/ultraplan/contracts.ts +1593 -0
  270. package/src/ultraplan/default-agents/authoring/discoverer.md +12 -0
  271. package/src/ultraplan/default-agents/authoring/intake.md +12 -0
  272. package/src/ultraplan/default-agents/authoring/planner.md +12 -0
  273. package/src/ultraplan/default-agents/authoring/researcher.md +12 -0
  274. package/src/ultraplan/default-agents/authoring/scope-checker.md +12 -0
  275. package/src/ultraplan/default-agents/authoring/scout.md +12 -0
  276. package/src/ultraplan/default-agents/authoring/structure-checker.md +12 -0
  277. package/src/ultraplan/default-agents/authoring/tdd-checker.md +12 -0
  278. package/src/ultraplan/default-agents/backend-domain-reviewer.md +10 -0
  279. package/src/ultraplan/default-agents/backend-executor.md +10 -0
  280. package/src/ultraplan/default-agents/backend-stack-reviewer.md +10 -0
  281. package/src/ultraplan/default-agents/backend-tester.md +10 -0
  282. package/src/ultraplan/default-agents/frontend-domain-reviewer.md +10 -0
  283. package/src/ultraplan/default-agents/frontend-executor.md +10 -0
  284. package/src/ultraplan/default-agents/frontend-stack-reviewer.md +10 -0
  285. package/src/ultraplan/default-agents/frontend-tester.md +10 -0
  286. package/src/ultraplan/default-agents/infrastructure-domain-reviewer.md +10 -0
  287. package/src/ultraplan/default-agents/infrastructure-executor.md +10 -0
  288. package/src/ultraplan/default-agents/infrastructure-stack-reviewer.md +10 -0
  289. package/src/ultraplan/default-agents/infrastructure-tester.md +10 -0
  290. package/src/ultraplan/execution/contract.ts +71 -0
  291. package/src/ultraplan/execution/policy.ts +217 -0
  292. package/src/ultraplan/execution/runtime-tools.ts +107 -0
  293. package/src/ultraplan/execution/session-runner.ts +281 -0
  294. package/src/ultraplan/next-router.ts +85 -0
  295. package/src/ultraplan/presenter.ts +359 -0
  296. package/src/ultraplan/project-paths.ts +342 -0
  297. package/src/ultraplan/runtime/active-execution.ts +72 -0
  298. package/src/ultraplan/runtime/apply-mutation.ts +416 -0
  299. package/src/ultraplan/runtime/blockers.ts +243 -0
  300. package/src/ultraplan/runtime/hook-bridge.ts +486 -0
  301. package/src/ultraplan/runtime/launch-context.ts +207 -0
  302. package/src/ultraplan/runtime/migration.ts +524 -0
  303. package/src/ultraplan/runtime/normalize.ts +281 -0
  304. package/src/ultraplan/runtime/proof.ts +260 -0
  305. package/src/ultraplan/runtime/reducer.ts +416 -0
  306. package/src/ultraplan/runtime/repair.ts +251 -0
  307. package/src/ultraplan/runtime/tracker-storage.ts +368 -0
  308. package/src/ultraplan/session-selection.ts +291 -0
  309. package/src/ultraplan/storage.ts +374 -0
  310. package/src/utils/editor.ts +38 -0
  311. package/src/utils/executable.ts +80 -0
  312. package/src/utils/paths.ts +1 -20
  313. package/src/utils/shell.ts +31 -0
  314. package/src/visual/companion.ts +2 -1
  315. package/src/visual/scripts/frame-template.html +60 -0
  316. package/src/visual/scripts/index.js +59 -13
  317. package/src/visual/scripts/package.json +3 -0
  318. package/src/visual/start-server.ts +2 -1
  319. package/src/workspace/git-scope.ts +64 -0
  320. package/src/workspace/locks.ts +23 -0
  321. package/src/workspace/package-manager.ts +117 -0
  322. package/src/workspace/path-mapping.ts +75 -0
  323. package/src/workspace/project-slug.ts +92 -0
  324. package/src/workspace/repo-root.ts +137 -0
  325. package/src/workspace/selector.ts +115 -0
  326. package/src/workspace/state-paths.ts +118 -0
  327. package/src/workspace/targets.ts +313 -0
  328. package/src/fix-pr/scripts/diff-comments.sh +0 -33
  329. package/src/fix-pr/scripts/fetch-pr-comments.sh +0 -25
  330. package/src/fix-pr/scripts/trigger-review.sh +0 -36
  331. package/src/fix-pr/scripts/wait-and-check.sh +0 -37
  332. package/src/qa/scripts/detect-app-type.sh +0 -68
  333. package/src/qa/scripts/discover-routes.sh +0 -143
  334. package/src/qa/scripts/run-e2e-tests.sh +0 -131
  335. package/src/qa/scripts/start-dev-server.sh +0 -46
  336. package/src/qa/scripts/stop-dev-server.sh +0 -36
  337. package/src/review/prompts/fix-output-schema.md +0 -18
  338. package/src/review/prompts/review-output-schema.md +0 -38
  339. package/src/review/template.ts +0 -15
  340. /package/src/{review → ai}/prompts/invalid-output-retry.md +0 -0
@@ -1,12 +1,16 @@
1
+ import path from "node:path";
1
2
  import type { Platform } from "../platform/types.js";
2
3
  import {
3
- loadMergedReviewAgents,
4
- writeAgentFile,
5
4
  addAgentToConfig,
6
- getReviewAgentsDir,
7
- getReviewAgentsConfigPath,
8
- getGlobalReviewAgentsDir,
9
5
  getGlobalReviewAgentsConfigPath,
6
+ getGlobalReviewAgentsDir,
7
+ getRootReviewAgentsConfigPath,
8
+ getRootReviewAgentsDir,
9
+ getWorkspaceReviewAgentsConfigPath,
10
+ getWorkspaceReviewAgentsDir,
11
+ loadMergedReviewAgents,
12
+ resolveReviewAgentContext,
13
+ writeAgentFile,
10
14
  } from "../review/agent-loader.js";
11
15
  import { selectModelFromList, THINKING_LEVELS } from "./model.js";
12
16
  import type { ConfiguredReviewAgent, ThinkingLevel } from "../types.js";
@@ -14,34 +18,68 @@ import creatingAgentsSkill from "../../skills/creating-supi-agents/SKILL.md" wit
14
18
 
15
19
  // ── List View ──────────────────────────────────────────────────
16
20
 
17
- function buildAgentDashboard(agents: ConfiguredReviewAgent[]): string {
21
+ interface AgentDashboardContext {
22
+ workspaceRelativeDir: string | null;
23
+ }
24
+
25
+ function formatAgentSourceScope(
26
+ scope: ConfiguredReviewAgent["scope"],
27
+ context: AgentDashboardContext,
28
+ ): string {
29
+ switch (scope) {
30
+ case "global":
31
+ return "global";
32
+ case "workspace":
33
+ return "workspace";
34
+ case "root":
35
+ case undefined:
36
+ return context.workspaceRelativeDir ? "root" : "project";
37
+ }
38
+ }
39
+
40
+ function buildAgentDashboard(
41
+ agents: ConfiguredReviewAgent[],
42
+ context: AgentDashboardContext,
43
+ ): string {
18
44
  const nameCol = 18;
19
45
  const modelCol = 24;
20
46
  const thinkingCol = 12;
21
- const scopeCol = 10;
47
+ const sourceCol = 10;
22
48
 
23
- const lines: string[] = [
24
- "\n Review Agents\n",
25
- ` ${"name".padEnd(nameCol)} ${"model".padEnd(modelCol)} ${"thinking".padEnd(thinkingCol)} ${"scope".padEnd(scopeCol)} focus`,
26
- ];
49
+ const lines: string[] = ["\n Review Agents\n"];
50
+ if (context.workspaceRelativeDir) {
51
+ lines.push(` Workspace: ${context.workspaceRelativeDir}`);
52
+ lines.push(" Effective precedence: workspace → root → global");
53
+ lines.push("");
54
+ }
55
+
56
+ lines.push(
57
+ ` ${"name".padEnd(nameCol)} ${"model".padEnd(modelCol)} ${"thinking".padEnd(thinkingCol)} ${"source".padEnd(sourceCol)} focus`,
58
+ );
27
59
 
28
60
  for (const agent of agents) {
29
61
  const name = agent.name.padEnd(nameCol);
30
- const model = (agent.model ?? "\u2014").padEnd(modelCol);
31
- const thinking = (agent.thinkingLevel ?? "\u2014").padEnd(thinkingCol);
32
- const scope = (agent.scope ?? "project").padEnd(scopeCol);
62
+ const model = (agent.model ?? "").padEnd(modelCol);
63
+ const thinking = (agent.thinkingLevel ?? "").padEnd(thinkingCol);
64
+ const source = formatAgentSourceScope(agent.scope, context).padEnd(sourceCol);
33
65
  const focus = agent.focus
34
66
  ? agent.focus.length > 40
35
67
  ? agent.focus.slice(0, 37) + "..."
36
68
  : agent.focus
37
- : "\u2014";
38
- lines.push(` ${name} ${model} ${thinking} ${scope} ${focus}`);
69
+ : "";
70
+ lines.push(` ${name} ${model} ${thinking} ${source} ${focus}`);
39
71
  }
40
72
 
41
- const globalCount = agents.filter((a) => a.scope === "global").length;
42
- const projectCount = agents.filter((a) => a.scope === "project" || !a.scope).length;
73
+ const globalCount = agents.filter((agent) => agent.scope === "global").length;
74
+ const rootCount = agents.filter((agent) => agent.scope === "root" || !agent.scope).length;
75
+ const workspaceCount = agents.filter((agent) => agent.scope === "workspace").length;
76
+
43
77
  lines.push("");
44
- lines.push(` ${agents.length} agent(s) (${projectCount} project, ${globalCount} global)`);
78
+ if (context.workspaceRelativeDir) {
79
+ lines.push(` ${agents.length} agent(s) (${workspaceCount} workspace, ${rootCount} root, ${globalCount} global)`);
80
+ } else {
81
+ lines.push(` ${agents.length} agent(s) (${rootCount} project, ${globalCount} global)`);
82
+ }
45
83
  lines.push("");
46
84
 
47
85
  return lines.join("\n");
@@ -51,6 +89,58 @@ function buildAgentDashboard(agents: ConfiguredReviewAgent[]): string {
51
89
 
52
90
  const KEBAB_CASE_RE = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
53
91
 
92
+ type AgentCreateScope = "global" | "project";
93
+ type AgentCreateStorageScope = "global" | "root" | "workspace";
94
+
95
+ interface AgentCreateDestination {
96
+ agentsDir: string;
97
+ configPath: string;
98
+ scope: AgentCreateStorageScope;
99
+ }
100
+
101
+ function matchesCreateScope(
102
+ agent: ConfiguredReviewAgent,
103
+ scope: AgentCreateStorageScope,
104
+ ): boolean {
105
+ switch (scope) {
106
+ case "global":
107
+ return agent.scope === "global";
108
+ case "workspace":
109
+ return agent.scope === "workspace";
110
+ case "root":
111
+ return agent.scope === "root" || agent.scope === undefined;
112
+ }
113
+ }
114
+
115
+ function resolveAgentCreateDestination(
116
+ platform: Platform,
117
+ cwd: string,
118
+ scope: AgentCreateScope,
119
+ ): AgentCreateDestination {
120
+ if (scope === "global") {
121
+ return {
122
+ agentsDir: getGlobalReviewAgentsDir(platform.paths),
123
+ configPath: getGlobalReviewAgentsConfigPath(platform.paths),
124
+ scope: "global",
125
+ };
126
+ }
127
+
128
+ const context = resolveReviewAgentContext(cwd);
129
+ if (context.workspaceRelativeDir) {
130
+ return {
131
+ agentsDir: getWorkspaceReviewAgentsDir(platform.paths, context.repoRoot, context.workspaceRelativeDir),
132
+ configPath: getWorkspaceReviewAgentsConfigPath(platform.paths, context.repoRoot, context.workspaceRelativeDir),
133
+ scope: "workspace",
134
+ };
135
+ }
136
+
137
+ return {
138
+ agentsDir: getRootReviewAgentsDir(platform.paths, context.repoRoot),
139
+ configPath: getRootReviewAgentsConfigPath(platform.paths, context.repoRoot),
140
+ scope: "root",
141
+ };
142
+ }
143
+
54
144
  export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<void> {
55
145
  if (!ctx.hasUI) {
56
146
  ctx.ui.notify("Agent creation requires interactive mode", "warning");
@@ -64,7 +154,7 @@ export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<
64
154
  ], { helpText: "Select scope · Esc to cancel" });
65
155
 
66
156
  if (!scopeChoice) return;
67
- const scope: "global" | "project" = scopeChoice === "Global" ? "global" : "project";
157
+ const scope: AgentCreateScope = scopeChoice === "Global" ? "global" : "project";
68
158
 
69
159
  // Step 2: Agent name
70
160
  const nameInput = await ctx.ui.input("Agent name (kebab-case)", {
@@ -79,14 +169,16 @@ export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<
79
169
  return;
80
170
  }
81
171
 
172
+ const destination = resolveAgentCreateDestination(platform, ctx.cwd, scope);
173
+
82
174
  // Check for name collision in target scope
83
175
  try {
84
176
  const existing = await loadMergedReviewAgents(platform.paths, ctx.cwd);
85
177
  const collision = existing.agents.find(
86
- (a) => a.name === agentName && (a.scope ?? "project") === scope,
178
+ (agent) => agent.name === agentName && matchesCreateScope(agent, destination.scope),
87
179
  );
88
180
  if (collision) {
89
- ctx.ui.notify(`Agent "${agentName}" already exists in ${scope} scope`, "error");
181
+ ctx.ui.notify(`Agent "${agentName}" already exists in ${destination.scope} scope`, "error");
90
182
  return;
91
183
  }
92
184
  } catch {
@@ -131,20 +223,13 @@ export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<
131
223
  }
132
224
 
133
225
  // Step 6: Save
134
- const agentsDir = scope === "global"
135
- ? getGlobalReviewAgentsDir(platform.paths)
136
- : getReviewAgentsDir(platform.paths, ctx.cwd);
137
- const configPath = scope === "global"
138
- ? getGlobalReviewAgentsConfigPath(platform.paths)
139
- : getReviewAgentsConfigPath(platform.paths, ctx.cwd);
140
-
141
- const fileName = writeAgentFile(agentsDir, agentName, {
226
+ const fileName = writeAgentFile(destination.agentsDir, agentName, {
142
227
  name: agentName,
143
228
  description: `${agentName} review agent`,
144
229
  focus: null,
145
230
  }, promptBody.trim());
146
231
 
147
- await addAgentToConfig(configPath, {
232
+ await addAgentToConfig(destination.configPath, {
148
233
  name: agentName,
149
234
  enabled: true,
150
235
  data: fileName,
@@ -160,19 +245,20 @@ export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<
160
245
  function loadSkillAndSteer(
161
246
  platform: Platform,
162
247
  ctx: any,
163
- scope: "global" | "project",
248
+ scope: AgentCreateScope,
164
249
  agentName: string,
165
250
  model: string | null,
166
251
  thinkingLevel: ThinkingLevel | null,
167
252
  ): void {
168
- const agentsDir = scope === "global"
169
- ? getGlobalReviewAgentsDir(platform.paths)
170
- : getReviewAgentsDir(platform.paths, ctx.cwd);
171
- const configPath = scope === "global"
172
- ? getGlobalReviewAgentsConfigPath(platform.paths)
173
- : getReviewAgentsConfigPath(platform.paths, ctx.cwd);
174
-
175
- const prompt = buildSkillSteerPrompt(agentName, scope, agentsDir, configPath, model, thinkingLevel);
253
+ const destination = resolveAgentCreateDestination(platform, ctx.cwd, scope);
254
+ const prompt = buildSkillSteerPrompt(
255
+ agentName,
256
+ scope,
257
+ destination.agentsDir,
258
+ destination.configPath,
259
+ model,
260
+ thinkingLevel,
261
+ );
176
262
 
177
263
  platform.sendMessage(
178
264
  {
@@ -209,7 +295,7 @@ ${creatingAgentsSkill}
209
295
  ## Save Instructions
210
296
 
211
297
  Once the user approves the agent design, save it:
212
- 1. Write the markdown file to: ${agentsDir}/${agentName}.md
298
+ 1. Write the markdown file to: ${path.join(agentsDir, `${agentName}.md`)}
213
299
  - The file MUST have YAML frontmatter (name, description, focus) and a prompt body ending with {output_instructions}
214
300
  2. Update config at: ${configPath}
215
301
  - Add entry: { name: "${agentName}", enabled: true, data: "${agentName}.md", model: ${model ? `"${model}"` : "null"}, thinkingLevel: ${thinkingLevel ? `"${thinkingLevel}"` : "null"} }
@@ -237,7 +323,10 @@ export function handleAgents(platform: Platform, ctx: any, args?: string): void
237
323
 
238
324
  async function showAgentsDashboard(platform: Platform, ctx: any): Promise<void> {
239
325
  const result = await loadMergedReviewAgents(platform.paths, ctx.cwd);
240
- const dashboard = buildAgentDashboard(result.agents);
326
+ const dashboardContext = resolveReviewAgentContext(ctx.cwd);
327
+ const dashboard = buildAgentDashboard(result.agents, {
328
+ workspaceRelativeDir: dashboardContext.workspaceRelativeDir,
329
+ });
241
330
  ctx.ui.notify(dashboard, "info");
242
331
  }
243
332