supipowers 1.5.2 → 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 +149 -45
  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 +19 -9
  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 +298 -127
  211. package/src/review/fixer.ts +10 -6
  212. package/src/review/multi-agent-runner.ts +115 -14
  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 +11 -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 +1401 -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,45 +1,85 @@
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
- import { selectModelFromList } from "./model.js";
12
- import type { ConfiguredReviewAgent } from "../types.js";
15
+ import { selectModelFromList, THINKING_LEVELS } from "./model.js";
16
+ import type { ConfiguredReviewAgent, ThinkingLevel } from "../types.js";
13
17
  import creatingAgentsSkill from "../../skills/creating-supi-agents/SKILL.md" with { type: "text" };
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
- const scopeCol = 10;
46
+ const thinkingCol = 12;
47
+ const sourceCol = 10;
48
+
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
+ }
21
55
 
22
- const lines: string[] = [
23
- "\n Review Agents\n",
24
- ` ${"name".padEnd(nameCol)} ${"model".padEnd(modelCol)} ${"scope".padEnd(scopeCol)} focus`,
25
- ];
56
+ lines.push(
57
+ ` ${"name".padEnd(nameCol)} ${"model".padEnd(modelCol)} ${"thinking".padEnd(thinkingCol)} ${"source".padEnd(sourceCol)} focus`,
58
+ );
26
59
 
27
60
  for (const agent of agents) {
28
61
  const name = agent.name.padEnd(nameCol);
29
62
  const model = (agent.model ?? "—").padEnd(modelCol);
30
- const scope = (agent.scope ?? "project").padEnd(scopeCol);
63
+ const thinking = (agent.thinkingLevel ?? "").padEnd(thinkingCol);
64
+ const source = formatAgentSourceScope(agent.scope, context).padEnd(sourceCol);
31
65
  const focus = agent.focus
32
66
  ? agent.focus.length > 40
33
67
  ? agent.focus.slice(0, 37) + "..."
34
68
  : agent.focus
35
69
  : "—";
36
- lines.push(` ${name} ${model} ${scope} ${focus}`);
70
+ lines.push(` ${name} ${model} ${thinking} ${source} ${focus}`);
37
71
  }
38
72
 
39
- const globalCount = agents.filter((a) => a.scope === "global").length;
40
- 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
+
41
77
  lines.push("");
42
- 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
+ }
43
83
  lines.push("");
44
84
 
45
85
  return lines.join("\n");
