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.
Files changed (112) hide show
  1. package/README.md +8 -2
  2. package/generated/plugins/agdf/.claude-plugin/plugin.json +1 -1
  3. package/generated/plugins/agdf/.codex-plugin/plugin.json +1 -1
  4. package/generated/plugins/agdf/meta/agdf-plugin.definition.json +6 -1
  5. package/generated/plugins/agdf/meta/copilot-payload-baseline.json +7 -0
  6. package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +6 -1
  7. package/generated/plugins/agdf/runtime/create-agdf/lib/runtime/local-validator.js +29 -17
  8. package/generated/plugins/agdf/runtime/create-agdf/lib/runtime/plugin-provenance.js +50 -1
  9. package/generated/plugins/agdf/runtime/create-agdf/package.json +1 -1
  10. package/generated/plugins/agdf/runtime/runtime-manifest.json +2 -2
  11. package/generated/plugins/agdf/scripts/check-runtime-integrity.mjs +2 -1
  12. package/generated/plugins/agdf/submission/openai/availability.md +1 -1
  13. package/generated/plugins/agdf/submission/openai/capability-matrix.json +1 -1
  14. package/generated/plugins/agdf/submission/openai/release-notes.md +1 -1
  15. package/generated/plugins/agdf/submission/openai/reviewer-cases.json +1 -1
  16. package/generated/plugins/copilot/agdf/.agdf-payload-inventory.json +771 -0
  17. package/generated/plugins/copilot/agdf/LICENSE +201 -0
  18. package/generated/plugins/copilot/agdf/meta/agdf-agent-router.md +129 -0
  19. package/generated/plugins/copilot/agdf/meta/agdf-constitution.md +329 -0
  20. package/generated/plugins/copilot/agdf/meta/agdf-plugin.definition.json +331 -0
  21. package/generated/plugins/copilot/agdf/meta/agdf-runtime-contract.md +16 -0
  22. package/generated/plugins/{agdf → copilot/agdf}/plugin.json +1 -1
  23. package/generated/plugins/copilot/agdf/runtime/agdf-local.js +18 -0
  24. package/generated/plugins/copilot/agdf/runtime/agdf-session-check.js +97 -0
  25. package/generated/plugins/copilot/agdf/runtime/create-agdf/NOTICE +10 -0
  26. package/generated/plugins/copilot/agdf/runtime/create-agdf/bin/agdf-validator.js +11 -0
  27. package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-interaction-locales.json +512 -0
  28. package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +331 -0
  29. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/command-registry.js +144 -0
  30. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/delivery-path-search-command.js +139 -0
  31. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/parse-args.js +173 -0
  32. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/runtime-context.js +83 -0
  33. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/validation-handlers.js +46 -0
  34. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/delivery-map.js +301 -0
  35. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/doctor.js +272 -0
  36. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/gate-check.js +455 -0
  37. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/gate-policy.js +305 -0
  38. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/parent-reconciliation.js +284 -0
  39. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/required-files.js +9 -0
  40. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/run-state.js +217 -0
  41. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/shared.js +345 -0
  42. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-evaluation/verified-change.js +156 -0
  43. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/aggregate.js +18 -0
  44. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/gate-approval-validator.js +49 -0
  45. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/index.js +7 -0
  46. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/legacy-migration.js +95 -0
  47. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/run-state-parser.js +265 -0
  48. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/run-state-repository.js +68 -0
  49. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/run-state-resolver.js +45 -0
  50. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/control-state/run-state-writer.js +97 -0
  51. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/candidate-policy.js +99 -0
  52. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/contracts.js +237 -0
  53. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/evaluators/claude.js +35 -0
  54. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/evaluators/codex.js +44 -0
  55. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/evaluators/opencode.js +234 -0
  56. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/evaluators/prompt.js +13 -0
  57. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/evaluators/protocol.js +13 -0
  58. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/generators/claude.js +40 -0
  59. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/generators/codex.js +38 -0
  60. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/generators/protocol.js +12 -0
  61. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/persistence.js +39 -0
  62. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/scoring.js +21 -0
  63. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/search-engine.js +155 -0
  64. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/state-adapter.js +161 -0
  65. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/surfaces/capabilities.js +27 -0
  66. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/delivery-path-search/transports/read-only-guard.js +43 -0
  67. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/interaction-presentation.js +842 -0
  68. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/runtime/local-validator.js +239 -0
  69. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/runtime/plugin-provenance.js +255 -0
  70. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/runtime/validator-application.js +40 -0
  71. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/runtime-check-consent/contract.js +73 -0
  72. package/generated/plugins/copilot/agdf/runtime/create-agdf/package.json +6 -0
  73. package/generated/plugins/copilot/agdf/runtime/runtime-manifest.json +8 -0
  74. package/generated/submissions/openai/agdf/.codex-plugin/plugin.json +1 -1
  75. package/generated/submissions/openai/agdf/meta/agdf-plugin.definition.json +6 -1
  76. package/generated/submissions/openai/agdf/meta/copilot-payload-baseline.json +7 -0
  77. package/generated/submissions/openai/agdf/submission/openai/availability.md +1 -1
  78. package/generated/submissions/openai/agdf/submission/openai/capability-matrix.json +1 -1
  79. package/generated/submissions/openai/agdf/submission/openai/inventory.json +13 -9
  80. package/generated/submissions/openai/agdf/submission/openai/listing.json +1 -1
  81. package/generated/submissions/openai/agdf/submission/openai/readiness.json +2 -2
  82. package/generated/submissions/openai/agdf/submission/openai/readiness.md +2 -2
  83. package/generated/submissions/openai/agdf/submission/openai/release-notes.md +1 -1
  84. package/generated/submissions/openai/agdf/submission/openai/reviewer-cases.json +1 -1
  85. package/lib/installers/local-marketplace.js +112 -30
  86. package/lib/installers/plugin-installers.js +45 -9
  87. package/lib/public-plugin/copilot-profile.js +126 -0
  88. package/lib/release/version-coherence.js +4 -1
  89. package/lib/runtime/local-validator.js +29 -17
  90. package/lib/runtime/plugin-provenance.js +50 -1
  91. package/package.json +3 -2
  92. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-brownfield-analysis/SKILL.md +0 -0
  93. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-clean-implementation-review/SKILL.md +0 -0
  94. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-code-review/SKILL.md +0 -0
  95. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-delivery-closeout/SKILL.md +0 -0
  96. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-delivery-path-search/SKILL.md +0 -0
  97. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-gate-check/SKILL.md +0 -0
  98. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-interaction-locales.json +0 -0
  99. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-qa-gate/SKILL.md +0 -0
  100. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-release-or/SKILL.md +0 -0
  101. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-runtime-contract.md +0 -0
  102. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-task-plan-review/SKILL.md +0 -0
  103. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/agdf-ux-intent-definition/SKILL.md +0 -0
  104. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/closeout.md +0 -0
  105. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/context-graph.md +0 -0
  106. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/control-scaffold.md +0 -0
  107. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/gate-transition.md +0 -0
  108. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/interaction.md +0 -0
  109. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/modes.md +0 -0
  110. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/quality.md +0 -0
  111. /package/generated/plugins/{agdf → copilot/agdf}/copilot-skills/contracts/task-target-resolution.md +0 -0
  112. /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`, `claude` and `copilot` commands install from the complete plugin built into the released
151
- `create-agdf` package. They atomically stage it under an AGDF-owned user-data marketplace, register
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.1",
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,6 +1,6 @@
1
1
  {
2
2
  "name": "agdf",
3
- "version": "0.14.1",
3
+ "version": "0.14.2",
4
4
  "description": "Control layer for governed AI-assisted delivery.",
5
5
  "author": {
6
6
  "name": "Arndt Gold",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "id": "agdf",
4
- "version": "0.14.1",
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.1",
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 pluginVersion = codexManifest?.version ?? null;
87
- if (!codexManifest || !claudeManifest || claudeManifest.version !== definition.version) {
88
- return { envelope: envelope("version_mismatch", options, { source: "plugin_bundle", pluginRoot, pluginVersion, canonicalVersion: definition.version, distributionProfile: "runtime-plugin", provenanceStatus: "invalid", reason: "manifest_invalid" }) };
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: "runtime-plugin", reason: "runtime_missing" }) };
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: "runtime-plugin" }) };
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: "runtime-plugin", reason: "runtime_digest_mismatch" }) };
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: "runtime-plugin", reason: "invalid_entrypoint" }) };
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: "runtime-plugin", reason: "entrypoint_missing" }) };
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: "runtime-plugin",
134
- evidencePlane: "loaded_session",
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: "runtime-plugin",
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
- || canonicalPath(generatedRepository.pluginRoot) !== pluginRoot) {
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: "runtime-plugin",
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: "runtime-plugin",
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 !== "runtime-plugin"
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
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agdf/local-validator-runtime",
3
- "version": "0.14.1",
3
+ "version": "0.14.2",
4
4
  "private": true,
5
5
  "type": "module"
6
6
  }
@@ -2,7 +2,7 @@
2
2
  "schema_version": "1",
3
3
  "generated": true,
4
4
  "source": "create-agdf/cli",
5
- "version": "0.14.1",
5
+ "version": "0.14.2",
6
6
  "entrypoint": "create-agdf/bin/agdf-validator.js",
7
- "digest": "724174653ad423b30654aa64a34e1699a18cc67037172c10aa249d1d61087116"
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,6 +1,6 @@
1
1
  # Availability Decision Record
2
2
 
3
- - release: `0.14.1`
3
+ - release: `0.14.2`
4
4
  - decision_state: `pending`
5
5
  - decision_owner: verified publisher
6
6
  - countries: not selected
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "releaseVersion": "0.14.1",
3
+ "releaseVersion": "0.14.2",
4
4
  "evidenceStates": [
5
5
  "common",
6
6
  "codex-specific",
@@ -1,4 +1,4 @@
1
- # AGDF 0.14.1 — Initial OpenAI Public Plugin Candidate
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "releaseVersion": "0.14.1",
3
+ "releaseVersion": "0.14.2",
4
4
  "cases": [
5
5
  {
6
6
  "id": "positive-proportional-fit",