@azure-id/orc 0.55.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 (449) hide show
  1. package/CHANGELOG.md +2017 -0
  2. package/README-id.md +521 -0
  3. package/README.md +485 -0
  4. package/bin/build-agents.js +86 -0
  5. package/bin/cli.js +29050 -0
  6. package/bin/mockrun-catalog.js +267 -0
  7. package/bin/onboarding-content.js +172 -0
  8. package/bin/pricing.json +200 -0
  9. package/bin/providers.json +437 -0
  10. package/bin/ui.js +95 -0
  11. package/bin/verify-contracts.js +3277 -0
  12. package/bin/verify-package.js +498 -0
  13. package/bin/webui/api.js +1163 -0
  14. package/bin/webui/app.html +198 -0
  15. package/bin/webui/css/00-tokens.css +92 -0
  16. package/bin/webui/css/01-base.css +42 -0
  17. package/bin/webui/css/02-shell.css +103 -0
  18. package/bin/webui/css/03-components.css +462 -0
  19. package/bin/webui/css/04-motion.css +91 -0
  20. package/bin/webui/css/05-tour.css +100 -0
  21. package/bin/webui/css/06-responsive.css +108 -0
  22. package/bin/webui/css/panels/boundary.css +26 -0
  23. package/bin/webui/css/panels/challenge.css +151 -0
  24. package/bin/webui/css/panels/crosslink.css +194 -0
  25. package/bin/webui/css/panels/docs.css +254 -0
  26. package/bin/webui/css/panels/experiment.css +23 -0
  27. package/bin/webui/css/panels/extra.css +536 -0
  28. package/bin/webui/css/panels/flow.css +177 -0
  29. package/bin/webui/css/panels/handoff.css +67 -0
  30. package/bin/webui/css/panels/knowledge.css +86 -0
  31. package/bin/webui/css/panels/learn.css +154 -0
  32. package/bin/webui/css/panels/maintenance.css +55 -0
  33. package/bin/webui/css/panels/mockrun.css +268 -0
  34. package/bin/webui/css/panels/overview.css +100 -0
  35. package/bin/webui/css/panels/pact.css +43 -0
  36. package/bin/webui/css/panels/runs.css +105 -0
  37. package/bin/webui/css/panels/settings.css +227 -0
  38. package/bin/webui/css/panels/stats.css +87 -0
  39. package/bin/webui/fixtures/boundary.js +92 -0
  40. package/bin/webui/fixtures/challenge.js +825 -0
  41. package/bin/webui/fixtures/crosslink.js +31 -0
  42. package/bin/webui/fixtures/docs.js +982 -0
  43. package/bin/webui/fixtures/extra.js +1934 -0
  44. package/bin/webui/fixtures/flow.js +81 -0
  45. package/bin/webui/fixtures/handoff.js +35 -0
  46. package/bin/webui/fixtures/index.js +486 -0
  47. package/bin/webui/fixtures/knowledge.js +291 -0
  48. package/bin/webui/fixtures/maintenance.js +42 -0
  49. package/bin/webui/fixtures/mockrun.js +36 -0
  50. package/bin/webui/fixtures/pact.js +111 -0
  51. package/bin/webui/fixtures/runs.js +109 -0
  52. package/bin/webui/fixtures/settings.js +78 -0
  53. package/bin/webui/fixtures/shell.js +48 -0
  54. package/bin/webui/fixtures/stats.js +104 -0
  55. package/bin/webui/i18n/TERMS.md +134 -0
  56. package/bin/webui/i18n/en/banner.json +29 -0
  57. package/bin/webui/i18n/en/boundary.json +20 -0
  58. package/bin/webui/i18n/en/challenge.json +106 -0
  59. package/bin/webui/i18n/en/common.json +69 -0
  60. package/bin/webui/i18n/en/crosslink.json +69 -0
  61. package/bin/webui/i18n/en/docs.json +175 -0
  62. package/bin/webui/i18n/en/experiment.json +17 -0
  63. package/bin/webui/i18n/en/extra.json +313 -0
  64. package/bin/webui/i18n/en/flow.json +30 -0
  65. package/bin/webui/i18n/en/handoff.json +37 -0
  66. package/bin/webui/i18n/en/knowledge.json +141 -0
  67. package/bin/webui/i18n/en/learn.json +16 -0
  68. package/bin/webui/i18n/en/maintenance.json +52 -0
  69. package/bin/webui/i18n/en/mockrun.json +19 -0
  70. package/bin/webui/i18n/en/nav.json +19 -0
  71. package/bin/webui/i18n/en/overview.json +89 -0
  72. package/bin/webui/i18n/en/pact.json +36 -0
  73. package/bin/webui/i18n/en/runs.json +51 -0
  74. package/bin/webui/i18n/en/settings.json +49 -0
  75. package/bin/webui/i18n/en/stats.json +69 -0
  76. package/bin/webui/i18n/en/tour.json +33 -0
  77. package/bin/webui/i18n/id/banner.json +29 -0
  78. package/bin/webui/i18n/id/boundary.json +20 -0
  79. package/bin/webui/i18n/id/challenge.json +106 -0
  80. package/bin/webui/i18n/id/common.json +70 -0
  81. package/bin/webui/i18n/id/crosslink.json +69 -0
  82. package/bin/webui/i18n/id/docs.json +175 -0
  83. package/bin/webui/i18n/id/experiment.json +17 -0
  84. package/bin/webui/i18n/id/extra.json +313 -0
  85. package/bin/webui/i18n/id/flow.json +30 -0
  86. package/bin/webui/i18n/id/handoff.json +37 -0
  87. package/bin/webui/i18n/id/knowledge.json +141 -0
  88. package/bin/webui/i18n/id/learn.json +16 -0
  89. package/bin/webui/i18n/id/maintenance.json +52 -0
  90. package/bin/webui/i18n/id/mockrun.json +19 -0
  91. package/bin/webui/i18n/id/nav.json +19 -0
  92. package/bin/webui/i18n/id/overview.json +89 -0
  93. package/bin/webui/i18n/id/pact.json +36 -0
  94. package/bin/webui/i18n/id/runs.json +51 -0
  95. package/bin/webui/i18n/id/settings.json +49 -0
  96. package/bin/webui/i18n/id/stats.json +69 -0
  97. package/bin/webui/i18n/id/tour.json +33 -0
  98. package/bin/webui/js/00-core.js +115 -0
  99. package/bin/webui/js/01-i18n.js +149 -0
  100. package/bin/webui/js/02-ui.js +211 -0
  101. package/bin/webui/js/03-md.js +286 -0
  102. package/bin/webui/js/04-router.js +51 -0
  103. package/bin/webui/js/05-banners.js +172 -0
  104. package/bin/webui/js/06-edit.js +183 -0
  105. package/bin/webui/js/90-tour.js +488 -0
  106. package/bin/webui/js/91-shortcuts.js +126 -0
  107. package/bin/webui/js/99-boot.js +118 -0
  108. package/bin/webui/js/panels/boundary.js +104 -0
  109. package/bin/webui/js/panels/challenge.js +781 -0
  110. package/bin/webui/js/panels/crosslink.js +654 -0
  111. package/bin/webui/js/panels/docs.js +1338 -0
  112. package/bin/webui/js/panels/experiment.js +98 -0
  113. package/bin/webui/js/panels/extra.js +3011 -0
  114. package/bin/webui/js/panels/flow.js +297 -0
  115. package/bin/webui/js/panels/handoff.js +169 -0
  116. package/bin/webui/js/panels/knowledge.js +890 -0
  117. package/bin/webui/js/panels/learn.js +220 -0
  118. package/bin/webui/js/panels/maintenance.js +235 -0
  119. package/bin/webui/js/panels/mockrun.js +227 -0
  120. package/bin/webui/js/panels/overview.js +447 -0
  121. package/bin/webui/js/panels/pact.js +189 -0
  122. package/bin/webui/js/panels/runs.js +416 -0
  123. package/bin/webui/js/panels/settings.js +573 -0
  124. package/bin/webui/js/panels/stats.js +378 -0
  125. package/bin/webui/serve.js +557 -0
  126. package/mock-run/INDEX.md +106 -0
  127. package/mock-run/a-normal-day.md +587 -0
  128. package/mock-run/context-combiner.md +100 -0
  129. package/mock-run/extra-recovery.md +330 -0
  130. package/mock-run/extra-slots.md +177 -0
  131. package/mock-run/media/README.md +43 -0
  132. package/mock-run/orc-aftermath.md +392 -0
  133. package/mock-run/orc-boundary.md +356 -0
  134. package/mock-run/orc-brainstorm.md +177 -0
  135. package/mock-run/orc-budget.md +534 -0
  136. package/mock-run/orc-challenge-council.md +262 -0
  137. package/mock-run/orc-challenge.md +416 -0
  138. package/mock-run/orc-cli.md +200 -0
  139. package/mock-run/orc-diy.md +129 -0
  140. package/mock-run/orc-doc.md +448 -0
  141. package/mock-run/orc-explain.md +86 -0
  142. package/mock-run/orc-export.md +423 -0
  143. package/mock-run/orc-extra.md +392 -0
  144. package/mock-run/orc-fast.md +106 -0
  145. package/mock-run/orc-grill.md +151 -0
  146. package/mock-run/orc-handoff.md +480 -0
  147. package/mock-run/orc-pact.md +421 -0
  148. package/mock-run/orc-pattern.md +112 -0
  149. package/mock-run/orc-plan.md +108 -0
  150. package/mock-run/orc-pr-setup.md +126 -0
  151. package/mock-run/orc-quick.md +113 -0
  152. package/mock-run/orc-route.md +93 -0
  153. package/mock-run/orc-ui.md +125 -0
  154. package/mock-run/orc-ultra.md +103 -0
  155. package/mock-run/orc.md +157 -0
  156. package/mock-run/the-example-project.md +55 -0
  157. package/package.json +39 -0
  158. package/templates/agents/MODEL-MAPPING.md +168 -0
  159. package/templates/agents/orc-advisor-fable-5.md +50 -0
  160. package/templates/agents/orc-advisor-opus-5-xhigh.md +56 -0
  161. package/templates/agents/orc-analyst-fable-5.md +115 -0
  162. package/templates/agents/orc-analyze-mini-opus-5-med.md +60 -0
  163. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +58 -0
  164. package/templates/agents/orc-challenge-advisor-opus-5-med.md +75 -0
  165. package/templates/agents/orc-challenge-contrarian-opus-5-high.md +110 -0
  166. package/templates/agents/orc-challenge-executor-opus-5-med.md +114 -0
  167. package/templates/agents/orc-challenge-expansionist-opus-5-med.md +112 -0
  168. package/templates/agents/orc-challenge-judge-opus-5-high.md +132 -0
  169. package/templates/agents/orc-challenge-outsider-opus-5-low.md +109 -0
  170. package/templates/agents/orc-challenge-principles-opus-5-high.md +109 -0
  171. package/templates/agents/orc-challenge-reader-opus-5-low.md +90 -0
  172. package/templates/agents/orc-claude-writer-opus-4-8-high.md +53 -0
  173. package/templates/agents/orc-claude-writer-opus-5-med.md +55 -0
  174. package/templates/agents/orc-context-combiner-opus-5-high.md +88 -0
  175. package/templates/agents/orc-doc-checker-opus-5-low.md +108 -0
  176. package/templates/agents/orc-doc-writer-opus-5-med.md +134 -0
  177. package/templates/agents/orc-executor-haiku-4-5.md +113 -0
  178. package/templates/agents/orc-executor-opus-4-7-high.md +114 -0
  179. package/templates/agents/orc-executor-opus-4-7-med.md +114 -0
  180. package/templates/agents/orc-executor-opus-4-8-high.md +114 -0
  181. package/templates/agents/orc-executor-opus-5-high.md +114 -0
  182. package/templates/agents/orc-executor-opus-5-low.md +114 -0
  183. package/templates/agents/orc-executor-opus-5-med.md +114 -0
  184. package/templates/agents/orc-executor-sonnet-4-6-high.md +114 -0
  185. package/templates/agents/orc-executor-sonnet-4-6-med.md +114 -0
  186. package/templates/agents/orc-executor-sonnet-5-high.md +114 -0
  187. package/templates/agents/orc-judge-fable-5.md +79 -0
  188. package/templates/agents/orc-judge-opus-5-xhigh.md +85 -0
  189. package/templates/agents/orc-learn-writer-opus-5-low.md +73 -0
  190. package/templates/agents/orc-pattern-codifier-opus-5-med.md +65 -0
  191. package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +63 -0
  192. package/templates/agents/orc-planner-fable-5.md +152 -0
  193. package/templates/agents/orc-planner-mini-opus-5-med.md +69 -0
  194. package/templates/agents/orc-planner-mini-sonnet-5-high.md +67 -0
  195. package/templates/agents/orc-planner-opus-5-med.md +160 -0
  196. package/templates/agents/orc-retro-opus-5-med.md +73 -0
  197. package/templates/agents/orc-retro-sonnet-5-high.md +72 -0
  198. package/templates/agents/orc-reviewer-fable-5.md +57 -0
  199. package/templates/agents/orc-reviewer-opus-5-med.md +60 -0
  200. package/templates/agents/orc-scout-opus-5-low.md +40 -0
  201. package/templates/agents/orc-scout-sonnet-4-6-high.md +39 -0
  202. package/templates/agents/orc-system-analyst-opus-5-high.md +120 -0
  203. package/templates/agents/orc-test-author-opus-5-med.md +71 -0
  204. package/templates/agents/orc-trace-writer-haiku-4-5.md +107 -0
  205. package/templates/agents/orc-verifier-opus-5-med.md +69 -0
  206. package/templates/agents/orc-wiki-scanner-opus-4-8-high.md +79 -0
  207. package/templates/agents/orc-wiki-scanner-opus-5-med.md +81 -0
  208. package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +106 -0
  209. package/templates/commands/orc-aftermath.md +49 -0
  210. package/templates/commands/orc-analyze.md +21 -0
  211. package/templates/commands/orc-boundary.md +46 -0
  212. package/templates/commands/orc-brainstorm.md +51 -0
  213. package/templates/commands/orc-budget.md +54 -0
  214. package/templates/commands/orc-challenge.md +58 -0
  215. package/templates/commands/orc-claude.md +14 -0
  216. package/templates/commands/orc-diy.md +13 -0
  217. package/templates/commands/orc-doc.md +128 -0
  218. package/templates/commands/orc-explain.md +20 -0
  219. package/templates/commands/orc-export.md +46 -0
  220. package/templates/commands/orc-fast.md +15 -0
  221. package/templates/commands/orc-grill.md +40 -0
  222. package/templates/commands/orc-handoff.md +52 -0
  223. package/templates/commands/orc-learn.md +17 -0
  224. package/templates/commands/orc-mini.md +12 -0
  225. package/templates/commands/orc-pact.md +44 -0
  226. package/templates/commands/orc-pattern.md +15 -0
  227. package/templates/commands/orc-plan.md +22 -0
  228. package/templates/commands/orc-poly.md +21 -0
  229. package/templates/commands/orc-pr-driver.md +30 -0
  230. package/templates/commands/orc-pr-setup.md +31 -0
  231. package/templates/commands/orc-quick.md +33 -0
  232. package/templates/commands/orc-retro.md +17 -0
  233. package/templates/commands/orc-route.md +41 -0
  234. package/templates/commands/orc-ultra.md +17 -0
  235. package/templates/commands/orc-verify.md +11 -0
  236. package/templates/commands/orc-wiki.md +42 -0
  237. package/templates/commands/orc.md +16 -0
  238. package/templates/hooks/orc-effort-guard.js +178 -0
  239. package/templates/hooks/orc-statusline.js +305 -0
  240. package/templates/hooks/orc-trace.js +471 -0
  241. package/templates/hooks/orc-update-lib.js +125 -0
  242. package/templates/skills/_shared/README.md +50 -0
  243. package/templates/skills/_shared/detecting-artifacts.md +90 -0
  244. package/templates/skills/_shared/drift-recovery.md +98 -0
  245. package/templates/skills/_shared/extra-dispatch.md +1051 -0
  246. package/templates/skills/_shared/fable5-override.md +56 -0
  247. package/templates/skills/_shared/fallback-handoff.md +42 -0
  248. package/templates/skills/_shared/gh-stack-commands.md +65 -0
  249. package/templates/skills/_shared/gotchas.md +177 -0
  250. package/templates/skills/_shared/interview.md +144 -0
  251. package/templates/skills/_shared/lane-suspend.md +82 -0
  252. package/templates/skills/_shared/opus5-only.md +131 -0
  253. package/templates/skills/_shared/pr-templates.md +106 -0
  254. package/templates/skills/_shared/read-ladder.md +54 -0
  255. package/templates/skills/_shared/return-validation.md +145 -0
  256. package/templates/skills/_shared/smoke-gate.md +28 -0
  257. package/templates/skills/_shared/stack-plan.md +135 -0
  258. package/templates/skills/_shared/untrusted-input.md +63 -0
  259. package/templates/skills/context-combiner/SKILL.md +187 -0
  260. package/templates/skills/context-combiner/schemas/combined-report.md +78 -0
  261. package/templates/skills/context-combiner/schemas/combined-requirement-spec.md +87 -0
  262. package/templates/skills/orc/README.md +150 -0
  263. package/templates/skills/orc/SKILL.md +526 -0
  264. package/templates/skills/orc/config.md +389 -0
  265. package/templates/skills/orc/examples/full-run-mock.md +73 -0
  266. package/templates/skills/orc/references/analyst-gates.md +124 -0
  267. package/templates/skills/orc/references/effort-and-mode.md +224 -0
  268. package/templates/skills/orc/references/house-rules.md +20 -0
  269. package/templates/skills/orc/references/intake.md +120 -0
  270. package/templates/skills/orc/references/log-protocol.md +39 -0
  271. package/templates/skills/orc/references/pattern-gate.md +89 -0
  272. package/templates/skills/orc/references/plan-handoff.md +84 -0
  273. package/templates/skills/orc/references/preflight-report.md +220 -0
  274. package/templates/skills/orc/references/security-checklist.md +39 -0
  275. package/templates/skills/orc/references/stop-and-resume.md +160 -0
  276. package/templates/skills/orc/references/trace-protocol.md +314 -0
  277. package/templates/skills/orc/references/ultra-mode.md +123 -0
  278. package/templates/skills/orc/references/wave-grouping.md +121 -0
  279. package/templates/skills/orc/references/wiki-consult.md +177 -0
  280. package/templates/skills/orc/schemas/checkpoint.md +122 -0
  281. package/templates/skills/orc/schemas/intent-spec.md +42 -0
  282. package/templates/skills/orc/schemas/planning-output.md +279 -0
  283. package/templates/skills/orc/subskills/orc-checkpoint/SKILL.md +55 -0
  284. package/templates/skills/orc/subskills/orc-execution/SKILL.md +72 -0
  285. package/templates/skills/orc/subskills/orc-execution/core.md +151 -0
  286. package/templates/skills/orc/subskills/orc-execution/subagent.md +13 -0
  287. package/templates/skills/orc/subskills/orc-planner/SKILL.md +264 -0
  288. package/templates/skills/orc/subskills/orc-planner-mini/SKILL.md +121 -0
  289. package/templates/skills/orc/subskills/orc-pr/SKILL.md +51 -0
  290. package/templates/skills/orc/subskills/orc-pr/pr.md +22 -0
  291. package/templates/skills/orc/subskills/orc-pr/stack-gate.md +108 -0
  292. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +76 -0
  293. package/templates/skills/orc/subskills/orc-review-verify/core.md +135 -0
  294. package/templates/skills/orc/subskills/orc-review-verify/subagent.md +7 -0
  295. package/templates/skills/orc/subskills/orc-testgen/SKILL.md +45 -0
  296. package/templates/skills/orc/subskills/orc-testgen/core.md +59 -0
  297. package/templates/skills/orc/subskills/orc-testgen/subagent.md +7 -0
  298. package/templates/skills/orc-advisor/SKILL.md +60 -0
  299. package/templates/skills/orc-aftermath/SKILL.md +136 -0
  300. package/templates/skills/orc-aftermath/references/report.md +95 -0
  301. package/templates/skills/orc-analyze/SKILL.md +220 -0
  302. package/templates/skills/orc-analyze/examples/analyze-mock.md +42 -0
  303. package/templates/skills/orc-analyze/references/branching.md +51 -0
  304. package/templates/skills/orc-analyze/references/deep-mode.md +27 -0
  305. package/templates/skills/orc-analyze/references/thin-input.md +77 -0
  306. package/templates/skills/orc-analyze/schemas/report-audit.md +83 -0
  307. package/templates/skills/orc-analyze/schemas/report-prose.md +63 -0
  308. package/templates/skills/orc-analyze/schemas/report-requirement.md +78 -0
  309. package/templates/skills/orc-analyze/schemas/requirement-spec.md +77 -0
  310. package/templates/skills/orc-analyze-mini/SKILL.md +112 -0
  311. package/templates/skills/orc-analyze-mini/examples/quick-analysis-mock.md +31 -0
  312. package/templates/skills/orc-boundary/SKILL.md +208 -0
  313. package/templates/skills/orc-boundary/references/card.md +78 -0
  314. package/templates/skills/orc-boundary/references/gate.md +113 -0
  315. package/templates/skills/orc-brainstorm/SKILL.md +339 -0
  316. package/templates/skills/orc-brainstorm/references/brainstorm-doc.md +133 -0
  317. package/templates/skills/orc-brainstorm/references/lenses.md +152 -0
  318. package/templates/skills/orc-budget/SKILL.md +225 -0
  319. package/templates/skills/orc-budget/references/corpus.md +87 -0
  320. package/templates/skills/orc-challenge/README.md +142 -0
  321. package/templates/skills/orc-challenge/SKILL.md +255 -0
  322. package/templates/skills/orc-challenge/examples/code-module.md +110 -0
  323. package/templates/skills/orc-challenge/examples/council-full-roster.md +273 -0
  324. package/templates/skills/orc-challenge/examples/tsd-two-iterations.md +213 -0
  325. package/templates/skills/orc-challenge/references/conservation.md +107 -0
  326. package/templates/skills/orc-challenge/references/council.md +315 -0
  327. package/templates/skills/orc-challenge/references/cycle-state.md +185 -0
  328. package/templates/skills/orc-challenge/references/dimensions.md +121 -0
  329. package/templates/skills/orc-challenge/references/fix-brief.md +130 -0
  330. package/templates/skills/orc-challenge/references/intake.md +171 -0
  331. package/templates/skills/orc-challenge/references/kinds.md +44 -0
  332. package/templates/skills/orc-challenge/references/plain-english.md +98 -0
  333. package/templates/skills/orc-challenge/references/rubric.md +109 -0
  334. package/templates/skills/orc-challenge/references/sealed-slice.md +97 -0
  335. package/templates/skills/orc-challenge/references/verdict-doc.md +154 -0
  336. package/templates/skills/orc-claude/SKILL.md +199 -0
  337. package/templates/skills/orc-claude/examples/claude-run-mock.md +65 -0
  338. package/templates/skills/orc-claude/references/refresh.md +76 -0
  339. package/templates/skills/orc-claude/references/template.md +109 -0
  340. package/templates/skills/orc-diy/README.md +142 -0
  341. package/templates/skills/orc-diy/SKILL.md +70 -0
  342. package/templates/skills/orc-diy/references/blocks/analyze.md +24 -0
  343. package/templates/skills/orc-diy/references/blocks/execution.md +42 -0
  344. package/templates/skills/orc-diy/references/blocks/extra.md +55 -0
  345. package/templates/skills/orc-diy/references/blocks/header.md +55 -0
  346. package/templates/skills/orc-diy/references/blocks/mock-example.md +22 -0
  347. package/templates/skills/orc-diy/references/blocks/pattern.md +18 -0
  348. package/templates/skills/orc-diy/references/blocks/planning.md +34 -0
  349. package/templates/skills/orc-diy/references/blocks/review.md +18 -0
  350. package/templates/skills/orc-diy/references/blocks/scoring.md +16 -0
  351. package/templates/skills/orc-diy/references/blocks/security.md +25 -0
  352. package/templates/skills/orc-diy/references/blocks/ship.md +25 -0
  353. package/templates/skills/orc-diy/references/blocks/summary.md +18 -0
  354. package/templates/skills/orc-diy/references/blocks/testgen.md +17 -0
  355. package/templates/skills/orc-diy/references/blocks/trace.md +28 -0
  356. package/templates/skills/orc-diy/references/blocks/verify.md +25 -0
  357. package/templates/skills/orc-diy/references/blocks/wiki.md +26 -0
  358. package/templates/skills/orc-diy/references/compile.md +59 -0
  359. package/templates/skills/orc-diy/references/flow-schema.md +100 -0
  360. package/templates/skills/orc-diy/references/locked-blocks.md +37 -0
  361. package/templates/skills/orc-doc/README.md +229 -0
  362. package/templates/skills/orc-doc/SKILL.md +444 -0
  363. package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +325 -0
  364. package/templates/skills/orc-doc/references/chunking.md +527 -0
  365. package/templates/skills/orc-doc/references/gates.md +311 -0
  366. package/templates/skills/orc-doc/references/generation-rules.md +122 -0
  367. package/templates/skills/orc-doc/references/house-rules.md +170 -0
  368. package/templates/skills/orc-doc/references/import-targets.md +40 -0
  369. package/templates/skills/orc-doc/references/plain-language.md +66 -0
  370. package/templates/skills/orc-doc/references/portable-markdown.md +74 -0
  371. package/templates/skills/orc-doc/references/resume-protocol.md +228 -0
  372. package/templates/skills/orc-doc/references/templates/collaboration.md +118 -0
  373. package/templates/skills/orc-doc/references/templates/prd.md +133 -0
  374. package/templates/skills/orc-doc/references/templates/report.md +102 -0
  375. package/templates/skills/orc-doc/references/templates/tsd.md +122 -0
  376. package/templates/skills/orc-doc/references/templates/workflow.md +112 -0
  377. package/templates/skills/orc-explain/SKILL.md +57 -0
  378. package/templates/skills/orc-export/SKILL.md +154 -0
  379. package/templates/skills/orc-fast/SKILL.md +188 -0
  380. package/templates/skills/orc-grill/SKILL.md +207 -0
  381. package/templates/skills/orc-grill/references/grill-doc.md +105 -0
  382. package/templates/skills/orc-handoff/SKILL.md +204 -0
  383. package/templates/skills/orc-handoff/references/handoff-log.md +67 -0
  384. package/templates/skills/orc-handoff/references/surfaces.md +88 -0
  385. package/templates/skills/orc-judge/SKILL.md +82 -0
  386. package/templates/skills/orc-learn/SKILL.md +156 -0
  387. package/templates/skills/orc-learn/examples/learn-run-mock.md +61 -0
  388. package/templates/skills/orc-learn/references/deepen.md +70 -0
  389. package/templates/skills/orc-learn/references/refresh.md +65 -0
  390. package/templates/skills/orc-learn/references/template-knowledge.md +83 -0
  391. package/templates/skills/orc-learn/references/template-learning.md +67 -0
  392. package/templates/skills/orc-mini/SKILL.md +226 -0
  393. package/templates/skills/orc-mini/examples/mini-run-mock.md +50 -0
  394. package/templates/skills/orc-pact/SKILL.md +218 -0
  395. package/templates/skills/orc-pact/references/gate.md +70 -0
  396. package/templates/skills/orc-pact/references/ledger.md +99 -0
  397. package/templates/skills/orc-pattern/SKILL.md +124 -0
  398. package/templates/skills/orc-pattern/references/INDEX.md +73 -0
  399. package/templates/skills/orc-pattern/references/be-django.md +80 -0
  400. package/templates/skills/orc-pattern/references/be-express.md +82 -0
  401. package/templates/skills/orc-pattern/references/be-fastapi.md +107 -0
  402. package/templates/skills/orc-pattern/references/be-go.md +96 -0
  403. package/templates/skills/orc-pattern/references/be-nestjs.md +86 -0
  404. package/templates/skills/orc-pattern/references/be-postgres.md +98 -0
  405. package/templates/skills/orc-pattern/references/fe-a11y.md +36 -0
  406. package/templates/skills/orc-pattern/references/fe-angular.md +87 -0
  407. package/templates/skills/orc-pattern/references/fe-nextjs.md +65 -0
  408. package/templates/skills/orc-pattern/references/fe-perf.md +39 -0
  409. package/templates/skills/orc-pattern/references/fe-react.md +83 -0
  410. package/templates/skills/orc-pattern/references/fe-vue.md +75 -0
  411. package/templates/skills/orc-pattern/schemas/pattern-doc.md +62 -0
  412. package/templates/skills/orc-poly/SKILL.md +216 -0
  413. package/templates/skills/orc-poly/examples/poly-run-mock.md +51 -0
  414. package/templates/skills/orc-poly/references/gather.md +70 -0
  415. package/templates/skills/orc-poly/references/poly-spec.md +84 -0
  416. package/templates/skills/orc-pr-driver/README.md +349 -0
  417. package/templates/skills/orc-pr-driver/SKILL.md +167 -0
  418. package/templates/skills/orc-pr-driver/references/conflict-playbook.md +78 -0
  419. package/templates/skills/orc-pr-driver/references/green-gate.md +105 -0
  420. package/templates/skills/orc-pr-driver/references/orc-run-split.md +99 -0
  421. package/templates/skills/orc-pr-setup/README.md +436 -0
  422. package/templates/skills/orc-pr-setup/SKILL.md +184 -0
  423. package/templates/skills/orc-pr-setup/references/certainty-gate.md +66 -0
  424. package/templates/skills/orc-pr-setup/references/layer-taxonomy.md +67 -0
  425. package/templates/skills/orc-quick/README.md +423 -0
  426. package/templates/skills/orc-quick/SKILL.md +306 -0
  427. package/templates/skills/orc-quick/references/context-doc.md +114 -0
  428. package/templates/skills/orc-quick/references/dispatch-gate.md +163 -0
  429. package/templates/skills/orc-quick/references/gh-mode.md +127 -0
  430. package/templates/skills/orc-retro/SKILL.md +222 -0
  431. package/templates/skills/orc-retro/examples/retro-mock.md +171 -0
  432. package/templates/skills/orc-route/SKILL.md +165 -0
  433. package/templates/skills/orc-verify/SKILL.md +86 -0
  434. package/templates/skills/orc-verify/examples/verify-mock.md +33 -0
  435. package/templates/skills/orc-wiki/README.md +325 -0
  436. package/templates/skills/orc-wiki/SKILL.md +322 -0
  437. package/templates/skills/orc-wiki/examples/wiki-run-mock.md +37 -0
  438. package/templates/skills/orc-wiki/references/claude-md-injection.md +61 -0
  439. package/templates/skills/orc-wiki/references/crosslink-compile.md +39 -0
  440. package/templates/skills/orc-wiki/references/crosslink-kinds.md +57 -0
  441. package/templates/skills/orc-wiki/references/crosslink.md +284 -0
  442. package/templates/skills/orc-wiki/references/extra.md +79 -0
  443. package/templates/skills/orc-wiki/references/integrity-check.md +86 -0
  444. package/templates/skills/orc-wiki/references/orientation.md +51 -0
  445. package/templates/skills/orc-wiki/references/partial-refresh.md +203 -0
  446. package/templates/skills/orc-wiki/references/pattern-prewarm.md +19 -0
  447. package/templates/skills/orc-wiki/references/staleness.md +288 -0
  448. package/templates/skills/orc-wiki/schemas/crosslink-tag.md +166 -0
  449. package/templates/skills/orc-wiki/schemas/wiki-doc.md +120 -0
