create-agdf 0.14.1 → 0.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- 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 +6 -1
- package/generated/plugins/agdf/meta/copilot-payload-baseline.json +7 -0
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +6 -1
- package/generated/plugins/agdf/runtime/create-agdf/lib/runtime/local-validator.js +29 -17
- package/generated/plugins/agdf/runtime/create-agdf/lib/runtime/plugin-provenance.js +50 -1
- 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 -1
- 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 +771 -0
- package/generated/plugins/copilot/agdf/LICENSE +201 -0
- package/generated/plugins/copilot/agdf/meta/agdf-agent-router.md +129 -0
- package/generated/plugins/copilot/agdf/meta/agdf-constitution.md +329 -0
- package/generated/plugins/copilot/agdf/meta/agdf-plugin.definition.json +331 -0
- package/generated/plugins/copilot/agdf/meta/agdf-runtime-contract.md +16 -0
- package/generated/plugins/{agdf → copilot/agdf}/plugin.json +1 -1
- package/generated/plugins/copilot/agdf/runtime/agdf-local.js +18 -0
- package/generated/plugins/copilot/agdf/runtime/agdf-session-check.js +97 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/NOTICE +10 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/bin/agdf-validator.js +11 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-interaction-locales.json +512 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +331 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/command-registry.js +144 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/delivery-path-search-command.js +139 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/parse-args.js +173 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/runtime-context.js +83 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/validation-handlers.js +46 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/delivery-map.js +301 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/doctor.js +272 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/gate-check.js +455 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/gate-policy.js +305 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/parent-reconciliation.js +284 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/required-files.js +9 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/run-state.js +217 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/shared.js +345 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/verified-change.js +156 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/aggregate.js +18 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/gate-approval-validator.js +49 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/index.js +7 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/legacy-migration.js +95 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/run-state-parser.js +265 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/run-state-repository.js +68 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/run-state-resolver.js +45 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/run-state-writer.js +97 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/candidate-policy.js +99 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/contracts.js +237 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/evaluators/claude.js +35 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/evaluators/codex.js +44 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/evaluators/opencode.js +234 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/evaluators/prompt.js +13 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/evaluators/protocol.js +13 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/generators/claude.js +40 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/generators/codex.js +38 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/generators/protocol.js +12 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/persistence.js +39 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/scoring.js +21 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/search-engine.js +155 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/state-adapter.js +161 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/surfaces/capabilities.js +27 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/transports/read-only-guard.js +43 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/interaction-presentation.js +842 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/runtime/local-validator.js +239 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/runtime/plugin-provenance.js +255 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/runtime/validator-application.js +40 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/runtime-check-consent/contract.js +73 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/package.json +6 -0
- package/generated/plugins/copilot/agdf/runtime/runtime-manifest.json +8 -0
- package/generated/submissions/openai/agdf/.codex-plugin/plugin.json +1 -1
- package/generated/submissions/openai/agdf/meta/agdf-plugin.definition.json +6 -1
- package/generated/submissions/openai/agdf/meta/copilot-payload-baseline.json +7 -0
- 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 +13 -9
- 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/installers/local-marketplace.js +112 -30
- package/lib/installers/plugin-installers.js +45 -9
- package/lib/public-plugin/copilot-profile.js +126 -0
- package/lib/release/version-coherence.js +4 -1
- package/lib/runtime/local-validator.js +29 -17
- package/lib/runtime/plugin-provenance.js +50 -1
- package/package.json +3 -2
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-brownfield-analysis/SKILL.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-clean-implementation-review/SKILL.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-code-review/SKILL.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-delivery-closeout/SKILL.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-delivery-path-search/SKILL.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-gate-check/SKILL.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-interaction-locales.json +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-qa-gate/SKILL.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-release-or/SKILL.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-runtime-contract.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-task-plan-review/SKILL.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-ux-intent-definition/SKILL.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/closeout.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/context-graph.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/control-scaffold.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/gate-transition.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/interaction.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/modes.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/quality.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/task-target-resolution.md +0 -0
- /package/generated/plugins/{agdf → copilot/agdf}/hooks/copilot-hooks.json +0 -0
package/README.md
CHANGED
|
@@ -147,8 +147,10 @@ it does not localize the CLI lifecycle card.
|
|
|
147
147
|
- `opencode-repo` writes durable AGDF control configuration and templates under `.agdf/control/`; it does not copy a second OpenCode runtime surface
|
|
148
148
|
- `config` writes or updates only `.agdf/control/config.json` for an already installed plugin or an existing repository
|
|
149
149
|
|
|
150
|
-
The `codex
|
|
151
|
-
`create-agdf` package.
|
|
150
|
+
The `codex` and `claude` commands install the complete shared plugin built into the released
|
|
151
|
+
`create-agdf` package. The `copilot` command installs a dedicated generated profile containing only
|
|
152
|
+
the Copilot manifest, prefixed skills, hook, required contracts and exact-version runtime. Every profile
|
|
153
|
+
is rendered from the same canonical sources. The installers atomically stage their profile under an AGDF-owned user-data marketplace, register
|
|
152
154
|
that stable local path through the host CLI and verify the exposed version. Source `plugin/` therefore
|
|
153
155
|
contains no generated runtime bytes and the source checkout exposes no installable root marketplace.
|
|
154
156
|
The staged plugin contains one installation-provenance marker and the shared exact-version runtime;
|
|
@@ -157,6 +159,10 @@ checkout, npm cache, PATH or registry. Rerunning either command performs the exp
|
|
|
157
159
|
migrates only the exact known legacy AGDF GitHub marketplace; foreign same-name registrations fail
|
|
158
160
|
closed and failed host operations restore the prior owned stage.
|
|
159
161
|
|
|
162
|
+
Copilot staging uses the independent path `<AGDF data directory>/marketplaces/agdf-copilot`. This
|
|
163
|
+
prevents Copilot updates and rollbacks from replacing the shared Codex and Claude payload while the
|
|
164
|
+
host-facing Marketplace identity remains `agdf` and the install identity remains `agdf@agdf`.
|
|
165
|
+
|
|
160
166
|
The Copilot installer does not create, rewrite or remove repository files. Existing `AGENTS.md`, `.github/` and `.agdf/control/` content remains untouched. Use `init` separately when a repository should own surface-neutral durable AGDF control state.
|
|
161
167
|
|
|
162
168
|
Use the `codex-repo` target when AGDF should be available only inside one repository instead of being installed as a personal/global Codex plugin.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agdf",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.2",
|
|
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",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"id": "agdf",
|
|
4
|
-
"version": "0.14.
|
|
4
|
+
"version": "0.14.2",
|
|
5
5
|
"displayName": "AI Governance & Delivery Framework",
|
|
6
6
|
"developerName": "Arndt Gold",
|
|
7
7
|
"description": "Control layer for governed AI-assisted delivery.",
|
|
@@ -311,6 +311,11 @@
|
|
|
311
311
|
"installable": true,
|
|
312
312
|
"machineValidation": "local_exact_version_digest"
|
|
313
313
|
},
|
|
314
|
+
"copilot-runtime-plugin": {
|
|
315
|
+
"runtime": "required",
|
|
316
|
+
"installable": true,
|
|
317
|
+
"machineValidation": "local_exact_version_digest_inventory"
|
|
318
|
+
},
|
|
314
319
|
"opencode-config-local": {
|
|
315
320
|
"runtime": "config_local_package",
|
|
316
321
|
"installable": true,
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 1,
|
|
3
|
+
"profile_id": "copilot-runtime-plugin",
|
|
4
|
+
"max_files": 78,
|
|
5
|
+
"max_bytes": 539607,
|
|
6
|
+
"rationale": "Reviewed Copilot-only manifest, ten prefixed skills, required contracts, exact-version runtime and evidence-plane separation. Any further increase requires review."
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"id": "agdf",
|
|
4
|
-
"version": "0.14.
|
|
4
|
+
"version": "0.14.2",
|
|
5
5
|
"displayName": "AI Governance & Delivery Framework",
|
|
6
6
|
"developerName": "Arndt Gold",
|
|
7
7
|
"description": "Control layer for governed AI-assisted delivery.",
|
|
@@ -311,6 +311,11 @@
|
|
|
311
311
|
"installable": true,
|
|
312
312
|
"machineValidation": "local_exact_version_digest"
|
|
313
313
|
},
|
|
314
|
+
"copilot-runtime-plugin": {
|
|
315
|
+
"runtime": "required",
|
|
316
|
+
"installable": true,
|
|
317
|
+
"machineValidation": "local_exact_version_digest_inventory"
|
|
318
|
+
},
|
|
314
319
|
"opencode-config-local": {
|
|
315
320
|
"runtime": "config_local_package",
|
|
316
321
|
"installable": true,
|
|
@@ -5,6 +5,7 @@ import process from "node:process";
|
|
|
5
5
|
import {
|
|
6
6
|
INSTALLATION_PROVENANCE_FILE,
|
|
7
7
|
digestDirectory,
|
|
8
|
+
inspectCopilotPayloadInventory,
|
|
8
9
|
inspectGeneratedRepositoryMarketplace,
|
|
9
10
|
inspectInstallationProvenance,
|
|
10
11
|
validateDistributionProfiles,
|
|
@@ -83,41 +84,52 @@ export function resolveLocalValidator(options) {
|
|
|
83
84
|
}
|
|
84
85
|
const codexManifest = readJson(join(pluginRoot, ".codex-plugin", "plugin.json"));
|
|
85
86
|
const claudeManifest = readJson(join(pluginRoot, ".claude-plugin", "plugin.json"));
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
const copilotManifest = readJson(join(pluginRoot, "plugin.json"));
|
|
88
|
+
const copilotProfile = Boolean(copilotManifest && !codexManifest && !claudeManifest);
|
|
89
|
+
const distributionProfile = copilotProfile ? "copilot-runtime-plugin" : "runtime-plugin";
|
|
90
|
+
const pluginVersion = copilotProfile ? copilotManifest?.version ?? null : codexManifest?.version ?? null;
|
|
91
|
+
if (copilotProfile
|
|
92
|
+
? copilotManifest.version !== definition.version
|
|
93
|
+
: (!codexManifest || !claudeManifest || claudeManifest.version !== definition.version)) {
|
|
94
|
+
return { envelope: envelope("version_mismatch", options, { source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, distributionProfile, provenanceStatus: "invalid", reason: "manifest_invalid" }) };
|
|
95
|
+
}
|
|
96
|
+
const copilotInventory = copilotProfile ? inspectCopilotPayloadInventory(pluginRoot, definition.version) : null;
|
|
97
|
+
if (copilotProfile && copilotInventory.status !== "matched") {
|
|
98
|
+
return { envelope: envelope("version_mismatch", options, { source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, distributionProfile, provenanceStatus: "invalid", reason: copilotInventory.reason }) };
|
|
89
99
|
}
|
|
90
100
|
const packageRoot = join(options.runtimeRoot, "create-agdf");
|
|
91
101
|
if (!existsSync(packageRoot)) {
|
|
92
|
-
return { envelope: envelope("unavailable", options, { source: "plugin_bundle", pluginRoot, pluginVersion, distributionProfile
|
|
102
|
+
return { envelope: envelope("unavailable", options, { source: "plugin_bundle", pluginRoot, pluginVersion, distributionProfile, reason: "runtime_missing" }) };
|
|
93
103
|
}
|
|
94
104
|
const packageManifest = readJson(join(packageRoot, "package.json"));
|
|
95
105
|
const observedVersion = packageManifest?.version ?? manifest.version ?? null;
|
|
96
106
|
if (observedVersion !== options.expectedVersion || manifest.version !== options.expectedVersion) {
|
|
97
|
-
return { envelope: envelope("version_mismatch", options, { observedVersion, source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, distributionProfile
|
|
107
|
+
return { envelope: envelope("version_mismatch", options, { observedVersion, source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, distributionProfile }) };
|
|
98
108
|
}
|
|
99
109
|
let observedDigest = null;
|
|
100
110
|
try { observedDigest = digestDirectory(packageRoot); } catch {}
|
|
101
111
|
if (!observedDigest || manifest.digest !== observedDigest) {
|
|
102
|
-
return { envelope: envelope("version_mismatch", options, { observedVersion, source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, runtimeDigest: observedDigest, distributionProfile
|
|
112
|
+
return { envelope: envelope("version_mismatch", options, { observedVersion, source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, runtimeDigest: observedDigest, distributionProfile, reason: "runtime_digest_mismatch" }) };
|
|
103
113
|
}
|
|
104
114
|
const entrypoint = resolve(options.runtimeRoot, manifest.entrypoint ?? "");
|
|
105
115
|
const entrypointRelative = relative(options.runtimeRoot, entrypoint);
|
|
106
116
|
if (!manifest.entrypoint || entrypointRelative === ".." || entrypointRelative.startsWith(`..${sep}`) || isAbsolute(entrypointRelative)) {
|
|
107
|
-
return { envelope: envelope("version_mismatch", options, { observedVersion, source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, runtimeDigest: observedDigest, distributionProfile
|
|
117
|
+
return { envelope: envelope("version_mismatch", options, { observedVersion, source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, runtimeDigest: observedDigest, distributionProfile, reason: "invalid_entrypoint" }) };
|
|
108
118
|
}
|
|
109
119
|
if (!existsSync(entrypoint)) {
|
|
110
|
-
return { envelope: envelope("unavailable", options, { observedVersion, source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, runtimeDigest: observedDigest, distributionProfile
|
|
120
|
+
return { envelope: envelope("unavailable", options, { observedVersion, source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, runtimeDigest: observedDigest, distributionProfile, reason: "entrypoint_missing" }) };
|
|
111
121
|
}
|
|
112
122
|
const installed = existsSync(join(pluginRoot, INSTALLATION_PROVENANCE_FILE));
|
|
113
123
|
let provenanceStatus = "not_applicable";
|
|
114
124
|
let sourceDigest = null;
|
|
115
|
-
let evidencePlane = "loaded_session";
|
|
125
|
+
let evidencePlane = options.expectedPluginRoot ? "loaded_session" : "installed_plugin_root";
|
|
116
126
|
if (installed) {
|
|
117
127
|
const provenance = inspectInstallationProvenance(pluginRoot, {
|
|
118
128
|
definition,
|
|
119
129
|
runtimeManifest: manifest,
|
|
120
130
|
pluginVersion,
|
|
131
|
+
profileId: distributionProfile,
|
|
132
|
+
inventoryDigest: copilotInventory?.inventoryDigest ?? null,
|
|
121
133
|
});
|
|
122
134
|
provenanceStatus = provenance.status;
|
|
123
135
|
sourceDigest = provenance.marker?.source_digest ?? null;
|
|
@@ -130,8 +142,8 @@ export function resolveLocalValidator(options) {
|
|
|
130
142
|
canonicalVersion: definition.version,
|
|
131
143
|
runtimeDigest: observedDigest,
|
|
132
144
|
sourceDigest,
|
|
133
|
-
distributionProfile
|
|
134
|
-
evidencePlane
|
|
145
|
+
distributionProfile,
|
|
146
|
+
evidencePlane,
|
|
135
147
|
provenanceStatus,
|
|
136
148
|
reason: provenance.reason,
|
|
137
149
|
}) };
|
|
@@ -144,16 +156,16 @@ export function resolveLocalValidator(options) {
|
|
|
144
156
|
pluginVersion,
|
|
145
157
|
canonicalVersion: definition.version,
|
|
146
158
|
runtimeDigest: observedDigest,
|
|
147
|
-
distributionProfile
|
|
159
|
+
distributionProfile,
|
|
148
160
|
evidencePlane: "loaded_session",
|
|
149
161
|
provenanceStatus: "missing",
|
|
150
162
|
reason: "installation_provenance_missing",
|
|
151
163
|
}) };
|
|
152
164
|
} else {
|
|
153
|
-
const generatedRepository = inspectGeneratedRepositoryMarketplace(resolve(pluginRoot, "..", ".."));
|
|
165
|
+
const generatedRepository = copilotProfile ? null : inspectGeneratedRepositoryMarketplace(resolve(pluginRoot, "..", ".."));
|
|
154
166
|
if (pluginVersion !== definition.version
|
|
155
|
-
|| generatedRepository.status !== "matched"
|
|
156
|
-
|
|
167
|
+
|| (!copilotProfile && (generatedRepository.status !== "matched"
|
|
168
|
+
|| canonicalPath(generatedRepository.pluginRoot) !== pluginRoot))) {
|
|
157
169
|
return { envelope: envelope("unavailable", options, {
|
|
158
170
|
observedVersion,
|
|
159
171
|
source: "plugin_bundle",
|
|
@@ -161,7 +173,7 @@ export function resolveLocalValidator(options) {
|
|
|
161
173
|
pluginVersion,
|
|
162
174
|
canonicalVersion: definition.version,
|
|
163
175
|
runtimeDigest: observedDigest,
|
|
164
|
-
distributionProfile
|
|
176
|
+
distributionProfile,
|
|
165
177
|
evidencePlane: "installed_plugin_root",
|
|
166
178
|
provenanceStatus: "missing",
|
|
167
179
|
reason: "installation_provenance_missing",
|
|
@@ -178,7 +190,7 @@ export function resolveLocalValidator(options) {
|
|
|
178
190
|
canonicalVersion: definition.version,
|
|
179
191
|
runtimeDigest: observedDigest,
|
|
180
192
|
sourceDigest,
|
|
181
|
-
distributionProfile
|
|
193
|
+
distributionProfile,
|
|
182
194
|
evidencePlane,
|
|
183
195
|
provenanceStatus,
|
|
184
196
|
}),
|
|
@@ -4,10 +4,12 @@ import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
|
4
4
|
|
|
5
5
|
export const INSTALLATION_PROVENANCE_FILE = ".agdf-installation.json";
|
|
6
6
|
export const LEGACY_LOCAL_INSTALL_FILE = ".agdf-local-install.json";
|
|
7
|
+
export const COPILOT_PAYLOAD_INVENTORY_FILE = ".agdf-payload-inventory.json";
|
|
7
8
|
|
|
8
9
|
const EXPECTED_PROFILES = Object.freeze({
|
|
9
10
|
"source-development": Object.freeze({ runtime: "absent", installable: false, machineValidation: "unavailable" }),
|
|
10
11
|
"runtime-plugin": Object.freeze({ runtime: "required", installable: true, machineValidation: "local_exact_version_digest" }),
|
|
12
|
+
"copilot-runtime-plugin": Object.freeze({ runtime: "required", installable: true, machineValidation: "local_exact_version_digest_inventory" }),
|
|
11
13
|
"opencode-config-local": Object.freeze({ runtime: "config_local_package", installable: true, machineValidation: "local_exact_version" }),
|
|
12
14
|
"portable-skills": Object.freeze({ runtime: "absent", installable: true, machineValidation: "unavailable_or_external_required" }),
|
|
13
15
|
});
|
|
@@ -41,6 +43,50 @@ export function digestDirectory(root) {
|
|
|
41
43
|
return hash.digest("hex");
|
|
42
44
|
}
|
|
43
45
|
|
|
46
|
+
export function digestFile(path) {
|
|
47
|
+
return createHash("sha256").update(readFileSync(path)).digest("hex");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function inspectCopilotPayloadInventory(pluginRoot, expectedVersion) {
|
|
51
|
+
const inventoryPath = join(pluginRoot, COPILOT_PAYLOAD_INVENTORY_FILE);
|
|
52
|
+
const inventory = readJson(inventoryPath);
|
|
53
|
+
if (!inventory || inventory.schema_version !== 1 || inventory.profile_id !== "copilot-runtime-plugin"
|
|
54
|
+
|| inventory.version !== expectedVersion || !Array.isArray(inventory.entries)) {
|
|
55
|
+
return { status: "invalid", reason: "copilot_payload_inventory_invalid" };
|
|
56
|
+
}
|
|
57
|
+
const destinations = inventory.entries.map((entry) => entry.destination);
|
|
58
|
+
if (new Set(destinations).size !== destinations.length) {
|
|
59
|
+
return { status: "invalid", reason: "copilot_payload_inventory_duplicate" };
|
|
60
|
+
}
|
|
61
|
+
const actual = [];
|
|
62
|
+
function visit(directory) {
|
|
63
|
+
for (const name of readdirSync(directory).sort()) {
|
|
64
|
+
const path = join(directory, name);
|
|
65
|
+
const stats = statSync(path);
|
|
66
|
+
if (stats.isDirectory()) visit(path);
|
|
67
|
+
else if (stats.isFile()) {
|
|
68
|
+
const normalized = relative(pluginRoot, path).replaceAll("\\", "/");
|
|
69
|
+
if (![COPILOT_PAYLOAD_INVENTORY_FILE, INSTALLATION_PROVENANCE_FILE, LEGACY_LOCAL_INSTALL_FILE].includes(normalized)) actual.push(normalized);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
try { visit(pluginRoot); } catch { return { status: "invalid", reason: "copilot_payload_incomplete" }; }
|
|
74
|
+
if (JSON.stringify(actual.sort()) !== JSON.stringify([...destinations].sort())) {
|
|
75
|
+
return { status: "invalid", reason: "copilot_payload_inventory_mismatch" };
|
|
76
|
+
}
|
|
77
|
+
for (const entry of inventory.entries) {
|
|
78
|
+
const path = join(pluginRoot, entry.destination);
|
|
79
|
+
if (!existsSync(path) || digestFile(path) !== entry.digest || statSync(path).size !== entry.bytes) {
|
|
80
|
+
return { status: "invalid", reason: "copilot_payload_digest_mismatch", entry: entry.destination };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const excluded = actual.some((path) => path.startsWith("skills/") || path.startsWith(".codex-plugin/")
|
|
84
|
+
|| path.startsWith(".claude-plugin/") || path.startsWith("submission/")
|
|
85
|
+
|| path === "hooks/hooks.json" || path === "hooks/session-start.sh");
|
|
86
|
+
if (excluded) return { status: "invalid", reason: "copilot_payload_excluded_surface" };
|
|
87
|
+
return { status: "matched", inventory, inventoryDigest: digestFile(inventoryPath) };
|
|
88
|
+
}
|
|
89
|
+
|
|
44
90
|
export function digestNormalizedPluginSource(root, canonicalVersion) {
|
|
45
91
|
const files = [];
|
|
46
92
|
function visit(directory) {
|
|
@@ -148,6 +194,8 @@ export function inspectInstallationProvenance(pluginRoot, {
|
|
|
148
194
|
runtimeManifest,
|
|
149
195
|
pluginVersion,
|
|
150
196
|
allowLegacy = false,
|
|
197
|
+
profileId = "runtime-plugin",
|
|
198
|
+
inventoryDigest = null,
|
|
151
199
|
} = {}) {
|
|
152
200
|
const markerPath = join(pluginRoot, INSTALLATION_PROVENANCE_FILE);
|
|
153
201
|
const legacyPath = join(pluginRoot, LEGACY_LOCAL_INSTALL_FILE);
|
|
@@ -181,11 +229,12 @@ export function inspectInstallationProvenance(pluginRoot, {
|
|
|
181
229
|
if (!marker
|
|
182
230
|
|| marker.schema_version !== 1
|
|
183
231
|
|| marker.owner !== "create-agdf"
|
|
184
|
-
|| marker.profile_id !==
|
|
232
|
+
|| marker.profile_id !== profileId
|
|
185
233
|
|| marker.marketplace_id !== profile.contract.marketplaceIdentities.durable
|
|
186
234
|
|| marker.canonical_version !== definition.version
|
|
187
235
|
|| marker.codex_install_version !== pluginVersion
|
|
188
236
|
|| marker.runtime_digest !== runtimeManifest?.digest
|
|
237
|
+
|| (profileId === "copilot-runtime-plugin" && marker.inventory_digest !== inventoryDigest)
|
|
189
238
|
|| !/^[a-f0-9]{64}$/.test(marker.source_digest ?? "")) {
|
|
190
239
|
return { status: "invalid", reason: "installation_provenance_invalid", marker };
|
|
191
240
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema_version": "1",
|
|
3
3
|
"generated": true,
|
|
4
4
|
"source": "create-agdf/cli",
|
|
5
|
-
"version": "0.14.
|
|
5
|
+
"version": "0.14.2",
|
|
6
6
|
"entrypoint": "create-agdf/bin/agdf-validator.js",
|
|
7
|
-
"digest": "
|
|
7
|
+
"digest": "51035c8735d47aa727980d82709326071b372464ae077a1d269aadc0d30f2624"
|
|
8
8
|
}
|
|
@@ -681,6 +681,7 @@ if (pluginDefinition) {
|
|
|
681
681
|
const expectedProfiles = {
|
|
682
682
|
"source-development": { runtime: "absent", installable: false, machineValidation: "unavailable" },
|
|
683
683
|
"runtime-plugin": { runtime: "required", installable: true, machineValidation: "local_exact_version_digest" },
|
|
684
|
+
"copilot-runtime-plugin": { runtime: "required", installable: true, machineValidation: "local_exact_version_digest_inventory" },
|
|
684
685
|
"opencode-config-local": { runtime: "config_local_package", installable: true, machineValidation: "local_exact_version" },
|
|
685
686
|
"portable-skills": { runtime: "absent", installable: true, machineValidation: "unavailable_or_external_required" },
|
|
686
687
|
};
|
|
@@ -888,7 +889,7 @@ if (pluginDefinition) {
|
|
|
888
889
|
}
|
|
889
890
|
}
|
|
890
891
|
|
|
891
|
-
if (!sourceMode) {
|
|
892
|
+
if (!sourceMode && installationProvenance?.profile_id === "copilot-runtime-plugin") {
|
|
892
893
|
const copilotPlugin = isFile(copilotPluginPath) ? readJson(copilotPluginPath, "Copilot plugin manifest") : null;
|
|
893
894
|
const copilotHooks = isFile(copilotHooksPath) ? readJson(copilotHooksPath, "Copilot plugin hooks") : null;
|
|
894
895
|
if (!copilotPlugin) failures.push("installed runtime plugin must include root plugin.json for GitHub Copilot");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# AGDF 0.14.
|
|
1
|
+
# AGDF 0.14.2 — Initial OpenAI Public Plugin Candidate
|
|
2
2
|
|
|
3
3
|
This candidate packages the canonical AGDF workflow skills for public discovery in ChatGPT and
|
|
4
4
|
Codex. It helps users assess delivery fit, preserve explicit human approvals, inspect existing-system
|