create-agdf 0.14.3 → 0.14.4
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/README.md +34 -2
- package/generated/.opencode/contracts/interaction.md +2 -2
- package/generated/.opencode/skills/agdf-gate-check/SKILL.md +6 -4
- package/generated/plugins/agdf/.claude-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/.codex-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/agdf/meta/contracts/interaction.md +2 -2
- package/generated/plugins/agdf/meta/copilot-payload-baseline.json +3 -3
- package/generated/plugins/agdf/meta/distribution-profile-history.json +125 -0
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/agdf/runtime/create-agdf/lib/cli/command-registry.js +8 -1
- package/generated/plugins/agdf/runtime/create-agdf/lib/cli/parse-args.js +3 -0
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/doctor.js +13 -0
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/gate-check.js +64 -13
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-evaluation/run-state.js +6 -0
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-state/run-identity.js +9 -0
- package/generated/plugins/agdf/runtime/create-agdf/lib/control-state/run-state-parser.js +4 -2
- package/generated/plugins/agdf/runtime/create-agdf/lib/interaction-presentation.js +57 -7
- package/generated/plugins/agdf/runtime/create-agdf/lib/runtime/plugin-provenance.js +46 -3
- package/generated/plugins/agdf/runtime/create-agdf/package.json +1 -1
- package/generated/plugins/agdf/runtime/runtime-manifest.json +2 -2
- package/generated/plugins/agdf/scripts/check-runtime-integrity.mjs +2 -0
- package/generated/plugins/agdf/skills/gate-check/SKILL.md +6 -4
- package/generated/plugins/agdf/submission/openai/availability.md +1 -1
- package/generated/plugins/agdf/submission/openai/capability-matrix.json +1 -1
- package/generated/plugins/agdf/submission/openai/release-notes.md +1 -1
- package/generated/plugins/agdf/submission/openai/reviewer-cases.json +1 -1
- package/generated/plugins/copilot/agdf/.agdf-payload-inventory.json +55 -35
- package/generated/plugins/copilot/agdf/copilot-skills/agdf-gate-check/SKILL.md +6 -4
- package/generated/plugins/copilot/agdf/copilot-skills/contracts/interaction.md +2 -2
- package/generated/plugins/copilot/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/copilot/agdf/meta/distribution-profile-history.json +125 -0
- package/generated/plugins/copilot/agdf/plugin.json +1 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/command-registry.js +8 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/parse-args.js +3 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/doctor.js +13 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/gate-check.js +64 -13
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/run-state.js +6 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/run-identity.js +9 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/run-state-parser.js +4 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/interaction-presentation.js +57 -7
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/runtime/plugin-provenance.js +46 -3
- package/generated/plugins/copilot/agdf/runtime/create-agdf/package.json +1 -1
- package/generated/plugins/copilot/agdf/runtime/runtime-manifest.json +2 -2
- package/generated/submissions/openai/agdf/.codex-plugin/plugin.json +1 -1
- package/generated/submissions/openai/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/submissions/openai/agdf/meta/contracts/interaction.md +2 -2
- package/generated/submissions/openai/agdf/meta/copilot-payload-baseline.json +3 -3
- package/generated/submissions/openai/agdf/meta/distribution-profile-history.json +125 -0
- package/generated/submissions/openai/agdf/skills/gate-check/SKILL.md +6 -4
- package/generated/submissions/openai/agdf/submission/openai/availability.md +1 -1
- package/generated/submissions/openai/agdf/submission/openai/capability-matrix.json +1 -1
- package/generated/submissions/openai/agdf/submission/openai/inventory.json +16 -12
- package/generated/submissions/openai/agdf/submission/openai/listing.json +1 -1
- package/generated/submissions/openai/agdf/submission/openai/readiness.json +2 -2
- package/generated/submissions/openai/agdf/submission/openai/readiness.md +2 -2
- package/generated/submissions/openai/agdf/submission/openai/release-notes.md +1 -1
- package/generated/submissions/openai/agdf/submission/openai/reviewer-cases.json +1 -1
- package/lib/cli/application.js +24 -6
- package/lib/cli/command-registry.js +8 -1
- package/lib/cli/parse-args.js +3 -0
- package/lib/control-evaluation/doctor.js +13 -0
- package/lib/control-evaluation/gate-check.js +64 -13
- package/lib/control-evaluation/run-state.js +6 -0
- package/lib/control-state/run-identity.js +9 -0
- package/lib/control-state/run-state-parser.js +4 -2
- package/lib/installers/claude-cache-recovery.js +76 -0
- package/lib/installers/copilot-settings.js +146 -16
- package/lib/installers/local-marketplace.js +169 -14
- package/lib/installers/plugin-installers.js +96 -9
- package/lib/interaction-presentation.js +57 -7
- package/lib/lifecycle/operations.js +28 -4
- package/lib/lifecycle/result.js +4 -4
- package/lib/release/profile-history.js +222 -0
- package/lib/release/version-bump.js +527 -0
- package/lib/release/version-coherence.js +92 -38
- package/lib/runtime/distribution-profile-history.js +173 -0
- package/lib/runtime/plugin-provenance.js +46 -3
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ If you use Codex, this is the recommended first installation:
|
|
|
17
17
|
npx --yes @agdf/cli@latest codex
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Fully restart Codex, open a fresh task in the repository you want to work in, and describe the intended change. Restoring a previous task can retain stale AGDF skills. AGDF starts with the smallest permitted governance step; it does not make implementation automatic.
|
|
21
21
|
|
|
22
22
|
Use a different target when Codex is not your agent surface:
|
|
23
23
|
|
|
@@ -72,6 +72,8 @@ npx --yes @agdf/cli@latest opencode-status
|
|
|
72
72
|
npx --yes @agdf/cli@latest opencode-repo
|
|
73
73
|
npx --yes @agdf/cli@latest status --surface codex
|
|
74
74
|
npx --yes @agdf/cli@latest disable --surface codex --scope repository
|
|
75
|
+
npx --yes @agdf/cli@latest disable --surface copilot --scope repository
|
|
76
|
+
npx --yes @agdf/cli@latest disable --surface copilot --scope repository --shared
|
|
75
77
|
npx --yes @agdf/cli@latest uninstall --surface codex --scope global
|
|
76
78
|
npx --yes @agdf/cli@latest init
|
|
77
79
|
npx --yes @agdf/cli@latest config --language en
|
|
@@ -125,6 +127,7 @@ Optional flags:
|
|
|
125
127
|
- `--verbose` show captured host installer output and generated-file details after the concise lifecycle card
|
|
126
128
|
- `--scope <repository|global>` select an explicit lifecycle mutation scope
|
|
127
129
|
- `--confirm` apply a global uninstall after reviewing the default non-mutating preview
|
|
130
|
+
- `--shared` use commit-capable `.github/copilot/settings.json` for an explicit shared Copilot repository disable; without it Copilot uses ignored personal-local settings
|
|
128
131
|
|
|
129
132
|
If no language is provided, `create-agdf` derives the preference from the local system locale (`LC_ALL`, `LC_MESSAGES`, `LANG`, `LANGUAGE` or the Node.js runtime locale) and falls back to `en`.
|
|
130
133
|
|
|
@@ -142,7 +145,7 @@ it does not localize the CLI lifecycle card.
|
|
|
142
145
|
- `opencode-status` reports OpenCode global config, package loadability, global native-skill completeness, installed host/plugin-SDK versions, declaration-level support for AGDF's two experimental hooks, durable repository activation, legacy compatibility and observable session signals
|
|
143
146
|
- `status` reports installation, repository activation and delivery separately without mutating state
|
|
144
147
|
- `runtime-checks status|enable|manual` reports the requested/effective automatic-check state or gives the exact reinstall route needed to change it
|
|
145
|
-
- `disable`
|
|
148
|
+
- `disable` keeps Codex repository behavior and supports Copilot personal-local opt-out by default; Copilot shared repository effect requires `--shared`
|
|
146
149
|
- `uninstall` previews and, only with `--confirm`, applies a selected global removal through supported native/owned operations
|
|
147
150
|
- `opencode-repo` writes durable AGDF control configuration and templates under `.agdf/control/`; it does not copy a second OpenCode runtime surface
|
|
148
151
|
- `config` writes or updates only `.agdf/control/config.json` for an already installed plugin or an existing repository
|
|
@@ -153,12 +156,41 @@ the Copilot manifest, prefixed skills, hook, required contracts and exact-versio
|
|
|
153
156
|
is rendered from the same canonical sources. The installers atomically stage their profile under an AGDF-owned user-data marketplace, register
|
|
154
157
|
that stable local path through the host CLI and verify the exposed version. Source `plugin/` therefore
|
|
155
158
|
contains no generated runtime bytes and the source checkout exposes no installable root marketplace.
|
|
159
|
+
|
|
160
|
+
Repository lifecycle support is deliberately asymmetric:
|
|
161
|
+
|
|
162
|
+
| Surface | Personal repository opt-out | Shared repository opt-out | Repository activation | Global uninstall |
|
|
163
|
+
|---|---|---|---|---|
|
|
164
|
+
| Codex | supported by its existing local plugin state | no new `--shared` mode | `codex-repo` | supported |
|
|
165
|
+
| Claude Code | not supported without a verified host mechanism | not supported | no new mechanism | supported |
|
|
166
|
+
| GitHub Copilot | default in ignored `.github/copilot/settings.local.json` | explicit `--shared` in `.github/copilot/settings.json` | plugin discovery remains separate | supported |
|
|
167
|
+
| OpenCode | not supported as disable | not supported | `opencode-repo` | supported |
|
|
168
|
+
|
|
169
|
+
The personal Copilot command fails before mutation unless Git confirms the local settings path is
|
|
170
|
+
ignored. It never edits `.gitignore` or `.git/info/exclude`. Existing JSON must be strict JSON;
|
|
171
|
+
JSONC, comments, invalid types and symlinked paths fail closed. Only
|
|
172
|
+
`enabledPlugins["agdf@agdf"]` changes. Restart Copilot and inspect `/plugin list`; inspect
|
|
173
|
+
`/instructions` separately because plugin disablement does not disable `AGENTS.md`,
|
|
174
|
+
`.github/copilot-instructions.md` or other applicable instructions.
|
|
156
175
|
The staged plugin contains one installation-provenance marker and the shared exact-version runtime;
|
|
157
176
|
routine installed validation does not depend on the GitHub
|
|
158
177
|
checkout, npm cache, PATH or registry. Rerunning either command performs the explicit update and
|
|
159
178
|
migrates only the exact known legacy AGDF GitHub marketplace; foreign same-name registrations fail
|
|
160
179
|
closed and failed host operations restore the prior owned stage.
|
|
161
180
|
|
|
181
|
+
The shared installer recognizes exact packaged snapshots for the verified AGDF-owned four-profile
|
|
182
|
+
releases `0.13.6`, `0.13.7`, `0.13.8` and `0.14.1`, then rebuilds them from current canonical
|
|
183
|
+
package content. Current-shape `0.14.2` and `0.14.3` stay on ordinary current validation.
|
|
184
|
+
`agdf-v0.14.0` is not a release alias: its internal version is `0.13.8`, so it grants no
|
|
185
|
+
compatibility. Historical lookup uses no Git or network access and does not accept unknown versions,
|
|
186
|
+
partial contracts or tampered provenance. Claude's Windows-only contention recovery removes at most the one
|
|
187
|
+
contained `temp_local_*` directory named by the current install command's `EPERM` rename failure and
|
|
188
|
+
retries once; it does not enumerate or broadly clear the host cache.
|
|
189
|
+
|
|
190
|
+
Successful installation verifies the installed version but not an already loaded session. Fully
|
|
191
|
+
restart the host and start a fresh session or task. Restoring the previous session can retain stale
|
|
192
|
+
AGDF skills and must not be treated as current loaded-session evidence.
|
|
193
|
+
|
|
162
194
|
Copilot staging uses the independent path `<AGDF data directory>/marketplaces/agdf-copilot`. This
|
|
163
195
|
prevents Copilot updates and rollbacks from replacing the shared Codex and Claude payload while the
|
|
164
196
|
host-facing Marketplace identity remains `agdf` and the install identity remains `agdf@agdf`.
|
|
@@ -154,8 +154,8 @@ required decision and one neutral instruction to choose approve, request revisio
|
|
|
154
154
|
or decline. It does not contain the exact approval value or quality outlook. It uses localized human-readable labels
|
|
155
155
|
and must not contain evidence, diagnostic codes, raw control-state keys,
|
|
156
156
|
allowed/forbidden inventories or machine values. The complete Run Status Card remains the operational,
|
|
157
|
-
CLI and audit projection
|
|
158
|
-
approval-
|
|
157
|
+
CLI and audit projection. Every ready-gate presentation renders the complete operational Run Status Card exactly once, between the compact approval-time Run Status Card and the Gate Transition Card, consumed verbatim from the code-owned status presentation; when it is undeliverable, the localized status-presentation failure line with its concrete diagnostic codes takes its place and the decision is still requested.
|
|
158
|
+
The exact-approval once-only requirement applies to the compact approval-time Run Status Card and the Gate Transition Card only; the complete Run Status Card may carry the missing approval as audit data.
|
|
159
159
|
|
|
160
160
|
The first scan across both cards reveals the requested decision, readiness,
|
|
161
161
|
required approval, approval effect, remaining boundary and next transition.
|
|
@@ -209,10 +209,12 @@ the primary chat card into an audit dump. Do not maintain or render a skill-loca
|
|
|
209
209
|
|
|
210
210
|
This complete operational status table remains the status-reporting and detail
|
|
211
211
|
surface. When the same response immediately requests a ready gate approval,
|
|
212
|
-
render its five-field compact approval-time projection first, then the
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
212
|
+
render its five-field compact approval-time projection first, then the complete
|
|
213
|
+
operational Run Status Card verbatim (or its localized failure line with
|
|
214
|
+
diagnostic codes when undeliverable), then the Gate Transition Card in the same
|
|
215
|
+
immediately preceding assistant message, then invoke exactly one native
|
|
216
|
+
question or exact-text fallback. The runtime contract owns this sequence; every
|
|
217
|
+
block is shown exactly once.
|
|
216
218
|
|
|
217
219
|
If this skill creates or updates control artefacts, do not paste full file bodies into the chat.
|
|
218
220
|
List paths, summarize the decision, name the blocker or approval needed, and keep the durable content in the files.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agdf",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.4",
|
|
4
4
|
"description": "AI Governance & Delivery Framework (AGDF) is a governance framework for agentic work. Its first implementation provides a control layer for governed AI-assisted software delivery. It combines workflow skills, explicit gates, control templates and machine-readable repository checks to keep work aligned with approved scope and make evidence a prerequisite for consequential gate transitions. Supported workflows include brownfield analysis, task-plan review, QA decisions, durable run state and auditable delivery closeout. AGDF is an independent open-source project, not a security sandbox, compliance certification or autonomous release system.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentic",
|
|
@@ -154,8 +154,8 @@ required decision and one neutral instruction to choose approve, request revisio
|
|
|
154
154
|
or decline. It does not contain the exact approval value or quality outlook. It uses localized human-readable labels
|
|
155
155
|
and must not contain evidence, diagnostic codes, raw control-state keys,
|
|
156
156
|
allowed/forbidden inventories or machine values. The complete Run Status Card remains the operational,
|
|
157
|
-
CLI and audit projection
|
|
158
|
-
approval-
|
|
157
|
+
CLI and audit projection. Every ready-gate presentation renders the complete operational Run Status Card exactly once, between the compact approval-time Run Status Card and the Gate Transition Card, consumed verbatim from the code-owned status presentation; when it is undeliverable, the localized status-presentation failure line with its concrete diagnostic codes takes its place and the decision is still requested.
|
|
158
|
+
The exact-approval once-only requirement applies to the compact approval-time Run Status Card and the Gate Transition Card only; the complete Run Status Card may carry the missing approval as audit data.
|
|
159
159
|
|
|
160
160
|
The first scan across both cards reveals the requested decision, readiness,
|
|
161
161
|
required approval, approval effect, remaining boundary and next transition.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"profile_id": "copilot-runtime-plugin",
|
|
4
|
-
"max_files":
|
|
5
|
-
"max_bytes":
|
|
6
|
-
"rationale": "Reviewed Copilot-only manifest, ten prefixed skills, required contracts, exact-version runtime, Delivery Path Search input-integrity provenance
|
|
4
|
+
"max_files": 80,
|
|
5
|
+
"max_bytes": 568459,
|
|
6
|
+
"rationale": "Reviewed Copilot-only manifest, ten prefixed skills, required contracts, exact-version runtime, Delivery Path Search input-integrity provenance, evidence-plane separation, shared run-identity validation and the one-file distribution profile history catalogue. Measured payload is 80 files/563615 bytes; no byte-capacity increase was required. Any further increase requires review."
|
|
7
7
|
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 1,
|
|
3
|
+
"contracts": {
|
|
4
|
+
"five-profile-v1": {
|
|
5
|
+
"distribution_profiles": {
|
|
6
|
+
"schemaVersion": 1,
|
|
7
|
+
"marketplaceIdentities": {
|
|
8
|
+
"durable": "agdf",
|
|
9
|
+
"generatedRepository": "agdf-repo"
|
|
10
|
+
},
|
|
11
|
+
"profiles": {
|
|
12
|
+
"source-development": {
|
|
13
|
+
"runtime": "absent",
|
|
14
|
+
"installable": false,
|
|
15
|
+
"machineValidation": "unavailable"
|
|
16
|
+
},
|
|
17
|
+
"runtime-plugin": {
|
|
18
|
+
"runtime": "required",
|
|
19
|
+
"installable": true,
|
|
20
|
+
"machineValidation": "local_exact_version_digest"
|
|
21
|
+
},
|
|
22
|
+
"copilot-runtime-plugin": {
|
|
23
|
+
"runtime": "required",
|
|
24
|
+
"installable": true,
|
|
25
|
+
"machineValidation": "local_exact_version_digest_inventory"
|
|
26
|
+
},
|
|
27
|
+
"opencode-config-local": {
|
|
28
|
+
"runtime": "config_local_package",
|
|
29
|
+
"installable": true,
|
|
30
|
+
"machineValidation": "local_exact_version"
|
|
31
|
+
},
|
|
32
|
+
"portable-skills": {
|
|
33
|
+
"runtime": "absent",
|
|
34
|
+
"installable": true,
|
|
35
|
+
"machineValidation": "unavailable_or_external_required"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"contract_digest": "0211f4e6054a23f0a3ba302e57303adcb8f5903581e99643f803647dd156fe32"
|
|
40
|
+
},
|
|
41
|
+
"four-profile-v1": {
|
|
42
|
+
"distribution_profiles": {
|
|
43
|
+
"schemaVersion": 1,
|
|
44
|
+
"marketplaceIdentities": {
|
|
45
|
+
"durable": "agdf",
|
|
46
|
+
"generatedRepository": "agdf-repo"
|
|
47
|
+
},
|
|
48
|
+
"profiles": {
|
|
49
|
+
"source-development": {
|
|
50
|
+
"runtime": "absent",
|
|
51
|
+
"installable": false,
|
|
52
|
+
"machineValidation": "unavailable"
|
|
53
|
+
},
|
|
54
|
+
"runtime-plugin": {
|
|
55
|
+
"runtime": "required",
|
|
56
|
+
"installable": true,
|
|
57
|
+
"machineValidation": "local_exact_version_digest"
|
|
58
|
+
},
|
|
59
|
+
"opencode-config-local": {
|
|
60
|
+
"runtime": "config_local_package",
|
|
61
|
+
"installable": true,
|
|
62
|
+
"machineValidation": "local_exact_version"
|
|
63
|
+
},
|
|
64
|
+
"portable-skills": {
|
|
65
|
+
"runtime": "absent",
|
|
66
|
+
"installable": true,
|
|
67
|
+
"machineValidation": "unavailable_or_external_required"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"contract_digest": "9987baa4ea91e28a096cac2be8daa876f1c0593e7edbfe2e96b713814aa65ce8"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"releases": {
|
|
75
|
+
"0.13.6": {
|
|
76
|
+
"contract_id": "four-profile-v1",
|
|
77
|
+
"provenance_schema_version": 1,
|
|
78
|
+
"profile_id": "runtime-plugin",
|
|
79
|
+
"entry_digest": "1c21c3fa99cdd788994013f25cbe606ffdcea2cc91d53c679cf061567f652bf3",
|
|
80
|
+
"status": "supported"
|
|
81
|
+
},
|
|
82
|
+
"0.13.7": {
|
|
83
|
+
"contract_id": "four-profile-v1",
|
|
84
|
+
"provenance_schema_version": 1,
|
|
85
|
+
"profile_id": "runtime-plugin",
|
|
86
|
+
"entry_digest": "6d5383537d2640dc13773f2929dd94d0e7e219e82d08418464c77786b475c3ee",
|
|
87
|
+
"status": "supported"
|
|
88
|
+
},
|
|
89
|
+
"0.13.8": {
|
|
90
|
+
"contract_id": "four-profile-v1",
|
|
91
|
+
"provenance_schema_version": 1,
|
|
92
|
+
"profile_id": "runtime-plugin",
|
|
93
|
+
"entry_digest": "405e8cfa72ec2e469354dab52197675783b3723adb969a0692e56ba7c95c85c8",
|
|
94
|
+
"status": "supported"
|
|
95
|
+
},
|
|
96
|
+
"0.14.1": {
|
|
97
|
+
"contract_id": "four-profile-v1",
|
|
98
|
+
"provenance_schema_version": 1,
|
|
99
|
+
"profile_id": "runtime-plugin",
|
|
100
|
+
"entry_digest": "1a6fd6f6a411eddb29e82d7b7abc7d5f658312f555dcf39e160a709194a8b867",
|
|
101
|
+
"status": "supported"
|
|
102
|
+
},
|
|
103
|
+
"0.14.2": {
|
|
104
|
+
"contract_id": "five-profile-v1",
|
|
105
|
+
"provenance_schema_version": 1,
|
|
106
|
+
"profile_id": "runtime-plugin",
|
|
107
|
+
"entry_digest": "f71ee26df3d4a89ecc727a1c30b40221cf062fce9f716a83453bced9503be8fd",
|
|
108
|
+
"status": "supported"
|
|
109
|
+
},
|
|
110
|
+
"0.14.3": {
|
|
111
|
+
"contract_id": "five-profile-v1",
|
|
112
|
+
"provenance_schema_version": 1,
|
|
113
|
+
"profile_id": "runtime-plugin",
|
|
114
|
+
"entry_digest": "c5dbe4044d11a976cd4ccd6de6cf1405ebfcb4a26ce5c6308c34f10142db50c9",
|
|
115
|
+
"status": "supported"
|
|
116
|
+
},
|
|
117
|
+
"0.14.4": {
|
|
118
|
+
"contract_id": "five-profile-v1",
|
|
119
|
+
"provenance_schema_version": 1,
|
|
120
|
+
"profile_id": "runtime-plugin",
|
|
121
|
+
"entry_digest": "a441d633fe11ea402c3366cfac0cec659d32eae5eb4ae6b1d25a1e366a029813",
|
|
122
|
+
"status": "supported"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -18,7 +18,7 @@ export const commandRegistry = Object.freeze([
|
|
|
18
18
|
command("opencode-status", { preferred: [""], scaffold: [""] }),
|
|
19
19
|
command("status", { preferred: [" [--surface <surface>] [--run <run_id>] [--json]"] }),
|
|
20
20
|
command("runtime-checks", { preferred: [" <status|enable|manual> --surface <codex|claude|copilot|opencode> [--json]"] }),
|
|
21
|
-
command("disable", { preferred: [" --surface <surface> [--scope repository] [--dir <path>]"] }),
|
|
21
|
+
command("disable", { preferred: [" --surface <surface> [--scope repository] [--shared] [--dir <path>]"] }),
|
|
22
22
|
command("uninstall", { preferred: [" --surface <surface> --scope global [--confirm]"] }),
|
|
23
23
|
command("opencode-repo", { preferred: [""], scaffold: [""] }),
|
|
24
24
|
command("init", { preferred: [""], scaffold: [""] }),
|
|
@@ -65,6 +65,12 @@ export function validateCommandOptions(options) {
|
|
|
65
65
|
throw new Error("uninstall requires explicit --scope global");
|
|
66
66
|
}
|
|
67
67
|
if (options.confirm && options.target !== "uninstall") throw new Error("--confirm is supported only by uninstall");
|
|
68
|
+
if (options.shared && !(options.target === "disable" && options.surface === "copilot" && options.scope === "repository")) {
|
|
69
|
+
throw new Error("--shared is supported only by disable --surface copilot --scope repository");
|
|
70
|
+
}
|
|
71
|
+
if (options.target === "disable" && options.surface === "copilot" && options.scope !== "repository") {
|
|
72
|
+
throw new Error("Copilot disable requires explicit --scope repository");
|
|
73
|
+
}
|
|
68
74
|
if (options.runtimeChecksDecision && !["codex", "claude", "copilot", "opencode"].includes(options.target)) {
|
|
69
75
|
throw new Error("--runtime-checks is supported only by codex, claude, copilot and opencode installation commands");
|
|
70
76
|
}
|
|
@@ -126,6 +132,7 @@ Options:
|
|
|
126
132
|
--scope <repository|global>
|
|
127
133
|
Select the lifecycle mutation scope
|
|
128
134
|
--confirm Apply a previously previewed global uninstall plan
|
|
135
|
+
--shared Apply Copilot repository disable through shared .github/copilot/settings.json
|
|
129
136
|
--runtime-checks <enable|manual|cancel>
|
|
130
137
|
Make the installation-time automatic-check decision explicitly; no TTY defaults to manual
|
|
131
138
|
--fixture <path>
|
|
@@ -45,6 +45,7 @@ export function parseArgs(argv, dependencies = {}) {
|
|
|
45
45
|
let allActive = false;
|
|
46
46
|
let scope;
|
|
47
47
|
let confirm = false;
|
|
48
|
+
let shared = false;
|
|
48
49
|
let runtimeChecksDecision;
|
|
49
50
|
let runtimeChecksAction;
|
|
50
51
|
|
|
@@ -61,6 +62,7 @@ export function parseArgs(argv, dependencies = {}) {
|
|
|
61
62
|
if (arg === "--generate-candidates") { generateCandidates = true; continue; }
|
|
62
63
|
if (arg === "--all-active") { allActive = true; continue; }
|
|
63
64
|
if (arg === "--confirm") { confirm = true; continue; }
|
|
65
|
+
if (arg === "--shared") { shared = true; continue; }
|
|
64
66
|
|
|
65
67
|
if (arg === "--runtime-checks") {
|
|
66
68
|
const next = requiredValue(args, i, arg);
|
|
@@ -162,6 +164,7 @@ export function parseArgs(argv, dependencies = {}) {
|
|
|
162
164
|
allActive,
|
|
163
165
|
scope,
|
|
164
166
|
confirm,
|
|
167
|
+
shared,
|
|
165
168
|
runtimeChecksDecision,
|
|
166
169
|
runtimeChecksAction: runtimeChecksAction ?? "status",
|
|
167
170
|
generatorModel,
|
|
@@ -130,6 +130,19 @@ export function evaluateDoctor(targetDir, selection = {}) {
|
|
|
130
130
|
"Add at least one evidence row or explicitly document that no evidence exists yet.",
|
|
131
131
|
);
|
|
132
132
|
}
|
|
133
|
+
|
|
134
|
+
for (const identityFinding of selectedRunState.identity_findings ?? []) {
|
|
135
|
+
addFinding(
|
|
136
|
+
findings,
|
|
137
|
+
"revise",
|
|
138
|
+
identityFinding.code,
|
|
139
|
+
identityFinding.code === "AGDF_RUN_ID_INVALID"
|
|
140
|
+
? "The selected run state has a missing or invalid run_id; interaction cards cannot be rendered for it."
|
|
141
|
+
: "The selected run state has a missing or invalid revision_id; approval interactions cannot be rendered for it.",
|
|
142
|
+
runPath,
|
|
143
|
+
"Run run-migrate to repair the run identity, or migrate the legacy state to a canonical run record.",
|
|
144
|
+
);
|
|
145
|
+
}
|
|
133
146
|
}
|
|
134
147
|
|
|
135
148
|
const backlogPath = join(".agdf", "control", "MASTER_BACKLOG.md");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { attachApprovalOrientationSnapshot, buildArtefactRefs, buildQualityReadiness, gateTitle, localePack, renderApprovalOrientationSnapshot, renderOperationalStatusCard, resolveHumanRunTitle } from '../interaction-presentation.js';
|
|
1
|
+
import { attachApprovalOrientationSnapshot, buildArtefactRefs, buildQualityReadiness, gateTitle, localePack, renderApprovalOrientationSnapshot, renderOperationalStatusCard, resolveHumanRunTitle, validateApprovalOrientationPreconditions, validateApprovalOrientationSnapshot, validateOperationalStatusCardPreconditions } from '../interaction-presentation.js';
|
|
2
2
|
import { interactionLocales, resolveConfiguredChatLanguage } from '../cli/runtime-context.js';
|
|
3
3
|
import { evaluateDoctor } from './doctor.js';
|
|
4
4
|
import { analyzeDeliveryMap, deriveQualityOutlook } from './delivery-map.js';
|
|
@@ -300,8 +300,9 @@ export function evaluateGateCheck(targetDir, selection = {}) {
|
|
|
300
300
|
humanPresentation,
|
|
301
301
|
revisionId,
|
|
302
302
|
});
|
|
303
|
+
const readyForApproval = isReadyUserGateApproval({ status, currentGate, missingApproval });
|
|
303
304
|
const approvalOrientation = attachApprovalOrientationSnapshot(statusCard, {
|
|
304
|
-
ready:
|
|
305
|
+
ready: readyForApproval,
|
|
305
306
|
humanPresentation,
|
|
306
307
|
revisionId,
|
|
307
308
|
registry: interactionLocales,
|
|
@@ -312,6 +313,50 @@ export function evaluateGateCheck(targetDir, selection = {}) {
|
|
|
312
313
|
enumerable: false,
|
|
313
314
|
});
|
|
314
315
|
|
|
316
|
+
const approvalPresentation = renderApprovalOrientationSnapshot(approvalOrientation, {
|
|
317
|
+
registry: interactionLocales,
|
|
318
|
+
expectedIdentity: {
|
|
319
|
+
run_id: statusCard.run_id,
|
|
320
|
+
revision_id: revisionId,
|
|
321
|
+
current_gate: currentGate,
|
|
322
|
+
presentation_language: statusCard.presentation_language,
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
const presentationDiagnostics = {};
|
|
326
|
+
if (!statusPresentation) {
|
|
327
|
+
presentationDiagnostics.status_presentation_errors = [
|
|
328
|
+
...validateOperationalStatusCardPreconditions(statusCard, {
|
|
329
|
+
registry: interactionLocales,
|
|
330
|
+
humanPresentation,
|
|
331
|
+
}).errors,
|
|
332
|
+
];
|
|
333
|
+
}
|
|
334
|
+
if (readyForApproval && !approvalPresentation) {
|
|
335
|
+
presentationDiagnostics.approval_presentation_errors = approvalOrientation
|
|
336
|
+
? [
|
|
337
|
+
...validateApprovalOrientationSnapshot(approvalOrientation, {
|
|
338
|
+
registry: interactionLocales,
|
|
339
|
+
expectedIdentity: {
|
|
340
|
+
run_id: statusCard.run_id,
|
|
341
|
+
revision_id: revisionId,
|
|
342
|
+
current_gate: currentGate,
|
|
343
|
+
presentation_language: statusCard.presentation_language,
|
|
344
|
+
},
|
|
345
|
+
}).errors,
|
|
346
|
+
]
|
|
347
|
+
: [
|
|
348
|
+
...validateApprovalOrientationPreconditions({
|
|
349
|
+
statusCard,
|
|
350
|
+
humanPresentation,
|
|
351
|
+
registry: interactionLocales,
|
|
352
|
+
requestedLocale: presentationLocale,
|
|
353
|
+
}).errors,
|
|
354
|
+
];
|
|
355
|
+
if (!presentationDiagnostics.approval_presentation_errors.length) {
|
|
356
|
+
presentationDiagnostics.approval_presentation_errors = ["snapshot_unavailable"];
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
315
360
|
return {
|
|
316
361
|
schema_version: "1",
|
|
317
362
|
status,
|
|
@@ -332,15 +377,8 @@ export function evaluateGateCheck(targetDir, selection = {}) {
|
|
|
332
377
|
candidate_runs: runState.candidate_runs ?? [],
|
|
333
378
|
status_card: statusCard,
|
|
334
379
|
status_presentation: statusPresentation,
|
|
335
|
-
approval_presentation:
|
|
336
|
-
|
|
337
|
-
expectedIdentity: {
|
|
338
|
-
run_id: statusCard.run_id,
|
|
339
|
-
revision_id: revisionId,
|
|
340
|
-
current_gate: currentGate,
|
|
341
|
-
presentation_language: statusCard.presentation_language,
|
|
342
|
-
},
|
|
343
|
-
}),
|
|
380
|
+
approval_presentation: approvalPresentation,
|
|
381
|
+
...(Object.keys(presentationDiagnostics).length ? { presentation_diagnostics: presentationDiagnostics } : {}),
|
|
344
382
|
delivery_map: {
|
|
345
383
|
relationships: deliveryMap.relationships,
|
|
346
384
|
mode_slice_decision: runState.mode_slice_decision,
|
|
@@ -368,6 +406,14 @@ export function printApprovalEnvelope(report, { io = console, reEvaluate } = {})
|
|
|
368
406
|
if (report?.approval_presentation) {
|
|
369
407
|
io.log(report.approval_presentation.blocks.run_status_card.markdown);
|
|
370
408
|
io.log("");
|
|
409
|
+
if (report.status_presentation?.markdown) {
|
|
410
|
+
io.log(report.status_presentation.markdown);
|
|
411
|
+
} else {
|
|
412
|
+
const pack = localePack(interactionLocales, report.approval_presentation.presentation_language || "en");
|
|
413
|
+
const codes = report.presentation_diagnostics?.status_presentation_errors ?? [];
|
|
414
|
+
io.log(codes.length ? `${pack.interaction.statusPresentationFailure} (${codes.join(", ")})` : pack.interaction.statusPresentationFailure);
|
|
415
|
+
}
|
|
416
|
+
io.log("");
|
|
371
417
|
io.log(report.approval_presentation.blocks.gate_transition_card.markdown);
|
|
372
418
|
io.log("");
|
|
373
419
|
io.log(report.approval_presentation.approval_interaction.exact_text_fallback);
|
|
@@ -386,7 +432,10 @@ export function printApprovalEnvelope(report, { io = console, reEvaluate } = {})
|
|
|
386
432
|
const pack = localePack(interactionLocales, refreshed?.status_card?.presentation_language || report?.status_card?.presentation_language || "en");
|
|
387
433
|
const refreshedApproval = canonicalApprovalForReport(refreshed);
|
|
388
434
|
if (initialApproval && refreshedApproval) {
|
|
389
|
-
|
|
435
|
+
const codes = refreshed?.presentation_diagnostics?.approval_presentation_errors
|
|
436
|
+
?? report?.presentation_diagnostics?.approval_presentation_errors
|
|
437
|
+
?? [];
|
|
438
|
+
io.log(codes.length ? `${pack.interaction.presentationFailure} (${codes.join(", ")})` : pack.interaction.presentationFailure);
|
|
390
439
|
io.log(pack.interaction.exactTextRequest.replace("{approval}", refreshedApproval));
|
|
391
440
|
return Object.freeze({ outcome: "exact_text_recovery", requested_decision: true, status: refreshed.status });
|
|
392
441
|
}
|
|
@@ -404,7 +453,9 @@ export function printApprovalEnvelope(report, { io = console, reEvaluate } = {})
|
|
|
404
453
|
function printGateCheckStatusCard(report, io) {
|
|
405
454
|
const card = report.status_card;
|
|
406
455
|
if (!report.status_presentation?.markdown) {
|
|
407
|
-
|
|
456
|
+
const failure = localePack(interactionLocales, card?.presentation_language || "en").interaction.statusPresentationFailure;
|
|
457
|
+
const codes = report.presentation_diagnostics?.status_presentation_errors ?? [];
|
|
458
|
+
io.log(codes.length ? `${failure} (${codes.join(", ")})` : failure);
|
|
408
459
|
return false;
|
|
409
460
|
}
|
|
410
461
|
io.log(report.status_presentation.markdown);
|
|
@@ -2,6 +2,7 @@ import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
|
2
2
|
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
3
3
|
import process from "node:process";
|
|
4
4
|
import { parseControlState, resolveRuns } from "../control-state/index.js";
|
|
5
|
+
import { validateRunIdentity } from "../control-state/run-identity.js";
|
|
5
6
|
import { buildRunCandidates } from "../interaction-presentation.js";
|
|
6
7
|
import { cleanStatusCell, filled, isPlaceholderValue, readTargetFile } from "./shared.js";
|
|
7
8
|
import { extractField, isSafeRepoRelativePath, readVerifiedChangeRecord } from "./verified-change.js";
|
|
@@ -87,6 +88,7 @@ export function readRunState(targetDir, selection = {}) {
|
|
|
87
88
|
memory: {},
|
|
88
89
|
candidate_runs: candidateRuns,
|
|
89
90
|
resolution_error: resolutionError,
|
|
91
|
+
identity_findings: [],
|
|
90
92
|
};
|
|
91
93
|
}
|
|
92
94
|
|
|
@@ -101,6 +103,10 @@ export function readRunState(targetDir, selection = {}) {
|
|
|
101
103
|
path: runPath,
|
|
102
104
|
content,
|
|
103
105
|
...parsed,
|
|
106
|
+
identity_findings: validateRunIdentity({
|
|
107
|
+
runId: extractField(content, "run_id").replace(/^`|`$/g, ""),
|
|
108
|
+
revisionId: extractField(content, "revision_id").replace(/^`|`$/g, ""),
|
|
109
|
+
}),
|
|
104
110
|
};
|
|
105
111
|
}
|
|
106
112
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const RUN_ID_PATTERN = /^[a-z0-9][a-z0-9._-]{0,127}$/;
|
|
2
|
+
export const REVISION_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
3
|
+
|
|
4
|
+
export function validateRunIdentity({ runId, revisionId } = {}) {
|
|
5
|
+
const findings = [];
|
|
6
|
+
if (!RUN_ID_PATTERN.test(String(runId ?? ""))) findings.push({ code: "AGDF_RUN_ID_INVALID" });
|
|
7
|
+
if (!REVISION_ID_PATTERN.test(String(revisionId ?? ""))) findings.push({ code: "AGDF_RUN_REVISION_ID_INVALID" });
|
|
8
|
+
return findings;
|
|
9
|
+
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { REVISION_ID_PATTERN, RUN_ID_PATTERN } from "./run-identity.js";
|
|
2
|
+
|
|
3
|
+
export { RUN_ID_PATTERN } from "./run-identity.js";
|
|
2
4
|
export const LIFECYCLES = new Set([
|
|
3
5
|
"active",
|
|
4
6
|
"completed",
|
|
@@ -34,7 +36,7 @@ export function parseRunState(content, expected) {
|
|
|
34
36
|
findings.push({ code: "AGDF_RUN_LIFECYCLE_INVALID" });
|
|
35
37
|
if (!/^[1-9]\d*$/.test(values.get("revision") ?? ""))
|
|
36
38
|
findings.push({ code: "AGDF_RUN_REVISION_INVALID" });
|
|
37
|
-
if (
|
|
39
|
+
if (!REVISION_ID_PATTERN.test(values.get("revision_id") ?? ""))
|
|
38
40
|
findings.push({ code: "AGDF_RUN_REVISION_ID_INVALID" });
|
|
39
41
|
return {
|
|
40
42
|
content,
|