@@ -49,6 +89,58 @@ function buildAgentDashboard(agents: ConfiguredReviewAgent[]): string {
49
89
 
50
90
  const KEBAB_CASE_RE = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
51
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
+
52
144
  export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<void> {
53
145
  if (!ctx.hasUI) {
54
146
  ctx.ui.notify("Agent creation requires interactive mode", "warning");
@@ -62,7 +154,7 @@ export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<
62
154
  ], { helpText: "Select scope · Esc to cancel" });
63
155
 
64
156
  if (!scopeChoice) return;
65
- const scope: "global" | "project" = scopeChoice === "Global" ? "global" : "project";
157
+ const scope: AgentCreateScope = scopeChoice === "Global" ? "global" : "project";
66
158
 
67
159
  // Step 2: Agent name
68
160
  const nameInput = await ctx.ui.input("Agent name (kebab-case)", {
@@ -77,14 +169,16 @@ export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<
77
169
  return;
78
170
  }
79
171
 
172
+ const destination = resolveAgentCreateDestination(platform, ctx.cwd, scope);
173
+
80
174
  // Check for name collision in target scope
81
175
  try {
82
176
  const existing = await loadMergedReviewAgents(platform.paths, ctx.cwd);
83
177
  const collision = existing.agents.find(
84
- (a) => a.name === agentName && (a.scope ?? "project") === scope,
178
+ (agent) => agent.name === agentName && matchesCreateScope(agent, destination.scope),
85
179
  );
86
180
  if (collision) {
87
- ctx.ui.notify(`Agent "${agentName}" already exists in ${scope} scope`, "error");
181
+ ctx.ui.notify(`Agent "${agentName}" already exists in ${destination.scope} scope`, "error");
88
182
  return;
89
183
  }
90
184
  } catch {
@@ -95,7 +189,16 @@ export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<
95
189
  const modelInput = await selectModelFromList(ctx);
96
190
  // null means "inherit default" — that's fine
97
191
 
98
- // Step 4: Prompt source
192
+ // Step 4: Thinking level
193
+ const thinkingChoice = await ctx.ui.select(
194
+ "Thinking level",
195
+ THINKING_LEVELS.map((t) => t.label),
196
+ { helpText: "Select thinking level · Esc to cancel" },
197
+ );
198
+ if (!thinkingChoice) return;
199
+ const thinkingLevel: ThinkingLevel | null = THINKING_LEVELS.find((t) => t.label === thinkingChoice)?.value ?? null;
200
+
201
+ // Step 5: Prompt source
99
202
  const promptChoice = await ctx.ui.select("Agent prompt", [
100
203
  "Send a prompt",
101
204
  "Create from zero",
@@ -105,7 +208,7 @@ export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<
105
208
 
106
209
  if (promptChoice === "Create from zero") {
107
210
  // Load the creating-supi-agents skill via steer
108
- loadSkillAndSteer(platform, ctx, scope, agentName, modelInput);
211
+ loadSkillAndSteer(platform, ctx, scope, agentName, modelInput, thinkingLevel);
109
212
  return;
110
213
  }
111
214
 
@@ -119,25 +222,19 @@ export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<
119
222
  return;
120
223
  }
121
224
 
122
- // Step 5: Save
123
- const agentsDir = scope === "global"
124
- ? getGlobalReviewAgentsDir(platform.paths)
125
- : getReviewAgentsDir(platform.paths, ctx.cwd);
126
- const configPath = scope === "global"
127
- ? getGlobalReviewAgentsConfigPath(platform.paths)
128
- : getReviewAgentsConfigPath(platform.paths, ctx.cwd);
129
-
130
- const fileName = writeAgentFile(agentsDir, agentName, {
225
+ // Step 6: Save
226
+ const fileName = writeAgentFile(destination.agentsDir, agentName, {
131
227
  name: agentName,
132
228
  description: `${agentName} review agent`,
133
229
  focus: null,
134
230
  }, promptBody.trim());
135
231
 
136
- await addAgentToConfig(configPath, {
232
+ await addAgentToConfig(destination.configPath, {
137
233
  name: agentName,
138
234
  enabled: true,
139
235
  data: fileName,
140
236
  model: modelInput,
237
+ thinkingLevel,
141
238
  });
142
239
 
143
240
  ctx.ui.notify(`Agent "${agentName}" created (${scope})`, "info");
@@ -148,18 +245,20 @@ export async function runAgentCreateFlow(platform: Platform, ctx: any): Promise<
148
245
  function loadSkillAndSteer(
149
246
  platform: Platform,
150
247
  ctx: any,
151
- scope: "global" | "project",
248
+ scope: AgentCreateScope,
152
249
  agentName: string,
153
250
  model: string | null,
251
+ thinkingLevel: ThinkingLevel | null,
154
252
  ): void {
155
- const agentsDir = scope === "global"
156
- ? getGlobalReviewAgentsDir(platform.paths)
157
- : getReviewAgentsDir(platform.paths, ctx.cwd);
158
- const configPath = scope === "global"
159
- ? getGlobalReviewAgentsConfigPath(platform.paths)
160
- : getReviewAgentsConfigPath(platform.paths, ctx.cwd);
161
-
162
- const prompt = buildSkillSteerPrompt(agentName, scope, agentsDir, configPath, model);
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
+ );
163
262
 
164
263
  platform.sendMessage(
165
264
  {
@@ -177,6 +276,7 @@ function buildSkillSteerPrompt(
177
276
  agentsDir: string,
178
277
  configPath: string,
179
278
  model: string | null,
279
+ thinkingLevel: ThinkingLevel | null,
180
280
  ): string {
181
281
  return `You are guiding the user through creating a new AI review agent for supipowers' multi-agent code review pipeline.
182
282
 
@@ -184,6 +284,7 @@ function buildSkillSteerPrompt(
184
284
  - **Name**: ${agentName}
185
285
  - **Scope**: ${scope}
186
286
  - **Model**: ${model ?? "inherit default"}
287
+ - **Thinking Level**: ${thinkingLevel ?? "inherit default"}
187
288
  - **Target directory**: ${agentsDir}
188
289
  - **Config path**: ${configPath}
189
290
 
@@ -194,10 +295,10 @@ ${creatingAgentsSkill}
194
295
  ## Save Instructions
195
296
 
196
297
  Once the user approves the agent design, save it:
197
- 1. Write the markdown file to: ${agentsDir}/${agentName}.md
298
+ 1. Write the markdown file to: ${path.join(agentsDir, `${agentName}.md`)}
198
299
  - The file MUST have YAML frontmatter (name, description, focus) and a prompt body ending with {output_instructions}
199
300
  2. Update config at: ${configPath}
200
- - Add entry: { name: "${agentName}", enabled: true, data: "${agentName}.md", model: ${model ? `"${model}"` : "null"} }
301
+ - Add entry: { name: "${agentName}", enabled: true, data: "${agentName}.md", model: ${model ? `"${model}"` : "null"}, thinkingLevel: ${thinkingLevel ? `"${thinkingLevel}"` : "null"} }
201
302
 
202
303
  Use the \`writeAgentFile\` and \`addAgentToConfig\` functions from \`src/review/agent-loader.ts\` if you have tool access, or write the files directly.
203
304
 
@@ -222,7 +323,10 @@ export function handleAgents(platform: Platform, ctx: any, args?: string): void
222
323
 
223
324
  async function showAgentsDashboard(platform: Platform, ctx: any): Promise<void> {
224
325
  const result = await loadMergedReviewAgents(platform.paths, ctx.cwd);
225
- const dashboard = buildAgentDashboard(result.agents);
326
+ const dashboardContext = resolveReviewAgentContext(ctx.cwd);
327
+ const dashboard = buildAgentDashboard(result.agents, {
328
+ workspaceRelativeDir: dashboardContext.workspaceRelativeDir,
329
+ });
226
330
  ctx.ui.notify(dashboard, "info");
227
331
  }
228
332