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.
- 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 +149 -45
- 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 +19 -9
- 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 +129 -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 +264 -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 +298 -127
- package/src/review/fixer.ts +10 -6
- package/src/review/multi-agent-runner.ts +115 -14
- 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 +11 -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 +1401 -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/agents.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
23
|
-
"
|
|
24
|
-
|
|
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
|
|
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} ${
|
|
70
|
+
lines.push(` ${name} ${model} ${thinking} ${source} ${focus}`);
|
|
37
71
|
}
|
|
38
72
|
|
|
39
|
-
const globalCount = agents.filter((
|
|
40
|
-
const
|
|
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
|
-
|
|
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:
|
|
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
|
-
(
|
|
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:
|
|
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
|
|
123
|
-
const
|
|
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:
|
|
248
|
+
scope: AgentCreateScope,
|
|
152
249
|
agentName: string,
|
|
153
250
|
model: string | null,
|
|
251
|
+
thinkingLevel: ThinkingLevel | null,
|
|
154
252
|
): void {
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
|
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
|
|
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
|
|