@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,416 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* panels/runs.js — orc ui client
|
|
3
|
+
The run accordion — one row open at a time, detail fetched on first open.
|
|
4
|
+
|
|
5
|
+
Loaded by app.html in the order its numeric prefix names. Classic
|
|
6
|
+
script, no import/export: an ES module import carries no query string,
|
|
7
|
+
and every static request here needs the per-launch session token. */
|
|
8
|
+
|
|
9
|
+
// The CLI's own state words. `closed` (v0.49.2) is deliberately NOT `done`: the
|
|
10
|
+
// disk cannot prove the run finished, only that a human said they were finished
|
|
11
|
+
// with it — so it reads as neutral, never as a success.
|
|
12
|
+
const RUN_STATUS_KIND = { waiting: "warn", done: "ok", closed: "" };
|
|
13
|
+
// The aftermath grade chip. The LABELS are ours to shorten; the GRADE ids are
|
|
14
|
+
// the CLI's and are what the kind map is keyed on.
|
|
15
|
+
const AFTER_KIND = { HELD: "ok", CHURN: "warn", REVERTED: "bad", TOO_RECENT: "", SHALLOW: "" };
|
|
16
|
+
const AFTER_LABEL = { HELD: "✓ HELD", CHURN: "~ CHURN", REVERTED: "✗ REVERTED", TOO_RECENT: "– too recent", SHALLOW: "– no commits" };
|
|
17
|
+
const afterGrade = (after, slug) => ((after && after.runs) || []).find((r) => r.slug === slug) || null;
|
|
18
|
+
|
|
19
|
+
PANELS.runs = function (host) {
|
|
20
|
+
head(host, t("runs.title"), t("runs.sub"));
|
|
21
|
+
const body = el("div", "stack");
|
|
22
|
+
host.append(body);
|
|
23
|
+
renderRuns(body);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
async function renderRuns(body) {
|
|
27
|
+
body.replaceChildren(skeleton(6));
|
|
28
|
+
let d;
|
|
29
|
+
let after = null;
|
|
30
|
+
try {
|
|
31
|
+
d = (await read("/api/runs")).data;
|
|
32
|
+
// One extra read, in parallel with nothing — the grade chip is per row and
|
|
33
|
+
// fetching it per row would be N requests for a list that is already loaded.
|
|
34
|
+
after = (await read("/api/aftermath").catch(() => ({ data: null }))).data;
|
|
35
|
+
} catch (e) {
|
|
36
|
+
body.replaceChildren(failBox(e));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!d.total) {
|
|
40
|
+
body.replaceChildren(empty(t("runs.empty"), d.run_dir));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const wanted = new URLSearchParams(location.hash.split("?")[1] || "").get("slug");
|
|
45
|
+
const out = frag();
|
|
46
|
+
|
|
47
|
+
// --- toolbar: status segments + a text filter, both client-side over an
|
|
48
|
+
// already-fetched list, so filtering never costs a request.
|
|
49
|
+
const bar = el("div", "toolbar");
|
|
50
|
+
const search = el("div", "search");
|
|
51
|
+
const input = el("input", "text-input");
|
|
52
|
+
input.type = "search";
|
|
53
|
+
input.placeholder = t("runs.search");
|
|
54
|
+
search.append(input);
|
|
55
|
+
bar.append(search);
|
|
56
|
+
|
|
57
|
+
let statusFilter = "all";
|
|
58
|
+
const seg = el("div", "seg");
|
|
59
|
+
const segs = [
|
|
60
|
+
["all", t("runs.filterAll")],
|
|
61
|
+
["waiting", t("runs.filterWaiting")],
|
|
62
|
+
["done", t("runs.filterDone")],
|
|
63
|
+
["closed", t("runs.filterClosed")],
|
|
64
|
+
["other", t("runs.filterOther")],
|
|
65
|
+
];
|
|
66
|
+
for (const [val, label] of segs) {
|
|
67
|
+
const b = el("button", null, label);
|
|
68
|
+
b.type = "button";
|
|
69
|
+
b.setAttribute("aria-pressed", String(val === statusFilter));
|
|
70
|
+
b.addEventListener("click", () => {
|
|
71
|
+
statusFilter = val;
|
|
72
|
+
for (const other of seg.children) other.setAttribute("aria-pressed", "false");
|
|
73
|
+
b.setAttribute("aria-pressed", "true");
|
|
74
|
+
apply();
|
|
75
|
+
});
|
|
76
|
+
seg.append(b);
|
|
77
|
+
}
|
|
78
|
+
bar.append(seg);
|
|
79
|
+
const count = el("span", "toolbar-result");
|
|
80
|
+
bar.append(count);
|
|
81
|
+
const closeAll = el("button", "btn btn-ghost btn-sm", t("runs.collapseAll"));
|
|
82
|
+
closeAll.type = "button";
|
|
83
|
+
closeAll.addEventListener("click", () => collapseAll());
|
|
84
|
+
bar.append(closeAll);
|
|
85
|
+
out.append(bar);
|
|
86
|
+
|
|
87
|
+
const list = el("div", "run-list");
|
|
88
|
+
const rows = [];
|
|
89
|
+
|
|
90
|
+
const collapseAll = (except) => {
|
|
91
|
+
for (const r of rows) if (r.row !== except) setOpen(r, false);
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
function setOpen(entry, open) {
|
|
95
|
+
entry.row.classList.toggle("open", open);
|
|
96
|
+
entry.head.setAttribute("aria-expanded", String(open));
|
|
97
|
+
if (open && !entry.loaded) {
|
|
98
|
+
entry.loaded = true;
|
|
99
|
+
loadRunDetail(entry.pane, entry.slug, entry.grade);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
for (const r of d.runs) {
|
|
104
|
+
const row = el("div", "run-row");
|
|
105
|
+
row.dataset.slug = r.slug;
|
|
106
|
+
row.dataset.status = r.status;
|
|
107
|
+
|
|
108
|
+
const headBtn = el("button", "run-card");
|
|
109
|
+
headBtn.type = "button";
|
|
110
|
+
headBtn.setAttribute("aria-expanded", "false");
|
|
111
|
+
headBtn.append(el("span", "run-caret", "▸"));
|
|
112
|
+
// Status is the CLI's vocabulary (`waiting` / `done` / `empty`) — the same
|
|
113
|
+
// word `orc run list` prints. Shown as-is in every language.
|
|
114
|
+
headBtn.append(chip(r.status, RUN_STATUS_KIND[r.status] || ""));
|
|
115
|
+
// The aftermath grade (v0.46.0). The CLI's own word, and `TOO_RECENT` KEEPS
|
|
116
|
+
// ITS SLOT — it is an answer ("younger than 7 days"), not a gap, and hiding
|
|
117
|
+
// it would make a fresh run and an ungraded one look identical.
|
|
118
|
+
const grade = afterGrade(after, r.slug);
|
|
119
|
+
if (grade) {
|
|
120
|
+
const gc = chip(AFTER_LABEL[grade.grade] || grade.grade, AFTER_KIND[grade.grade] || "");
|
|
121
|
+
gc.title = grade.note || "";
|
|
122
|
+
headBtn.append(gc);
|
|
123
|
+
// A fifth child needs a fifth column — see `.run-card.has-extra`. The
|
|
124
|
+
// Docs list does the same for its "you edited it" chip.
|
|
125
|
+
headBtn.classList.add("has-extra");
|
|
126
|
+
}
|
|
127
|
+
const mid = el("div", "run-mid");
|
|
128
|
+
mid.append(el("div", "run-slug", r.slug));
|
|
129
|
+
const where = [r.lane, r.phase && "phase " + r.phase, r.wave].filter(Boolean).join(" · ");
|
|
130
|
+
mid.append(el("div", "run-where", where || "—"));
|
|
131
|
+
// A closed row NEVER disappears and it always carries the reason the human
|
|
132
|
+
// gave — a state change with no visible reason is a state nobody can audit.
|
|
133
|
+
if (r.closed && r.closed.reason)
|
|
134
|
+
mid.append(el("div", "run-closed-why", t("runs.close.was", { reason: r.closed.reason })));
|
|
135
|
+
headBtn.append(mid, el("div", "run-age", relAge(r.updated_ms)));
|
|
136
|
+
|
|
137
|
+
// The fold. `.run-body-inner` is the real element the 1fr→0fr grid
|
|
138
|
+
// collapses against; without it there is nothing to animate to zero.
|
|
139
|
+
const pane = el("div", "run-pane stack stack-sm");
|
|
140
|
+
pane.append(skeleton(4));
|
|
141
|
+
const inner = el("div", "run-body-inner");
|
|
142
|
+
inner.append(pane);
|
|
143
|
+
const fold = el("div", "run-body");
|
|
144
|
+
fold.append(inner);
|
|
145
|
+
|
|
146
|
+
const entry = { row, head: headBtn, pane, slug: r.slug, grade, loaded: false };
|
|
147
|
+
rows.push(entry);
|
|
148
|
+
|
|
149
|
+
headBtn.addEventListener("click", () => {
|
|
150
|
+
const isOpen = row.classList.contains("open");
|
|
151
|
+
collapseAll(row);
|
|
152
|
+
setOpen(entry, !isOpen);
|
|
153
|
+
// A row that opens near the bottom of the viewport would otherwise reveal
|
|
154
|
+
// its content off-screen — the one scroll this panel ever performs.
|
|
155
|
+
if (!isOpen)
|
|
156
|
+
requestAnimationFrame(() => {
|
|
157
|
+
const rect = row.getBoundingClientRect();
|
|
158
|
+
if (rect.top < 0 || rect.top > window.innerHeight * 0.6)
|
|
159
|
+
row.scrollIntoView({ behavior: matchMedia("(prefers-reduced-motion: reduce)").matches ? "auto" : "smooth", block: "start" });
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
row.append(headBtn, fold);
|
|
164
|
+
list.append(row);
|
|
165
|
+
}
|
|
166
|
+
out.append(list);
|
|
167
|
+
|
|
168
|
+
const none = empty(t("runs.noMatch"));
|
|
169
|
+
none.classList.add("hidden");
|
|
170
|
+
out.append(none);
|
|
171
|
+
|
|
172
|
+
function apply() {
|
|
173
|
+
const q = input.value.trim().toLowerCase();
|
|
174
|
+
let shown = 0;
|
|
175
|
+
for (const entry of rows) {
|
|
176
|
+
const st = entry.row.dataset.status;
|
|
177
|
+
const statusHit =
|
|
178
|
+
statusFilter === "all"
|
|
179
|
+
? true
|
|
180
|
+
: statusFilter === "other"
|
|
181
|
+
? st !== "waiting" && st !== "done" && st !== "closed"
|
|
182
|
+
: st === statusFilter;
|
|
183
|
+
const textHit = !q || entry.row.textContent.toLowerCase().includes(q);
|
|
184
|
+
const hit = statusHit && textHit;
|
|
185
|
+
entry.row.classList.toggle("hidden", !hit);
|
|
186
|
+
// A filtered-out row must not stay open behind the filter — reopening the
|
|
187
|
+
// filter would reveal a run you no longer have in view.
|
|
188
|
+
if (!hit) setOpen(entry, false);
|
|
189
|
+
if (hit) shown++;
|
|
190
|
+
}
|
|
191
|
+
count.textContent = t("runs.count", { shown, total: d.total });
|
|
192
|
+
none.classList.toggle("hidden", shown > 0);
|
|
193
|
+
}
|
|
194
|
+
input.addEventListener("input", apply);
|
|
195
|
+
input.addEventListener("keydown", (e) => {
|
|
196
|
+
if (e.key === "Escape" && input.value) {
|
|
197
|
+
e.stopPropagation();
|
|
198
|
+
input.value = "";
|
|
199
|
+
apply();
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
body.replaceChildren(out);
|
|
204
|
+
apply();
|
|
205
|
+
|
|
206
|
+
// Deep link from Overview: open that run, and only that run.
|
|
207
|
+
if (wanted) {
|
|
208
|
+
const entry = rows.find((r) => r.slug === wanted);
|
|
209
|
+
if (entry) {
|
|
210
|
+
setOpen(entry, true);
|
|
211
|
+
requestAnimationFrame(() => entry.row.scrollIntoView({ block: "center" }));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Fills one expanded row. Identical content to the old detail card — the change
|
|
217
|
+
// is WHERE it renders, not what it says.
|
|
218
|
+
// The aftermath detail goes INSIDE the expanded row — there is no detail box
|
|
219
|
+
// below the list and no `showRun`. One row open at a time, fetched on first open.
|
|
220
|
+
function afterBox(grade) {
|
|
221
|
+
if (!grade) return null;
|
|
222
|
+
const box = el("div", "after-box");
|
|
223
|
+
box.append(el("div", "after-head", t("runs.after.signals")));
|
|
224
|
+
for (const sig of grade.signals || []) {
|
|
225
|
+
const line = el("div", "after-row");
|
|
226
|
+
line.append(chip(sig.kind, sig.strength >= 3 ? "bad" : "warn"));
|
|
227
|
+
line.append(el("span", null, sig.detail));
|
|
228
|
+
box.append(line);
|
|
229
|
+
}
|
|
230
|
+
// Churn is a SIGNAL, not a verdict — the caveat always travels with the
|
|
231
|
+
// evidence, including on HELD ("nothing came back" is not "it worked").
|
|
232
|
+
if (grade.note) box.append(el("div", "note", grade.note));
|
|
233
|
+
return box;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function loadRunDetail(pane, slug, grade) {
|
|
237
|
+
Promise.all([
|
|
238
|
+
read("/api/run?slug=" + encodeURIComponent(slug)),
|
|
239
|
+
read("/api/mock?slug=" + encodeURIComponent(slug)).catch(() => ({ data: null })),
|
|
240
|
+
])
|
|
241
|
+
.then(([runRes, mockRes]) => {
|
|
242
|
+
const d = runRes.data;
|
|
243
|
+
const mock = mockRes && mockRes.data && mockRes.data.found ? mockRes.data : null;
|
|
244
|
+
const out = frag();
|
|
245
|
+
const ab = afterBox(grade);
|
|
246
|
+
if (ab) out.append(ab);
|
|
247
|
+
|
|
248
|
+
// The action that CLEARS the caution lives in the panel the caution points
|
|
249
|
+
// at — the FINDING_ROUTE principle. A waiting run the user has abandoned is
|
|
250
|
+
// what blocks the upgrade preview, and this is the button that unblocks it.
|
|
251
|
+
// A close changes the LIST (the row's status, the filters, the count), not
|
|
252
|
+
// just this row, so the refresh is the panel's, not the row's.
|
|
253
|
+
const acts = runCloseActions(d, () => route());
|
|
254
|
+
if (acts) out.append(acts);
|
|
255
|
+
|
|
256
|
+
out.append(
|
|
257
|
+
kvList([
|
|
258
|
+
[t("runs.field.slug"), d.slug],
|
|
259
|
+
[t("runs.field.status"), d.status],
|
|
260
|
+
[t("runs.field.lane"), d.stands && d.stands.lane],
|
|
261
|
+
[t("runs.field.phase"), d.stands && d.stands.phase],
|
|
262
|
+
[t("runs.field.wave"), d.stands && d.stands.wave],
|
|
263
|
+
[t("runs.field.folder"), d.dir],
|
|
264
|
+
[t("runs.field.updated"), relAge(d.updated_ms)],
|
|
265
|
+
])
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
const tabs = el("div", "tabs");
|
|
269
|
+
const view = el("div", "tab-pane");
|
|
270
|
+
const views = [];
|
|
271
|
+
const addTab = (label, render) => views.push({ label, render });
|
|
272
|
+
|
|
273
|
+
if (d.resume)
|
|
274
|
+
addTab(t("runs.tab.resume"), () => {
|
|
275
|
+
const box = el("div", "stack stack-sm");
|
|
276
|
+
box.append(el("div", "note", t("runs.resume.note")));
|
|
277
|
+
const actions = el("div", "row-actions");
|
|
278
|
+
const cp = el("button", "btn btn-sm", t("runs.resume.copy"));
|
|
279
|
+
cp.type = "button";
|
|
280
|
+
cp.addEventListener("click", () => copy(d.resume, t("runs.resume.copied")));
|
|
281
|
+
actions.append(cp);
|
|
282
|
+
box.append(actions, el("pre", "block wrap", d.resume));
|
|
283
|
+
return box;
|
|
284
|
+
});
|
|
285
|
+
if (d.state_of_play) addTab(t("runs.tab.state"), () => el("pre", "block wrap", d.state_of_play));
|
|
286
|
+
if (d.checkpoint)
|
|
287
|
+
addTab(t("runs.tab.checkpoint"), () => {
|
|
288
|
+
const box = el("div", "stack stack-sm");
|
|
289
|
+
// These four are checkpoint.json's own field names — file keys, not
|
|
290
|
+
// labels, so they stay exactly as the file spells them.
|
|
291
|
+
box.append(
|
|
292
|
+
kvList([
|
|
293
|
+
["phase", d.checkpoint.phase],
|
|
294
|
+
["wave", d.checkpoint.wave],
|
|
295
|
+
["updated_at", d.checkpoint.updated_at],
|
|
296
|
+
["trace_path", d.checkpoint.trace_path],
|
|
297
|
+
])
|
|
298
|
+
);
|
|
299
|
+
box.append(el("pre", "block", JSON.stringify(d.checkpoint, null, 2)));
|
|
300
|
+
return box;
|
|
301
|
+
});
|
|
302
|
+
if (d.trace)
|
|
303
|
+
addTab(t("runs.tab.trace"), () => {
|
|
304
|
+
const box = el("div", "stack stack-sm");
|
|
305
|
+
box.append(el("div", "note", t("runs.trace.note")));
|
|
306
|
+
box.append(el("pre", "block", d.trace));
|
|
307
|
+
return box;
|
|
308
|
+
});
|
|
309
|
+
// Honesty rule: a run with no mock example shows "Not generated for this
|
|
310
|
+
// run", never an empty state that implies one is missing. And never a
|
|
311
|
+
// Run button.
|
|
312
|
+
addTab(t("runs.tab.mock"), () => {
|
|
313
|
+
if (!mock) return empty(t("runs.mock.none"), t("runs.mock.noneHint"));
|
|
314
|
+
const box = el("div", "stack stack-sm");
|
|
315
|
+
box.append(
|
|
316
|
+
kvList([
|
|
317
|
+
[t("runs.field.folder"), mock.dir],
|
|
318
|
+
[t("runs.field.files"), String(mock.files.length)],
|
|
319
|
+
[t("runs.field.written"), relAge(mock.mtime_ms)],
|
|
320
|
+
])
|
|
321
|
+
);
|
|
322
|
+
box.append(el("div", "note", t("runs.mock.readonly")));
|
|
323
|
+
if (mock.readme) box.append(el("pre", "block wrap", mock.readme));
|
|
324
|
+
const fl = el("div", "file-list");
|
|
325
|
+
for (const f of mock.files) fl.append(el("div", null, f.path));
|
|
326
|
+
box.append(fl);
|
|
327
|
+
return box;
|
|
328
|
+
});
|
|
329
|
+
if (!views.length)
|
|
330
|
+
addTab(t("runs.tab.files"), () => el("pre", "block", (d.files || []).join("\n") || t("runs.emptyFolder")));
|
|
331
|
+
|
|
332
|
+
const show = (v, btn) => {
|
|
333
|
+
for (const other of tabs.children) other.setAttribute("aria-selected", "false");
|
|
334
|
+
btn.setAttribute("aria-selected", "true");
|
|
335
|
+
view.replaceChildren(v.render());
|
|
336
|
+
// Re-trigger the tab-swap fade; a replaced child alone shows no change.
|
|
337
|
+
view.style.animation = "none";
|
|
338
|
+
void view.offsetHeight;
|
|
339
|
+
view.style.animation = "";
|
|
340
|
+
};
|
|
341
|
+
views.forEach((v, i) => {
|
|
342
|
+
const b = el("button", null, v.label);
|
|
343
|
+
b.type = "button";
|
|
344
|
+
b.setAttribute("aria-selected", String(i === 0));
|
|
345
|
+
b.addEventListener("click", () => show(v, b));
|
|
346
|
+
tabs.append(b);
|
|
347
|
+
});
|
|
348
|
+
view.replaceChildren(views[0].render());
|
|
349
|
+
out.append(tabs, view);
|
|
350
|
+
pane.replaceChildren(out);
|
|
351
|
+
})
|
|
352
|
+
.catch((e) => pane.replaceChildren(empty(t("runs.openFail"), String(e.message))));
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/* MARK AS DONE / REOPEN (v0.49.2).
|
|
356
|
+
|
|
357
|
+
`RESUME.md` existing IS the unfinished flag, and ORC deletes it at FINISH — so
|
|
358
|
+
a run the user abandoned stayed "waiting" forever, kept being offered by
|
|
359
|
+
`orc resume`, and kept the upgrade preview blocked with no way out.
|
|
360
|
+
|
|
361
|
+
The confirmation names the file that MOVES and says, in as many words, that
|
|
362
|
+
nothing is deleted. The reason is REQUIRED — the CLI refuses without one, and
|
|
363
|
+
the form does not second-guess that: it submits and reports what came back. */
|
|
364
|
+
function runCloseActions(d, onDone) {
|
|
365
|
+
if (d.status !== "waiting" && d.status !== "closed") return null;
|
|
366
|
+
const box = el("div", "row-actions");
|
|
367
|
+
if (d.status === "waiting") {
|
|
368
|
+
const b = el("button", "btn btn-sm", t("runs.close.button"));
|
|
369
|
+
b.type = "button";
|
|
370
|
+
b.addEventListener("click", () => confirmRunClose(d.slug, onDone));
|
|
371
|
+
box.append(b);
|
|
372
|
+
box.append(el("span", "note", t("runs.close.hint")));
|
|
373
|
+
} else {
|
|
374
|
+
const b = el("button", "btn btn-sm btn-ghost", t("runs.close.reopen"));
|
|
375
|
+
b.type = "button";
|
|
376
|
+
b.addEventListener("click", async () => {
|
|
377
|
+
const r = await post("/api/run/reopen", { slug: d.slug });
|
|
378
|
+
toast(r.ok ? t("runs.close.reopened") : t("runs.close.failed"), r.ok ? "ok" : "bad", r.output);
|
|
379
|
+
onDone();
|
|
380
|
+
});
|
|
381
|
+
box.append(b);
|
|
382
|
+
if (d.closed && d.closed.reason) box.append(el("span", "note", t("runs.close.was", { reason: d.closed.reason })));
|
|
383
|
+
}
|
|
384
|
+
return box;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
function confirmRunClose(slug, onDone) {
|
|
388
|
+
const wrap = frag();
|
|
389
|
+
wrap.append(el("p", null, t("runs.close.confirmBody", { slug })));
|
|
390
|
+
// Never the word "delete": this MOVES one file and writes one more.
|
|
391
|
+
wrap.append(el("div", "note", t("runs.close.moves")));
|
|
392
|
+
const input = el("input", "text-input");
|
|
393
|
+
input.type = "text";
|
|
394
|
+
input.placeholder = t("runs.close.reasonPlaceholder");
|
|
395
|
+
wrap.append(input);
|
|
396
|
+
const cmd = el("pre", "cmd", `orc run close ${slug} --reason "…"`);
|
|
397
|
+
wrap.append(cmd);
|
|
398
|
+
input.addEventListener("input", () => {
|
|
399
|
+
cmd.textContent = `orc run close ${slug} --reason "${input.value || "…"}"`;
|
|
400
|
+
});
|
|
401
|
+
modal({
|
|
402
|
+
title: t("runs.close.confirmTitle"),
|
|
403
|
+
body: wrap,
|
|
404
|
+
actions: {
|
|
405
|
+
[t("common.cancel")]: null,
|
|
406
|
+
[t("runs.close.button")]: async () => {
|
|
407
|
+
const reason = input.value.trim();
|
|
408
|
+
if (!reason) return toast(t("runs.close.needReason"), "bad");
|
|
409
|
+
const r = await post("/api/run/close", { slug, reason });
|
|
410
|
+
toast(r.ok ? t("runs.close.done") : t("runs.close.failed"), r.ok ? "ok" : "bad", r.output);
|
|
411
|
+
onDone();
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
});
|
|
415
|
+
requestAnimationFrame(() => input.focus());
|
|
416
|
+
}
|