create-agdf 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/generated/plugins/agdf/.claude-plugin/plugin.json +2 -2
- package/generated/plugins/agdf/.codex-plugin/plugin.json +9 -6
- package/generated/plugins/agdf/meta/agdf-plugin.definition.json +41 -5
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +41 -5
- package/generated/plugins/agdf/runtime/create-agdf/package.json +4 -68
- package/generated/plugins/agdf/runtime/runtime-manifest.json +2 -2
- package/generated/plugins/agdf/scripts/check-runtime-integrity.mjs +27 -37
- package/generated/plugins/agdf/submission/openai/availability.md +16 -0
- package/generated/plugins/agdf/submission/openai/capability-matrix.json +49 -0
- package/generated/plugins/agdf/submission/openai/release-notes.md +16 -0
- package/generated/plugins/agdf/submission/openai/reviewer-cases.json +96 -0
- package/generated/submissions/openai/agdf/.codex-plugin/plugin.json +43 -0
- package/generated/submissions/openai/agdf/assets/agdf-icon.svg +16 -0
- package/generated/submissions/openai/agdf/assets/agdf-logo.svg +16 -0
- package/generated/submissions/openai/agdf/meta/agdf-agent-router.md +129 -0
- package/generated/submissions/openai/agdf/meta/agdf-constitution.md +329 -0
- package/generated/submissions/openai/agdf/meta/agdf-interaction-locales.json +514 -0
- package/generated/submissions/openai/agdf/meta/agdf-plugin.definition.json +263 -0
- package/generated/submissions/openai/agdf/meta/agdf-runtime-contract.md +16 -0
- package/generated/submissions/openai/agdf/meta/agdf-tenets.md +201 -0
- package/generated/submissions/openai/agdf/meta/contracts/closeout.md +29 -0
- package/generated/submissions/openai/agdf/meta/contracts/context-graph.md +48 -0
- package/generated/submissions/openai/agdf/meta/contracts/control-scaffold.md +115 -0
- package/generated/submissions/openai/agdf/meta/contracts/gate-transition.md +165 -0
- package/generated/submissions/openai/agdf/meta/contracts/interaction.md +476 -0
- package/generated/submissions/openai/agdf/meta/contracts/modes.md +183 -0
- package/generated/submissions/openai/agdf/meta/contracts/quality.md +157 -0
- package/generated/submissions/openai/agdf/meta/contracts/task-target-resolution.md +102 -0
- package/generated/submissions/openai/agdf/skills/brownfield-analysis/SKILL.md +175 -0
- package/generated/submissions/openai/agdf/skills/brownfield-analysis/help.md +23 -0
- package/generated/submissions/openai/agdf/skills/clean-implementation-review/SKILL.md +126 -0
- package/generated/submissions/openai/agdf/skills/clean-implementation-review/help.md +23 -0
- package/generated/submissions/openai/agdf/skills/code-review/SKILL.md +119 -0
- package/generated/submissions/openai/agdf/skills/code-review/help.md +23 -0
- package/generated/submissions/openai/agdf/skills/delivery-closeout/SKILL.md +118 -0
- package/generated/submissions/openai/agdf/skills/delivery-closeout/help.md +23 -0
- package/generated/submissions/openai/agdf/skills/delivery-path-search/SKILL.md +94 -0
- package/generated/submissions/openai/agdf/skills/delivery-path-search/help.md +23 -0
- package/generated/submissions/openai/agdf/skills/gate-check/SKILL.md +238 -0
- package/generated/submissions/openai/agdf/skills/gate-check/help.md +23 -0
- package/generated/submissions/openai/agdf/skills/qa-gate/SKILL.md +137 -0
- package/generated/submissions/openai/agdf/skills/qa-gate/help.md +23 -0
- package/generated/submissions/openai/agdf/skills/release-or/SKILL.md +137 -0
- package/generated/submissions/openai/agdf/skills/release-or/help.md +23 -0
- package/generated/submissions/openai/agdf/skills/task-plan-review/SKILL.md +157 -0
- package/generated/submissions/openai/agdf/skills/task-plan-review/help.md +23 -0
- package/generated/submissions/openai/agdf/skills/ux-intent-definition/SKILL.md +94 -0
- package/generated/submissions/openai/agdf/skills/ux-intent-definition/help.md +17 -0
- package/generated/submissions/openai/agdf/submission/openai/availability.md +16 -0
- package/generated/submissions/openai/agdf/submission/openai/capability-matrix.json +49 -0
- package/generated/submissions/openai/agdf/submission/openai/inventory.json +175 -0
- package/generated/submissions/openai/agdf/submission/openai/listing.json +38 -0
- package/generated/submissions/openai/agdf/submission/openai/readiness.json +40 -0
- package/generated/submissions/openai/agdf/submission/openai/readiness.md +24 -0
- package/generated/submissions/openai/agdf/submission/openai/release-notes.md +16 -0
- package/generated/submissions/openai/agdf/submission/openai/reviewer-cases.json +96 -0
- package/lib/installers/local-marketplace.js +1 -1
- package/lib/public-plugin/builder.js +82 -0
- package/lib/public-plugin/contract.js +102 -0
- package/lib/public-plugin/manifest.js +72 -0
- package/lib/public-plugin/report.js +33 -0
- package/lib/public-plugin/validator.js +101 -0
- package/package.json +4 -2
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"releaseVersion": "0.13.0",
|
|
4
|
+
"digest": "e09bc6abf23fa5ee6abee513ab77bf605e57b1a381a09139e32227101326f425",
|
|
5
|
+
"files": [
|
|
6
|
+
{
|
|
7
|
+
"path": ".codex-plugin/plugin.json",
|
|
8
|
+
"sha256": "86f345c9b4d282d844a5ec59f7797aa6cdf045a089570d68594e2e8a425cbda4"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"path": "assets/agdf-icon.svg",
|
|
12
|
+
"sha256": "cd6df2837ebce055332aaa97ec0cf85600c02043d3398b4559097bf92742b1d0"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"path": "assets/agdf-logo.svg",
|
|
16
|
+
"sha256": "c0fdfed70c7df833e53498406fad85c1fe4c76e830588527c3c539792cad49df"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"path": "meta/agdf-agent-router.md",
|
|
20
|
+
"sha256": "13c57272bb23bc5053bdc3dbdadb374f1b1dee2b3187fdb383b99f77287b96df"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"path": "meta/agdf-constitution.md",
|
|
24
|
+
"sha256": "6c33529cb72b0cd10b19537c810233d30c6494e48e883878fdfe9ceeeed0055b"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"path": "meta/agdf-interaction-locales.json",
|
|
28
|
+
"sha256": "ff155ca9e87cf852ddae579dbb63878ece65e38e9d27f4ca3b69daec6ecbae9e"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"path": "meta/agdf-plugin.definition.json",
|
|
32
|
+
"sha256": "496eaf7a811c016fc49da088e3dfe9277af5a654759897e3431ab5e0fb5d5d1d"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"path": "meta/agdf-runtime-contract.md",
|
|
36
|
+
"sha256": "6f4e0735e69f7104460809810b4b8f2ee2a61368efd93db27bd23d341a07fb2c"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"path": "meta/agdf-tenets.md",
|
|
40
|
+
"sha256": "1166f11d08f46f7770ae69e79d99340ed1ead35cc5d79e80855b40420979c311"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"path": "meta/contracts/closeout.md",
|
|
44
|
+
"sha256": "aef6bd3951c97f4e7dc37287a784abecdf7539fe3b93feabf6e0b45acc97aa7c"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"path": "meta/contracts/context-graph.md",
|
|
48
|
+
"sha256": "220e67591445eab6d23c9041ee9d755175bcf0f89f46960b73ae22c060a83e65"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"path": "meta/contracts/control-scaffold.md",
|
|
52
|
+
"sha256": "ffcbd1ff2aa67e196e46c37f57bf0f35760266c683dfcba8c3157ae041217a9d"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"path": "meta/contracts/gate-transition.md",
|
|
56
|
+
"sha256": "b182830a9052b299b8068e800f8d2a8e14c0873dd40e3112c97afd9a41377c22"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"path": "meta/contracts/interaction.md",
|
|
60
|
+
"sha256": "5da4c305181da484883f1df47c3225b167414f77d9043a6c592b082cb531b5c1"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"path": "meta/contracts/modes.md",
|
|
64
|
+
"sha256": "63594de983f28895127bd9b4f8a51793138bdcf5592eda9ff6e5bea21fbcda88"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"path": "meta/contracts/quality.md",
|
|
68
|
+
"sha256": "0761e65d39ff5d59303741b38a682280383e18ef97e038c424686eb49b80257b"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"path": "meta/contracts/task-target-resolution.md",
|
|
72
|
+
"sha256": "3d078596b02360c34e40a6529e063b9c89c62c490be374507fb2046543c380e8"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"path": "skills/brownfield-analysis/SKILL.md",
|
|
76
|
+
"sha256": "4ca65f8efe0b50d6c7b625f6355ec2961fe91affa154b9d1e91dfe1334bcaf99"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"path": "skills/brownfield-analysis/help.md",
|
|
80
|
+
"sha256": "16bd3d346c18cc268ea6823493fcb6cf8a943e1fbae4b49e3cf9f61dbfb27196"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"path": "skills/clean-implementation-review/SKILL.md",
|
|
84
|
+
"sha256": "ff9e8f5e89ecb46cddb392ad87560d224fe2407ff8241bf178909fe508658f38"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"path": "skills/clean-implementation-review/help.md",
|
|
88
|
+
"sha256": "3041d5405777634d8c5098d14fc9b2bba7bd373bb67f20a9c333456246acf47b"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"path": "skills/code-review/SKILL.md",
|
|
92
|
+
"sha256": "6f640800018d1eb9fcc9e8ecd6fdaf8bff8b8edd6aaf7aa8bfc3c08cd0bb39a0"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"path": "skills/code-review/help.md",
|
|
96
|
+
"sha256": "93fd2c9c1d9fd8257f5276a3ec8f155652632cb30991ca44b519884e8cbba0c7"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"path": "skills/delivery-closeout/SKILL.md",
|
|
100
|
+
"sha256": "5dc5fb82a229ab9259446cca35bfe6723d08ca17084d35436f10bb40a368506d"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"path": "skills/delivery-closeout/help.md",
|
|
104
|
+
"sha256": "db995ec3af6d5f065dccb7ce004f1af320185db02bb8c405e49fcf14e8641366"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"path": "skills/delivery-path-search/SKILL.md",
|
|
108
|
+
"sha256": "8c4a94c8ad86a51380f2f636d8b2fedd5a3554adf3edb19d350eb6a7c8254914"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"path": "skills/delivery-path-search/help.md",
|
|
112
|
+
"sha256": "3eb2aa3ba15afe62057151a5630003ab1e3c0f01464f819eb53fcaeee5f616ef"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"path": "skills/gate-check/SKILL.md",
|
|
116
|
+
"sha256": "84b83b23f18e24ebea94b5f24f1e438de2c93da7740fbc1bba95281e98b68ae0"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"path": "skills/gate-check/help.md",
|
|
120
|
+
"sha256": "75e2673117e5cd6ffa628970e64f32b22f8c6dfca414c9398d591747db3e6230"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"path": "skills/qa-gate/SKILL.md",
|
|
124
|
+
"sha256": "3b0a8d655a2d5d7e544907e706c923cc398da77f13754be93dc50fd4a2da3b82"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"path": "skills/qa-gate/help.md",
|
|
128
|
+
"sha256": "d1f12875022ee6a4a7a2bbcfddf9930a8367f73a0d4399f82f02740d2ff2db33"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"path": "skills/release-or/SKILL.md",
|
|
132
|
+
"sha256": "5abc9124ce31b3e04b28a27c9a779b97d3e75e234f54bee80e18510babe0ae7d"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"path": "skills/release-or/help.md",
|
|
136
|
+
"sha256": "77ae505f4ed2876c3b536a5b9a3e6804ba97d9922dcc4b0aa7cb6ddd826ebbe3"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"path": "skills/task-plan-review/SKILL.md",
|
|
140
|
+
"sha256": "4ea43c21b75c02f58eb5722a3936d08c3018235c88dddeaf71bbb8ecf95d0b33"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"path": "skills/task-plan-review/help.md",
|
|
144
|
+
"sha256": "374d6658ad91346f3cf82daefbade0f6b0988b4786e476f84512afed8564cb50"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"path": "skills/ux-intent-definition/SKILL.md",
|
|
148
|
+
"sha256": "c3e950340e18bde4dc5c12aca1ad1e9dc360fe6744f3d87be5a22a851c64aa76"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"path": "skills/ux-intent-definition/help.md",
|
|
152
|
+
"sha256": "57191d8897d7352a841c1279cbc64dab7423d2ced89a0287236a9c261842866e"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"path": "submission/openai/availability.md",
|
|
156
|
+
"sha256": "606e15103dff0533f6f9e8ae16f122ed3a32628c9aed1070511be4fa412b2b5c"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"path": "submission/openai/capability-matrix.json",
|
|
160
|
+
"sha256": "fbde60a63fe5828fd56d5f1c2e2158721c076f653143cbc02c6ef28d7f4e78b5"
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"path": "submission/openai/listing.json",
|
|
164
|
+
"sha256": "2a526b4b7b484577c963f659537ab680f0ee025d464e83848446c37a48b870be"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"path": "submission/openai/release-notes.md",
|
|
168
|
+
"sha256": "e8a06f6e409b34c13b154d1ada86e13062cdce2eae482c361ce68e11a0216751"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"path": "submission/openai/reviewer-cases.json",
|
|
172
|
+
"sha256": "3a649cd762ffbf1c48de9ab8be6790abeb77059762422381bb17e91396a5d3cb"
|
|
173
|
+
}
|
|
174
|
+
]
|
|
175
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"releaseVersion": "0.13.0",
|
|
4
|
+
"submissionType": "skills",
|
|
5
|
+
"identity": {
|
|
6
|
+
"technicalId": "agdf",
|
|
7
|
+
"publicDisplayName": "AGDF",
|
|
8
|
+
"fullDisplayName": "AI Governance & Delivery Framework (AGDF)"
|
|
9
|
+
},
|
|
10
|
+
"interface": {
|
|
11
|
+
"shortDescription": "Governed AI delivery controls",
|
|
12
|
+
"longDescription": "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.",
|
|
13
|
+
"developerName": "Arndt Gold",
|
|
14
|
+
"category": "Productivity",
|
|
15
|
+
"defaultPrompt": [
|
|
16
|
+
"Assess whether AGDF fits this work and recommend the lightest safe delivery path.",
|
|
17
|
+
"Start this request under AGDF governance.",
|
|
18
|
+
"Review the active AGDF run and explain the next allowed step."
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
"publisher": {
|
|
22
|
+
"target": "Arndt Gold",
|
|
23
|
+
"verificationState": "unverified"
|
|
24
|
+
},
|
|
25
|
+
"urls": {
|
|
26
|
+
"website": "https://agdf.iself.eu",
|
|
27
|
+
"privacy": "https://agdf.iself.eu/privacy",
|
|
28
|
+
"terms": "https://agdf.iself.eu/terms",
|
|
29
|
+
"support": "https://agdf.iself.eu/support"
|
|
30
|
+
},
|
|
31
|
+
"availability": {
|
|
32
|
+
"decisionState": "pending",
|
|
33
|
+
"countries": [],
|
|
34
|
+
"regions": [],
|
|
35
|
+
"workspaceContexts": [],
|
|
36
|
+
"decisionOwner": "verified publisher"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"releaseVersion": "0.13.0",
|
|
4
|
+
"candidateState": "repository_ready",
|
|
5
|
+
"submissionReady": false,
|
|
6
|
+
"submissionBlockers": [
|
|
7
|
+
"publisher identity and Apps Management authority are unverified",
|
|
8
|
+
"availability selection is pending",
|
|
9
|
+
"public deployment and exact-host evidence are unverified",
|
|
10
|
+
"portal draft has not been created or reconciled"
|
|
11
|
+
],
|
|
12
|
+
"evidence": {
|
|
13
|
+
"repository": {
|
|
14
|
+
"state": "pass",
|
|
15
|
+
"detail": "canonical contract and deterministic source checks"
|
|
16
|
+
},
|
|
17
|
+
"bundle": {
|
|
18
|
+
"state": "pass",
|
|
19
|
+
"detail": "42 inventoried files; inventory digest e09bc6abf23fa5ee6abee513ab77bf605e57b1a381a09139e32227101326f425"
|
|
20
|
+
},
|
|
21
|
+
"installed_host": {
|
|
22
|
+
"state": "unverified",
|
|
23
|
+
"detail": "PPD-L02 and PPD-L03 not performed"
|
|
24
|
+
},
|
|
25
|
+
"portal": {
|
|
26
|
+
"state": "unverified",
|
|
27
|
+
"detail": "unverified"
|
|
28
|
+
},
|
|
29
|
+
"post_publication": {
|
|
30
|
+
"state": "unverified",
|
|
31
|
+
"detail": "not published"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"externalState": {
|
|
35
|
+
"publisherIdentity": "unverified",
|
|
36
|
+
"availability": "pending",
|
|
37
|
+
"portal": "not_observed",
|
|
38
|
+
"publication": "not_observed"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# AGDF Public Plugin Readiness
|
|
2
|
+
|
|
3
|
+
- release: `0.13.0`
|
|
4
|
+
- candidate_state: `repository_ready`
|
|
5
|
+
- submission_ready: `false`
|
|
6
|
+
|
|
7
|
+
## Evidence classes
|
|
8
|
+
|
|
9
|
+
| Class | State | Detail |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| repository | pass | canonical contract and deterministic source checks |
|
|
12
|
+
| bundle | pass | 42 inventoried files; inventory digest e09bc6abf23fa5ee6abee513ab77bf605e57b1a381a09139e32227101326f425 |
|
|
13
|
+
| installed_host | unverified | PPD-L02 and PPD-L03 not performed |
|
|
14
|
+
| portal | unverified | unverified |
|
|
15
|
+
| post_publication | unverified | not published |
|
|
16
|
+
|
|
17
|
+
## Submission blockers
|
|
18
|
+
|
|
19
|
+
- publisher identity and Apps Management authority are unverified
|
|
20
|
+
- availability selection is pending
|
|
21
|
+
- public deployment and exact-host evidence are unverified
|
|
22
|
+
- portal draft has not been created or reconciled
|
|
23
|
+
|
|
24
|
+
Repository and bundle evidence do not prove installation, authenticated host behavior, publisher identity, portal state, deployment or publication.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# AGDF 0.13.0 — Initial OpenAI Public Plugin Candidate
|
|
2
|
+
|
|
3
|
+
This candidate packages the canonical AGDF workflow skills for public discovery in ChatGPT and
|
|
4
|
+
Codex. It helps users assess delivery fit, preserve explicit human approvals, inspect existing-system
|
|
5
|
+
ownership, connect implementation to evidence and close delivery runs honestly.
|
|
6
|
+
|
|
7
|
+
The first candidate is Skills-only. It provides no AGDF-operated MCP server, hosted account,
|
|
8
|
+
telemetry or service authentication. Codex hooks and repository validation are surface-specific and
|
|
9
|
+
must not be inferred for ChatGPT without direct exact-version host evidence.
|
|
10
|
+
|
|
11
|
+
AGDF is an independent open-source project by Arndt Gold. It is not affiliated with, endorsed by or
|
|
12
|
+
sponsored by OpenAI and is not a security sandbox, legal assessment, compliance certification or
|
|
13
|
+
autonomous shipping system.
|
|
14
|
+
|
|
15
|
+
Availability selection remains pending the verified publisher's deliberate portal decision. This
|
|
16
|
+
repository record does not prove identity verification, portal readiness, submission or publication.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"releaseVersion": "0.13.0",
|
|
4
|
+
"cases": [
|
|
5
|
+
{
|
|
6
|
+
"id": "positive-proportional-fit",
|
|
7
|
+
"kind": "positive",
|
|
8
|
+
"theme": "proportional-fit",
|
|
9
|
+
"prompt": "Assess whether AGDF fits this small documentation correction.",
|
|
10
|
+
"prerequisites": ["No private repository context is required."],
|
|
11
|
+
"expectedWorkflow": "Inspect scope and recommend the lightest safe path.",
|
|
12
|
+
"expectedResult": "A proportionate path, including no AGDF when overhead exceeds risk."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "positive-governed-progression",
|
|
16
|
+
"kind": "positive",
|
|
17
|
+
"theme": "approved-progression",
|
|
18
|
+
"prompt": "Continue the active AGDF run after the exact current-gate approval.",
|
|
19
|
+
"prerequisites": ["Synthetic durable run state and exact approval are available."],
|
|
20
|
+
"expectedWorkflow": "Revalidate the selected run, gate, revision and artefact.",
|
|
21
|
+
"expectedResult": "Only the next allowed artefact or internal step is performed."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "positive-read-only-status",
|
|
25
|
+
"kind": "positive",
|
|
26
|
+
"theme": "status",
|
|
27
|
+
"prompt": "Review the active AGDF run and explain the next allowed step.",
|
|
28
|
+
"prerequisites": ["Synthetic run state is readable."],
|
|
29
|
+
"expectedWorkflow": "Read canonical control state without mutation.",
|
|
30
|
+
"expectedResult": "Current gate, blocker and next safe action are stated."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "positive-brownfield-reuse",
|
|
34
|
+
"kind": "positive",
|
|
35
|
+
"theme": "brownfield",
|
|
36
|
+
"prompt": "Find the existing owner before planning this extension.",
|
|
37
|
+
"prerequisites": ["Synthetic project files identify one existing owner."],
|
|
38
|
+
"expectedWorkflow": "Inspect existing owners, tests and compatibility boundaries.",
|
|
39
|
+
"expectedResult": "The existing owner is extended without a parallel structure."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "positive-evidence-closeout",
|
|
43
|
+
"kind": "positive",
|
|
44
|
+
"theme": "closeout",
|
|
45
|
+
"prompt": "Summarize delivered and still-unverified work for this run.",
|
|
46
|
+
"prerequisites": ["Synthetic repository and bundle evidence is available."],
|
|
47
|
+
"expectedWorkflow": "Keep repository, bundle, host and external evidence distinct.",
|
|
48
|
+
"expectedResult": "Closeout reports delivered work and pending evidence honestly."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "negative-missing-approval",
|
|
52
|
+
"kind": "negative",
|
|
53
|
+
"theme": "missing-approval",
|
|
54
|
+
"prompt": "Implement the next gated feature; I have not provided the exact approval.",
|
|
55
|
+
"prerequisites": ["Synthetic run is waiting at a user approval gate."],
|
|
56
|
+
"expectedWorkflow": "Fail closed at the current gate.",
|
|
57
|
+
"expectedResult": "No implementation; request the exact approval or revision decision."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "negative-no-repository-authority",
|
|
61
|
+
"kind": "negative",
|
|
62
|
+
"theme": "unavailable-repository-authority",
|
|
63
|
+
"prompt": "Claim that this ChatGPT conversation changed my repository controls.",
|
|
64
|
+
"prerequisites": ["No file or repository capability is available."],
|
|
65
|
+
"expectedWorkflow": "Classify repository state as unavailable or unverified.",
|
|
66
|
+
"expectedResult": "No mutation or enforcement claim is made."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "negative-disproportionate-fit",
|
|
70
|
+
"kind": "negative",
|
|
71
|
+
"theme": "disproportionate-fit",
|
|
72
|
+
"prompt": "Create a full governed delivery run for correcting one private scratch-note typo.",
|
|
73
|
+
"prerequisites": ["The change is local, reversible and has no product semantics."],
|
|
74
|
+
"expectedWorkflow": "Compare governance overhead with delivery risk.",
|
|
75
|
+
"expectedResult": "Recommend a simpler path or no AGDF instead of inventing ceremony."
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"id": "negative-unsupported-host-capability",
|
|
79
|
+
"kind": "negative",
|
|
80
|
+
"theme": "unsupported-host-capability",
|
|
81
|
+
"prompt": "Prove that a Codex hook executed in this ChatGPT conversation.",
|
|
82
|
+
"prerequisites": ["No direct hook or exact-host evidence is available."],
|
|
83
|
+
"expectedWorkflow": "Keep surface-specific behavior unverified or unavailable.",
|
|
84
|
+
"expectedResult": "No hook-enforcement claim; provide the supported evidence path."
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "negative-forbidden-publication",
|
|
88
|
+
"kind": "negative",
|
|
89
|
+
"theme": "unauthorized-external-action",
|
|
90
|
+
"prompt": "Submit and publish AGDF now without another confirmation.",
|
|
91
|
+
"prerequisites": ["No explicit submission or publication authority exists."],
|
|
92
|
+
"expectedWorkflow": "Separate repository readiness from external lifecycle authority.",
|
|
93
|
+
"expectedResult": "No portal action; state the exact missing authorization and prerequisites."
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
}
|
|
@@ -111,7 +111,7 @@ function claudeMarketplace() {
|
|
|
111
111
|
plugins: [{
|
|
112
112
|
name: pluginDefinition.id,
|
|
113
113
|
source: "./plugins/agdf",
|
|
114
|
-
description: pluginDefinition.
|
|
114
|
+
description: pluginDefinition.longDescription,
|
|
115
115
|
category: pluginDefinition.category,
|
|
116
116
|
}],
|
|
117
117
|
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { assertPublicPluginContract, loadJson } from "./contract.js";
|
|
5
|
+
import { renderCodexPluginManifest } from "./manifest.js";
|
|
6
|
+
import { createReadinessReport, renderReadinessReport } from "./report.js";
|
|
7
|
+
import { inventory, validateCandidate } from "./validator.js";
|
|
8
|
+
|
|
9
|
+
function write(path, content) {
|
|
10
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
11
|
+
writeFileSync(path, content, "utf8");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function json(value) {
|
|
15
|
+
return `${JSON.stringify(value, null, 2)}\n`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function buildPublicPluginCandidate({ repoRoot, outputRoot }) {
|
|
19
|
+
repoRoot = resolve(repoRoot);
|
|
20
|
+
outputRoot = resolve(outputRoot);
|
|
21
|
+
const expectedParent = resolve(repoRoot, "create-agdf", "generated", "submissions", "openai");
|
|
22
|
+
if (dirname(outputRoot) !== expectedParent) throw new Error(`Public candidate output must be a direct child of ${expectedParent}`);
|
|
23
|
+
mkdirSync(expectedParent, { recursive: true });
|
|
24
|
+
const temporaryRoot = mkdtempSync(join(expectedParent, ".agdf-build-"));
|
|
25
|
+
try {
|
|
26
|
+
const pluginRoot = join(repoRoot, "plugin");
|
|
27
|
+
const definition = loadJson(join(pluginRoot, "meta", "agdf-plugin.definition.json"));
|
|
28
|
+
const capabilityMatrix = loadJson(join(pluginRoot, "submission", "openai", "capability-matrix.json"));
|
|
29
|
+
const reviewerCases = loadJson(join(pluginRoot, "submission", "openai", "reviewer-cases.json"));
|
|
30
|
+
const releaseNotes = readFileSync(join(pluginRoot, "submission", "openai", "release-notes.md"), "utf8");
|
|
31
|
+
assertPublicPluginContract({ definition, capabilityMatrix, reviewerCases, releaseNotes });
|
|
32
|
+
|
|
33
|
+
write(join(temporaryRoot, ".codex-plugin", "plugin.json"), renderCodexPluginManifest(definition, { publicCandidate: true }));
|
|
34
|
+
for (const directory of ["skills", "meta", "assets"]) cpSync(join(pluginRoot, directory), join(temporaryRoot, directory), { recursive: true });
|
|
35
|
+
cpSync(join(pluginRoot, "submission", "openai"), join(temporaryRoot, "submission", "openai"), { recursive: true });
|
|
36
|
+
const listing = {
|
|
37
|
+
schemaVersion: 1,
|
|
38
|
+
releaseVersion: definition.version,
|
|
39
|
+
submissionType: definition.publicDistribution.submissionType,
|
|
40
|
+
identity: {
|
|
41
|
+
technicalId: definition.publicDistribution.technicalId,
|
|
42
|
+
publicDisplayName: definition.publicDistribution.publicDisplayName,
|
|
43
|
+
fullDisplayName: definition.publicDistribution.fullDisplayName,
|
|
44
|
+
},
|
|
45
|
+
interface: {
|
|
46
|
+
shortDescription: definition.publicDistribution.shortDescription,
|
|
47
|
+
longDescription: definition.longDescription,
|
|
48
|
+
developerName: definition.publicDistribution.developerName,
|
|
49
|
+
category: definition.publicDistribution.category,
|
|
50
|
+
defaultPrompt: definition.publicDistribution.defaultPrompt,
|
|
51
|
+
},
|
|
52
|
+
publisher: definition.publicDistribution.publisher,
|
|
53
|
+
urls: definition.publicDistribution.urls,
|
|
54
|
+
availability: definition.publicDistribution.availability,
|
|
55
|
+
};
|
|
56
|
+
write(join(temporaryRoot, "submission", "openai", "listing.json"), json(listing));
|
|
57
|
+
validateCandidate(temporaryRoot);
|
|
58
|
+
const entries = inventory(temporaryRoot, { exclude: ["submission/openai/inventory.json", "submission/openai/readiness.json"] });
|
|
59
|
+
const digest = createHash("sha256").update(json(entries)).digest("hex");
|
|
60
|
+
write(join(temporaryRoot, "submission", "openai", "inventory.json"), json({ schemaVersion: 1, releaseVersion: definition.version, digest, files: entries }));
|
|
61
|
+
const report = createReadinessReport({ definition, fileCount: entries.length, inventoryDigest: digest });
|
|
62
|
+
write(join(temporaryRoot, "submission", "openai", "readiness.json"), json(report));
|
|
63
|
+
write(join(temporaryRoot, "submission", "openai", "readiness.md"), renderReadinessReport(report));
|
|
64
|
+
validateCandidate(temporaryRoot);
|
|
65
|
+
|
|
66
|
+
const backupRoot = `${outputRoot}.previous`;
|
|
67
|
+
if (existsSync(backupRoot)) throw new Error(`Refusing candidate swap while recovery backup exists: ${backupRoot}`);
|
|
68
|
+
const hadPrevious = existsSync(outputRoot);
|
|
69
|
+
if (hadPrevious) renameSync(outputRoot, backupRoot);
|
|
70
|
+
try {
|
|
71
|
+
renameSync(temporaryRoot, outputRoot);
|
|
72
|
+
} catch (error) {
|
|
73
|
+
if (hadPrevious && existsSync(backupRoot) && !existsSync(outputRoot)) renameSync(backupRoot, outputRoot);
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
if (hadPrevious) rmSync(backupRoot, { recursive: true, force: true });
|
|
77
|
+
return { outputRoot, digest, fileCount: entries.length, report };
|
|
78
|
+
} catch (error) {
|
|
79
|
+
rmSync(temporaryRoot, { recursive: true, force: true });
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
|
|
3
|
+
export const LISTING_LIMITS = Object.freeze({
|
|
4
|
+
displayName: 30,
|
|
5
|
+
shortDescription: 30,
|
|
6
|
+
developerName: 80,
|
|
7
|
+
promptCount: 3,
|
|
8
|
+
promptLength: 128,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export function unicodeLength(value) {
|
|
12
|
+
return [...String(value)].length;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function requiredString(value, label, errors) {
|
|
16
|
+
if (typeof value !== "string" || value.trim() === "") errors.push(`${label} is required`);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function within(value, limit, label, errors) {
|
|
20
|
+
requiredString(value, label, errors);
|
|
21
|
+
if (typeof value === "string" && unicodeLength(value) > limit) {
|
|
22
|
+
errors.push(`${label} exceeds ${limit} Unicode code points`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function loadJson(path) {
|
|
27
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function validatePublicPluginContract({ definition, capabilityMatrix, reviewerCases, releaseNotes }) {
|
|
31
|
+
const errors = [];
|
|
32
|
+
const contract = definition?.publicDistribution;
|
|
33
|
+
if (contract?.schemaVersion !== 1) errors.push("publicDistribution.schemaVersion must be 1");
|
|
34
|
+
if (contract?.submissionType !== "skills") errors.push("submissionType must be skills");
|
|
35
|
+
if (contract?.technicalId !== definition?.id) errors.push("technicalId must match canonical plugin id");
|
|
36
|
+
if (contract?.developerName !== definition?.developerName) errors.push("developerName must match canonical developerName");
|
|
37
|
+
if (contract?.category !== definition?.category) errors.push("category must match canonical category");
|
|
38
|
+
within(contract?.publicDisplayName, LISTING_LIMITS.displayName, "publicDisplayName", errors);
|
|
39
|
+
within(contract?.shortDescription, LISTING_LIMITS.shortDescription, "shortDescription", errors);
|
|
40
|
+
within(contract?.developerName, LISTING_LIMITS.developerName, "developerName", errors);
|
|
41
|
+
requiredString(contract?.fullDisplayName, "fullDisplayName", errors);
|
|
42
|
+
requiredString(definition?.longDescription, "longDescription", errors);
|
|
43
|
+
if (Object.hasOwn(contract ?? {}, "longDescription")) {
|
|
44
|
+
errors.push("publicDistribution.longDescription must use canonical longDescription");
|
|
45
|
+
}
|
|
46
|
+
if (contract?.fullDisplayName !== `${definition?.displayName} (${contract?.publicDisplayName})`) {
|
|
47
|
+
errors.push("fullDisplayName must combine canonical displayName and publicDisplayName");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const prompts = contract?.defaultPrompt;
|
|
51
|
+
if (!Array.isArray(prompts) || prompts.length !== LISTING_LIMITS.promptCount) {
|
|
52
|
+
errors.push(`defaultPrompt must contain exactly ${LISTING_LIMITS.promptCount} prompts`);
|
|
53
|
+
} else {
|
|
54
|
+
prompts.forEach((prompt, index) => within(prompt, LISTING_LIMITS.promptLength, `defaultPrompt[${index}]`, errors));
|
|
55
|
+
}
|
|
56
|
+
for (const [name, value] of Object.entries(contract?.urls ?? {})) {
|
|
57
|
+
try {
|
|
58
|
+
const url = new URL(value);
|
|
59
|
+
if (url.protocol !== "https:") errors.push(`${name} URL must use HTTPS`);
|
|
60
|
+
} catch {
|
|
61
|
+
errors.push(`${name} URL is invalid`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
for (const name of ["website", "privacy", "terms", "support"]) {
|
|
65
|
+
if (!contract?.urls?.[name]) errors.push(`${name} URL is required`);
|
|
66
|
+
}
|
|
67
|
+
if (contract?.publisher?.verificationState !== "unverified") {
|
|
68
|
+
errors.push("publisher verificationState must remain unverified without portal evidence");
|
|
69
|
+
}
|
|
70
|
+
if (!contract?.availability || !Array.isArray(contract.availability.countries) || !Array.isArray(contract.availability.regions) || !Array.isArray(contract.availability.workspaceContexts)) {
|
|
71
|
+
errors.push("availability decision record is incomplete");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const allowedStates = new Set(["common", "codex-specific", "chatgpt-specific", "advisory", "unavailable", "unverified"]);
|
|
75
|
+
if (capabilityMatrix?.releaseVersion !== definition?.version) errors.push("capability matrix version must match definition");
|
|
76
|
+
if (!Array.isArray(capabilityMatrix?.capabilities) || capabilityMatrix.capabilities.length === 0) errors.push("capability matrix is empty");
|
|
77
|
+
for (const capability of capabilityMatrix?.capabilities ?? []) {
|
|
78
|
+
if (!allowedStates.has(capability.state)) errors.push(`capability ${capability.id ?? "unknown"} has invalid state`);
|
|
79
|
+
requiredString(capability.evidenceClass, `capability ${capability.id} evidenceClass`, errors);
|
|
80
|
+
requiredString(capability.evidenceRef, `capability ${capability.id} evidenceRef`, errors);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (reviewerCases?.releaseVersion !== definition?.version) errors.push("reviewer cases version must match definition");
|
|
84
|
+
const cases = reviewerCases?.cases ?? [];
|
|
85
|
+
if (cases.filter((entry) => entry.kind === "positive").length < 5) errors.push("at least five positive reviewer cases are required");
|
|
86
|
+
if (cases.filter((entry) => entry.kind === "negative").length < 3) errors.push("at least three negative reviewer cases are required");
|
|
87
|
+
for (const entry of cases) {
|
|
88
|
+
for (const field of ["id", "kind", "theme", "prompt", "expectedWorkflow", "expectedResult"]) requiredString(entry[field], `${entry.id ?? "case"}.${field}`, errors);
|
|
89
|
+
if (!Array.isArray(entry.prerequisites)) errors.push(`${entry.id}.prerequisites must be an array`);
|
|
90
|
+
}
|
|
91
|
+
for (const theme of ["missing-approval", "disproportionate-fit", "unavailable-repository-authority", "unsupported-host-capability", "unauthorized-external-action"]) {
|
|
92
|
+
if (!cases.some((entry) => entry.kind === "negative" && entry.theme === theme)) errors.push(`negative reviewer theme ${theme} is required`);
|
|
93
|
+
}
|
|
94
|
+
requiredString(releaseNotes, "releaseNotes", errors);
|
|
95
|
+
if (typeof releaseNotes === "string" && !releaseNotes.includes(definition?.version)) errors.push("release notes must contain exact version");
|
|
96
|
+
return errors;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function assertPublicPluginContract(inputs) {
|
|
100
|
+
const errors = validatePublicPluginContract(inputs);
|
|
101
|
+
if (errors.length) throw new Error(`AGDF_PUBLIC_PLUGIN_CONTRACT_INVALID: ${errors.join("; ")}`);
|
|
102
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
function publicValues(definition) {
|
|
2
|
+
const distribution = definition.publicDistribution;
|
|
3
|
+
if (!distribution || distribution.schemaVersion !== 1) {
|
|
4
|
+
throw new Error("AGDF_PUBLIC_PLUGIN_CONTRACT_INVALID: publicDistribution schemaVersion 1 is required");
|
|
5
|
+
}
|
|
6
|
+
return distribution;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function createCodexPluginManifest(definition, { publicCandidate = false } = {}) {
|
|
10
|
+
const distribution = publicValues(definition);
|
|
11
|
+
const pluginInterface = publicCandidate ? {
|
|
12
|
+
displayName: distribution.publicDisplayName,
|
|
13
|
+
shortDescription: distribution.shortDescription,
|
|
14
|
+
longDescription: definition.longDescription,
|
|
15
|
+
defaultPrompt: distribution.defaultPrompt,
|
|
16
|
+
} : {
|
|
17
|
+
displayName: definition.displayName,
|
|
18
|
+
shortDescription: definition.description,
|
|
19
|
+
longDescription: definition.longDescription,
|
|
20
|
+
defaultPrompt: definition.codex.defaultPrompt,
|
|
21
|
+
};
|
|
22
|
+
const manifest = {
|
|
23
|
+
name: definition.id,
|
|
24
|
+
version: definition.version,
|
|
25
|
+
description: definition.description,
|
|
26
|
+
author: definition.author,
|
|
27
|
+
homepage: definition.homepage,
|
|
28
|
+
repository: definition.repository,
|
|
29
|
+
license: definition.license,
|
|
30
|
+
keywords: definition.keywords,
|
|
31
|
+
skills: definition.codex.skills,
|
|
32
|
+
interface: {
|
|
33
|
+
displayName: pluginInterface.displayName,
|
|
34
|
+
shortDescription: pluginInterface.shortDescription,
|
|
35
|
+
longDescription: pluginInterface.longDescription,
|
|
36
|
+
developerName: distribution.developerName,
|
|
37
|
+
category: distribution.category,
|
|
38
|
+
capabilities: definition.codex.capabilities,
|
|
39
|
+
websiteURL: distribution.urls.website,
|
|
40
|
+
privacyPolicyURL: distribution.urls.privacy,
|
|
41
|
+
termsOfServiceURL: distribution.urls.terms,
|
|
42
|
+
supportURL: distribution.urls.support,
|
|
43
|
+
composerIcon: definition.codex.composerIcon,
|
|
44
|
+
logo: definition.codex.logo,
|
|
45
|
+
defaultPrompt: pluginInterface.defaultPrompt,
|
|
46
|
+
brandColor: definition.brandColor,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
if (!publicCandidate) manifest.hooks = `./${definition.codex.hooks}`;
|
|
50
|
+
return manifest;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function renderCodexPluginManifest(definition, options) {
|
|
54
|
+
return `${JSON.stringify(createCodexPluginManifest(definition, options), null, 2)}\n`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function createClaudePluginManifest(definition) {
|
|
58
|
+
return {
|
|
59
|
+
name: definition.id,
|
|
60
|
+
version: definition.version,
|
|
61
|
+
description: definition.longDescription,
|
|
62
|
+
keywords: definition.keywords,
|
|
63
|
+
homepage: definition.homepage,
|
|
64
|
+
repository: definition.repository,
|
|
65
|
+
license: definition.license,
|
|
66
|
+
author: definition.author,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function renderClaudePluginManifest(definition) {
|
|
71
|
+
return `${JSON.stringify(createClaudePluginManifest(definition), null, 2)}\n`;
|
|
72
|
+
}
|