@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.
- package/CHANGELOG.md +2017 -0
- package/README-id.md +521 -0
- package/README.md +485 -0
- package/bin/build-agents.js +86 -0
- package/bin/cli.js +29050 -0
- package/bin/mockrun-catalog.js +267 -0
- package/bin/onboarding-content.js +172 -0
- package/bin/pricing.json +200 -0
- package/bin/providers.json +437 -0
- package/bin/ui.js +95 -0
- package/bin/verify-contracts.js +3277 -0
- package/bin/verify-package.js +498 -0
- package/bin/webui/api.js +1163 -0
- package/bin/webui/app.html +198 -0
- package/bin/webui/css/00-tokens.css +92 -0
- package/bin/webui/css/01-base.css +42 -0
- package/bin/webui/css/02-shell.css +103 -0
- package/bin/webui/css/03-components.css +462 -0
- package/bin/webui/css/04-motion.css +91 -0
- package/bin/webui/css/05-tour.css +100 -0
- package/bin/webui/css/06-responsive.css +108 -0
- package/bin/webui/css/panels/boundary.css +26 -0
- package/bin/webui/css/panels/challenge.css +151 -0
- package/bin/webui/css/panels/crosslink.css +194 -0
- package/bin/webui/css/panels/docs.css +254 -0
- package/bin/webui/css/panels/experiment.css +23 -0
- package/bin/webui/css/panels/extra.css +536 -0
- package/bin/webui/css/panels/flow.css +177 -0
- package/bin/webui/css/panels/handoff.css +67 -0
- package/bin/webui/css/panels/knowledge.css +86 -0
- package/bin/webui/css/panels/learn.css +154 -0
- package/bin/webui/css/panels/maintenance.css +55 -0
- package/bin/webui/css/panels/mockrun.css +268 -0
- package/bin/webui/css/panels/overview.css +100 -0
- package/bin/webui/css/panels/pact.css +43 -0
- package/bin/webui/css/panels/runs.css +105 -0
- package/bin/webui/css/panels/settings.css +227 -0
- package/bin/webui/css/panels/stats.css +87 -0
- package/bin/webui/fixtures/boundary.js +92 -0
- package/bin/webui/fixtures/challenge.js +825 -0
- package/bin/webui/fixtures/crosslink.js +31 -0
- package/bin/webui/fixtures/docs.js +982 -0
- package/bin/webui/fixtures/extra.js +1934 -0
- package/bin/webui/fixtures/flow.js +81 -0
- package/bin/webui/fixtures/handoff.js +35 -0
- package/bin/webui/fixtures/index.js +486 -0
- package/bin/webui/fixtures/knowledge.js +291 -0
- package/bin/webui/fixtures/maintenance.js +42 -0
- package/bin/webui/fixtures/mockrun.js +36 -0
- package/bin/webui/fixtures/pact.js +111 -0
- package/bin/webui/fixtures/runs.js +109 -0
- package/bin/webui/fixtures/settings.js +78 -0
- package/bin/webui/fixtures/shell.js +48 -0
- package/bin/webui/fixtures/stats.js +104 -0
- package/bin/webui/i18n/TERMS.md +134 -0
- package/bin/webui/i18n/en/banner.json +29 -0
- package/bin/webui/i18n/en/boundary.json +20 -0
- package/bin/webui/i18n/en/challenge.json +106 -0
- package/bin/webui/i18n/en/common.json +69 -0
- package/bin/webui/i18n/en/crosslink.json +69 -0
- package/bin/webui/i18n/en/docs.json +175 -0
- package/bin/webui/i18n/en/experiment.json +17 -0
- package/bin/webui/i18n/en/extra.json +313 -0
- package/bin/webui/i18n/en/flow.json +30 -0
- package/bin/webui/i18n/en/handoff.json +37 -0
- package/bin/webui/i18n/en/knowledge.json +141 -0
- package/bin/webui/i18n/en/learn.json +16 -0
- package/bin/webui/i18n/en/maintenance.json +52 -0
- package/bin/webui/i18n/en/mockrun.json +19 -0
- package/bin/webui/i18n/en/nav.json +19 -0
- package/bin/webui/i18n/en/overview.json +89 -0
- package/bin/webui/i18n/en/pact.json +36 -0
- package/bin/webui/i18n/en/runs.json +51 -0
- package/bin/webui/i18n/en/settings.json +49 -0
- package/bin/webui/i18n/en/stats.json +69 -0
- package/bin/webui/i18n/en/tour.json +33 -0
- package/bin/webui/i18n/id/banner.json +29 -0
- package/bin/webui/i18n/id/boundary.json +20 -0
- package/bin/webui/i18n/id/challenge.json +106 -0
- package/bin/webui/i18n/id/common.json +70 -0
- package/bin/webui/i18n/id/crosslink.json +69 -0
- package/bin/webui/i18n/id/docs.json +175 -0
- package/bin/webui/i18n/id/experiment.json +17 -0
- package/bin/webui/i18n/id/extra.json +313 -0
- package/bin/webui/i18n/id/flow.json +30 -0
- package/bin/webui/i18n/id/handoff.json +37 -0
- package/bin/webui/i18n/id/knowledge.json +141 -0
- package/bin/webui/i18n/id/learn.json +16 -0
- package/bin/webui/i18n/id/maintenance.json +52 -0
- package/bin/webui/i18n/id/mockrun.json +19 -0
- package/bin/webui/i18n/id/nav.json +19 -0
- package/bin/webui/i18n/id/overview.json +89 -0
- package/bin/webui/i18n/id/pact.json +36 -0
- package/bin/webui/i18n/id/runs.json +51 -0
- package/bin/webui/i18n/id/settings.json +49 -0
- package/bin/webui/i18n/id/stats.json +69 -0
- package/bin/webui/i18n/id/tour.json +33 -0
- package/bin/webui/js/00-core.js +115 -0
- package/bin/webui/js/01-i18n.js +149 -0
- package/bin/webui/js/02-ui.js +211 -0
- package/bin/webui/js/03-md.js +286 -0
- package/bin/webui/js/04-router.js +51 -0
- package/bin/webui/js/05-banners.js +172 -0
- package/bin/webui/js/06-edit.js +183 -0
- package/bin/webui/js/90-tour.js +488 -0
- package/bin/webui/js/91-shortcuts.js +126 -0
- package/bin/webui/js/99-boot.js +118 -0
- package/bin/webui/js/panels/boundary.js +104 -0
- package/bin/webui/js/panels/challenge.js +781 -0
- package/bin/webui/js/panels/crosslink.js +654 -0
- package/bin/webui/js/panels/docs.js +1338 -0
- package/bin/webui/js/panels/experiment.js +98 -0
- package/bin/webui/js/panels/extra.js +3011 -0
- package/bin/webui/js/panels/flow.js +297 -0
- package/bin/webui/js/panels/handoff.js +169 -0
- package/bin/webui/js/panels/knowledge.js +890 -0
- package/bin/webui/js/panels/learn.js +220 -0
- package/bin/webui/js/panels/maintenance.js +235 -0
- package/bin/webui/js/panels/mockrun.js +227 -0
- package/bin/webui/js/panels/overview.js +447 -0
- package/bin/webui/js/panels/pact.js +189 -0
- package/bin/webui/js/panels/runs.js +416 -0
- package/bin/webui/js/panels/settings.js +573 -0
- package/bin/webui/js/panels/stats.js +378 -0
- package/bin/webui/serve.js +557 -0
- package/mock-run/INDEX.md +106 -0
- package/mock-run/a-normal-day.md +587 -0
- package/mock-run/context-combiner.md +100 -0
- package/mock-run/extra-recovery.md +330 -0
- package/mock-run/extra-slots.md +177 -0
- package/mock-run/media/README.md +43 -0
- package/mock-run/orc-aftermath.md +392 -0
- package/mock-run/orc-boundary.md +356 -0
- package/mock-run/orc-brainstorm.md +177 -0
- package/mock-run/orc-budget.md +534 -0
- package/mock-run/orc-challenge-council.md +262 -0
- package/mock-run/orc-challenge.md +416 -0
- package/mock-run/orc-cli.md +200 -0
- package/mock-run/orc-diy.md +129 -0
- package/mock-run/orc-doc.md +448 -0
- package/mock-run/orc-explain.md +86 -0
- package/mock-run/orc-export.md +423 -0
- package/mock-run/orc-extra.md +392 -0
- package/mock-run/orc-fast.md +106 -0
- package/mock-run/orc-grill.md +151 -0
- package/mock-run/orc-handoff.md +480 -0
- package/mock-run/orc-pact.md +421 -0
- package/mock-run/orc-pattern.md +112 -0
- package/mock-run/orc-plan.md +108 -0
- package/mock-run/orc-pr-setup.md +126 -0
- package/mock-run/orc-quick.md +113 -0
- package/mock-run/orc-route.md +93 -0
- package/mock-run/orc-ui.md +125 -0
- package/mock-run/orc-ultra.md +103 -0
- package/mock-run/orc.md +157 -0
- package/mock-run/the-example-project.md +55 -0
- package/package.json +39 -0
- package/templates/agents/MODEL-MAPPING.md +168 -0
- package/templates/agents/orc-advisor-fable-5.md +50 -0
- package/templates/agents/orc-advisor-opus-5-xhigh.md +56 -0
- package/templates/agents/orc-analyst-fable-5.md +115 -0
- package/templates/agents/orc-analyze-mini-opus-5-med.md +60 -0
- package/templates/agents/orc-analyze-mini-sonnet-5-high.md +58 -0
- package/templates/agents/orc-challenge-advisor-opus-5-med.md +75 -0
- package/templates/agents/orc-challenge-contrarian-opus-5-high.md +110 -0
- package/templates/agents/orc-challenge-executor-opus-5-med.md +114 -0
- package/templates/agents/orc-challenge-expansionist-opus-5-med.md +112 -0
- package/templates/agents/orc-challenge-judge-opus-5-high.md +132 -0
- package/templates/agents/orc-challenge-outsider-opus-5-low.md +109 -0
- package/templates/agents/orc-challenge-principles-opus-5-high.md +109 -0
- package/templates/agents/orc-challenge-reader-opus-5-low.md +90 -0
- package/templates/agents/orc-claude-writer-opus-4-8-high.md +53 -0
- package/templates/agents/orc-claude-writer-opus-5-med.md +55 -0
- package/templates/agents/orc-context-combiner-opus-5-high.md +88 -0
- package/templates/agents/orc-doc-checker-opus-5-low.md +108 -0
- package/templates/agents/orc-doc-writer-opus-5-med.md +134 -0
- package/templates/agents/orc-executor-haiku-4-5.md +113 -0
- package/templates/agents/orc-executor-opus-4-7-high.md +114 -0
- package/templates/agents/orc-executor-opus-4-7-med.md +114 -0
- package/templates/agents/orc-executor-opus-4-8-high.md +114 -0
- package/templates/agents/orc-executor-opus-5-high.md +114 -0
- package/templates/agents/orc-executor-opus-5-low.md +114 -0
- package/templates/agents/orc-executor-opus-5-med.md +114 -0
- package/templates/agents/orc-executor-sonnet-4-6-high.md +114 -0
- package/templates/agents/orc-executor-sonnet-4-6-med.md +114 -0
- package/templates/agents/orc-executor-sonnet-5-high.md +114 -0
- package/templates/agents/orc-judge-fable-5.md +79 -0
- package/templates/agents/orc-judge-opus-5-xhigh.md +85 -0
- package/templates/agents/orc-learn-writer-opus-5-low.md +73 -0
- package/templates/agents/orc-pattern-codifier-opus-5-med.md +65 -0
- package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +63 -0
- package/templates/agents/orc-planner-fable-5.md +152 -0
- package/templates/agents/orc-planner-mini-opus-5-med.md +69 -0
- package/templates/agents/orc-planner-mini-sonnet-5-high.md +67 -0
- package/templates/agents/orc-planner-opus-5-med.md +160 -0
- package/templates/agents/orc-retro-opus-5-med.md +73 -0
- package/templates/agents/orc-retro-sonnet-5-high.md +72 -0
- package/templates/agents/orc-reviewer-fable-5.md +57 -0
- package/templates/agents/orc-reviewer-opus-5-med.md +60 -0
- package/templates/agents/orc-scout-opus-5-low.md +40 -0
- package/templates/agents/orc-scout-sonnet-4-6-high.md +39 -0
- package/templates/agents/orc-system-analyst-opus-5-high.md +120 -0
- package/templates/agents/orc-test-author-opus-5-med.md +71 -0
- package/templates/agents/orc-trace-writer-haiku-4-5.md +107 -0
- package/templates/agents/orc-verifier-opus-5-med.md +69 -0
- package/templates/agents/orc-wiki-scanner-opus-4-8-high.md +79 -0
- package/templates/agents/orc-wiki-scanner-opus-5-med.md +81 -0
- package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +106 -0
- package/templates/commands/orc-aftermath.md +49 -0
- package/templates/commands/orc-analyze.md +21 -0
- package/templates/commands/orc-boundary.md +46 -0
- package/templates/commands/orc-brainstorm.md +51 -0
- package/templates/commands/orc-budget.md +54 -0
- package/templates/commands/orc-challenge.md +58 -0
- package/templates/commands/orc-claude.md +14 -0
- package/templates/commands/orc-diy.md +13 -0
- package/templates/commands/orc-doc.md +128 -0
- package/templates/commands/orc-explain.md +20 -0
- package/templates/commands/orc-export.md +46 -0
- package/templates/commands/orc-fast.md +15 -0
- package/templates/commands/orc-grill.md +40 -0
- package/templates/commands/orc-handoff.md +52 -0
- package/templates/commands/orc-learn.md +17 -0
- package/templates/commands/orc-mini.md +12 -0
- package/templates/commands/orc-pact.md +44 -0
- package/templates/commands/orc-pattern.md +15 -0
- package/templates/commands/orc-plan.md +22 -0
- package/templates/commands/orc-poly.md +21 -0
- package/templates/commands/orc-pr-driver.md +30 -0
- package/templates/commands/orc-pr-setup.md +31 -0
- package/templates/commands/orc-quick.md +33 -0
- package/templates/commands/orc-retro.md +17 -0
- package/templates/commands/orc-route.md +41 -0
- package/templates/commands/orc-ultra.md +17 -0
- package/templates/commands/orc-verify.md +11 -0
- package/templates/commands/orc-wiki.md +42 -0
- package/templates/commands/orc.md +16 -0
- package/templates/hooks/orc-effort-guard.js +178 -0
- package/templates/hooks/orc-statusline.js +305 -0
- package/templates/hooks/orc-trace.js +471 -0
- package/templates/hooks/orc-update-lib.js +125 -0
- package/templates/skills/_shared/README.md +50 -0
- package/templates/skills/_shared/detecting-artifacts.md +90 -0
- package/templates/skills/_shared/drift-recovery.md +98 -0
- package/templates/skills/_shared/extra-dispatch.md +1051 -0
- package/templates/skills/_shared/fable5-override.md +56 -0
- package/templates/skills/_shared/fallback-handoff.md +42 -0
- package/templates/skills/_shared/gh-stack-commands.md +65 -0
- package/templates/skills/_shared/gotchas.md +177 -0
- package/templates/skills/_shared/interview.md +144 -0
- package/templates/skills/_shared/lane-suspend.md +82 -0
- package/templates/skills/_shared/opus5-only.md +131 -0
- package/templates/skills/_shared/pr-templates.md +106 -0
- package/templates/skills/_shared/read-ladder.md +54 -0
- package/templates/skills/_shared/return-validation.md +145 -0
- package/templates/skills/_shared/smoke-gate.md +28 -0
- package/templates/skills/_shared/stack-plan.md +135 -0
- package/templates/skills/_shared/untrusted-input.md +63 -0
- package/templates/skills/context-combiner/SKILL.md +187 -0
- package/templates/skills/context-combiner/schemas/combined-report.md +78 -0
- package/templates/skills/context-combiner/schemas/combined-requirement-spec.md +87 -0
- package/templates/skills/orc/README.md +150 -0
- package/templates/skills/orc/SKILL.md +526 -0
- package/templates/skills/orc/config.md +389 -0
- package/templates/skills/orc/examples/full-run-mock.md +73 -0
- package/templates/skills/orc/references/analyst-gates.md +124 -0
- package/templates/skills/orc/references/effort-and-mode.md +224 -0
- package/templates/skills/orc/references/house-rules.md +20 -0
- package/templates/skills/orc/references/intake.md +120 -0
- package/templates/skills/orc/references/log-protocol.md +39 -0
- package/templates/skills/orc/references/pattern-gate.md +89 -0
- package/templates/skills/orc/references/plan-handoff.md +84 -0
- package/templates/skills/orc/references/preflight-report.md +220 -0
- package/templates/skills/orc/references/security-checklist.md +39 -0
- package/templates/skills/orc/references/stop-and-resume.md +160 -0
- package/templates/skills/orc/references/trace-protocol.md +314 -0
- package/templates/skills/orc/references/ultra-mode.md +123 -0
- package/templates/skills/orc/references/wave-grouping.md +121 -0
- package/templates/skills/orc/references/wiki-consult.md +177 -0
- package/templates/skills/orc/schemas/checkpoint.md +122 -0
- package/templates/skills/orc/schemas/intent-spec.md +42 -0
- package/templates/skills/orc/schemas/planning-output.md +279 -0
- package/templates/skills/orc/subskills/orc-checkpoint/SKILL.md +55 -0
- package/templates/skills/orc/subskills/orc-execution/SKILL.md +72 -0
- package/templates/skills/orc/subskills/orc-execution/core.md +151 -0
- package/templates/skills/orc/subskills/orc-execution/subagent.md +13 -0
- package/templates/skills/orc/subskills/orc-planner/SKILL.md +264 -0
- package/templates/skills/orc/subskills/orc-planner-mini/SKILL.md +121 -0
- package/templates/skills/orc/subskills/orc-pr/SKILL.md +51 -0
- package/templates/skills/orc/subskills/orc-pr/pr.md +22 -0
- package/templates/skills/orc/subskills/orc-pr/stack-gate.md +108 -0
- package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +76 -0
- package/templates/skills/orc/subskills/orc-review-verify/core.md +135 -0
- package/templates/skills/orc/subskills/orc-review-verify/subagent.md +7 -0
- package/templates/skills/orc/subskills/orc-testgen/SKILL.md +45 -0
- package/templates/skills/orc/subskills/orc-testgen/core.md +59 -0
- package/templates/skills/orc/subskills/orc-testgen/subagent.md +7 -0
- package/templates/skills/orc-advisor/SKILL.md +60 -0
- package/templates/skills/orc-aftermath/SKILL.md +136 -0
- package/templates/skills/orc-aftermath/references/report.md +95 -0
- package/templates/skills/orc-analyze/SKILL.md +220 -0
- package/templates/skills/orc-analyze/examples/analyze-mock.md +42 -0
- package/templates/skills/orc-analyze/references/branching.md +51 -0
- package/templates/skills/orc-analyze/references/deep-mode.md +27 -0
- package/templates/skills/orc-analyze/references/thin-input.md +77 -0
- package/templates/skills/orc-analyze/schemas/report-audit.md +83 -0
- package/templates/skills/orc-analyze/schemas/report-prose.md +63 -0
- package/templates/skills/orc-analyze/schemas/report-requirement.md +78 -0
- package/templates/skills/orc-analyze/schemas/requirement-spec.md +77 -0
- package/templates/skills/orc-analyze-mini/SKILL.md +112 -0
- package/templates/skills/orc-analyze-mini/examples/quick-analysis-mock.md +31 -0
- package/templates/skills/orc-boundary/SKILL.md +208 -0
- package/templates/skills/orc-boundary/references/card.md +78 -0
- package/templates/skills/orc-boundary/references/gate.md +113 -0
- package/templates/skills/orc-brainstorm/SKILL.md +339 -0
- package/templates/skills/orc-brainstorm/references/brainstorm-doc.md +133 -0
- package/templates/skills/orc-brainstorm/references/lenses.md +152 -0
- package/templates/skills/orc-budget/SKILL.md +225 -0
- package/templates/skills/orc-budget/references/corpus.md +87 -0
- package/templates/skills/orc-challenge/README.md +142 -0
- package/templates/skills/orc-challenge/SKILL.md +255 -0
- package/templates/skills/orc-challenge/examples/code-module.md +110 -0
- package/templates/skills/orc-challenge/examples/council-full-roster.md +273 -0
- package/templates/skills/orc-challenge/examples/tsd-two-iterations.md +213 -0
- package/templates/skills/orc-challenge/references/conservation.md +107 -0
- package/templates/skills/orc-challenge/references/council.md +315 -0
- package/templates/skills/orc-challenge/references/cycle-state.md +185 -0
- package/templates/skills/orc-challenge/references/dimensions.md +121 -0
- package/templates/skills/orc-challenge/references/fix-brief.md +130 -0
- package/templates/skills/orc-challenge/references/intake.md +171 -0
- package/templates/skills/orc-challenge/references/kinds.md +44 -0
- package/templates/skills/orc-challenge/references/plain-english.md +98 -0
- package/templates/skills/orc-challenge/references/rubric.md +109 -0
- package/templates/skills/orc-challenge/references/sealed-slice.md +97 -0
- package/templates/skills/orc-challenge/references/verdict-doc.md +154 -0
- package/templates/skills/orc-claude/SKILL.md +199 -0
- package/templates/skills/orc-claude/examples/claude-run-mock.md +65 -0
- package/templates/skills/orc-claude/references/refresh.md +76 -0
- package/templates/skills/orc-claude/references/template.md +109 -0
- package/templates/skills/orc-diy/README.md +142 -0
- package/templates/skills/orc-diy/SKILL.md +70 -0
- package/templates/skills/orc-diy/references/blocks/analyze.md +24 -0
- package/templates/skills/orc-diy/references/blocks/execution.md +42 -0
- package/templates/skills/orc-diy/references/blocks/extra.md +55 -0
- package/templates/skills/orc-diy/references/blocks/header.md +55 -0
- package/templates/skills/orc-diy/references/blocks/mock-example.md +22 -0
- package/templates/skills/orc-diy/references/blocks/pattern.md +18 -0
- package/templates/skills/orc-diy/references/blocks/planning.md +34 -0
- package/templates/skills/orc-diy/references/blocks/review.md +18 -0
- package/templates/skills/orc-diy/references/blocks/scoring.md +16 -0
- package/templates/skills/orc-diy/references/blocks/security.md +25 -0
- package/templates/skills/orc-diy/references/blocks/ship.md +25 -0
- package/templates/skills/orc-diy/references/blocks/summary.md +18 -0
- package/templates/skills/orc-diy/references/blocks/testgen.md +17 -0
- package/templates/skills/orc-diy/references/blocks/trace.md +28 -0
- package/templates/skills/orc-diy/references/blocks/verify.md +25 -0
- package/templates/skills/orc-diy/references/blocks/wiki.md +26 -0
- package/templates/skills/orc-diy/references/compile.md +59 -0
- package/templates/skills/orc-diy/references/flow-schema.md +100 -0
- package/templates/skills/orc-diy/references/locked-blocks.md +37 -0
- package/templates/skills/orc-doc/README.md +229 -0
- package/templates/skills/orc-doc/SKILL.md +444 -0
- package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +325 -0
- package/templates/skills/orc-doc/references/chunking.md +527 -0
- package/templates/skills/orc-doc/references/gates.md +311 -0
- package/templates/skills/orc-doc/references/generation-rules.md +122 -0
- package/templates/skills/orc-doc/references/house-rules.md +170 -0
- package/templates/skills/orc-doc/references/import-targets.md +40 -0
- package/templates/skills/orc-doc/references/plain-language.md +66 -0
- package/templates/skills/orc-doc/references/portable-markdown.md +74 -0
- package/templates/skills/orc-doc/references/resume-protocol.md +228 -0
- package/templates/skills/orc-doc/references/templates/collaboration.md +118 -0
- package/templates/skills/orc-doc/references/templates/prd.md +133 -0
- package/templates/skills/orc-doc/references/templates/report.md +102 -0
- package/templates/skills/orc-doc/references/templates/tsd.md +122 -0
- package/templates/skills/orc-doc/references/templates/workflow.md +112 -0
- package/templates/skills/orc-explain/SKILL.md +57 -0
- package/templates/skills/orc-export/SKILL.md +154 -0
- package/templates/skills/orc-fast/SKILL.md +188 -0
- package/templates/skills/orc-grill/SKILL.md +207 -0
- package/templates/skills/orc-grill/references/grill-doc.md +105 -0
- package/templates/skills/orc-handoff/SKILL.md +204 -0
- package/templates/skills/orc-handoff/references/handoff-log.md +67 -0
- package/templates/skills/orc-handoff/references/surfaces.md +88 -0
- package/templates/skills/orc-judge/SKILL.md +82 -0
- package/templates/skills/orc-learn/SKILL.md +156 -0
- package/templates/skills/orc-learn/examples/learn-run-mock.md +61 -0
- package/templates/skills/orc-learn/references/deepen.md +70 -0
- package/templates/skills/orc-learn/references/refresh.md +65 -0
- package/templates/skills/orc-learn/references/template-knowledge.md +83 -0
- package/templates/skills/orc-learn/references/template-learning.md +67 -0
- package/templates/skills/orc-mini/SKILL.md +226 -0
- package/templates/skills/orc-mini/examples/mini-run-mock.md +50 -0
- package/templates/skills/orc-pact/SKILL.md +218 -0
- package/templates/skills/orc-pact/references/gate.md +70 -0
- package/templates/skills/orc-pact/references/ledger.md +99 -0
- package/templates/skills/orc-pattern/SKILL.md +124 -0
- package/templates/skills/orc-pattern/references/INDEX.md +73 -0
- package/templates/skills/orc-pattern/references/be-django.md +80 -0
- package/templates/skills/orc-pattern/references/be-express.md +82 -0
- package/templates/skills/orc-pattern/references/be-fastapi.md +107 -0
- package/templates/skills/orc-pattern/references/be-go.md +96 -0
- package/templates/skills/orc-pattern/references/be-nestjs.md +86 -0
- package/templates/skills/orc-pattern/references/be-postgres.md +98 -0
- package/templates/skills/orc-pattern/references/fe-a11y.md +36 -0
- package/templates/skills/orc-pattern/references/fe-angular.md +87 -0
- package/templates/skills/orc-pattern/references/fe-nextjs.md +65 -0
- package/templates/skills/orc-pattern/references/fe-perf.md +39 -0
- package/templates/skills/orc-pattern/references/fe-react.md +83 -0
- package/templates/skills/orc-pattern/references/fe-vue.md +75 -0
- package/templates/skills/orc-pattern/schemas/pattern-doc.md +62 -0
- package/templates/skills/orc-poly/SKILL.md +216 -0
- package/templates/skills/orc-poly/examples/poly-run-mock.md +51 -0
- package/templates/skills/orc-poly/references/gather.md +70 -0
- package/templates/skills/orc-poly/references/poly-spec.md +84 -0
- package/templates/skills/orc-pr-driver/README.md +349 -0
- package/templates/skills/orc-pr-driver/SKILL.md +167 -0
- package/templates/skills/orc-pr-driver/references/conflict-playbook.md +78 -0
- package/templates/skills/orc-pr-driver/references/green-gate.md +105 -0
- package/templates/skills/orc-pr-driver/references/orc-run-split.md +99 -0
- package/templates/skills/orc-pr-setup/README.md +436 -0
- package/templates/skills/orc-pr-setup/SKILL.md +184 -0
- package/templates/skills/orc-pr-setup/references/certainty-gate.md +66 -0
- package/templates/skills/orc-pr-setup/references/layer-taxonomy.md +67 -0
- package/templates/skills/orc-quick/README.md +423 -0
- package/templates/skills/orc-quick/SKILL.md +306 -0
- package/templates/skills/orc-quick/references/context-doc.md +114 -0
- package/templates/skills/orc-quick/references/dispatch-gate.md +163 -0
- package/templates/skills/orc-quick/references/gh-mode.md +127 -0
- package/templates/skills/orc-retro/SKILL.md +222 -0
- package/templates/skills/orc-retro/examples/retro-mock.md +171 -0
- package/templates/skills/orc-route/SKILL.md +165 -0
- package/templates/skills/orc-verify/SKILL.md +86 -0
- package/templates/skills/orc-verify/examples/verify-mock.md +33 -0
- package/templates/skills/orc-wiki/README.md +325 -0
- package/templates/skills/orc-wiki/SKILL.md +322 -0
- package/templates/skills/orc-wiki/examples/wiki-run-mock.md +37 -0
- package/templates/skills/orc-wiki/references/claude-md-injection.md +61 -0
- package/templates/skills/orc-wiki/references/crosslink-compile.md +39 -0
- package/templates/skills/orc-wiki/references/crosslink-kinds.md +57 -0
- package/templates/skills/orc-wiki/references/crosslink.md +284 -0
- package/templates/skills/orc-wiki/references/extra.md +79 -0
- package/templates/skills/orc-wiki/references/integrity-check.md +86 -0
- package/templates/skills/orc-wiki/references/orientation.md +51 -0
- package/templates/skills/orc-wiki/references/partial-refresh.md +203 -0
- package/templates/skills/orc-wiki/references/pattern-prewarm.md +19 -0
- package/templates/skills/orc-wiki/references/staleness.md +288 -0
- package/templates/skills/orc-wiki/schemas/crosslink-tag.md +166 -0
- 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
|
+
}
|