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
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-setup
|
|
3
|
+
description: "首次接入 release-skill:只读发现发布单元与个性化验证候选,机械提取提案,经人工确认 setupDigest 后仅首次创建配置"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Cursor 安装入口解析协议**:在调用 CLI 前,Agent 必须从宿主当前已加载技能的元数据中取得本 `SKILL.md` 的实际绝对路径,并将该字面量记为 `SKILL_FILE`。
|
|
7
|
+
> `SKILL_FILE` 不是环境变量;禁止从工作目录、可执行搜索路径、源码仓库或 shell 调用上下文猜测。若宿主未提供该绝对路径,立即停止并报告安装定位失败。
|
|
8
|
+
> 对 `SKILL_FILE` 执行 `realpath`,取其目录向上两级得到 `PLUGIN_ROOT`;校验真实技能路径匹配 `PLUGIN_ROOT/skills/*/SKILL.md` 且仍位于插件根内(路径包含检查)。
|
|
9
|
+
> 校验 `PLUGIN_ROOT/.cursor-plugin/plugin.json` 是根内的普通文件,且名称为 `release-skill`;清单缺失或不一致时停止。Cursor 不保证注入插件根变量。
|
|
10
|
+
> 令 `RELEASE_SKILL_ENTRY=PLUGIN_ROOT/bin/release-skill.mjs`,对入口执行 `realpath` containment、`lstat` 非符号链接且为普通文件校验。
|
|
11
|
+
> 每一次 shell 工具调用都必须在同一个调用中用上述已验证绝对值设置 `RELEASE_SKILL_ENTRY`,然后执行 `node "$RELEASE_SKILL_ENTRY" ...`;不得依赖前一次 shell 的变量。
|
|
12
|
+
>
|
|
13
|
+
|
|
14
|
+
# release-setup
|
|
15
|
+
|
|
16
|
+
## 适用场景
|
|
17
|
+
|
|
18
|
+
项目尚无 `.release-skill/project.yaml`,或用户要求初始化、接入、校准发布规则时使用。配置已存在时只审计并路由到 `release-assess`,不得重新生成。
|
|
19
|
+
|
|
20
|
+
## 硬边界
|
|
21
|
+
|
|
22
|
+
- 默认只读。README、slogan、CHANGELOG、业务脚本和已有配置均为人工权威内容,不得重写或覆盖。
|
|
23
|
+
- 发现脚本不等于选择或授权。间接脚本以 `SIDE_EFFECTS_UNPROVEN` 排除;项目特有 hook/gate 只能人工增量注册。
|
|
24
|
+
- 仓库、公开文件等证据冲突时停止自动提案,交给人工修正权威事实后重新发现。
|
|
25
|
+
- npm 单元只读提取 `package.json` 的具体入口和旧 `npmRequiredPackagePaths`,报告
|
|
26
|
+
tracked/untracked/ignored/missing/non-regular 状态与覆盖漂移;这些是人工复核候选,
|
|
27
|
+
不得自动写入 `publicFiles` 或 `requiredPublicFiles`。
|
|
28
|
+
- 写入只允许 create-once(仅创建一次),必须同时提供 answers 与精确 `setupDigest`;无安全原生写入能力时失败关闭。
|
|
29
|
+
- Agent 的多次 shell 调用彼此独立;只能用首轮打印的会话目录绝对路径续接,不得假设变量仍存在。
|
|
30
|
+
|
|
31
|
+
## 首次接入
|
|
32
|
+
|
|
33
|
+
1. 检查入口:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
node "$RELEASE_SKILL_ENTRY" help --json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
2. 只读发现并机械提取提案。完整报告仅写入临时会话目录;不要设置 `trap EXIT`,确认前必须保留会话文件:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
set -eu
|
|
43
|
+
PROJECT=<项目绝对路径>
|
|
44
|
+
SETUP_SESSION="$(mktemp -d "${TMPDIR:-/tmp}/release-setup.XXXXXX")"
|
|
45
|
+
REPORT="$SETUP_SESSION/discovery.json"
|
|
46
|
+
ANSWERS="$SETUP_SESSION/answers.json"
|
|
47
|
+
printf 'SETUP_SESSION=%s\nPROJECT=%s\n' "$SETUP_SESSION" "$PROJECT"
|
|
48
|
+
set +e
|
|
49
|
+
node "$RELEASE_SKILL_ENTRY" setup --root "$PROJECT" --json > "$REPORT"
|
|
50
|
+
SETUP_STATUS=$?
|
|
51
|
+
set -e
|
|
52
|
+
[ "$SETUP_STATUS" -eq 0 ] || [ "$SETUP_STATUS" -eq 2 ] || exit "$SETUP_STATUS"
|
|
53
|
+
node -e 'const fs=require("node:fs");const r=JSON.parse(fs.readFileSync(process.argv[1],"utf8"));if(!r.compactSummary){console.error("compactSummary missing");process.exit(2)}process.stdout.write(JSON.stringify(r.compactSummary,null,2)+"\n")' "$REPORT"
|
|
54
|
+
node -e 'const fs=require("node:fs");const r=JSON.parse(fs.readFileSync(process.argv[1],"utf8"));if((r.proposalConflicts??[]).length){console.error("proposal conflicts require human resolution");process.exit(2)}if(!r.recommendedAnswers){console.error("recommendedAnswers missing");process.exit(2)}fs.writeFileSync(process.argv[2],JSON.stringify(r.recommendedAnswers,null,2)+"\n",{flag:"wx",mode:0o600})' "$REPORT" "$ANSWERS"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
若 `proposalConflicts` 非空,暂停,让用户修正仓库/映射权威事实或 npm 入口候选,
|
|
58
|
+
删除本会话目录后从第 2 步重跑,不得猜测选边。构建后才产生且被忽略的入口应先由
|
|
59
|
+
人工确认构建流程与最终 tarball 边界,不能因为 setup 发现了路径就自动信任或纳入公开
|
|
60
|
+
配置。无冲突时可人工增量编辑 `answers.json`:hook 写入
|
|
61
|
+
`recommendedAnswers.projectConfig.hooks` 对应的 `projectConfig.hooks`;gate 写入
|
|
62
|
+
`verificationGates`,并把同一 id 加入 `selectedGateIds`。人工文件保持
|
|
63
|
+
`mode: preserve`,跨单元共享源使用 `sourceScope: workspace`。
|
|
64
|
+
|
|
65
|
+
3. 使用上一步打印的两个绝对字面量重新赋值,运行绑定 dry-run;任何人工编辑后都必须重跑本步:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
set -eu
|
|
69
|
+
SETUP_SESSION=<上一步打印的会话目录绝对路径>
|
|
70
|
+
PROJECT=<上一步打印的项目绝对路径>
|
|
71
|
+
ANSWERS="$SETUP_SESSION/answers.json"
|
|
72
|
+
BOUND_REPORT="$SETUP_SESSION/bound.json"
|
|
73
|
+
node "$RELEASE_SKILL_ENTRY" setup --root "$PROJECT" --answers "$ANSWERS" --json > "$BOUND_REPORT"
|
|
74
|
+
node -e 'const fs=require("node:fs");const r=JSON.parse(fs.readFileSync(process.argv[1],"utf8"));if(!r.compactSummary||!r.setupDigest){console.error("bound setup report incomplete");process.exit(2)}process.stdout.write(JSON.stringify({compactSummary:r.compactSummary,setupDigest:r.setupDigest},null,2)+"\n")' "$BOUND_REPORT"
|
|
75
|
+
printf 'SETUP_SESSION=%s\nPROJECT=%s\n' "$SETUP_SESSION" "$PROJECT"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
只向用户展示绑定摘要、配置差异和精确 `setupDigest`,取得一次明确确认。
|
|
79
|
+
|
|
80
|
+
4. 确认后用原会话与已确认摘要首次创建。三个完整报告均重定向到文件,固定提取器成功后才清理会话目录:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
set -eu
|
|
84
|
+
SETUP_SESSION=<已确认会话目录的绝对路径>
|
|
85
|
+
PROJECT=<已确认项目的绝对路径>
|
|
86
|
+
CONFIRMED_SETUP_DIGEST=<用户确认的精确 setupDigest>
|
|
87
|
+
ANSWERS="$SETUP_SESSION/answers.json"
|
|
88
|
+
CREATED_REPORT="$SETUP_SESSION/created.json"
|
|
89
|
+
POST_REPORT="$SETUP_SESSION/post-setup.json"
|
|
90
|
+
ASSESS_REPORT="$SETUP_SESSION/assess.json"
|
|
91
|
+
node "$RELEASE_SKILL_ENTRY" setup --root "$PROJECT" --answers "$ANSWERS" --write --confirm-setup "$CONFIRMED_SETUP_DIGEST" --json > "$CREATED_REPORT"
|
|
92
|
+
node "$RELEASE_SKILL_ENTRY" setup --root "$PROJECT" --json > "$POST_REPORT"
|
|
93
|
+
set +e
|
|
94
|
+
node "$RELEASE_SKILL_ENTRY" assess --root "$PROJECT" --offline --json > "$ASSESS_REPORT"
|
|
95
|
+
ASSESS_EXIT=$?
|
|
96
|
+
set -e
|
|
97
|
+
[ "$ASSESS_EXIT" -eq 0 ] || [ "$ASSESS_EXIT" -eq 1 ] || exit "$ASSESS_EXIT"
|
|
98
|
+
node -e 'const fs=require("node:fs");const [c,p,a]=process.argv.slice(1).map(x=>JSON.parse(fs.readFileSync(x,"utf8")));if(c.status!=="CONFIG_CREATED"||p.status!=="ALREADY_CONFIGURED"){console.error("setup lifecycle verification failed");process.exit(2)}if(!["ASSESSED","NEEDS_INPUT","BLOCKED"].includes(a.status)){console.error("assessment report invalid");process.exit(2)}const blocking=(a.gaps??[]).filter(g=>g.severity==="error").map(({code,scope,message})=>({code,scope,message}));process.stdout.write(JSON.stringify({created:{status:c.status,compactSummary:c.compactSummary},postSetup:{status:p.status,compactSummary:p.compactSummary},assessment:{status:a.status,summary:a.summary,gapCount:(a.gaps??[]).length,blockingGaps:blocking}},null,2)+"\n")' "$CREATED_REPORT" "$POST_REPORT" "$ASSESS_REPORT"
|
|
99
|
+
node -e 'require("node:fs").rmSync(process.argv[1],{recursive:true,force:false})' "$SETUP_SESSION"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 接入评估(只读)
|
|
103
|
+
|
|
104
|
+
对已配置项目运行接入评估,报告已满足、必选缺口、可选建议和不适用项;对未配置项目返回 `NOT_CONFIGURED` 并指向首次 setup:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
node "$RELEASE_SKILL_ENTRY" setup --assess-adoption --root "$PROJECT" --json
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
- 完全只读:评估后仓库不新增任何文件,不修改配置,不执行 hook。
|
|
111
|
+
- 报告四态:`NOT_CONFIGURED`、`PARTIALLY_ADOPTED`、`ADOPTED`、`ADOPTED_WITH_SUGGESTIONS`。
|
|
112
|
+
- findings 分四类:`mandatory-gap`(必选缺口,阻断接入)、`satisfied`(已满足)、`optional-suggestion`(可选建议)、`not-applicable`(不适用);每条带 `code`、`fieldPath`、`evidence` 与 `action`。
|
|
113
|
+
- 建议边界:hook 缓存候选只提示 `cacheInputs` 必须由项目自己声明并证明完整,评估不代猜、不代写;hook 耗时只从描述匹配且生产者可信的 started/completed 事件对推导,`timeoutMs` 不是实际成本;任何建议都不改变接入状态。
|
|
114
|
+
- 必选缺口存在时先修复并重跑 `setup --assess-adoption`,再进入发布流程。
|
|
115
|
+
|
|
116
|
+
## publisher 字段与个人片段泄漏策略
|
|
117
|
+
|
|
118
|
+
setup 生成的 `.release-skill/project.yaml` 中 `publisher` 是**已批准的公开发布身份**:它是人工确认的对外发布署名,属于公开面的一部分,而非需要隐藏的私有信息。
|
|
119
|
+
|
|
120
|
+
若目标仓库用“个人片段”类泄漏策略扫描仓树,而该策略按片段匹配恰好覆盖到 `publisher` 字段,正确做法不是删除或改写策略,而是由贡献者在**本地、gitignore 的个人片段 overlay** 中为该规则声明位置豁免(如 `approvedPlacements`:限定 `publisher` 所在的确切文件路径与行键前缀)。豁免只放行已批准的放置位置,其余出现照常命中;overlay 不入库,个人片段本身不进 committed 策略。
|
|
121
|
+
|
|
122
|
+
## 故障路由
|
|
123
|
+
|
|
124
|
+
- `NEEDS_INPUT`:审阅紧凑摘要;有冲突先修正权威事实并重跑。
|
|
125
|
+
- `LOCAL_ONLY_DETECTED`:只能建立本地配置,由用户决定是否创建远端渠道。
|
|
126
|
+
- `ALREADY_CONFIGURED` / `CONFIG_EXISTS`:不覆盖,转 `release-assess`。
|
|
127
|
+
- `SETUP_DIGEST_MISMATCH`:事实或 answers 已变化,重新只读发现与确认。
|
|
128
|
+
- `SAFE_WRITE_UNAVAILABLE`:保留只读报告,不启用普通路径写入兜底。
|
|
129
|
+
|
|
130
|
+
## 完成标准
|
|
131
|
+
|
|
132
|
+
完整报告未进入 Agent 上下文;跨 shell 只靠显式会话路径续接;无冲突提案由机器机械提取;写入仅创建一次且摘要精确匹配;创建后状态和 assess 只输出紧凑结果;人工文件保持原字节。
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-verify
|
|
3
|
+
description: Post-publish verification including remote state recheck, exact npm installation smoke, and consumer plugin install verification
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Cursor 安装入口解析协议**:在调用 CLI 前,Agent 必须从宿主当前已加载技能的元数据中取得本 `SKILL.md` 的实际绝对路径,并将该字面量记为 `SKILL_FILE`。
|
|
7
|
+
> `SKILL_FILE` 不是环境变量;禁止从工作目录、可执行搜索路径、源码仓库或 shell 调用上下文猜测。若宿主未提供该绝对路径,立即停止并报告安装定位失败。
|
|
8
|
+
> 对 `SKILL_FILE` 执行 `realpath`,取其目录向上两级得到 `PLUGIN_ROOT`;校验真实技能路径匹配 `PLUGIN_ROOT/skills/*/SKILL.md` 且仍位于插件根内(路径包含检查)。
|
|
9
|
+
> 校验 `PLUGIN_ROOT/.cursor-plugin/plugin.json` 是根内的普通文件,且名称为 `release-skill`;清单缺失或不一致时停止。Cursor 不保证注入插件根变量。
|
|
10
|
+
> 令 `RELEASE_SKILL_ENTRY=PLUGIN_ROOT/bin/release-skill.mjs`,对入口执行 `realpath` containment、`lstat` 非符号链接且为普通文件校验。
|
|
11
|
+
> 每一次 shell 工具调用都必须在同一个调用中用上述已验证绝对值设置 `RELEASE_SKILL_ENTRY`,然后执行 `node "$RELEASE_SKILL_ENTRY" ...`;不得依赖前一次 shell 的变量。
|
|
12
|
+
>
|
|
13
|
+
|
|
14
|
+
# release-verify
|
|
15
|
+
|
|
16
|
+
## 触发
|
|
17
|
+
|
|
18
|
+
用户请求验证发布结果完整性,或发布流程自动进入 verify 阶段。
|
|
19
|
+
|
|
20
|
+
## 当前状态
|
|
21
|
+
|
|
22
|
+
verify 是发布流程的最终验证阶段,是唯一能将状态提升到 `VERIFIED` 的命令。
|
|
23
|
+
它执行远端状态重检、精确 npm 安装烟雾测试和消费者插件安装验证。
|
|
24
|
+
verify 只接受 `PUBLISHED` 状态的源 run;`VERIFIED` 是终态,不会再次派生运行。
|
|
25
|
+
|
|
26
|
+
计划声明 `postVerify` hook 时,`postverify` 命令负责执行独立的收尾阶段。它接收
|
|
27
|
+
`VERIFIED` verify run、同一计划的 approval,以及逐个传入的 checkpoint approval,
|
|
28
|
+
然后原样调用现有 `postVerifyRelease`。该命令产生独立的 `postverify` run,不读取或写入
|
|
29
|
+
ship state;hook approval 缺失、错误或过期时,在 hook 执行前失败关闭。
|
|
30
|
+
|
|
31
|
+
**注意**: distribute gate (W1) 已经实现并集成在标准 verify 流程中。verify 现在会检查 postPublish 分发状态(git mirror + marketplace index),只有当所有外部动作都完成并通过验证时才达到 VERIFIED。
|
|
32
|
+
|
|
33
|
+
**工作流兼容性**:
|
|
34
|
+
- `docs-only`: consumer-verify preserved (步骤⑧)
|
|
35
|
+
- `config-only`: scene B completes full chain including verify
|
|
36
|
+
- `marketplace-only`: delegates to workspace's exclusive skill for final verification
|
|
37
|
+
- `full-happy-end`: standard complete path with all gates
|
|
38
|
+
|
|
39
|
+
所有工作流 profile 最终都路由到此 verify 命令作为终态验证门。
|
|
40
|
+
|
|
41
|
+
## 职责与边界
|
|
42
|
+
|
|
43
|
+
验证远端所有自动化 action 的实际状态与冻结计划一致。执行精确 `<package>@<version>` npm 安装到隔离目录,验证包名、版本、静态入口闭包,并在配置时验证 bin 路径安全和 CLI 烟雾输出。对 Claude/Codex marketplace distribution 执行全新隔离消费者安装验证。新计划中的 Kimi/CodeBuddy 安装只返回 `manualFollowUps`,明确标记 `verifiedBySystem: false`,不阻塞 `VERIFIED`;缺少该策略字段的旧冻结计划继续走历史 attestation 兼容路径。
|
|
44
|
+
|
|
45
|
+
0.9.3 的稳定隔离安装树记录只消费宿主命令退出后的隔离树观察:宿主附加 link 记录自身但不跟随,声明载荷 symlink 失败关闭,legacy 全树语义保持不变。该观察属于安装树事实,不替代远端状态、发布计划或 `VERIFIED` 判断。
|
|
46
|
+
|
|
47
|
+
**attestation 证明力边界**: `attest` 命令记录的旧计划兼容人工证明(`humanConfirmed: true` → `PASSED_MANUAL`)是本地自声明收据,不是签名见证:`--actor` 仅做非空字符串校验,无外部签名或身份核验,任何能运行 CLI 的进程都能自称任意 actor;伪造收据需写 `.release-skill` authority 目录,与直接改写收据文件属同一信任边界。因此旧兼容路径的人工证明只用于旧冻结计划收尾,不构成独立可审计的人工见证。新计划的 Kimi/CodeBuddy 安装一律走 `manualFollowUps`(`verifiedBySystem: false`),不参与 `VERIFIED` 终态判定。
|
|
48
|
+
|
|
49
|
+
**阶段通过规则**: 只有 CLI exit code 0 和结构化状态码 `VERIFIED` 才是完整终态。
|
|
50
|
+
|
|
51
|
+
**源 run 要求**: `--run` 必需;源 run 的所有 checkpoint 必须为 succeeded 或 skipped。
|
|
52
|
+
|
|
53
|
+
**不确定性停止**: 任何验证失败立即停止,不进行部分降级。
|
|
54
|
+
|
|
55
|
+
## 正向执行路径
|
|
56
|
+
|
|
57
|
+
1. 确认有 `--run` 路径(必需),且源 run 状态为 PUBLISHED
|
|
58
|
+
2. 使用插件根相对路径运行 CLI;命令调用本身即授权执行已配置的 verification gate 和 smoke process
|
|
59
|
+
3. 检查 exit code 和结构化状态:`VERIFIED`(全部通过)/ 失败(具体错误)
|
|
60
|
+
4. 只有 `VERIFIED` 才是发布 happy end
|
|
61
|
+
5. 达到 `VERIFIED` 后先检查计划是否声明 `postVerify` hook:直接收尾使用独立的 `postverify --plan --approval --run --hook-approval`,由该命令产生 `DISTRIBUTED` postVerify run;若仍由持久化 ship state 承担编排,则使用 `ship --hook-approval` 完成同一阶段,再把最终 run 路径交给 `release-finish`。没有 postVerify hook 时,把当前 verify run 路径交给 `release-finish`。随后按清单主动询问分支合并和本机宿主插件更新;发布策略已包含分支动作时略过合并询问
|
|
62
|
+
|
|
63
|
+
## 确定性脚本调用
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# 从插件根运行
|
|
67
|
+
node "$RELEASE_SKILL_ENTRY" verify --root <path> --plan <plan-path> --run <run-path> --json
|
|
68
|
+
# 独立执行已 VERIFIED 计划的 postVerify hook;每个 requiresApproval hook 单独传入批准记录
|
|
69
|
+
node "$RELEASE_SKILL_ENTRY" postverify --root <path> \
|
|
70
|
+
--plan <plan-path> --approval <approval-path> --run <verified-run-path> \
|
|
71
|
+
--hook-approval <immutable-hook-approval-path> --json
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 验证步骤
|
|
75
|
+
|
|
76
|
+
1. 加载并验证 release plan schema 和 digest
|
|
77
|
+
2. 加载源 run,验证 planDigest 匹配和 checkpoint 完整性
|
|
78
|
+
3. 对每个 plan action 执行 adapter.verify()(远端状态重检)
|
|
79
|
+
4. 对每个 npm distribution 执行隔离安装烟雾测试
|
|
80
|
+
5. 对 Claude/Codex marketplace distribution 执行全新隔离消费者安装验证;收集 Kimi/CodeBuddy 的非阻塞 `manualFollowUps`
|
|
81
|
+
6. 全部通过 → `VERIFIED`
|
|
82
|
+
|
|
83
|
+
`postverify` 不属于上述远端验证步骤。它只处理已经达到 `VERIFIED` 的计划,并把
|
|
84
|
+
`postVerify` 阶段的执行结果写入独立 run。
|
|
85
|
+
|
|
86
|
+
## 发布后收尾
|
|
87
|
+
|
|
88
|
+
`VERIFIED` 不代表要自动修改开发分支或本机宿主。进入 `release-finish` 后,只有用户明确同意,才执行对应的本地动作。本机插件更新失败不会改变发布终态。
|
|
89
|
+
核心 prepare、publish、verify 流程跨平台;WorkBuddy 的本机收尾探测和更新仅支持 macOS。
|
|
90
|
+
|
|
91
|
+
## 烟雾测试
|
|
92
|
+
|
|
93
|
+
- 在 `os.tmpdir()` 创建隔离目录
|
|
94
|
+
- 执行 `npm install <package>@<version>` 带安全标志
|
|
95
|
+
- 验证安装的 `package.json` name 和 version 精确匹配
|
|
96
|
+
- 无条件静态验证已安装包中具体 `bin`/`main`/`module`/`types`/`typings`/`exports`
|
|
97
|
+
目标是普通文件;失败时不得写入 `VERIFIED`
|
|
98
|
+
- 若配置了 `smokeBin`:验证 bin 路径安全(无逃逸、无 symlink),从精确安装根、隔离 HOME 和最小环境执行并验证输出;这会运行已安装代码,必须显式授权
|
|
99
|
+
- 若未配置 `smokeBin`:跳过运行代码,但静态入口闭包检查仍然强制执行
|
|
100
|
+
|
|
101
|
+
## 常见错误
|
|
102
|
+
|
|
103
|
+
| 场景 | 状态 | 处理 |
|
|
104
|
+
|------|------|------|
|
|
105
|
+
| 源 run 非 PUBLISHED | GATE_FAILED | 拒绝执行;VERIFIED 是终态 |
|
|
106
|
+
| 源 run 有 incomplete checkpoint | GATE_FAILED | 拒绝执行 |
|
|
107
|
+
| 远端状态不匹配 | POST_PUBLISH_VERIFY_FAILED | 停止 |
|
|
108
|
+
| npm 安装失败 | POST_PUBLISH_VERIFY_FAILED | 停止 |
|
|
109
|
+
| CLI 烟雾输出不匹配 | POST_PUBLISH_VERIFY_FAILED | 停止 |
|
|
110
|
+
| consumer gate / smokeBin 执行失败 | GATE_FAILED | 检查失败原因,修复后重试 |
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.skill-family.example/v1/adapter-build-manifest.json",
|
|
4
|
+
"title": "Skill Family adapter build manifest",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schemaVersion", "kind", "hostId", "pathCategory", "sourceClosure", "members", "digest"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schemaVersion": { "const": 1 },
|
|
10
|
+
"kind": { "const": "skill-family.adapter-build-manifest" },
|
|
11
|
+
"hostId": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,63}$" },
|
|
12
|
+
"pathCategory": { "$ref": "#/$defs/category" },
|
|
13
|
+
"sourceClosure": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"additionalProperties": false,
|
|
16
|
+
"required": ["digest", "members"],
|
|
17
|
+
"properties": {
|
|
18
|
+
"digest": { "$ref": "#/$defs/sha256" },
|
|
19
|
+
"members": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/sourceMember" } }
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"members": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/outputMember" } },
|
|
23
|
+
"digest": { "$ref": "#/$defs/sha256" }
|
|
24
|
+
},
|
|
25
|
+
"$defs": {
|
|
26
|
+
"sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
|
27
|
+
"relativePath": { "type": "string", "minLength": 1, "maxLength": 240, "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)(?!.*\\u0000)[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*$" },
|
|
28
|
+
"category": {
|
|
29
|
+
"type": "object", "additionalProperties": false, "required": ["id", "scope", "anchor", "relPath"],
|
|
30
|
+
"properties": { "id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,63}$" }, "scope": { "enum": ["user", "project"] }, "anchor": { "enum": ["user-home", "project-root"] }, "relPath": { "$ref": "#/$defs/relativePath" } }
|
|
31
|
+
},
|
|
32
|
+
"sourceMember": {
|
|
33
|
+
"type": "object", "additionalProperties": false, "required": ["sourcePath", "sha256", "bytes"],
|
|
34
|
+
"properties": { "sourcePath": { "$ref": "#/$defs/relativePath" }, "sha256": { "$ref": "#/$defs/sha256" }, "bytes": { "type": "integer", "minimum": 0 } }
|
|
35
|
+
},
|
|
36
|
+
"outputMember": {
|
|
37
|
+
"type": "object", "additionalProperties": false, "required": ["sourcePath", "target", "sha256", "bytes"],
|
|
38
|
+
"properties": { "sourcePath": { "$ref": "#/$defs/relativePath" }, "target": { "$ref": "#/$defs/relativePath" }, "sha256": { "$ref": "#/$defs/sha256" }, "bytes": { "type": "integer", "minimum": 0 } }
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.skill-family.example/v1/adapter-peer-verification-request.json",
|
|
4
|
+
"title": "Skill Family peer adapter verification request",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schemaVersion", "kind", "skillFamilyId", "peers"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schemaVersion": { "const": 1 },
|
|
10
|
+
"kind": { "const": "skill-family.adapter-peer-verification-request" },
|
|
11
|
+
"skillFamilyId": { "$ref": "#/$defs/id" },
|
|
12
|
+
"peers": {
|
|
13
|
+
"type": "array",
|
|
14
|
+
"minItems": 2,
|
|
15
|
+
"maxItems": 16,
|
|
16
|
+
"items": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"additionalProperties": false,
|
|
19
|
+
"required": ["peerId", "hostId", "pathCategory", "logicalMappings"],
|
|
20
|
+
"properties": {
|
|
21
|
+
"peerId": { "$ref": "#/$defs/id" },
|
|
22
|
+
"hostId": { "$ref": "#/$defs/id" },
|
|
23
|
+
"pathCategory": { "$ref": "#/$defs/category" },
|
|
24
|
+
"logicalMappings": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"minItems": 1,
|
|
27
|
+
"maxItems": 128,
|
|
28
|
+
"items": { "$ref": "#/$defs/logicalMapping" }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"$defs": {
|
|
35
|
+
"id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,63}$" },
|
|
36
|
+
"relativePath": { "type": "string", "minLength": 1, "maxLength": 240, "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)(?!.*\\u0000)[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*$" },
|
|
37
|
+
"category": {
|
|
38
|
+
"type": "object", "additionalProperties": false, "required": ["id", "scope", "anchor", "relPath"],
|
|
39
|
+
"properties": { "id": { "$ref": "#/$defs/id" }, "scope": { "enum": ["user", "project"] }, "anchor": { "enum": ["user-home", "project-root"] }, "relPath": { "$ref": "#/$defs/relativePath" } }
|
|
40
|
+
},
|
|
41
|
+
"logicalMapping": {
|
|
42
|
+
"type": "object",
|
|
43
|
+
"additionalProperties": false,
|
|
44
|
+
"required": ["logicalId", "skillId", "sourcePath", "entryType", "userInvocable"],
|
|
45
|
+
"properties": {
|
|
46
|
+
"logicalId": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,63}$" },
|
|
47
|
+
"skillId": { "$ref": "#/$defs/id" },
|
|
48
|
+
"sourcePath": { "$ref": "#/$defs/relativePath" },
|
|
49
|
+
"entryType": { "const": "skill" },
|
|
50
|
+
"userInvocable": { "type": "boolean" }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.skill-family.example/v1/adapter-peer-verification-result.json",
|
|
4
|
+
"title": "Skill Family peer adapter verification result",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schemaVersion", "kind", "status", "decision", "skillFamilyId", "commonSourceClosure", "peers"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schemaVersion": { "const": 1 },
|
|
10
|
+
"kind": { "const": "skill-family.adapter-peer-verification-result" },
|
|
11
|
+
"status": { "const": "verified" },
|
|
12
|
+
"decision": { "const": "peer-verification" },
|
|
13
|
+
"skillFamilyId": { "$ref": "#/$defs/id" },
|
|
14
|
+
"commonSourceClosure": { "$ref": "https://contracts.skill-family.example/v1/adapter-build-manifest.json#/properties/sourceClosure" },
|
|
15
|
+
"peers": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"minItems": 2,
|
|
18
|
+
"maxItems": 16,
|
|
19
|
+
"items": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"additionalProperties": false,
|
|
22
|
+
"required": ["peerId", "hostId", "pathCategory", "manifest", "logicalMappings"],
|
|
23
|
+
"properties": {
|
|
24
|
+
"peerId": { "$ref": "#/$defs/id" },
|
|
25
|
+
"hostId": { "$ref": "#/$defs/id" },
|
|
26
|
+
"pathCategory": { "$ref": "https://contracts.skill-family.example/v1/adapter-peer-verification-request.json#/$defs/category" },
|
|
27
|
+
"manifest": { "$ref": "https://contracts.skill-family.example/v1/adapter-build-manifest.json" },
|
|
28
|
+
"logicalMappings": {
|
|
29
|
+
"type": "array",
|
|
30
|
+
"minItems": 1,
|
|
31
|
+
"maxItems": 128,
|
|
32
|
+
"items": { "$ref": "#/$defs/resultMapping" }
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"$defs": {
|
|
39
|
+
"id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,63}$" },
|
|
40
|
+
"resultMapping": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"additionalProperties": false,
|
|
43
|
+
"required": ["logicalId", "skillId", "sourcePath", "target", "entryType", "userInvocable"],
|
|
44
|
+
"properties": {
|
|
45
|
+
"logicalId": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,63}$" },
|
|
46
|
+
"skillId": { "$ref": "https://contracts.skill-family.example/v1/adapter-peer-verification-request.json#/$defs/id" },
|
|
47
|
+
"sourcePath": { "$ref": "https://contracts.skill-family.example/v1/adapter-peer-verification-request.json#/$defs/relativePath" },
|
|
48
|
+
"target": { "$ref": "https://contracts.skill-family.example/v1/adapter-peer-verification-request.json#/$defs/relativePath" },
|
|
49
|
+
"entryType": { "const": "skill" },
|
|
50
|
+
"userInvocable": { "type": "boolean" }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.skill-family.example/v1/adapter-source.json",
|
|
4
|
+
"title": "Skill Family adapter source",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schemaVersion", "kind", "skillFamilyId", "skills"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schemaVersion": { "const": 1 },
|
|
10
|
+
"kind": { "const": "skill-family.adapter-source" },
|
|
11
|
+
"skillFamilyId": { "$ref": "#/$defs/id" },
|
|
12
|
+
"skills": {
|
|
13
|
+
"type": "array",
|
|
14
|
+
"minItems": 1,
|
|
15
|
+
"items": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"additionalProperties": false,
|
|
18
|
+
"required": ["id", "files"],
|
|
19
|
+
"properties": {
|
|
20
|
+
"id": { "$ref": "#/$defs/id" },
|
|
21
|
+
"files": {
|
|
22
|
+
"type": "array",
|
|
23
|
+
"minItems": 1,
|
|
24
|
+
"items": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"additionalProperties": false,
|
|
27
|
+
"required": ["path", "content"],
|
|
28
|
+
"properties": {
|
|
29
|
+
"path": { "$ref": "#/$defs/relativePath" },
|
|
30
|
+
"content": { "type": "string" }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"$defs": {
|
|
39
|
+
"id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,63}$" },
|
|
40
|
+
"relativePath": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"minLength": 1,
|
|
43
|
+
"maxLength": 240,
|
|
44
|
+
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\)(?!.*\\u0000)[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*$"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.skill-family.example/v1/audit-baseline-pin.json",
|
|
4
|
+
"title": "AuditBaselinePin",
|
|
5
|
+
"description": "Audit baseline pin contract (GAP-5 / SG-28, FVD-005 lineage). The frozen document an independent audit uses to pin one approved Contracts version: the audit-surface digest, per-document digests (registry, error codes, rules, kernel protocol), per-schema digests, and the frozen engine facts. Pins are append-only, one file per contracts version, generated mechanically from describeAuditSurface(); a live surface that no longer matches its pin is AUD-BASE-001, a failed pin/lock comparison is AUD-LOCK-001 (codes owned by the audit namespace). The supersedes field records the predecessor pin file name so the pin lineage stays mechanically traceable.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"schemaVersion",
|
|
10
|
+
"kind",
|
|
11
|
+
"provenance",
|
|
12
|
+
"frozenAt",
|
|
13
|
+
"contractsVersion",
|
|
14
|
+
"auditSurfaceVersion",
|
|
15
|
+
"digestAlgorithm",
|
|
16
|
+
"note",
|
|
17
|
+
"surfaceDigest",
|
|
18
|
+
"documentDigests",
|
|
19
|
+
"schemaDigests",
|
|
20
|
+
"facts"
|
|
21
|
+
],
|
|
22
|
+
"properties": {
|
|
23
|
+
"schemaVersion": { "const": 1 },
|
|
24
|
+
"kind": { "const": "skill-family.audit-baseline-pin" },
|
|
25
|
+
"provenance": {
|
|
26
|
+
"enum": ["product-compatibility-fixture", "independent-audit"],
|
|
27
|
+
"description": "Authorship class of the pin. product-compatibility-fixture: generated mechanically on the product side from describeAuditSurface(); independent-audit: authored by an independent audit consumer."
|
|
28
|
+
},
|
|
29
|
+
"frozenAt": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
|
|
32
|
+
"description": "Calendar date (YYYY-MM-DD) on which the pin was frozen."
|
|
33
|
+
},
|
|
34
|
+
"contractsVersion": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
|
|
37
|
+
"description": "Contracts version this pin freezes."
|
|
38
|
+
},
|
|
39
|
+
"auditSurfaceVersion": {
|
|
40
|
+
"type": "integer",
|
|
41
|
+
"minimum": 1,
|
|
42
|
+
"description": "Audit consumption surface version the pin was derived from."
|
|
43
|
+
},
|
|
44
|
+
"digestAlgorithm": {
|
|
45
|
+
"const": "sha256",
|
|
46
|
+
"description": "Digest algorithm; sha256 is the only admitted value."
|
|
47
|
+
},
|
|
48
|
+
"note": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"minLength": 1,
|
|
51
|
+
"description": "Human-readable provenance note."
|
|
52
|
+
},
|
|
53
|
+
"supersedes": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"pattern": "^contracts-[0-9]+\\.[0-9]+\\.[0-9]+\\.pin\\.json$",
|
|
56
|
+
"description": "File name of the predecessor baseline pin this pin supersedes (FVD-005 lineage); omitted only for the first pin of a lineage."
|
|
57
|
+
},
|
|
58
|
+
"surfaceDigest": {
|
|
59
|
+
"type": "string",
|
|
60
|
+
"pattern": "^[0-9a-f]{64}$",
|
|
61
|
+
"description": "sha256 hex of the canonical JSON of the full audit surface (digestAuditSurface)."
|
|
62
|
+
},
|
|
63
|
+
"documentDigests": {
|
|
64
|
+
"type": "object",
|
|
65
|
+
"additionalProperties": false,
|
|
66
|
+
"required": ["registry", "errorCodes", "rules", "kernelProtocol"],
|
|
67
|
+
"properties": {
|
|
68
|
+
"registry": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
|
69
|
+
"errorCodes": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
|
70
|
+
"rules": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
|
71
|
+
"kernelProtocol": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"schemaDigests": {
|
|
75
|
+
"type": "object",
|
|
76
|
+
"minProperties": 1,
|
|
77
|
+
"additionalProperties": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
|
78
|
+
"description": "Map of schema $id to the sha256 hex digest of the canonical JSON of that schema document."
|
|
79
|
+
},
|
|
80
|
+
"facts": {
|
|
81
|
+
"type": "object",
|
|
82
|
+
"additionalProperties": false,
|
|
83
|
+
"required": [
|
|
84
|
+
"contractObjects",
|
|
85
|
+
"checkTypes",
|
|
86
|
+
"mandatoryRuleIds",
|
|
87
|
+
"ruleBudget",
|
|
88
|
+
"errorCodes",
|
|
89
|
+
"kernelOperations",
|
|
90
|
+
"kernelTerminalStates",
|
|
91
|
+
"validationPolicies",
|
|
92
|
+
"supportedDialects",
|
|
93
|
+
"errorCodeStabilityPolicy",
|
|
94
|
+
"schemaIdNamespace"
|
|
95
|
+
],
|
|
96
|
+
"properties": {
|
|
97
|
+
"contractObjects": {
|
|
98
|
+
"type": "array",
|
|
99
|
+
"minItems": 1,
|
|
100
|
+
"uniqueItems": true,
|
|
101
|
+
"items": { "type": "string", "minLength": 1 }
|
|
102
|
+
},
|
|
103
|
+
"checkTypes": {
|
|
104
|
+
"type": "array",
|
|
105
|
+
"minItems": 1,
|
|
106
|
+
"uniqueItems": true,
|
|
107
|
+
"items": { "type": "string", "minLength": 1 }
|
|
108
|
+
},
|
|
109
|
+
"mandatoryRuleIds": {
|
|
110
|
+
"type": "array",
|
|
111
|
+
"minItems": 1,
|
|
112
|
+
"uniqueItems": true,
|
|
113
|
+
"items": { "type": "string", "minLength": 1 }
|
|
114
|
+
},
|
|
115
|
+
"ruleBudget": {
|
|
116
|
+
"type": "object",
|
|
117
|
+
"additionalProperties": false,
|
|
118
|
+
"required": ["firstVersionMax", "absoluteMax"],
|
|
119
|
+
"properties": {
|
|
120
|
+
"firstVersionMax": { "type": "integer", "minimum": 1 },
|
|
121
|
+
"absoluteMax": { "type": "integer", "minimum": 1 }
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"errorCodes": {
|
|
125
|
+
"type": "array",
|
|
126
|
+
"minItems": 1,
|
|
127
|
+
"uniqueItems": true,
|
|
128
|
+
"items": { "type": "string", "pattern": "^SFC[0-9]{4}$" }
|
|
129
|
+
},
|
|
130
|
+
"kernelOperations": {
|
|
131
|
+
"type": "array",
|
|
132
|
+
"minItems": 1,
|
|
133
|
+
"uniqueItems": true,
|
|
134
|
+
"items": { "type": "string", "minLength": 1 }
|
|
135
|
+
},
|
|
136
|
+
"kernelTerminalStates": {
|
|
137
|
+
"type": "array",
|
|
138
|
+
"minItems": 1,
|
|
139
|
+
"uniqueItems": true,
|
|
140
|
+
"items": { "type": "string", "minLength": 1 }
|
|
141
|
+
},
|
|
142
|
+
"validationPolicies": {
|
|
143
|
+
"type": "object",
|
|
144
|
+
"minProperties": 1,
|
|
145
|
+
"additionalProperties": {
|
|
146
|
+
"type": "object",
|
|
147
|
+
"additionalProperties": {
|
|
148
|
+
"anyOf": [{ "type": "boolean" }, { "type": "string" }]
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"supportedDialects": {
|
|
153
|
+
"type": "array",
|
|
154
|
+
"minItems": 1,
|
|
155
|
+
"uniqueItems": true,
|
|
156
|
+
"items": { "type": "string", "minLength": 1 }
|
|
157
|
+
},
|
|
158
|
+
"errorCodeStabilityPolicy": { "type": "string", "minLength": 1 },
|
|
159
|
+
"schemaIdNamespace": { "type": "string", "minLength": 1 }
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|