release-skill 0.9.17 → 0.9.18
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/.claude-plugin/plugin.json +1 -1
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.cursor-plugin/plugin.json +10 -0
- package/.kimi-plugin/plugin.json +1 -1
- package/.qoder-plugin/plugin.json +1 -1
- package/CHANGELOG.md +36 -2
- package/INSTALL.md +56 -9
- package/INSTALL.zh-CN.md +41 -7
- package/README.md +31 -20
- package/README.zh-CN.md +29 -19
- package/adapters/claude/.claude-plugin/plugin.json +1 -1
- package/adapters/claude/bin/consumer-contract-vectors.json +7 -7
- package/adapters/claude/bin/error-codes.json +1 -1
- package/adapters/claude/bin/foundation-resource-binding.json +1 -1
- package/adapters/claude/bin/prebuild-manifest.json +8 -4
- package/adapters/claude/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/claude/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/claude/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/claude/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/claude/bin/registry.json +1 -1
- package/adapters/claude/bin/release-skill.bundle.mjs +3560 -1200
- package/adapters/claude/bin/rules.json +1 -1
- package/adapters/claude/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/claude/data/hosts/registry.json +1 -0
- package/adapters/claude/schemas/release-plan.schema.json +255 -25
- package/adapters/claude/schemas/release-project.schema.json +228 -26
- package/adapters/claude/skills/release-finish/SKILL.md +17 -4
- package/adapters/claude/skills/release-help/SKILL.md +40 -39
- package/adapters/claude/src/schemas/host-descriptor.schema.json +9 -2
- package/adapters/codex/.codex-plugin/plugin.json +2 -2
- package/adapters/codex/bin/consumer-contract-vectors.json +7 -7
- package/adapters/codex/bin/error-codes.json +1 -1
- package/adapters/codex/bin/foundation-resource-binding.json +1 -1
- package/adapters/codex/bin/prebuild-manifest.json +8 -4
- package/adapters/codex/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/codex/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/codex/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/codex/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/codex/bin/registry.json +1 -1
- package/adapters/codex/bin/release-skill.bundle.mjs +3560 -1200
- package/adapters/codex/bin/rules.json +1 -1
- package/adapters/codex/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/codex/data/hosts/registry.json +1 -0
- package/adapters/codex/schemas/release-plan.schema.json +255 -25
- package/adapters/codex/schemas/release-project.schema.json +228 -26
- package/adapters/codex/skills/release-finish/SKILL.md +17 -4
- package/adapters/codex/skills/release-help/SKILL.md +40 -39
- package/adapters/codex/src/schemas/host-descriptor.schema.json +9 -2
- package/adapters/cursor/.cursor-plugin/plugin.json +10 -0
- package/adapters/cursor/bin/consumer-contract-vectors.json +110 -0
- package/adapters/cursor/bin/error-codes.json +161 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-contracts/LICENSE +202 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-contracts/NOTICE +10 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/LICENSE +202 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/NOTICE +10 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/THIRD_PARTY_NOTICES +142 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/LICENSE +202 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/NOTICE +10 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/native-NOTICE +2 -0
- package/adapters/cursor/bin/foundation-resource-binding.json +1 -0
- package/adapters/cursor/bin/kernel-protocol.json +60 -0
- package/adapters/cursor/bin/license-texts/Apache-2.0.txt +201 -0
- package/adapters/cursor/bin/license-texts/MIT.txt +21 -0
- package/adapters/cursor/bin/prebuild-manifest.json +83 -0
- package/adapters/cursor/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/cursor/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/cursor/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/cursor/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/cursor/bin/registry.json +347 -0
- package/adapters/cursor/bin/release-skill-local-finish.mjs +4 -0
- package/adapters/cursor/bin/release-skill.bundle.mjs +151806 -0
- package/adapters/cursor/bin/release-skill.mjs +54 -0
- package/adapters/cursor/bin/rules.json +104 -0
- package/adapters/cursor/bin/schemas/consumer-contract-vector.schema.json +149 -0
- package/adapters/cursor/data/hosts/claude/host-descriptor.json +45 -0
- package/adapters/cursor/data/hosts/codebuddy/host-descriptor.json +26 -0
- package/adapters/cursor/data/hosts/codex/host-descriptor.json +45 -0
- package/adapters/cursor/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/cursor/data/hosts/deepseek-harness/host-descriptor.json +23 -0
- package/adapters/cursor/data/hosts/kimi-code/host-descriptor.json +36 -0
- package/adapters/cursor/data/hosts/qoder/host-descriptor.json +26 -0
- package/adapters/cursor/data/hosts/registry.json +14 -0
- package/adapters/cursor/data/hosts/workbuddy/host-descriptor.json +34 -0
- package/adapters/cursor/data/licensing/registry.json +211 -0
- package/adapters/cursor/data/licensing/schema.json +207 -0
- package/adapters/cursor/native/safe-write/binding.gyp +41 -0
- package/adapters/cursor/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
- package/adapters/cursor/native/safe-write/prebuilds.json +24 -0
- package/adapters/cursor/native/safe-write/src/safe_write.cc +2032 -0
- package/adapters/cursor/schemas/.render-manifest.json +41 -0
- package/adapters/cursor/schemas/approval-record.schema.json +115 -0
- package/adapters/cursor/schemas/artifact-lock.schema.json +111 -0
- package/adapters/cursor/schemas/artifact-plan.schema.json +52 -0
- package/adapters/cursor/schemas/artifact-policy.schema.json +76 -0
- package/adapters/cursor/schemas/evidence-event-v2.schema.json +164 -0
- package/adapters/cursor/schemas/evidence-event.schema.json +89 -0
- package/adapters/cursor/schemas/postpublish-approval-record.schema.json +47 -0
- package/adapters/cursor/schemas/release-plan.schema.json +2226 -0
- package/adapters/cursor/schemas/release-project.schema.json +1815 -0
- package/adapters/cursor/schemas/release-run.schema.json +777 -0
- package/adapters/cursor/skills/release-assess/SKILL.md +61 -0
- package/adapters/cursor/skills/release-config/SKILL.md +151 -0
- package/adapters/cursor/skills/release-docs/SKILL.md +120 -0
- package/adapters/cursor/skills/release-finish/SKILL.md +155 -0
- package/adapters/cursor/skills/release-help/SKILL.md +155 -0
- package/adapters/cursor/skills/release-marketplace/SKILL.md +157 -0
- package/adapters/cursor/skills/release-prepare/SKILL.md +136 -0
- package/adapters/cursor/skills/release-publish/SKILL.md +92 -0
- package/adapters/cursor/skills/release-reconcile/SKILL.md +81 -0
- package/adapters/cursor/skills/release-setup/SKILL.md +132 -0
- package/adapters/cursor/skills/release-verify/SKILL.md +110 -0
- package/adapters/cursor/src/schemas/adapter-build-manifest.schema.json +41 -0
- package/adapters/cursor/src/schemas/adapter-peer-verification-request.schema.json +54 -0
- package/adapters/cursor/src/schemas/adapter-peer-verification-result.schema.json +54 -0
- package/adapters/cursor/src/schemas/adapter-source.schema.json +47 -0
- package/adapters/cursor/src/schemas/audit-baseline-pin.schema.json +163 -0
- package/adapters/cursor/src/schemas/declared-read-surface-result.schema.json +61 -0
- package/adapters/cursor/src/schemas/engineering-baseline.schema.json +77 -0
- package/adapters/cursor/src/schemas/executable-identity-observation.schema.json +162 -0
- package/adapters/cursor/src/schemas/filesystem-root-binding.schema.json +14 -0
- package/adapters/cursor/src/schemas/filesystem-tree-observation.schema.json +71 -0
- package/adapters/cursor/src/schemas/fixed-set-publication-manifest.schema.json +108 -0
- package/adapters/cursor/src/schemas/fixed-set-publication-receipt.schema.json +148 -0
- package/adapters/cursor/src/schemas/host-capability-fact.schema.json +31 -0
- package/adapters/cursor/src/schemas/host-descriptor.schema.json +144 -0
- package/adapters/cursor/src/schemas/host-operation-plan.schema.json +57 -0
- package/adapters/cursor/src/schemas/host-operation-receipt.schema.json +81 -0
- package/adapters/cursor/src/schemas/host-probe-result.schema.json +30 -0
- package/adapters/cursor/src/schemas/host-registry.schema.json +18 -0
- package/adapters/cursor/src/schemas/host-verification-request.schema.json +67 -0
- package/adapters/cursor/src/schemas/host-verification-result.schema.json +149 -0
- package/adapters/cursor/src/schemas/managed-file-lock.schema.json +77 -0
- package/adapters/cursor/src/schemas/migration-manifest.schema.json +412 -0
- package/adapters/cursor/src/schemas/observation-scope.schema.json +91 -0
- package/adapters/cursor/src/schemas/operation-request.schema.json +58 -0
- package/adapters/cursor/src/schemas/operation-result.schema.json +130 -0
- package/adapters/cursor/src/schemas/platform-difference-registry.schema.json +110 -0
- package/adapters/cursor/src/schemas/plugin-verification-request.schema.json +499 -0
- package/adapters/cursor/src/schemas/plugin-verification-result.schema.json +1217 -0
- package/adapters/cursor/src/schemas/profile-adoption-declaration.schema.json +111 -0
- package/adapters/cursor/src/schemas/profile-descriptor.schema.json +99 -0
- package/adapters/cursor/src/schemas/project-manifest.schema.json +67 -0
- package/adapters/cursor/src/schemas/project-profile.schema.json +25 -0
- package/adapters/cursor/src/schemas/public-boundary-declaration.schema.json +73 -0
- package/adapters/cursor/src/schemas/report-binding.schema.json +42 -0
- package/adapters/cursor/src/schemas/report-model.schema.json +308 -0
- package/adapters/cursor/src/schemas/skill-family-directory-verification-request.schema.json +100 -0
- package/adapters/cursor/src/schemas/skill-family-directory-verification-result.schema.json +193 -0
- package/adapters/cursor/src/schemas/source-authority-receipt.schema.json +31 -0
- package/adapters/cursor/src/schemas/state-event-envelope.schema.json +38 -0
- package/adapters/cursor/src/schemas/state-snapshot-metadata.schema.json +25 -0
- package/adapters/cursor/src/schemas/structured-scan-policy.schema.json +97 -0
- package/adapters/cursor/src/schemas/surface-scan-policy.schema.json +42 -0
- package/adapters/cursor/src/schemas/timeout-policy.schema.json +24 -0
- package/adapters/cursor/src/schemas/token-estimate-record.schema.json +75 -0
- package/adapters/cursor/src/schemas/token-estimate-result.schema.json +43 -0
- package/adapters/cursor/src/schemas/watchdog-termination-envelope.schema.json +156 -0
- package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
- package/adapters/kimi/bin/consumer-contract-vectors.json +7 -7
- package/adapters/kimi/bin/error-codes.json +1 -1
- package/adapters/kimi/bin/foundation-resource-binding.json +1 -1
- package/adapters/kimi/bin/prebuild-manifest.json +8 -4
- package/adapters/kimi/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/kimi/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/kimi/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/kimi/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/kimi/bin/registry.json +1 -1
- package/adapters/kimi/bin/release-skill.bundle.mjs +3560 -1200
- package/adapters/kimi/bin/rules.json +1 -1
- package/adapters/kimi/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/kimi/data/hosts/registry.json +1 -0
- package/adapters/kimi/schemas/release-plan.schema.json +255 -25
- package/adapters/kimi/schemas/release-project.schema.json +228 -26
- package/adapters/kimi/skills/release-finish/SKILL.md +17 -4
- package/adapters/kimi/skills/release-help/SKILL.md +40 -39
- package/adapters/kimi/src/schemas/host-descriptor.schema.json +9 -2
- package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
- package/adapters/qoder/bin/consumer-contract-vectors.json +7 -7
- package/adapters/qoder/bin/error-codes.json +1 -1
- package/adapters/qoder/bin/foundation-resource-binding.json +1 -1
- package/adapters/qoder/bin/prebuild-manifest.json +8 -4
- package/adapters/qoder/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/qoder/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/qoder/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/qoder/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/qoder/bin/registry.json +1 -1
- package/adapters/qoder/bin/release-skill.bundle.mjs +3560 -1200
- package/adapters/qoder/bin/rules.json +1 -1
- package/adapters/qoder/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/qoder/data/hosts/registry.json +1 -0
- package/adapters/qoder/schemas/release-plan.schema.json +255 -25
- package/adapters/qoder/schemas/release-project.schema.json +228 -26
- package/adapters/qoder/skills/release-finish/SKILL.md +17 -4
- package/adapters/qoder/skills/release-help/SKILL.md +40 -39
- package/adapters/qoder/src/schemas/host-descriptor.schema.json +9 -2
- package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
- package/adapters/workbuddy/bin/consumer-contract-vectors.json +7 -7
- package/adapters/workbuddy/bin/error-codes.json +1 -1
- package/adapters/workbuddy/bin/foundation-resource-binding.json +1 -1
- package/adapters/workbuddy/bin/prebuild-manifest.json +8 -4
- package/adapters/workbuddy/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/workbuddy/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/workbuddy/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/workbuddy/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/workbuddy/bin/registry.json +1 -1
- package/adapters/workbuddy/bin/release-skill.bundle.mjs +3560 -1200
- package/adapters/workbuddy/bin/rules.json +1 -1
- package/adapters/workbuddy/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/workbuddy/data/hosts/registry.json +1 -0
- package/adapters/workbuddy/schemas/release-plan.schema.json +255 -25
- package/adapters/workbuddy/schemas/release-project.schema.json +228 -26
- package/adapters/workbuddy/skills/release-finish/SKILL.md +17 -4
- package/adapters/workbuddy/skills/release-help/SKILL.md +40 -39
- package/adapters/workbuddy/src/schemas/host-descriptor.schema.json +9 -2
- package/bin/consumer-contract-vectors.json +7 -7
- package/bin/error-codes.json +1 -1
- package/bin/foundation-resource-binding.json +1 -1
- package/bin/prebuild-manifest.json +8 -4
- package/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/bin/registry.json +1 -1
- package/bin/release-skill-cli.mjs +25 -1
- package/bin/release-skill.bundle.mjs +3560 -1200
- package/bin/rules.json +1 -1
- package/data/hosts/cursor/host-descriptor.json +34 -0
- package/data/hosts/registry.json +1 -0
- package/package.json +7 -5
- package/platform-manifest.json +75 -9
- package/schemas/release-plan.schema.json +255 -25
- package/schemas/release-project.schema.json +228 -26
- package/scripts/sync-public-files.mjs +3 -22
- package/skills/release-finish/SKILL.md +17 -4
- package/skills/release-help/SKILL.md +40 -39
- package/skills-src/release-finish/SKILL.md +17 -4
- package/skills-src/release-help/SKILL.md +40 -39
- package/src/adapters/contract.mjs +1 -0
- package/src/adapters/plugin-marketplace.mjs +201 -9
- package/src/commands/post-release-local.mjs +290 -34
- package/src/commands/prepare.mjs +74 -9
- package/src/commands/publish.mjs +4 -1
- package/src/commands/ship.mjs +2 -0
- package/src/commands/verify.mjs +73 -0
- package/src/core/checkpoints.mjs +5 -2
- package/src/core/config.mjs +1 -1
- package/src/core/foundation-host-verification.mjs +168 -0
- package/src/core/plan.mjs +19 -1
- package/src/core/postpublish.mjs +9 -1
- package/src/core/run-retention.mjs +1 -1
- package/src/core/surface-host-bindings.mjs +1 -0
- package/src/core/verification-gates.mjs +1 -1
- package/src/platforms/registry.mjs +225 -16
- package/src/producers/build-adapters.mjs +21 -26
- package/src/producers/foundation-resource-projection.mjs +3 -3
- package/src/schemas/host-descriptor.schema.json +9 -2
|
@@ -132,6 +132,70 @@ function codexCrossValidateListEntry(found, action) {
|
|
|
132
132
|
return { ok: true };
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
+
// --- qoder strategy -------------------------------------------------------
|
|
136
|
+
|
|
137
|
+
function qoderParseListOutput(listOutput, pluginId) {
|
|
138
|
+
if (!Array.isArray(listOutput)) {
|
|
139
|
+
return { ok: false, error: 'Qoder plugin list did not return an array' };
|
|
140
|
+
}
|
|
141
|
+
const matches = listOutput.filter((entry) => entry?.id === pluginId);
|
|
142
|
+
if (matches.length === 0) {
|
|
143
|
+
return { ok: false, error: `plugin "${pluginId}" not found in Qoder plugin list` };
|
|
144
|
+
}
|
|
145
|
+
if (matches.length !== 1) {
|
|
146
|
+
return { ok: false, error: `plugin "${pluginId}" has duplicate Qoder list entries` };
|
|
147
|
+
}
|
|
148
|
+
const [found] = matches;
|
|
149
|
+
if (typeof found.installPath !== 'string' || found.installPath.length === 0) {
|
|
150
|
+
return { ok: false, error: `plugin "${pluginId}" found but missing installPath` };
|
|
151
|
+
}
|
|
152
|
+
return { ok: true, found, installPath: found.installPath };
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function qoderParseMarketplaceListOutput(listOutput, marketplace) {
|
|
156
|
+
if (!Array.isArray(listOutput)) {
|
|
157
|
+
return { ok: false, error: 'Qoder marketplace list did not return an array' };
|
|
158
|
+
}
|
|
159
|
+
const matches = listOutput.filter((entry) => entry?.name === marketplace);
|
|
160
|
+
if (matches.length === 0) {
|
|
161
|
+
return { ok: false, error: `marketplace "${marketplace}" not found in Qoder marketplace list` };
|
|
162
|
+
}
|
|
163
|
+
if (matches.length !== 1) {
|
|
164
|
+
return { ok: false, error: `marketplace "${marketplace}" has duplicate Qoder list entries` };
|
|
165
|
+
}
|
|
166
|
+
const [found] = matches;
|
|
167
|
+
if (found.source?.source !== 'git' || typeof found.source.url !== 'string' || found.source.url.length === 0) {
|
|
168
|
+
return { ok: false, error: `marketplace "${marketplace}" has invalid Qoder git source` };
|
|
169
|
+
}
|
|
170
|
+
if (typeof found.installLocation !== 'string' || found.installLocation.length === 0) {
|
|
171
|
+
return { ok: false, error: `marketplace "${marketplace}" found but missing installLocation` };
|
|
172
|
+
}
|
|
173
|
+
return { ok: true, found, installPath: found.installLocation };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function qoderExtractInstallPath({ listParsed }) {
|
|
177
|
+
return { ok: true, installPath: listParsed?.installPath };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function qoderExtractListIdentity(found) {
|
|
181
|
+
return {
|
|
182
|
+
plugin: found.name,
|
|
183
|
+
marketplace: String(found.id ?? '').split('@').slice(1).join('@'),
|
|
184
|
+
version: found.version,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function qoderCrossValidateListEntry(found, action) {
|
|
189
|
+
const selector = `${action.plugin}@${action.marketplace}`;
|
|
190
|
+
if (found.name !== action.plugin || found.source !== selector || found.scope !== 'user') {
|
|
191
|
+
return { ok: false, error: `Qoder plugin "${selector}" does not match its frozen user-scope identity` };
|
|
192
|
+
}
|
|
193
|
+
if (found.version !== action.version) {
|
|
194
|
+
return { ok: false, error: `list version "${found.version}" does not match action version "${action.version}"` };
|
|
195
|
+
}
|
|
196
|
+
return { ok: true };
|
|
197
|
+
}
|
|
198
|
+
|
|
135
199
|
// --- platform descriptors --------------------------------------------------
|
|
136
200
|
|
|
137
201
|
const CLAUDE = Object.freeze({
|
|
@@ -188,6 +252,7 @@ const CLAUDE = Object.freeze({
|
|
|
188
252
|
pluginDirName: '.claude-plugin',
|
|
189
253
|
templateFileName: 'plugin.json',
|
|
190
254
|
hasMarketplace: false,
|
|
255
|
+
enabled: true,
|
|
191
256
|
}),
|
|
192
257
|
strategy: Object.freeze({
|
|
193
258
|
parseListOutput: claudeParseListOutput,
|
|
@@ -249,6 +314,7 @@ const CODEX = Object.freeze({
|
|
|
249
314
|
templateFileName: 'plugin.json',
|
|
250
315
|
marketplaceFileName: null,
|
|
251
316
|
hasMarketplace: false,
|
|
317
|
+
enabled: true,
|
|
252
318
|
}),
|
|
253
319
|
strategy: Object.freeze({
|
|
254
320
|
parseListOutput: codexParseListOutput,
|
|
@@ -309,6 +375,7 @@ const KIMI = Object.freeze({
|
|
|
309
375
|
templateFileName: 'plugin.json',
|
|
310
376
|
marketplaceFileName: null,
|
|
311
377
|
hasMarketplace: false,
|
|
378
|
+
enabled: true,
|
|
312
379
|
}),
|
|
313
380
|
strategy: Object.freeze({
|
|
314
381
|
parseListOutput: null,
|
|
@@ -395,6 +462,7 @@ const CODEBUDDY = Object.freeze({
|
|
|
395
462
|
templateFileName: 'plugin.json',
|
|
396
463
|
marketplaceFileName: null,
|
|
397
464
|
hasMarketplace: false,
|
|
465
|
+
enabled: true,
|
|
398
466
|
}),
|
|
399
467
|
strategy: Object.freeze({
|
|
400
468
|
parseListOutput: null,
|
|
@@ -408,20 +476,126 @@ const CODEBUDDY = Object.freeze({
|
|
|
408
476
|
}),
|
|
409
477
|
});
|
|
410
478
|
|
|
411
|
-
|
|
412
|
-
|
|
479
|
+
const QODER = Object.freeze({
|
|
480
|
+
id: 'qoder',
|
|
481
|
+
skillProjectionSurface: 'platforms/qoder',
|
|
482
|
+
distributionType: 'qoder-plugin',
|
|
483
|
+
actionType: 'qoder-marketplace-install',
|
|
484
|
+
adapter: 'plugin-marketplace',
|
|
485
|
+
automatable: true,
|
|
486
|
+
installMethod: 'structured-cli',
|
|
487
|
+
// Qoder's marketplace-add command follows the marketplace default branch;
|
|
488
|
+
// the frozen commit is checked from the materialized Hub checkout before
|
|
489
|
+
// installation, so marketplace add itself is not treated as a ref pin.
|
|
490
|
+
refStrength: 'commit-sha',
|
|
491
|
+
outputProtocol: 'structured',
|
|
492
|
+
identityEvidence: 'list-record',
|
|
493
|
+
degradationPolicy: 'block',
|
|
494
|
+
cli: Object.freeze({
|
|
495
|
+
binary: 'qodercli',
|
|
496
|
+
binaryAliases: Object.freeze(['qoder']),
|
|
497
|
+
marketplaceAdd: (repo) => ['plugins', 'marketplace', 'add', repo, '--scope', 'user'],
|
|
498
|
+
install: (plugin, marketplace) => ['plugins', 'install', `${plugin}@${marketplace}`, '--scope', 'user', '--json'],
|
|
499
|
+
marketplaceList: () => ['plugins', 'marketplace', 'list', '--json'],
|
|
500
|
+
list: () => ['plugins', 'list', '--json'],
|
|
501
|
+
}),
|
|
502
|
+
jsonProtocol: Object.freeze({
|
|
503
|
+
listOutput: 'array',
|
|
504
|
+
installPathSource: 'list',
|
|
505
|
+
marketplaceAddOutput: null,
|
|
506
|
+
pluginInstallOutput: null,
|
|
507
|
+
}),
|
|
508
|
+
isolationEnv: (home) => ({ HOME: home }),
|
|
509
|
+
isolationSubdirs: Object.freeze(['.qoder']),
|
|
510
|
+
manifestPaths: Object.freeze({
|
|
511
|
+
plugin: '.qoder-plugin/plugin.json',
|
|
512
|
+
marketplace: null,
|
|
513
|
+
}),
|
|
514
|
+
marketplaceSourceForm: null,
|
|
515
|
+
marketplaceEntryCarriesVersion: false,
|
|
516
|
+
marketplaceRefForm: null,
|
|
517
|
+
knownHostArtifacts: Object.freeze(['.git']),
|
|
518
|
+
schemaRequiredFields: Object.freeze(['plugin', 'marketplace', 'entrySkill']),
|
|
519
|
+
skillRendering: Object.freeze({ mode: 'substitute', preamble: 'qoder', placeholder: '${CLAUDE_PLUGIN_ROOT}' }),
|
|
520
|
+
buildAdapter: Object.freeze({
|
|
521
|
+
name: 'qoder',
|
|
522
|
+
pluginDirName: '.qoder-plugin',
|
|
523
|
+
templateFileName: 'plugin.json',
|
|
524
|
+
marketplaceFileName: null,
|
|
525
|
+
hasMarketplace: false,
|
|
526
|
+
enabled: true,
|
|
527
|
+
}),
|
|
528
|
+
strategy: Object.freeze({
|
|
529
|
+
parseListOutput: qoderParseListOutput,
|
|
530
|
+
parseMarketplaceListOutput: qoderParseMarketplaceListOutput,
|
|
531
|
+
extractInstallPath: qoderExtractInstallPath,
|
|
532
|
+
extractListIdentity: qoderExtractListIdentity,
|
|
533
|
+
crossValidateListEntry: qoderCrossValidateListEntry,
|
|
534
|
+
buildManualRequirement: null,
|
|
535
|
+
readManifest: null,
|
|
536
|
+
}),
|
|
537
|
+
});
|
|
413
538
|
|
|
414
|
-
const
|
|
415
|
-
|
|
539
|
+
const CURSOR = Object.freeze({
|
|
540
|
+
id: 'cursor',
|
|
541
|
+
skillProjectionSurface: 'platforms/cursor',
|
|
542
|
+
distributionType: 'cursor-plugin',
|
|
543
|
+
actionType: null,
|
|
544
|
+
adapter: null,
|
|
545
|
+
automatable: true,
|
|
546
|
+
installMethod: 'foundation-host-verification',
|
|
547
|
+
refStrength: 'local-payload',
|
|
548
|
+
outputProtocol: 'structured',
|
|
549
|
+
identityEvidence: 'host-verification-result',
|
|
550
|
+
degradationPolicy: 'block',
|
|
551
|
+
cli: null,
|
|
552
|
+
jsonProtocol: Object.freeze({
|
|
553
|
+
listOutput: null,
|
|
554
|
+
installPathSource: null,
|
|
555
|
+
marketplaceAddOutput: null,
|
|
556
|
+
pluginInstallOutput: null,
|
|
557
|
+
}),
|
|
558
|
+
isolationEnv: null,
|
|
559
|
+
isolationSubdirs: Object.freeze([]),
|
|
560
|
+
manifestPaths: Object.freeze({ plugin: null, marketplace: null }),
|
|
561
|
+
marketplaceSourceForm: null,
|
|
562
|
+
marketplaceEntryCarriesVersion: null,
|
|
563
|
+
marketplaceRefForm: null,
|
|
564
|
+
knownHostArtifacts: Object.freeze([]),
|
|
565
|
+
schemaRequiredFields: Object.freeze(['entrySkill']),
|
|
566
|
+
skillRendering: null,
|
|
567
|
+
buildAdapter: Object.freeze({
|
|
568
|
+
name: 'cursor',
|
|
569
|
+
pluginDirName: '.cursor-plugin',
|
|
570
|
+
templateFileName: 'plugin.json',
|
|
571
|
+
marketplaceFileName: null,
|
|
572
|
+
hasMarketplace: false,
|
|
573
|
+
enabled: true,
|
|
574
|
+
}),
|
|
575
|
+
strategy: Object.freeze({
|
|
576
|
+
parseListOutput: null,
|
|
577
|
+
extractInstallPath: null,
|
|
578
|
+
extractListIdentity: null,
|
|
579
|
+
crossValidateListEntry: null,
|
|
580
|
+
buildManualRequirement: null,
|
|
581
|
+
readManifest: null,
|
|
582
|
+
}),
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
/** Ordered platform registry. Order is significant. */
|
|
586
|
+
export const PLATFORMS = Object.freeze([CLAUDE, CODEX, KIMI, CODEBUDDY, QODER, CURSOR]);
|
|
587
|
+
|
|
588
|
+
const VALID_DISTRIBUTION_TYPES = new Set(['claude-plugin', 'codex-plugin', 'kimi-plugin', 'codebuddy-plugin', 'qoder-plugin', 'cursor-plugin']);
|
|
589
|
+
const VALID_ACTION_TYPES = new Set(['claude-marketplace-install', 'codex-marketplace-install', 'kimi-marketplace-install', 'codebuddy-marketplace-install', 'qoder-marketplace-install', null]);
|
|
416
590
|
const VALID_SOURCE_FORMS = new Set(['string', 'local-path-object', null]);
|
|
417
591
|
const VALID_MARKETPLACE_REF_FORMS = new Set(['sha', 'name', null]);
|
|
418
592
|
const VALID_LIST_OUTPUTS = new Set(['array', 'installed-object', null]);
|
|
419
593
|
const VALID_CLI_OUTPUTS = new Set(['json', null]);
|
|
420
594
|
const VALID_ENTRY_VERSION_BINDING = new Set([true, false, null]);
|
|
421
|
-
const VALID_INSTALL_METHODS = new Set(['structured-cli', 'interactive-only', 'human-attestation']);
|
|
422
|
-
const VALID_REF_STRENGTHS = new Set(['commit-sha', 'name-ref', 'unfixable']);
|
|
595
|
+
const VALID_INSTALL_METHODS = new Set(['structured-cli', 'interactive-only', 'human-attestation', 'foundation-host-verification']);
|
|
596
|
+
const VALID_REF_STRENGTHS = new Set(['commit-sha', 'name-ref', 'unfixable', 'local-payload']);
|
|
423
597
|
const VALID_OUTPUT_PROTOCOLS = new Set(['structured', 'text', 'none']);
|
|
424
|
-
const VALID_IDENTITY_EVIDENCE = new Set(['list-record', 'install-output', 'filesystem-payload', 'human-attestation']);
|
|
598
|
+
const VALID_IDENTITY_EVIDENCE = new Set(['list-record', 'install-output', 'filesystem-payload', 'human-attestation', 'host-verification-result']);
|
|
425
599
|
const VALID_DEGRADATION_POLICIES = new Set(['block', 'human-attestation', 'human-attestation-with-fallback']);
|
|
426
600
|
const SKILL_PROJECTION_SURFACE_PATTERN = /^platforms\/[a-z0-9]+(?:-[a-z0-9]+)*$/u;
|
|
427
601
|
|
|
@@ -442,19 +616,19 @@ const STANDALONE_SHA_RE = /^[0-9a-f]{40}$/u;
|
|
|
442
616
|
function standaloneIdentityCore(platformOrId, fields) {
|
|
443
617
|
const platform = typeof platformOrId === 'string' ? getPlatform(platformOrId) : platformOrId;
|
|
444
618
|
const id = platform?.id;
|
|
445
|
-
if (
|
|
619
|
+
if (!['claude', 'codex', 'qoder'].includes(id)) {
|
|
446
620
|
throw new Error(`standalone-index install identity is unsupported for platform "${id ?? '<unknown>'}"`);
|
|
447
621
|
}
|
|
448
622
|
const { name, source, version } = fields;
|
|
449
623
|
if (typeof name !== 'string' || name.length === 0
|
|
450
624
|
|| !source || typeof source !== 'object' || Array.isArray(source)
|
|
451
625
|
|| typeof source.source !== 'string'
|
|
452
|
-
|| typeof source.ref !== 'string' || source.ref.length === 0
|
|
453
626
|
|| typeof source.sha !== 'string' || !STANDALONE_SHA_RE.test(source.sha)) {
|
|
454
627
|
throw new Error(`${id} standalone-index install identity has invalid owned fields`);
|
|
455
628
|
}
|
|
456
629
|
if (id === 'claude') {
|
|
457
|
-
if (
|
|
630
|
+
if (typeof source.ref !== 'string' || source.ref.length === 0
|
|
631
|
+
|| source.source !== 'github' || typeof source.repo !== 'string' || source.repo.length === 0
|
|
458
632
|
|| typeof version !== 'string' || version.length === 0) {
|
|
459
633
|
throw new Error('Claude standalone-index install identity requires github repo, ref, sha, and version');
|
|
460
634
|
}
|
|
@@ -465,6 +639,12 @@ function standaloneIdentityCore(platformOrId, fields) {
|
|
|
465
639
|
};
|
|
466
640
|
}
|
|
467
641
|
if (source.source !== 'url' || typeof source.url !== 'string' || source.url.length === 0) {
|
|
642
|
+
throw new Error(`${id === 'qoder' ? 'Qoder' : 'Codex'} standalone-index install identity requires url and sha`);
|
|
643
|
+
}
|
|
644
|
+
if (id === 'qoder') {
|
|
645
|
+
return { name, source: { source: 'url', url: source.url, sha: source.sha } };
|
|
646
|
+
}
|
|
647
|
+
if (typeof source.ref !== 'string' || source.ref.length === 0) {
|
|
468
648
|
throw new Error('Codex standalone-index install identity requires url, ref, and sha');
|
|
469
649
|
}
|
|
470
650
|
return {
|
|
@@ -494,6 +674,12 @@ export function buildExpectedStandaloneIndexInstallIdentity(platformOrId, frozen
|
|
|
494
674
|
source: { source: 'url', url: `https://github.com/${repo}.git`, ref: `refs/tags/${tag}`, sha },
|
|
495
675
|
});
|
|
496
676
|
}
|
|
677
|
+
if (id === 'qoder') {
|
|
678
|
+
return standaloneIdentityCore(platform, {
|
|
679
|
+
name,
|
|
680
|
+
source: { source: 'url', url: `https://github.com/${repo}.git`, sha },
|
|
681
|
+
});
|
|
682
|
+
}
|
|
497
683
|
return standaloneIdentityCore(platform, { name, source: {}, version });
|
|
498
684
|
}
|
|
499
685
|
|
|
@@ -531,6 +717,12 @@ export function projectObservedStandaloneIndexInstallIdentity(platformOrId, entr
|
|
|
531
717
|
},
|
|
532
718
|
});
|
|
533
719
|
}
|
|
720
|
+
if (id === 'qoder') {
|
|
721
|
+
return standaloneIdentityCore(platform, {
|
|
722
|
+
name: entry.name,
|
|
723
|
+
source: { source: source.source, url: source.url, sha: source.sha },
|
|
724
|
+
});
|
|
725
|
+
}
|
|
534
726
|
return standaloneIdentityCore(platform, { name: entry.name, source });
|
|
535
727
|
}
|
|
536
728
|
|
|
@@ -573,16 +765,22 @@ export function assertRegistry(registry = PLATFORMS) {
|
|
|
573
765
|
if (!VALID_ACTION_TYPES.has(platform.actionType)) {
|
|
574
766
|
throw new Error(`platform registry: ${label} has illegal actionType "${platform.actionType}"`);
|
|
575
767
|
}
|
|
576
|
-
if (
|
|
768
|
+
if (platform.installMethod !== 'foundation-host-verification'
|
|
769
|
+
&& (typeof platform.adapter !== 'string' || platform.adapter.length === 0)) {
|
|
577
770
|
throw new Error(`platform registry: ${label} needs a non-empty adapter id`);
|
|
578
771
|
}
|
|
772
|
+
if (platform.installMethod === 'foundation-host-verification'
|
|
773
|
+
&& (platform.actionType !== null || platform.adapter !== null)) {
|
|
774
|
+
throw new Error(`platform registry: ${label} host verification must not declare a checkpoint action or adapter`);
|
|
775
|
+
}
|
|
579
776
|
if (!VALID_ENTRY_VERSION_BINDING.has(platform.marketplaceEntryCarriesVersion)) {
|
|
580
777
|
throw new Error(`platform registry: ${label} has illegal marketplaceEntryCarriesVersion "${platform.marketplaceEntryCarriesVersion}"`);
|
|
581
778
|
}
|
|
582
779
|
if (typeof platform.automatable !== 'boolean') {
|
|
583
780
|
throw new Error(`platform registry: ${label} automatable must be boolean`);
|
|
584
781
|
}
|
|
585
|
-
if (
|
|
782
|
+
if (platform.installMethod !== 'foundation-host-verification'
|
|
783
|
+
&& typeof platform.isolationEnv !== 'function') {
|
|
586
784
|
throw new Error(`platform registry: ${label} isolationEnv must be a function`);
|
|
587
785
|
}
|
|
588
786
|
if (!VALID_SOURCE_FORMS.has(platform.marketplaceSourceForm)) {
|
|
@@ -603,6 +801,9 @@ export function assertRegistry(registry = PLATFORMS) {
|
|
|
603
801
|
if (!platform.buildAdapter || typeof platform.buildAdapter !== 'object') {
|
|
604
802
|
throw new Error(`platform registry: ${label} buildAdapter must be an object`);
|
|
605
803
|
}
|
|
804
|
+
if (typeof platform.buildAdapter.enabled !== 'boolean') {
|
|
805
|
+
throw new Error(`platform registry: ${label} buildAdapter.enabled must be boolean`);
|
|
806
|
+
}
|
|
606
807
|
// D6: the adapter directory name is always explicit — prepare's G4
|
|
607
808
|
// declared-host reconciliation and the build producer both key on it.
|
|
608
809
|
if (typeof platform.buildAdapter.name !== 'string' || platform.buildAdapter.name.length === 0) {
|
|
@@ -649,7 +850,11 @@ export function assertRegistry(registry = PLATFORMS) {
|
|
|
649
850
|
throw new Error(`platform registry: ${label} has illegal degradationPolicy "${platform.degradationPolicy}"`);
|
|
650
851
|
}
|
|
651
852
|
|
|
652
|
-
if (platform.
|
|
853
|
+
if (platform.installMethod === 'foundation-host-verification') {
|
|
854
|
+
if (platform.cli !== null) {
|
|
855
|
+
throw new Error(`platform registry: ${label} Foundation host verification must have cli === null`);
|
|
856
|
+
}
|
|
857
|
+
} else if (platform.automatable) {
|
|
653
858
|
if (!platform.cli || typeof platform.cli.marketplaceAdd !== 'function'
|
|
654
859
|
|| typeof platform.cli.install !== 'function' || typeof platform.cli.list !== 'function') {
|
|
655
860
|
throw new Error(`platform registry: automatable platform ${label} needs cli template functions`);
|
|
@@ -690,7 +895,8 @@ export function assertRegistry(registry = PLATFORMS) {
|
|
|
690
895
|
|
|
691
896
|
// --- capability contract consistency rules (能力契约一致性规则) -----------
|
|
692
897
|
// automatable === true 必须有 installMethod === 'structured-cli'
|
|
693
|
-
if (platform.automatable === true
|
|
898
|
+
if (platform.automatable === true
|
|
899
|
+
&& !['structured-cli', 'foundation-host-verification'].includes(platform.installMethod)) {
|
|
694
900
|
throw new Error(`platform registry: ${label} is automatable but installMethod is "${platform.installMethod}" (expected "structured-cli")`);
|
|
695
901
|
}
|
|
696
902
|
// automatable === false 必须有 installMethod !== 'structured-cli'
|
|
@@ -728,6 +934,9 @@ export function resolvePlatformRoute(platform) {
|
|
|
728
934
|
if (installMethod === 'interactive-only' || installMethod === 'human-attestation') {
|
|
729
935
|
return { route: 'human-attestation', reason: `installMethod is ${installMethod}` };
|
|
730
936
|
}
|
|
937
|
+
if (installMethod === 'foundation-host-verification') {
|
|
938
|
+
return { route: 'host-verification', reason: 'installMethod is foundation-host-verification' };
|
|
939
|
+
}
|
|
731
940
|
throw new Error(
|
|
732
941
|
`platform "${platform?.id ?? '<unknown>'}" with installMethod="${installMethod}" cannot be routed`,
|
|
733
942
|
);
|
|
@@ -745,7 +954,7 @@ export function resolveCapabilityConflicts(platform) {
|
|
|
745
954
|
const { id, automatable, installMethod, refStrength, identityEvidence, cli, strategy } = platform;
|
|
746
955
|
|
|
747
956
|
// automatable <-> installMethod 一致性
|
|
748
|
-
if (automatable === true &&
|
|
957
|
+
if (automatable === true && !['structured-cli', 'foundation-host-verification'].includes(installMethod)) {
|
|
749
958
|
conflicts.push(`automatable=true but installMethod="${installMethod}"`);
|
|
750
959
|
}
|
|
751
960
|
if (automatable === false && installMethod === 'structured-cli') {
|
|
@@ -763,7 +972,7 @@ export function resolveCapabilityConflicts(platform) {
|
|
|
763
972
|
}
|
|
764
973
|
|
|
765
974
|
// 自动化平台必须有 cli 和策略解析函数
|
|
766
|
-
if (automatable === true) {
|
|
975
|
+
if (automatable === true && installMethod !== 'foundation-host-verification') {
|
|
767
976
|
if (!cli || typeof cli !== 'object') {
|
|
768
977
|
conflicts.push(`automatable=true but cli is missing`);
|
|
769
978
|
}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Reads skill metadata from skills-src/ and plugin.json templates,
|
|
5
5
|
* generates self-contained adapter directories for each platform
|
|
6
|
-
* (claude, codex, kimi,
|
|
6
|
+
* enabled by the platform registry (currently claude, codex, kimi,
|
|
7
|
+
* workbuddy, and qoder).
|
|
7
8
|
*
|
|
8
9
|
* Each adapter root contains:
|
|
9
10
|
* - Plugin manifest (.claude-plugin/, .codex-plugin/, .kimi-plugin/,
|
|
@@ -208,7 +209,9 @@ export function computeBuildAdaptersDigest(sourceBytes) {
|
|
|
208
209
|
// tree (adapters/workbuddy/, manifest .codebuddy-plugin/plugin.json). This is
|
|
209
210
|
// what lets codebuddy join the publish pipeline WITHOUT changing a single byte
|
|
210
211
|
// of the generated workbuddy adapter (the former BUILD_ONLY workbuddy entry).
|
|
211
|
-
const REGISTRY_PLATFORMS = PLATFORM_REGISTRY
|
|
212
|
+
const REGISTRY_PLATFORMS = PLATFORM_REGISTRY
|
|
213
|
+
.filter((platform) => platform.buildAdapter.enabled)
|
|
214
|
+
.map((platform) => ({
|
|
212
215
|
name: platform.buildAdapter?.name ?? platform.id,
|
|
213
216
|
pluginDirName: platform.buildAdapter.pluginDirName,
|
|
214
217
|
templateFileName: platform.buildAdapter.templateFileName,
|
|
@@ -216,31 +219,14 @@ const REGISTRY_PLATFORMS = PLATFORM_REGISTRY.map((platform) => ({
|
|
|
216
219
|
? { marketplaceFileName: platform.buildAdapter.marketplaceFileName }
|
|
217
220
|
: {}),
|
|
218
221
|
hasMarketplace: platform.buildAdapter.hasMarketplace,
|
|
219
|
-
}));
|
|
222
|
+
}));
|
|
220
223
|
|
|
221
224
|
/**
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
* plan schemas, no automated install checkpoint. A host joins the pipeline
|
|
226
|
-
* only with a full registry descriptor (strategy, CLI protocol, schema enum);
|
|
227
|
-
* until then a build-only entry lets the build emit an installable adapter
|
|
228
|
-
* tree without fabricating an unverified install protocol.
|
|
229
|
-
*
|
|
230
|
-
* workbuddy (the CodeBuddy/WorkBuddy plugin, manifest
|
|
231
|
-
* `.codebuddy-plugin/plugin.json`, `${CODEBUDDY_PLUGIN_ROOT}` expanded inline
|
|
232
|
-
* in skill content) moved into the registry as the `codebuddy` platform with
|
|
233
|
-
* `buildAdapter.name = 'workbuddy'`, so its adapter tree is still produced —
|
|
234
|
-
* byte-for-byte unchanged — via REGISTRY_PLATFORMS. Qoder remains build-only:
|
|
235
|
-
* its installable projection is public, while release plans intentionally do
|
|
236
|
-
* not gain a qoder distribution type or publish checkpoint.
|
|
225
|
+
* Compatibility export retained for callers that still import the historical
|
|
226
|
+
* build-only list. Every generated adapter now derives from the registry's
|
|
227
|
+
* buildAdapter.enabled flag, so this list must remain empty.
|
|
237
228
|
*/
|
|
238
|
-
export const BUILD_ONLY_ADAPTERS = Object.freeze([
|
|
239
|
-
name: 'qoder',
|
|
240
|
-
pluginDirName: '.qoder-plugin',
|
|
241
|
-
templateFileName: 'plugin.json',
|
|
242
|
-
hasMarketplace: false,
|
|
243
|
-
})]);
|
|
229
|
+
export const BUILD_ONLY_ADAPTERS = Object.freeze([]);
|
|
244
230
|
|
|
245
231
|
export const PLATFORMS = Object.freeze([...REGISTRY_PLATFORMS, ...BUILD_ONLY_ADAPTERS]);
|
|
246
232
|
|
|
@@ -362,6 +348,11 @@ const QODER_PREAMBLE = `\
|
|
|
362
348
|
>\n\
|
|
363
349
|
`;
|
|
364
350
|
|
|
351
|
+
const CURSOR_PREAMBLE = CODEX_PREAMBLE.replaceAll('Codex', 'Cursor').replace(
|
|
352
|
+
'> 令 `RELEASE_SKILL_ENTRY',
|
|
353
|
+
'> 校验 `PLUGIN_ROOT/.cursor-plugin/plugin.json` 是根内的普通文件,且名称为 `release-skill`;清单缺失或不一致时停止。Cursor 不保证注入插件根变量。\n> 令 `RELEASE_SKILL_ENTRY',
|
|
354
|
+
);
|
|
355
|
+
|
|
365
356
|
/**
|
|
366
357
|
* Render SKILL.md content for a specific platform.
|
|
367
358
|
*
|
|
@@ -386,12 +377,13 @@ function renderSkillForPlatform(content, platformName) {
|
|
|
386
377
|
return content.replaceAll('${CLAUDE_PLUGIN_ROOT}', '${CODEBUDDY_PLUGIN_ROOT}');
|
|
387
378
|
}
|
|
388
379
|
|
|
389
|
-
if (platformName === 'codex' || platformName === 'kimi' || platformName === 'qoder') {
|
|
390
|
-
const hostLabel = { codex: 'Codex', kimi: 'Kimi', qoder: 'Qoder' }[platformName];
|
|
380
|
+
if (platformName === 'codex' || platformName === 'kimi' || platformName === 'qoder' || platformName === 'cursor') {
|
|
381
|
+
const hostLabel = { codex: 'Codex', kimi: 'Kimi', qoder: 'Qoder', cursor: 'Cursor' }[platformName];
|
|
391
382
|
const preamble = {
|
|
392
383
|
codex: CODEX_PREAMBLE,
|
|
393
384
|
kimi: KIMI_PREAMBLE,
|
|
394
385
|
qoder: QODER_PREAMBLE,
|
|
386
|
+
cursor: CURSOR_PREAMBLE,
|
|
395
387
|
}[platformName];
|
|
396
388
|
let rendered = content.replaceAll(
|
|
397
389
|
'${CLAUDE_PLUGIN_ROOT}/bin/release-skill-local-finish.mjs',
|
|
@@ -405,6 +397,9 @@ function renderSkillForPlatform(content, platformName) {
|
|
|
405
397
|
.replaceAll('RELEASE_SKILL_ENTRY', 'RELEASE_SKILL_LOCAL_FINISH_ENTRY')
|
|
406
398
|
.replaceAll('release-skill.mjs', 'release-skill-local-finish.mjs')
|
|
407
399
|
: preamble;
|
|
400
|
+
if (platformName === 'cursor' && /\$\{(?:CLAUDE|CURSOR|CODEBUDDY|KIMI)[A-Z_]*\}/u.test(rendered)) {
|
|
401
|
+
throw new Error('Cursor rendering contains a residual host-specific placeholder');
|
|
402
|
+
}
|
|
408
403
|
// A remaining bare host-root reference has no safe path-derived equivalent.
|
|
409
404
|
if (rendered.includes('${CLAUDE_PLUGIN_ROOT}')) {
|
|
410
405
|
throw new Error(`${hostLabel} rendering found an unsupported bare CLAUDE_PLUGIN_ROOT reference`);
|
|
@@ -55,9 +55,9 @@ import { digestBytes, publishFileOrReplace, readFileStrict, withTemporaryWorkspa
|
|
|
55
55
|
import { canonicalJson } from '../core/digest.mjs';
|
|
56
56
|
|
|
57
57
|
export const FOUNDATION_PACKAGES = Object.freeze({
|
|
58
|
-
'skill-family-contracts': '0.
|
|
59
|
-
'skill-family-engineering-kit': '0.
|
|
60
|
-
'skill-family-harness-node': '0.
|
|
58
|
+
'skill-family-contracts': '0.21.0',
|
|
59
|
+
'skill-family-engineering-kit': '0.21.0',
|
|
60
|
+
'skill-family-harness-node': '0.21.0',
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
export const BINDING_RECORD_PATH = 'bin/foundation-resource-binding.json';
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"additionalProperties": false,
|
|
26
26
|
"required": ["driverId", "authStrategy", "credentialMutation"],
|
|
27
27
|
"properties": {
|
|
28
|
-
"driverId": { "enum": ["kimi-code-print-v1", "workbuddy-codebuddy-print-v1", "codebuddy-print-v1", "claude-code-print-v1", "codex-exec-v1", "qodercli-print-v1"] },
|
|
28
|
+
"driverId": { "enum": ["kimi-code-print-v1", "workbuddy-codebuddy-print-v1", "codebuddy-print-v1", "claude-code-print-v1", "codex-exec-v1", "qodercli-print-v1", "cursor-agent-print-v1"] },
|
|
29
29
|
"authStrategy": { "const": "existing-user-state" },
|
|
30
30
|
"credentialMutation": { "const": "host-managed" }
|
|
31
31
|
}
|
|
@@ -109,7 +109,14 @@
|
|
|
109
109
|
}
|
|
110
110
|
},
|
|
111
111
|
{
|
|
112
|
-
"if": { "properties": { "hostId": { "
|
|
112
|
+
"if": { "properties": { "hostId": { "const": "cursor" } }, "required": ["hostId"] },
|
|
113
|
+
"then": {
|
|
114
|
+
"required": ["verification"],
|
|
115
|
+
"properties": { "verification": { "type": "object", "properties": { "driverId": { "const": "cursor-agent-print-v1" } } } }
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"if": { "properties": { "hostId": { "enum": ["kimi-code", "workbuddy", "codebuddy", "claude", "codex", "qoder", "cursor"] } }, "required": ["hostId"] },
|
|
113
120
|
"else": { "properties": { "verification": false } }
|
|
114
121
|
},
|
|
115
122
|
{
|