create-agdf 0.13.8 → 0.14.1
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 +7 -9
- package/generated/plugins/agdf/.claude-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/.codex-plugin/plugin.json +2 -4
- package/generated/plugins/agdf/hooks/copilot-hooks.json +15 -0
- package/generated/plugins/agdf/meta/agdf-plugin.definition.json +21 -2
- package/generated/plugins/agdf/plugin.json +22 -0
- package/generated/plugins/agdf/runtime/agdf-local.js +1 -1
- package/generated/plugins/agdf/runtime/agdf-session-check.js +10 -5
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +21 -2
- package/generated/plugins/agdf/runtime/create-agdf/lib/cli/command-registry.js +6 -7
- package/generated/plugins/agdf/runtime/create-agdf/lib/runtime-check-consent/contract.js +3 -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 +31 -3
- 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/submissions/openai/agdf/.codex-plugin/plugin.json +1 -2
- package/generated/submissions/openai/agdf/meta/agdf-plugin.definition.json +21 -2
- 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 +9 -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/cli/application.js +64 -8
- package/lib/cli/command-registry.js +6 -7
- package/lib/installers/copilot-precedence.js +34 -0
- package/lib/installers/copilot-settings.js +84 -0
- package/lib/installers/plugin-installers.js +147 -4
- package/lib/lifecycle/operations.js +3 -0
- package/lib/lifecycle/result.js +1 -0
- package/lib/lifecycle/status.js +3 -3
- package/lib/public-plugin/manifest.js +34 -2
- package/lib/public-plugin/validator.js +1 -1
- package/lib/release/version-coherence.js +1 -0
- package/lib/runtime-check-consent/contract.js +3 -1
- package/lib/runtime-check-consent/coordinator.js +1 -0
- package/lib/runtime-check-consent/service.js +1 -1
- package/lib/runtime-check-consent/state.js +3 -3
- package/lib/scaffold/plan.js +3 -89
- package/lib/scaffold/presentation.js +3 -22
- package/package.json +5 -3
- package/generated/.github/copilot-instructions.md +0 -16
- package/generated/.github/instructions/agdf-governance.instructions.md +0 -14
- package/generated/.github/skills/README.md +0 -20
- package/generated/AGENTS.md +0 -113
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-brownfield-analysis/SKILL.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-clean-implementation-review/SKILL.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-code-review/SKILL.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-delivery-closeout/SKILL.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-delivery-path-search/SKILL.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-gate-check/SKILL.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-interaction-locales.json +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-qa-gate/SKILL.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-release-or/SKILL.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-runtime-contract.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-task-plan-review/SKILL.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/agdf-ux-intent-definition/SKILL.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/contracts/closeout.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/contracts/context-graph.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/contracts/control-scaffold.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/contracts/gate-transition.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/contracts/interaction.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/contracts/modes.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/contracts/quality.md +0 -0
- /package/generated/{.github/skills → plugins/agdf/copilot-skills}/contracts/task-target-resolution.md +0 -0
package/README.md
CHANGED
|
@@ -24,10 +24,12 @@ Use a different target when Codex is not your agent surface:
|
|
|
24
24
|
| Surface or goal | Start with | What it gives you |
|
|
25
25
|
|---|---|---|
|
|
26
26
|
| Claude Code | `npx --yes @agdf/cli@latest claude` | The AGDF plugin for Claude Code. |
|
|
27
|
+
| GitHub Copilot | `npx --yes @agdf/cli@latest copilot` | The AGDF plugin with prefixed skills and a consent-bound session hook. |
|
|
27
28
|
| OpenCode, user-wide discovery | `npx --yes @agdf/cli@latest opencode` | The npm plugin and global native skills; repository governance remains opt-in. |
|
|
28
29
|
| OpenCode, one repository | `npx --yes @agdf/cli@latest opencode-repo` | Durable control configuration that activates the once-installed global runtime. |
|
|
30
|
+
| Durable control state in an existing setup | `npx --yes @agdf/cli@latest init` | Live `.agdf/control/` state when the repository explicitly needs it. |
|
|
29
31
|
|
|
30
|
-
The runtime-bearing `codex`, `claude` and `opencode` installers ask before enabling narrow automatic
|
|
32
|
+
The runtime-bearing `codex`, `claude`, `copilot` and `opencode` installers ask before enabling narrow automatic
|
|
31
33
|
local checks on an interactive terminal. The choices are `enable`, `manual` and `cancel`; enablement
|
|
32
34
|
is never preselected. Every interactive installation or update asks again. A previous choice is
|
|
33
35
|
shown only as intent, never as proof of effective host permission. The prompt shows the target AGDF
|
|
@@ -51,8 +53,6 @@ from AGDF gate approval. A receipt alone never proves effective host permission.
|
|
|
51
53
|
Claude deny/ask precedence and all explicit OpenCode permissions remain authoritative. The public
|
|
52
54
|
Skills-only OpenAI candidate has no runtime or hooks and therefore remains manual/external for this
|
|
53
55
|
capability.
|
|
54
|
-
| GitHub Copilot | `npx --yes @agdf/cli@latest copilot` | Repository instructions, visible skills and control templates. |
|
|
55
|
-
| Durable control state in an existing setup | `npx --yes @agdf/cli@latest init` | Live `.agdf/control/` state when the repository explicitly needs it. |
|
|
56
56
|
|
|
57
57
|
For prerequisites, all surface-specific flows and operational boundaries, use the authoritative [installation guide](../INSTALL.md). Do not run `init` merely to ask a fresh question: an agent can first clarify the request and ask for `Approval: UR` when durable control state is needed.
|
|
58
58
|
|
|
@@ -66,6 +66,7 @@ Installation, activation and explicit lifecycle changes:
|
|
|
66
66
|
npx --yes @agdf/cli@latest codex
|
|
67
67
|
npx --yes @agdf/cli@latest codex-repo
|
|
68
68
|
npx --yes @agdf/cli@latest claude
|
|
69
|
+
npx --yes @agdf/cli@latest copilot
|
|
69
70
|
npx --yes @agdf/cli@latest opencode
|
|
70
71
|
npx --yes @agdf/cli@latest opencode-status
|
|
71
72
|
npx --yes @agdf/cli@latest opencode-repo
|
|
@@ -104,11 +105,9 @@ Backward-compatible scaffold usage:
|
|
|
104
105
|
npm create agdf@latest -- codex
|
|
105
106
|
npm create agdf@latest -- codex-repo
|
|
106
107
|
npm create agdf@latest -- claude
|
|
107
|
-
npm create agdf@latest -- copilot
|
|
108
108
|
npm create agdf@latest -- opencode
|
|
109
109
|
npm create agdf@latest -- opencode-status
|
|
110
110
|
npm create agdf@latest -- opencode-repo
|
|
111
|
-
npm create agdf@latest -- both
|
|
112
111
|
npm create agdf@latest -- init
|
|
113
112
|
npm create agdf@latest -- config --language en
|
|
114
113
|
npm create agdf@latest -- doctor
|
|
@@ -138,7 +137,7 @@ it does not localize the CLI lifecycle card.
|
|
|
138
137
|
- `codex` installs the AGDF plugin globally for Codex
|
|
139
138
|
- `codex-repo` writes a repository-local Codex marketplace under `.agents/plugins/` and a local AGDF plugin copy under `plugins/agdf/`
|
|
140
139
|
- `claude` installs the AGDF plugin globally for Claude Code
|
|
141
|
-
- `copilot`
|
|
140
|
+
- `copilot` registers the AGDF-owned local Marketplace and installs `agdf@agdf` through Copilot CLI; when `copilot` is not on `PATH`, it runs the pinned official `@github/copilot` CLI package through npm, then verifies AGDF in Copilot's own plugin list
|
|
142
141
|
- `opencode` installs the AGDF npm plugin and ten native skills as a user-wide OpenCode surface
|
|
143
142
|
- `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
|
|
144
143
|
- `status` reports installation, repository activation and delivery separately without mutating state
|
|
@@ -146,10 +145,9 @@ it does not localize the CLI lifecycle card.
|
|
|
146
145
|
- `disable` writes a supported repository-local opt-out while retaining global capability and durable control state
|
|
147
146
|
- `uninstall` previews and, only with `--confirm`, applies a selected global removal through supported native/owned operations
|
|
148
147
|
- `opencode-repo` writes durable AGDF control configuration and templates under `.agdf/control/`; it does not copy a second OpenCode runtime surface
|
|
149
|
-
- `both` writes the Codex repository-local marketplace plus the Copilot-facing repository files
|
|
150
148
|
- `config` writes or updates only `.agdf/control/config.json` for an already installed plugin or an existing repository
|
|
151
149
|
|
|
152
|
-
The `codex` and `
|
|
150
|
+
The `codex`, `claude` and `copilot` commands install from the complete plugin built into the released
|
|
153
151
|
`create-agdf` package. They atomically stage it under an AGDF-owned user-data marketplace, register
|
|
154
152
|
that stable local path through the host CLI and verify the exposed version. Source `plugin/` therefore
|
|
155
153
|
contains no generated runtime bytes and the source checkout exposes no installable root marketplace.
|
|
@@ -159,7 +157,7 @@ checkout, npm cache, PATH or registry. Rerunning either command performs the exp
|
|
|
159
157
|
migrates only the exact known legacy AGDF GitHub marketplace; foreign same-name registrations fail
|
|
160
158
|
closed and failed host operations restore the prior owned stage.
|
|
161
159
|
|
|
162
|
-
|
|
160
|
+
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.
|
|
163
161
|
|
|
164
162
|
Use the `codex-repo` target when AGDF should be available only inside one repository instead of being installed as a personal/global Codex plugin.
|
|
165
163
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agdf",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
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.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"description": "Control layer for governed AI-assisted delivery.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Arndt Gold",
|
|
@@ -30,7 +30,6 @@
|
|
|
30
30
|
"websiteURL": "https://agdf.iself.eu",
|
|
31
31
|
"privacyPolicyURL": "https://agdf.iself.eu/privacy",
|
|
32
32
|
"termsOfServiceURL": "https://agdf.iself.eu/terms",
|
|
33
|
-
"supportURL": "https://agdf.iself.eu/support",
|
|
34
33
|
"composerIcon": "./assets/agdf-icon.svg",
|
|
35
34
|
"logo": "./assets/agdf-logo.svg",
|
|
36
35
|
"defaultPrompt": [
|
|
@@ -39,6 +38,5 @@
|
|
|
39
38
|
"Close this delivery run with an auditable AGDF report."
|
|
40
39
|
],
|
|
41
40
|
"brandColor": "#14B8A6"
|
|
42
|
-
}
|
|
43
|
-
"hooks": "./hooks/hooks.json"
|
|
41
|
+
}
|
|
44
42
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"id": "agdf",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.14.1",
|
|
5
5
|
"displayName": "AI Governance & Delivery Framework",
|
|
6
6
|
"developerName": "Arndt Gold",
|
|
7
7
|
"description": "Control layer for governed AI-assisted delivery.",
|
|
@@ -50,7 +50,10 @@
|
|
|
50
50
|
},
|
|
51
51
|
"copilot": {
|
|
52
52
|
"skillPrefix": "agdf-",
|
|
53
|
-
"runtimeContractFileName": "agdf-runtime-contract.md"
|
|
53
|
+
"runtimeContractFileName": "agdf-runtime-contract.md",
|
|
54
|
+
"pluginManifest": "plugin.json",
|
|
55
|
+
"skills": "copilot-skills/",
|
|
56
|
+
"hooks": "hooks/copilot-hooks.json"
|
|
54
57
|
},
|
|
55
58
|
"opencode": {
|
|
56
59
|
"skillPrefix": "agdf-",
|
|
@@ -87,6 +90,7 @@
|
|
|
87
90
|
"surfaces": {
|
|
88
91
|
"codex": "native-hook-review",
|
|
89
92
|
"claude": "exact-command-rule",
|
|
93
|
+
"copilot": "plugin-hook-review",
|
|
90
94
|
"opencode": "plugin-internal",
|
|
91
95
|
"portable-skills": "manual-external-required"
|
|
92
96
|
}
|
|
@@ -143,6 +147,21 @@
|
|
|
143
147
|
"authorizationPath": "exact_text",
|
|
144
148
|
"technicalPermissionOwner": "claude_host"
|
|
145
149
|
},
|
|
150
|
+
"copilot": {
|
|
151
|
+
"questionAdapter": "exact_text",
|
|
152
|
+
"availability": "always",
|
|
153
|
+
"gateSafety": "wait_for_deliberate_user_input",
|
|
154
|
+
"explicitOutcomes": [
|
|
155
|
+
"approve",
|
|
156
|
+
"revise",
|
|
157
|
+
"decline",
|
|
158
|
+
"cancel"
|
|
159
|
+
],
|
|
160
|
+
"approvalValueTransport": "exact_option_value",
|
|
161
|
+
"waitSafety": "deliberate_no_auto_resolution",
|
|
162
|
+
"authorizationPath": "exact_text",
|
|
163
|
+
"technicalPermissionOwner": "copilot_host"
|
|
164
|
+
},
|
|
146
165
|
"opencode": {
|
|
147
166
|
"questionAdapter": "question",
|
|
148
167
|
"availability": "when_permission_question_allows",
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agdf",
|
|
3
|
+
"version": "0.14.1",
|
|
4
|
+
"description": "Control layer for governed AI-assisted delivery.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Arndt Gold",
|
|
7
|
+
"url": "https://agdf.iself.eu"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://agdf.iself.eu",
|
|
10
|
+
"repository": "https://github.com/arndtgold/ai-native-governance-delivery-framework",
|
|
11
|
+
"license": "Apache-2.0",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"agentic",
|
|
14
|
+
"governance",
|
|
15
|
+
"delivery",
|
|
16
|
+
"ai-native",
|
|
17
|
+
"brownfield"
|
|
18
|
+
],
|
|
19
|
+
"category": "Productivity",
|
|
20
|
+
"skills": "copilot-skills/",
|
|
21
|
+
"hooks": "hooks/copilot-hooks.json"
|
|
22
|
+
}
|
|
@@ -12,7 +12,7 @@ const manifest = JSON.parse(readFileSync(new URL("./runtime-manifest.json", impo
|
|
|
12
12
|
process.exitCode = runLocalValidator({
|
|
13
13
|
runtimeRoot,
|
|
14
14
|
pluginRoot,
|
|
15
|
-
expectedPluginRoot: process.env.CLAUDE_PLUGIN_ROOT || undefined,
|
|
15
|
+
expectedPluginRoot: process.env.CLAUDE_PLUGIN_ROOT || process.env.PLUGIN_ROOT || undefined,
|
|
16
16
|
expectedVersion: manifest.version,
|
|
17
17
|
surface: process.env.AGDF_SURFACE || "plugin",
|
|
18
18
|
}, process.argv.slice(2));
|
|
@@ -15,7 +15,7 @@ if (process.argv.length !== 2) {
|
|
|
15
15
|
process.exitCode = 2;
|
|
16
16
|
} else {
|
|
17
17
|
const surface = process.env.AGDF_SURFACE
|
|
18
|
-
|| (process.env.CLAUDE_PLUGIN_ROOT ? "claude" : process.env.PLUGIN_ROOT ? "codex" : "");
|
|
18
|
+
|| (process.env.CLAUDE_PLUGIN_ROOT ? "claude" : process.env.COPILOT_PLUGIN_DATA ? "copilot" : process.env.PLUGIN_ROOT ? "codex" : "");
|
|
19
19
|
const dataRoot = process.env.AGDF_DATA_DIR
|
|
20
20
|
|| (process.platform === "darwin"
|
|
21
21
|
? join(homedir(), "Library", "Application Support", "agdf")
|
|
@@ -23,7 +23,7 @@ if (process.argv.length !== 2) {
|
|
|
23
23
|
? join(process.env.LOCALAPPDATA || process.env.APPDATA || join(homedir(), "AppData", "Local"), "agdf")
|
|
24
24
|
: join(process.env.XDG_DATA_HOME || join(homedir(), ".local", "share"), "agdf"));
|
|
25
25
|
let consentEnabled = false;
|
|
26
|
-
if (["codex", "claude", "opencode"].includes(surface)) {
|
|
26
|
+
if (["codex", "claude", "copilot", "opencode"].includes(surface)) {
|
|
27
27
|
try {
|
|
28
28
|
const receipt = JSON.parse(readFileSync(join(dataRoot, "runtime-checks", `${surface}.json`), "utf8"));
|
|
29
29
|
consentEnabled = receipt?.schema_version === 1
|
|
@@ -31,7 +31,7 @@ if (process.argv.length !== 2) {
|
|
|
31
31
|
&& receipt?.capability_id === "automatic-runtime-checks"
|
|
32
32
|
&& receipt?.surface === surface
|
|
33
33
|
&& receipt?.requested_state === "enabled";
|
|
34
|
-
if (consentEnabled && ["codex", "claude"].includes(surface)) {
|
|
34
|
+
if (consentEnabled && ["codex", "claude", "copilot"].includes(surface)) {
|
|
35
35
|
const pluginRoot = fileURLToPath(new URL("../", import.meta.url));
|
|
36
36
|
const manifest = JSON.parse(readFileSync(new URL("./runtime-manifest.json", import.meta.url), "utf8"));
|
|
37
37
|
const definition = JSON.parse(readFileSync(new URL("../meta/agdf-plugin.definition.json", import.meta.url), "utf8"));
|
|
@@ -74,7 +74,7 @@ if (process.argv.length !== 2) {
|
|
|
74
74
|
configHint = "Project config: .agdf/control/config.json is invalid. Run the surface-local doctor command manually.";
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
|
-
|
|
77
|
+
const additionalContext = [
|
|
78
78
|
"AGDF active.",
|
|
79
79
|
"",
|
|
80
80
|
message,
|
|
@@ -87,6 +87,11 @@ if (process.argv.length !== 2) {
|
|
|
87
87
|
`- ${join(pluginRoot, "meta", "agdf-agent-router.md")}`,
|
|
88
88
|
`- ${join(pluginRoot, "meta", "agdf-constitution.md")}`,
|
|
89
89
|
`- ${join(pluginRoot, "meta", "agdf-runtime-contract.md")}`,
|
|
90
|
-
].join("\n")
|
|
90
|
+
].join("\n");
|
|
91
|
+
if (surface === "copilot") {
|
|
92
|
+
console.log(JSON.stringify({ additionalContext }));
|
|
93
|
+
} else {
|
|
94
|
+
console.log(additionalContext);
|
|
95
|
+
}
|
|
91
96
|
process.exitCode = 0;
|
|
92
97
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"id": "agdf",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.14.1",
|
|
5
5
|
"displayName": "AI Governance & Delivery Framework",
|
|
6
6
|
"developerName": "Arndt Gold",
|
|
7
7
|
"description": "Control layer for governed AI-assisted delivery.",
|
|
@@ -50,7 +50,10 @@
|
|
|
50
50
|
},
|
|
51
51
|
"copilot": {
|
|
52
52
|
"skillPrefix": "agdf-",
|
|
53
|
-
"runtimeContractFileName": "agdf-runtime-contract.md"
|
|
53
|
+
"runtimeContractFileName": "agdf-runtime-contract.md",
|
|
54
|
+
"pluginManifest": "plugin.json",
|
|
55
|
+
"skills": "copilot-skills/",
|
|
56
|
+
"hooks": "hooks/copilot-hooks.json"
|
|
54
57
|
},
|
|
55
58
|
"opencode": {
|
|
56
59
|
"skillPrefix": "agdf-",
|
|
@@ -87,6 +90,7 @@
|
|
|
87
90
|
"surfaces": {
|
|
88
91
|
"codex": "native-hook-review",
|
|
89
92
|
"claude": "exact-command-rule",
|
|
93
|
+
"copilot": "plugin-hook-review",
|
|
90
94
|
"opencode": "plugin-internal",
|
|
91
95
|
"portable-skills": "manual-external-required"
|
|
92
96
|
}
|
|
@@ -143,6 +147,21 @@
|
|
|
143
147
|
"authorizationPath": "exact_text",
|
|
144
148
|
"technicalPermissionOwner": "claude_host"
|
|
145
149
|
},
|
|
150
|
+
"copilot": {
|
|
151
|
+
"questionAdapter": "exact_text",
|
|
152
|
+
"availability": "always",
|
|
153
|
+
"gateSafety": "wait_for_deliberate_user_input",
|
|
154
|
+
"explicitOutcomes": [
|
|
155
|
+
"approve",
|
|
156
|
+
"revise",
|
|
157
|
+
"decline",
|
|
158
|
+
"cancel"
|
|
159
|
+
],
|
|
160
|
+
"approvalValueTransport": "exact_option_value",
|
|
161
|
+
"waitSafety": "deliberate_no_auto_resolution",
|
|
162
|
+
"authorizationPath": "exact_text",
|
|
163
|
+
"technicalPermissionOwner": "copilot_host"
|
|
164
|
+
},
|
|
146
165
|
"opencode": {
|
|
147
166
|
"questionAdapter": "question",
|
|
148
167
|
"availability": "when_permission_question_allows",
|
|
@@ -13,15 +13,14 @@ export const commandRegistry = Object.freeze([
|
|
|
13
13
|
command("codex", { preferred: [""], scaffold: [""] }),
|
|
14
14
|
command("codex-repo", { preferred: [""], scaffold: [""] }),
|
|
15
15
|
command("claude", { preferred: [""], scaffold: [""] }),
|
|
16
|
-
command("copilot", { preferred: [""]
|
|
16
|
+
command("copilot", { preferred: [""] }),
|
|
17
17
|
command("opencode", { preferred: [""], scaffold: [""] }),
|
|
18
18
|
command("opencode-status", { preferred: [""], scaffold: [""] }),
|
|
19
19
|
command("status", { preferred: [" [--surface <surface>] [--run <run_id>] [--json]"] }),
|
|
20
|
-
command("runtime-checks", { preferred: [" <status|enable|manual> --surface <codex|claude|opencode> [--json]"] }),
|
|
20
|
+
command("runtime-checks", { preferred: [" <status|enable|manual> --surface <codex|claude|copilot|opencode> [--json]"] }),
|
|
21
21
|
command("disable", { preferred: [" --surface <surface> [--scope repository] [--dir <path>]"] }),
|
|
22
22
|
command("uninstall", { preferred: [" --surface <surface> --scope global [--confirm]"] }),
|
|
23
23
|
command("opencode-repo", { preferred: [""], scaffold: [""] }),
|
|
24
|
-
command("both", { scaffold: [""] }),
|
|
25
24
|
command("init", { preferred: [""], scaffold: [""] }),
|
|
26
25
|
command("config", { scaffold: [" --language de"] }),
|
|
27
26
|
command("doctor", { local: [""], scaffold: [""], legacy: [" --json"] }),
|
|
@@ -66,11 +65,11 @@ export function validateCommandOptions(options) {
|
|
|
66
65
|
throw new Error("uninstall requires explicit --scope global");
|
|
67
66
|
}
|
|
68
67
|
if (options.confirm && options.target !== "uninstall") throw new Error("--confirm is supported only by uninstall");
|
|
69
|
-
if (options.runtimeChecksDecision && !["codex", "claude", "opencode"].includes(options.target)) {
|
|
70
|
-
throw new Error("--runtime-checks is supported only by codex, claude and opencode installation commands");
|
|
68
|
+
if (options.runtimeChecksDecision && !["codex", "claude", "copilot", "opencode"].includes(options.target)) {
|
|
69
|
+
throw new Error("--runtime-checks is supported only by codex, claude, copilot and opencode installation commands");
|
|
71
70
|
}
|
|
72
|
-
if (options.target === "runtime-checks" && !["codex", "claude", "opencode"].includes(options.surface)) {
|
|
73
|
-
throw new Error("runtime-checks requires --surface codex, claude or opencode");
|
|
71
|
+
if (options.target === "runtime-checks" && !["codex", "claude", "copilot", "opencode"].includes(options.surface)) {
|
|
72
|
+
throw new Error("runtime-checks requires --surface codex, claude, copilot or opencode");
|
|
74
73
|
}
|
|
75
74
|
if (options.approvalEnvelope && options.target !== "gate-check") throw new Error("--approval-envelope is supported only by gate-check");
|
|
76
75
|
if (options.approvalEnvelope && (options.json || options.statusCard || options.allActive)) {
|
|
@@ -32,6 +32,7 @@ export function validateRuntimeCheckCapability(capability) {
|
|
|
32
32
|
}
|
|
33
33
|
const surfaces = capability.surfaces ?? {};
|
|
34
34
|
if (surfaces.codex !== "native-hook-review" || surfaces.claude !== "exact-command-rule"
|
|
35
|
+
|| surfaces.copilot !== "plugin-hook-review"
|
|
35
36
|
|| surfaces.opencode !== "plugin-internal"
|
|
36
37
|
|| surfaces["portable-skills"] !== "manual-external-required") {
|
|
37
38
|
throw new Error("AGDF_RUNTIME_CHECK_CAPABILITY_INVALID: surface contract");
|
|
@@ -41,7 +42,7 @@ export function validateRuntimeCheckCapability(capability) {
|
|
|
41
42
|
|
|
42
43
|
export function runtimeCheckCapabilityIdentity({ capability, surface, runtimeDigest, sourceDigest, command }) {
|
|
43
44
|
validateRuntimeCheckCapability(capability);
|
|
44
|
-
if (!["codex", "claude", "opencode"].includes(surface)) throw new Error("AGDF_RUNTIME_CHECK_SURFACE_INVALID");
|
|
45
|
+
if (!["codex", "claude", "copilot", "opencode"].includes(surface)) throw new Error("AGDF_RUNTIME_CHECK_SURFACE_INVALID");
|
|
45
46
|
for (const [name, value] of Object.entries({ runtimeDigest, sourceDigest })) {
|
|
46
47
|
if (typeof value !== "string" || !/^[a-f0-9]{64}$/.test(value)) throw new Error(`AGDF_RUNTIME_CHECK_IDENTITY_INVALID: ${name}`);
|
|
47
48
|
}
|
|
@@ -59,6 +60,7 @@ export function runtimeCheckCapabilityIdentity({ capability, surface, runtimeDig
|
|
|
59
60
|
|
|
60
61
|
export function fixedRuntimeCheckCommand(surface, pluginRoot, platform = process.platform) {
|
|
61
62
|
if (surface === "opencode") return "plugin:agdf:automatic-runtime-checks";
|
|
63
|
+
if (surface === "copilot") return 'node "${PLUGIN_ROOT}/runtime/agdf-session-check.js"';
|
|
62
64
|
if (surface === "codex" || surface === "claude") {
|
|
63
65
|
return platform === "win32"
|
|
64
66
|
? "node \"$([Environment]::GetEnvironmentVariable('PLUGIN_ROOT') + [Environment]::GetEnvironmentVariable('CLAUDE_PLUGIN_ROOT'))\\runtime\\agdf-session-check.js\""
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema_version": "1",
|
|
3
3
|
"generated": true,
|
|
4
4
|
"source": "create-agdf/cli",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.14.1",
|
|
6
6
|
"entrypoint": "create-agdf/bin/agdf-validator.js",
|
|
7
|
-
"digest": "
|
|
7
|
+
"digest": "724174653ad423b30654aa64a34e1699a18cc67037172c10aa249d1d61087116"
|
|
8
8
|
}
|
|
@@ -96,6 +96,8 @@ const codexSourceMarketplacePath = sourceMode ? join(repoRoot, ".agents", "plugi
|
|
|
96
96
|
const claudeSourceMarketplacePath = sourceMode ? join(repoRoot, ".claude-plugin", "marketplace.json") : null;
|
|
97
97
|
const codexPluginPath = join(pluginRoot, ".codex-plugin", "plugin.json");
|
|
98
98
|
const claudePluginPath = join(pluginRoot, ".claude-plugin", "plugin.json");
|
|
99
|
+
const copilotPluginPath = join(pluginRoot, "plugin.json");
|
|
100
|
+
const copilotHooksPath = join(pluginRoot, "hooks", "copilot-hooks.json");
|
|
99
101
|
const installationProvenancePath = join(pluginRoot, ".agdf-installation.json");
|
|
100
102
|
const legacyLocalInstallMarkerPath = join(pluginRoot, ".agdf-local-install.json");
|
|
101
103
|
const pluginDefinitionPath = join(pluginRoot, "meta", "agdf-plugin.definition.json");
|
|
@@ -632,6 +634,9 @@ if (pluginDefinition) {
|
|
|
632
634
|
if (pluginDefinition.codex?.logo !== "./assets/agdf-logo.svg") failures.push("canonical AGDF plugin definition Codex logo must point to ./assets/agdf-logo.svg");
|
|
633
635
|
if (pluginDefinition.claude?.agentRouter !== "meta/agdf-agent-router.md") failures.push("canonical AGDF plugin definition Claude agent router must point to meta/agdf-agent-router.md");
|
|
634
636
|
if (pluginDefinition.copilot?.skillPrefix !== "agdf-") failures.push("canonical AGDF plugin definition Copilot skill prefix must be agdf-");
|
|
637
|
+
if (pluginDefinition.copilot?.pluginManifest !== "plugin.json" || pluginDefinition.copilot?.skills !== "copilot-skills/" || pluginDefinition.copilot?.hooks !== "hooks/copilot-hooks.json") {
|
|
638
|
+
failures.push("canonical AGDF plugin definition Copilot paths must point to the generated root manifest, prefixed skills and hook config");
|
|
639
|
+
}
|
|
635
640
|
if (pluginDefinition.opencode?.skillPrefix !== "agdf-") failures.push("canonical AGDF plugin definition OpenCode skill prefix must be agdf-");
|
|
636
641
|
if (pluginDefinition.opencode?.globalSkillPrefix !== "agdf-global-") failures.push("canonical AGDF plugin definition OpenCode global skill prefix must be agdf-global-");
|
|
637
642
|
if (pluginDefinition.opencode?.runtimeContractFileName !== "agdf-runtime-contract.md") failures.push("canonical AGDF plugin definition OpenCode runtime contract filename must be agdf-runtime-contract.md");
|
|
@@ -651,6 +656,7 @@ if (pluginDefinition) {
|
|
|
651
656
|
for (const [surface, adapter, safety] of [
|
|
652
657
|
["codex", "request_user_input", "omit_auto_resolution"],
|
|
653
658
|
["claude", "AskUserQuestion", "no_timeout_or_hook_supplied_answer"],
|
|
659
|
+
["copilot", "exact_text", "wait_for_deliberate_user_input"],
|
|
654
660
|
["opencode", "question", "preserve_explicit_deny"],
|
|
655
661
|
["fallback", "exact_text", "wait_for_deliberate_user_input"],
|
|
656
662
|
]) {
|
|
@@ -658,7 +664,7 @@ if (pluginDefinition) {
|
|
|
658
664
|
if (interaction?.questionAdapter !== adapter || interaction?.gateSafety !== safety || !interaction?.technicalPermissionOwner) {
|
|
659
665
|
failures.push(`canonical AGDF plugin definition ${surface} interaction mapping must declare adapter, gate safety and technical permission owner`);
|
|
660
666
|
}
|
|
661
|
-
const expectedOutcomes =
|
|
667
|
+
const expectedOutcomes = ["copilot", "fallback"].includes(surface) ? ["approve", "revise", "decline", "cancel"] : ["approve", "revise", "decline"];
|
|
662
668
|
if (JSON.stringify(interaction?.explicitOutcomes) !== JSON.stringify(expectedOutcomes)) {
|
|
663
669
|
failures.push(`canonical AGDF plugin definition ${surface} interaction mapping must preserve stable explicit outcome order`);
|
|
664
670
|
}
|
|
@@ -784,13 +790,13 @@ if (codexPlugin && pluginDefinition) {
|
|
|
784
790
|
if (codexPlugin.interface?.websiteURL !== pluginDefinition.homepage) failures.push("Codex plugin website URL must match canonical AGDF plugin definition");
|
|
785
791
|
if (codexPlugin.interface?.privacyPolicyURL !== pluginDefinition.publicDistribution?.urls?.privacy) failures.push("Codex plugin privacy URL must match canonical public distribution definition");
|
|
786
792
|
if (codexPlugin.interface?.termsOfServiceURL !== pluginDefinition.publicDistribution?.urls?.terms) failures.push("Codex plugin terms URL must match canonical public distribution definition");
|
|
787
|
-
if (codexPlugin.interface
|
|
793
|
+
if (Object.hasOwn(codexPlugin.interface ?? {}, "supportURL")) failures.push("Codex plugin manifest must omit unsupported interface.supportURL metadata");
|
|
788
794
|
if (codexPlugin.interface?.composerIcon !== pluginDefinition.codex?.composerIcon) failures.push("Codex plugin composer icon must match canonical AGDF plugin definition");
|
|
789
795
|
if (codexPlugin.interface?.logo !== pluginDefinition.codex?.logo) failures.push("Codex plugin logo must match canonical AGDF plugin definition");
|
|
790
796
|
if (codexPlugin.interface?.brandColor !== pluginDefinition.brandColor) failures.push("Codex plugin brand color must match canonical AGDF plugin definition");
|
|
791
797
|
if (JSON.stringify(codexPlugin.interface?.capabilities) !== JSON.stringify(pluginDefinition.codex?.capabilities)) failures.push("Codex plugin capabilities must match canonical AGDF plugin definition");
|
|
792
798
|
if (JSON.stringify(codexPlugin.interface?.defaultPrompt) !== JSON.stringify(pluginDefinition.codex?.defaultPrompt)) failures.push("Codex plugin default prompts must match canonical AGDF plugin definition");
|
|
793
|
-
if (codexPlugin
|
|
799
|
+
if (Object.hasOwn(codexPlugin, "hooks")) failures.push("Codex plugin manifest must rely on default hooks/hooks.json discovery");
|
|
794
800
|
}
|
|
795
801
|
|
|
796
802
|
if (claudePlugin && pluginDefinition) {
|
|
@@ -877,6 +883,28 @@ if (pluginDefinition) {
|
|
|
877
883
|
if (capability?.surfaces?.["portable-skills"] !== "manual-external-required") {
|
|
878
884
|
failures.push("Portable public Skills profile must not claim automatic runtime checks");
|
|
879
885
|
}
|
|
886
|
+
if (capability?.surfaces?.copilot !== "plugin-hook-review") {
|
|
887
|
+
failures.push("Copilot automatic runtime checks must remain subject to plugin hook review");
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
if (!sourceMode) {
|
|
892
|
+
const copilotPlugin = isFile(copilotPluginPath) ? readJson(copilotPluginPath, "Copilot plugin manifest") : null;
|
|
893
|
+
const copilotHooks = isFile(copilotHooksPath) ? readJson(copilotHooksPath, "Copilot plugin hooks") : null;
|
|
894
|
+
if (!copilotPlugin) failures.push("installed runtime plugin must include root plugin.json for GitHub Copilot");
|
|
895
|
+
if (copilotPlugin && (copilotPlugin.name !== "agdf" || copilotPlugin.version !== pluginDefinition?.version
|
|
896
|
+
|| copilotPlugin.skills !== "copilot-skills/" || copilotPlugin.hooks !== "hooks/copilot-hooks.json")) {
|
|
897
|
+
failures.push("Copilot root plugin manifest must preserve AGDF identity, version and generated component paths");
|
|
898
|
+
}
|
|
899
|
+
const copilotSessionStart = copilotHooks?.hooks?.sessionStart;
|
|
900
|
+
if (!Array.isArray(copilotSessionStart) || !copilotSessionStart.some((hook) => hook?.type === "command"
|
|
901
|
+
&& hook?.command === 'node "${PLUGIN_ROOT}/runtime/agdf-session-check.js"'
|
|
902
|
+
&& hook?.env?.AGDF_SURFACE === "copilot")) {
|
|
903
|
+
failures.push("Copilot hooks must declare the fixed consent-bound AGDF sessionStart command");
|
|
904
|
+
}
|
|
905
|
+
for (const skill of pluginDefinition?.skillSet ?? []) {
|
|
906
|
+
assertFile(join(pluginRoot, "copilot-skills", `agdf-${skill.slug}`, "SKILL.md"), `Copilot prefixed plugin skill agdf-${skill.slug}`);
|
|
907
|
+
}
|
|
880
908
|
}
|
|
881
909
|
|
|
882
910
|
if (isFile(sessionStartHookPath)) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# AGDF 0.
|
|
1
|
+
# AGDF 0.14.1 — 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
|
"name": "agdf",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"description": "Control layer for governed AI-assisted delivery.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Arndt Gold",
|
|
@@ -30,7 +30,6 @@
|
|
|
30
30
|
"websiteURL": "https://agdf.iself.eu",
|
|
31
31
|
"privacyPolicyURL": "https://agdf.iself.eu/privacy",
|
|
32
32
|
"termsOfServiceURL": "https://agdf.iself.eu/terms",
|
|
33
|
-
"supportURL": "https://agdf.iself.eu/support",
|
|
34
33
|
"composerIcon": "./assets/agdf-icon.svg",
|
|
35
34
|
"logo": "./assets/agdf-logo.svg",
|
|
36
35
|
"defaultPrompt": [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"id": "agdf",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.14.1",
|
|
5
5
|
"displayName": "AI Governance & Delivery Framework",
|
|
6
6
|
"developerName": "Arndt Gold",
|
|
7
7
|
"description": "Control layer for governed AI-assisted delivery.",
|
|
@@ -50,7 +50,10 @@
|
|
|
50
50
|
},
|
|
51
51
|
"copilot": {
|
|
52
52
|
"skillPrefix": "agdf-",
|
|
53
|
-
"runtimeContractFileName": "agdf-runtime-contract.md"
|
|
53
|
+
"runtimeContractFileName": "agdf-runtime-contract.md",
|
|
54
|
+
"pluginManifest": "plugin.json",
|
|
55
|
+
"skills": "copilot-skills/",
|
|
56
|
+
"hooks": "hooks/copilot-hooks.json"
|
|
54
57
|
},
|
|
55
58
|
"opencode": {
|
|
56
59
|
"skillPrefix": "agdf-",
|
|
@@ -87,6 +90,7 @@
|
|
|
87
90
|
"surfaces": {
|
|
88
91
|
"codex": "native-hook-review",
|
|
89
92
|
"claude": "exact-command-rule",
|
|
93
|
+
"copilot": "plugin-hook-review",
|
|
90
94
|
"opencode": "plugin-internal",
|
|
91
95
|
"portable-skills": "manual-external-required"
|
|
92
96
|
}
|
|
@@ -143,6 +147,21 @@
|
|
|
143
147
|
"authorizationPath": "exact_text",
|
|
144
148
|
"technicalPermissionOwner": "claude_host"
|
|
145
149
|
},
|
|
150
|
+
"copilot": {
|
|
151
|
+
"questionAdapter": "exact_text",
|
|
152
|
+
"availability": "always",
|
|
153
|
+
"gateSafety": "wait_for_deliberate_user_input",
|
|
154
|
+
"explicitOutcomes": [
|
|
155
|
+
"approve",
|
|
156
|
+
"revise",
|
|
157
|
+
"decline",
|
|
158
|
+
"cancel"
|
|
159
|
+
],
|
|
160
|
+
"approvalValueTransport": "exact_option_value",
|
|
161
|
+
"waitSafety": "deliberate_no_auto_resolution",
|
|
162
|
+
"authorizationPath": "exact_text",
|
|
163
|
+
"technicalPermissionOwner": "copilot_host"
|
|
164
|
+
},
|
|
146
165
|
"opencode": {
|
|
147
166
|
"questionAdapter": "question",
|
|
148
167
|
"availability": "when_permission_question_allows",
|