@jterrats/open-orchestra 0.5.7 → 1.0.2
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 +169 -32
- 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-store.js +3 -3
- package/dist/autonomous-run-store.js.map +1 -1
- package/dist/benchmark.d.ts +4 -1
- package/dist/benchmark.js +93 -4
- package/dist/benchmark.js.map +1 -1
- package/dist/cli.js +73 -2
- package/dist/cli.js.map +1 -1
- package/dist/collaboration-flows.js +3 -5
- 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 +213 -10
- package/dist/command-manifest.js.map +1 -1
- package/dist/commands.d.ts +10 -5
- package/dist/commands.js +16 -6
- 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 +2 -0
- package/dist/constants.js +23 -0
- package/dist/constants.js.map +1 -1
- 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/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/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/memory.js +18 -8
- package/dist/memory.js.map +1 -1
- 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 +101 -3
- package/dist/model-commands.js.map +1 -1
- package/dist/model-providers.js +13 -1
- package/dist/model-providers.js.map +1 -1
- package/dist/package-update-check.d.ts +18 -0
- package/dist/package-update-check.js +20 -0
- package/dist/package-update-check.js.map +1 -1
- package/dist/phase-executor.d.ts +1 -0
- package/dist/phase-executor.js +118 -14
- package/dist/phase-executor.js.map +1 -1
- package/dist/phase-playbooks.d.ts +15 -0
- package/dist/phase-playbooks.js +82 -0
- package/dist/phase-playbooks.js.map +1 -1
- package/dist/planning-commands.d.ts +1 -0
- package/dist/planning-commands.js +24 -1
- package/dist/planning-commands.js.map +1 -1
- 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 +25 -1
- package/dist/prompt-registry-update.js.map +1 -1
- package/dist/prompt-registry-validation.js +39 -2
- package/dist/prompt-registry-validation.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 +198 -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 +10 -1
- package/dist/refresh-generated.js +83 -6
- package/dist/refresh-generated.js.map +1 -1
- 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 +202 -12
- package/dist/release-commands.js.map +1 -1
- package/dist/release-readiness.d.ts +36 -1
- package/dist/release-readiness.js +217 -6
- package/dist/release-readiness.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 +77 -0
- package/dist/runtime-commands.js.map +1 -1
- package/dist/runtime-execution-renderer.d.ts +3 -2
- package/dist/runtime-execution-renderer.js +19 -1
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.d.ts +2 -1
- package/dist/runtime-execution.js +71 -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 +63 -0
- package/dist/skills-catalog.js.map +1 -1
- package/dist/skills-commands.d.ts +4 -0
- package/dist/skills-commands.js +55 -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 +2 -4
- 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 +5 -3
- package/dist/task-graph-commands.js.map +1 -1
- 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 +24 -0
- package/dist/types/model-config.d.ts +39 -0
- package/dist/types/runtime.d.ts +56 -0
- package/dist/types/skills.d.ts +2 -0
- package/dist/types/tasks.d.ts +6 -0
- package/dist/types/workflow-run.d.ts +17 -0
- package/dist/types.d.ts +4 -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 +101 -1
- 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-BNESIVvk.js +11 -0
- package/dist/web-console/assets/index-jxCY5eEc.css +1 -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 +72 -0
- package/dist/workflow-approval-service.js.map +1 -1
- package/dist/workflow-evidence-service.js +8 -1
- package/dist/workflow-evidence-service.js.map +1 -1
- package/dist/workflow-gates.d.ts +2 -0
- package/dist/workflow-gates.js +221 -0
- package/dist/workflow-gates.js.map +1 -1
- package/dist/workflow-run-commands.js +13 -1
- package/dist/workflow-run-commands.js.map +1 -1
- package/dist/workflow-services.d.ts +16 -12
- package/dist/workflow-services.js +313 -253
- 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/workspace-validator.js +109 -3
- package/dist/workspace-validator.js.map +1 -1
- package/dist/workspace.js +8 -2
- package/dist/workspace.js.map +1 -1
- package/docs/adoption-guide.md +147 -0
- package/docs/autonomous-workflow.md +118 -27
- package/docs/benchmark.md +15 -7
- package/docs/command-contracts.md +18 -1
- package/docs/core-command-surface.md +59 -13
- package/docs/end-to-end-demo.md +1 -0
- package/docs/extension-contracts.md +83 -0
- package/docs/orchestra-mvp.md +83 -3
- package/docs/persona-workflows.md +32 -0
- package/docs/release-test-matrix.md +42 -0
- package/docs/runtime-adapters.md +92 -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 +16 -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 +68 -0
- package/rules/devops-tooling.mdc +1 -0
- package/rules/dry-clean-code.mdc +1 -0
- package/rules/performance-reliability.mdc +1 -0
- package/rules/testing-discipline.mdc +4 -1
- package/skills/collection-standards/SKILL.md +63 -0
- package/skills/collection-standards/manifest.json +69 -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,11 +21,15 @@ 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"],
|
|
@@ -44,6 +48,10 @@ var validation = document.querySelector("#validation");
|
|
|
44
48
|
var workspaceView = document.querySelector("#workspace-view");
|
|
45
49
|
var graph = document.querySelector("#graph");
|
|
46
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");
|
|
47
55
|
var taskDetailSelect = document.querySelector("#task-detail-select");
|
|
48
56
|
var taskDetail = document.querySelector("#task-detail");
|
|
49
57
|
var taskOwner = document.querySelector("#task-owner");
|
|
@@ -150,6 +158,10 @@ function render(data) {
|
|
|
150
158
|
);
|
|
151
159
|
renderGraph(data.graph);
|
|
152
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");
|
|
153
165
|
renderTaskDetailControls(data.tasks);
|
|
154
166
|
renderTaskWriteControls(data.roles);
|
|
155
167
|
renderCharts(data);
|
|
@@ -158,7 +170,7 @@ function render(data) {
|
|
|
158
170
|
renderRoles(data.roleActivation);
|
|
159
171
|
renderPlanning(data.roleActivation);
|
|
160
172
|
renderWorkflowControls(data.tasks, data.workflowRuns);
|
|
161
|
-
renderWorkflowRuns(data.workflowRuns);
|
|
173
|
+
renderWorkflowRuns(data.workflowRuns, data.workflowProgress);
|
|
162
174
|
renderCost(data.usage, data.budget);
|
|
163
175
|
renderPlaywrightTasks(data.tasks);
|
|
164
176
|
renderSkillControls(data);
|
|
@@ -471,12 +483,12 @@ function renderReleaseReadiness(data) {
|
|
|
471
483
|
}
|
|
472
484
|
function readinessRow(ok, title, detail) {
|
|
473
485
|
const node = listItem(title, detail);
|
|
474
|
-
const
|
|
475
|
-
|
|
476
|
-
|
|
486
|
+
const tag2 = document.createElement("span");
|
|
487
|
+
tag2.className = ok ? "tag ok" : "tag warn";
|
|
488
|
+
tag2.textContent = ok ? "ready" : "attention";
|
|
477
489
|
const row = document.createElement("div");
|
|
478
490
|
row.className = "tag-row";
|
|
479
|
-
row.append(
|
|
491
|
+
row.append(tag2);
|
|
480
492
|
node.append(row);
|
|
481
493
|
return node;
|
|
482
494
|
}
|
|
@@ -598,10 +610,17 @@ function renderWorkflowControls(tasks, runs) {
|
|
|
598
610
|
);
|
|
599
611
|
document.querySelector("#workflow-start").disabled = !workflowTask.value || runningTaskIds.has(workflowTask.value);
|
|
600
612
|
}
|
|
601
|
-
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
|
+
);
|
|
602
619
|
replace(
|
|
603
620
|
workflowRuns,
|
|
604
|
-
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
|
+
}) : [
|
|
605
624
|
empty(
|
|
606
625
|
"No workflow runs yet",
|
|
607
626
|
"Start a task workflow to track phases, gates, and handoffs."
|
|
@@ -609,7 +628,7 @@ function renderWorkflowRuns(runs) {
|
|
|
609
628
|
]
|
|
610
629
|
);
|
|
611
630
|
}
|
|
612
|
-
function workflowRunItem(run) {
|
|
631
|
+
function workflowRunItem(run, progress) {
|
|
613
632
|
const phases = (run.phases || []).map(function(phase) {
|
|
614
633
|
return phase.phase + ":" + phase.status;
|
|
615
634
|
}).join(" -> ");
|
|
@@ -617,15 +636,16 @@ function workflowRunItem(run) {
|
|
|
617
636
|
return phase.providerProgress && phase.providerProgress.status === "running";
|
|
618
637
|
})?.providerProgress;
|
|
619
638
|
const progressText = activeProgress ? " - provider " + activeProgress.provider + "/" + activeProgress.model + " elapsed " + formatWorkflowElapsed(activeProgress) : "";
|
|
620
|
-
const
|
|
621
|
-
|
|
622
|
-
run.taskId + " - gates " + run.gates + (phases ? " - " + phases : "") + progressText
|
|
623
|
-
);
|
|
639
|
+
const progressDetail = progress ? workflowProgressDetail(progress) : run.taskId + " - gates " + run.gates + (phases ? " - " + phases : "") + progressText;
|
|
640
|
+
const node = listItem(run.id + " [" + run.status + "]", progressDetail);
|
|
624
641
|
const pausedGate = [...run.phases || []].reverse().find(function(phase) {
|
|
625
642
|
return phase.status === "gate_paused";
|
|
626
643
|
});
|
|
627
644
|
const row = document.createElement("div");
|
|
628
645
|
row.className = "tag-row";
|
|
646
|
+
workflowProgressTags(run, progress).forEach(function(item) {
|
|
647
|
+
row.append(item);
|
|
648
|
+
});
|
|
629
649
|
if (pausedGate) {
|
|
630
650
|
const approve = document.createElement("button");
|
|
631
651
|
approve.className = "text-button";
|
|
@@ -647,12 +667,55 @@ function workflowRunItem(run) {
|
|
|
647
667
|
resume.textContent = "Resume";
|
|
648
668
|
row.append(resume);
|
|
649
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
|
+
}
|
|
650
679
|
node.append(row);
|
|
651
680
|
return node;
|
|
652
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
|
+
}
|
|
653
713
|
function formatWorkflowElapsed(progress) {
|
|
654
714
|
const startedAt = Date.parse(progress.startedAt);
|
|
655
715
|
const elapsed = Number.isFinite(startedAt) ? Date.now() - startedAt : progress.elapsedMs || 0;
|
|
716
|
+
return formatDuration(elapsed);
|
|
717
|
+
}
|
|
718
|
+
function formatDuration(elapsed) {
|
|
656
719
|
if (elapsed < 1e3) return elapsed + "ms";
|
|
657
720
|
if (elapsed < 6e4) return (elapsed / 1e3).toFixed(1) + "s";
|
|
658
721
|
const minutes = Math.floor(elapsed / 6e4);
|
|
@@ -689,6 +752,10 @@ async function handleWorkflowAction(event) {
|
|
|
689
752
|
}
|
|
690
753
|
if (button.dataset.workflowAction === "resume") {
|
|
691
754
|
await resumeWorkflowFromWeb(button);
|
|
755
|
+
return;
|
|
756
|
+
}
|
|
757
|
+
if (button.dataset.workflowAction === "cancel") {
|
|
758
|
+
await cancelWorkflowFromWeb(button);
|
|
692
759
|
}
|
|
693
760
|
}
|
|
694
761
|
async function approveWorkflowGateFromWeb(button) {
|
|
@@ -723,6 +790,21 @@ async function resumeWorkflowFromWeb(button) {
|
|
|
723
790
|
}
|
|
724
791
|
await loadDashboard();
|
|
725
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
|
+
}
|
|
726
808
|
function renderCost(usage, budget) {
|
|
727
809
|
const rows = [
|
|
728
810
|
listItem("Requests", String(usage.totals.requests)),
|
|
@@ -838,10 +920,10 @@ function renderRoles(report) {
|
|
|
838
920
|
["activationCriteria", "expectedEvidence", "gateParticipation"].forEach(
|
|
839
921
|
function(field) {
|
|
840
922
|
(entry.role[field] || []).slice(0, 3).forEach(function(value) {
|
|
841
|
-
const
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
tags.append(
|
|
923
|
+
const tag2 = document.createElement("span");
|
|
924
|
+
tag2.className = "tag";
|
|
925
|
+
tag2.textContent = value;
|
|
926
|
+
tags.append(tag2);
|
|
845
927
|
});
|
|
846
928
|
}
|
|
847
929
|
);
|
|
@@ -889,10 +971,10 @@ function renderSkillCatalog(skills, sources) {
|
|
|
889
971
|
const tags = document.createElement("div");
|
|
890
972
|
tags.className = "tag-row";
|
|
891
973
|
skill.sourceGroups.slice(0, 4).forEach(function(group) {
|
|
892
|
-
const
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
tags.append(
|
|
974
|
+
const tag2 = document.createElement("span");
|
|
975
|
+
tag2.className = "tag";
|
|
976
|
+
tag2.textContent = sourceMap.get(group) || group;
|
|
977
|
+
tags.append(tag2);
|
|
896
978
|
});
|
|
897
979
|
node.append(tags);
|
|
898
980
|
return node;
|
|
@@ -930,10 +1012,10 @@ async function loadSkillPlan() {
|
|
|
930
1012
|
const tags = document.createElement("div");
|
|
931
1013
|
tags.className = "tag-row";
|
|
932
1014
|
item.skill.sourceGroups.slice(0, 4).forEach(function(group) {
|
|
933
|
-
const
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
tags.append(
|
|
1015
|
+
const tag2 = document.createElement("span");
|
|
1016
|
+
tag2.className = "tag";
|
|
1017
|
+
tag2.textContent = group;
|
|
1018
|
+
tags.append(tag2);
|
|
937
1019
|
});
|
|
938
1020
|
node.append(tags);
|
|
939
1021
|
return node;
|
|
@@ -974,10 +1056,10 @@ function renderSourceCatalog(sources) {
|
|
|
974
1056
|
const tags = document.createElement("div");
|
|
975
1057
|
tags.className = "tag-row";
|
|
976
1058
|
source.locations.forEach(function(location) {
|
|
977
|
-
const
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
tags.append(
|
|
1059
|
+
const tag2 = document.createElement("span");
|
|
1060
|
+
tag2.className = "tag";
|
|
1061
|
+
tag2.textContent = location;
|
|
1062
|
+
tags.append(tag2);
|
|
981
1063
|
});
|
|
982
1064
|
node.append(tags);
|
|
983
1065
|
return node;
|
|
@@ -1001,10 +1083,10 @@ function renderLessons(lessons) {
|
|
|
1001
1083
|
tags.className = "tag-row";
|
|
1002
1084
|
const appliesTo = Array.isArray(lesson.appliesTo) ? lesson.appliesTo : [];
|
|
1003
1085
|
appliesTo.slice(0, 4).forEach(function(tool) {
|
|
1004
|
-
const
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
tags.append(
|
|
1086
|
+
const tag2 = document.createElement("span");
|
|
1087
|
+
tag2.className = "tag";
|
|
1088
|
+
tag2.textContent = tool;
|
|
1089
|
+
tags.append(tag2);
|
|
1008
1090
|
});
|
|
1009
1091
|
node.append(tags);
|
|
1010
1092
|
return node;
|
|
@@ -1244,6 +1326,61 @@ function renderActions(data) {
|
|
|
1244
1326
|
]
|
|
1245
1327
|
);
|
|
1246
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
|
+
}
|
|
1247
1384
|
function metric(value, label) {
|
|
1248
1385
|
const node = document.createElement("div");
|
|
1249
1386
|
node.className = "metric";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { EvidenceInput } from "./types.js";
|
|
2
|
+
export type AutomationSurface = "web" | "api" | "cli" | "integration";
|
|
3
|
+
export interface AutomationEvidenceInput {
|
|
4
|
+
surface?: AutomationSurface;
|
|
5
|
+
assertions?: string;
|
|
6
|
+
externalValidation?: string;
|
|
7
|
+
deferredOwner?: string;
|
|
8
|
+
deferredRationale?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AutomationEvidenceQuality {
|
|
11
|
+
automated: boolean;
|
|
12
|
+
surface?: AutomationSurface;
|
|
13
|
+
assertions?: string;
|
|
14
|
+
externalValidation?: string;
|
|
15
|
+
deferredOwner?: string;
|
|
16
|
+
deferredRationale?: string;
|
|
17
|
+
observableOutcome: boolean;
|
|
18
|
+
deferredExternalValidation: boolean;
|
|
19
|
+
gaps: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function evaluateAutomationEvidence(input: EvidenceInput): AutomationEvidenceQuality;
|
|
22
|
+
export declare function assertAutomationEvidenceQuality(input: EvidenceInput): void;
|
|
23
|
+
export declare function automationEvidenceLines(quality: AutomationEvidenceQuality): string[];
|