@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,462 @@
1
+ /* 03-components.css — orc ui
2
+ Shared furniture: page-head, stack, card, grid, stat tile, kv list, chip,
3
+ button, scroll-x, pre, table, note, empty, banner, changelog entry,
4
+ skeleton, toast, modal, the busy veil, kbd.
5
+
6
+ The <link> ORDER in app.html is the cascade order, and the numeric
7
+ prefix is that order. No @import: it would carry no session token and
8
+ 401. */
9
+
10
+
11
+ /* ------------------------------------------------------------ COMPONENTS -- */
12
+
13
+ .page-head {
14
+ display: flex;
15
+ align-items: flex-end;
16
+ justify-content: space-between;
17
+ gap: var(--sp-4);
18
+ flex-wrap: wrap;
19
+ margin-bottom: var(--sp-5);
20
+ }
21
+ .page-head h1 { font-size: 20px; font-weight: 600; letter-spacing: -.01em; }
22
+ .page-sub { color: var(--text-dim); font-size: 13px; margin-top: 2px; }
23
+
24
+ /* SPACING IS OWNED BY THE CONTAINER, never by adjacent-sibling pairs.
25
+ The original model spaced `.card + .card` — which only ever matched two cards
26
+ in a row. A `.grid` of stat tiles followed by a card, a `.tier` followed by a
27
+ card, a `.run-list` followed by a card: all of those are the COMMON sequences
28
+ in these panels, none of them matched, and every one of them collided. A rule
29
+ that has to be re-stated for each new pair of block types is a rule that will
30
+ be forgotten the next time a panel gains a block type.
31
+
32
+ `.stack` is that container. Every panel body and async slot carries it, so
33
+ spacing holds for any mix of children, in any order, forever. Because the gap
34
+ belongs to the parent, NO block type may carry its own outer margin — that is
35
+ what would double up. */
36
+ .stack { display: flex; flex-direction: column; gap: var(--sp-4); min-width: 0; }
37
+ .stack-sm { gap: var(--sp-3); }
38
+ /* A flex column child will not shrink below its content without this, which is
39
+ how a wide table or a long path escapes its card. */
40
+ .stack > * { min-width: 0; }
41
+
42
+ .card {
43
+ background: var(--surface);
44
+ border: 1px solid var(--line);
45
+ border-radius: var(--radius);
46
+ padding: var(--sp-4) var(--sp-5);
47
+ }
48
+ /* Card internals get the same treatment: a card holds a head, then any mix of
49
+ notes, tables, lists and action rows, and those collided too. */
50
+ .card > * + * { margin-top: var(--sp-3); }
51
+ .card-head {
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: space-between;
55
+ gap: var(--sp-3);
56
+ }
57
+ .card-head h2 { font-size: 13px; font-weight: 600; text-transform: uppercase; letter-spacing: .07em; color: var(--text-dim); }
58
+
59
+ .grid { display: grid; gap: var(--sp-4); }
60
+ .grid-2 { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
61
+ .grid-3 { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
62
+
63
+ .stat { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: var(--sp-4); }
64
+ .stat-label { font-size: 11px; text-transform: uppercase; letter-spacing: .07em; color: var(--text-faint); }
65
+ .stat-value { font-size: 26px; font-weight: 600; line-height: 1.2; margin-top: 4px; letter-spacing: -.02em; }
66
+ .stat-value .chip { vertical-align: middle; margin-left: var(--sp-2); }
67
+ .stat-note { font-size: 10px; color: var(--text-dim); margin-top: 2px; }
68
+ .stat-ok { color: var(--ok); }
69
+ .stat-warn { color: var(--warn); }
70
+ .stat-bad { color: var(--bad); }
71
+ /* The version tile answers over the network, so it has a waiting state. It
72
+ dims rather than moves: a tile that reflows when the answer lands shifts the
73
+ three tiles beside it. */
74
+ .stat-pending .stat-value { color: var(--text-faint); font-size: 18px; }
75
+ .stat-pending { animation: breathe 1.6s ease-in-out infinite; }
76
+ @keyframes breathe {
77
+ 0%, 100% { opacity: 1; }
78
+ 50% { opacity: .62; }
79
+ }
80
+
81
+ /* A tile that LEADS somewhere says so by moving; a tile that leads nowhere is a
82
+ plain div and never reacts. `text-align: left` because it is a <button> now
83
+ and would otherwise centre its own text. */
84
+ .stat-link {
85
+ text-align: left;
86
+ width: 100%;
87
+ font: inherit;
88
+ cursor: pointer;
89
+ position: relative;
90
+ transition: border-color var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease),
91
+ background var(--dur-fast) var(--ease);
92
+ }
93
+ .stat-link::after {
94
+ content: "→";
95
+ position: absolute;
96
+ top: var(--sp-3);
97
+ right: var(--sp-3);
98
+ color: var(--text-faint);
99
+ opacity: 0;
100
+ transform: translateX(-4px);
101
+ transition: opacity var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease);
102
+ }
103
+ .stat-link:hover { border-color: var(--accent-dim); background: var(--surface-2); transform: translateY(-2px); }
104
+ .stat-link:hover::after { opacity: 1; transform: none; }
105
+
106
+ .kv { display: grid; grid-template-columns: minmax(120px, max-content) minmax(0, 1fr); gap: 6px var(--sp-4); }
107
+ .kv dt { color: var(--text-faint); font-size: 12px; }
108
+ .kv dd { margin: 0; font-family: var(--mono); font-size: 12px; word-break: break-all; }
109
+ /* A copy button that is always visible turns a value list into a row of
110
+ buttons, so it fades in with the row it belongs to. It stays reachable by
111
+ keyboard regardless — :focus-within, not hover alone. */
112
+ .kv-copy { display: flex; align-items: baseline; gap: var(--sp-2); }
113
+ .copy-btn {
114
+ border: 1px solid var(--line);
115
+ background: var(--surface-2);
116
+ color: var(--text-dim);
117
+ border-radius: 4px;
118
+ padding: 0 6px;
119
+ font-size: 10px;
120
+ font-family: var(--font);
121
+ cursor: pointer;
122
+ opacity: 0;
123
+ flex: none;
124
+ transition: opacity var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease),
125
+ border-color var(--dur-fast) var(--ease);
126
+ }
127
+ .kv-copy:hover .copy-btn, .copy-btn:focus-visible { opacity: 1; }
128
+ .copy-btn:hover { color: var(--accent); border-color: var(--accent-dim); }
129
+
130
+ .chip {
131
+ display: inline-flex;
132
+ align-items: center;
133
+ gap: 6px;
134
+ padding: 2px 9px;
135
+ border-radius: 100px;
136
+ font-size: 11px;
137
+ font-weight: 600;
138
+ letter-spacing: .04em;
139
+ text-transform: uppercase;
140
+ background: var(--idle-wash);
141
+ color: var(--text-dim);
142
+ border: 1px solid transparent;
143
+ }
144
+ .chip-ok { background: var(--ok-wash); color: var(--ok); }
145
+ .chip-warn { background: var(--warn-wash); color: var(--warn); }
146
+ .chip-bad { background: var(--bad-wash); color: var(--bad); }
147
+ .chip-info { background: var(--accent-wash); color: var(--accent); }
148
+
149
+ /* STALE gets a slow pulse; FRESH is static. Motion here is information. */
150
+ .chip-bad.chip-pulse { animation: pulse 2.4s ease-in-out infinite; }
151
+ @keyframes pulse {
152
+ 0%, 100% { box-shadow: 0 0 0 0 var(--bad-wash); }
153
+ 50% { box-shadow: 0 0 0 5px transparent; }
154
+ }
155
+
156
+ .btn {
157
+ display: inline-flex;
158
+ align-items: center;
159
+ gap: 6px;
160
+ padding: 6px 13px;
161
+ border: 1px solid var(--line);
162
+ border-radius: var(--radius-sm);
163
+ background: var(--surface-2);
164
+ color: var(--text);
165
+ cursor: pointer;
166
+ transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), opacity var(--dur-fast);
167
+ }
168
+ .btn:hover:not(:disabled) { background: var(--surface-3); border-color: var(--accent-dim); }
169
+ /* A press that moves confirms the click landed — the one bit of feedback that
170
+ is never wrong, even when the request behind it is slow. */
171
+ .btn:active:not(:disabled) { transform: translateY(1px); }
172
+ .btn:disabled { opacity: .45; cursor: not-allowed; }
173
+ .btn-sm { padding: 3px 9px; font-size: 12px; }
174
+ .btn-primary { background: var(--accent); border-color: var(--accent); color: #fff; }
175
+ .btn-primary:hover:not(:disabled) { background: var(--accent-dim); border-color: var(--accent-dim); }
176
+ .btn-danger { background: var(--bad-wash); border-color: var(--bad); color: var(--bad); }
177
+ .btn-danger:hover:not(:disabled) { background: var(--bad); color: #fff; }
178
+ .btn-ghost { background: transparent; }
179
+
180
+ .row-actions { display: flex; gap: var(--sp-2); flex-wrap: wrap; }
181
+
182
+ /* Wide content scrolls in its OWN container — the page body never scrolls
183
+ horizontally.
184
+
185
+ THE SCROLLBAR IS PART OF THE PICTURE (v0.44.0). The default platform bar is
186
+ an opaque grey slab with its own track colour, and under the flow stepper it
187
+ cut a hard band across the bottom of the rail — the loudest thing on a card
188
+ whose whole job is to be read as a diagram. So: no track at all (the card's
189
+ own background shows through), a thin rounded thumb in the panel's line
190
+ colour, and full contrast only on hover. It is quiet until you reach for it.
191
+
192
+ Both syntaxes are given because they are not interchangeable: Firefox reads
193
+ `scrollbar-width`/`scrollbar-color`, WebKit and Chromium read the
194
+ pseudo-elements, and neither falls back to the other. */
195
+ .scroll-x { overflow-x: auto; }
196
+
197
+ .scroll-x, .file-list, .block, .modal, .run-detail, pre {
198
+ scrollbar-width: thin;
199
+ scrollbar-color: var(--line) transparent;
200
+ }
201
+ .scroll-x::-webkit-scrollbar,
202
+ .file-list::-webkit-scrollbar,
203
+ .block::-webkit-scrollbar,
204
+ .modal::-webkit-scrollbar,
205
+ pre::-webkit-scrollbar { height: 9px; width: 9px; }
206
+ /* Transparent TRACK, transparent corner — the card behind it is the background,
207
+ so a scrolling box no longer announces itself with a grey gutter. */
208
+ .scroll-x::-webkit-scrollbar-track,
209
+ .file-list::-webkit-scrollbar-track,
210
+ .block::-webkit-scrollbar-track,
211
+ .modal::-webkit-scrollbar-track,
212
+ pre::-webkit-scrollbar-track { background: transparent; }
213
+ .scroll-x::-webkit-scrollbar-corner,
214
+ .file-list::-webkit-scrollbar-corner,
215
+ .block::-webkit-scrollbar-corner,
216
+ .modal::-webkit-scrollbar-corner,
217
+ pre::-webkit-scrollbar-corner { background: transparent; }
218
+ .scroll-x::-webkit-scrollbar-thumb,
219
+ .file-list::-webkit-scrollbar-thumb,
220
+ .block::-webkit-scrollbar-thumb,
221
+ .modal::-webkit-scrollbar-thumb,
222
+ pre::-webkit-scrollbar-thumb {
223
+ background: var(--line);
224
+ border-radius: 999px;
225
+ /* A transparent border with `background-clip: content-box` is what keeps the
226
+ thumb visually THINNER than the track it needs for a comfortable hit area. */
227
+ border: 2px solid transparent;
228
+ background-clip: content-box;
229
+ transition: background var(--dur-fast) var(--ease);
230
+ }
231
+ .scroll-x:hover::-webkit-scrollbar-thumb,
232
+ .file-list:hover::-webkit-scrollbar-thumb,
233
+ .block:hover::-webkit-scrollbar-thumb,
234
+ .modal:hover::-webkit-scrollbar-thumb,
235
+ pre:hover::-webkit-scrollbar-thumb { background: var(--accent-dim); background-clip: content-box; }
236
+ .scroll-x::-webkit-scrollbar-thumb:active,
237
+ .file-list::-webkit-scrollbar-thumb:active,
238
+ .block::-webkit-scrollbar-thumb:active,
239
+ .modal::-webkit-scrollbar-thumb:active,
240
+ pre::-webkit-scrollbar-thumb:active { background: var(--accent); background-clip: content-box; }
241
+
242
+ table { border-collapse: collapse; width: 100%; font-size: 13px; }
243
+ th, td { text-align: left; padding: 7px var(--sp-3); border-bottom: 1px solid var(--line-soft); vertical-align: top; }
244
+ th { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--text-faint); font-weight: 600; }
245
+ tbody tr:last-child td { border-bottom: 0; }
246
+ tbody tr:hover { background: var(--surface-2); }
247
+
248
+ pre.block {
249
+ background: var(--surface-2);
250
+ border: 1px solid var(--line-soft);
251
+ border-radius: var(--radius-sm);
252
+ padding: var(--sp-3);
253
+ overflow-x: auto;
254
+ font-size: 12px;
255
+ line-height: 1.5;
256
+ white-space: pre;
257
+ color: var(--text-dim);
258
+ }
259
+ pre.block.wrap { white-space: pre-wrap; word-break: break-word; }
260
+
261
+ .note { color: var(--text-dim); font-size: 12.5px; }
262
+ .note + .note { margin-top: var(--sp-2); }
263
+ /* `note bad` was written by six panels and styled by NONE of them (found at
264
+ v0.50.0): a malformed boundary card, a rejected house rule and an unpriced
265
+ band all rendered in the same grey as the sentence explaining them. The class
266
+ was always the intent; this is the rule that was missing. */
267
+ .note.bad { color: var(--bad); }
268
+ .note.warn { color: var(--warn); }
269
+ .empty {
270
+ padding: var(--sp-6) var(--sp-4);
271
+ text-align: center;
272
+ color: var(--text-dim);
273
+ border: 1px dashed var(--line);
274
+ border-radius: var(--radius);
275
+ }
276
+ /* The reason a read failed, in the CLI's own output. Left-aligned inside a
277
+ centred box on purpose: it is a transcript, not a sentence. */
278
+ .empty .fail-detail {
279
+ margin-top: var(--sp-3);
280
+ text-align: left;
281
+ max-height: 220px;
282
+ overflow: auto;
283
+ font-size: 12px;
284
+ }
285
+
286
+ .banner {
287
+ display: flex;
288
+ gap: var(--sp-3);
289
+ padding: var(--sp-3) var(--sp-4);
290
+ border-radius: var(--radius);
291
+ border: 1px solid var(--warn);
292
+ background: var(--warn-wash);
293
+ font-size: 13px;
294
+ }
295
+ .banner-bad { border-color: var(--bad); background: var(--bad-wash); }
296
+ .banner strong { display: block; margin-bottom: 2px; }
297
+ .banner-fix { display: flex; align-items: center; gap: var(--sp-2); margin-top: var(--sp-2); flex-wrap: wrap; }
298
+
299
+ /* The update banner is a button: "what changed" is the useful question, and it
300
+ should not require leaving for GitHub to answer it. */
301
+ .banner-update {
302
+ width: 100%;
303
+ align-items: center;
304
+ border-color: var(--accent);
305
+ background: var(--accent-wash);
306
+ color: inherit;
307
+ cursor: pointer;
308
+ text-align: left;
309
+ font: inherit;
310
+ transition: background var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease);
311
+ animation: banner-drop var(--dur-slow) var(--ease);
312
+ }
313
+ .banner-update:hover { background: var(--surface-3); transform: translateY(-1px); }
314
+ .banner-update .note { color: var(--text-dim); }
315
+ /* All three children on ONE vertical centre line (v0.44.1). The badge used to
316
+ be `align-self: flex-start` while the row was `align-items: center` and the
317
+ CTA sat on the centre — three items, three different alignments, in a row
318
+ that is 69px tall. Nothing about a "NEW" pill wants to be pinned to the top
319
+ of a two-line message. */
320
+ .banner-badge {
321
+ flex: none;
322
+ background: var(--accent);
323
+ color: #fff;
324
+ border-radius: 100px;
325
+ padding: 1px 8px;
326
+ font-size: 10px;
327
+ font-weight: 700;
328
+ letter-spacing: .08em;
329
+ }
330
+ .banner-more { margin-left: auto; flex: none; color: var(--accent); font-size: 12px; white-space: nowrap; }
331
+ @keyframes banner-drop {
332
+ from { opacity: 0; transform: translateY(-10px); }
333
+ to { opacity: 1; transform: none; }
334
+ }
335
+
336
+ .cl-entry { border-left: 2px solid var(--line); padding-left: var(--sp-3); }
337
+ .cl-head { display: flex; align-items: baseline; gap: var(--sp-2); flex-wrap: wrap; }
338
+ .cl-version { font-family: var(--mono); font-size: 13px; color: var(--accent); font-weight: 600; }
339
+ .cl-date { font-size: 11px; color: var(--text-faint); margin-left: auto; }
340
+ .cl-title { font-size: 13px; font-weight: 600; margin-top: 2px; }
341
+ /* `pre-wrap` is still right — the body carries real paragraph breaks — but the
342
+ text reaching it has been REFLOWED first (see `reflowMd`), so a paragraph is
343
+ one long line that wraps to this box instead of the README's 78-column
344
+ hard wraps ending raggedly in the middle of it. */
345
+ .cl-body { font-size: 12.5px; color: var(--text-dim); white-space: pre-wrap; margin-top: var(--sp-2); line-height: 1.6; overflow-wrap: anywhere; }
346
+
347
+ /* Loading is a skeleton shimmer, never a spinner. */
348
+ .skeleton {
349
+ height: 12px;
350
+ border-radius: 4px;
351
+ background: linear-gradient(90deg, var(--surface-2) 25%, var(--surface-3) 37%, var(--surface-2) 63%);
352
+ background-size: 400% 100%;
353
+ animation: shimmer 1.3s ease-in-out infinite;
354
+ }
355
+ .skeleton.w-60 { width: 60%; }
356
+ .skeleton.w-40 { width: 40%; }
357
+ .skeleton.tall { height: 56px; }
358
+ @keyframes shimmer {
359
+ from { background-position: 100% 0; }
360
+ to { background-position: 0 0; }
361
+ }
362
+
363
+ .toasts {
364
+ position: fixed;
365
+ right: var(--sp-5);
366
+ bottom: var(--sp-5);
367
+ display: flex;
368
+ flex-direction: column;
369
+ gap: var(--sp-2);
370
+ z-index: 40;
371
+ }
372
+ .toast {
373
+ background: var(--surface-3);
374
+ border: 1px solid var(--line);
375
+ border-left: 3px solid var(--accent);
376
+ border-radius: var(--radius-sm);
377
+ padding: var(--sp-3) var(--sp-4);
378
+ box-shadow: var(--shadow);
379
+ font-size: 13px;
380
+ max-width: 460px;
381
+ animation: toast-in var(--dur) var(--ease);
382
+ }
383
+ .toast-ok { border-left-color: var(--ok); }
384
+ .toast-bad { border-left-color: var(--bad); }
385
+ .toast pre { margin-top: 6px; font-size: 11px; color: var(--text-dim); white-space: pre-wrap; }
386
+ @keyframes toast-in {
387
+ from { opacity: 0; transform: translateX(12px); }
388
+ to { opacity: 1; transform: none; }
389
+ }
390
+
391
+ /* v0.52.0 — A MODAL MUST NOT SCROLL THE PAGE BEHIND IT, and this was every
392
+ modal in the app rather than an Extra defect. Two things were missing and
393
+ neither existed anywhere in bin/webui/: the modal's own scroll CHAINED to
394
+ <body> the moment it reached either end, and a wheel over the backdrop — most
395
+ of the screen — was never the modal's to begin with, so the page moved
396
+ immediately. `overscroll-behavior: contain` stops the chain; `body.modal-open`
397
+ stops the rest. The scroll position is preserved by `scrollbar-gutter: stable`
398
+ on <html> (01-base.css), so nothing here has to remember a number. */
399
+ .modal-host { position: fixed; inset: 0; z-index: 50; display: grid; place-items: center; padding: var(--sp-4); overscroll-behavior: contain; }
400
+ body.modal-open { overflow: hidden; }
401
+ /* A LOCKED modal: the backdrop is not a button, so it must not look like one. */
402
+ .modal-host.modal-locked .modal-backdrop { cursor: default; }
403
+ .modal-host[hidden] { display: none; }
404
+ .modal-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, .55); }
405
+ .modal {
406
+ position: relative;
407
+ width: min(720px, 100%);
408
+ max-height: 84vh;
409
+ overflow-y: auto;
410
+ overscroll-behavior: contain;
411
+ background: var(--surface);
412
+ border: 1px solid var(--line);
413
+ border-radius: var(--radius-lg);
414
+ box-shadow: var(--shadow);
415
+ padding: var(--sp-5);
416
+ animation: modal-in var(--dur) var(--ease);
417
+ }
418
+ @keyframes modal-in {
419
+ from { opacity: 0; transform: translateY(10px) scale(.99); }
420
+ to { opacity: 1; transform: none; }
421
+ }
422
+ .modal-title { font-size: 16px; font-weight: 600; margin-bottom: var(--sp-3); }
423
+ .modal-body { display: flex; flex-direction: column; gap: var(--sp-3); font-size: 13px; }
424
+ .modal-foot { display: flex; justify-content: flex-end; gap: var(--sp-2); margin-top: var(--sp-5); }
425
+
426
+ /* The whole UI goes read-only while a mutation runs (single-flight). */
427
+ body.busy .btn:not(.btn-allow-busy) { pointer-events: none; opacity: .45; }
428
+ body.busy .setting-control { pointer-events: none; opacity: .5; }
429
+ /* …and it SAYS so. A frozen panel with no explanation reads as a hang; a moving
430
+ bar at the top edge reads as "something of mine is running". */
431
+ body.busy::before {
432
+ content: "";
433
+ position: fixed;
434
+ inset: 0 0 auto 0;
435
+ height: 2px;
436
+ z-index: 60;
437
+ background: linear-gradient(90deg, transparent, var(--accent), transparent);
438
+ background-size: 40% 100%;
439
+ background-repeat: no-repeat;
440
+ animation: busy-sweep 1.1s var(--ease) infinite;
441
+ }
442
+ @keyframes busy-sweep {
443
+ from { background-position: -40% 0; }
444
+ to { background-position: 140% 0; }
445
+ }
446
+
447
+ /* Cards lift slightly on hover ONLY where they are interactive. A static card
448
+ that reacts to the pointer promises a click that does not exist. */
449
+ .run-card:hover, .action:hover { transform: translateY(-1px); }
450
+ .action { transition: border-color var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease); }
451
+ .action:hover { border-color: var(--accent-dim); }
452
+
453
+ kbd {
454
+ background: var(--surface-3);
455
+ border: 1px solid var(--line);
456
+ border-bottom-width: 2px;
457
+ border-radius: 4px;
458
+ padding: 1px 6px;
459
+ font-size: 11px;
460
+ color: var(--text);
461
+ white-space: nowrap;
462
+ }
@@ -0,0 +1,91 @@
1
+ /* 04-motion.css — orc ui
2
+ The panel entrance, the staggered block entrance, and THE ONE
3
+ @media (prefers-reduced-motion) block.
4
+
5
+ LOADED LAST, and that is load-bearing. Several reduced-motion rules are
6
+ plain declarations rather than !important (.vault-pulse and .step-flow are
7
+ removed with `display: none`, because capping an infinite animation to one
8
+ iteration freezes it mid-cycle). An equal-specificity rule in a panel file
9
+ loading afterwards would win on order and quietly switch the animation back
10
+ on. A test asserts this media query appears here and in no panels/*.css.
11
+
12
+ The <link> ORDER in app.html is the cascade order, and the numeric
13
+ prefix is that order. No @import: it would carry no session token and
14
+ 401. */
15
+
16
+ /* Panel swap: 180ms slide + fade, ease-out. */
17
+ .panel { animation: panel-in var(--dur) var(--ease); }
18
+ @keyframes panel-in {
19
+ from { opacity: 0; transform: translateY(6px); }
20
+ to { opacity: 1; transform: none; }
21
+ }
22
+
23
+ /* Staggered entrance. The blocks of a panel arrive in reading order rather than
24
+ all at once, which makes a panel of six cards parse as a sequence instead of
25
+ a flash. Capped at 8 so a long list never becomes a slow one — every child
26
+ past the cap shares the last delay. */
27
+ .stack > * { animation: block-in var(--dur) var(--ease) backwards; }
28
+ .stack > *:nth-child(1) { animation-delay: 0ms; }
29
+ .stack > *:nth-child(2) { animation-delay: 30ms; }
30
+ .stack > *:nth-child(3) { animation-delay: 60ms; }
31
+ .stack > *:nth-child(4) { animation-delay: 90ms; }
32
+ .stack > *:nth-child(5) { animation-delay: 120ms; }
33
+ .stack > *:nth-child(6) { animation-delay: 150ms; }
34
+ .stack > *:nth-child(7) { animation-delay: 180ms; }
35
+ .stack > *:nth-child(n+8) { animation-delay: 210ms; }
36
+ @keyframes block-in {
37
+ from { opacity: 0; transform: translateY(8px); }
38
+ to { opacity: 1; transform: none; }
39
+ }
40
+ /* ---------------------------------------------------------- REDUCED MOTION */
41
+ /* Non-negotiable: every animation and transition above is off. */
42
+
43
+ @media (prefers-reduced-motion: reduce) {
44
+ *, *::before, *::after {
45
+ animation-duration: 1ms !important;
46
+ animation-iteration-count: 1 !important;
47
+ /* Load-bearing, not tidiness: the staggered entrance fills `backwards`, so
48
+ a delay that survives here leaves a block sitting at opacity 0 for its
49
+ whole delay — reduced motion would mean things simply do not appear. */
50
+ animation-delay: 0ms !important;
51
+ transition-duration: 1ms !important;
52
+ scroll-behavior: auto !important;
53
+ }
54
+ /* Reduced motion means no movement, not fast movement — the hover and press
55
+ nudges are removed outright rather than sped up. */
56
+ .nav a:hover, .btn:active:not(:disabled), .action:hover,
57
+ .todo:hover, .stat-link:hover, button.step:hover { transform: none !important; }
58
+ /* The vault pulse is one of two INFINITE animations on the page. Capping it to
59
+ a single 1ms run would still leave a dash frozen mid-edge, so it is removed
60
+ outright and the edge reads as a plain line. */
61
+ .vault-pulse { display: none; }
62
+ /* The other one: the looping flow sweep. `animation-iteration-count: 1` above
63
+ would still fire it once and then leave the connector segment collapsed at
64
+ its final keyframe, so both halves are removed outright — the rail is drawn
65
+ in its resting state and the hairlines read as plain connectors. */
66
+ .step, .step::before { animation: none !important; }
67
+ .step-flow { display: none; }
68
+ /* The cost bar grows in two dimensions (the stack's width, each segment's
69
+ flex-grow). Both are removed rather than shortened, so the bar is simply
70
+ drawn at its final proportions. */
71
+ .bar-stack, .bar-seg { transition: none !important; }
72
+ /* The challenge timeline and its convergence bar. Both are removed rather
73
+ than shortened: a capped `ch-grow` leaves a segment frozen part-way, which
74
+ misreports the count it is drawn from — worse than no animation at all. */
75
+ .ch-rail-node, .ch-conv-seg { animation: none !important; }
76
+ /* The Docs ribbon (v0.48.0). Three animations, all REMOVED rather than
77
+ capped: `doc-seg-in` capped at one iteration would still leave a segment
78
+ mid-`scaleY`, and the two INFINITE ones (the written sheen and the
79
+ user-edited pulse) would freeze at whatever opacity the single run stopped
80
+ on — a segment drawn at 40% height misreports the line count it is drawn
81
+ from, which is worse than no animation at all. The wave rows and the health
82
+ bars go the same way: a bar frozen part-way is a wrong number. */
83
+ .doc-seg, .doc-seg-box, .doc-wave, .doc-bar-seg { animation: none !important; }
84
+ /* The Extra connect pulse (v0.50.0). A probe has no known duration, so the
85
+ dot loops until an answer arrives — the third INFINITE animation on the
86
+ page, and removed outright for the same reason as the other two: capped at
87
+ one iteration it would stop half way across the wire, which reads as a
88
+ request that hung. The wire itself still turns green or red, so the RESULT
89
+ of the test is never carried by motion alone. */
90
+ .ex-wire-dot { display: none; }
91
+ }
@@ -0,0 +1,100 @@
1
+ /* 05-tour.css — orc ui
2
+ The spotlight ring, .tour-block, and the z-index ladder.
3
+
4
+ The <link> ORDER in app.html is the cascade order, and the numeric
5
+ prefix is that order. No @import: it would carry no session token and
6
+ 401. */
7
+
8
+ /* --- the tour ------------------------------------------------------------ */
9
+ /* The spotlight is a RING, not a dimming overlay over a cut-out: the page stays
10
+ fully READABLE underneath, so a step can point at a real control and you can
11
+ see what it is pointing at.
12
+ It is not, however, clickable during the guided tour. `.tour-block` sits above
13
+ everything except the popover and swallows every click, so Next and Skip are
14
+ the only live controls on screen. The upgrade spotlight opts out of the
15
+ blocker (`interactive: true`) because its whole design is that clicking the
16
+ thing dismisses it. */
17
+
18
+ /* `display: contents` is load-bearing. This wrapper used to be `position:
19
+ fixed`, which ALWAYS creates a stacking context — so the ring and the popover
20
+ were trapped at the layer's own z-index and the highlighted element (46)
21
+ painted straight over both. Step one targets the sticky rail, which is why
22
+ the very first spotlight appeared underneath the sidebar. Generating no box
23
+ at all lets each child stack against the page directly, while still being one
24
+ node to remove on cleanup. */
25
+ .tour-layer { display: contents; }
26
+
27
+ /* The ladder, in paint order: scrim/ring 45 → the highlighted element 46 (so it
28
+ stays lit) → the click blocker 47 → the popover 48 (always readable and
29
+ always the only live thing) → modals 50.
30
+ The blocker sits ABOVE the highlighted element on purpose: lifting the target
31
+ to 46 is what keeps it visible through the scrim, and a blocker underneath it
32
+ would leave that one element clickable — which is precisely the click that
33
+ navigates away mid-tour. */
34
+ .tour-block {
35
+ position: fixed;
36
+ inset: 0;
37
+ z-index: 47;
38
+ /* Fully transparent: the scrim is already drawn by the ring's outward shadow,
39
+ and a second dimming layer would double it. This element exists only to
40
+ receive clicks. */
41
+ background: transparent;
42
+ cursor: not-allowed;
43
+ }
44
+ .tour-ring {
45
+ position: fixed;
46
+ border: 2px solid var(--accent);
47
+ border-radius: var(--radius);
48
+ /* The scrim is thrown OUTWARD from the ring, so the target itself is never
49
+ covered by anything. */
50
+ z-index: 45;
51
+ box-shadow: 0 0 0 4px var(--accent-wash), 0 0 0 9999px rgba(0, 0, 0, .55);
52
+ pointer-events: none;
53
+ transition: top var(--dur-slow) var(--ease), left var(--dur-slow) var(--ease),
54
+ width var(--dur-slow) var(--ease), height var(--dur-slow) var(--ease);
55
+ animation: ring-in var(--dur) var(--ease);
56
+ }
57
+ :root[data-theme="light"] .tour-ring { box-shadow: 0 0 0 4px var(--accent-wash), 0 0 0 9999px rgba(16, 24, 40, .38); }
58
+ @keyframes ring-in {
59
+ from { opacity: 0; transform: scale(1.04); }
60
+ to { opacity: 1; transform: none; }
61
+ }
62
+
63
+ .tour-pop {
64
+ position: fixed;
65
+ z-index: 48;
66
+ width: min(340px, calc(100vw - 16px));
67
+ background: var(--surface);
68
+ border: 1px solid var(--accent-dim);
69
+ border-radius: var(--radius);
70
+ box-shadow: var(--shadow);
71
+ padding: var(--sp-4);
72
+ pointer-events: auto;
73
+ animation: pop-in var(--dur) var(--ease);
74
+ }
75
+ @keyframes pop-in {
76
+ from { opacity: 0; transform: translateY(6px); }
77
+ to { opacity: 1; transform: none; }
78
+ }
79
+ .tour-title { font-size: 14px; font-weight: 600; margin-bottom: var(--sp-2); }
80
+ .tour-text { font-size: 12.5px; color: var(--text-dim); line-height: 1.6; }
81
+ .tour-foot { display: flex; align-items: center; gap: var(--sp-2); margin-top: var(--sp-4); }
82
+ .tour-count { font-size: 11px; color: var(--text-faint); margin-right: auto; font-variant-numeric: tabular-nums; }
83
+ .tour-waiting { font-size: 11px; color: var(--accent); margin-left: auto; }
84
+ /* The highlighted element rides above the scrim so it stays LIT. During the
85
+ guided tour it is not clickable — `.tour-block` is above it — which is the
86
+ point: it is being explained, not operated.
87
+ z-index ONLY — forcing `position: relative` here broke the sticky rail, which
88
+ is a positioned element already. The relative fallback is applied separately,
89
+ and only to targets that are actually static. */
90
+ .tour-target { z-index: 46; }
91
+ .tour-target-rel { position: relative; }
92
+
93
+ /* While a spotlight is up, the panel's entrance animations are FROZEN (v0.44.0).
94
+ `panel-in` and `block-in` both animate `transform`, and an element with a
95
+ running transform animation is a stacking context — so for the ~300ms a panel
96
+ takes to arrive, `.tour-target`'s z-index is trapped inside `.panel` and the
97
+ ladder above is decided by whether the spotlight landed before or after the
98
+ animation finished. Freezing them makes the ladder the only thing that
99
+ orders these layers, at any timing. */
100
+ body.tour-on .panel, body.tour-on .stack > * { animation: none !important; }