@@ -0,0 +1,416 @@
1
+ "use strict";
2
+ /* panels/runs.js — orc ui client
3
+ The run accordion — one row open at a time, detail fetched on first open.
4
+
5
+ Loaded by app.html in the order its numeric prefix names. Classic
6
+ script, no import/export: an ES module import carries no query string,
7
+ and every static request here needs the per-launch session token. */
8
+
9
+ // The CLI's own state words. `closed` (v0.49.2) is deliberately NOT `done`: the
10
+ // disk cannot prove the run finished, only that a human said they were finished
11
+ // with it — so it reads as neutral, never as a success.
12
+ const RUN_STATUS_KIND = { waiting: "warn", done: "ok", closed: "" };
13
+ // The aftermath grade chip. The LABELS are ours to shorten; the GRADE ids are
14
+ // the CLI's and are what the kind map is keyed on.
15
+ const AFTER_KIND = { HELD: "ok", CHURN: "warn", REVERTED: "bad", TOO_RECENT: "", SHALLOW: "" };
16
+ const AFTER_LABEL = { HELD: "✓ HELD", CHURN: "~ CHURN", REVERTED: "✗ REVERTED", TOO_RECENT: "– too recent", SHALLOW: "– no commits" };
17
+ const afterGrade = (after, slug) => ((after && after.runs) || []).find((r) => r.slug === slug) || null;
18
+
19
+ PANELS.runs = function (host) {
20
+ head(host, t("runs.title"), t("runs.sub"));
21
+ const body = el("div", "stack");
22
+ host.append(body);
23
+ renderRuns(body);
24
+ };
25
+
26
+ async function renderRuns(body) {
27
+ body.replaceChildren(skeleton(6));
28
+ let d;
29
+ let after = null;
30
+ try {
31
+ d = (await read("/api/runs")).data;
32
+ // One extra read, in parallel with nothing — the grade chip is per row and
33
+ // fetching it per row would be N requests for a list that is already loaded.
34
+ after = (await read("/api/aftermath").catch(() => ({ data: null }))).data;
35
+ } catch (e) {
36
+ body.replaceChildren(failBox(e));
37
+ return;
38
+ }
39
+ if (!d.total) {
40
+ body.replaceChildren(empty(t("runs.empty"), d.run_dir));
41
+ return;
42
+ }
43
+
44
+ const wanted = new URLSearchParams(location.hash.split("?")[1] || "").get("slug");
45
+ const out = frag();
46
+
47
+ // --- toolbar: status segments + a text filter, both client-side over an
48
+ // already-fetched list, so filtering never costs a request.
49
+ const bar = el("div", "toolbar");
50
+ const search = el("div", "search");
51
+ const input = el("input", "text-input");
52
+ input.type = "search";
53
+ input.placeholder = t("runs.search");
54
+ search.append(input);
55
+ bar.append(search);
56
+
57
+ let statusFilter = "all";
58
+ const seg = el("div", "seg");
59
+ const segs = [
60
+ ["all", t("runs.filterAll")],
61
+ ["waiting", t("runs.filterWaiting")],
62
+ ["done", t("runs.filterDone")],
63
+ ["closed", t("runs.filterClosed")],
64
+ ["other", t("runs.filterOther")],
65
+ ];
66
+ for (const [val, label] of segs) {
67
+ const b = el("button", null, label);
68
+ b.type = "button";
69
+ b.setAttribute("aria-pressed", String(val === statusFilter));
70
+ b.addEventListener("click", () => {
71
+ statusFilter = val;
72
+ for (const other of seg.children) other.setAttribute("aria-pressed", "false");
73
+ b.setAttribute("aria-pressed", "true");
74
+ apply();
75
+ });
76
+ seg.append(b);
77
+ }
78
+ bar.append(seg);
79
+ const count = el("span", "toolbar-result");
80
+ bar.append(count);
81
+ const closeAll = el("button", "btn btn-ghost btn-sm", t("runs.collapseAll"));
82
+ closeAll.type = "button";
83
+ closeAll.addEventListener("click", () => collapseAll());
84
+ bar.append(closeAll);
85
+ out.append(bar);
86
+
87
+ const list = el("div", "run-list");
88
+ const rows = [];
89
+
90
+ const collapseAll = (except) => {
91
+ for (const r of rows) if (r.row !== except) setOpen(r, false);
92
+ };
93
+
94
+ function setOpen(entry, open) {
95
+ entry.row.classList.toggle("open", open);
96
+ entry.head.setAttribute("aria-expanded", String(open));
97
+ if (open && !entry.loaded) {
98
+ entry.loaded = true;
99
+ loadRunDetail(entry.pane, entry.slug, entry.grade);
100
+ }
101
+ }
102
+
103
+ for (const r of d.runs) {
104
+ const row = el("div", "run-row");
105
+ row.dataset.slug = r.slug;
106
+ row.dataset.status = r.status;
107
+
108
+ const headBtn = el("button", "run-card");
109
+ headBtn.type = "button";
110
+ headBtn.setAttribute("aria-expanded", "false");
111
+ headBtn.append(el("span", "run-caret", "▸"));
112
+ // Status is the CLI's vocabulary (`waiting` / `done` / `empty`) — the same
113
+ // word `orc run list` prints. Shown as-is in every language.
114
+ headBtn.append(chip(r.status, RUN_STATUS_KIND[r.status] || ""));
115
+ // The aftermath grade (v0.46.0). The CLI's own word, and `TOO_RECENT` KEEPS
116
+ // ITS SLOT — it is an answer ("younger than 7 days"), not a gap, and hiding
117
+ // it would make a fresh run and an ungraded one look identical.
118
+ const grade = afterGrade(after, r.slug);
119
+ if (grade) {
120
+ const gc = chip(AFTER_LABEL[grade.grade] || grade.grade, AFTER_KIND[grade.grade] || "");
121
+ gc.title = grade.note || "";
122
+ headBtn.append(gc);
123
+ // A fifth child needs a fifth column — see `.run-card.has-extra`. The
124
+ // Docs list does the same for its "you edited it" chip.
125
+ headBtn.classList.add("has-extra");
126
+ }
127
+ const mid = el("div", "run-mid");
128
+ mid.append(el("div", "run-slug", r.slug));
129
+ const where = [r.lane, r.phase && "phase " + r.phase, r.wave].filter(Boolean).join(" · ");
130
+ mid.append(el("div", "run-where", where || "—"));
131
+ // A closed row NEVER disappears and it always carries the reason the human
132
+ // gave — a state change with no visible reason is a state nobody can audit.
133
+ if (r.closed && r.closed.reason)
134
+ mid.append(el("div", "run-closed-why", t("runs.close.was", { reason: r.closed.reason })));
135
+ headBtn.append(mid, el("div", "run-age", relAge(r.updated_ms)));
136
+
137
+ // The fold. `.run-body-inner` is the real element the 1fr→0fr grid
138
+ // collapses against; without it there is nothing to animate to zero.
139
+ const pane = el("div", "run-pane stack stack-sm");
140
+ pane.append(skeleton(4));
141
+ const inner = el("div", "run-body-inner");
142
+ inner.append(pane);
143
+ const fold = el("div", "run-body");
144
+ fold.append(inner);
145
+
146
+ const entry = { row, head: headBtn, pane, slug: r.slug, grade, loaded: false };
147
+ rows.push(entry);
148
+
149
+ headBtn.addEventListener("click", () => {
150
+ const isOpen = row.classList.contains("open");
151
+ collapseAll(row);
152
+ setOpen(entry, !isOpen);
153
+ // A row that opens near the bottom of the viewport would otherwise reveal
154
+ // its content off-screen — the one scroll this panel ever performs.
155
+ if (!isOpen)
156
+ requestAnimationFrame(() => {
157
+ const rect = row.getBoundingClientRect();
158
+ if (rect.top < 0 || rect.top > window.innerHeight * 0.6)
159
+ row.scrollIntoView({ behavior: matchMedia("(prefers-reduced-motion: reduce)").matches ? "auto" : "smooth", block: "start" });
160
+ });
161
+ });
162
+
163
+ row.append(headBtn, fold);
164
+ list.append(row);
165
+ }
166
+ out.append(list);
167
+
168
+ const none = empty(t("runs.noMatch"));
169
+ none.classList.add("hidden");
170
+ out.append(none);
171
+
172
+ function apply() {
173
+ const q = input.value.trim().toLowerCase();
174
+ let shown = 0;
175
+ for (const entry of rows) {
176
+ const st = entry.row.dataset.status;
177
+ const statusHit =
178
+ statusFilter === "all"
179
+ ? true
180
+ : statusFilter === "other"
181
+ ? st !== "waiting" && st !== "done" && st !== "closed"
182
+ : st === statusFilter;
183
+ const textHit = !q || entry.row.textContent.toLowerCase().includes(q);
184
+ const hit = statusHit && textHit;
185
+ entry.row.classList.toggle("hidden", !hit);
186
+ // A filtered-out row must not stay open behind the filter — reopening the
187
+ // filter would reveal a run you no longer have in view.
188
+ if (!hit) setOpen(entry, false);
189
+ if (hit) shown++;
190
+ }
191
+ count.textContent = t("runs.count", { shown, total: d.total });
192
+ none.classList.toggle("hidden", shown > 0);
193
+ }
194
+ input.addEventListener("input", apply);
195
+ input.addEventListener("keydown", (e) => {
196
+ if (e.key === "Escape" && input.value) {
197
+ e.stopPropagation();
198
+ input.value = "";
199
+ apply();
200
+ }
201
+ });
202
+
203
+ body.replaceChildren(out);
204
+ apply();
205
+
206
+ // Deep link from Overview: open that run, and only that run.
207
+ if (wanted) {
208
+ const entry = rows.find((r) => r.slug === wanted);
209
+ if (entry) {
210
+ setOpen(entry, true);
211
+ requestAnimationFrame(() => entry.row.scrollIntoView({ block: "center" }));
212
+ }
213
+ }
214
+ }
215
+
216
+ // Fills one expanded row. Identical content to the old detail card — the change
217
+ // is WHERE it renders, not what it says.
218
+ // The aftermath detail goes INSIDE the expanded row — there is no detail box
219
+ // below the list and no `showRun`. One row open at a time, fetched on first open.
220
+ function afterBox(grade) {
221
+ if (!grade) return null;
222
+ const box = el("div", "after-box");
223
+ box.append(el("div", "after-head", t("runs.after.signals")));
224
+ for (const sig of grade.signals || []) {
225
+ const line = el("div", "after-row");
226
+ line.append(chip(sig.kind, sig.strength >= 3 ? "bad" : "warn"));
227
+ line.append(el("span", null, sig.detail));
228
+ box.append(line);
229
+ }
230
+ // Churn is a SIGNAL, not a verdict — the caveat always travels with the
231
+ // evidence, including on HELD ("nothing came back" is not "it worked").
232
+ if (grade.note) box.append(el("div", "note", grade.note));
233
+ return box;
234
+ }
235
+
236
+ function loadRunDetail(pane, slug, grade) {
237
+ Promise.all([
238
+ read("/api/run?slug=" + encodeURIComponent(slug)),
239
+ read("/api/mock?slug=" + encodeURIComponent(slug)).catch(() => ({ data: null })),
240
+ ])
241
+ .then(([runRes, mockRes]) => {
242
+ const d = runRes.data;
243
+ const mock = mockRes && mockRes.data && mockRes.data.found ? mockRes.data : null;
244
+ const out = frag();
245
+ const ab = afterBox(grade);
246
+ if (ab) out.append(ab);
247
+
248
+ // The action that CLEARS the caution lives in the panel the caution points
249
+ // at — the FINDING_ROUTE principle. A waiting run the user has abandoned is
250
+ // what blocks the upgrade preview, and this is the button that unblocks it.
251
+ // A close changes the LIST (the row's status, the filters, the count), not
252
+ // just this row, so the refresh is the panel's, not the row's.
253
+ const acts = runCloseActions(d, () => route());
254
+ if (acts) out.append(acts);
255
+
256
+ out.append(
257
+ kvList([
258
+ [t("runs.field.slug"), d.slug],
259
+ [t("runs.field.status"), d.status],
260
+ [t("runs.field.lane"), d.stands && d.stands.lane],
261
+ [t("runs.field.phase"), d.stands && d.stands.phase],
262
+ [t("runs.field.wave"), d.stands && d.stands.wave],
263
+ [t("runs.field.folder"), d.dir],
264
+ [t("runs.field.updated"), relAge(d.updated_ms)],
265
+ ])
266
+ );
267
+
268
+ const tabs = el("div", "tabs");
269
+ const view = el("div", "tab-pane");
270
+ const views = [];
271
+ const addTab = (label, render) => views.push({ label, render });
272
+
273
+ if (d.resume)
274
+ addTab(t("runs.tab.resume"), () => {
275
+ const box = el("div", "stack stack-sm");
276
+ box.append(el("div", "note", t("runs.resume.note")));
277
+ const actions = el("div", "row-actions");
278
+ const cp = el("button", "btn btn-sm", t("runs.resume.copy"));
279
+ cp.type = "button";
280
+ cp.addEventListener("click", () => copy(d.resume, t("runs.resume.copied")));
281
+ actions.append(cp);
282
+ box.append(actions, el("pre", "block wrap", d.resume));
283
+ return box;
284
+ });
285
+ if (d.state_of_play) addTab(t("runs.tab.state"), () => el("pre", "block wrap", d.state_of_play));
286
+ if (d.checkpoint)
287
+ addTab(t("runs.tab.checkpoint"), () => {
288
+ const box = el("div", "stack stack-sm");
289
+ // These four are checkpoint.json's own field names — file keys, not
290
+ // labels, so they stay exactly as the file spells them.
291
+ box.append(
292
+ kvList([
293
+ ["phase", d.checkpoint.phase],
294
+ ["wave", d.checkpoint.wave],
295
+ ["updated_at", d.checkpoint.updated_at],
296
+ ["trace_path", d.checkpoint.trace_path],
297
+ ])
298
+ );
299
+ box.append(el("pre", "block", JSON.stringify(d.checkpoint, null, 2)));
300
+ return box;
301
+ });
302
+ if (d.trace)
303
+ addTab(t("runs.tab.trace"), () => {
304
+ const box = el("div", "stack stack-sm");
305
+ box.append(el("div", "note", t("runs.trace.note")));
306
+ box.append(el("pre", "block", d.trace));
307
+ return box;
308
+ });
309
+ // Honesty rule: a run with no mock example shows "Not generated for this
310
+ // run", never an empty state that implies one is missing. And never a
311
+ // Run button.
312
+ addTab(t("runs.tab.mock"), () => {
313
+ if (!mock) return empty(t("runs.mock.none"), t("runs.mock.noneHint"));
314
+ const box = el("div", "stack stack-sm");
315
+ box.append(
316
+ kvList([
317
+ [t("runs.field.folder"), mock.dir],
318
+ [t("runs.field.files"), String(mock.files.length)],
319
+ [t("runs.field.written"), relAge(mock.mtime_ms)],
320
+ ])
321
+ );
322
+ box.append(el("div", "note", t("runs.mock.readonly")));
323
+ if (mock.readme) box.append(el("pre", "block wrap", mock.readme));
324
+ const fl = el("div", "file-list");
325
+ for (const f of mock.files) fl.append(el("div", null, f.path));
326
+ box.append(fl);
327
+ return box;
328
+ });
329
+ if (!views.length)
330
+ addTab(t("runs.tab.files"), () => el("pre", "block", (d.files || []).join("\n") || t("runs.emptyFolder")));
331
+
332
+ const show = (v, btn) => {
333
+ for (const other of tabs.children) other.setAttribute("aria-selected", "false");
334
+ btn.setAttribute("aria-selected", "true");
335
+ view.replaceChildren(v.render());
336
+ // Re-trigger the tab-swap fade; a replaced child alone shows no change.
337
+ view.style.animation = "none";
338
+ void view.offsetHeight;
339
+ view.style.animation = "";
340
+ };
341
+ views.forEach((v, i) => {
342
+ const b = el("button", null, v.label);
343
+ b.type = "button";
344
+ b.setAttribute("aria-selected", String(i === 0));
345
+ b.addEventListener("click", () => show(v, b));
346
+ tabs.append(b);
347
+ });
348
+ view.replaceChildren(views[0].render());
349
+ out.append(tabs, view);
350
+ pane.replaceChildren(out);
351
+ })
352
+ .catch((e) => pane.replaceChildren(empty(t("runs.openFail"), String(e.message))));
353
+ }
354
+
355
+ /* MARK AS DONE / REOPEN (v0.49.2).
356
+
357
+ `RESUME.md` existing IS the unfinished flag, and ORC deletes it at FINISH — so
358
+ a run the user abandoned stayed "waiting" forever, kept being offered by
359
+ `orc resume`, and kept the upgrade preview blocked with no way out.
360
+
361
+ The confirmation names the file that MOVES and says, in as many words, that
362
+ nothing is deleted. The reason is REQUIRED — the CLI refuses without one, and
363
+ the form does not second-guess that: it submits and reports what came back. */
364
+ function runCloseActions(d, onDone) {
365
+ if (d.status !== "waiting" && d.status !== "closed") return null;
366
+ const box = el("div", "row-actions");
367
+ if (d.status === "waiting") {
368
+ const b = el("button", "btn btn-sm", t("runs.close.button"));
369
+ b.type = "button";
370
+ b.addEventListener("click", () => confirmRunClose(d.slug, onDone));
371
+ box.append(b);
372
+ box.append(el("span", "note", t("runs.close.hint")));
373
+ } else {
374
+ const b = el("button", "btn btn-sm btn-ghost", t("runs.close.reopen"));
375
+ b.type = "button";
376
+ b.addEventListener("click", async () => {
377
+ const r = await post("/api/run/reopen", { slug: d.slug });
378
+ toast(r.ok ? t("runs.close.reopened") : t("runs.close.failed"), r.ok ? "ok" : "bad", r.output);
379
+ onDone();
380
+ });
381
+ box.append(b);
382
+ if (d.closed && d.closed.reason) box.append(el("span", "note", t("runs.close.was", { reason: d.closed.reason })));
383
+ }
384
+ return box;
385
+ }
386
+
387
+ function confirmRunClose(slug, onDone) {
388
+ const wrap = frag();
389
+ wrap.append(el("p", null, t("runs.close.confirmBody", { slug })));
390
+ // Never the word "delete": this MOVES one file and writes one more.
391
+ wrap.append(el("div", "note", t("runs.close.moves")));
392
+ const input = el("input", "text-input");
393
+ input.type = "text";
394
+ input.placeholder = t("runs.close.reasonPlaceholder");
395
+ wrap.append(input);
396
+ const cmd = el("pre", "cmd", `orc run close ${slug} --reason "…"`);
397
+ wrap.append(cmd);
398
+ input.addEventListener("input", () => {
399
+ cmd.textContent = `orc run close ${slug} --reason "${input.value || "…"}"`;
400
+ });
401
+ modal({
402
+ title: t("runs.close.confirmTitle"),
403
+ body: wrap,
404
+ actions: {
405
+ [t("common.cancel")]: null,
406
+ [t("runs.close.button")]: async () => {
407
+ const reason = input.value.trim();
408
+ if (!reason) return toast(t("runs.close.needReason"), "bad");
409
+ const r = await post("/api/run/close", { slug, reason });
410
+ toast(r.ok ? t("runs.close.done") : t("runs.close.failed"), r.ok ? "ok" : "bad", r.output);
411
+ onDone();
412
+ },
413
+ },
414
+ });
415
+ requestAnimationFrame(() => input.focus());
416
+ }