ws-spec-kit 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +79 -0
- package/dist/adapters/cli/output.d.ts +15 -0
- package/dist/adapters/cli/output.js +21 -0
- package/dist/adapters/cli/output.js.map +1 -0
- package/dist/adapters/cli/workflow.d.ts +25 -0
- package/dist/adapters/cli/workflow.js +131 -0
- package/dist/adapters/cli/workflow.js.map +1 -0
- package/dist/adapters/connectors/git-native.d.ts +23 -0
- package/dist/adapters/connectors/git-native.js +521 -0
- package/dist/adapters/connectors/git-native.js.map +1 -0
- package/dist/adapters/connectors/github-cli.d.ts +23 -0
- package/dist/adapters/connectors/github-cli.js +213 -0
- package/dist/adapters/connectors/github-cli.js.map +1 -0
- package/dist/adapters/connectors/gitlab-cli.d.ts +23 -0
- package/dist/adapters/connectors/gitlab-cli.js +199 -0
- package/dist/adapters/connectors/gitlab-cli.js.map +1 -0
- package/dist/adapters/connectors/lark-cli.d.ts +24 -0
- package/dist/adapters/connectors/lark-cli.js +296 -0
- package/dist/adapters/connectors/lark-cli.js.map +1 -0
- package/dist/adapters/process/redaction.d.ts +2 -0
- package/dist/adapters/process/redaction.js +51 -0
- package/dist/adapters/process/redaction.js.map +1 -0
- package/dist/adapters/process/spawn-json.d.ts +37 -0
- package/dist/adapters/process/spawn-json.js +312 -0
- package/dist/adapters/process/spawn-json.js.map +1 -0
- package/dist/adapters/skills/claude.d.ts +1 -0
- package/dist/adapters/skills/claude.js +3 -0
- package/dist/adapters/skills/claude.js.map +1 -0
- package/dist/adapters/skills/codex.d.ts +1 -0
- package/dist/adapters/skills/codex.js +3 -0
- package/dist/adapters/skills/codex.js.map +1 -0
- package/dist/adapters/skills/cursor.d.ts +1 -0
- package/dist/adapters/skills/cursor.js +3 -0
- package/dist/adapters/skills/cursor.js.map +1 -0
- package/dist/adapters/skills/generic.d.ts +1 -0
- package/dist/adapters/skills/generic.js +2 -0
- package/dist/adapters/skills/generic.js.map +1 -0
- package/dist/adapters/skills/install.d.ts +28 -0
- package/dist/adapters/skills/install.js +571 -0
- package/dist/adapters/skills/install.js.map +1 -0
- package/dist/application/acquire.d.ts +60 -0
- package/dist/application/acquire.js +964 -0
- package/dist/application/acquire.js.map +1 -0
- package/dist/application/application.d.ts +21 -0
- package/dist/application/application.js +31 -0
- package/dist/application/application.js.map +1 -0
- package/dist/application/artifact-reader.d.ts +1 -0
- package/dist/application/artifact-reader.js +150 -0
- package/dist/application/artifact-reader.js.map +1 -0
- package/dist/application/artifact-writer.d.ts +1 -0
- package/dist/application/artifact-writer.js +268 -0
- package/dist/application/artifact-writer.js.map +1 -0
- package/dist/application/artifact.d.ts +28 -0
- package/dist/application/artifact.js +523 -0
- package/dist/application/artifact.js.map +1 -0
- package/dist/application/decide.d.ts +12 -0
- package/dist/application/decide.js +168 -0
- package/dist/application/decide.js.map +1 -0
- package/dist/application/doctor-connectors.d.ts +34 -0
- package/dist/application/doctor-connectors.js +99 -0
- package/dist/application/doctor-connectors.js.map +1 -0
- package/dist/application/external-action.d.ts +164 -0
- package/dist/application/external-action.js +670 -0
- package/dist/application/external-action.js.map +1 -0
- package/dist/application/initial-stages.d.ts +3 -0
- package/dist/application/initial-stages.js +7 -0
- package/dist/application/initial-stages.js.map +1 -0
- package/dist/application/inspect.d.ts +2 -0
- package/dist/application/inspect.js +31 -0
- package/dist/application/inspect.js.map +1 -0
- package/dist/application/profile.d.ts +32 -0
- package/dist/application/profile.js +70 -0
- package/dist/application/profile.js.map +1 -0
- package/dist/application/snapshot.d.ts +75 -0
- package/dist/application/snapshot.js +338 -0
- package/dist/application/snapshot.js.map +1 -0
- package/dist/application/start.d.ts +43 -0
- package/dist/application/start.js +360 -0
- package/dist/application/start.js.map +1 -0
- package/dist/application/state.d.ts +17 -0
- package/dist/application/state.js +94 -0
- package/dist/application/state.js.map +1 -0
- package/dist/application/submit.d.ts +18 -0
- package/dist/application/submit.js +1090 -0
- package/dist/application/submit.js.map +1 -0
- package/dist/cli/commands/core.d.ts +2 -0
- package/dist/cli/commands/core.js +205 -0
- package/dist/cli/commands/core.js.map +1 -0
- package/dist/cli/commands/public-contract.d.ts +12 -0
- package/dist/cli/commands/public-contract.js +47 -0
- package/dist/cli/commands/public-contract.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +23 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/domain/artifacts.d.ts +52 -0
- package/dist/domain/artifacts.js +241 -0
- package/dist/domain/artifacts.js.map +1 -0
- package/dist/domain/digests.d.ts +11 -0
- package/dist/domain/digests.js +106 -0
- package/dist/domain/digests.js.map +1 -0
- package/dist/domain/external-receipt.d.ts +48 -0
- package/dist/domain/external-receipt.js +138 -0
- package/dist/domain/external-receipt.js.map +1 -0
- package/dist/domain/ids.d.ts +7 -0
- package/dist/domain/ids.js +5 -0
- package/dist/domain/ids.js.map +1 -0
- package/dist/domain/repository-path.d.ts +3 -0
- package/dist/domain/repository-path.js +87 -0
- package/dist/domain/repository-path.js.map +1 -0
- package/dist/domain/states.d.ts +38 -0
- package/dist/domain/states.js +69 -0
- package/dist/domain/states.js.map +1 -0
- package/dist/domain/work-package-identity.d.ts +2 -0
- package/dist/domain/work-package-identity.js +10 -0
- package/dist/domain/work-package-identity.js.map +1 -0
- package/dist/domain/workflow.d.ts +58 -0
- package/dist/domain/workflow.js +2 -0
- package/dist/domain/workflow.js.map +1 -0
- package/dist/engine/actor-roles.d.ts +15 -0
- package/dist/engine/actor-roles.js +53 -0
- package/dist/engine/actor-roles.js.map +1 -0
- package/dist/engine/approvals.d.ts +44 -0
- package/dist/engine/approvals.js +239 -0
- package/dist/engine/approvals.js.map +1 -0
- package/dist/engine/archive.d.ts +24 -0
- package/dist/engine/archive.js +442 -0
- package/dist/engine/archive.js.map +1 -0
- package/dist/engine/compiler.d.ts +25 -0
- package/dist/engine/compiler.js +828 -0
- package/dist/engine/compiler.js.map +1 -0
- package/dist/engine/control/condition.d.ts +10 -0
- package/dist/engine/control/condition.js +49 -0
- package/dist/engine/control/condition.js.map +1 -0
- package/dist/engine/control/loop.d.ts +23 -0
- package/dist/engine/control/loop.js +96 -0
- package/dist/engine/control/loop.js.map +1 -0
- package/dist/engine/control/retry.d.ts +15 -0
- package/dist/engine/control/retry.js +54 -0
- package/dist/engine/control/retry.js.map +1 -0
- package/dist/engine/docs-integrity.d.ts +13 -0
- package/dist/engine/docs-integrity.js +34 -0
- package/dist/engine/docs-integrity.js.map +1 -0
- package/dist/engine/expressions/ast.d.ts +18 -0
- package/dist/engine/expressions/ast.js +9 -0
- package/dist/engine/expressions/ast.js.map +1 -0
- package/dist/engine/expressions/evaluate.d.ts +7 -0
- package/dist/engine/expressions/evaluate.js +47 -0
- package/dist/engine/expressions/evaluate.js.map +1 -0
- package/dist/engine/expressions/parser.d.ts +2 -0
- package/dist/engine/expressions/parser.js +173 -0
- package/dist/engine/expressions/parser.js.map +1 -0
- package/dist/engine/external-effects/authorization.d.ts +146 -0
- package/dist/engine/external-effects/authorization.js +222 -0
- package/dist/engine/external-effects/authorization.js.map +1 -0
- package/dist/engine/external-effects/idempotency.d.ts +14 -0
- package/dist/engine/external-effects/idempotency.js +26 -0
- package/dist/engine/external-effects/idempotency.js.map +1 -0
- package/dist/engine/external-effects/reconciliation.d.ts +11 -0
- package/dist/engine/external-effects/reconciliation.js +18 -0
- package/dist/engine/external-effects/reconciliation.js.map +1 -0
- package/dist/engine/results.d.ts +14 -0
- package/dist/engine/results.js +88 -0
- package/dist/engine/results.js.map +1 -0
- package/dist/engine/scheduler.d.ts +60 -0
- package/dist/engine/scheduler.js +225 -0
- package/dist/engine/scheduler.js.map +1 -0
- package/dist/engine/tdd/green-gate.d.ts +6 -0
- package/dist/engine/tdd/green-gate.js +72 -0
- package/dist/engine/tdd/green-gate.js.map +1 -0
- package/dist/engine/tdd/red-gate.d.ts +30 -0
- package/dist/engine/tdd/red-gate.js +531 -0
- package/dist/engine/tdd/red-gate.js.map +1 -0
- package/dist/engine/tdd/types.d.ts +89 -0
- package/dist/engine/tdd/types.js +38 -0
- package/dist/engine/tdd/types.js.map +1 -0
- package/dist/engine/verification.d.ts +56 -0
- package/dist/engine/verification.js +196 -0
- package/dist/engine/verification.js.map +1 -0
- package/dist/policy/profile.d.ts +24 -0
- package/dist/policy/profile.js +23 -0
- package/dist/policy/profile.js.map +1 -0
- package/dist/policy/risk.d.ts +33 -0
- package/dist/policy/risk.js +138 -0
- package/dist/policy/risk.js.map +1 -0
- package/dist/protocol/application.d.ts +196 -0
- package/dist/protocol/application.js +2 -0
- package/dist/protocol/application.js.map +1 -0
- package/dist/protocol/public-contract.d.ts +81 -0
- package/dist/protocol/public-contract.js +231 -0
- package/dist/protocol/public-contract.js.map +1 -0
- package/dist/protocol/work-package.d.ts +55 -0
- package/dist/protocol/work-package.js +2 -0
- package/dist/protocol/work-package.js.map +1 -0
- package/dist/registry/connectors/external-executor.d.ts +4 -0
- package/dist/registry/connectors/external-executor.js +249 -0
- package/dist/registry/connectors/external-executor.js.map +1 -0
- package/dist/registry/connectors/feishu-document.d.ts +21 -0
- package/dist/registry/connectors/feishu-document.js +197 -0
- package/dist/registry/connectors/feishu-document.js.map +1 -0
- package/dist/registry/connectors/git-commit.d.ts +32 -0
- package/dist/registry/connectors/git-commit.js +122 -0
- package/dist/registry/connectors/git-commit.js.map +1 -0
- package/dist/registry/connectors/issue.d.ts +68 -0
- package/dist/registry/connectors/issue.js +301 -0
- package/dist/registry/connectors/issue.js.map +1 -0
- package/dist/registry/connectors/knowledge-publish.d.ts +30 -0
- package/dist/registry/connectors/knowledge-publish.js +157 -0
- package/dist/registry/connectors/knowledge-publish.js.map +1 -0
- package/dist/registry/connectors/local-requirement.d.ts +19 -0
- package/dist/registry/connectors/local-requirement.js +177 -0
- package/dist/registry/connectors/local-requirement.js.map +1 -0
- package/dist/registry/connectors/manifest.d.ts +6 -0
- package/dist/registry/connectors/manifest.js +164 -0
- package/dist/registry/connectors/manifest.js.map +1 -0
- package/dist/registry/connectors/registry.d.ts +11 -0
- package/dist/registry/connectors/registry.js +34 -0
- package/dist/registry/connectors/registry.js.map +1 -0
- package/dist/registry/connectors/requirement-source.d.ts +46 -0
- package/dist/registry/connectors/requirement-source.js +513 -0
- package/dist/registry/connectors/requirement-source.js.map +1 -0
- package/dist/registry/connectors/runtime.d.ts +38 -0
- package/dist/registry/connectors/runtime.js +127 -0
- package/dist/registry/connectors/runtime.js.map +1 -0
- package/dist/registry/connectors/secret-detector.d.ts +19 -0
- package/dist/registry/connectors/secret-detector.js +85 -0
- package/dist/registry/connectors/secret-detector.js.map +1 -0
- package/dist/registry/connectors/semver.d.ts +8 -0
- package/dist/registry/connectors/semver.js +57 -0
- package/dist/registry/connectors/semver.js.map +1 -0
- package/dist/registry/connectors/types.d.ts +45 -0
- package/dist/registry/connectors/types.js +2 -0
- package/dist/registry/connectors/types.js.map +1 -0
- package/dist/registry/executors/registry.d.ts +15 -0
- package/dist/registry/executors/registry.js +68 -0
- package/dist/registry/executors/registry.js.map +1 -0
- package/dist/registry/executors/types.d.ts +19 -0
- package/dist/registry/executors/types.js +2 -0
- package/dist/registry/executors/types.js.map +1 -0
- package/dist/registry/skills/lock.d.ts +3 -0
- package/dist/registry/skills/lock.js +278 -0
- package/dist/registry/skills/lock.js.map +1 -0
- package/dist/registry/skills/resolver.d.ts +16 -0
- package/dist/registry/skills/resolver.js +353 -0
- package/dist/registry/skills/resolver.js.map +1 -0
- package/dist/registry/skills/types.d.ts +75 -0
- package/dist/registry/skills/types.js +9 -0
- package/dist/registry/skills/types.js.map +1 -0
- package/dist/resources/catalog.d.ts +20 -0
- package/dist/resources/catalog.js +111 -0
- package/dist/resources/catalog.js.map +1 -0
- package/dist/schemas/definitions.d.ts +5 -0
- package/dist/schemas/definitions.js +958 -0
- package/dist/schemas/definitions.js.map +1 -0
- package/dist/schemas/generate.d.ts +1 -0
- package/dist/schemas/generate.js +26 -0
- package/dist/schemas/generate.js.map +1 -0
- package/dist/schemas/index.d.ts +11 -0
- package/dist/schemas/index.js +54 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/storage/control-plane.d.ts +136 -0
- package/dist/storage/control-plane.js +688 -0
- package/dist/storage/control-plane.js.map +1 -0
- package/dist/storage/events.d.ts +36 -0
- package/dist/storage/events.js +185 -0
- package/dist/storage/events.js.map +1 -0
- package/dist/storage/external-action-payload.d.ts +33 -0
- package/dist/storage/external-action-payload.js +190 -0
- package/dist/storage/external-action-payload.js.map +1 -0
- package/dist/storage/files.d.ts +13 -0
- package/dist/storage/files.js +45 -0
- package/dist/storage/files.js.map +1 -0
- package/dist/storage/git.d.ts +4 -0
- package/dist/storage/git.js +21 -0
- package/dist/storage/git.js.map +1 -0
- package/dist/storage/project-config.d.ts +11 -0
- package/dist/storage/project-config.js +60 -0
- package/dist/storage/project-config.js.map +1 -0
- package/dist/storage/repository.d.ts +14 -0
- package/dist/storage/repository.js +151 -0
- package/dist/storage/repository.js.map +1 -0
- package/dist/storage/work-items.d.ts +77 -0
- package/dist/storage/work-items.js +373 -0
- package/dist/storage/work-items.js.map +1 -0
- package/dist/storage/workflow-trust.d.ts +38 -0
- package/dist/storage/workflow-trust.js +310 -0
- package/dist/storage/workflow-trust.js.map +1 -0
- package/dist/workflow-package/loader.d.ts +12 -0
- package/dist/workflow-package/loader.js +249 -0
- package/dist/workflow-package/loader.js.map +1 -0
- package/dist/workflow-package/lock.d.ts +6 -0
- package/dist/workflow-package/lock.js +12 -0
- package/dist/workflow-package/lock.js.map +1 -0
- package/dist/workflow-package/path-boundary.d.ts +5 -0
- package/dist/workflow-package/path-boundary.js +38 -0
- package/dist/workflow-package/path-boundary.js.map +1 -0
- package/dist/workflow-package/trust.d.ts +27 -0
- package/dist/workflow-package/trust.js +61 -0
- package/dist/workflow-package/trust.js.map +1 -0
- package/dist/workflow-package/types.d.ts +176 -0
- package/dist/workflow-package/types.js +9 -0
- package/dist/workflow-package/types.js.map +1 -0
- package/dist/workflow-package/workflow-v1.d.ts +3 -0
- package/dist/workflow-package/workflow-v1.js +274 -0
- package/dist/workflow-package/workflow-v1.js.map +1 -0
- package/package.json +40 -0
- package/resources/catalog.yaml +37 -0
- package/resources/connectors/github-cli.yaml +24 -0
- package/resources/connectors/gitlab-cli.yaml +24 -0
- package/resources/connectors/lark-cli.yaml +28 -0
- package/resources/skills/bug-fixing/SKILL.md +16 -0
- package/resources/skills/code-review/SKILL.md +16 -0
- package/resources/skills/documentation-editing/SKILL.md +16 -0
- package/resources/skills/documentation-exploration/SKILL.md +16 -0
- package/resources/skills/documentation-review/SKILL.md +16 -0
- package/resources/skills/requirement-exploration/SKILL.md +16 -0
- package/resources/skills/solution-design/SKILL.md +16 -0
- package/resources/skills/task-planning/SKILL.md +16 -0
- package/resources/skills/tdd-implementation/SKILL.md +16 -0
- package/resources/workflows/documentation-delivery/manifest.yaml +8 -0
- package/resources/workflows/documentation-delivery/profiles/governed.yaml +23 -0
- package/resources/workflows/documentation-delivery/profiles/quick.yaml +23 -0
- package/resources/workflows/documentation-delivery/profiles/standard.yaml +21 -0
- package/resources/workflows/documentation-delivery/workflow.yaml +109 -0
- package/resources/workflows/feature-delivery/manifest.yaml +8 -0
- package/resources/workflows/feature-delivery/profiles/governed.yaml +27 -0
- package/resources/workflows/feature-delivery/profiles/quick.yaml +25 -0
- package/resources/workflows/feature-delivery/profiles/standard.yaml +26 -0
- package/resources/workflows/feature-delivery/workflow.yaml +150 -0
- package/schemas/builtin-agent-action-v1.schema.json +509 -0
- package/schemas/builtin-application-acquire-input-v1.schema.json +25 -0
- package/schemas/builtin-application-artifact-create-input-v1.schema.json +49 -0
- package/schemas/builtin-application-decision-input-v1.schema.json +284 -0
- package/schemas/builtin-application-inspect-input-v1.schema.json +20 -0
- package/schemas/builtin-application-project-config-snapshot-v1.schema.json +289 -0
- package/schemas/builtin-application-project-config-v1.schema.json +293 -0
- package/schemas/builtin-application-start-input-v1.schema.json +92 -0
- package/schemas/builtin-application-submit-input-v1.schema.json +145 -0
- package/schemas/builtin-artifact-v1.schema.json +48 -0
- package/schemas/builtin-evidence-v1.schema.json +65 -0
- package/schemas/builtin-external-action-grant-v1.schema.json +298 -0
- package/schemas/builtin-external-action-request-v1.schema.json +288 -0
- package/schemas/builtin-external-binding-v1.schema.json +59 -0
- package/schemas/builtin-external-receipt-v1.schema.json +109 -0
- package/schemas/builtin-external-write-receipt-v1.schema.json +253 -0
- package/schemas/builtin-source-artifact-v1.schema.json +293 -0
- package/schemas/builtin-submit-result-v1.schema.json +111 -0
- package/schemas/builtin-tdd-cycle-evidence-v1.schema.json +119 -0
- package/schemas/builtin-tdd-node-test-report-v1.schema.json +103 -0
- package/schemas/builtin-tdd-trusted-evidence-v1.schema.json +184 -0
- package/schemas/builtin-work-item-v1.schema.json +201 -0
- package/schemas/builtin-work-package-v1.schema.json +254 -0
- package/schemas/builtin-workflow-selection-v1.schema.json +40 -0
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
import { lstat, readFile, realpath } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parse } from "yaml";
|
|
4
|
+
import { sha256 } from "../../domain/digests.js";
|
|
5
|
+
import { CliAdapterError } from "../cli/output.js";
|
|
6
|
+
import { spawnJson } from "../process/spawn-json.js";
|
|
7
|
+
import { claudeDriverTarget } from "./claude.js";
|
|
8
|
+
import { codexDriverTarget } from "./codex.js";
|
|
9
|
+
import { cursorDriverTarget } from "./cursor.js";
|
|
10
|
+
import { genericDriverTarget } from "./generic.js";
|
|
11
|
+
const currentDriverVersion = 7;
|
|
12
|
+
const maximumDriverBytes = 1048576n;
|
|
13
|
+
const driverDescription = "使用 WSSpecKit 驱动软件交付 Workflow;新任务、已有任务或用户明确要求时调用。";
|
|
14
|
+
const driverFrontMatterKeys = ["description", "name", "wsspeckit-driver-content-digest", "wsspeckit-driver-version"];
|
|
15
|
+
// v1 的中文指导曾在未提升版本号时更新,因此两个历史摘要都必须显式登记。
|
|
16
|
+
const canonicalDriverDigests = {
|
|
17
|
+
codex: {
|
|
18
|
+
1: [
|
|
19
|
+
"sha256:8804ee37451e7740a488c14291d048b57a21bdd7e2efb1b1beb70a46940030e3",
|
|
20
|
+
"sha256:69b6ad68c123a711095377ffdf64d21225f4bafaab3a414497ffef6c5391773e",
|
|
21
|
+
],
|
|
22
|
+
2: ["sha256:69b6ad68c123a711095377ffdf64d21225f4bafaab3a414497ffef6c5391773e"],
|
|
23
|
+
3: ["sha256:451f3853fbc01766264e07c6b3f376aa64acfa0d7f2c6662916f876496558a8f"],
|
|
24
|
+
4: ["sha256:417eb92d90b1fcd9f3ea519a80fd7d3b9151d211c90371ff17e2edbb361817aa"],
|
|
25
|
+
5: ["sha256:2168d90a410d3d250645efb01911d09bc0f72259835fa2800819eba6838b65db"],
|
|
26
|
+
6: ["sha256:dbee7635c12c75cd3548241e36e919f53afa7f6ca5f93a147d2dc674cc39bb25"],
|
|
27
|
+
7: ["sha256:cccac8ae5fa0fe9df0b6619afc8566be7964b3ae2a5d65f93002a3def5360039"],
|
|
28
|
+
},
|
|
29
|
+
claude: {
|
|
30
|
+
1: [
|
|
31
|
+
"sha256:3a592093e530e6e65c46d3d0cbde567fc4674135b250b0bd807e44dcb8ff8fb7",
|
|
32
|
+
"sha256:f7876f2691e037c3d5d9e469275e8f9adb110b6ed39f3ba7eb6f962e5d70cbb1",
|
|
33
|
+
],
|
|
34
|
+
2: ["sha256:f7876f2691e037c3d5d9e469275e8f9adb110b6ed39f3ba7eb6f962e5d70cbb1"],
|
|
35
|
+
3: ["sha256:100a50a8ca4da95b9513aec29cdd70703cccd6bdb89209d1d18850f63ea944cb"],
|
|
36
|
+
4: ["sha256:4bc3ec83cec6e94858e91d9530de8cd5cb73808e4afaed40696f0acd0238f1a3"],
|
|
37
|
+
5: ["sha256:bbaf8982709f2a8a38e62fc1d4142725d9a38932385daad0bba70307295e7f62"],
|
|
38
|
+
6: ["sha256:3d425ec1ad828b1c58768225bc07e5fa00468566d63997ce8b346c9ba0e50c1f"],
|
|
39
|
+
7: ["sha256:c24cc8db341e713dc68558ebfa89ea7e697375ed607158daf8376b859e2cc2ff"],
|
|
40
|
+
},
|
|
41
|
+
cursor: {
|
|
42
|
+
1: [
|
|
43
|
+
"sha256:d74438d605600c54633d2262a9558163a3f0d3a5c664983e4a20d4f84708b392",
|
|
44
|
+
"sha256:2c5645323532c603f0e2b037bb3cd2cc1275d31abf0fa01180cc3ee436534a93",
|
|
45
|
+
],
|
|
46
|
+
2: ["sha256:2c5645323532c603f0e2b037bb3cd2cc1275d31abf0fa01180cc3ee436534a93"],
|
|
47
|
+
3: ["sha256:5d16ec26c199a1c552b9ba81d346f87fc26ff508c9204c68501ba01ace39ea98"],
|
|
48
|
+
4: ["sha256:37dac4a4dfb61cc430cd50fcfd2b57988aa44caf0edbe87e5f5c97c36b153f1e"],
|
|
49
|
+
5: ["sha256:cb9f9b0b7698c91a8b92443e3818cb5e875392d8f2a97666408ed38967b3d2a7"],
|
|
50
|
+
6: ["sha256:fde89e7d933eea21e9ef1b9d32f3e8a2b2c5905664cc7f924ad02de4390e73bc"],
|
|
51
|
+
7: ["sha256:b9bf5f6060ac8d8c7c24aedea265724623e54d76af91c014fc2d8e450ecedb0d"],
|
|
52
|
+
},
|
|
53
|
+
generic: {
|
|
54
|
+
1: [
|
|
55
|
+
"sha256:a2aeea6a8e14df5fb5477d5ec37eee0a7666f10976e80ac92a8087d1484b94c5",
|
|
56
|
+
"sha256:8248d34a1ac5306701a7d8ac5fbbea175b22ceb932fbcdc3d672a01e31127c25",
|
|
57
|
+
],
|
|
58
|
+
2: ["sha256:8248d34a1ac5306701a7d8ac5fbbea175b22ceb932fbcdc3d672a01e31127c25"],
|
|
59
|
+
3: ["sha256:68f5b5a5c650648987fa230f339e162792a431da53d4b4ca202aff78fcb0cff1"],
|
|
60
|
+
4: ["sha256:c850774fd9c8338c31c6815a83fe526408b76f9473a3482d99bcee42342e3db6"],
|
|
61
|
+
5: ["sha256:6a5288b339b5bc2ae41f3b445863b32ad11428d5b6362ba4a97bd025cafdcca9"],
|
|
62
|
+
6: ["sha256:675dbd85103232c879728b080f648b64701813a540050a1af0d622655f37cde3"],
|
|
63
|
+
7: ["sha256:b10bf3dee31acfa1364ebd8668659095e433ac572450670e1a22130f00c68d3b"],
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
function contract(agent) {
|
|
67
|
+
const actionCases = {
|
|
68
|
+
execute: {
|
|
69
|
+
next: "artifact",
|
|
70
|
+
capture: {
|
|
71
|
+
workPackage: "result.workPackage",
|
|
72
|
+
stepId: "result.workPackage.stepId",
|
|
73
|
+
attemptId: "result.workPackage.attemptId",
|
|
74
|
+
leaseToken: "result.workPackage.lease.token",
|
|
75
|
+
requiredOutputs: "result.workPackage.requiredOutputs",
|
|
76
|
+
},
|
|
77
|
+
initialize: {
|
|
78
|
+
target: "artifactRefs",
|
|
79
|
+
source: "result.workPackage.artifacts",
|
|
80
|
+
filter: { field: "artifactType", equals: "requirement-source", requiredBy: "requiredOutputs" },
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
await_approval: { next: "await_approval" },
|
|
84
|
+
blocked: { next: "blocked" },
|
|
85
|
+
completed: { next: "completed" },
|
|
86
|
+
};
|
|
87
|
+
const submitActionCases = {
|
|
88
|
+
...actionCases,
|
|
89
|
+
await_approval: {
|
|
90
|
+
next: "decide",
|
|
91
|
+
capture: { approval: "result.approval" },
|
|
92
|
+
humanGate: { required: true, approval: "result.approval" },
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
const decideActionCases = {
|
|
96
|
+
...actionCases,
|
|
97
|
+
execute: {
|
|
98
|
+
next: "submit",
|
|
99
|
+
capture: {
|
|
100
|
+
workPackage: "result.workPackage",
|
|
101
|
+
stepId: "result.workPackage.stepId",
|
|
102
|
+
attemptId: "result.workPackage.attemptId",
|
|
103
|
+
leaseToken: "result.workPackage.lease.token",
|
|
104
|
+
requiredOutputs: "result.workPackage.requiredOutputs",
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
return {
|
|
109
|
+
kind: "wsspeckit-driver-contract",
|
|
110
|
+
version: 1,
|
|
111
|
+
workflowSelection: {
|
|
112
|
+
feature: "builtin://workflows/feature-delivery",
|
|
113
|
+
documentation: "builtin://workflows/documentation-delivery",
|
|
114
|
+
},
|
|
115
|
+
entrypoints: { new: "start", recovery: "inspect" },
|
|
116
|
+
operations: {
|
|
117
|
+
start: {
|
|
118
|
+
argv: ["wspec", "start", "--prompt", "${prompt}", "--workflow", "${workflowRef}", "--profile", "${profile}", "--provider", agent],
|
|
119
|
+
capture: { workItemId: "result.workItemId", workflowRef: "result.workflowRef" },
|
|
120
|
+
next: "inspect",
|
|
121
|
+
},
|
|
122
|
+
inspect: {
|
|
123
|
+
argv: ["wspec", "inspect", "${workItemId}"],
|
|
124
|
+
capture: { workflowRef: "result.workflowRef" },
|
|
125
|
+
next: "acquire",
|
|
126
|
+
},
|
|
127
|
+
acquire: {
|
|
128
|
+
argv: ["wspec", "acquire", "${workItemId}", "--actor", "${actor}"],
|
|
129
|
+
branch: {
|
|
130
|
+
field: "result.action",
|
|
131
|
+
cases: actionCases,
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
artifact: {
|
|
135
|
+
argv: [
|
|
136
|
+
"wspec", "artifact", "create",
|
|
137
|
+
"--work-item", "${workItemId}",
|
|
138
|
+
"--step", "${stepId}",
|
|
139
|
+
"--attempt", "${attemptId}",
|
|
140
|
+
"--lease-token", "${leaseToken}",
|
|
141
|
+
"--artifact-type", "${artifactType}",
|
|
142
|
+
"--output", "${outputId}",
|
|
143
|
+
"--content-file", "${contentFile}",
|
|
144
|
+
],
|
|
145
|
+
capture: { artifactRef: "result" },
|
|
146
|
+
forEach: {
|
|
147
|
+
source: "requiredOutputs",
|
|
148
|
+
item: "requiredOutput",
|
|
149
|
+
filter: { field: "artifactType", notEquals: "requirement-source" },
|
|
150
|
+
bindings: {
|
|
151
|
+
artifactType: "requiredOutput.artifactType",
|
|
152
|
+
outputId: "requiredOutput.outputId",
|
|
153
|
+
contentFile: ".wsspec/work-items/${workItemId}/drafts/${outputId}.md",
|
|
154
|
+
},
|
|
155
|
+
collect: { target: "artifactRefs", value: "result" },
|
|
156
|
+
},
|
|
157
|
+
next: "submit",
|
|
158
|
+
},
|
|
159
|
+
submit: {
|
|
160
|
+
argv: [
|
|
161
|
+
"wspec", "submit", "${workItemId}",
|
|
162
|
+
"--step", "${stepId}",
|
|
163
|
+
"--attempt", "${attemptId}",
|
|
164
|
+
"--lease", "${leaseToken}",
|
|
165
|
+
"--result", "${resultPath}",
|
|
166
|
+
"--actor", "${actor}",
|
|
167
|
+
],
|
|
168
|
+
resultBindings: { artifacts: "artifactRefs" },
|
|
169
|
+
branch: { field: "result.action", cases: submitActionCases },
|
|
170
|
+
},
|
|
171
|
+
decide: {
|
|
172
|
+
argv: ["wspec", "decide", "--input", "${decisionPath}", "--actor", "${actor}"],
|
|
173
|
+
branch: { field: "result.action", cases: decideActionCases },
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
terminals: {
|
|
177
|
+
await_approval: { stop: true },
|
|
178
|
+
blocked: { stop: true },
|
|
179
|
+
completed: { stop: true },
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function body(agent) {
|
|
184
|
+
return [
|
|
185
|
+
"# WSSpecKit Driver",
|
|
186
|
+
"",
|
|
187
|
+
"## Workflow 决策",
|
|
188
|
+
"",
|
|
189
|
+
"仅当需求明确为纯文档或无代码变更时选择 `builtin://workflows/documentation-delivery`;其余默认选择 `builtin://workflows/feature-delivery`。用户可以在创建前覆盖选择,但创建时必须传递明确的 `workflowRef`;Work Item 创建后不得自动切换 Workflow。",
|
|
190
|
+
"",
|
|
191
|
+
"## 新任务与恢复",
|
|
192
|
+
"",
|
|
193
|
+
`新任务执行 \`wspec start --prompt "<用户需求>" --workflow "<workflowRef>" --profile "<profile>" --provider "${agent}"\`。从 JSON 输出读取 \`result.workItemId\` 和 \`result.workflowRef\`;后续所有命令都使用这个 \`workItemId\`,并确认 \`workflowRef\` 未变化。`,
|
|
194
|
+
"",
|
|
195
|
+
"已有任务或 Host 重启后的恢复固定执行 inspect -> acquire:先运行 `wspec inspect \"<workItemId>\"`,从 `result.workflowRef` 确认原 Workflow,再运行 `wspec acquire \"<workItemId>\" --actor \"<actor>\"`。不要重新 start,也不要按项目当前默认值替换原 `workflowRef`。",
|
|
196
|
+
"",
|
|
197
|
+
"## acquire / submit 循环",
|
|
198
|
+
"",
|
|
199
|
+
"每次 acquire 都读取 `result.action` 并按下列分支处理:",
|
|
200
|
+
"",
|
|
201
|
+
"- `execute`:读取 `result.workPackage.stepId`、`result.workPackage.attemptId`、`result.workPackage.lease.token` 和完整 `requiredOutputs`。先把 Work Package 中系统提供的 `requirement-source` 引用放入 `artifactRefs`;再按 `requiredOutputs` 顺序逐项处理其余输出。每项正文写入 Work Item 自有的 `.wsspec/work-items/<workItemId>/drafts/<outputId>.md`,执行 `wspec artifact create --work-item \"<workItemId>\" --step \"<stepId>\" --attempt \"<attemptId>\" --lease-token \"<leaseToken>\" --artifact-type \"<artifactType>\" --output \"<outputId>\" --content-file \".wsspec/work-items/<workItemId>/drafts/<outputId>.md\"`,并把每次 JSON stdout 的 `result` 追加到 `artifactRefs`。所有必需输出完成后才生成 SubmitResult;submit JSON 的 `artifacts` 只携带累积的 ArtifactRef,正文、`contentFile`、绝对路径和 Lease token 都不得写入 `<resultPath>`。随后执行 `wspec submit \"<workItemId>\" --step \"<stepId>\" --attempt \"<attemptId>\" --lease \"<leaseToken>\" --result \"<resultPath>\" --actor \"<actor>\"`。submit 也返回 `result.action`:若为 `execute`,它已经携带并 claim 新 Work Package,必须从 artifact 循环处理,不得再次 acquire;其余分支按下文停止。不得复用旧 attemptId 或 leaseToken。",
|
|
202
|
+
"- `await_approval`:读取并向用户展示 `result.approval`,停止自动执行;不得代替用户批准。人工决定写入 `<decisionPath>` 后执行 `wspec decide --input \"<decisionPath>\" --actor \"<actor>\"`。若 decide 返回 `execute`,必须捕获其完整 Work Package identity,并使用原样未改的 `<resultPath>` 直接重新 submit,不得再次执行 Artifact authoring;若 Host 会话已中断,再从 inspect / acquire 恢复。",
|
|
203
|
+
"- `blocked`:读取并展示 `result.problems`,停止循环;只有问题被外部解决后才从 inspect / acquire 恢复。",
|
|
204
|
+
"- `completed`:读取 `result.summary`,报告完成并停止,不再 acquire 或 submit。",
|
|
205
|
+
"",
|
|
206
|
+
"以下 fenced JSON 是 Host 和自动验收共同消费的命令/状态机合同;`${...}` 变量必须来自用户选择、Host 身份或前一条命令声明的 capture,不能自行猜测:",
|
|
207
|
+
"",
|
|
208
|
+
"```json",
|
|
209
|
+
JSON.stringify(contract(agent), null, 2),
|
|
210
|
+
"```",
|
|
211
|
+
"",
|
|
212
|
+
"面向用户的说明、文档和交互文案默认使用中文;协议字段、类型名、URI、命令名和错误码保持英文。",
|
|
213
|
+
"",
|
|
214
|
+
"Driver 不得调用模型 API,不得缓存或管理对话、Token、记忆或隐藏推理,不得把 Artifact 正文放入协议 JSON。Artifact 只通过协议中的引用读取,模型上下文由当前 Agent Host 自主管理。",
|
|
215
|
+
"",
|
|
216
|
+
"安装只写入本 Skill 文件,不会启动后台 Runner。Driver 使用 WSSpecKit Application Protocol 驱动当前 Agent,不冒充 Codex、Claude、Cursor 或其他真实 Agent Host。",
|
|
217
|
+
"",
|
|
218
|
+
`手动调用示例:\`wspec start --provider ${agent} --prompt "更新 README" --workflow builtin://workflows/documentation-delivery --profile quick\`。`,
|
|
219
|
+
"",
|
|
220
|
+
].join("\n");
|
|
221
|
+
}
|
|
222
|
+
function skill(agent) {
|
|
223
|
+
const content = body(agent);
|
|
224
|
+
const digest = sha256(content);
|
|
225
|
+
if (!canonicalDriverDigests[agent][currentDriverVersion].includes(digest)) {
|
|
226
|
+
throw new Error("当前 Driver 正文未登记 canonical 摘要。");
|
|
227
|
+
}
|
|
228
|
+
return [
|
|
229
|
+
"---",
|
|
230
|
+
"name: wsspeckit-driver",
|
|
231
|
+
`wsspeckit-driver-version: ${currentDriverVersion}`,
|
|
232
|
+
`wsspeckit-driver-content-digest: ${digest}`,
|
|
233
|
+
`description: ${driverDescription}`,
|
|
234
|
+
"---",
|
|
235
|
+
"",
|
|
236
|
+
content,
|
|
237
|
+
].join("\n");
|
|
238
|
+
}
|
|
239
|
+
function conflict(message = "安装目标已存在且不是 WSSpecKit Driver,拒绝覆盖。") {
|
|
240
|
+
throw new CliAdapterError("WSSPEC_SKILL_INSTALL_CONFLICT", message);
|
|
241
|
+
}
|
|
242
|
+
function isMissing(error) {
|
|
243
|
+
return error instanceof Error && "code" in error && error.code === "ENOENT";
|
|
244
|
+
}
|
|
245
|
+
function isWithin(parent, candidate) {
|
|
246
|
+
const relative = path.relative(parent, candidate);
|
|
247
|
+
return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
|
|
248
|
+
}
|
|
249
|
+
async function canonicalDirectory(directory) {
|
|
250
|
+
let canonical;
|
|
251
|
+
try {
|
|
252
|
+
canonical = await realpath(path.resolve(directory));
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
return conflict("Driver 安装 authority 不存在或不可访问。");
|
|
256
|
+
}
|
|
257
|
+
const info = await lstat(canonical, { bigint: true });
|
|
258
|
+
if (!info.isDirectory())
|
|
259
|
+
return conflict("Driver 安装 authority 必须是普通目录。");
|
|
260
|
+
return canonical;
|
|
261
|
+
}
|
|
262
|
+
async function targetFor(input) {
|
|
263
|
+
if (input.agent !== "generic" && input.target !== undefined)
|
|
264
|
+
throw new CliAdapterError("WSSPEC_ARGUMENT_INVALID", "只有 Generic Driver 支持 --target。");
|
|
265
|
+
const home = await canonicalDirectory(input.home);
|
|
266
|
+
const supplied = genericDriverTarget(input.target);
|
|
267
|
+
const rawHome = path.resolve(input.home);
|
|
268
|
+
const genericTarget = supplied === undefined ? undefined : path.resolve(supplied);
|
|
269
|
+
const normalizedGenericTarget = genericTarget !== undefined && isWithin(rawHome, genericTarget)
|
|
270
|
+
? path.join(home, path.relative(rawHome, genericTarget))
|
|
271
|
+
: genericTarget;
|
|
272
|
+
const target = input.agent === "codex" ? codexDriverTarget(home)
|
|
273
|
+
: input.agent === "claude" ? claudeDriverTarget(home)
|
|
274
|
+
: input.agent === "cursor" ? cursorDriverTarget(home)
|
|
275
|
+
: normalizedGenericTarget;
|
|
276
|
+
if (target === undefined || target === "")
|
|
277
|
+
throw new CliAdapterError("WSSPEC_ARGUMENT_REQUIRED", "Generic Driver 必须通过 --target 指定安装目录。");
|
|
278
|
+
return path.resolve(target);
|
|
279
|
+
}
|
|
280
|
+
function sameIdentity(left, right) {
|
|
281
|
+
return left.dev === right.dev && left.ino === right.ino;
|
|
282
|
+
}
|
|
283
|
+
function assertDirectory(info) {
|
|
284
|
+
if (!info.isDirectory())
|
|
285
|
+
conflict("Driver 安装路径的每一段都必须是普通目录,禁止 symlink 或其他文件类型。");
|
|
286
|
+
}
|
|
287
|
+
async function assertCanonicalDirectoryChain(directory) {
|
|
288
|
+
const resolved = path.resolve(directory);
|
|
289
|
+
const root = path.parse(resolved).root;
|
|
290
|
+
let current = root;
|
|
291
|
+
let currentInfo = await lstat(current, { bigint: true });
|
|
292
|
+
assertDirectory(currentInfo);
|
|
293
|
+
for (const segment of path.relative(root, resolved).split(path.sep).filter(Boolean)) {
|
|
294
|
+
current = path.join(current, segment);
|
|
295
|
+
const info = await lstat(current, { bigint: true });
|
|
296
|
+
assertDirectory(info);
|
|
297
|
+
if (await realpath(current) !== current)
|
|
298
|
+
conflict("Driver 安装路径必须是 canonical,禁止任何祖先 symlink。");
|
|
299
|
+
currentInfo = info;
|
|
300
|
+
}
|
|
301
|
+
return currentInfo;
|
|
302
|
+
}
|
|
303
|
+
function ownedSkillVersion(content, agent) {
|
|
304
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n\r?\n([\s\S]*)$/u.exec(content);
|
|
305
|
+
if (match === null)
|
|
306
|
+
return undefined;
|
|
307
|
+
let frontMatter;
|
|
308
|
+
try {
|
|
309
|
+
frontMatter = parse(match[1]);
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
return undefined;
|
|
313
|
+
}
|
|
314
|
+
if (frontMatter === null || typeof frontMatter !== "object" || Array.isArray(frontMatter))
|
|
315
|
+
return undefined;
|
|
316
|
+
const source = frontMatter;
|
|
317
|
+
const keys = Object.keys(source).sort();
|
|
318
|
+
const version = source["wsspeckit-driver-version"];
|
|
319
|
+
const digest = source["wsspeckit-driver-content-digest"];
|
|
320
|
+
const owned = source.name === "wsspeckit-driver"
|
|
321
|
+
&& source.description === driverDescription
|
|
322
|
+
&& keys.length === driverFrontMatterKeys.length
|
|
323
|
+
&& keys.every((key, index) => key === driverFrontMatterKeys[index])
|
|
324
|
+
&& (version === 1 || version === 2 || version === 3 || version === 4 || version === 5 || version === 6 || version === 7)
|
|
325
|
+
&& typeof digest === "string"
|
|
326
|
+
&& digest === sha256(match[2])
|
|
327
|
+
&& canonicalDriverDigests[agent][version].includes(digest);
|
|
328
|
+
return owned ? version : undefined;
|
|
329
|
+
}
|
|
330
|
+
async function skillIdentity(filename) {
|
|
331
|
+
let info;
|
|
332
|
+
try {
|
|
333
|
+
info = await lstat(filename, { bigint: true });
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
if (isMissing(error))
|
|
337
|
+
return undefined;
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
if (!info.isFile() || info.nlink !== 1n || info.size > maximumDriverBytes)
|
|
341
|
+
conflict("Driver Skill 必须是有界单链接普通文件,禁止 symlink、hardlink 或其他文件类型。");
|
|
342
|
+
return info;
|
|
343
|
+
}
|
|
344
|
+
async function assertOwned(target, agent) {
|
|
345
|
+
const filename = path.join(target, "SKILL.md");
|
|
346
|
+
const before = await skillIdentity(filename);
|
|
347
|
+
if (before === undefined)
|
|
348
|
+
return undefined;
|
|
349
|
+
let existing;
|
|
350
|
+
try {
|
|
351
|
+
existing = await readFile(filename, "utf8");
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
return conflict();
|
|
355
|
+
}
|
|
356
|
+
const after = await skillIdentity(filename);
|
|
357
|
+
const version = ownedSkillVersion(existing, agent);
|
|
358
|
+
if (after === undefined || !sameIdentity(before, after) || version === undefined)
|
|
359
|
+
return conflict();
|
|
360
|
+
return { content: existing, info: after, version };
|
|
361
|
+
}
|
|
362
|
+
const secureInstallScript = String.raw `
|
|
363
|
+
import base64, hashlib, json, os, stat, sys
|
|
364
|
+
|
|
365
|
+
def result(ok, code=None):
|
|
366
|
+
value = {"ok": ok}
|
|
367
|
+
if code is not None:
|
|
368
|
+
value["code"] = code
|
|
369
|
+
sys.stdout.write(json.dumps(value, separators=(",", ":")))
|
|
370
|
+
|
|
371
|
+
def fail():
|
|
372
|
+
raise RuntimeError("conflict")
|
|
373
|
+
|
|
374
|
+
def request_value(source, key, kind):
|
|
375
|
+
value = source.get(key)
|
|
376
|
+
if not isinstance(value, kind):
|
|
377
|
+
fail()
|
|
378
|
+
return value
|
|
379
|
+
|
|
380
|
+
def open_target(target, expected_dev, expected_ino):
|
|
381
|
+
if not target.startswith("/") or os.path.normpath(target) != target or target == "/" or "\x00" in target:
|
|
382
|
+
fail()
|
|
383
|
+
current = os.open("/", os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW)
|
|
384
|
+
try:
|
|
385
|
+
for segment in [part for part in target.split("/") if part]:
|
|
386
|
+
before = os.stat(segment, dir_fd=current, follow_symlinks=False)
|
|
387
|
+
if not stat.S_ISDIR(before.st_mode):
|
|
388
|
+
fail()
|
|
389
|
+
child = os.open(segment, os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW, dir_fd=current)
|
|
390
|
+
after = os.fstat(child)
|
|
391
|
+
if (before.st_dev, before.st_ino) != (after.st_dev, after.st_ino):
|
|
392
|
+
os.close(child)
|
|
393
|
+
fail()
|
|
394
|
+
os.close(current)
|
|
395
|
+
current = child
|
|
396
|
+
final = os.fstat(current)
|
|
397
|
+
if str(final.st_dev) != expected_dev or str(final.st_ino) != expected_ino:
|
|
398
|
+
fail()
|
|
399
|
+
return current
|
|
400
|
+
except BaseException:
|
|
401
|
+
os.close(current)
|
|
402
|
+
raise
|
|
403
|
+
|
|
404
|
+
def existing_file(directory):
|
|
405
|
+
try:
|
|
406
|
+
before = os.stat("SKILL.md", dir_fd=directory, follow_symlinks=False)
|
|
407
|
+
except FileNotFoundError:
|
|
408
|
+
return None
|
|
409
|
+
if not stat.S_ISREG(before.st_mode) or before.st_nlink != 1 or before.st_size > 1048576:
|
|
410
|
+
fail()
|
|
411
|
+
handle = os.open("SKILL.md", os.O_RDONLY | os.O_NOFOLLOW, dir_fd=directory)
|
|
412
|
+
after = os.fstat(handle)
|
|
413
|
+
if (before.st_dev, before.st_ino, before.st_size) != (after.st_dev, after.st_ino, after.st_size):
|
|
414
|
+
os.close(handle)
|
|
415
|
+
fail()
|
|
416
|
+
return handle
|
|
417
|
+
|
|
418
|
+
def verify(directory, expected_digest, expected_size):
|
|
419
|
+
handle = existing_file(directory)
|
|
420
|
+
if handle is None:
|
|
421
|
+
fail()
|
|
422
|
+
try:
|
|
423
|
+
data = bytearray()
|
|
424
|
+
while True:
|
|
425
|
+
chunk = os.read(handle, 65536)
|
|
426
|
+
if not chunk:
|
|
427
|
+
break
|
|
428
|
+
data.extend(chunk)
|
|
429
|
+
if len(data) > 1048576:
|
|
430
|
+
fail()
|
|
431
|
+
if len(data) != expected_size or hashlib.sha256(data).hexdigest() != expected_digest:
|
|
432
|
+
fail()
|
|
433
|
+
finally:
|
|
434
|
+
os.close(handle)
|
|
435
|
+
|
|
436
|
+
def create(directory, content, dry_run):
|
|
437
|
+
existing = existing_file(directory)
|
|
438
|
+
if existing is not None:
|
|
439
|
+
os.close(existing)
|
|
440
|
+
fail()
|
|
441
|
+
if dry_run:
|
|
442
|
+
return False
|
|
443
|
+
handle = None
|
|
444
|
+
try:
|
|
445
|
+
handle = os.open("SKILL.md", os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_NOFOLLOW, 0o600, dir_fd=directory)
|
|
446
|
+
offset = 0
|
|
447
|
+
while offset < len(content):
|
|
448
|
+
written = os.write(handle, content[offset:])
|
|
449
|
+
if written < 1:
|
|
450
|
+
fail()
|
|
451
|
+
offset += written
|
|
452
|
+
os.fsync(handle)
|
|
453
|
+
os.close(handle)
|
|
454
|
+
handle = None
|
|
455
|
+
os.fsync(directory)
|
|
456
|
+
return True
|
|
457
|
+
except BaseException:
|
|
458
|
+
if handle is not None:
|
|
459
|
+
os.close(handle)
|
|
460
|
+
raise
|
|
461
|
+
|
|
462
|
+
try:
|
|
463
|
+
source = json.load(sys.stdin)
|
|
464
|
+
if not isinstance(source, dict) or set(source) - {"target", "targetDev", "targetIno", "operation", "dryRun", "contentBase64", "expectedDigest", "expectedSize"}:
|
|
465
|
+
fail()
|
|
466
|
+
target = request_value(source, "target", str)
|
|
467
|
+
target_dev = request_value(source, "targetDev", str)
|
|
468
|
+
target_ino = request_value(source, "targetIno", str)
|
|
469
|
+
operation = request_value(source, "operation", str)
|
|
470
|
+
dry_run = request_value(source, "dryRun", bool)
|
|
471
|
+
directory = open_target(target, target_dev, target_ino)
|
|
472
|
+
created = False
|
|
473
|
+
try:
|
|
474
|
+
if operation == "create":
|
|
475
|
+
encoded = request_value(source, "contentBase64", str)
|
|
476
|
+
content = base64.b64decode(encoded, validate=True)
|
|
477
|
+
if len(content) > 1048576:
|
|
478
|
+
fail()
|
|
479
|
+
created = create(directory, content, dry_run)
|
|
480
|
+
if created:
|
|
481
|
+
verify(directory, hashlib.sha256(content).hexdigest(), len(content))
|
|
482
|
+
elif operation == "verify":
|
|
483
|
+
digest = request_value(source, "expectedDigest", str)
|
|
484
|
+
size = request_value(source, "expectedSize", int)
|
|
485
|
+
if dry_run not in (True, False) or len(digest) != 64 or size < 0 or size > 1048576:
|
|
486
|
+
fail()
|
|
487
|
+
verify(directory, digest, size)
|
|
488
|
+
else:
|
|
489
|
+
fail()
|
|
490
|
+
confirmed = open_target(target, target_dev, target_ino)
|
|
491
|
+
os.close(confirmed)
|
|
492
|
+
except BaseException:
|
|
493
|
+
raise
|
|
494
|
+
finally:
|
|
495
|
+
os.close(directory)
|
|
496
|
+
result(True)
|
|
497
|
+
except BaseException:
|
|
498
|
+
result(False, "conflict")
|
|
499
|
+
`;
|
|
500
|
+
function helperSucceeded(value) {
|
|
501
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
502
|
+
&& Object.keys(value).length === 1 && value.ok === true;
|
|
503
|
+
}
|
|
504
|
+
export async function secureInstallDriverFile(request) {
|
|
505
|
+
if (process.platform !== "darwin")
|
|
506
|
+
conflict("Driver 安全安装当前仅支持 macOS。");
|
|
507
|
+
try {
|
|
508
|
+
const helper = await realpath("/usr/bin/python3");
|
|
509
|
+
const helperInfo = await lstat(helper);
|
|
510
|
+
if (!helperInfo.isFile() || helperInfo.uid !== 0 || (helperInfo.mode & 0o022) !== 0) {
|
|
511
|
+
conflict("Driver 安全安装 helper 不可信。");
|
|
512
|
+
}
|
|
513
|
+
const result = await spawnJson({
|
|
514
|
+
executable: helper,
|
|
515
|
+
argv: ["-I", "-S", "-c", secureInstallScript],
|
|
516
|
+
input: request,
|
|
517
|
+
timeoutMs: 5_000,
|
|
518
|
+
maxStdoutBytes: 256,
|
|
519
|
+
});
|
|
520
|
+
if (!helperSucceeded(result.value))
|
|
521
|
+
conflict("Driver 安全安装未通过文件系统边界校验。");
|
|
522
|
+
}
|
|
523
|
+
catch (error) {
|
|
524
|
+
if (error instanceof CliAdapterError)
|
|
525
|
+
throw error;
|
|
526
|
+
conflict("Driver 安全安装 helper 不可用或执行失败。");
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
const defaultDependencies = { secureInstall: secureInstallDriverFile };
|
|
530
|
+
export function createDriverSkillInstaller(overrides = {}) {
|
|
531
|
+
const dependencies = { ...defaultDependencies, ...overrides };
|
|
532
|
+
return async (input) => {
|
|
533
|
+
const target = await targetFor(input);
|
|
534
|
+
let targetInfo;
|
|
535
|
+
try {
|
|
536
|
+
targetInfo = await assertCanonicalDirectoryChain(target);
|
|
537
|
+
}
|
|
538
|
+
catch (error) {
|
|
539
|
+
if (isMissing(error))
|
|
540
|
+
conflict("Driver 安装目标目录必须预先创建。");
|
|
541
|
+
throw error;
|
|
542
|
+
}
|
|
543
|
+
const existing = await assertOwned(target, input.agent);
|
|
544
|
+
if (existing !== undefined && existing.version !== currentDriverVersion) {
|
|
545
|
+
conflict("旧版 Driver 不进行原地升级;请移除旧文件后重新安装。");
|
|
546
|
+
}
|
|
547
|
+
const content = skill(input.agent);
|
|
548
|
+
const request = existing === undefined
|
|
549
|
+
? {
|
|
550
|
+
target,
|
|
551
|
+
targetDev: targetInfo.dev.toString(),
|
|
552
|
+
targetIno: targetInfo.ino.toString(),
|
|
553
|
+
operation: "create",
|
|
554
|
+
dryRun: input.dryRun === true,
|
|
555
|
+
contentBase64: Buffer.from(content).toString("base64"),
|
|
556
|
+
}
|
|
557
|
+
: {
|
|
558
|
+
target,
|
|
559
|
+
targetDev: targetInfo.dev.toString(),
|
|
560
|
+
targetIno: targetInfo.ino.toString(),
|
|
561
|
+
operation: "verify",
|
|
562
|
+
dryRun: input.dryRun === true,
|
|
563
|
+
expectedDigest: sha256(existing.content).slice("sha256:".length),
|
|
564
|
+
expectedSize: Buffer.byteLength(existing.content),
|
|
565
|
+
};
|
|
566
|
+
await dependencies.secureInstall(request);
|
|
567
|
+
return { agent: input.agent, target, dryRun: input.dryRun === true };
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
export const installDriverSkill = createDriverSkillInstaller();
|
|
571
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/adapters/skills/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { AgentAction, AcquireInput, StepFailureCode, SubmitResult } from "../protocol/application.js";
|
|
2
|
+
import type { WorkPackage } from "../protocol/work-package.js";
|
|
3
|
+
import type { ExecutorRegistry } from "../registry/executors/registry.js";
|
|
4
|
+
import { type RuntimeProjection } from "../storage/control-plane.js";
|
|
5
|
+
import { type CloseDecision } from "../engine/archive.js";
|
|
6
|
+
import type { ApplicationState } from "./state.js";
|
|
7
|
+
import type { ExternalActionExecutor } from "./external-action.js";
|
|
8
|
+
export interface AcquireDependencies {
|
|
9
|
+
now(): Date;
|
|
10
|
+
executors: ExecutorRegistry;
|
|
11
|
+
home: string;
|
|
12
|
+
provider: import("../registry/skills/types.js").SkillProvider;
|
|
13
|
+
externalExecutor(provider: string, action: import("../engine/external-effects/authorization.js").ExternalActionName): ExternalActionExecutor;
|
|
14
|
+
}
|
|
15
|
+
export interface ApplicationStepResult extends SubmitResult {
|
|
16
|
+
failureCode?: StepFailureCode;
|
|
17
|
+
}
|
|
18
|
+
export interface ApplicationAttemptRecord {
|
|
19
|
+
workPackage: WorkPackage;
|
|
20
|
+
retryCount: number;
|
|
21
|
+
actor?: string;
|
|
22
|
+
stepInstanceId?: string;
|
|
23
|
+
artifactValues?: Record<string, Record<string, unknown>>;
|
|
24
|
+
result?: ApplicationStepResult;
|
|
25
|
+
nextAction?: AgentAction;
|
|
26
|
+
}
|
|
27
|
+
export interface ApplicationSkippedStepRecord {
|
|
28
|
+
stepInstanceId: string;
|
|
29
|
+
skipped: true;
|
|
30
|
+
}
|
|
31
|
+
interface AcquiredMutation {
|
|
32
|
+
action: AgentAction;
|
|
33
|
+
skippedStepIds: string[];
|
|
34
|
+
closeDecision?: CloseDecision;
|
|
35
|
+
reacquired?: {
|
|
36
|
+
stageId: string;
|
|
37
|
+
attemptId: string;
|
|
38
|
+
previousLeaseDigest: string;
|
|
39
|
+
leaseDigest: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export declare class ApplicationAcquireError extends Error {
|
|
43
|
+
readonly code: `WSSPEC_${string}`;
|
|
44
|
+
constructor(code: `WSSPEC_${string}`, message: string);
|
|
45
|
+
}
|
|
46
|
+
export declare function acquireNextLocked(input: {
|
|
47
|
+
state: ApplicationState;
|
|
48
|
+
projection: RuntimeProjection;
|
|
49
|
+
actor: string;
|
|
50
|
+
root: string;
|
|
51
|
+
dependencies: AcquireDependencies;
|
|
52
|
+
}): Promise<{
|
|
53
|
+
projection: RuntimeProjection;
|
|
54
|
+
action: AgentAction;
|
|
55
|
+
skippedStepIds: string[];
|
|
56
|
+
closeDecision?: CloseDecision;
|
|
57
|
+
reacquired?: NonNullable<AcquiredMutation["reacquired"]>;
|
|
58
|
+
}>;
|
|
59
|
+
export declare function acquireApplication(input: AcquireInput, dependencies: AcquireDependencies): Promise<AgentAction>;
|
|
60
|
+
export {};
|