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.
- package/README.md +14 -8
- package/bin/install.mjs +20 -5
- package/bin/install.ts +95 -0
- package/package.json +8 -4
- package/skills/context-mode/SKILL.md +17 -10
- package/skills/harness/SKILL.md +94 -0
- package/skills/ui-design/SKILL.md +63 -0
- package/skills/ui-design/sub-agent-templates/component-builder.md +29 -0
- package/skills/ui-design/sub-agent-templates/design-critic.md +46 -0
- package/skills/ui-design/sub-agent-templates/pencil/component-builder.md +29 -0
- package/skills/ui-design/sub-agent-templates/pencil/design-critic.md +42 -0
- package/skills/ui-design/sub-agent-templates/pencil/section-assembler.md +27 -0
- package/skills/ui-design/sub-agent-templates/section-assembler.md +27 -0
- package/skills/ultraplan-discover/SKILL.md +96 -0
- package/skills/ultraplan-intake/SKILL.md +89 -0
- package/skills/ultraplan-research/SKILL.md +129 -0
- package/skills/ultraplan-review/SKILL.md +86 -0
- package/skills/ultraplan-review-scope/SKILL.md +111 -0
- package/skills/ultraplan-review-structure/SKILL.md +120 -0
- package/skills/ultraplan-review-tdd/SKILL.md +142 -0
- package/skills/ultraplan-scout/SKILL.md +110 -0
- package/skills/ultraplan-synthesize/SKILL.md +124 -0
- package/src/{quality/ai-session.ts → ai/final-message.ts} +27 -0
- package/src/ai/schema-text.ts +129 -0
- package/src/ai/structured-output.ts +274 -0
- package/src/ai/template.ts +27 -0
- package/src/bootstrap.ts +63 -28
- package/src/commands/agents.ts +131 -42
- package/src/commands/ai-review.ts +251 -30
- package/src/commands/clear.ts +434 -0
- package/src/commands/commit.ts +1 -0
- package/src/commands/config.ts +242 -44
- package/src/commands/context.ts +55 -28
- package/src/commands/doctor.ts +234 -6
- package/src/commands/fix-pr.ts +306 -131
- package/src/commands/generate.ts +111 -21
- package/src/commands/memory.ts +192 -0
- package/src/commands/model-picker.ts +28 -21
- package/src/commands/model.ts +18 -8
- package/src/commands/optimize-context.ts +408 -29
- package/src/commands/plan.ts +2 -0
- package/src/commands/qa.ts +312 -137
- package/src/commands/release.ts +259 -76
- package/src/commands/review.ts +293 -59
- package/src/commands/status.ts +200 -13
- package/src/commands/supi.ts +3 -35
- package/src/commands/ui-design.ts +394 -0
- package/src/commands/ultraplan.ts +1518 -0
- package/src/commands/update.ts +86 -0
- package/src/config/defaults.ts +62 -0
- package/src/config/loader.ts +448 -60
- package/src/config/schema.ts +108 -2
- package/src/context/optimizer.ts +25 -33
- package/src/context/rule-renderer.ts +223 -0
- package/src/context/savings.ts +258 -0
- package/src/context/startup-check.ts +380 -0
- package/src/context/startup-optimizer.ts +355 -0
- package/src/context/tokenignore.ts +146 -0
- package/src/context-mode/cache-handle.ts +49 -0
- package/src/context-mode/cache-preview.ts +71 -0
- package/src/context-mode/cache-store.ts +738 -0
- package/src/context-mode/compressor.ts +131 -26
- package/src/context-mode/dedup.ts +108 -0
- package/src/context-mode/detector.ts +35 -4
- package/src/context-mode/event-extractor.ts +14 -12
- package/src/context-mode/event-store.ts +91 -36
- package/src/context-mode/hooks.ts +798 -56
- package/src/context-mode/knowledge/store.ts +255 -11
- package/src/context-mode/memory-store.ts +325 -0
- package/src/context-mode/metrics-recorder.ts +158 -0
- package/src/context-mode/metrics-store.ts +765 -0
- package/src/context-mode/model.ts +24 -0
- package/src/context-mode/processor-keys.ts +29 -0
- package/src/context-mode/processors/build.ts +66 -0
- package/src/context-mode/processors/docker.ts +57 -0
- package/src/context-mode/processors/git.ts +111 -0
- package/src/context-mode/processors/json.ts +112 -0
- package/src/context-mode/processors/k8s.ts +67 -0
- package/src/context-mode/processors/lint.ts +67 -0
- package/src/context-mode/processors/log.ts +86 -0
- package/src/context-mode/processors/registry.ts +116 -0
- package/src/context-mode/processors/test-runner.ts +102 -0
- package/src/context-mode/processors/types.ts +20 -0
- package/src/context-mode/repomap.ts +400 -0
- package/src/context-mode/routing.ts +97 -24
- package/src/context-mode/sandbox/runners.ts +5 -1
- package/src/context-mode/snapshot-builder.ts +106 -11
- package/src/context-mode/source-hash.ts +173 -0
- package/src/context-mode/tool-name.ts +11 -0
- package/src/context-mode/tools.ts +654 -22
- package/src/context-mode/web/fetcher.ts +31 -12
- package/src/debug/logger.ts +2 -1
- package/src/deps/registry.ts +1 -1
- package/src/discipline/failure-summarizer.ts +170 -0
- package/src/discipline/failure-taxonomy.ts +131 -0
- package/src/discipline/workflow-invariants.ts +125 -0
- package/src/discovery/index.ts +31 -0
- package/src/discovery/lsp.ts +87 -0
- package/src/discovery/rank.ts +144 -0
- package/src/discovery/sources.ts +89 -0
- package/src/discovery/workflow.ts +87 -0
- package/src/docs/contracts.ts +39 -0
- package/src/docs/drift.ts +117 -87
- package/src/fix-pr/assessment.ts +200 -0
- package/src/fix-pr/contracts.ts +47 -0
- package/src/fix-pr/fetch-comments.ts +80 -0
- package/src/fix-pr/prompt-builder.ts +58 -40
- package/src/fix-pr/scripts/exec.ts +34 -0
- package/src/fix-pr/scripts/trigger-review.ts +106 -0
- package/src/fix-pr/scripts/wait-and-check.ts +108 -0
- package/src/fix-pr/types.ts +4 -0
- package/src/git/branch-finish.ts +5 -0
- package/src/git/commit-contract.ts +83 -0
- package/src/git/commit.ts +121 -184
- package/src/git/status.ts +62 -8
- package/src/harness/anti_slop/architecture-parser.ts +210 -0
- package/src/harness/anti_slop/backend-factory.ts +30 -0
- package/src/harness/anti_slop/backend.ts +140 -0
- package/src/harness/anti_slop/desloppify-adapter.ts +319 -0
- package/src/harness/anti_slop/fallow-adapter.ts +305 -0
- package/src/harness/anti_slop/installer.ts +227 -0
- package/src/harness/anti_slop/queue.ts +216 -0
- package/src/harness/anti_slop/recommend.ts +84 -0
- package/src/harness/anti_slop/score.ts +180 -0
- package/src/harness/anti_slop/synthetic-edit-test.ts +128 -0
- package/src/harness/artifacts/agents-md.ts +88 -0
- package/src/harness/artifacts/checks-wiring.ts +57 -0
- package/src/harness/artifacts/docs-tree.ts +79 -0
- package/src/harness/artifacts/lint-configs.ts +136 -0
- package/src/harness/artifacts/review-agents.ts +67 -0
- package/src/harness/bare-entry.ts +108 -0
- package/src/harness/command.ts +1010 -0
- package/src/harness/default-agents/design.md +23 -0
- package/src/harness/default-agents/discover.md +18 -0
- package/src/harness/default-agents/implement.md +24 -0
- package/src/harness/default-agents/plan.md +19 -0
- package/src/harness/default-agents/research.md +21 -0
- package/src/harness/default-agents/validate.md +22 -0
- package/src/harness/gc/reporter.ts +28 -0
- package/src/harness/gc/runner.ts +136 -0
- package/src/harness/hooks/layer-context-inject.ts +155 -0
- package/src/harness/hooks/post-session-sweep.ts +130 -0
- package/src/harness/hooks/pre-edit-dupe-probe.ts +224 -0
- package/src/harness/hooks/register.ts +118 -0
- package/src/harness/model.ts +117 -0
- package/src/harness/pipeline.ts +348 -0
- package/src/harness/project-paths.ts +235 -0
- package/src/harness/stage-runner.ts +107 -0
- package/src/harness/stages/design.ts +386 -0
- package/src/harness/stages/discover.ts +454 -0
- package/src/harness/stages/implement.ts +162 -0
- package/src/harness/stages/plan.ts +335 -0
- package/src/harness/stages/research.ts +263 -0
- package/src/harness/stages/validate.ts +684 -0
- package/src/harness/storage.ts +467 -0
- package/src/harness/tools.ts +426 -0
- package/src/lsp/bridge.ts +56 -95
- package/src/lsp/capabilities.ts +108 -0
- package/src/lsp/contracts.ts +35 -0
- package/src/lsp/detector.ts +8 -12
- package/src/markdown-frontmatter.ts +68 -0
- package/src/mempalace/bridge.ts +135 -0
- package/src/mempalace/config.ts +75 -0
- package/src/mempalace/format.ts +163 -0
- package/src/mempalace/hooks.ts +370 -0
- package/src/mempalace/installer-helper.ts +194 -0
- package/src/mempalace/python/mempalace_bridge.py +440 -0
- package/src/mempalace/runtime.ts +565 -0
- package/src/mempalace/schema.ts +268 -0
- package/src/mempalace/session-summary.ts +198 -0
- package/src/mempalace/tool.ts +186 -0
- package/src/mempalace/uv.ts +256 -0
- package/src/migrate/runner.ts +354 -0
- package/src/planning/approval-flow.ts +206 -9
- package/src/planning/plan-writer-prompt.ts +4 -3
- package/src/planning/planning-ask-tool.ts +39 -0
- package/src/planning/render-markdown.ts +74 -0
- package/src/planning/spec.ts +42 -0
- package/src/planning/system-prompt.ts +11 -8
- package/src/planning/validate.ts +84 -0
- package/src/platform/omp.ts +15 -2
- package/src/platform/system-prompt.ts +37 -0
- package/src/platform/test-utils.ts +3 -0
- package/src/platform/types.ts +6 -1
- package/src/qa/config.ts +12 -6
- package/src/qa/detect-app-type.ts +13 -6
- package/src/qa/matrix.ts +12 -6
- package/src/qa/prompt-builder.ts +28 -30
- package/src/qa/scripts/dev-server-utils.ts +72 -0
- package/src/qa/scripts/run-e2e-tests.ts +226 -0
- package/src/qa/scripts/start-dev-server.ts +138 -0
- package/src/qa/scripts/stop-dev-server.ts +77 -0
- package/src/qa/session.ts +13 -7
- package/src/quality/ai-setup.ts +27 -25
- package/src/quality/contracts.ts +34 -0
- package/src/quality/gates/ai-review.ts +20 -58
- package/src/quality/gates/command.ts +249 -46
- package/src/quality/review-gates.ts +18 -2
- package/src/quality/runner.ts +63 -22
- package/src/quality/schemas.ts +37 -2
- package/src/quality/setup.ts +96 -16
- package/src/release/changelog.ts +1 -1
- package/src/release/channels/custom.ts +13 -3
- package/src/release/channels/types.ts +5 -0
- package/src/release/contracts.ts +90 -0
- package/src/release/executor.ts +122 -45
- package/src/release/prompt.ts +18 -2
- package/src/release/targets.ts +86 -0
- package/src/release/version.ts +96 -71
- package/src/review/agent-loader.ts +221 -109
- package/src/review/fixer.ts +10 -6
- package/src/review/multi-agent-runner.ts +114 -13
- package/src/review/output.ts +12 -139
- package/src/review/runner.ts +12 -6
- package/src/review/scope.ts +144 -24
- package/src/review/types.ts +1 -20
- package/src/review/validator.ts +12 -6
- package/src/storage/fix-pr-sessions.ts +21 -14
- package/src/storage/plans.ts +14 -5
- package/src/storage/qa-sessions.ts +25 -19
- package/src/storage/reliability-metrics.ts +180 -0
- package/src/storage/reports.ts +8 -7
- package/src/storage/review-sessions.ts +55 -20
- package/src/tool-catalog/active-tool-controller.ts +164 -0
- package/src/tool-catalog/active-tool-planner.ts +212 -0
- package/src/tool-catalog/tool-groups.ts +102 -0
- package/src/types.ts +1399 -5
- package/src/ui-design/backend-adapter.ts +78 -0
- package/src/ui-design/backends/local-html.ts +82 -0
- package/src/ui-design/backends/pencil-mcp.ts +111 -0
- package/src/ui-design/components-scanner.ts +124 -0
- package/src/ui-design/config.ts +55 -0
- package/src/ui-design/pen-scanner.ts +95 -0
- package/src/ui-design/pen-selector.ts +72 -0
- package/src/ui-design/prompt-builder.ts +73 -0
- package/src/ui-design/scanner.ts +136 -0
- package/src/ui-design/session.ts +974 -0
- package/src/ui-design/system-prompt.ts +312 -0
- package/src/ui-design/tokens-scanner.ts +181 -0
- package/src/ui-design/types.ts +96 -0
- package/src/ultraplan/agent-catalog.ts +522 -0
- package/src/ultraplan/authoring/agent-catalog.ts +310 -0
- package/src/ultraplan/authoring/authoring-tools.ts +552 -0
- package/src/ultraplan/authoring/command-handlers.ts +339 -0
- package/src/ultraplan/authoring/markdown.ts +510 -0
- package/src/ultraplan/authoring/model.ts +162 -0
- package/src/ultraplan/authoring/pipeline.ts +319 -0
- package/src/ultraplan/authoring/stage-runner.ts +141 -0
- package/src/ultraplan/authoring/stages/approve.ts +249 -0
- package/src/ultraplan/authoring/stages/discover.ts +289 -0
- package/src/ultraplan/authoring/stages/intake.ts +203 -0
- package/src/ultraplan/authoring/stages/research.ts +399 -0
- package/src/ultraplan/authoring/stages/review.ts +333 -0
- package/src/ultraplan/authoring/stages/scout.ts +188 -0
- package/src/ultraplan/authoring/stages/synthesize.ts +348 -0
- package/src/ultraplan/authoring/storage.ts +594 -0
- package/src/ultraplan/authoring/synth-gate.ts +165 -0
- package/src/ultraplan/authoring-draft.ts +653 -0
- package/src/ultraplan/authoring-persist.ts +180 -0
- package/src/ultraplan/authoring-tool.ts +608 -0
- package/src/ultraplan/authoring-wizard.ts +587 -0
- package/src/ultraplan/batch/merge.ts +98 -0
- package/src/ultraplan/batch/planner.ts +150 -0
- package/src/ultraplan/batch/presenter.ts +97 -0
- package/src/ultraplan/batch/storage.ts +420 -0
- package/src/ultraplan/batch/supervisor.ts +317 -0
- package/src/ultraplan/batch/worker.ts +26 -0
- package/src/ultraplan/batch/worktree.ts +110 -0
- package/src/ultraplan/contracts.ts +1593 -0
- package/src/ultraplan/default-agents/authoring/discoverer.md +12 -0
- package/src/ultraplan/default-agents/authoring/intake.md +12 -0
- package/src/ultraplan/default-agents/authoring/planner.md +12 -0
- package/src/ultraplan/default-agents/authoring/researcher.md +12 -0
- package/src/ultraplan/default-agents/authoring/scope-checker.md +12 -0
- package/src/ultraplan/default-agents/authoring/scout.md +12 -0
- package/src/ultraplan/default-agents/authoring/structure-checker.md +12 -0
- package/src/ultraplan/default-agents/authoring/tdd-checker.md +12 -0
- package/src/ultraplan/default-agents/backend-domain-reviewer.md +10 -0
- package/src/ultraplan/default-agents/backend-executor.md +10 -0
- package/src/ultraplan/default-agents/backend-stack-reviewer.md +10 -0
- package/src/ultraplan/default-agents/backend-tester.md +10 -0
- package/src/ultraplan/default-agents/frontend-domain-reviewer.md +10 -0
- package/src/ultraplan/default-agents/frontend-executor.md +10 -0
- package/src/ultraplan/default-agents/frontend-stack-reviewer.md +10 -0
- package/src/ultraplan/default-agents/frontend-tester.md +10 -0
- package/src/ultraplan/default-agents/infrastructure-domain-reviewer.md +10 -0
- package/src/ultraplan/default-agents/infrastructure-executor.md +10 -0
- package/src/ultraplan/default-agents/infrastructure-stack-reviewer.md +10 -0
- package/src/ultraplan/default-agents/infrastructure-tester.md +10 -0
- package/src/ultraplan/execution/contract.ts +71 -0
- package/src/ultraplan/execution/policy.ts +217 -0
- package/src/ultraplan/execution/runtime-tools.ts +107 -0
- package/src/ultraplan/execution/session-runner.ts +281 -0
- package/src/ultraplan/next-router.ts +85 -0
- package/src/ultraplan/presenter.ts +359 -0
- package/src/ultraplan/project-paths.ts +342 -0
- package/src/ultraplan/runtime/active-execution.ts +72 -0
- package/src/ultraplan/runtime/apply-mutation.ts +416 -0
- package/src/ultraplan/runtime/blockers.ts +243 -0
- package/src/ultraplan/runtime/hook-bridge.ts +486 -0
- package/src/ultraplan/runtime/launch-context.ts +207 -0
- package/src/ultraplan/runtime/migration.ts +524 -0
- package/src/ultraplan/runtime/normalize.ts +281 -0
- package/src/ultraplan/runtime/proof.ts +260 -0
- package/src/ultraplan/runtime/reducer.ts +416 -0
- package/src/ultraplan/runtime/repair.ts +251 -0
- package/src/ultraplan/runtime/tracker-storage.ts +368 -0
- package/src/ultraplan/session-selection.ts +291 -0
- package/src/ultraplan/storage.ts +374 -0
- package/src/utils/editor.ts +38 -0
- package/src/utils/executable.ts +80 -0
- package/src/utils/paths.ts +1 -20
- package/src/utils/shell.ts +31 -0
- package/src/visual/companion.ts +2 -1
- package/src/visual/scripts/frame-template.html +60 -0
- package/src/visual/scripts/index.js +59 -13
- package/src/visual/scripts/package.json +3 -0
- package/src/visual/start-server.ts +2 -1
- package/src/workspace/git-scope.ts +64 -0
- package/src/workspace/locks.ts +23 -0
- package/src/workspace/package-manager.ts +117 -0
- package/src/workspace/path-mapping.ts +75 -0
- package/src/workspace/project-slug.ts +92 -0
- package/src/workspace/repo-root.ts +137 -0
- package/src/workspace/selector.ts +115 -0
- package/src/workspace/state-paths.ts +118 -0
- package/src/workspace/targets.ts +313 -0
- package/src/fix-pr/scripts/diff-comments.sh +0 -33
- package/src/fix-pr/scripts/fetch-pr-comments.sh +0 -25
- package/src/fix-pr/scripts/trigger-review.sh +0 -36
- package/src/fix-pr/scripts/wait-and-check.sh +0 -37
- package/src/qa/scripts/detect-app-type.sh +0 -68
- package/src/qa/scripts/discover-routes.sh +0 -143
- package/src/qa/scripts/run-e2e-tests.sh +0 -131
- package/src/qa/scripts/start-dev-server.sh +0 -46
- package/src/qa/scripts/stop-dev-server.sh +0 -36
- package/src/review/prompts/fix-output-schema.md +0 -18
- package/src/review/prompts/review-output-schema.md +0 -38
- package/src/review/template.ts +0 -15
- /package/src/{review → ai}/prompts/invalid-output-retry.md +0 -0
package/src/commands/doctor.ts
CHANGED
|
@@ -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(
|
|
231
|
-
|
|
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(([,
|
|
235
|
-
.map(([
|
|
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
|
|
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
|
|
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(
|