supipowers 1.5.3 → 2.0.1

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 +135 -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 +268 -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
@@ -7,6 +7,10 @@ import { detectContextMode } from "../context-mode/detector.js";
7
7
  import { isLspAvailable } from "../lsp/detector.js";
8
8
  import { summarizeEnabledGates } from "../quality/setup.js";
9
9
  import { DEPENDENCIES } from "../deps/registry.js";
10
+ import { formatReliabilitySection, loadReliabilitySummaries } from "../storage/reliability-metrics.js";
11
+ import { getMetricsStore, getSessionId } from "../context-mode/hooks.js";
12
+ import { getProjectStatePath, getProjectStateDir } from "../workspace/state-paths.js";
13
+ import { basename } from "node:path";
10
14
 
11
15
  export interface CheckResult {
12
16
  name: string;
@@ -225,22 +229,210 @@ const CTX_TOOL_NAMES: Record<string, string> = {
225
229
  ctxIndex: "ctx_index",
226
230
  ctxSearch: "ctx_search",
227
231
  ctxFetchAndIndex: "ctx_fetch_and_index",
232
+ ctxStats: "ctx_stats",
233
+ ctxPurge: "ctx_purge",
234
+ ctxRepomap: "ctx_repomap",
235
+ ctxSymbol: "ctx_symbol",
228
236
  };
229
237
 
230
- export function checkContextMode(_activeTools: string[]): CheckResult {
231
- const status = detectContextMode();
238
+ export function checkContextMode(activeTools: string[]): CheckResult {
239
+ // Reflect the same active-tool-aware view the runtime routing/prompt layers
240
+ // use, so the doctor cannot claim ctx_* tools are available when the model
241
+ // can't actually call them.
242
+ const status = detectContextMode(activeTools);
232
243
 
233
244
  const foundNames = Object.entries(status.tools)
234
- .filter(([, v]) => v)
235
- .map(([k]) => CTX_TOOL_NAMES[k] || k);
245
+ .filter(([, value]) => value)
246
+ .map(([key]) => CTX_TOOL_NAMES[key] || key);
247
+
248
+ if (!status.available) {
249
+ return {
250
+ name: "Context Mode",
251
+ presence: { ok: false, detail: "No ctx_* tools active in this session" },
252
+ functional: { ok: false, detail: "Inactive — routing rescue path will be skipped this turn" },
253
+ };
254
+ }
236
255
 
237
256
  return {
238
257
  name: "Context Mode",
239
- presence: { ok: true, detail: "Native tools (built-in)" },
258
+ presence: { ok: true, detail: "Native tools active" },
240
259
  functional: { ok: true, detail: foundNames.join(", ") },
241
260
  };
242
261
  }
243
262
 
263
+ export function checkLazyTools(platform: Platform, cwd: string): CheckResult {
264
+ const inspection = (() => {
265
+ try {
266
+ return inspectConfig(platform.paths, cwd);
267
+ } catch (error) {
268
+ return error instanceof Error ? error : new Error(String(error));
269
+ }
270
+ })();
271
+
272
+ if (inspection instanceof Error) {
273
+ return {
274
+ name: "Lazy Tools",
275
+ presence: { ok: false, detail: `Unable to inspect config: ${inspection.message}` },
276
+ };
277
+ }
278
+
279
+ if (!inspection.effectiveConfig) {
280
+ return {
281
+ name: "Lazy Tools",
282
+ presence: { ok: false, detail: "Skipped: config is invalid" },
283
+ functional: { ok: false, detail: formatConfigErrors(inspection) },
284
+ };
285
+ }
286
+
287
+ const config = inspection.effectiveConfig;
288
+
289
+ if (!config.contextMode.enabled) {
290
+ return {
291
+ name: "Lazy Tools",
292
+ presence: { ok: false, detail: "Disabled (contextMode.enabled = false)" },
293
+ };
294
+ }
295
+
296
+ if (!config.contextMode.lazyTools.enabled) {
297
+ return {
298
+ name: "Lazy Tools",
299
+ presence: { ok: false, detail: "Disabled (contextMode.lazyTools.enabled = false)" },
300
+ };
301
+ }
302
+
303
+ if (!platform.capabilities.activeToolFiltering) {
304
+ return {
305
+ name: "Lazy Tools",
306
+ presence: {
307
+ ok: false,
308
+ detail:
309
+ "Degraded: contextMode.lazyTools.enabled is true but active-tool filtering is unavailable; upgrade OMP/supipowers adapter or disable contextMode.lazyTools.enabled.",
310
+ },
311
+ };
312
+ }
313
+
314
+ return {
315
+ name: "Lazy Tools",
316
+ presence: { ok: true, detail: "L7 active-tool filtering available" },
317
+ functional: { ok: true, detail: `mode: ${config.contextMode.lazyTools.mode}` },
318
+ };
319
+ }
320
+
321
+ /** Metrics health checks for the L1 measurement layer. */
322
+ export function checkMetrics(
323
+ platform: Platform,
324
+ cwd: string,
325
+ now = Date.now(),
326
+ ): { section: SectionResult; absDbPath: string } {
327
+ const absDbPath = getProjectStatePath(
328
+ platform.paths,
329
+ cwd,
330
+ "sessions",
331
+ "metrics.db",
332
+ );
333
+ const store = getMetricsStore();
334
+ const sessionId = getSessionId();
335
+
336
+ const reachable: CheckResult = store
337
+ ? {
338
+ name: "metrics-db-reachable",
339
+ presence: { ok: true, detail: `Metrics DB: ${absDbPath}` },
340
+ functional: { ok: true, detail: "Open" },
341
+ }
342
+ : (() => {
343
+ // Differentiate the two reasons `getMetricsStore()` returns null:
344
+ // 1. `contextMode.enabled = false` — the hook never registered, so the
345
+ // remediation is to flip the config flag.
346
+ // 2. Init failed (FS perms, sqlite error, etc.) — the hook registered
347
+ // but `ensureMetricsStore` returned null and logged the error.
348
+ // Saying "run /supi:context to bootstrap" was wrong: that command only
349
+ // reads the ref and never initializes the store.
350
+ const enabled = (() => {
351
+ try {
352
+ return inspectConfig(platform.paths, cwd).effectiveConfig?.contextMode?.enabled ?? true;
353
+ } catch {
354
+ return true;
355
+ }
356
+ })();
357
+ const detail = enabled
358
+ ? `Failed to initialize \u2014 check session_start logs (${absDbPath})`
359
+ : `Disabled (contextMode.enabled = false) \u2014 set it to true in config to enable metrics (${absDbPath})`;
360
+ return {
361
+ name: "metrics-db-reachable",
362
+ presence: { ok: false, detail },
363
+ };
364
+ })();
365
+
366
+ const writeFailures = (() => {
367
+ try {
368
+ return store?.getSessionWriteFailures(sessionId) ?? 0;
369
+ } catch {
370
+ return 0;
371
+ }
372
+ })();
373
+ const writeHealthy: CheckResult = store
374
+ ? {
375
+ name: "metrics-write-healthy",
376
+ presence: {
377
+ ok: writeFailures === 0,
378
+ detail:
379
+ writeFailures === 0
380
+ ? "No write failures this session"
381
+ : `${writeFailures} write_failures \u2014 see /supi:clear or filesystem health`,
382
+ },
383
+ }
384
+ : {
385
+ name: "metrics-write-healthy",
386
+ presence: { ok: false, detail: "Skipped \u2014 metrics store unavailable" },
387
+ };
388
+
389
+ const lastPruneAt = (() => {
390
+ try {
391
+ // Use the store's bound slug rather than re-deriving from cwd; the store
392
+ // is the source of truth for which project_meta_metrics row matters.
393
+ const slug = store?.projectSlug ?? basename(getProjectStateDir(platform.paths, cwd));
394
+ return store?.getProjectMeta(slug)?.last_prune_at ?? null;
395
+ } catch {
396
+ return null;
397
+ }
398
+ })();
399
+ const ONE_DAY_MS = 24 * 60 * 60 * 1000;
400
+ const pruneFresh: CheckResult = !store
401
+ ? {
402
+ name: "metrics-prune-fresh",
403
+ presence: { ok: false, detail: "Skipped \u2014 metrics store unavailable" },
404
+ }
405
+ : lastPruneAt === null
406
+ ? {
407
+ name: "metrics-prune-fresh",
408
+ presence: {
409
+ ok: false,
410
+ detail: "Never pruned; runs on session_shutdown",
411
+ },
412
+ }
413
+ : now - lastPruneAt <= ONE_DAY_MS
414
+ ? {
415
+ name: "metrics-prune-fresh",
416
+ presence: { ok: true, detail: "Pruned within 24h" },
417
+ }
418
+ : {
419
+ name: "metrics-prune-fresh",
420
+ presence: {
421
+ ok: false,
422
+ detail: `Stale (${Math.round((now - lastPruneAt) / ONE_DAY_MS)}d ago)`,
423
+ },
424
+ };
425
+
426
+ return {
427
+ section: {
428
+ title: `Metrics (${absDbPath})`,
429
+ checks: [reachable, writeHealthy, pruneFresh],
430
+ },
431
+ absDbPath,
432
+ };
433
+ }
434
+
435
+
244
436
  export async function checkNpm(platform: Platform): Promise<CheckResult> {
245
437
  try {
246
438
  const vResult = await platform.exec("npm", ["--version"]);
@@ -279,6 +471,7 @@ export async function runDoctorChecks(platform: Platform, cwd: string): Promise<
279
471
  checkLsp(activeTools),
280
472
  mcpResult,
281
473
  checkContextMode(activeTools),
474
+ checkLazyTools(platform, cwd),
282
475
  await checkNpm(platform),
283
476
  ];
284
477
 
@@ -286,13 +479,41 @@ export async function runDoctorChecks(platform: Platform, cwd: string): Promise<
286
479
  const mcpAvailable = mcpResult.presence.ok;
287
480
  const capChecks = checkCapabilities(platform.capabilities, mcpAvailable);
288
481
 
482
+ const metrics = checkMetrics(platform, cwd);
483
+
289
484
  return [
290
485
  { title: "Core Infrastructure", checks: core },
291
486
  { title: "Integrations", checks: integrations },
292
487
  { title: "Platform Capabilities", checks: capChecks },
488
+ metrics.section,
293
489
  ];
294
490
  }
295
491
 
492
+ /**
493
+ * Recommended OMP settings that materially improve supipowers UX.
494
+ *
495
+ * These are *suggestions*, not health checks — supipowers cannot read OMP's
496
+ * `settings.json` directly, so we cannot detect whether the user has the
497
+ * setting on. We surface them at the bottom of `/supi:doctor` as a
498
+ * non-failing tip block.
499
+ */
500
+ export function getDoctorRecommendations(): string[] {
501
+ return [
502
+ "Set `tools.elideFileMutationInputs: true` (OMP ≥14.7.0) — elides `write`/`edit`/`apply_patch` payloads from history after success. Saves significant context on long sessions like `/supi:ultraplan execute` and `/supi:harness implement`.",
503
+ "Update to OMP ≥14.7.2 — fixes the `Working…` spinner staying active after read-only commands such as `/supi:status`, `/supi:doctor`, `/supi:context`, and `/supi:clear`. (oh-my-pi#927)",
504
+ ];
505
+ }
506
+
507
+ function formatRecommendationsSection(recommendations: string[]): string[] {
508
+ if (recommendations.length === 0) return [];
509
+ const lines: string[] = ["Recommendations"];
510
+ for (const tip of recommendations) {
511
+ lines.push(` → ${tip}`);
512
+ }
513
+ lines.push("");
514
+ return lines;
515
+ }
516
+
296
517
  function formatReport(sections: SectionResult[]): string {
297
518
  const lines: string[] = ["/supi:doctor", ""];
298
519
  for (const section of sections) {
@@ -302,17 +523,23 @@ function formatReport(sections: SectionResult[]): string {
302
523
  }
303
524
  lines.push("");
304
525
  }
526
+ lines.push(...formatRecommendationsSection(getDoctorRecommendations()));
305
527
  lines.push(formatSummary(sections));
306
528
  return lines.join("\n");
307
529
  }
308
530
 
531
+ export function formatReliabilityReportLines(platform: Platform, cwd: string): string[] {
532
+ return formatReliabilitySection(loadReliabilitySummaries(platform.paths, cwd));
533
+ }
534
+
309
535
  export function handleDoctor(platform: Platform, ctx: PlatformContext): void {
310
536
  if (!ctx.hasUI) return;
311
537
 
312
538
  void (async () => {
313
539
  try {
314
540
  const sections = await runDoctorChecks(platform, ctx.cwd);
315
- const report = formatReport(sections);
541
+ const reliabilityLines = formatReliabilityReportLines(platform, ctx.cwd);
542
+ const report = `${formatReport(sections)}\n\n${reliabilityLines.join("\n")}`;
316
543
  ctx.ui.notify(report, "info");
317
544
  } catch (err) {
318
545
  ctx.ui.notify(`Doctor failed: ${(err as Error).message}`, "error");
@@ -333,6 +560,7 @@ const CAPABILITY_LABELS: Partial<Record<keyof PlatformCapabilities, string>> = {
333
560
  compactionHooks: "Context compression",
334
561
  customWidgets: "Progress widgets",
335
562
  registerTool: "Custom tool registration",
563
+ activeToolFiltering: "Active-tool filtering",
336
564
  };
337
565
 
338
566
  export function checkCapabilities(