@entelligentsia/forgecli 0.20.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +70 -0
- package/dist/extensions/forgecli/fix-bug.d.ts +1 -1
- package/dist/extensions/forgecli/fix-bug.js +14 -6
- package/dist/extensions/forgecli/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/forge-init/phase4-register.js +19 -0
- package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
- package/dist/extensions/forgecli/run-task.d.ts +2 -1
- package/dist/extensions/forgecli/run-task.js +48 -4
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/forge-payload/.base-pack/workflows/enhance.md +34 -4
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/.schemas/migrations.json +11 -0
- package/dist/forge-payload/commands/update.md +23 -1
- package/dist/forge-payload/integrity.json +4 -4
- package/dist/forge-payload/meta/workflows/meta-enhance.md +34 -4
- 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-manifest.json +2 -2
- 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.4",
|
|
3
|
+
"generated": "2026-05-26",
|
|
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
|
+
}
|