@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,211 @@
1
+ "use strict";
2
+ /* 02-ui.js — orc ui client
3
+ The shared furniture: chip, card, kvList, collapsible, skeleton, empty, toast,
4
+ copy, modal, head, statTile. Paired with css/03-components.css.
5
+
6
+ Loaded by app.html in the order its numeric prefix names. Classic
7
+ script, no import/export: an ES module import carries no query string,
8
+ and every static request here needs the per-launch session token. */
9
+
10
+
11
+ function chip(text, kind, pulse) {
12
+ const c = el("span", "chip" + (kind ? " chip-" + kind : "") + (pulse ? " chip-pulse" : ""), text);
13
+ return c;
14
+ }
15
+
16
+ function card(title, right) {
17
+ const c = el("div", "card");
18
+ if (title) {
19
+ const head = el("div", "card-head");
20
+ head.append(el("h2", null, title));
21
+ if (right) head.append(right);
22
+ c.append(head);
23
+ }
24
+ return c;
25
+ }
26
+
27
+ // `copyable` marks the rows whose whole purpose is to be pasted somewhere else
28
+ // — filesystem paths, config locations, install specs. Selecting a wrapped
29
+ // monospace path by hand is the kind of small friction nobody reports.
30
+ function kvList(rows, copyable) {
31
+ const dl = el("dl", "kv");
32
+ for (const [k, v] of rows) {
33
+ if (v === undefined || v === null || v === "") continue;
34
+ const dd = el("dd", null, esc(v));
35
+ if (copyable) {
36
+ dd.classList.add("kv-copy");
37
+ const b = el("button", "copy-btn", t("common.copy").toLowerCase());
38
+ b.type = "button";
39
+ b.title = t("common.copy");
40
+ b.addEventListener("click", () => copy(String(v), k));
41
+ dd.append(b);
42
+ }
43
+ dl.append(el("dt", null, k), dd);
44
+ }
45
+ return dl;
46
+ }
47
+
48
+ // A collapsible card. Extracted from the settings tiers so a second caller does
49
+ // not fork the fold behaviour — the `1fr → 0fr` grid trick needs a real element
50
+ // child to collapse against, and getting that subtly wrong twice is how two
51
+ // sections end up animating differently.
52
+ function collapsible({ title, count, desc, content, collapsed, chipEl }) {
53
+ const wrap = el("div", "card tier" + (collapsed ? " collapsed" : ""));
54
+
55
+ const h = el("button", "tier-head");
56
+ h.type = "button";
57
+ h.setAttribute("aria-expanded", String(!collapsed));
58
+ h.append(el("span", "tier-caret", "▸"));
59
+ h.append(el("h2", null, title));
60
+ if (count) h.append(el("span", "tier-count", count));
61
+ if (chipEl) h.append(chipEl);
62
+ h.addEventListener("click", () => {
63
+ const open = h.getAttribute("aria-expanded") === "true";
64
+ h.setAttribute("aria-expanded", String(!open));
65
+ wrap.classList.toggle("collapsed", open);
66
+ });
67
+
68
+ const inner = el("div", "tier-body-inner");
69
+ if (desc) inner.append(el("div", "tier-desc", desc));
70
+ const rows = el("div", "tier-rows");
71
+ rows.append(content);
72
+ inner.append(rows);
73
+ const bodyWrap = el("div", "tier-body");
74
+ bodyWrap.append(inner);
75
+
76
+ wrap.append(h, bodyWrap);
77
+ return wrap;
78
+ }
79
+
80
+ function skeleton(n) {
81
+ const f = frag();
82
+ for (let i = 0; i < (n || 4); i++) f.append(el("div", "skeleton" + (i % 3 === 2 ? " w-60" : i % 3 === 1 ? " w-40" : "")));
83
+ return f;
84
+ }
85
+
86
+ function empty(msg, hint) {
87
+ const box = el("div", "empty");
88
+ box.append(el("div", null, msg));
89
+ if (hint) box.append(el("div", "note", hint));
90
+ return box;
91
+ }
92
+
93
+ // Every panel's load-failure box. It shows the reason AND the output the CLI
94
+ // actually produced — a 500 with no message is what the user saw before v0.49.2.
95
+ function failBox(e) {
96
+ const box = empty(t("common.loadFail"), String((e && e.message) || e));
97
+ const detail = e && e.detail ? String(e.detail).trim() : "";
98
+ if (detail) box.append(el("pre", "block wrap fail-detail", detail.slice(0, 2000)));
99
+ return box;
100
+ }
101
+
102
+ function toast(msg, kind, detail) {
103
+ const t = el("div", "toast" + (kind ? " toast-" + kind : ""));
104
+ t.append(el("div", null, msg));
105
+ if (detail) t.append(el("pre", null, detail.slice(0, 900)));
106
+ $("#toasts").append(t);
107
+ setTimeout(() => t.remove(), kind === "bad" ? 9000 : 4200);
108
+ }
109
+
110
+ function copy(text, label) {
111
+ navigator.clipboard
112
+ .writeText(text)
113
+ .then(() => toast(t("common.clipboardOk", { label: label || t("common.copied") }), "ok"))
114
+ .catch(() => toast(t("common.clipboardFail"), "bad"));
115
+ }
116
+
117
+ /* ----------------------------------------------------------------- modal -- */
118
+
119
+ // `dismissible` defaults to TRUE, so nothing that already calls this changes.
120
+ // FALSE is for a modal whose only legal exits are its own buttons — the
121
+ // passphrase save, which is a procedure with a deadline attached and not a form
122
+ // you can wander away from half-finished. It follows the `.tour-block`
123
+ // precedent: no Escape handler, no backdrop click, and a CAPTURE-PHASE key
124
+ // handler that swallows Escape before anything else can act on it.
125
+ function modal({ title, body, actions, dismissible }) {
126
+ const host = $("#modal-host");
127
+ $("#modal-title").textContent = title;
128
+ const b = $("#modal-body");
129
+ const f = $("#modal-foot");
130
+ b.replaceChildren(body);
131
+ f.replaceChildren();
132
+ // Two call shapes exist in this file: an ARRAY of {label,onClick}, and an
133
+ // OBJECT keyed by label whose value is the handler (`null` = just close).
134
+ // `for…of` over the object form throws, which silently killed the confirm
135
+ // dialogs on Promises, Self-serve and Challenge — a dead button that logs
136
+ // nothing. Normalising here is what stops a third shape appearing.
137
+ const list = Array.isArray(actions)
138
+ ? actions
139
+ : Object.entries(actions || {}).map(([label, fn]) => ({
140
+ label,
141
+ onClick: (close) => {
142
+ close();
143
+ if (typeof fn === "function") fn();
144
+ },
145
+ }));
146
+ for (const a of list) {
147
+ const btn = el("button", "btn btn-allow-busy " + (a.cls || ""), a.label);
148
+ btn.type = "button";
149
+ if (a.id) btn.id = a.id;
150
+ btn.disabled = !!a.disabled;
151
+ btn.addEventListener("click", () => a.onClick(closeModal));
152
+ f.append(btn);
153
+ }
154
+ const locked = dismissible === false;
155
+ host.hidden = false;
156
+ host.classList.toggle("modal-locked", locked);
157
+ // THE BODY SCROLL LOCK. `closeModal` is already the single exit — Escape, the
158
+ // backdrop and every action button route through it — so there is exactly one
159
+ // add and one remove, and no path around either.
160
+ document.body.classList.add("modal-open");
161
+ const onKey = (e) => {
162
+ if (e.key !== "Escape") return;
163
+ if (locked) {
164
+ // Swallowed in the CAPTURE phase, so no other Escape handler on the page
165
+ // sees it either.
166
+ e.stopPropagation();
167
+ e.preventDefault();
168
+ return;
169
+ }
170
+ closeModal();
171
+ };
172
+ document.addEventListener("keydown", onKey, true);
173
+ $("#modal-backdrop").onclick = locked ? null : closeModal;
174
+ function closeModal() {
175
+ host.hidden = true;
176
+ host.classList.remove("modal-locked");
177
+ document.body.classList.remove("modal-open");
178
+ document.removeEventListener("keydown", onKey, true);
179
+ }
180
+ return closeModal;
181
+ }
182
+
183
+ function head(host, title, sub, right) {
184
+ const h = el("div", "page-head");
185
+ const left = el("div");
186
+ left.append(el("h1", null, title));
187
+ if (sub) left.append(el("div", "page-sub", sub));
188
+ h.append(left);
189
+ if (right) h.append(right);
190
+ host.append(h);
191
+ return h;
192
+ }
193
+
194
+ // A tile can now be a LINK to the panel that owns its number. It stays a plain
195
+ // div when there is nowhere useful to go — a tile that reacts to the pointer
196
+ // and then does nothing is worse than one that never moved.
197
+ function statTile(label, value, note, kind, panel) {
198
+ const tile = el(panel ? "button" : "div", "stat" + (panel ? " stat-link" : ""));
199
+ if (panel) {
200
+ tile.type = "button";
201
+ tile.addEventListener("click", () => (location.hash = "#/" + panel));
202
+ }
203
+ tile.append(el("div", "stat-label", label));
204
+ const v = el("div", "stat-value", value);
205
+ if (kind === "ok") v.style.color = "var(--ok)";
206
+ if (kind === "warn") v.style.color = "var(--warn)";
207
+ if (kind === "bad") v.style.color = "var(--bad)";
208
+ tile.append(v);
209
+ if (note) tile.append(el("div", "stat-note", note));
210
+ return tile;
211
+ }
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+ /* 03-md.js — orc ui client
3
+ stripMd, reflowMd, stripLeadingGlyph, renderMd, inline, link.
4
+
5
+ Markdown is rendered to real DOM nodes, NEVER assigned as HTML. renderMd's
6
+ paragraph branch must consume its first line unconditionally — it is the
7
+ fall-through, so a line every branch declines is an infinite loop that hangs
8
+ the panel.
9
+
10
+ Loaded by app.html in the order its numeric prefix names. Classic
11
+ script, no import/export: an ES module import carries no query string,
12
+ and every static request here needs the per-launch session token. */
13
+
14
+
15
+ // The changelog is markdown written for GitHub. Rather than render it — which
16
+ // would mean an HTML sanitiser for text fetched over the network — the few
17
+ // inline markers are stripped and it is shown as plain text. Nothing from the
18
+ // network is ever parsed as HTML by this panel.
19
+ function stripMd(s) {
20
+ return String(s)
21
+ .replace(/```[\s\S]*?```/g, (m) => m.replace(/```\w*\n?/g, "").trim())
22
+ .replace(/\*\*(.+?)\*\*/g, "$1")
23
+ .replace(/\*(.+?)\*/g, "$1")
24
+ .replace(/`(.+?)`/g, "$1")
25
+ .replace(/^\s*[-*]\s+/gm, "• ")
26
+ .replace(/\[(.+?)\]\((.+?)\)/g, "$1")
27
+ .trim();
28
+ }
29
+
30
+ // REFLOW (v0.44.1). The changelog is this repo's own CHANGELOG.md, and that
31
+ // file is hard-wrapped at ~78 columns. `.cl-body` renders `pre-wrap`, so every one of
32
+ // those authoring line breaks survived into a 660px box: paragraphs came out as
33
+ // a ragged stack of short lines that ended nowhere near the right edge, which
34
+ // is exactly the "misaligned" the modal looked. The wrapping belongs to the
35
+ // box, not to the source file.
36
+ //
37
+ // Blank lines are paragraph breaks and are KEPT; a bullet keeps its own line
38
+ // (joining those would run a list into one sentence); everything else in a
39
+ // paragraph joins with a space and wraps to whatever width it is given.
40
+ function reflowMd(s) {
41
+ return String(s)
42
+ .split(/\n{2,}/)
43
+ .map((para) =>
44
+ para
45
+ .split("\n")
46
+ .reduce((lines, raw) => {
47
+ const line = raw.trim();
48
+ if (!line) return lines;
49
+ // A bullet opens a line; anything else continues the one before it,
50
+ // which is also how a bullet that wrapped in the source rejoins.
51
+ if (!lines.length || line.startsWith("• ")) lines.push(line);
52
+ else lines[lines.length - 1] += " " + line;
53
+ return lines;
54
+ }, [])
55
+ .join("\n")
56
+ )
57
+ .filter(Boolean)
58
+ .join("\n\n");
59
+ }
60
+
61
+ // The onboarding titles carry a circled number ("① What ORC is") because a
62
+ // terminal has no other way to show order. The rail already numbers every item,
63
+ // so the glyph would be shown twice.
64
+ function stripLeadingGlyph(s) {
65
+ return String(s || "").replace(/^[①-⑳⓪]\s*/, "");
66
+ }
67
+ /* --- markdown → DOM -------------------------------------------------------
68
+ Small on purpose: headings, fenced code, tables, quotes, lists, rules and
69
+ paragraphs — the shapes the mocked runs actually use. Anything it does not
70
+ recognise stays as text, which is the correct failure: an unrendered line is
71
+ readable, a swallowed one is not.
72
+
73
+ A link to another `.md` in the catalogue becomes a button that opens that
74
+ document here. A link that resolves to nothing renders as its text, never as
75
+ a dead link. */
76
+ function renderMd(md, opts) {
77
+ const o = opts || {};
78
+ const lines = String(md || "").split(/\r?\n/);
79
+ const out = frag();
80
+ let i = 0;
81
+ let skippedTitle = false;
82
+
83
+ const isTableRow = (s) => /^\s*\|.*\|\s*$/.test(s || "");
84
+ const isDivider = (s) => /^\s*\|?[\s:|-]{3,}\|?\s*$/.test(s || "") && (s || "").includes("-");
85
+
86
+ while (i < lines.length) {
87
+ const line = lines[i];
88
+
89
+ if (!line.trim()) {
90
+ i++;
91
+ continue;
92
+ }
93
+
94
+ // Fenced code. The fence language is ignored — none of these documents are
95
+ // syntax-highlighted, and a wrong highlight is worse than none.
96
+ const fence = line.match(/^\s*```/);
97
+ if (fence) {
98
+ const buf = [];
99
+ i++;
100
+ while (i < lines.length && !/^\s*```/.test(lines[i])) buf.push(lines[i++]);
101
+ i++; // the closing fence
102
+ const box = el("div", "md-codebox");
103
+ const pre = el("pre", "md-code", buf.join("\n"));
104
+ const b = el("button", "copy-btn md-code-copy", t("common.copy").toLowerCase());
105
+ b.type = "button";
106
+ b.addEventListener("click", () => copy(buf.join("\n"), t("mockrun.codeBlock")));
107
+ box.append(pre, b);
108
+ out.append(box);
109
+ continue;
110
+ }
111
+
112
+ // Table: a row, then a divider row.
113
+ if (isTableRow(line) && isDivider(lines[i + 1])) {
114
+ const cells = (s) =>
115
+ s
116
+ .trim()
117
+ .replace(/^\||\|$/g, "")
118
+ .split("|")
119
+ .map((c) => c.trim());
120
+ const table = el("table", "md-table");
121
+ const thead = el("thead");
122
+ const hr = el("tr");
123
+ for (const c of cells(line)) {
124
+ const th = el("th");
125
+ inline(th, c, o);
126
+ hr.append(th);
127
+ }
128
+ thead.append(hr);
129
+ table.append(thead);
130
+ i += 2;
131
+ const tbody = el("tbody");
132
+ while (i < lines.length && isTableRow(lines[i])) {
133
+ const tr = el("tr");
134
+ for (const c of cells(lines[i])) {
135
+ const td = el("td");
136
+ inline(td, c, o);
137
+ tr.append(td);
138
+ }
139
+ tbody.append(tr);
140
+ i++;
141
+ }
142
+ table.append(tbody);
143
+ const scroller = el("div", "md-tablewrap");
144
+ scroller.append(table);
145
+ out.append(scroller);
146
+ continue;
147
+ }
148
+
149
+ const h = line.match(/^(#{1,6})\s+(.*)$/);
150
+ if (h) {
151
+ // The pane already prints the document title above the article.
152
+ if (h[1].length === 1 && !skippedTitle) {
153
+ skippedTitle = true;
154
+ i++;
155
+ continue;
156
+ }
157
+ const level = Math.min(h[1].length + 1, 5);
158
+ const node = el("h" + level, "md-h md-h" + h[1].length);
159
+ inline(node, h[2], o);
160
+ out.append(node);
161
+ i++;
162
+ continue;
163
+ }
164
+
165
+ if (/^\s*(---|\*\*\*|___)\s*$/.test(line)) {
166
+ out.append(el("hr", "md-hr"));
167
+ i++;
168
+ continue;
169
+ }
170
+
171
+ if (/^\s*>/.test(line)) {
172
+ const buf = [];
173
+ while (i < lines.length && /^\s*>/.test(lines[i])) buf.push(lines[i++].replace(/^\s*>\s?/, ""));
174
+ const q = el("blockquote", "md-quote");
175
+ inline(q, buf.join(" "), o);
176
+ out.append(q);
177
+ continue;
178
+ }
179
+
180
+ const bullet = line.match(/^(\s*)([-*+]|\d+[.)])\s+(.*)$/);
181
+ if (bullet) {
182
+ const ordered = /\d/.test(bullet[2]);
183
+ const list = el(ordered ? "ol" : "ul", "md-list");
184
+ while (i < lines.length) {
185
+ const m = lines[i].match(/^(\s*)([-*+]|\d+[.)])\s+(.*)$/);
186
+ if (!m) {
187
+ // A wrapped continuation line belongs to the item above it.
188
+ if (lines[i].trim() && /^\s{2,}\S/.test(lines[i]) && list.lastChild) {
189
+ list.lastChild.append(document.createTextNode(" "));
190
+ inline(list.lastChild, lines[i].trim(), o);
191
+ i++;
192
+ continue;
193
+ }
194
+ break;
195
+ }
196
+ const li = el("li", "md-li md-li-" + Math.min(2, Math.floor(m[1].length / 2)));
197
+ inline(li, m[3], o);
198
+ list.append(li);
199
+ i++;
200
+ }
201
+ out.append(list);
202
+ continue;
203
+ }
204
+
205
+ // Paragraph: consecutive plain lines, rewrapped by the box rather than by
206
+ // the file's own 78-column hard wrap (the changelog lesson, v0.44.1).
207
+ //
208
+ // THE FIRST LINE IS TAKEN UNCONDITIONALLY, and that is load-bearing: this
209
+ // is the fall-through branch, so a line the branches above declined but the
210
+ // condition below also rejects (a stray `| … |` row with no divider under
211
+ // it, say) would leave `i` exactly where it was — an infinite loop that
212
+ // hangs the panel on one malformed line. Always consume one, then extend.
213
+ const buf = [lines[i++].trim()];
214
+ while (
215
+ i < lines.length &&
216
+ lines[i].trim() &&
217
+ !/^\s*(```|#{1,6}\s|>|---|\*\*\*|___)/.test(lines[i]) &&
218
+ !/^(\s*)([-*+]|\d+[.)])\s+/.test(lines[i]) &&
219
+ !isTableRow(lines[i])
220
+ )
221
+ buf.push(lines[i++].trim());
222
+ const p = el("p", "md-p");
223
+ inline(p, buf.join(" "), o);
224
+ out.append(p);
225
+ }
226
+ return out;
227
+ }
228
+
229
+ // Inline markup: `code`, **bold**, and links. Everything else is text.
230
+ function inline(parent, text, opts) {
231
+ const o = opts || {};
232
+ const src = String(text || "");
233
+ const re = /(`[^`]+`)|(\*\*[^*]+\*\*)|(\[[^\]]+\]\([^)\s]+\))/g;
234
+ let last = 0;
235
+ let m;
236
+ while ((m = re.exec(src))) {
237
+ if (m.index > last) parent.append(document.createTextNode(src.slice(last, m.index)));
238
+ const tok = m[0];
239
+ if (tok.startsWith("`")) parent.append(el("code", "md-code-inline", tok.slice(1, -1)));
240
+ else if (tok.startsWith("**")) parent.append(el("strong", null, tok.slice(2, -2)));
241
+ else {
242
+ const lm = tok.match(/^\[([^\]]+)\]\(([^)\s]+)\)$/);
243
+ // `nolink` is the recursion stop: a link LABEL gets the same inline pass
244
+ // (so `[`orc mock-run`](…)` is not printed with its backticks) but can
245
+ // never contain another link to descend into.
246
+ if (o.nolink) parent.append(document.createTextNode(lm[1]));
247
+ else parent.append(link(lm[1], lm[2], o));
248
+ }
249
+ last = re.lastIndex;
250
+ }
251
+ if (last < src.length) parent.append(document.createTextNode(src.slice(last)));
252
+ }
253
+
254
+ function link(text, href, o) {
255
+ const label = (node) => {
256
+ inline(node, text, Object.assign({}, o, { nolink: true }));
257
+ return node;
258
+ };
259
+ if (/^https?:\/\//i.test(href)) {
260
+ const a = label(el("a", "md-link"));
261
+ a.href = href;
262
+ a.target = "_blank";
263
+ a.rel = "noreferrer noopener";
264
+ return a;
265
+ }
266
+ // A relative link into the catalogue opens in this panel. Resolution is by
267
+ // the target's own tail, so `orc-pact.md` and
268
+ // `../templates/skills/orc-mini/examples/mini-run-mock.md` both land.
269
+ const docs = o.docs || [];
270
+ const tail = href.split("#")[0].replace(/^\.\//, "");
271
+ const base = tail.split("/").pop();
272
+ const hit =
273
+ docs.find((d) => d.path.endsWith(tail.replace(/^(\.\.\/)+/, ""))) ||
274
+ docs.find((d) => d.slug + ".md" === base) ||
275
+ docs.find((d) => d.path.endsWith("/" + base));
276
+ if (hit && o.open) {
277
+ const b = label(el("button", "md-doclink"));
278
+ b.type = "button";
279
+ b.title = hit.title;
280
+ b.addEventListener("click", () => o.open(hit.slug));
281
+ return b;
282
+ }
283
+ // Nothing to open: the words stay, the link does not. A dead link in a panel
284
+ // that cannot browse a repository is a promise it cannot keep.
285
+ return label(el("span", "md-link-flat"));
286
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /* 04-router.js — orc ui client
3
+ PANELS, currentPanel, metaInfo, route(), section().
4
+ A panel registers itself by assigning PANELS.<name> in its own file.
5
+
6
+ Loaded by app.html in the order its numeric prefix names. Classic
7
+ script, no import/export: an ES module import carries no query string,
8
+ and every static request here needs the per-launch session token. */
9
+
10
+
11
+ /* ----------------------------------------------------------------- router -- */
12
+
13
+ const PANELS = {};
14
+ let currentPanel = null;
15
+ // Filled by boot(). The tour needs the project root to remember "seen" per
16
+ // project, and needs to know it is not looking at fixtures.
17
+ let metaInfo = { fixtures: false, project_root: "" };
18
+
19
+ function route() {
20
+ const name = (location.hash.replace(/^#\//, "") || "overview").split("?")[0];
21
+ const panel = PANELS[name] ? name : "overview";
22
+ currentPanel = panel;
23
+ for (const a of document.querySelectorAll("#nav a"))
24
+ a.setAttribute("aria-current", a.dataset.panel === panel ? "page" : "false");
25
+ const host = $("#panel");
26
+ host.replaceChildren();
27
+ // Re-trigger the 180ms panel animation on every navigation.
28
+ host.style.animation = "none";
29
+ void host.offsetHeight;
30
+ host.style.animation = "";
31
+ PANELS[panel](host);
32
+ renderBanners();
33
+ }
34
+
35
+ // Every panel body is rendered async; this keeps the skeleton/error handling in
36
+ // ONE place instead of nine.
37
+ async function section(host, loader, render) {
38
+ // `stack` is not decoration: it is what spaces the blocks a panel renders.
39
+ // Without it the children collide unless they happen to be two cards in a row.
40
+ const slot = el("div", "stack");
41
+ slot.append(skeleton(4));
42
+ host.append(slot);
43
+ try {
44
+ const data = await loader();
45
+ const out = render(data);
46
+ slot.replaceChildren(out || el("div"));
47
+ } catch (e) {
48
+ slot.replaceChildren(failBox(e));
49
+ }
50
+ return slot;
51
+ }