@entelligentsia/forgecli 0.19.0 → 0.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +90 -0
- package/dist/bin/config.js +9 -9
- package/dist/bin/config.js.map +1 -1
- package/dist/bin/forge.js +3 -3
- package/dist/bin/forge.js.map +1 -1
- package/dist/bin/update-cli.js +2 -1
- package/dist/bin/update-cli.js.map +1 -1
- package/dist/extensions/forgecli/add-pipeline.js.map +1 -1
- package/dist/extensions/forgecli/add-task.js.map +1 -1
- package/dist/extensions/forgecli/approve.d.ts +2 -2
- package/dist/extensions/forgecli/approve.js +2 -2
- package/dist/extensions/forgecli/approve.js.map +1 -1
- package/dist/extensions/forgecli/ask-user-tool.js.map +1 -1
- package/dist/extensions/forgecli/audience-gate.js.map +1 -1
- package/dist/extensions/forgecli/calibrate.d.ts +1 -1
- package/dist/extensions/forgecli/calibrate.js +8 -10
- package/dist/extensions/forgecli/calibrate.js.map +1 -1
- package/dist/extensions/forgecli/collate.d.ts +2 -2
- package/dist/extensions/forgecli/collate.js +2 -2
- package/dist/extensions/forgecli/collate.js.map +1 -1
- package/dist/extensions/forgecli/commit.d.ts +2 -2
- package/dist/extensions/forgecli/commit.js +2 -2
- package/dist/extensions/forgecli/commit.js.map +1 -1
- package/dist/extensions/forgecli/config-command.js.map +1 -1
- package/dist/extensions/forgecli/config-layer.js +4 -2
- package/dist/extensions/forgecli/config-layer.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/component.d.ts +1 -1
- package/dist/extensions/forgecli/config-tui/component.js +25 -21
- package/dist/extensions/forgecli/config-tui/component.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/handler.js +2 -6
- package/dist/extensions/forgecli/config-tui/handler.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/keys.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/plugin-config-reader.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/advanced-menu.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/advanced-menu.js +10 -8
- package/dist/extensions/forgecli/config-tui/screens/advanced-menu.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/confirm-quit.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/confirm-quit.js +2 -5
- package/dist/extensions/forgecli/config-tui/screens/confirm-quit.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/override-editor.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/override-editor.js +15 -11
- package/dist/extensions/forgecli/config-tui/screens/override-editor.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js +15 -11
- package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/overrides-list.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/overrides-list.js +7 -4
- package/dist/extensions/forgecli/config-tui/screens/overrides-list.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/persona-editor.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/persona-editor.js +6 -12
- package/dist/extensions/forgecli/config-tui/screens/persona-editor.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/persona-picker.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/persona-picker.js +3 -6
- package/dist/extensions/forgecli/config-tui/screens/persona-picker.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/personas-list.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/personas-list.js +2 -2
- package/dist/extensions/forgecli/config-tui/screens/personas-list.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/shared.d.ts +1 -1
- package/dist/extensions/forgecli/config-tui/screens/shared.js +4 -5
- package/dist/extensions/forgecli/config-tui/screens/shared.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/show-resolved.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/show-resolved.js +9 -11
- package/dist/extensions/forgecli/config-tui/screens/show-resolved.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/tier-menu.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/tier-menu.js +2 -2
- package/dist/extensions/forgecli/config-tui/screens/tier-menu.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/tier-picker.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/screens/tier-picker.js +12 -3
- package/dist/extensions/forgecli/config-tui/screens/tier-picker.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/types.d.ts +1 -1
- package/dist/extensions/forgecli/config-tui/screens.d.ts +10 -10
- package/dist/extensions/forgecli/config-tui/screens.js +16 -16
- package/dist/extensions/forgecli/config-tui/screens.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state/buffer.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/state/buffer.js +1 -2
- package/dist/extensions/forgecli/config-tui/state/buffer.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state/constants.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state/index.d.ts +3 -3
- package/dist/extensions/forgecli/config-tui/state/index.js +2 -2
- package/dist/extensions/forgecli/config-tui/state/index.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state/init.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state/reducer.js +2 -4
- package/dist/extensions/forgecli/config-tui/state/reducer.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state/selectors.d.ts +1 -1
- package/dist/extensions/forgecli/config-tui/state/selectors.js +7 -6
- package/dist/extensions/forgecli/config-tui/state/selectors.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state.d.ts +3 -3
- package/dist/extensions/forgecli/config-tui/state.js +2 -2
- package/dist/extensions/forgecli/config-tui/state.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/theme.js +1 -1
- package/dist/extensions/forgecli/config-tui/theme.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/tier-meta.js.map +1 -1
- package/dist/extensions/forgecli/config-writer.js +4 -2
- package/dist/extensions/forgecli/config-writer.js.map +1 -1
- package/dist/extensions/forgecli/enhance.d.ts +2 -2
- package/dist/extensions/forgecli/enhance.js +3 -3
- package/dist/extensions/forgecli/enhance.js.map +1 -1
- package/dist/extensions/forgecli/fix-bug.d.ts +1 -1
- package/dist/extensions/forgecli/fix-bug.js +148 -58
- package/dist/extensions/forgecli/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/forge-artifact-tool.d.ts +8 -1
- package/dist/extensions/forgecli/forge-artifact-tool.js +85 -15
- package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-header.d.ts +1 -1
- package/dist/extensions/forgecli/forge-header.js +1 -1
- package/dist/extensions/forgecli/forge-header.js.map +1 -1
- package/dist/extensions/forgecli/forge-init/phase-descriptors.js +14 -5
- package/dist/extensions/forgecli/forge-init/phase-descriptors.js.map +1 -1
- package/dist/extensions/forgecli/forge-init/phase4-register.js +20 -1
- package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
- package/dist/extensions/forgecli/forge-init.js +5 -7
- package/dist/extensions/forgecli/forge-init.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.d.ts +1 -1
- package/dist/extensions/forgecli/forge-subagent.js +4 -2
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/forge-tools.js +10 -4
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/forge-update-command.d.ts +32 -11
- package/dist/extensions/forgecli/forge-update-command.js +207 -155
- package/dist/extensions/forgecli/forge-update-command.js.map +1 -1
- package/dist/extensions/forgecli/friction-emit.js +3 -5
- package/dist/extensions/forgecli/friction-emit.js.map +1 -1
- package/dist/extensions/forgecli/health-check.js +10 -6
- package/dist/extensions/forgecli/health-check.js.map +1 -1
- package/dist/extensions/forgecli/hook-dispatcher.js +2 -2
- package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
- package/dist/extensions/forgecli/hooks/check-update.js.map +1 -1
- package/dist/extensions/forgecli/hooks/forge-permissions.js.map +1 -1
- package/dist/extensions/forgecli/hooks/post-init-hook.js +1 -1
- package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js +1 -1
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
- package/dist/extensions/forgecli/hooks/write-guard.js +5 -3
- package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -1
- package/dist/extensions/forgecli/implement.d.ts +2 -2
- package/dist/extensions/forgecli/implement.js +2 -2
- package/dist/extensions/forgecli/implement.js.map +1 -1
- package/dist/extensions/forgecli/index.js +47 -41
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/input-router.js +4 -1
- package/dist/extensions/forgecli/input-router.js.map +1 -1
- package/dist/extensions/forgecli/lib/catalog-helpers.js +2 -1
- package/dist/extensions/forgecli/lib/catalog-helpers.js.map +1 -1
- package/dist/extensions/forgecli/lib/catalog-loader.js.map +1 -1
- package/dist/extensions/forgecli/lib/catalog-types.js +1 -6
- package/dist/extensions/forgecli/lib/catalog-types.js.map +1 -1
- package/dist/extensions/forgecli/lib/exec-helpers.js +1 -1
- package/dist/extensions/forgecli/lib/exec-helpers.js.map +1 -1
- package/dist/extensions/forgecli/lib/forge-config.js.map +1 -1
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +1 -1
- package/dist/extensions/forgecli/lib/parsers.js.map +1 -1
- package/dist/extensions/forgecli/lib/spawn-store-cli.js +17 -7
- package/dist/extensions/forgecli/lib/spawn-store-cli.js.map +1 -1
- package/dist/extensions/forgecli/materialize.js.map +1 -1
- package/dist/extensions/forgecli/migrate.js +1 -1
- package/dist/extensions/forgecli/migrate.js.map +1 -1
- package/dist/extensions/forgecli/migration-engine.js +3 -6
- package/dist/extensions/forgecli/migration-engine.js.map +1 -1
- package/dist/extensions/forgecli/model-resolver.js.map +1 -1
- package/dist/extensions/forgecli/model-validator.js.map +1 -1
- package/dist/extensions/forgecli/parsers/persona-skill-loader.js +1 -1
- package/dist/extensions/forgecli/parsers/workflow-loader.js +2 -6
- package/dist/extensions/forgecli/parsers/workflow-loader.js.map +1 -1
- package/dist/extensions/forgecli/paths/migrator.js +2 -7
- package/dist/extensions/forgecli/paths/migrator.js.map +1 -1
- package/dist/extensions/forgecli/plan.d.ts +2 -2
- package/dist/extensions/forgecli/plan.js +2 -2
- package/dist/extensions/forgecli/plan.js.map +1 -1
- package/dist/extensions/forgecli/quiz-agent.js.map +1 -1
- package/dist/extensions/forgecli/read-command.js +1 -1
- package/dist/extensions/forgecli/read-command.js.map +1 -1
- package/dist/extensions/forgecli/regenerate.js +1 -3
- package/dist/extensions/forgecli/regenerate.js.map +1 -1
- package/dist/extensions/forgecli/remove-command.js.map +1 -1
- package/dist/extensions/forgecli/report-bug.js +2 -2
- package/dist/extensions/forgecli/report-bug.js.map +1 -1
- package/dist/extensions/forgecli/retrospective.js +2 -2
- package/dist/extensions/forgecli/retrospective.js.map +1 -1
- package/dist/extensions/forgecli/review-code.d.ts +2 -2
- package/dist/extensions/forgecli/review-code.js +2 -2
- package/dist/extensions/forgecli/review-code.js.map +1 -1
- package/dist/extensions/forgecli/review-plan.d.ts +2 -2
- package/dist/extensions/forgecli/review-plan.js +2 -2
- package/dist/extensions/forgecli/review-plan.js.map +1 -1
- package/dist/extensions/forgecli/review-server.js +3 -5
- package/dist/extensions/forgecli/review-server.js.map +1 -1
- package/dist/extensions/forgecli/run-sprint.d.ts +1 -1
- package/dist/extensions/forgecli/run-sprint.js +27 -21
- package/dist/extensions/forgecli/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/run-task.js +102 -42
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/session-registry.js.map +1 -1
- package/dist/extensions/forgecli/skill-curator-subagent.js +4 -8
- package/dist/extensions/forgecli/skill-curator-subagent.js.map +1 -1
- package/dist/extensions/forgecli/skill-retriever.js +1 -1
- package/dist/extensions/forgecli/skill-retriever.js.map +1 -1
- package/dist/extensions/forgecli/skill-usage-tracker.js +1 -1
- package/dist/extensions/forgecli/skill-usage-tracker.js.map +1 -1
- package/dist/extensions/forgecli/status-command.js.map +1 -1
- package/dist/extensions/forgecli/store-error-remediation.js +16 -8
- package/dist/extensions/forgecli/store-error-remediation.js.map +1 -1
- package/dist/extensions/forgecli/store-query.js.map +1 -1
- package/dist/extensions/forgecli/store-repair.js.map +1 -1
- package/dist/extensions/forgecli/store-resolver.js +1 -1
- package/dist/extensions/forgecli/store-resolver.js.map +1 -1
- package/dist/extensions/forgecli/store-validator.js +1 -1
- package/dist/extensions/forgecli/store-validator.js.map +1 -1
- package/dist/extensions/forgecli/subagent/agents.js +1 -1
- package/dist/extensions/forgecli/subagent/agents.js.map +1 -1
- package/dist/extensions/forgecli/subagent/index.js +1 -1
- package/dist/extensions/forgecli/subagent/index.js.map +1 -1
- package/dist/extensions/forgecli/test-orchestrate.js +1 -1
- package/dist/extensions/forgecli/test-orchestrate.js.map +1 -1
- package/dist/extensions/forgecli/thread-switcher.js +8 -18
- package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
- package/dist/extensions/forgecli/transition-guard.js +1 -1
- package/dist/extensions/forgecli/transition-guard.js.map +1 -1
- package/dist/extensions/forgecli/update-tools.js +1 -2
- package/dist/extensions/forgecli/update-tools.js.map +1 -1
- package/dist/extensions/forgecli/validate.d.ts +2 -2
- package/dist/extensions/forgecli/validate.js +2 -2
- package/dist/extensions/forgecli/validate.js.map +1 -1
- package/dist/extensions/forgecli/viewport-events.js +2 -2
- package/dist/extensions/forgecli/viewport-events.js.map +1 -1
- package/dist/extensions/forgecli/wf-engine/engine.d.ts +1 -1
- package/dist/extensions/forgecli/wf-engine/engine.js +51 -31
- package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -1
- package/dist/extensions/forgecli/wf-engine/event-parser.js.map +1 -1
- package/dist/extensions/forgecli/wf-engine/id-gen.js +4 -1
- package/dist/extensions/forgecli/wf-engine/id-gen.js.map +1 -1
- package/dist/extensions/forgecli/wf-engine/loader.js +7 -7
- package/dist/extensions/forgecli/wf-engine/loader.js.map +1 -1
- package/dist/extensions/forgecli/wf-engine/predicate.js +14 -7
- package/dist/extensions/forgecli/wf-engine/predicate.js.map +1 -1
- package/dist/extensions/forgecli/wf-engine/prompt-compiler.js.map +1 -1
- package/dist/extensions/forgecli/wf-engine/register.js +1 -1
- package/dist/extensions/forgecli/wf-engine/register.js.map +1 -1
- package/dist/extensions/forgecli/wf-engine/remit-check.js +3 -3
- package/dist/extensions/forgecli/wf-engine/remit-check.js.map +1 -1
- package/dist/extensions/forgecli/wf-engine/state-store.js +7 -3
- package/dist/extensions/forgecli/wf-engine/state-store.js.map +1 -1
- package/dist/extensions/forgecli/wf-engine/worker.js +3 -3
- package/dist/extensions/forgecli/wf-engine/worker.js.map +1 -1
- package/dist/extensions/forgecli/whats-new-widget.js +8 -6
- package/dist/extensions/forgecli/whats-new-widget.js.map +1 -1
- package/dist/extensions/forgecli/whats-new.js +1 -2
- package/dist/extensions/forgecli/whats-new.js.map +1 -1
- package/dist/forge-payload/commands/update.md +23 -1
- package/dist/forge-payload/schemas/_defs/phaseSummary.schema.json +18 -0
- package/dist/forge-payload/schemas/bug.schema.json +40 -0
- package/dist/forge-payload/schemas/collation-state.schema.json +16 -0
- package/dist/forge-payload/schemas/config.schema.json +215 -0
- package/dist/forge-payload/schemas/enum-catalog.json +71 -0
- package/dist/forge-payload/schemas/event-sidecar.schema.json +22 -0
- package/dist/forge-payload/schemas/event.schema.json +184 -0
- package/dist/forge-payload/schemas/feature.schema.json +22 -0
- package/dist/forge-payload/schemas/progress-entry.schema.json +16 -0
- package/dist/forge-payload/schemas/project-context.schema.json +167 -0
- package/dist/forge-payload/schemas/project-overlay.schema.json +25 -0
- package/dist/forge-payload/schemas/proposal.schema.json +40 -0
- package/dist/forge-payload/schemas/sprint.schema.json +27 -0
- package/dist/forge-payload/schemas/structure-versions.schema.json +57 -0
- package/dist/forge-payload/schemas/task.schema.json +43 -0
- package/dist/forge-payload/schemas/transitions/bug.json +31 -0
- package/dist/forge-payload/schemas/transitions/sprint.json +46 -0
- package/dist/forge-payload/schemas/transitions/task.json +109 -0
- package/dist/forge-payload/tools/manage-config.cjs +120 -2
- package/package.json +3 -3
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/Entelligentsia/agentic-skills/forge/config.schema.json",
|
|
4
|
+
"title": "ForgeConfig",
|
|
5
|
+
"description": "Schema for .forge/config.json — the per-project Forge configuration file. Canonical single-source schema (FORGE-S25-T12 reconciled sdlc-config.schema.json into this file and deleted the sibling). Generated by /forge:init and refreshed by /forge:update.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["version", "project", "paths"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"version": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "Config schema version (e.g. '1.0'). Used for migration support."
|
|
12
|
+
},
|
|
13
|
+
"project": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"required": ["prefix", "name"],
|
|
16
|
+
"properties": {
|
|
17
|
+
"prefix": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "Short prefix for task/sprint/bug IDs (e.g. ACME)"
|
|
20
|
+
},
|
|
21
|
+
"name": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "Human-readable project name"
|
|
24
|
+
},
|
|
25
|
+
"description": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "One-line project description"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"stack": {
|
|
32
|
+
"type": "object",
|
|
33
|
+
"description": "Detected/declared project technology stack. Optional fields nullable because not every project ships e.g. a frontend or task queue.",
|
|
34
|
+
"properties": {
|
|
35
|
+
"languages": {
|
|
36
|
+
"type": "array",
|
|
37
|
+
"items": { "type": "string" },
|
|
38
|
+
"description": "Primary languages detected"
|
|
39
|
+
},
|
|
40
|
+
"framework": { "type": ["string", "null"], "description": "Primary backend framework" },
|
|
41
|
+
"frontendFramework": { "type": ["string", "null"], "description": "Frontend framework if detected" },
|
|
42
|
+
"database": { "type": ["string", "null"], "description": "Primary database" },
|
|
43
|
+
"taskQueue": { "type": ["string", "null"], "description": "Task queue if detected (celery, sidekiq, etc.)" },
|
|
44
|
+
"containerisation": { "type": ["string", "null"], "description": "Container tooling if detected" }
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"commands": {
|
|
48
|
+
"type": "object",
|
|
49
|
+
"description": "Resolved project tooling commands. Workflows reference these via {COMMAND_TEST} / {LINT_COMMAND} placeholders.",
|
|
50
|
+
"properties": {
|
|
51
|
+
"test": { "type": "string" },
|
|
52
|
+
"build": { "type": "string" },
|
|
53
|
+
"lint": { "type": "string" },
|
|
54
|
+
"syntaxCheck": {
|
|
55
|
+
"type": "object",
|
|
56
|
+
"additionalProperties": { "type": "string" }
|
|
57
|
+
},
|
|
58
|
+
"migrate": { "type": "string" },
|
|
59
|
+
"migrateCheck": { "type": "string" }
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"paths": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"required": ["engineering", "store", "forgeRoot"],
|
|
65
|
+
"properties": {
|
|
66
|
+
"engineering": { "type": "string", "default": "engineering" },
|
|
67
|
+
"store": { "type": "string", "default": ".forge/store" },
|
|
68
|
+
"workflows": { "type": "string", "default": ".forge/workflows" },
|
|
69
|
+
"commands": { "type": "string", "default": ".claude/commands" },
|
|
70
|
+
"templates": { "type": "string", "default": ".forge/templates" },
|
|
71
|
+
"customCommands": { "type": "string", "default": "engineering/commands", "description": "Directory for project-specific custom pipeline phase commands. Files here are workflow scripts invoked directly by the orchestrator via the phase workflow field." },
|
|
72
|
+
"forgeRoot": { "type": "string", "description": "Absolute path to the installed Forge plugin root. Set at init time and refreshed by /forge:update. Used by generated workflows to invoke Forge tools without requiring $CLAUDE_PLUGIN_ROOT in subagent contexts." },
|
|
73
|
+
"forgeRef": { "type": "string", "description": "Pinned Forge plugin reference (tag or commit) the project was generated against." }
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"pipeline": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"description": "Optional pipeline customisation for the default pipeline",
|
|
79
|
+
"properties": {
|
|
80
|
+
"skipPhases": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"items": { "type": "string" }
|
|
83
|
+
},
|
|
84
|
+
"maxReviewIterations": {
|
|
85
|
+
"type": "integer",
|
|
86
|
+
"minimum": 1,
|
|
87
|
+
"default": 3
|
|
88
|
+
},
|
|
89
|
+
"includeTokenDataInBugReports": {
|
|
90
|
+
"type": "boolean",
|
|
91
|
+
"description": "If set, silently opt in (true) or out (false) of appending sprint token usage data to Forge bug reports. When absent, the user is prompted at report time."
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"pipelines": {
|
|
96
|
+
"type": "object",
|
|
97
|
+
"description": "Named pipeline definitions. Each key is a pipeline name that tasks can reference via their `pipeline` field. The `default` pipeline is used when a task has no `pipeline` field. Projects define custom pipelines to route tasks to specialized agent commands.",
|
|
98
|
+
"additionalProperties": {
|
|
99
|
+
"type": "object",
|
|
100
|
+
"required": ["phases"],
|
|
101
|
+
"properties": {
|
|
102
|
+
"description": {
|
|
103
|
+
"type": "string",
|
|
104
|
+
"description": "Human-readable description of when to use this pipeline"
|
|
105
|
+
},
|
|
106
|
+
"phases": {
|
|
107
|
+
"type": "array",
|
|
108
|
+
"description": "Ordered list of pipeline phases. Each phase maps to a slash command.",
|
|
109
|
+
"items": {
|
|
110
|
+
"type": "object",
|
|
111
|
+
"required": ["command", "role"],
|
|
112
|
+
"properties": {
|
|
113
|
+
"command": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"description": "Slash command name (without /) to invoke for this phase"
|
|
116
|
+
},
|
|
117
|
+
"role": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"enum": ["plan", "review-plan", "implement", "review-code", "validate", "approve", "commit"],
|
|
120
|
+
"description": "Semantic role of this phase in the pipeline lifecycle"
|
|
121
|
+
},
|
|
122
|
+
"model": {
|
|
123
|
+
"type": "string",
|
|
124
|
+
"description": "Optional model override for this phase"
|
|
125
|
+
},
|
|
126
|
+
"maxIterations": {
|
|
127
|
+
"type": "integer",
|
|
128
|
+
"description": "Max revision loop iterations for review phases",
|
|
129
|
+
"default": 3
|
|
130
|
+
},
|
|
131
|
+
"on_revision": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"description": "Command name of the phase to re-invoke on 'Revision Required'. Defaults to the nearest preceding non-review phase if omitted."
|
|
134
|
+
},
|
|
135
|
+
"workflow": {
|
|
136
|
+
"type": "string",
|
|
137
|
+
"description": "Optional path to a workflow file. When set, the orchestrator reads and follows this file directly instead of deriving the workflow from the command name. Use for custom phase commands in engineering/commands/."
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"installedSkills": {
|
|
146
|
+
"type": "array",
|
|
147
|
+
"items": { "type": "string" },
|
|
148
|
+
"description": "Marketplace skill names installed during forge:init or recommended by forge:health. Used to wire skill invocations into generated personas and workflows.",
|
|
149
|
+
"examples": ["vue-best-practices", "stripe-integration", "claude-api"]
|
|
150
|
+
},
|
|
151
|
+
"sprint": {
|
|
152
|
+
"type": "object",
|
|
153
|
+
"description": "Optional sprint execution configuration",
|
|
154
|
+
"properties": {
|
|
155
|
+
"execution": {
|
|
156
|
+
"type": "object",
|
|
157
|
+
"properties": {
|
|
158
|
+
"mode": {
|
|
159
|
+
"type": "string",
|
|
160
|
+
"enum": ["sequential", "wave-parallel", "full-parallel"],
|
|
161
|
+
"default": "sequential"
|
|
162
|
+
},
|
|
163
|
+
"maxConcurrentAgents": {
|
|
164
|
+
"type": "integer",
|
|
165
|
+
"default": 3
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
"calibrationBaseline": {
|
|
172
|
+
"type": "object",
|
|
173
|
+
"description": "Calibration baseline written by /forge:init after skill generation. Records the state at calibration time so /forge:calibrate can detect drift.",
|
|
174
|
+
"properties": {
|
|
175
|
+
"lastCalibrated": { "type": "string", "description": "ISO date (YYYY-MM-DD) of the last calibration run" },
|
|
176
|
+
"version": { "type": "string", "description": "Plugin version string at calibration time (e.g. 0.9.3)" },
|
|
177
|
+
"masterIndexHash": { "type": "string", "description": "SHA-256 hex digest of the semantic content of engineering/MASTER_INDEX.md at calibration time" },
|
|
178
|
+
"sprintsCovered": { "type": "array", "items": { "type": "string" }, "description": "Sprint IDs whose tasks and outcomes were included in the calibration baseline" }
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
"calibrationHistory": {
|
|
182
|
+
"type": "array",
|
|
183
|
+
"description": "Audit trail of calibration runs. Each entry records the drift categories detected and the patches applied.",
|
|
184
|
+
"items": {
|
|
185
|
+
"type": "object",
|
|
186
|
+
"required": ["date", "version", "categories", "patches"],
|
|
187
|
+
"additionalProperties": false,
|
|
188
|
+
"properties": {
|
|
189
|
+
"date": { "type": "string", "description": "ISO date (YYYY-MM-DD) of this calibration run" },
|
|
190
|
+
"version": { "type": "string", "description": "Plugin version at calibration time" },
|
|
191
|
+
"categories": { "type": "array", "items": { "type": "string" }, "description": "Drift categories detected: technical, business, retrospective, acceptance-criteria" },
|
|
192
|
+
"patches": {
|
|
193
|
+
"type": "array",
|
|
194
|
+
"items": {
|
|
195
|
+
"type": "object",
|
|
196
|
+
"required": ["target", "type", "applied"],
|
|
197
|
+
"additionalProperties": false,
|
|
198
|
+
"properties": {
|
|
199
|
+
"target": { "type": "string", "description": "Regeneration target (e.g. personas:engineer, skills:supervisor-skills)" },
|
|
200
|
+
"type": { "type": "string", "enum": ["regenerate"], "description": "Patch type (currently only 'regenerate' is supported)" },
|
|
201
|
+
"applied": { "type": "boolean", "description": "Whether this patch was applied (true if approved and succeeded, false if skipped or failed)" }
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
"mode": {
|
|
209
|
+
"type": "string",
|
|
210
|
+
"enum": ["full", "fast"],
|
|
211
|
+
"description": "Init mode. 'fast' means scaffolding was generated by /forge:init --fast (stubs present, heavy artifacts deferred to first use). 'full' means all artifacts are generated. Absent on pre-0.12 projects — treated as 'full' by all readers. Flipped to 'full' by /forge:regenerate (default) or /forge:materialize --all."
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
"additionalProperties": false
|
|
215
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.51.1",
|
|
3
|
+
"generated": "2026-05-23",
|
|
4
|
+
"note": "Authoritative enum catalog. Source: build-enum-catalog.cjs. Regenerate via node forge/tools/build-manifest.cjs.",
|
|
5
|
+
"enums": {
|
|
6
|
+
"task.status": [
|
|
7
|
+
"draft",
|
|
8
|
+
"planned",
|
|
9
|
+
"plan-approved",
|
|
10
|
+
"implementing",
|
|
11
|
+
"implemented",
|
|
12
|
+
"review-approved",
|
|
13
|
+
"approved",
|
|
14
|
+
"committed",
|
|
15
|
+
"plan-revision-required",
|
|
16
|
+
"code-revision-required",
|
|
17
|
+
"blocked",
|
|
18
|
+
"escalated",
|
|
19
|
+
"abandoned"
|
|
20
|
+
],
|
|
21
|
+
"sprint.status": [
|
|
22
|
+
"planning",
|
|
23
|
+
"active",
|
|
24
|
+
"completed",
|
|
25
|
+
"retrospective-done",
|
|
26
|
+
"blocked",
|
|
27
|
+
"partially-completed",
|
|
28
|
+
"abandoned"
|
|
29
|
+
],
|
|
30
|
+
"bug.status": [
|
|
31
|
+
"reported",
|
|
32
|
+
"triaged",
|
|
33
|
+
"in-progress",
|
|
34
|
+
"fixed"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"commandNames": [
|
|
38
|
+
"forge:sprint-intake",
|
|
39
|
+
"forge:plan",
|
|
40
|
+
"forge:review-plan",
|
|
41
|
+
"forge:implement",
|
|
42
|
+
"forge:review-code",
|
|
43
|
+
"forge:fix-bug",
|
|
44
|
+
"forge:sprint-plan",
|
|
45
|
+
"forge:run-task",
|
|
46
|
+
"forge:run-sprint",
|
|
47
|
+
"forge:collate",
|
|
48
|
+
"forge:retrospective",
|
|
49
|
+
"forge:approve",
|
|
50
|
+
"forge:commit",
|
|
51
|
+
"forge:enhance",
|
|
52
|
+
"forge:quiz-agent",
|
|
53
|
+
"forge:validate",
|
|
54
|
+
"forge:init",
|
|
55
|
+
"forge:health",
|
|
56
|
+
"forge:regenerate",
|
|
57
|
+
"forge:update",
|
|
58
|
+
"forge:add-task",
|
|
59
|
+
"forge:add-pipeline",
|
|
60
|
+
"forge:calibrate",
|
|
61
|
+
"forge:materialize",
|
|
62
|
+
"forge:remove",
|
|
63
|
+
"forge:report-bug",
|
|
64
|
+
"forge:store-query",
|
|
65
|
+
"forge:store-repair",
|
|
66
|
+
"forge:config",
|
|
67
|
+
"forge:ask",
|
|
68
|
+
"forge:store-custodian",
|
|
69
|
+
"forge:refresh-kb-links"
|
|
70
|
+
]
|
|
71
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "forge/event-sidecar.schema.json",
|
|
4
|
+
"title": "Event Sidecar",
|
|
5
|
+
"description": "Subset of event schema — token/cost/duration fields written by agents before canonical merge. All fields other than eventId are optional; presence enforcement happens on the canonical event, not the sidecar.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["eventId"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"eventId": { "type": "string", "minLength": 1 },
|
|
11
|
+
"inputTokens": { "type": "integer", "minimum": 0 },
|
|
12
|
+
"outputTokens": { "type": "integer", "minimum": 0 },
|
|
13
|
+
"cacheReadTokens": { "type": "integer", "minimum": 0 },
|
|
14
|
+
"cacheWriteTokens": { "type": "integer", "minimum": 0 },
|
|
15
|
+
"model": { "type": "string", "maxLength": 120 },
|
|
16
|
+
"provider": { "type": "string", "maxLength": 60 },
|
|
17
|
+
"durationMinutes": { "type": "number", "minimum": 0 },
|
|
18
|
+
"startTimestamp": { "type": "string", "format": "date-time" },
|
|
19
|
+
"endTimestamp": { "type": "string", "format": "date-time" },
|
|
20
|
+
"tokenSource": { "type": "string", "enum": ["reported", "estimated"] }
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "forge/event.schema.json",
|
|
4
|
+
"title": "Event",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": [
|
|
7
|
+
"eventId", "sprintId", "role", "action",
|
|
8
|
+
"startTimestamp", "endTimestamp", "durationMinutes", "model", "provider"
|
|
9
|
+
],
|
|
10
|
+
"properties": {
|
|
11
|
+
"eventId": { "type": "string" },
|
|
12
|
+
"taskId": { "type": "string" },
|
|
13
|
+
"bugId": { "type": "string" },
|
|
14
|
+
"sprintId": { "type": "string" },
|
|
15
|
+
"role": { "type": "string" },
|
|
16
|
+
"action": { "type": "string" },
|
|
17
|
+
"phase": { "type": "string" },
|
|
18
|
+
"iteration": { "type": "integer", "minimum": 1 },
|
|
19
|
+
"startTimestamp": { "type": "string", "format": "date-time" },
|
|
20
|
+
"endTimestamp": { "type": "string", "format": "date-time" },
|
|
21
|
+
"durationMinutes": { "type": "number", "minimum": 0 },
|
|
22
|
+
"model": { "type": "string" },
|
|
23
|
+
"provider": { "type": "string", "maxLength": 60 },
|
|
24
|
+
"verdict": { "type": "string" },
|
|
25
|
+
"notes": { "type": "string" },
|
|
26
|
+
"inputTokens": { "type": "integer", "minimum": 0 },
|
|
27
|
+
"outputTokens": { "type": "integer", "minimum": 0 },
|
|
28
|
+
"cacheReadTokens": { "type": "integer", "minimum": 0 },
|
|
29
|
+
"cacheWriteTokens": { "type": "integer", "minimum": 0 },
|
|
30
|
+
"tokenSource": { "type": "string", "enum": ["reported", "estimated"] },
|
|
31
|
+
|
|
32
|
+
"resolution": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"properties": {
|
|
35
|
+
"status": { "type": "string", "enum": ["open", "resolved", "wontfix", "deferred"] },
|
|
36
|
+
"resolvedBy": { "type": "string" },
|
|
37
|
+
"resolvedAt": { "type": "string", "format": "date-time" },
|
|
38
|
+
"proposalRef": { "type": "string" },
|
|
39
|
+
"bugRef": { "type": "string" }
|
|
40
|
+
},
|
|
41
|
+
"required": ["status"],
|
|
42
|
+
"additionalProperties": false
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
"type": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"enum": [
|
|
48
|
+
"friction",
|
|
49
|
+
"task-planned",
|
|
50
|
+
"plan-complete",
|
|
51
|
+
"plan-approved",
|
|
52
|
+
"task-implemented",
|
|
53
|
+
"review-passed",
|
|
54
|
+
"review-failed",
|
|
55
|
+
"task-approved",
|
|
56
|
+
"task-validated",
|
|
57
|
+
"task-committed",
|
|
58
|
+
"sprint-complete",
|
|
59
|
+
"sprint-halted",
|
|
60
|
+
"bug-fixed",
|
|
61
|
+
|
|
62
|
+
"bug-triaged", "fix-planned", "fix-review-passed", "fix-review-failed",
|
|
63
|
+
"fix-implemented", "fix-code-review-passed", "fix-code-review-failed",
|
|
64
|
+
"fix-approved", "bug-committed",
|
|
65
|
+
|
|
66
|
+
"skill_usage"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"workflow": { "type": "string" },
|
|
70
|
+
"persona": { "type": "string" },
|
|
71
|
+
"issue": { "type": "string" },
|
|
72
|
+
"subkind": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"pattern": "^(skill_unused|skill_failed|skill_missing|skill_stale|skill_redundant|x_[a-z_]+)$"
|
|
75
|
+
},
|
|
76
|
+
"evidence": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"properties": {
|
|
79
|
+
"trajectory_excerpt": { "type": "string" },
|
|
80
|
+
"tool_errors": { "type": "array", "items": { "type": "string" } },
|
|
81
|
+
"retrieval_score": { "type": "number", "minimum": 0, "maximum": 1 },
|
|
82
|
+
"skillId": { "type": "string" }
|
|
83
|
+
},
|
|
84
|
+
"additionalProperties": false
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
"taskCount": { "type": "integer", "minimum": 0 },
|
|
88
|
+
"completedTaskIds": { "type": "array", "items": { "type": "string" } },
|
|
89
|
+
"pausedAfterTaskIndex": { "type": "integer", "minimum": 0 },
|
|
90
|
+
"haltedAtTaskIndex": { "type": "integer", "minimum": 0 },
|
|
91
|
+
"haltedAtTaskId": { "type": "string" },
|
|
92
|
+
"lastError": { "type": "string" },
|
|
93
|
+
"waveCount": { "type": "integer", "minimum": 1 },
|
|
94
|
+
"maxConcurrency": { "type": "integer", "minimum": 1 },
|
|
95
|
+
|
|
96
|
+
"skillId": { "type": "string", "minLength": 1 },
|
|
97
|
+
"retrieved": { "type": "boolean" },
|
|
98
|
+
"used": { "type": "boolean" },
|
|
99
|
+
"tool_call_success_rate": { "type": "number", "minimum": 0, "maximum": 1 },
|
|
100
|
+
"retrieval_score": { "type": "number", "minimum": 0, "maximum": 1 }
|
|
101
|
+
},
|
|
102
|
+
"additionalProperties": false,
|
|
103
|
+
"allOf": [
|
|
104
|
+
{
|
|
105
|
+
"if": { "properties": { "type": { "const": "friction" } }, "required": ["type"] },
|
|
106
|
+
"then": { "required": ["workflow", "persona", "issue"] }
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"if": {
|
|
110
|
+
"properties": {
|
|
111
|
+
"type": {
|
|
112
|
+
"enum": [
|
|
113
|
+
"task-planned", "plan-complete", "plan-approved",
|
|
114
|
+
"task-implemented", "review-passed", "review-failed",
|
|
115
|
+
"task-approved", "task-validated", "task-committed"
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"required": ["type"]
|
|
120
|
+
},
|
|
121
|
+
"then": { "required": ["taskId", "phase", "iteration"] }
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"if": {
|
|
125
|
+
"properties": {
|
|
126
|
+
"type": {
|
|
127
|
+
"enum": [
|
|
128
|
+
"bug-triaged", "fix-planned", "fix-review-passed", "fix-review-failed",
|
|
129
|
+
"fix-implemented", "fix-code-review-passed", "fix-code-review-failed",
|
|
130
|
+
"fix-approved", "bug-committed", "bug-fixed"
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"required": ["type"]
|
|
135
|
+
},
|
|
136
|
+
"then": { "required": ["bugId", "phase", "iteration"] }
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"if": { "properties": { "type": { "const": "sprint-complete" } }, "required": ["type"] },
|
|
140
|
+
"then": {
|
|
141
|
+
"required": [
|
|
142
|
+
"eventId", "sprintId", "role", "action",
|
|
143
|
+
"startTimestamp", "endTimestamp", "durationMinutes",
|
|
144
|
+
"model", "provider",
|
|
145
|
+
"taskCount", "completedTaskIds", "verdict"
|
|
146
|
+
],
|
|
147
|
+
"properties": {
|
|
148
|
+
"taskCount": { "type": "integer", "minimum": 0 },
|
|
149
|
+
"completedTaskIds": { "type": "array", "items": { "type": "string" } },
|
|
150
|
+
"verdict": { "type": "string", "enum": ["complete", "partial"] },
|
|
151
|
+
"pausedAfterTaskIndex": { "type": "integer", "minimum": 0 },
|
|
152
|
+
"waveCount": { "type": "integer", "minimum": 1 },
|
|
153
|
+
"maxConcurrency": { "type": "integer", "minimum": 1 }
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"if": { "properties": { "type": { "const": "sprint-halted" } }, "required": ["type"] },
|
|
159
|
+
"then": {
|
|
160
|
+
"required": [
|
|
161
|
+
"eventId", "sprintId", "role", "action",
|
|
162
|
+
"startTimestamp", "endTimestamp", "durationMinutes",
|
|
163
|
+
"model", "provider",
|
|
164
|
+
"haltedAtTaskIndex", "haltedAtTaskId", "lastError"
|
|
165
|
+
],
|
|
166
|
+
"properties": {
|
|
167
|
+
"haltedAtTaskIndex": { "type": "integer", "minimum": 0 },
|
|
168
|
+
"haltedAtTaskId": { "type": "string" },
|
|
169
|
+
"lastError": { "type": "string" }
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"if": { "properties": { "type": { "const": "skill_usage" } }, "required": ["type"] },
|
|
175
|
+
"then": {
|
|
176
|
+
"required": [
|
|
177
|
+
"eventId", "sprintId", "taskId",
|
|
178
|
+
"skillId", "retrieved", "used",
|
|
179
|
+
"tool_call_success_rate", "retrieval_score"
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
]
|
|
184
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "forge/feature.schema.json",
|
|
4
|
+
"title": "Feature",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["id", "title", "status", "created_at"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"id": { "type": "string" },
|
|
9
|
+
"title": { "type": "string" },
|
|
10
|
+
"description": { "type": "string" },
|
|
11
|
+
"status": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"enum": ["draft", "active", "shipped", "retired"]
|
|
14
|
+
},
|
|
15
|
+
"requirements": { "type": "array", "items": { "type": "string" } },
|
|
16
|
+
"sprints": { "type": "array", "items": { "type": "string" } },
|
|
17
|
+
"tasks": { "type": "array", "items": { "type": "string" } },
|
|
18
|
+
"created_at": { "type": "string", "format": "date-time" },
|
|
19
|
+
"updated_at": { "type": "string", "format": "date-time" }
|
|
20
|
+
},
|
|
21
|
+
"additionalProperties": false
|
|
22
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "forge/progress-entry.schema.json",
|
|
4
|
+
"title": "Progress Entry",
|
|
5
|
+
"description": "One line of progress.log, parsed from pipe-delimited fields: timestamp|agentName|bannerKey|status|detail",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["timestamp", "agentName", "bannerKey", "status"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"timestamp": { "type": "string", "format": "date-time" },
|
|
11
|
+
"agentName": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_-]{0,63}$" },
|
|
12
|
+
"bannerKey": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_.:-]{0,127}$" },
|
|
13
|
+
"status": { "type": "string", "enum": ["start", "progress", "done", "error"] },
|
|
14
|
+
"detail": { "type": "string", "maxLength": 500 }
|
|
15
|
+
}
|
|
16
|
+
}
|