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,68 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Detect web app framework, dev command, and port.
3
- # Usage: detect-app-type.sh <cwd>
4
- # Output: JSON on stdout
5
- set -euo pipefail
6
-
7
- CWD="${1:-.}"
8
-
9
- type="generic"
10
- devCommand="npm run dev"
11
- port=3000
12
-
13
- # Check for Next.js
14
- if [ -f "$CWD/next.config.js" ] || [ -f "$CWD/next.config.mjs" ] || [ -f "$CWD/next.config.ts" ]; then
15
- if [ -d "$CWD/app" ]; then
16
- type="nextjs-app"
17
- elif [ -d "$CWD/src/app" ]; then
18
- type="nextjs-app"
19
- elif [ -d "$CWD/pages" ] || [ -d "$CWD/src/pages" ]; then
20
- type="nextjs-pages"
21
- else
22
- type="nextjs-app"
23
- fi
24
- port=3000
25
-
26
- # Check for Vite
27
- elif [ -f "$CWD/vite.config.ts" ] || [ -f "$CWD/vite.config.js" ] || [ -f "$CWD/vite.config.mjs" ]; then
28
- type="vite"
29
- port=5173
30
-
31
- # Check for Angular
32
- elif [ -f "$CWD/angular.json" ]; then
33
- type="generic"
34
- devCommand="npm start"
35
- port=4200
36
-
37
- # Check for Express (look for express in dependencies)
38
- elif [ -f "$CWD/package.json" ]; then
39
- if grep -q '"express"' "$CWD/package.json" 2>/dev/null; then
40
- type="express"
41
- port=3000
42
- fi
43
- fi
44
-
45
- # Try to detect dev command from package.json scripts
46
- if [ -f "$CWD/package.json" ]; then
47
- # Check for common dev script names
48
- if node -e "const p=JSON.parse(require('fs').readFileSync('$CWD/package.json','utf8')); process.exit(p.scripts?.dev ? 0 : 1)" 2>/dev/null; then
49
- devCommand="npm run dev"
50
- elif node -e "const p=JSON.parse(require('fs').readFileSync('$CWD/package.json','utf8')); process.exit(p.scripts?.start ? 0 : 1)" 2>/dev/null; then
51
- devCommand="npm start"
52
- elif node -e "const p=JSON.parse(require('fs').readFileSync('$CWD/package.json','utf8')); process.exit(p.scripts?.serve ? 0 : 1)" 2>/dev/null; then
53
- devCommand="npm run serve"
54
- fi
55
-
56
- # Try to detect port from scripts
57
- devScript=$(node -e "const p=JSON.parse(require('fs').readFileSync('$CWD/package.json','utf8')); console.log(p.scripts?.dev || p.scripts?.start || '')" 2>/dev/null || echo "")
58
- portMatch=$(echo "$devScript" | grep -oE '(--port|PORT=)\s*([0-9]+)' | grep -oE '[0-9]+' | head -1 || echo "")
59
- if [ -n "$portMatch" ]; then
60
- port="$portMatch"
61
- fi
62
- fi
63
-
64
- baseUrl="http://localhost:$port"
65
-
66
- cat <<EOF
67
- {"type": "$type", "devCommand": "$devCommand", "port": $port, "baseUrl": "$baseUrl"}
68
- EOF
@@ -1,143 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Scan project for routes, pages, forms, and auth flows.
3
- # Usage: discover-routes.sh <cwd> <app_type>
4
- # Output: JSONL on stdout (one JSON object per line)
5
- set -euo pipefail
6
-
7
- CWD="${1:-.}"
8
- APP_TYPE="${2:-generic}"
9
-
10
- cd "$CWD"
11
-
12
- # Helper: output a route as JSONL
13
- emit() {
14
- local routePath="$1" file="$2" type="$3" hasForm="${4:-false}" methods="${5:-}"
15
- if [ -n "$methods" ]; then
16
- echo "{\"path\": \"$routePath\", \"file\": \"$file\", \"type\": \"$type\", \"hasForm\": $hasForm, \"methods\": $methods}"
17
- else
18
- echo "{\"path\": \"$routePath\", \"file\": \"$file\", \"type\": \"$type\", \"hasForm\": $hasForm}"
19
- fi
20
- }
21
-
22
- # Check if file likely contains a form
23
- has_form() {
24
- local file="$1"
25
- grep -qE '(<form|onSubmit|handleSubmit|useForm|formik|react-hook-form)' "$file" 2>/dev/null && echo "true" || echo "false"
26
- }
27
-
28
- case "$APP_TYPE" in
29
- nextjs-app)
30
- # Scan app/ directory for page.tsx/page.jsx/page.ts/page.js files
31
- for dir in "app" "src/app"; do
32
- if [ -d "$dir" ]; then
33
- find "$dir" -name 'page.tsx' -o -name 'page.jsx' -o -name 'page.ts' -o -name 'page.js' 2>/dev/null | while read -r file; do
34
- # Convert file path to route: app/login/page.tsx -> /login
35
- route=$(echo "$file" | sed "s|^$dir||" | sed 's|/page\.\(tsx\|jsx\|ts\|js\)$||' | sed 's|^$|/|')
36
- # Skip route groups (parenthesized segments)
37
- if echo "$route" | grep -qE '\([^)]+\)'; then
38
- route=$(echo "$route" | sed 's|/([^)]*)||g')
39
- fi
40
- [ -z "$route" ] && route="/"
41
- formFlag=$(has_form "$file")
42
- emit "$route" "$file" "page" "$formFlag"
43
- done
44
-
45
- # Scan for API routes
46
- find "$dir" -name 'route.tsx' -o -name 'route.ts' -o -name 'route.js' 2>/dev/null | while read -r file; do
47
- route=$(echo "$file" | sed "s|^$dir||" | sed 's|/route\.\(tsx\|ts\|js\)$||')
48
- methods=$(grep -oE '(GET|POST|PUT|PATCH|DELETE)' "$file" 2>/dev/null | sort -u | awk 'BEGIN{ORS=""} NR>1{printf ","} {printf "\"%s\"", $0}' || echo "")
49
- [ -n "$methods" ] && methods="[$methods]" || methods='["GET"]'
50
- emit "$route" "$file" "api" "false" "$methods"
51
- done
52
- fi
53
- done
54
- ;;
55
-
56
- nextjs-pages)
57
- # Scan pages/ directory
58
- for dir in "pages" "src/pages"; do
59
- if [ -d "$dir" ]; then
60
- find "$dir" -name '*.tsx' -o -name '*.jsx' -o -name '*.ts' -o -name '*.js' 2>/dev/null | while read -r file; do
61
- # Skip _app, _document, _error, api files
62
- basename=$(basename "$file")
63
- case "$basename" in _app.* | _document.* | _error.*) continue;; esac
64
-
65
- route=$(echo "$file" | sed "s|^$dir||" | sed 's|\.\(tsx\|jsx\|ts\|js\)$||' | sed 's|/index$|/|')
66
- [ -z "$route" ] && route="/"
67
-
68
- # Check if it's an API route
69
- if echo "$file" | grep -q '/api/'; then
70
- methods=$(grep -oE '(GET|POST|PUT|PATCH|DELETE)' "$file" 2>/dev/null | sort -u | awk 'BEGIN{ORS=""} NR>1{printf ","} {printf "\"%s\"", $0}' || echo "")
71
- [ -n "$methods" ] && methods="[$methods]" || methods='["GET"]'
72
- emit "$route" "$file" "api" "false" "$methods"
73
- else
74
- formFlag=$(has_form "$file")
75
- emit "$route" "$file" "page" "$formFlag"
76
- fi
77
- done
78
- fi
79
- done
80
- ;;
81
-
82
- react-router)
83
- # Grep for Route path= patterns
84
- grep -rn --include='*.tsx' --include='*.jsx' --include='*.ts' --include='*.js' \
85
- -E '<Route\s+.*path=' "$CWD/src" 2>/dev/null | while read -r line; do
86
- file=$(echo "$line" | cut -d: -f1)
87
- routePath=$(echo "$line" | grep -oE 'path="[^"]*"' | head -1 | sed 's/path="//;s/"//')
88
- [ -z "$routePath" ] && continue
89
- formFlag=$(has_form "$file")
90
- emit "$routePath" "$file" "page" "$formFlag"
91
- done || true
92
-
93
- # Also check for createBrowserRouter patterns
94
- grep -rn --include='*.tsx' --include='*.jsx' --include='*.ts' --include='*.js' \
95
- -E 'path:\s*["\x27]' "$CWD/src" 2>/dev/null | while read -r line; do
96
- file=$(echo "$line" | cut -d: -f1)
97
- routePath=$(echo "$line" | grep -oE "path:\s*[\"'][^\"']*[\"']" | head -1 | sed "s/path:\s*[\"']//;s/[\"']//")
98
- [ -z "$routePath" ] && continue
99
- formFlag=$(has_form "$file")
100
- emit "$routePath" "$file" "page" "$formFlag"
101
- done || true
102
- ;;
103
-
104
- express)
105
- # Grep for app.get/post/put/delete/use patterns
106
- grep -rn --include='*.ts' --include='*.js' \
107
- -E '\.(get|post|put|patch|delete|use)\s*\(\s*["\x27/]' "$CWD/src" "$CWD/routes" "$CWD/server" 2>/dev/null | while read -r line; do
108
- file=$(echo "$line" | cut -d: -f1)
109
- method=$(echo "$line" | grep -oE '\.(get|post|put|patch|delete)' | head -1 | tr -d '.')
110
- routePath=$(echo "$line" | grep -oE "[\"'][/][^\"']*[\"']" | head -1 | tr -d "\"'")
111
- [ -z "$routePath" ] && continue
112
- [ -z "$method" ] && method="GET"
113
- methods="[\"$(echo "$method" | tr '[:lower:]' '[:upper:]')\"]"
114
- emit "$routePath" "$file" "api" "false" "$methods"
115
- done || true
116
- ;;
117
-
118
- vite|generic)
119
- # Generic: look for common patterns
120
- if [ -d "src" ]; then
121
- # Check for React Router in any form
122
- grep -rln --include='*.tsx' --include='*.jsx' --include='*.ts' --include='*.js' \
123
- -E '(<Route|createBrowserRouter|useRoutes)' src/ 2>/dev/null | while read -r file; do
124
- grep -oE 'path[=:]\s*["\x27][^"\x27]*["\x27]' "$file" 2>/dev/null | while read -r match; do
125
- routePath=$(echo "$match" | sed "s/path[=:]\s*[\"']//;s/[\"']//")
126
- [ -z "$routePath" ] && continue
127
- formFlag=$(has_form "$file")
128
- emit "$routePath" "$file" "page" "$formFlag"
129
- done
130
- done || true
131
- fi
132
- ;;
133
- esac
134
-
135
- # Always scan for auth-related files regardless of framework
136
- find "$CWD/src" -type f \( -name '*auth*' -o -name '*login*' -o -name '*signup*' -o -name '*register*' \) \
137
- -not -path '*/node_modules/*' -not -path '*/.next/*' -not -name '*.test.*' -not -name '*.spec.*' 2>/dev/null | while read -r file; do
138
- # Only emit if not already covered by framework-specific scan
139
- formFlag=$(has_form "$file")
140
- # Use filename as hint for route
141
- basename=$(basename "$file" | sed 's/\.\(tsx\|jsx\|ts\|js\)$//')
142
- emit "/$basename" "$file" "auth" "$formFlag"
143
- done || true
@@ -1,131 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Run playwright tests and produce a compact JSON summary.
3
- # Requires playwright-cli installed globally (npm install -g @playwright/cli@latest).
4
- # Usage: run-e2e-tests.sh <test_dir> <base_url> [test_filter]
5
- # Output: Compact JSON summary on stdout
6
- # Exit: 0 = all tests passed, 2 = test failures, 1 = script/playwright error
7
- set -euo pipefail
8
-
9
- TEST_DIR="$1"
10
- BASE_URL="$2"
11
- TEST_FILTER="${3:-}"
12
- RESULTS_DIR="${TEST_DIR}/../results"
13
-
14
- mkdir -p "$RESULTS_DIR"
15
-
16
- # Resolve playwright-cli binary
17
- if command -v playwright-cli &>/dev/null; then
18
- PW_BIN="$(command -v playwright-cli)"
19
- elif [ -x "./node_modules/.bin/playwright-cli" ]; then
20
- PW_BIN="./node_modules/.bin/playwright-cli"
21
- else
22
- cat <<EOF
23
- {"total": 0, "passed": 0, "failed": 0, "skipped": 0, "duration": 0, "failures": [], "error": "playwright not found. Install with: npm install -g @playwright/cli@latest"}
24
- EOF
25
- exit 1
26
- fi
27
-
28
- # Build playwright-cli command
29
- PW_ARGS=(
30
- test
31
- "$TEST_DIR"
32
- --reporter=json
33
- --output="$RESULTS_DIR"
34
- )
35
-
36
- if [ -n "$TEST_FILTER" ]; then
37
- PW_ARGS+=(--grep "$TEST_FILTER")
38
- fi
39
-
40
- # Run playwright, capture JSON output and stderr separately
41
- RAW_OUTPUT="$RESULTS_DIR/raw-results.json"
42
- PW_STDERR="$RESULTS_DIR/playwright-stderr.log"
43
- set +e
44
- BASE_URL="$BASE_URL" "$PW_BIN" "${PW_ARGS[@]}" > "$RAW_OUTPUT" 2>"$PW_STDERR"
45
- PW_EXIT=$?
46
- set -e
47
-
48
- # If no JSON output was produced, emit error summary and exit
49
- if [ ! -s "$RAW_OUTPUT" ]; then
50
- cat <<EOF
51
- {"total": 0, "passed": 0, "failed": 0, "skipped": 0, "duration": 0, "failures": [], "error": "playwright produced no output (exit code: $PW_EXIT). See $PW_STDERR for details."}
52
- EOF
53
- exit 1
54
- fi
55
-
56
- # Parse the JSON output into compact summary using node.
57
- # Writes summary to file, prints to stdout, exits non-zero if tests failed.
58
- SUMMARY_OUTPUT="$RESULTS_DIR/summary.json"
59
- NODE_STDERR="$RESULTS_DIR/node-parse-stderr.log"
60
- set +e
61
- RAW_OUTPUT="$RAW_OUTPUT" SUMMARY_OUTPUT="$SUMMARY_OUTPUT" node -e "
62
- const fs = require('fs');
63
- const raw = JSON.parse(fs.readFileSync(process.env.RAW_OUTPUT, 'utf-8'));
64
-
65
- const suites = raw.suites || [];
66
- const results = [];
67
-
68
- function collectTests(suite, parentTitle) {
69
- const title = parentTitle ? parentTitle + ' > ' + suite.title : suite.title;
70
- for (const spec of (suite.specs || [])) {
71
- for (const test of (spec.tests || [])) {
72
- for (const result of (test.results || [])) {
73
- results.push({
74
- test: title + ' > ' + spec.title,
75
- file: spec.file + (spec.line ? ':' + spec.line : ''),
76
- status: result.status,
77
- duration: result.duration || 0,
78
- error: result.error?.message || null,
79
- });
80
- }
81
- }
82
- }
83
- for (const child of (suite.suites || [])) {
84
- collectTests(child, title);
85
- }
86
- }
87
-
88
- for (const suite of suites) {
89
- collectTests(suite, '');
90
- }
91
-
92
- const passed = results.filter(r => r.status === 'passed').length;
93
- const failed = results.filter(r => r.status === 'failed' || r.status === 'timedOut').length;
94
- const skipped = results.filter(r => r.status === 'skipped').length;
95
- const totalDuration = results.reduce((sum, r) => sum + r.duration, 0);
96
-
97
- const failures = results
98
- .filter(r => r.status === 'failed' || r.status === 'timedOut')
99
- .map(r => ({
100
- test: r.test,
101
- file: r.file,
102
- error: r.error || 'Unknown error',
103
- }));
104
-
105
- const summary = {
106
- total: results.length,
107
- passed,
108
- failed,
109
- skipped,
110
- duration: totalDuration,
111
- failures,
112
- };
113
-
114
- const json = JSON.stringify(summary);
115
- fs.writeFileSync(process.env.SUMMARY_OUTPUT, json);
116
- console.log(json);
117
- process.exit(failed > 0 ? 2 : 0);
118
- " 2>"$NODE_STDERR"
119
- NODE_EXIT=$?
120
- set -e
121
-
122
- # If parsing failed (not a test-failure exit), emit error and exit
123
- if [ ! -s "$SUMMARY_OUTPUT" ]; then
124
- cat <<EOF
125
- {"total": 0, "passed": 0, "failed": 0, "skipped": 0, "duration": 0, "failures": [], "error": "Failed to parse playwright output. See $NODE_STDERR for details."}
126
- EOF
127
- exit 1
128
- fi
129
-
130
- # Propagate the node exit code (0 = all passed, 2 = test failures)
131
- exit "$NODE_EXIT"
@@ -1,46 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Start the dev server in the background and wait for it to be ready.
3
- # Usage: start-dev-server.sh <cwd> <dev_command> <port> <timeout_seconds> <session_dir>
4
- # Output: JSON on stdout
5
- set -euo pipefail
6
-
7
- CWD="$1"
8
- DEV_COMMAND="$2"
9
- PORT="$3"
10
- TIMEOUT="${4:-60}"
11
- SESSION_DIR="${5:-.}"
12
-
13
- cd "$CWD"
14
-
15
- # Check if port is already in use
16
- if curl -s -o /dev/null -w "%{http_code}" "http://localhost:$PORT" 2>/dev/null | grep -qE '^[0-9]'; then
17
- echo "{\"pid\": null, \"url\": \"http://localhost:$PORT\", \"ready\": true, \"note\": \"Server already running\"}"
18
- exit 0
19
- fi
20
-
21
- # Start dev server in background
22
- eval "$DEV_COMMAND" > "$SESSION_DIR/dev-server.log" 2>&1 &
23
- PID=$!
24
- echo "$PID" > "$SESSION_DIR/dev-server.pid"
25
-
26
- # Wait for server to be ready
27
- for i in $(seq 1 "$TIMEOUT"); do
28
- # Check if process is still alive
29
- if ! kill -0 "$PID" 2>/dev/null; then
30
- echo "{\"pid\": $PID, \"url\": \"http://localhost:$PORT\", \"ready\": false, \"error\": \"Server process exited\"}"
31
- exit 1
32
- fi
33
-
34
- # Check if port responds
35
- if curl -s -o /dev/null "http://localhost:$PORT" 2>/dev/null; then
36
- echo "{\"pid\": $PID, \"url\": \"http://localhost:$PORT\", \"ready\": true}"
37
- exit 0
38
- fi
39
-
40
- sleep 1
41
- done
42
-
43
- # Timeout — kill the server
44
- kill "$PID" 2>/dev/null || true
45
- echo "{\"pid\": $PID, \"url\": \"http://localhost:$PORT\", \"ready\": false, \"error\": \"Timeout after ${TIMEOUT}s\"}"
46
- exit 1
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Stop the dev server started by start-dev-server.sh.
3
- # Usage: stop-dev-server.sh <session_dir>
4
- set -euo pipefail
5
-
6
- SESSION_DIR="${1:-.}"
7
- PID_FILE="$SESSION_DIR/dev-server.pid"
8
-
9
- if [ ! -f "$PID_FILE" ]; then
10
- echo '{"stopped": false, "error": "No PID file found"}'
11
- exit 0
12
- fi
13
-
14
- PID=$(cat "$PID_FILE")
15
-
16
- if [ -z "$PID" ]; then
17
- echo '{"stopped": false, "error": "Empty PID file"}'
18
- exit 0
19
- fi
20
-
21
- # Kill the process and its children
22
- if kill -0 "$PID" 2>/dev/null; then
23
- # Kill process group if possible
24
- kill -- -"$PID" 2>/dev/null || kill "$PID" 2>/dev/null || true
25
- # Wait briefly for cleanup
26
- sleep 1
27
- # Force kill if still alive
28
- if kill -0 "$PID" 2>/dev/null; then
29
- kill -9 "$PID" 2>/dev/null || true
30
- fi
31
- rm -f "$PID_FILE"
32
- echo "{\"stopped\": true, \"pid\": $PID}"
33
- else
34
- rm -f "$PID_FILE"
35
- echo "{\"stopped\": true, \"pid\": $PID, \"note\": \"Process was already dead\"}"
36
- fi
@@ -1,18 +0,0 @@
1
- {
2
- "fixes": [
3
- {
4
- "findingIds": ["F001"],
5
- "file": "src/auth.ts",
6
- "status": "applied",
7
- "summary": "Added a null guard before dereferencing the user object."
8
- },
9
- {
10
- "findingIds": ["F002"],
11
- "file": null,
12
- "status": "skipped",
13
- "summary": "Skipped because the finding does not identify a concrete file to edit."
14
- }
15
- ],
16
- "summary": "Applied 1 fix and skipped 1 finding.",
17
- "status": "partial"
18
- }
@@ -1,38 +0,0 @@
1
- {
2
- "findings": [
3
- {
4
- "id": "F001",
5
- "title": "Missing null check on user input",
6
- "severity": "error",
7
- "priority": "P1",
8
- "confidence": 0.85,
9
- "file": "src/auth.ts",
10
- "lineStart": 42,
11
- "lineEnd": 45,
12
- "body": "The code dereferences `userId` without validating that it exists.",
13
- "suggestion": "Add a guard that rejects nullish `userId` before use.",
14
- "agent": "correctness",
15
- "validation": {
16
- "verdict": "confirmed",
17
- "reasoning": "The null guard is missing at the referenced call site.",
18
- "validatedBy": "validator",
19
- "validatedAt": "2026-04-11T14:30:22.000Z"
20
- }
21
- },
22
- {
23
- "id": "F002",
24
- "title": "Location could not be determined confidently",
25
- "severity": "warning",
26
- "priority": "P3",
27
- "confidence": 0.32,
28
- "file": null,
29
- "lineStart": null,
30
- "lineEnd": null,
31
- "body": "Use null for unknown location fields instead of guessing.",
32
- "suggestion": null,
33
- "agent": "correctness"
34
- }
35
- ],
36
- "summary": "Found 2 review findings.",
37
- "status": "failed"
38
- }
@@ -1,15 +0,0 @@
1
- import Handlebars from "handlebars";
2
-
3
- const handlebars = Handlebars.create();
4
-
5
- handlebars.registerHelper("json", (value: unknown): string => JSON.stringify(value, null, 2));
6
- handlebars.registerHelper("joinLines", (value: unknown): string => {
7
- if (!Array.isArray(value)) {
8
- return "";
9
- }
10
- return value.join("\n");
11
- });
12
-
13
- export function renderReviewTemplate(template: string, context: Record<string, unknown> = {}): string {
14
- return handlebars.compile(template, { noEscape: true })(context);
15
- }