@jterrats/open-orchestra 0.5.5 → 1.0.1
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/AGENTS.md +9 -8
- package/CLAUDE.md +13 -11
- package/README.md +78 -11
- package/dist/assets/web-console.js +203 -36
- package/dist/automation-evidence.d.ts +23 -0
- package/dist/automation-evidence.js +97 -0
- package/dist/automation-evidence.js.map +1 -0
- package/dist/autonomous-run-state.d.ts +4 -1
- package/dist/autonomous-run-state.js +8 -2
- package/dist/autonomous-run-state.js.map +1 -1
- package/dist/autonomous-run-store.d.ts +3 -1
- package/dist/autonomous-run-store.js +9 -3
- package/dist/autonomous-run-store.js.map +1 -1
- package/dist/autonomous-workflow-constants.js +5 -1
- package/dist/autonomous-workflow-constants.js.map +1 -1
- package/dist/benchmark.d.ts +4 -1
- package/dist/benchmark.js +140 -19
- package/dist/benchmark.js.map +1 -1
- package/dist/cli.js +88 -2
- package/dist/cli.js.map +1 -1
- package/dist/collaboration-flows.js +5 -19
- package/dist/collaboration-flows.js.map +1 -1
- package/dist/collection-utils.d.ts +3 -0
- package/dist/collection-utils.js +10 -0
- package/dist/collection-utils.js.map +1 -0
- package/dist/command-manifest.d.ts +12 -1
- package/dist/command-manifest.js +218 -10
- package/dist/command-manifest.js.map +1 -1
- package/dist/commands.d.ts +14 -6
- package/dist/commands.js +78 -28
- package/dist/commands.js.map +1 -1
- package/dist/config-migrations.d.ts +24 -0
- package/dist/config-migrations.js +102 -0
- package/dist/config-migrations.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.js +26 -0
- package/dist/constants.js.map +1 -1
- package/dist/cursor-canvas.d.ts +20 -0
- package/dist/cursor-canvas.js +119 -0
- package/dist/cursor-canvas.js.map +1 -0
- package/dist/dashboard-commands.d.ts +2 -0
- package/dist/dashboard-commands.js +14 -0
- package/dist/dashboard-commands.js.map +1 -0
- package/dist/defaults.d.ts +13 -0
- package/dist/defaults.js +13 -0
- package/dist/defaults.js.map +1 -1
- package/dist/delegation-decision.js +23 -8
- package/dist/delegation-decision.js.map +1 -1
- package/dist/delivery-commands.js +5 -0
- package/dist/delivery-commands.js.map +1 -1
- package/dist/delivery-dashboard-charts.d.ts +4 -0
- package/dist/delivery-dashboard-charts.js +156 -0
- package/dist/delivery-dashboard-charts.js.map +1 -0
- package/dist/delivery-dashboard-html.d.ts +2 -0
- package/dist/delivery-dashboard-html.js +115 -0
- package/dist/delivery-dashboard-html.js.map +1 -0
- package/dist/delivery-dashboard-types.d.ts +78 -0
- package/dist/delivery-dashboard-types.js +2 -0
- package/dist/delivery-dashboard-types.js.map +1 -0
- package/dist/delivery-dashboard.d.ts +8 -0
- package/dist/delivery-dashboard.js +124 -0
- package/dist/delivery-dashboard.js.map +1 -0
- package/dist/doc-sync.d.ts +25 -0
- package/dist/doc-sync.js +79 -0
- package/dist/doc-sync.js.map +1 -0
- package/dist/effort-classification.d.ts +7 -0
- package/dist/effort-classification.js +72 -0
- package/dist/effort-classification.js.map +1 -0
- package/dist/extension-commands.d.ts +3 -0
- package/dist/extension-commands.js +40 -0
- package/dist/extension-commands.js.map +1 -0
- package/dist/extensions.d.ts +22 -0
- package/dist/extensions.js +126 -0
- package/dist/extensions.js.map +1 -0
- package/dist/gemini-provider.d.ts +3 -6
- package/dist/gemini-provider.js +8 -17
- package/dist/gemini-provider.js.map +1 -1
- package/dist/github.d.ts +2 -0
- package/dist/github.js +15 -3
- package/dist/github.js.map +1 -1
- package/dist/health-checks.js +51 -0
- package/dist/health-checks.js.map +1 -1
- package/dist/lucid-story-map.d.ts +73 -0
- package/dist/lucid-story-map.js +112 -0
- package/dist/lucid-story-map.js.map +1 -0
- package/dist/mcp-integrations.d.ts +19 -0
- package/dist/mcp-integrations.js +58 -0
- package/dist/mcp-integrations.js.map +1 -0
- package/dist/mcp-tool-adapter.d.ts +21 -0
- package/dist/mcp-tool-adapter.js +56 -0
- package/dist/mcp-tool-adapter.js.map +1 -0
- package/dist/metrics-commands.js +47 -13
- package/dist/metrics-commands.js.map +1 -1
- package/dist/model-commands.d.ts +5 -0
- package/dist/model-commands.js +95 -1
- package/dist/model-commands.js.map +1 -1
- package/dist/model-providers.d.ts +5 -12
- package/dist/model-providers.js +30 -43
- package/dist/model-providers.js.map +1 -1
- package/dist/network-policy.d.ts +2 -0
- package/dist/network-policy.js +6 -0
- package/dist/network-policy.js.map +1 -0
- package/dist/ollama-provider.d.ts +3 -6
- package/dist/ollama-provider.js +7 -16
- package/dist/ollama-provider.js.map +1 -1
- package/dist/package-update-check.d.ts +19 -0
- package/dist/package-update-check.js +24 -0
- package/dist/package-update-check.js.map +1 -1
- package/dist/phase-executor.d.ts +1 -0
- package/dist/phase-executor.js +401 -9
- package/dist/phase-executor.js.map +1 -1
- package/dist/phase-playbooks.d.ts +18 -1
- package/dist/phase-playbooks.js +146 -2
- package/dist/phase-playbooks.js.map +1 -1
- package/dist/planning-commands.d.ts +1 -0
- package/dist/planning-commands.js +36 -36
- package/dist/planning-commands.js.map +1 -1
- package/dist/policy-commands.d.ts +2 -0
- package/dist/policy-commands.js +29 -0
- package/dist/policy-commands.js.map +1 -0
- package/dist/policy-defaults.d.ts +2 -0
- package/dist/policy-defaults.js +42 -0
- package/dist/policy-defaults.js.map +1 -0
- package/dist/policy.d.ts +20 -0
- package/dist/policy.js +155 -0
- package/dist/policy.js.map +1 -0
- package/dist/project-detection.js +9 -7
- package/dist/project-detection.js.map +1 -1
- package/dist/prompt-registry-update.d.ts +2 -0
- package/dist/prompt-registry-update.js +5 -1
- package/dist/prompt-registry-update.js.map +1 -1
- package/dist/prompt-registry-validation.d.ts +3 -0
- package/dist/prompt-registry-validation.js +61 -21
- package/dist/prompt-registry-validation.js.map +1 -1
- package/dist/provider-utils.d.ts +11 -0
- package/dist/provider-utils.js +14 -0
- package/dist/provider-utils.js.map +1 -1
- package/dist/qa-commands.d.ts +2 -0
- package/dist/qa-commands.js +18 -0
- package/dist/qa-commands.js.map +1 -0
- package/dist/qa-coverage.d.ts +24 -0
- package/dist/qa-coverage.js +189 -0
- package/dist/qa-coverage.js.map +1 -0
- package/dist/qa-readiness.d.ts +5 -0
- package/dist/qa-readiness.js +26 -0
- package/dist/qa-readiness.js.map +1 -0
- package/dist/refresh-generated.d.ts +32 -0
- package/dist/refresh-generated.js +180 -0
- package/dist/refresh-generated.js.map +1 -0
- package/dist/release-candidate.d.ts +9 -1
- package/dist/release-candidate.js +52 -1
- package/dist/release-candidate.js.map +1 -1
- package/dist/release-commands.js +161 -8
- package/dist/release-commands.js.map +1 -1
- package/dist/release-readiness.d.ts +33 -0
- package/dist/release-readiness.js +187 -3
- package/dist/release-readiness.js.map +1 -1
- package/dist/runtime-adapters.d.ts +2 -1
- package/dist/runtime-adapters.js +16 -0
- package/dist/runtime-adapters.js.map +1 -1
- package/dist/runtime-bootstrap.js +1 -1
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/runtime-commands.d.ts +2 -0
- package/dist/runtime-commands.js +85 -3
- package/dist/runtime-commands.js.map +1 -1
- package/dist/runtime-execution-adapters.js +40 -0
- package/dist/runtime-execution-adapters.js.map +1 -1
- package/dist/runtime-execution-renderer.d.ts +3 -2
- package/dist/runtime-execution-renderer.js +46 -8
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.d.ts +8 -2
- package/dist/runtime-execution.js +109 -11
- package/dist/runtime-execution.js.map +1 -1
- package/dist/runtime-guardrails.d.ts +26 -0
- package/dist/runtime-guardrails.js +168 -0
- package/dist/runtime-guardrails.js.map +1 -0
- package/dist/setup-agents-import.js +5 -3
- package/dist/setup-agents-import.js.map +1 -1
- package/dist/skills-catalog.js +1 -0
- package/dist/skills-catalog.js.map +1 -1
- package/dist/skills-commands.d.ts +5 -0
- package/dist/skills-commands.js +79 -2
- package/dist/skills-commands.js.map +1 -1
- package/dist/skills-memory.d.ts +36 -2
- package/dist/skills-memory.js +165 -6
- package/dist/skills-memory.js.map +1 -1
- package/dist/skills-planning.js +9 -22
- package/dist/skills-planning.js.map +1 -1
- package/dist/skills-render.js +2 -4
- package/dist/skills-render.js.map +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/skills.js +1 -1
- package/dist/skills.js.map +1 -1
- package/dist/sprint-commands.js +2 -1
- package/dist/sprint-commands.js.map +1 -1
- package/dist/subagent-protocol.js +3 -5
- package/dist/subagent-protocol.js.map +1 -1
- package/dist/support-commands.d.ts +2 -0
- package/dist/support-commands.js +18 -0
- package/dist/support-commands.js.map +1 -0
- package/dist/support-diagnostics.d.ts +49 -0
- package/dist/support-diagnostics.js +86 -0
- package/dist/support-diagnostics.js.map +1 -0
- package/dist/task-graph-commands.js +6 -14
- package/dist/task-graph-commands.js.map +1 -1
- package/dist/task-text.d.ts +8 -0
- package/dist/task-text.js +18 -0
- package/dist/task-text.js.map +1 -0
- package/dist/telemetry-redaction.js +8 -1
- package/dist/telemetry-redaction.js.map +1 -1
- package/dist/tool-commands.d.ts +3 -0
- package/dist/tool-commands.js +62 -0
- package/dist/tool-commands.js.map +1 -1
- package/dist/tracker-adapters.d.ts +71 -0
- package/dist/tracker-adapters.js +186 -0
- package/dist/tracker-adapters.js.map +1 -0
- package/dist/tracker-commands.d.ts +2 -0
- package/dist/tracker-commands.js +119 -0
- package/dist/tracker-commands.js.map +1 -0
- package/dist/types/metrics.d.ts +25 -1
- package/dist/types/model-config.d.ts +51 -4
- package/dist/types/runtime.d.ts +83 -0
- package/dist/types/skills.d.ts +2 -0
- package/dist/types/tasks.d.ts +10 -0
- package/dist/types/workflow-run.d.ts +35 -0
- package/dist/types.d.ts +12 -4
- package/dist/types.js.map +1 -1
- package/dist/upgrade-commands.js +13 -4
- package/dist/upgrade-commands.js.map +1 -1
- package/dist/validation.js +2 -2
- package/dist/validation.js.map +1 -1
- package/dist/visual-validation.d.ts +81 -0
- package/dist/visual-validation.js +290 -0
- package/dist/visual-validation.js.map +1 -0
- package/dist/web-action-security.d.ts +11 -0
- package/dist/web-action-security.js +45 -0
- package/dist/web-action-security.js.map +1 -0
- package/dist/web-api-read-routes.js +115 -3
- package/dist/web-api-read-routes.js.map +1 -1
- package/dist/web-api.js +507 -5
- package/dist/web-api.js.map +1 -1
- package/dist/web-artifacts.d.ts +55 -0
- package/dist/web-artifacts.js +222 -0
- package/dist/web-artifacts.js.map +1 -0
- package/dist/web-console/assets/index-C9lx-V42.css +1 -0
- package/dist/web-console/assets/index-M3S0g1GK.js +11 -0
- package/dist/web-console/index.html +13 -0
- package/dist/web-console.js +9 -3
- package/dist/web-console.js.map +1 -1
- package/dist/web-recovery.d.ts +30 -0
- package/dist/web-recovery.js +163 -0
- package/dist/web-recovery.js.map +1 -0
- package/dist/web-workflow-progress.d.ts +41 -0
- package/dist/web-workflow-progress.js +114 -0
- package/dist/web-workflow-progress.js.map +1 -0
- package/dist/workflow-approval-service.d.ts +2 -1
- package/dist/workflow-approval-service.js +83 -4
- package/dist/workflow-approval-service.js.map +1 -1
- package/dist/workflow-approval-utils.js +13 -3
- package/dist/workflow-approval-utils.js.map +1 -1
- package/dist/workflow-event-query.d.ts +2 -0
- package/dist/workflow-event-query.js +6 -0
- package/dist/workflow-event-query.js.map +1 -0
- package/dist/workflow-evidence-service.js +18 -9
- package/dist/workflow-evidence-service.js.map +1 -1
- package/dist/workflow-gates.d.ts +2 -0
- package/dist/workflow-gates.js +103 -0
- package/dist/workflow-gates.js.map +1 -1
- package/dist/workflow-markdown.d.ts +6 -0
- package/dist/workflow-markdown.js +25 -0
- package/dist/workflow-markdown.js.map +1 -0
- package/dist/workflow-phase-planner.d.ts +19 -0
- package/dist/workflow-phase-planner.js +133 -0
- package/dist/workflow-phase-planner.js.map +1 -0
- package/dist/workflow-run-commands.d.ts +1 -0
- package/dist/workflow-run-commands.js +247 -20
- package/dist/workflow-run-commands.js.map +1 -1
- package/dist/workflow-services.d.ts +21 -12
- package/dist/workflow-services.js +376 -260
- package/dist/workflow-services.js.map +1 -1
- package/dist/workflow-task-service.d.ts +11 -0
- package/dist/workflow-task-service.js +242 -0
- package/dist/workflow-task-service.js.map +1 -0
- package/dist/workflow-templates.js +2 -14
- package/dist/workflow-templates.js.map +1 -1
- package/dist/workspace-validator.js +133 -5
- package/dist/workspace-validator.js.map +1 -1
- package/dist/workspace.js +10 -2
- package/dist/workspace.js.map +1 -1
- package/docs/adoption-guide.md +147 -0
- package/docs/autonomous-workflow.md +146 -28
- package/docs/benchmark.md +17 -9
- package/docs/command-contracts.md +18 -1
- package/docs/core-command-surface.md +62 -13
- package/docs/end-to-end-demo.md +1 -0
- package/docs/extension-contracts.md +83 -0
- package/docs/orchestra-mvp.md +86 -3
- package/docs/persona-workflows.md +32 -0
- package/docs/release-test-matrix.md +42 -0
- package/docs/runtime-adapters.md +113 -0
- package/docs/runtime-llm-flow.md +13 -0
- package/docs/setup-agents-applicability-review.md +173 -0
- package/docs/skill-loading-strategy.md +1 -0
- package/docs/source-of-truth-and-agent-learning.md +14 -0
- package/docs/traceability-flow.md +5 -1
- package/docs/tracker-adapter-contract.md +10 -1
- package/docs/web-console-qa.md +35 -0
- package/package.json +12 -6
- package/rules/development-engineering.mdc +66 -0
- package/skills/doc-sync/SKILL.md +2 -0
package/AGENTS.md
CHANGED
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
## Development Engineering
|
|
44
44
|
|
|
45
45
|
- APIs are product contracts: define request, response, error shape, auth, pagination, rate limits, compatibility, and idempotency before implementation.
|
|
46
|
+
- Load `rules/development-engineering.mdc` for implementation work that changes entry points, services, data access, async jobs, integrations, or tests.
|
|
46
47
|
- Data models must use domain language, explicit invariants, clear ownership, safe migrations, and indexes based on real query patterns.
|
|
47
48
|
- Frontend code must separate presentation, state, data access, and domain logic while preserving accessibility and responsive behavior.
|
|
48
49
|
- Performance-sensitive work needs budgets, hot-path review, caching ownership, timeouts, retries, backoff, and measurement evidence.
|
|
@@ -150,7 +151,7 @@
|
|
|
150
151
|
- Mark breaking changes with `!` and a `BREAKING CHANGE:` footer.
|
|
151
152
|
- Keep PRs <400 lines. Review your own diff before requesting review.
|
|
152
153
|
|
|
153
|
-
<!-- open-orchestra:start block-id="runtime-bootstrap" generator="open-orchestra runtime bootstrap" version="1" target="codex" source-manifest="open-orchestra command-manifest,runtime-bootstrap" content-sha256="
|
|
154
|
+
<!-- open-orchestra:start block-id="runtime-bootstrap" generator="open-orchestra runtime bootstrap" version="1" target="codex" source-manifest="open-orchestra command-manifest,runtime-bootstrap" content-sha256="d178c80135edb9ad2161e8c20eb2cfbf8cbca8ce189150886428b024389525d0" updated-at="2026-05-13T20:55:31.307Z" -->
|
|
154
155
|
# Open Orchestra Runtime Bootstrap
|
|
155
156
|
|
|
156
157
|
Runtime target: Codex. Reference Open Orchestra from AGENTS.md so local CLI work follows workflow gates.
|
|
@@ -177,7 +178,7 @@ Use the correct owner role for the type of work:
|
|
|
177
178
|
|
|
178
179
|
### Step 2 — Declare effort baseline
|
|
179
180
|
```
|
|
180
|
-
orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days <N> --ai-unguided-days <N>
|
|
181
|
+
orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days <N> --ai-unguided-days <N> --ai-guided-days <N>
|
|
181
182
|
```
|
|
182
183
|
|
|
183
184
|
### Step 3 — Run the autonomous workflow
|
|
@@ -219,17 +220,17 @@ orchestra benchmark --task <ID>
|
|
|
219
220
|
## Task Loop
|
|
220
221
|
- `orchestra health` - Check local tools and workflow readiness.
|
|
221
222
|
- `orchestra task list` - List local workflow tasks.
|
|
222
|
-
- `orchestra context --task <id>` - Read task context bundle.
|
|
223
223
|
- `orchestra delegation decide --task <id>` - Decide whether to delegate.
|
|
224
|
-
- `orchestra plan --task <id>` - Render role execution plan.
|
|
225
224
|
- `orchestra skills plan --task <id>` - Select task-scoped skills.
|
|
226
|
-
- `orchestra skills render --target <
|
|
225
|
+
- `orchestra skills render --target <generic|claude|cursor|codex|vscode|windsurf>` - Render skills for a runtime.
|
|
227
226
|
- `orchestra protocol render` - Render subagent protocol.
|
|
228
227
|
- `orchestra workflow render --task <id>` - Render workflow templates.
|
|
229
|
-
- `orchestra evidence add --task <id> --role <role> --type <type> --summary <text>` - Record delivery evidence.
|
|
230
|
-
- `orchestra review --task <id> --role <role> --result <approve|block|changes> --findings <text> --recommendation <text>` - Record reviewer outcome.
|
|
231
|
-
- `orchestra gate --gate <id> --task <id>` - Evaluate workflow gate.
|
|
232
228
|
- `orchestra summary` - Summarize workspace state.
|
|
229
|
+
- `orchestra context --task <id>` - Read task context bundle.
|
|
230
|
+
- `orchestra plan --task <id>` - Render role execution plan.
|
|
231
|
+
- `orchestra gate --gate <architecture> --task <id>` - Evaluate workflow gate.
|
|
232
|
+
- `orchestra review --task <id> --role <role> --result <approve|block|changes> --findings <text> --recommendation <text>` - Record reviewer outcome.
|
|
233
|
+
- `orchestra evidence add --task <id> --role <role> --type <command|file|screenshot|trace|video|log|report> --summary <text>` - Record delivery evidence.
|
|
233
234
|
|
|
234
235
|
## Completion
|
|
235
236
|
- Run the project validation gate.
|
package/CLAUDE.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
This repo uses Open Orchestra for all development work. Every feature or fix MUST go through the workflow:
|
|
8
8
|
|
|
9
9
|
1. **Task registration**: `orchestra task add --id <ID> --title "..." --owner <role> --paths "..." --goal "..."` before any code is written.
|
|
10
|
-
2. **Effort baseline**: `orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days N --ai-unguided-days N` before starting implementation.
|
|
10
|
+
2. **Effort baseline**: `orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days N --ai-unguided-days N --ai-guided-days N` before starting implementation.
|
|
11
11
|
3. **Autonomous run**: `orchestra workflow run --task <ID> --gates phase` to execute the PM→PO→Architect→Developer→QA→Release phase sequence.
|
|
12
12
|
4. **Sizing decision**: `orchestra decision add --task <ID> --owner architect --title "Story sizing" --decision "<sizing> [N points]" ...` is required before the developer phase proceeds.
|
|
13
13
|
5. **Architect sizing format**: always use `"<xs|s|m|l|xl> [N points]"` in `--decision` so the sizing gate reads it correctly (e.g. `"m [5 points]"`).
|
|
@@ -169,7 +169,7 @@ Do NOT start implementation without a registered task and workflow run. Use `orc
|
|
|
169
169
|
- Correct mistakes directly without apologizing.
|
|
170
170
|
- **No Ninja Edits.** Summarize proposed changes and get agreement before modifying files.
|
|
171
171
|
|
|
172
|
-
<!-- open-orchestra:start block-id="runtime-bootstrap" generator="open-orchestra runtime bootstrap" version="1" target="claude" source-manifest="open-orchestra command-manifest,runtime-bootstrap" content-sha256="
|
|
172
|
+
<!-- open-orchestra:start block-id="runtime-bootstrap" generator="open-orchestra runtime bootstrap" version="1" target="claude" source-manifest="open-orchestra command-manifest,runtime-bootstrap" content-sha256="8ad91f1f2db994b21271bd101fe3902b70140366dd9f4f866f99c36a4a3d290f" updated-at="2026-05-13T20:55:31.305Z" -->
|
|
173
173
|
# Open Orchestra Runtime Bootstrap
|
|
174
174
|
|
|
175
175
|
Runtime target: Claude. Reference compact Open Orchestra blocks from CLAUDE.md and load task skills on demand.
|
|
@@ -196,7 +196,7 @@ Use the correct owner role for the type of work:
|
|
|
196
196
|
|
|
197
197
|
### Step 2 — Declare effort baseline
|
|
198
198
|
```
|
|
199
|
-
orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days <N> --ai-unguided-days <N>
|
|
199
|
+
orchestra estimate --task <ID> --sizing <xs|s|m|l|xl> --solo-days <N> --ai-unguided-days <N> --ai-guided-days <N>
|
|
200
200
|
```
|
|
201
201
|
|
|
202
202
|
### Step 3 — Run the autonomous workflow
|
|
@@ -229,24 +229,26 @@ orchestra benchmark --task <ID>
|
|
|
229
229
|
```
|
|
230
230
|
|
|
231
231
|
## Active Work
|
|
232
|
-
-
|
|
233
|
-
- Run `orchestra task list --json` and identify
|
|
232
|
+
- At session start, run `orchestra health --json` before implementation or file edits.
|
|
233
|
+
- Run `orchestra task list --json --status pending,blocked,in_progress` and identify resumable work before creating a new task.
|
|
234
234
|
- For the active task, run context, delegation, plan, skills, protocol, and workflow render commands.
|
|
235
|
+
- Run `orchestra validate --pre-run --task <ID> --json` before implementation; resolve missing estimate, workflow run, evidence, or review checks.
|
|
236
|
+
- If a user accepts a smaller/advisory path, record it with `orchestra validate --pre-run --task <ID> --bypass --bypass-rationale "..."`.
|
|
235
237
|
|
|
236
238
|
## Task Loop
|
|
237
239
|
- `orchestra health` - Check local tools and workflow readiness.
|
|
238
240
|
- `orchestra task list` - List local workflow tasks.
|
|
239
|
-
- `orchestra context --task <id>` - Read task context bundle.
|
|
240
241
|
- `orchestra delegation decide --task <id>` - Decide whether to delegate.
|
|
241
|
-
- `orchestra plan --task <id>` - Render role execution plan.
|
|
242
242
|
- `orchestra skills plan --task <id>` - Select task-scoped skills.
|
|
243
|
-
- `orchestra skills render --target <
|
|
243
|
+
- `orchestra skills render --target <generic|claude|cursor|codex|vscode|windsurf>` - Render skills for a runtime.
|
|
244
244
|
- `orchestra protocol render` - Render subagent protocol.
|
|
245
245
|
- `orchestra workflow render --task <id>` - Render workflow templates.
|
|
246
|
-
- `orchestra evidence add --task <id> --role <role> --type <type> --summary <text>` - Record delivery evidence.
|
|
247
|
-
- `orchestra review --task <id> --role <role> --result <approve|block|changes> --findings <text> --recommendation <text>` - Record reviewer outcome.
|
|
248
|
-
- `orchestra gate --gate <id> --task <id>` - Evaluate workflow gate.
|
|
249
246
|
- `orchestra summary` - Summarize workspace state.
|
|
247
|
+
- `orchestra context --task <id>` - Read task context bundle.
|
|
248
|
+
- `orchestra plan --task <id>` - Render role execution plan.
|
|
249
|
+
- `orchestra gate --gate <architecture> --task <id>` - Evaluate workflow gate.
|
|
250
|
+
- `orchestra review --task <id> --role <role> --result <approve|block|changes> --findings <text> --recommendation <text>` - Record reviewer outcome.
|
|
251
|
+
- `orchestra evidence add --task <id> --role <role> --type <command|file|screenshot|trace|video|log|report> --summary <text>` - Record delivery evidence.
|
|
250
252
|
|
|
251
253
|
## Completion
|
|
252
254
|
- Run the project validation gate.
|
package/README.md
CHANGED
|
@@ -10,19 +10,34 @@ published install target.
|
|
|
10
10
|
|
|
11
11
|
## Quick Start
|
|
12
12
|
|
|
13
|
+
### First Visible Value
|
|
14
|
+
|
|
13
15
|
```bash
|
|
14
16
|
npm install -g @jterrats/open-orchestra
|
|
15
17
|
orchestra init
|
|
16
18
|
orchestra health --json
|
|
17
|
-
orchestra task add --id DEMO-001 --title "Ship a governed
|
|
18
|
-
orchestra estimate --task DEMO-001 --sizing s --solo-days 1 --ai-unguided-days 0.5
|
|
19
|
-
orchestra decision add --task DEMO-001 --owner architect --title "Story sizing" --decision "s 2 points" --context "First governed task" --consequences "Developer phase can start"
|
|
19
|
+
orchestra task add --id DEMO-001 --title "Ship a governed README update" --owner developer --paths "README.md"
|
|
20
20
|
orchestra workflow run --task DEMO-001 --gates none
|
|
21
|
-
orchestra
|
|
22
|
-
orchestra review --task DEMO-001 --role qa --result approve --findings "Evidence is present" --recommendation "Ready for release review"
|
|
21
|
+
orchestra status
|
|
23
22
|
orchestra release candidate --dry-run --json
|
|
24
23
|
```
|
|
25
24
|
|
|
25
|
+
Success metric: a first-time user reaches a completed local workflow run and a
|
|
26
|
+
release-candidate preview in under ten minutes, without configuring provider
|
|
27
|
+
credentials or learning every gate type.
|
|
28
|
+
|
|
29
|
+
### Governed Production Path
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
orchestra task add --id STORY-001 --title "Ship a governed change" --owner product_owner --paths "README.md"
|
|
33
|
+
orchestra estimate --task STORY-001 --sizing s --solo-days 1 --ai-unguided-days 0.5 --ai-guided-days 0.25
|
|
34
|
+
orchestra decision add --task STORY-001 --owner architect --title "Story sizing" --decision "s 2 points" --context "Production story" --consequences "Developer phase can start"
|
|
35
|
+
orchestra workflow run --task STORY-001 --gates phase
|
|
36
|
+
orchestra evidence add --task STORY-001 --role developer --type command --summary "Validation passed" --command "npm run precommit" --exit-code 0
|
|
37
|
+
orchestra review --task STORY-001 --role qa --result approve --findings "Acceptance criteria covered" --recommendation "Ready for release review"
|
|
38
|
+
orchestra release check --json
|
|
39
|
+
```
|
|
40
|
+
|
|
26
41
|
Stable installs use `npm install -g @jterrats/open-orchestra@latest`. Beta
|
|
27
42
|
dogfooding uses `npm install -g @jterrats/open-orchestra@beta`, followed by:
|
|
28
43
|
|
|
@@ -41,9 +56,10 @@ orchestra advisory convert --json
|
|
|
41
56
|
When developing Open Orchestra from this repository, use `npm install`,
|
|
42
57
|
`npm run build`, and `node bin/orchestra.js ...` to exercise the local source.
|
|
43
58
|
|
|
44
|
-
The short path is: initialize workflow files, create a task,
|
|
45
|
-
|
|
46
|
-
|
|
59
|
+
The short path is: initialize workflow files, create a task, run the local
|
|
60
|
+
workflow, inspect status, and preview release readiness. The production path adds
|
|
61
|
+
explicit estimates, architecture sizing, human gates, command evidence, QA
|
|
62
|
+
review, and release checks. For a disposable fake-provider walkthrough, see
|
|
47
63
|
[docs/end-to-end-demo.md](docs/end-to-end-demo.md).
|
|
48
64
|
|
|
49
65
|
## Core Product Surface
|
|
@@ -56,9 +72,13 @@ Start with the small command set that supports production delivery:
|
|
|
56
72
|
`orchestra evidence add`, `orchestra review`.
|
|
57
73
|
- Tracker and release: `orchestra github sync --issue <number>`,
|
|
58
74
|
`orchestra release check --json`, `orchestra upgrade --smoke --json`.
|
|
75
|
+
- Workflow tooling: `orchestra workflow phase-plan --task <id>`,
|
|
76
|
+
`orchestra refresh --check --json`, `orchestra cursor canvas status --json`.
|
|
59
77
|
|
|
60
|
-
Use `orchestra
|
|
61
|
-
|
|
78
|
+
Use `orchestra -h` for the human quickstart and `orchestra help commands` for
|
|
79
|
+
the full command catalog. Use `orchestra commands manifest --json` for the
|
|
80
|
+
complete machine-readable reference. See
|
|
81
|
+
[docs/core-command-surface.md](docs/core-command-surface.md) and
|
|
62
82
|
[docs/command-contracts.md](docs/command-contracts.md) for the stable/advanced
|
|
63
83
|
split and automation contract.
|
|
64
84
|
|
|
@@ -73,6 +93,27 @@ management.
|
|
|
73
93
|
For package naming rules, see [docs/package-naming.md](docs/package-naming.md).
|
|
74
94
|
For tracker fallback behavior when `gh` is unavailable, see
|
|
75
95
|
[docs/tracker-adapter-contract.md](docs/tracker-adapter-contract.md).
|
|
96
|
+
For the 1.0.0 documentation path across install, workflow, providers,
|
|
97
|
+
trackers, web console, release operations, troubleshooting, and migration, see
|
|
98
|
+
[docs/adoption-guide.md](docs/adoption-guide.md).
|
|
99
|
+
|
|
100
|
+
## 1.0.0 Workflow Tooling
|
|
101
|
+
|
|
102
|
+
The 1.0.0 workflow surface keeps the CLI as the source of truth while making
|
|
103
|
+
generated files and runtime views easier to audit:
|
|
104
|
+
|
|
105
|
+
- `orchestra workflow phase-plan --task <id> --json` recommends optional UX,
|
|
106
|
+
docs, release, and risk-owner phases from task scope and project signals.
|
|
107
|
+
- Phase playbooks live in `.agent-workflow/playbooks/` and are loaded only for
|
|
108
|
+
the active phase in provider prompts, `workflow render`, runtime briefs, and
|
|
109
|
+
runtime delegation packets.
|
|
110
|
+
- `orchestra refresh --check --json` detects stale generated instruction files;
|
|
111
|
+
`orchestra refresh --dry-run` previews changes; `orchestra refresh --force`
|
|
112
|
+
updates managed blocks without overwriting user-authored content.
|
|
113
|
+
- Provider progress is visible in `workflow run` output and the local web
|
|
114
|
+
console through `/api/workflow/progress`.
|
|
115
|
+
- `orchestra cursor canvas status|sync|clean --json` is a Cursor-specific local
|
|
116
|
+
bridge. It is optional and separate from portable runtime bootstrap files.
|
|
76
117
|
|
|
77
118
|
## Supported Platforms
|
|
78
119
|
|
|
@@ -92,10 +133,33 @@ production release is ready only after the local precommit gate and CI
|
|
|
92
133
|
installed-package dogfood pass on Ubuntu, macOS, and Windows for the current
|
|
93
134
|
HEAD.
|
|
94
135
|
|
|
136
|
+
For the `1.0.0` milestone, `orchestra release check --json` also reports a
|
|
137
|
+
`gaReadiness` go/no-go section. GA blockers include uncovered acceptance
|
|
138
|
+
criteria, blocking reviews, active locks, missing smoke or rollback evidence,
|
|
139
|
+
missing documentation or observability evidence, missing security and package
|
|
140
|
+
provenance evidence, missing public CLI contract evidence, missing migration
|
|
141
|
+
readiness evidence, missing release test matrix evidence, and accepted risks
|
|
142
|
+
without a follow-up or expiry.
|
|
143
|
+
|
|
144
|
+
The release test matrix is available with:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
npm run release:matrix -- --json
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
See [docs/release-test-matrix.md](docs/release-test-matrix.md).
|
|
151
|
+
|
|
95
152
|
## Autonomous Workflow
|
|
96
153
|
|
|
97
154
|
The `workflow run` command executes a full story lifecycle as a governed multi-phase sequence without manual step-by-step commands. Each phase creates a sub-task, generates handoff artifacts, and persists state in an append-only run log.
|
|
98
155
|
|
|
156
|
+
Use `orchestra workflow run` when you want Orchestra to drive the complete
|
|
157
|
+
delivery lifecycle: PM, PO, Architect, Developer, QA, and Release, including
|
|
158
|
+
phase gates and resumable run state. Use `orchestra run` only when you want to
|
|
159
|
+
execute the already computed local task plan; it does not run the full
|
|
160
|
+
multi-phase lifecycle and should not be treated as a replacement for workflow
|
|
161
|
+
gates or release evidence.
|
|
162
|
+
|
|
99
163
|
```
|
|
100
164
|
PM → PO [gate] → Architect [sizing gate] → Developer → QA [gate] → Release
|
|
101
165
|
```
|
|
@@ -161,6 +225,7 @@ orchestra estimate \
|
|
|
161
225
|
--sizing m \
|
|
162
226
|
--solo-days 5 \
|
|
163
227
|
--ai-unguided-days 3 \
|
|
228
|
+
--ai-guided-days 2 \
|
|
164
229
|
--confidence high
|
|
165
230
|
```
|
|
166
231
|
|
|
@@ -180,9 +245,11 @@ Benchmark: FEAT-001 [complete]
|
|
|
180
245
|
Sizing: m
|
|
181
246
|
Solo: 5d (declared)
|
|
182
247
|
AI-unguided: 3d (declared)
|
|
248
|
+
AI-guided: 2d (declared)
|
|
183
249
|
Actual: 1.4d
|
|
184
250
|
vs Solo: -72%
|
|
185
|
-
vs AI:
|
|
251
|
+
vs AI-U: -53%
|
|
252
|
+
vs AI-G: -30%
|
|
186
253
|
QA loops: 1
|
|
187
254
|
Reviews: 3 (0 blocking)
|
|
188
255
|
Evidence: 5 artifacts
|
|
@@ -21,18 +21,23 @@ var endpoints = [
|
|
|
21
21
|
["graph", "/api/graph/plan"],
|
|
22
22
|
["roles", "/api/roles"],
|
|
23
23
|
["evidence", "/api/evidence"],
|
|
24
|
+
["reviews", "/api/reviews"],
|
|
25
|
+
["decisions", "/api/decisions"],
|
|
26
|
+
["providerHealth", "/api/provider/health"],
|
|
24
27
|
["approvals", "/api/approvals"],
|
|
25
28
|
["usage", "/api/usage"],
|
|
26
29
|
["budget", "/api/budget"],
|
|
27
30
|
["tasks", "/api/tasks"],
|
|
28
31
|
["workflowRuns", "/api/workflow/runs"],
|
|
32
|
+
["workflowProgress", "/api/workflow/progress"],
|
|
29
33
|
["evidenceView", "/api/evidence/view"],
|
|
30
34
|
["roleActivation", "/api/roles/activation"],
|
|
31
35
|
["skills", "/api/skills"],
|
|
32
36
|
["sources", "/api/sources"],
|
|
33
37
|
["lessons", "/api/lessons"],
|
|
34
38
|
["workspaceClassification", "/api/workspace/classification"],
|
|
35
|
-
["runtimeAdapters", "/api/runtime/adapters"]
|
|
39
|
+
["runtimeAdapters", "/api/runtime/adapters"],
|
|
40
|
+
["runtimeInvocationPlans", "/api/runtime/invocation-plans"]
|
|
36
41
|
];
|
|
37
42
|
var statePill = document.querySelector("#load-state");
|
|
38
43
|
var lastUpdated = document.querySelector("#last-updated");
|
|
@@ -43,6 +48,10 @@ var validation = document.querySelector("#validation");
|
|
|
43
48
|
var workspaceView = document.querySelector("#workspace-view");
|
|
44
49
|
var graph = document.querySelector("#graph");
|
|
45
50
|
var actions = document.querySelector("#actions");
|
|
51
|
+
var taskBoard = document.querySelector("#task-board");
|
|
52
|
+
var providerHealth = document.querySelector("#provider-health");
|
|
53
|
+
var decisionsList = document.querySelector("#decisions-list");
|
|
54
|
+
var reviewsList = document.querySelector("#reviews-list");
|
|
46
55
|
var taskDetailSelect = document.querySelector("#task-detail-select");
|
|
47
56
|
var taskDetail = document.querySelector("#task-detail");
|
|
48
57
|
var taskOwner = document.querySelector("#task-owner");
|
|
@@ -142,9 +151,17 @@ function render(data) {
|
|
|
142
151
|
renderValidation(data.validation);
|
|
143
152
|
renderAdoptionGuide(data);
|
|
144
153
|
renderReleaseReadiness(data);
|
|
145
|
-
renderWorkspace(
|
|
154
|
+
renderWorkspace(
|
|
155
|
+
data.workspaceClassification,
|
|
156
|
+
data.runtimeAdapters,
|
|
157
|
+
data.runtimeInvocationPlans
|
|
158
|
+
);
|
|
146
159
|
renderGraph(data.graph);
|
|
147
160
|
renderActions(data);
|
|
161
|
+
renderTaskBoard(data.tasks, data.workflowProgress);
|
|
162
|
+
renderProviderHealth(data.providerHealth);
|
|
163
|
+
renderEventList(decisionsList, data.decisions, "No decisions recorded");
|
|
164
|
+
renderEventList(reviewsList, data.reviews, "No reviews recorded");
|
|
148
165
|
renderTaskDetailControls(data.tasks);
|
|
149
166
|
renderTaskWriteControls(data.roles);
|
|
150
167
|
renderCharts(data);
|
|
@@ -153,7 +170,7 @@ function render(data) {
|
|
|
153
170
|
renderRoles(data.roleActivation);
|
|
154
171
|
renderPlanning(data.roleActivation);
|
|
155
172
|
renderWorkflowControls(data.tasks, data.workflowRuns);
|
|
156
|
-
renderWorkflowRuns(data.workflowRuns);
|
|
173
|
+
renderWorkflowRuns(data.workflowRuns, data.workflowProgress);
|
|
157
174
|
renderCost(data.usage, data.budget);
|
|
158
175
|
renderPlaywrightTasks(data.tasks);
|
|
159
176
|
renderSkillControls(data);
|
|
@@ -466,28 +483,40 @@ function renderReleaseReadiness(data) {
|
|
|
466
483
|
}
|
|
467
484
|
function readinessRow(ok, title, detail) {
|
|
468
485
|
const node = listItem(title, detail);
|
|
469
|
-
const
|
|
470
|
-
|
|
471
|
-
|
|
486
|
+
const tag2 = document.createElement("span");
|
|
487
|
+
tag2.className = ok ? "tag ok" : "tag warn";
|
|
488
|
+
tag2.textContent = ok ? "ready" : "attention";
|
|
472
489
|
const row = document.createElement("div");
|
|
473
490
|
row.className = "tag-row";
|
|
474
|
-
row.append(
|
|
491
|
+
row.append(tag2);
|
|
475
492
|
node.append(row);
|
|
476
493
|
return node;
|
|
477
494
|
}
|
|
478
|
-
function renderWorkspace(classification, adapters) {
|
|
495
|
+
function renderWorkspace(classification, adapters, invocationPlans) {
|
|
479
496
|
const adapterNames = adapters.map(function(adapter) {
|
|
480
497
|
return adapter.label;
|
|
481
498
|
});
|
|
499
|
+
const executablePlan = invocationPlans.find(function(plan) {
|
|
500
|
+
return plan.gated.command;
|
|
501
|
+
});
|
|
482
502
|
replace(workspaceView, [
|
|
483
503
|
listItem(
|
|
484
504
|
classification.kind + " workspace",
|
|
485
505
|
classification.recommendedAction
|
|
486
506
|
),
|
|
487
507
|
listItem("Write policy", classification.writePolicy),
|
|
488
|
-
listItem("Runtime targets", adapterNames.join(", "))
|
|
508
|
+
listItem("Runtime targets", adapterNames.join(", ")),
|
|
509
|
+
listItem(
|
|
510
|
+
"Runtime invocation",
|
|
511
|
+
executablePlan ? formatInvocationPlan(executablePlan.gated) : "brief-only"
|
|
512
|
+
)
|
|
489
513
|
]);
|
|
490
514
|
}
|
|
515
|
+
function formatInvocationPlan(plan) {
|
|
516
|
+
const command = [plan.command].concat(plan.args).join(" ");
|
|
517
|
+
const status = plan.canExecute ? "enabled" : "planning only";
|
|
518
|
+
return command + " (" + plan.permissionMode + ", " + status + ")";
|
|
519
|
+
}
|
|
491
520
|
function renderCharts(data) {
|
|
492
521
|
const chartData = buildDashboardChartData(data);
|
|
493
522
|
const hasChartData = chartData.taskStatus.length > 0 || chartData.graphState.length > 0 || chartData.costByProvider.length > 0;
|
|
@@ -581,10 +610,17 @@ function renderWorkflowControls(tasks, runs) {
|
|
|
581
610
|
);
|
|
582
611
|
document.querySelector("#workflow-start").disabled = !workflowTask.value || runningTaskIds.has(workflowTask.value);
|
|
583
612
|
}
|
|
584
|
-
function renderWorkflowRuns(runs) {
|
|
613
|
+
function renderWorkflowRuns(runs, progress) {
|
|
614
|
+
const progressByRun = new Map(
|
|
615
|
+
(progress || []).map(function(item) {
|
|
616
|
+
return [item.runId, item];
|
|
617
|
+
})
|
|
618
|
+
);
|
|
585
619
|
replace(
|
|
586
620
|
workflowRuns,
|
|
587
|
-
runs.length > 0 ? runs.slice(0, 8).map(
|
|
621
|
+
runs.length > 0 ? runs.slice(0, 8).map(function(run) {
|
|
622
|
+
return workflowRunItem(run, progressByRun.get(run.id));
|
|
623
|
+
}) : [
|
|
588
624
|
empty(
|
|
589
625
|
"No workflow runs yet",
|
|
590
626
|
"Start a task workflow to track phases, gates, and handoffs."
|
|
@@ -592,19 +628,24 @@ function renderWorkflowRuns(runs) {
|
|
|
592
628
|
]
|
|
593
629
|
);
|
|
594
630
|
}
|
|
595
|
-
function workflowRunItem(run) {
|
|
631
|
+
function workflowRunItem(run, progress) {
|
|
596
632
|
const phases = (run.phases || []).map(function(phase) {
|
|
597
633
|
return phase.phase + ":" + phase.status;
|
|
598
634
|
}).join(" -> ");
|
|
599
|
-
const
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
);
|
|
635
|
+
const activeProgress = [...run.phases || []].reverse().find(function(phase) {
|
|
636
|
+
return phase.providerProgress && phase.providerProgress.status === "running";
|
|
637
|
+
})?.providerProgress;
|
|
638
|
+
const progressText = activeProgress ? " - provider " + activeProgress.provider + "/" + activeProgress.model + " elapsed " + formatWorkflowElapsed(activeProgress) : "";
|
|
639
|
+
const progressDetail = progress ? workflowProgressDetail(progress) : run.taskId + " - gates " + run.gates + (phases ? " - " + phases : "") + progressText;
|
|
640
|
+
const node = listItem(run.id + " [" + run.status + "]", progressDetail);
|
|
603
641
|
const pausedGate = [...run.phases || []].reverse().find(function(phase) {
|
|
604
642
|
return phase.status === "gate_paused";
|
|
605
643
|
});
|
|
606
644
|
const row = document.createElement("div");
|
|
607
645
|
row.className = "tag-row";
|
|
646
|
+
workflowProgressTags(run, progress).forEach(function(item) {
|
|
647
|
+
row.append(item);
|
|
648
|
+
});
|
|
608
649
|
if (pausedGate) {
|
|
609
650
|
const approve = document.createElement("button");
|
|
610
651
|
approve.className = "text-button";
|
|
@@ -626,9 +667,61 @@ function workflowRunItem(run) {
|
|
|
626
667
|
resume.textContent = "Resume";
|
|
627
668
|
row.append(resume);
|
|
628
669
|
}
|
|
670
|
+
if (run.status === "running" || run.status === "paused") {
|
|
671
|
+
const cancel = document.createElement("button");
|
|
672
|
+
cancel.className = "text-button secondary";
|
|
673
|
+
cancel.type = "button";
|
|
674
|
+
cancel.dataset.workflowAction = "cancel";
|
|
675
|
+
cancel.dataset.run = run.id;
|
|
676
|
+
cancel.textContent = "Cancel";
|
|
677
|
+
row.append(cancel);
|
|
678
|
+
}
|
|
629
679
|
node.append(row);
|
|
630
680
|
return node;
|
|
631
681
|
}
|
|
682
|
+
function workflowProgressDetail(progress) {
|
|
683
|
+
const phase = progress.currentPhase ? progress.currentPhase + " (" + progress.currentRole + ")" : "No active phase";
|
|
684
|
+
const provider = progress.provider && progress.model ? " - provider " + progress.provider + "/" + progress.model : "";
|
|
685
|
+
const fallback = progress.fallbackState ? " - fallback " + progress.fallbackState : "";
|
|
686
|
+
const failure = progress.failureReason ? " - failure " + progress.failureReason : "";
|
|
687
|
+
return progress.taskId + " - gates " + progress.gates + " - " + progress.latestStatus + " - phase " + phase + " - " + progress.completedPhases + "/" + progress.totalPhases + " done - elapsed " + formatDuration(progress.elapsedMs) + provider + fallback + failure;
|
|
688
|
+
}
|
|
689
|
+
function workflowProgressTags(run, progress) {
|
|
690
|
+
if (!progress) {
|
|
691
|
+
return [tag(run.status, run.status === "failed" ? "warn" : "")];
|
|
692
|
+
}
|
|
693
|
+
const tags = [
|
|
694
|
+
tag(progress.status, progress.status === "failed" ? "warn" : "ok")
|
|
695
|
+
];
|
|
696
|
+
if (progress.canApproveGate) {
|
|
697
|
+
tags.push(tag("gate paused", "warn"));
|
|
698
|
+
}
|
|
699
|
+
if (progress.canResume) {
|
|
700
|
+
tags.push(tag("resumable", "warn"));
|
|
701
|
+
}
|
|
702
|
+
if (progress.provider) {
|
|
703
|
+
tags.push(tag(progress.provider + "/" + progress.model, ""));
|
|
704
|
+
}
|
|
705
|
+
return tags;
|
|
706
|
+
}
|
|
707
|
+
function tag(text, tone) {
|
|
708
|
+
const node = document.createElement("span");
|
|
709
|
+
node.className = ["tag", tone].filter(Boolean).join(" ");
|
|
710
|
+
node.textContent = text;
|
|
711
|
+
return node;
|
|
712
|
+
}
|
|
713
|
+
function formatWorkflowElapsed(progress) {
|
|
714
|
+
const startedAt = Date.parse(progress.startedAt);
|
|
715
|
+
const elapsed = Number.isFinite(startedAt) ? Date.now() - startedAt : progress.elapsedMs || 0;
|
|
716
|
+
return formatDuration(elapsed);
|
|
717
|
+
}
|
|
718
|
+
function formatDuration(elapsed) {
|
|
719
|
+
if (elapsed < 1e3) return elapsed + "ms";
|
|
720
|
+
if (elapsed < 6e4) return (elapsed / 1e3).toFixed(1) + "s";
|
|
721
|
+
const minutes = Math.floor(elapsed / 6e4);
|
|
722
|
+
const seconds = Math.floor(elapsed % 6e4 / 1e3);
|
|
723
|
+
return minutes + "m" + String(seconds).padStart(2, "0") + "s";
|
|
724
|
+
}
|
|
632
725
|
async function startWorkflowFromWeb() {
|
|
633
726
|
if (!workflowTask.value) {
|
|
634
727
|
setLoading("Select a task to start workflow", "warn");
|
|
@@ -659,6 +752,10 @@ async function handleWorkflowAction(event) {
|
|
|
659
752
|
}
|
|
660
753
|
if (button.dataset.workflowAction === "resume") {
|
|
661
754
|
await resumeWorkflowFromWeb(button);
|
|
755
|
+
return;
|
|
756
|
+
}
|
|
757
|
+
if (button.dataset.workflowAction === "cancel") {
|
|
758
|
+
await cancelWorkflowFromWeb(button);
|
|
662
759
|
}
|
|
663
760
|
}
|
|
664
761
|
async function approveWorkflowGateFromWeb(button) {
|
|
@@ -693,6 +790,21 @@ async function resumeWorkflowFromWeb(button) {
|
|
|
693
790
|
}
|
|
694
791
|
await loadDashboard();
|
|
695
792
|
}
|
|
793
|
+
async function cancelWorkflowFromWeb(button) {
|
|
794
|
+
const response = await fetch("/api/workflow/cancel", {
|
|
795
|
+
method: "POST",
|
|
796
|
+
headers: { "content-type": "application/json" },
|
|
797
|
+
body: JSON.stringify({
|
|
798
|
+
run: button.dataset.run,
|
|
799
|
+
reason: "Canceled from web console"
|
|
800
|
+
})
|
|
801
|
+
});
|
|
802
|
+
if (!response.ok) {
|
|
803
|
+
setLoading("Workflow cancel failed", "warn");
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
await loadDashboard();
|
|
807
|
+
}
|
|
696
808
|
function renderCost(usage, budget) {
|
|
697
809
|
const rows = [
|
|
698
810
|
listItem("Requests", String(usage.totals.requests)),
|
|
@@ -808,10 +920,10 @@ function renderRoles(report) {
|
|
|
808
920
|
["activationCriteria", "expectedEvidence", "gateParticipation"].forEach(
|
|
809
921
|
function(field) {
|
|
810
922
|
(entry.role[field] || []).slice(0, 3).forEach(function(value) {
|
|
811
|
-
const
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
tags.append(
|
|
923
|
+
const tag2 = document.createElement("span");
|
|
924
|
+
tag2.className = "tag";
|
|
925
|
+
tag2.textContent = value;
|
|
926
|
+
tags.append(tag2);
|
|
815
927
|
});
|
|
816
928
|
}
|
|
817
929
|
);
|
|
@@ -859,10 +971,10 @@ function renderSkillCatalog(skills, sources) {
|
|
|
859
971
|
const tags = document.createElement("div");
|
|
860
972
|
tags.className = "tag-row";
|
|
861
973
|
skill.sourceGroups.slice(0, 4).forEach(function(group) {
|
|
862
|
-
const
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
tags.append(
|
|
974
|
+
const tag2 = document.createElement("span");
|
|
975
|
+
tag2.className = "tag";
|
|
976
|
+
tag2.textContent = sourceMap.get(group) || group;
|
|
977
|
+
tags.append(tag2);
|
|
866
978
|
});
|
|
867
979
|
node.append(tags);
|
|
868
980
|
return node;
|
|
@@ -900,10 +1012,10 @@ async function loadSkillPlan() {
|
|
|
900
1012
|
const tags = document.createElement("div");
|
|
901
1013
|
tags.className = "tag-row";
|
|
902
1014
|
item.skill.sourceGroups.slice(0, 4).forEach(function(group) {
|
|
903
|
-
const
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
tags.append(
|
|
1015
|
+
const tag2 = document.createElement("span");
|
|
1016
|
+
tag2.className = "tag";
|
|
1017
|
+
tag2.textContent = group;
|
|
1018
|
+
tags.append(tag2);
|
|
907
1019
|
});
|
|
908
1020
|
node.append(tags);
|
|
909
1021
|
return node;
|
|
@@ -944,10 +1056,10 @@ function renderSourceCatalog(sources) {
|
|
|
944
1056
|
const tags = document.createElement("div");
|
|
945
1057
|
tags.className = "tag-row";
|
|
946
1058
|
source.locations.forEach(function(location) {
|
|
947
|
-
const
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
tags.append(
|
|
1059
|
+
const tag2 = document.createElement("span");
|
|
1060
|
+
tag2.className = "tag";
|
|
1061
|
+
tag2.textContent = location;
|
|
1062
|
+
tags.append(tag2);
|
|
951
1063
|
});
|
|
952
1064
|
node.append(tags);
|
|
953
1065
|
return node;
|
|
@@ -971,10 +1083,10 @@ function renderLessons(lessons) {
|
|
|
971
1083
|
tags.className = "tag-row";
|
|
972
1084
|
const appliesTo = Array.isArray(lesson.appliesTo) ? lesson.appliesTo : [];
|
|
973
1085
|
appliesTo.slice(0, 4).forEach(function(tool) {
|
|
974
|
-
const
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
tags.append(
|
|
1086
|
+
const tag2 = document.createElement("span");
|
|
1087
|
+
tag2.className = "tag";
|
|
1088
|
+
tag2.textContent = tool;
|
|
1089
|
+
tags.append(tag2);
|
|
978
1090
|
});
|
|
979
1091
|
node.append(tags);
|
|
980
1092
|
return node;
|
|
@@ -1214,6 +1326,61 @@ function renderActions(data) {
|
|
|
1214
1326
|
]
|
|
1215
1327
|
);
|
|
1216
1328
|
}
|
|
1329
|
+
function renderTaskBoard(tasks, progressItems) {
|
|
1330
|
+
const progressByTask = new Map(
|
|
1331
|
+
(progressItems || []).map(function(item) {
|
|
1332
|
+
return [item.taskId, item];
|
|
1333
|
+
})
|
|
1334
|
+
);
|
|
1335
|
+
replace(
|
|
1336
|
+
taskBoard,
|
|
1337
|
+
tasks.length > 0 ? tasks.map(function(task) {
|
|
1338
|
+
const progress = progressByTask.get(task.id);
|
|
1339
|
+
const detail = [
|
|
1340
|
+
task.status,
|
|
1341
|
+
"owner " + task.ownerRole,
|
|
1342
|
+
task.backlogItem ? "issue " + task.backlogItem : "no issue",
|
|
1343
|
+
(task.paths || []).length > 0 ? "paths " + task.paths.slice(0, 3).join(", ") : "no paths",
|
|
1344
|
+
progress?.currentPhase ? "phase " + progress.currentPhase : ""
|
|
1345
|
+
].filter(Boolean).join(" - ");
|
|
1346
|
+
return listItem(task.id + " - " + task.title, detail);
|
|
1347
|
+
}) : [empty("No tasks", "Create a task to populate the board.")]
|
|
1348
|
+
);
|
|
1349
|
+
}
|
|
1350
|
+
function renderProviderHealth(providers) {
|
|
1351
|
+
replace(
|
|
1352
|
+
providerHealth,
|
|
1353
|
+
providers.length > 0 ? providers.map(function(provider) {
|
|
1354
|
+
const node = listItem(
|
|
1355
|
+
provider.scope + " " + provider.provider + "/" + provider.model,
|
|
1356
|
+
provider.detail + " - timeout " + provider.timeoutMs + "ms - fallbacks " + (provider.fallbacks.length > 0 ? provider.fallbacks.join(", ") : "none")
|
|
1357
|
+
);
|
|
1358
|
+
const row = document.createElement("div");
|
|
1359
|
+
row.className = "tag-row";
|
|
1360
|
+
row.append(
|
|
1361
|
+
tag(provider.status, provider.status === "pass" ? "ok" : "warn")
|
|
1362
|
+
);
|
|
1363
|
+
node.append(row);
|
|
1364
|
+
return node;
|
|
1365
|
+
}) : [
|
|
1366
|
+
empty(
|
|
1367
|
+
"No provider routing",
|
|
1368
|
+
"Configure model providers to see health."
|
|
1369
|
+
)
|
|
1370
|
+
]
|
|
1371
|
+
);
|
|
1372
|
+
}
|
|
1373
|
+
function renderEventList(target, events, emptyText) {
|
|
1374
|
+
replace(
|
|
1375
|
+
target,
|
|
1376
|
+
events.length > 0 ? events.slice(0, 8).map(function(event) {
|
|
1377
|
+
return listItem(
|
|
1378
|
+
event.taskId ? event.taskId + " - " + event.summary : event.summary,
|
|
1379
|
+
event.actor + " - " + new Date(event.timestamp).toLocaleString()
|
|
1380
|
+
);
|
|
1381
|
+
}) : [empty(emptyText, "No matching workflow events were found.")]
|
|
1382
|
+
);
|
|
1383
|
+
}
|
|
1217
1384
|
function metric(value, label) {
|
|
1218
1385
|
const node = document.createElement("div");
|
|
1219
1386
|
node.className = "metric";
|