@pulse-compute/cli 0.0.0 → 1.0.0-beta.2

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.
Files changed (191) hide show
  1. package/API.md +572 -0
  2. package/CHANGELOG.md +71 -0
  3. package/README.md +71 -1
  4. package/bin/pulse.js +15 -0
  5. package/bin/pulsewasm-extract.js +22 -0
  6. package/cli-spec.json +575 -0
  7. package/completions/_pulse +106 -0
  8. package/completions/pulse.bash +31 -0
  9. package/completions/pulse.fish +76 -0
  10. package/docs/README.md +77 -0
  11. package/docs/architecture/current-contracts.md +470 -0
  12. package/docs/architecture/overview.md +93 -0
  13. package/docs/architecture/vision.md +515 -0
  14. package/docs/concepts/bodies.md +186 -0
  15. package/docs/concepts/compilation-and-lowering.md +496 -0
  16. package/docs/concepts/contracts-and-providers.md +158 -0
  17. package/docs/concepts/effects-and-continuations.md +300 -0
  18. package/docs/concepts/entities-and-adapters.md +71 -0
  19. package/docs/concepts/package-owned-lowering.md +175 -0
  20. package/docs/concepts/targets-and-hosts.md +70 -0
  21. package/docs/contributing/README.md +38 -0
  22. package/docs/contributing/adding-core-provider.md +315 -0
  23. package/docs/contributing/adding-first-party-lowerer.md +327 -0
  24. package/docs/contributing/entities-lowering.md +91 -0
  25. package/docs/contributing/package-lowerer-contract.md +383 -0
  26. package/docs/contributing/pulse-aware-packages.md +149 -0
  27. package/docs/examples.md +112 -0
  28. package/docs/fixtures/inspect-fetch-composition.selected.json +181 -0
  29. package/docs/getting-started.md +128 -0
  30. package/docs/guides/compatibility-imports.md +60 -0
  31. package/docs/guides/deploying-fastly.md +188 -0
  32. package/docs/guides/deploying-node.md +143 -0
  33. package/docs/guides/events.md +233 -0
  34. package/docs/guides/fastly-capabilities.md +153 -0
  35. package/docs/guides/fetching-and-composition.md +101 -0
  36. package/docs/guides/grip.md +94 -0
  37. package/docs/guides/json-schemas.md +233 -0
  38. package/docs/guides/migrating-from-express.md +192 -0
  39. package/docs/guides/project-lifecycle.md +143 -0
  40. package/docs/guides/routing.md +202 -0
  41. package/docs/guides/troubleshooting.md +47 -0
  42. package/docs/maintainers/README.md +60 -0
  43. package/docs/maintainers/codex-maintainer.md +71 -0
  44. package/docs/maintainers/documentation-deployment.md +147 -0
  45. package/docs/maintainers/documentation-system.md +58 -0
  46. package/docs/maintainers/documentation-versioning.md +65 -0
  47. package/docs/maintainers/maintainer-charter.md +100 -0
  48. package/docs/maintainers/maintenance-policy.json +809 -0
  49. package/docs/maintainers/maintenance-policy.md +124 -0
  50. package/docs/maintainers/npm-publishing.md +154 -0
  51. package/docs/maintainers/plugin-readiness.json +19 -0
  52. package/docs/maintainers/plugin-readiness.md +31 -0
  53. package/docs/maintainers/public-site.md +158 -0
  54. package/docs/maintainers/release-acceptance.md +293 -0
  55. package/docs/maintainers/release-manifest.md +89 -0
  56. package/docs/maintainers/repository-setup.md +145 -0
  57. package/docs/maintainers/scope-policy.md +105 -0
  58. package/docs/maintainers/support-and-triage.md +74 -0
  59. package/docs/maintainers/testing.md +334 -0
  60. package/docs/packages/README.md +60 -0
  61. package/docs/packages/assets.md +85 -0
  62. package/docs/packages/cli.md +190 -0
  63. package/docs/packages/crypto.md +78 -0
  64. package/docs/packages/entities.md +129 -0
  65. package/docs/packages/grip.md +82 -0
  66. package/docs/packages/implementation-packages.md +122 -0
  67. package/docs/packages/jwt.md +55 -0
  68. package/docs/packages/provider-fastly.md +243 -0
  69. package/docs/packages/pulse.md +159 -0
  70. package/docs/packages/runtime.md +265 -0
  71. package/docs/packages/s3.md +101 -0
  72. package/docs/preview-scope.md +142 -0
  73. package/docs/reference/README.md +33 -0
  74. package/docs/reference/cli-spec.json +575 -0
  75. package/docs/reference/cli.md +457 -0
  76. package/docs/reference/compatibility-matrix.md +169 -0
  77. package/docs/reference/diagnostics.md +1872 -0
  78. package/docs/reference/documentation-versions.json +22 -0
  79. package/docs/reference/environment.md +347 -0
  80. package/docs/reference/handler-authoring.md +264 -0
  81. package/docs/reference/project-config.md +582 -0
  82. package/docs/reference/project-config.schema.json +981 -0
  83. package/docs/reference/release-manifest.json +441 -0
  84. package/docs/reference/shell-completion.md +23 -0
  85. package/documentation-site.json +668 -0
  86. package/documentation-versions.json +22 -0
  87. package/examples/01-hello-json/.pulse/.gitignore +3 -0
  88. package/examples/01-hello-json/.pulse/config.ts +16 -0
  89. package/examples/01-hello-json/README.md +119 -0
  90. package/examples/01-hello-json/package.json +20 -0
  91. package/examples/01-hello-json/src/index.ts +9 -0
  92. package/examples/01-hello-json/tests/pulse.harness.ts +22 -0
  93. package/examples/01-hello-json/tsconfig.json +14 -0
  94. package/examples/02-request-schema/.pulse/.gitignore +3 -0
  95. package/examples/02-request-schema/.pulse/config.ts +17 -0
  96. package/examples/02-request-schema/README.md +145 -0
  97. package/examples/02-request-schema/package.json +20 -0
  98. package/examples/02-request-schema/src/index.ts +18 -0
  99. package/examples/02-request-schema/src/schemas.ts +20 -0
  100. package/examples/02-request-schema/tests/pulse.harness.ts +37 -0
  101. package/examples/02-request-schema/tsconfig.json +14 -0
  102. package/examples/03-fetch-composition/.pulse/.gitignore +3 -0
  103. package/examples/03-fetch-composition/.pulse/config.ts +31 -0
  104. package/examples/03-fetch-composition/README.md +210 -0
  105. package/examples/03-fetch-composition/package.json +20 -0
  106. package/examples/03-fetch-composition/src/index.ts +60 -0
  107. package/examples/03-fetch-composition/tests/pulse.harness.ts +47 -0
  108. package/examples/03-fetch-composition/tsconfig.json +14 -0
  109. package/examples/05-fastly-capabilities/.pulse/.gitignore +3 -0
  110. package/examples/05-fastly-capabilities/.pulse/config.ts +57 -0
  111. package/examples/05-fastly-capabilities/README.md +257 -0
  112. package/examples/05-fastly-capabilities/package.json +22 -0
  113. package/examples/05-fastly-capabilities/src/index.ts +55 -0
  114. package/examples/05-fastly-capabilities/tests/pulse.harness.ts +66 -0
  115. package/examples/05-fastly-capabilities/tsconfig.json +14 -0
  116. package/examples/07-opaque-proxy/.pulse/.gitignore +3 -0
  117. package/examples/07-opaque-proxy/.pulse/config.ts +38 -0
  118. package/examples/07-opaque-proxy/README.md +150 -0
  119. package/examples/07-opaque-proxy/package.json +21 -0
  120. package/examples/07-opaque-proxy/src/index.ts +9 -0
  121. package/examples/07-opaque-proxy/tests/pulse.harness.ts +25 -0
  122. package/examples/07-opaque-proxy/tsconfig.json +14 -0
  123. package/examples/09-router-lowering/.pulse/.gitignore +3 -0
  124. package/examples/09-router-lowering/.pulse/config.ts +22 -0
  125. package/examples/09-router-lowering/README.md +287 -0
  126. package/examples/09-router-lowering/package.json +22 -0
  127. package/examples/09-router-lowering/src/index.ts +65 -0
  128. package/examples/09-router-lowering/tests/pulse.harness.ts +91 -0
  129. package/examples/09-router-lowering/tsconfig.json +14 -0
  130. package/examples/10-entities-tools/.pulse/.gitignore +4 -0
  131. package/examples/10-entities-tools/.pulse/config.ts +23 -0
  132. package/examples/10-entities-tools/README.md +165 -0
  133. package/examples/10-entities-tools/package.json +21 -0
  134. package/examples/10-entities-tools/src/handlers.ts +15 -0
  135. package/examples/10-entities-tools/src/index.ts +31 -0
  136. package/examples/10-entities-tools/src/schemas.ts +18 -0
  137. package/examples/10-entities-tools/tests/pulse.harness.ts +40 -0
  138. package/examples/10-entities-tools/tools-facade.cjs +158 -0
  139. package/examples/10-entities-tools/tsconfig.json +14 -0
  140. package/examples/11-events/.pulse/.gitignore +4 -0
  141. package/examples/11-events/.pulse/config.ts +24 -0
  142. package/examples/11-events/README.md +194 -0
  143. package/examples/11-events/package.json +20 -0
  144. package/examples/11-events/src/index.ts +27 -0
  145. package/examples/11-events/src/schemas.ts +19 -0
  146. package/examples/11-events/tests/pulse.harness.ts +34 -0
  147. package/examples/11-events/tsconfig.json +15 -0
  148. package/examples/12-mcp-proxy/.pulse/.gitignore +3 -0
  149. package/examples/12-mcp-proxy/.pulse/config.ts +25 -0
  150. package/examples/12-mcp-proxy/README.md +149 -0
  151. package/examples/12-mcp-proxy/package.json +20 -0
  152. package/examples/12-mcp-proxy/src/index.ts +17 -0
  153. package/examples/12-mcp-proxy/tests/pulse.harness.ts +29 -0
  154. package/examples/12-mcp-proxy/tsconfig.json +14 -0
  155. package/examples/13-jwt-es256/.pulse/config.ts +19 -0
  156. package/examples/13-jwt-es256/README.md +195 -0
  157. package/examples/13-jwt-es256/package.json +21 -0
  158. package/examples/13-jwt-es256/src/index.ts +21 -0
  159. package/examples/13-jwt-es256/tests/pulse.harness.ts +54 -0
  160. package/examples/13-jwt-es256/tsconfig.json +14 -0
  161. package/examples/README.md +36 -0
  162. package/package.json +66 -6
  163. package/project-config.schema.json +981 -0
  164. package/release-manifest.json +441 -0
  165. package/src/command-spec.js +279 -0
  166. package/src/completion.js +113 -0
  167. package/src/diagnostics.js +350 -0
  168. package/src/documentation.js +45 -0
  169. package/src/index.d.ts +133 -0
  170. package/src/index.js +15 -0
  171. package/src/internal/command-executor.d.ts +29 -0
  172. package/src/internal/command-executor.js +143 -0
  173. package/src/internal/command-plan.d.ts +9 -0
  174. package/src/internal/command-plan.js +73 -0
  175. package/src/internal/command-reporter.d.ts +15 -0
  176. package/src/internal/command-reporter.js +133 -0
  177. package/src/internal/command-request.d.ts +35 -0
  178. package/src/internal/command-request.js +154 -0
  179. package/src/internal/node-http.js +54 -0
  180. package/src/internal/project-context.d.ts +66 -0
  181. package/src/internal/project-context.js +175 -0
  182. package/src/project-config-reference.js +4 -0
  183. package/src/project-config-schema.d.ts +23 -0
  184. package/src/project-config-schema.js +271 -0
  185. package/src/project-config.js +724 -0
  186. package/src/project-execution.js +2946 -0
  187. package/src/provider-drivers.js +3 -0
  188. package/src/target-support.js +3 -0
  189. package/src/typescript-module-loader.js +269 -0
  190. package/src/workflow.js +78 -0
  191. package/src/workspace.js +82 -0
@@ -0,0 +1,124 @@
1
+ # Maintenance policy reference
2
+
3
+ <!-- Generated by scripts/maintenance-policy.cjs. Edit release/maintenance-policy.json instead. -->
4
+
5
+ Pulse uses a machine-readable maintenance policy so repository automation and Codex receive the same scope boundaries. The policy is advisory about product direction and mandatory about process: Codex may analyze, review, and prepare bounded patches, while a human retains architecture, merge, repository-setting, and release authority.
6
+
7
+ - **Policy schema:** `pulse.maintenance-policy.v2`
8
+ - **Policy version:** `7`
9
+ - **Release:** `1.0.0-beta.2`
10
+ - **Reviewed:** `2026-09-13`
11
+ - **Resident maintainer:** Codex
12
+ - **Merge authority:** human-only
13
+ - **Release authority:** human-only
14
+ - **Protected Codex environment:** `codex-maintainer`
15
+ - **Codex secret:** `OPENAI_API_KEY`
16
+
17
+ ## Protected environments
18
+
19
+ | Environment | Approval authority | Allowed refs | Secrets | Variables |
20
+ |---|---|---|---|---|
21
+ | `codex-maintainer` | human-maintainer | `default-branch` | `OPENAI_API_KEY` | None |
22
+ | `npm-publish` | human-release | `release-tags` | None | None |
23
+ | `documentation-production` | human-release-infrastructure | `release-tags` | `FASTLY_OBJECT_STORAGE_ACCESS_KEY_ID`, `FASTLY_OBJECT_STORAGE_SECRET_ACCESS_KEY` | `FASTLY_OBJECT_STORAGE_BUCKET`, `FASTLY_OBJECT_STORAGE_REGION`, `FASTLY_OBJECT_STORAGE_ENDPOINT`, `PULSE_DOCUMENTATION_ORIGIN`, `PULSE_DOCUMENTATION_BASE_PATH` |
24
+
25
+ Production environments are release-control boundaries. Codex may inspect failures and prepare patches, but it cannot approve an environment, receive production credentials outside the declared job, publish packages, promote documentation, or activate infrastructure.
26
+
27
+ ## Change classes
28
+
29
+ | ID | Meaning | Codex posture | Separate human decision | Boundary |
30
+ |---|---|---|---:|---|
31
+ | `defect` | Defect | May prepare implementation | No | Supported behavior does not match the documented or tested contract. |
32
+ | `hardening` | Hardening | May prepare implementation | No | Reliability, security, diagnostics, performance, or test strength improves without widening supported behavior. |
33
+ | `documentation` | Documentation | May prepare implementation | No | Documentation, examples, generated references, or presentation change without runtime behavior expansion. |
34
+ | `evidence` | Evidence | May prepare implementation | No | A reproduction, benchmark, fixture, experiment, or usage report records information without creating a product promise. |
35
+ | `scope-expansion` | Scope expansion | Analysis only until approved | Yes | New authoring syntax, capability, provider, effect, public entry point, compatibility promise, or product behavior is proposed. |
36
+ | `architecture` | Architecture | Analysis only until approved | Yes | A protected boundary, trust assumption, ownership rule, execution contract, or governance mechanism changes. |
37
+ | `release` | Release | Analysis only until approved | Yes | Versioning, publication, signing, provenance, package composition, or release-channel behavior changes. |
38
+
39
+ A normal human code review is still required for every merge. “Separate human decision” means the change also alters scope, architecture, or release authority and must be acknowledged before implementation is treated as approved direction.
40
+
41
+ ## Protected boundaries
42
+
43
+ | ID | Boundary | Decision kind | Current contract update | Meaning |
44
+ |---|---|---|---:|---|
45
+ | `public-authoring-api` | Public authoring API | architecture | Required | The provider-neutral TypeScript handler and exported application types. |
46
+ | `effect-capability-model` | Effect and capability model | architecture | Required | The explicit operations a guest can request and the authority a host can realize. |
47
+ | `continuation-runtime` | Continuation runtime | architecture | Required | Suspension, resumption, timeout, identity, and lifecycle semantics between effects. |
48
+ | `lowerer-trust` | Lowerer trust boundary | architecture | Required | Discovery and execution of package-owned lowerers and the first-party trust restriction. |
49
+ | `provider-registry` | Provider registry | architecture | Required | Provider namespace resolution, exact scoped-package bootstrap, provider contracts, host bindings, and target realization. |
50
+ | `configuration-contract` | Configuration contract | architecture | When affected | Public project configuration fields, defaults, precedence, and runtime constraints. |
51
+ | `runtime-target-fluidity` | Runtime target fluidity | architecture | Required | The stable runtime authoring contract and the explicit boundary between native, JavaScript, and future sidecar execution targets. |
52
+ | `package-publication` | Package publication contract | release | When affected | Published package set, exports, support tiers, exact versions, and packed payloads. |
53
+ | `maintenance-control-plane` | Maintenance control plane | architecture | Required | Agent authority, scope policy, repository workflows, ownership, and review gates. |
54
+ | `documentation-deployment` | Documentation deployment contract | release | When affected | Immutable version objects, mutable promotion surfaces, Object Storage delivery, public routing, and production activation. |
55
+ | `release-authority` | Release authority | release | When affected | Version, channel, publication, deployment, signing, and provenance decisions. |
56
+
57
+ Path classification is intentionally conservative. Touching a protected path does not prove that a contract changed; it ensures the pull request names the boundary and receives deliberate review.
58
+
59
+ ## Validation catalog
60
+
61
+ | Check ID | Availability | Command |
62
+ |---|---|---|
63
+ | `maintenance-policy` | Portable | `node scripts/validate-maintainer-control-plane.cjs` |
64
+ | `publication-control-plane` | Portable | `node scripts/validate-publication-workflows.cjs` |
65
+ | `release-preflight` | Portable | `node scripts/release-preflight.cjs --check` |
66
+ | `documentation` | Portable | `npm run docs:check` |
67
+ | `unit` | Portable | `node wasm/scripts/run-wasm-tests.cjs --profile unit --no-report` |
68
+ | `native` | Portable | `node wasm/scripts/run-wasm-tests.cjs --profile native --no-report` |
69
+ | `javascript` | Portable | `node wasm/scripts/run-wasm-tests.cjs --profile javascript --no-report` |
70
+ | `conformance` | Portable | `node wasm/scripts/run-wasm-tests.cjs --profile conformance --no-report` |
71
+ | `cli` | Portable | `node wasm/scripts/run-wasm-tests.cjs --profile cli --no-report` |
72
+ | `providers` | Dependency-bound | `node wasm/scripts/run-wasm-tests.cjs --profile providers --no-report` |
73
+ | `build` | Dependency-bound | `pnpm build` |
74
+ | `release` | Dependency-bound | `npm run release:seal` |
75
+
76
+ Portable checks use the normal lockfile-pinned workspace installation and do not require the release-only dependency bundle or external provider credentials. Dependency-bound checks remain required before publication when their affected paths are touched.
77
+
78
+ ## Reviewed GitHub Actions
79
+
80
+ Every external action used by a checked-in workflow is pinned to a full reviewed commit SHA. The human-readable version is retained as a comment, but tags do not determine execution.
81
+
82
+ | Action | Reviewed version | Commit SHA |
83
+ |---|---|---|
84
+ | `actions/checkout` | `v7.0.0` | `9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0` |
85
+ | `actions/setup-node` | `v6.4.0` | `48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e` |
86
+ | `actions/upload-artifact` | `v7.0.1` | `043fb46d1a93c77aae656e7c1c64a875d1fc6a0a` |
87
+ | `actions/download-artifact` | `v8.0.1` | `3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c` |
88
+ | `actions/github-script` | `v9.0.0` | `3a2844b7e9c422d3c10d287c895573f7108da1b3` |
89
+ | `openai/codex-action` | `v1.11` | `52fe01ec70a42f454c9d2ebd47598f9fd6893d56` |
90
+
91
+ ## Pull-request declaration
92
+
93
+ Every pull request includes a machine-readable Markdown comment with:
94
+
95
+ ```text
96
+ <!-- pulse-maintainer-declaration:start -->
97
+ Change class: defect
98
+ Scope: inside-developer-preview
99
+ Protected boundaries: none
100
+ Human decision: not-required
101
+ <!-- pulse-maintainer-declaration:end -->
102
+ ```
103
+
104
+ The deterministic scope gate compares that declaration with changed paths. It fails only for a missing or contradictory declaration; a correctly declared architecture, scope, or release decision remains visible and relies on CODEOWNER/branch-rule approval rather than pretending an agent can approve it.
105
+
106
+ ## Issue intake
107
+
108
+ | Form | Initial class | Labels |
109
+ |---|---|---|
110
+ | `bug.yml` | `defect` | `type:defect`, `status:needs-reproduction` |
111
+ | `documentation.yml` | `documentation` | `type:documentation`, `area:documentation` |
112
+ | `scope-proposal.yml` | `scope-expansion` | `type:scope-proposal`, `decision:human-required` |
113
+ | `support.yml` | `evidence` | `type:support` |
114
+
115
+ Labels are synchronized by the manual **Maintainer labels** workflow. Issue labels classify incoming evidence; they do not authorize implementation or widen the Beta contract.
116
+
117
+ ## Codex operation
118
+
119
+ The repository supports two complementary paths:
120
+
121
+ 1. Native Codex GitHub review can be enabled in Codex settings and follows the nearest `AGENTS.md` file.
122
+ 2. The manual **Codex maintainer review** workflow runs from the protected `codex-maintainer` environment, uses the policy-specific prompt in a read-only permission profile, validates its output against the generated maintainer-review schema, and posts a structured review to the selected pull request.
123
+
124
+ Neither path can merge, publish, change repository settings, or approve a protected-boundary decision. The environment secret is released only after the repository owner's configured protection rules pass.
@@ -0,0 +1,154 @@
1
+ <!-- pulse-doc-meta:start
2
+ owner: maintainer-council
3
+ status: active
4
+ last-reviewed: 2026-07-25
5
+ review-by: 2027-01-25
6
+ pulse-doc-meta:end -->
7
+
8
+ # npm publishing
9
+
10
+ Pulse publishes the exact tarballs produced by `pnpm release:pack`. Publication does not run recursively from workspace directories and does not repack a package after acceptance.
11
+
12
+ The release path is:
13
+
14
+ ```text
15
+ exact v<version> tag
16
+ → dependency-complete build and acceptance
17
+ → .pulse-release tarballs
18
+ → sealed .pulse-publication bundle
19
+ → protected human approval
20
+ → npm trusted publishing
21
+ → registry integrity and configured dist-tag verification
22
+ → clean published-CLI smoke test
23
+ ```
24
+
25
+ The machine-readable publication contract is the `publication` object in `release/pulse-release-manifest.json`. The production workflow is `.github/workflows/npm-publish.yml`.
26
+
27
+ ## Prepare release identity
28
+
29
+ Use the manifest-owned preparation policy instead of repository-wide version replacement:
30
+
31
+ ```bash
32
+ pnpm release:prepare -- 1.0.0-beta.2 --channel beta --replace-unpublished
33
+ ```
34
+
35
+ `--replace-unpublished` replaces the current candidate without inventing release history. After a version has actually shipped, use `--archive-current`; that mode requires the committed immutable documentation snapshot. The command updates only catalogued JSON, package, guest-metadata, and current-documentation owners, runs named generators, rejects newly changed paths outside its allowlist, and writes an ignored stale-version-token report for review.
36
+
37
+ Release preparation never creates a Git tag and never contacts npm. A human release authority creates the exact `v<version>` tag from the reviewed, sealed commit as a separate action.
38
+
39
+ ## Authority and trigger
40
+
41
+ The workflow is manually dispatched **from the exact release tag**, and the `release_tag` input must name that same tag. Candidate construction, publication tooling, GitHub's native source identity, and npm provenance therefore all refer to one commit. A branch-dispatched run fails before artifacts are built. The candidate job has no publication authority. The `publish` job is attached to the protected `npm-publish` environment and is the only job granted `id-token: write`.
42
+
43
+ For example:
44
+
45
+ ```bash
46
+ gh workflow run npm-publish.yml \
47
+ --ref v1.0.0-beta.2 \
48
+ -f release_tag=v1.0.0-beta.2 \
49
+ -f operation=audit
50
+ ```
51
+
52
+ Use `operation=publish` only after the audit and external package settings are complete.
53
+
54
+ A human release authority must approve that environment. Codex may inspect failures and prepare bounded patches, but it may not dispatch the release, approve the environment, publish a package, change a dist-tag, or rotate registry credentials.
55
+
56
+ ## Trusted publishing
57
+
58
+ Pulse uses npm trusted publishing through GitHub Actions OIDC. No `NPM_TOKEN` or `NODE_AUTH_TOKEN` is provided. Published packages support `^22.14.0 || ^24.0.0`; local development supports pnpm `>=10 <11`. Release packing, CI, and the portable dependency bundle select the exact pnpm version in the release manifest (currently 10.0.0). Local release seals accept Node `^24.0.0` and record the exact patch used. The protected publication workflow remains reproducibly pinned to Node 24.18.0 and npm 11.15.0, and `scripts/release-publication.cjs` rejects a different Node patch, a different npm version, or known long-lived npm credential variables in that job.
59
+
60
+ Every manifest-owned npm package setting must authorize exactly:
61
+
62
+ ```text
63
+ repository: pulse-compute/pulse
64
+ workflow: npm-publish.yml
65
+ environment: npm-publish
66
+ ```
67
+
68
+ The workflow publishes public packages directly under the dist-tag in the
69
+ release manifest. OIDC is deliberately not combined with a post-publication
70
+ `npm dist-tag` mutation. The protected script verifies the native GitHub tag ref
71
+ and SHA against the sealed candidate before the first publish.
72
+
73
+ ## One-time package bootstrap
74
+
75
+ An npm trusted publisher can be configured only after the package name exists under the intended owner. Before enabling production publication, run:
76
+
77
+ ```bash
78
+ npm run release:audit-npm
79
+ ```
80
+
81
+ The command derives every package name from the release manifest and writes a timestamped, manifest-digest-bound report to `.pulse-release-preflight/npm-catalog-audit.json`. That report is ignored source evidence: it never rewrites the canonical preflight policy and it performs no registry mutation. The audit is ready only when every name exists, `bootstrap` points to `0.0.0`, and `latest` is either absent or still points to the same inert `0.0.0` placeholder. A different `latest` target remains blocking and any required dist-tag remediation is an explicit human registry action.
82
+
83
+ Any missing package name requires a one-time human, 2FA-protected bootstrap publication through `scripts/npm_bootstrap.sh <package-name>`. After all names exist:
84
+
85
+ 1. configure the trusted publisher on every package;
86
+ 2. select the exact release tag as the manual workflow ref;
87
+ 3. confirm OIDC publication succeeds;
88
+ 4. remove any temporary bootstrap credential; and
89
+ 5. prohibit ordinary publish tokens for routine releases.
90
+
91
+ The production workflow fails rather than silently performing first publication with a broader credential.
92
+
93
+ ## Sealed candidate
94
+
95
+ After `pnpm release:pack`, prepare the candidate:
96
+
97
+ ```bash
98
+ npm run release:candidate
99
+ npm run release:verify-bundle
100
+ ```
101
+
102
+ `.pulse-publication/pulse-publication-manifest.json` records:
103
+
104
+ - release version, tag, channel, registry, workflow, and protected environment;
105
+ - source commit and ref;
106
+ - the exact publication order;
107
+ - every tarball path, byte length, SHA-256, and npm SHA-512 integrity;
108
+ - Pulse package dependencies used to derive the topological order; and
109
+ - checksums for the source catalog and packed-release manifest.
110
+
111
+ The bundle includes the exact tarballs. GitHub artifact transfer does not create a second npm package payload.
112
+
113
+ ## Dependency-safe, resumable publication
114
+
115
+ Publication orders internal `dependencies` and `optionalDependencies` before dependants. Peer dependencies are validated by release packing but do not introduce an ordering edge. Stable role/name ordering makes retries deterministic.
116
+
117
+ For each package:
118
+
119
+ ```text
120
+ version absent
121
+ → publish the sealed tarball with --access public --tag <release dist-tag>
122
+
123
+ version present with identical SHA-512 integrity
124
+ → record already-published and continue
125
+
126
+ version present with different integrity
127
+ → stop with a critical immutable-version conflict
128
+ ```
129
+
130
+ This is resumable after a partially completed synchronized-package release without pretending npm publication is transactional. A same-version integrity mismatch cannot be repaired by overwriting the registry artifact; the human release authority must investigate and choose a new version if necessary.
131
+
132
+ ## Verification
133
+
134
+ The protected publish job verifies each package immediately. A separate unprivileged job then confirms:
135
+
136
+ - every manifest-owned `name@version` record exists;
137
+ - registry `dist.integrity` equals the sealed tarball integrity;
138
+ - the configured dist-tag points to the release version; and
139
+ - the published canonical CLI installs in a clean prefix and completes version, init, install, doctor, test, and Node build smoke checks.
140
+
141
+ The registry report uses schema `pulse.npm-publication-verification.v1`. The documentation deployment accepts that schema as evidence that matching packages are publicly available before it promotes root and `latest`.
142
+
143
+ ## Local commands
144
+
145
+ These commands do not publish unless the explicit `publish` command is used from the protected GitHub environment:
146
+
147
+ ```bash
148
+ pnpm release:pack
149
+ npm run release:candidate
150
+ npm run release:verify-bundle
151
+ npm run publication:check
152
+ ```
153
+
154
+ Actual publication remains a human-approved workflow action, not a normal local maintenance command. The CLI does not expose a non-GitHub publication bypass; production publication requires the trusted GitHub/OIDC environment. The release validator exercises planning and failure behavior with in-process registry fixtures and never invokes `npm publish`.
@@ -0,0 +1,19 @@
1
+ {
2
+ "schemaVersion": "pulse.plugin-readiness.v1",
3
+ "releaseVersion": "1.0.0-beta.2",
4
+ "publicPluginApi": false,
5
+ "decision": "deferred",
6
+ "requirements": {
7
+ "trustModel": false,
8
+ "packageDiscovery": false,
9
+ "versionNegotiation": false,
10
+ "securityPolicy": false,
11
+ "compatibilityContract": false,
12
+ "isolatedPackageLoading": false
13
+ },
14
+ "currentExtensionBoundary": {
15
+ "lowerers": "trusted first-party release packages only",
16
+ "providers": "explicit package selection through pulse.provider-toolchain.v1; bare host IDs use the @pulse-compute/provider-<id> convention, scoped names are exact, and none is internal; no scanning or self-registration"
17
+ },
18
+ "designRule": "The explicit provider toolchain contract does not imply general plugin discovery, isolated loading, or lowerer extensibility. Do not publish a general third-party plugin API design until every readiness requirement is implemented and release-gated."
19
+ }
@@ -0,0 +1,31 @@
1
+ # Public plugin API readiness
2
+
3
+ <!-- Generated by wasm/scripts/sync-reference-docs.cjs. Edit the source catalog, not this file. -->
4
+
5
+ > **Decision:** Deferred. No public third-party plugin API is available in this release.
6
+
7
+ Pulse 1.0.0-beta.2 keeps general plugin discovery and package lowering inside the synchronized trusted release. Provider bootstrap is explicit and exact. The current boundaries are:
8
+
9
+ - **Lowerers:** trusted first-party release packages only.
10
+ - **Providers:** explicit package selection through pulse.provider-toolchain.v1; bare host IDs use the @pulse-compute/provider-<id> convention, scoped names are exact, and none is internal; no scanning or self-registration.
11
+
12
+ ## Readiness requirements
13
+
14
+ | Requirement | Status |
15
+ |---|---|
16
+ | `trustModel` | **Not implemented** |
17
+ | `packageDiscovery` | **Not implemented** |
18
+ | `versionNegotiation` | **Not implemented** |
19
+ | `securityPolicy` | **Not implemented** |
20
+ | `compatibilityContract` | **Not implemented** |
21
+ | `isolatedPackageLoading` | **Not implemented** |
22
+
23
+ The explicit provider toolchain contract does not imply general plugin discovery, isolated loading, or lowerer extensibility. Do not publish a general third-party plugin API design until every readiness requirement is implemented and release-gated.
24
+
25
+ The machine-readable readiness record and release validation enforce this
26
+ boundary. Contributor guides explain how to add a [first-party
27
+ lowerer](../contributing/adding-first-party-lowerer.md) or [provider
28
+ toolchain](../contributing/adding-core-provider.md); neither process uses
29
+ package scanning or self-registration.
30
+
31
+ Machine-readable status is published as [`plugin-readiness.json`](./plugin-readiness.json).
@@ -0,0 +1,158 @@
1
+ <!-- pulse-doc-meta:start
2
+ owner: maintainer-council
3
+ status: active
4
+ last-reviewed: 2026-07-25
5
+ review-by: 2027-01-25
6
+ pulse-doc-meta:end -->
7
+
8
+ # Public site and documentation presentation
9
+
10
+ Pulse has one generated public-site system for the product homepage and versioned documentation. The homepage is an editorial product surface; the documentation remains layered technical content. They share release facts, routes, navigation metadata, design tokens, components, accessibility behavior, and validation rather than maintaining separate hand-written sites.
11
+
12
+ ## Canonical inputs
13
+
14
+ The generator separates facts from presentation:
15
+
16
+ | Source | Owns |
17
+ |---|---|
18
+ | `release/pulse-release-manifest.json` | Release version, channel, documentation base path, repository metadata, runtime targets, package policy, and exact-version routes. |
19
+ | `release/documentation-versions.json` | Available versions and the moving `latest` alias. |
20
+ | `release/documentation-site.json` | Product copy, named document destinations, header/footer links, navigation sections and ordering, homepage section order, and checked fixture selection. |
21
+ | Repository Markdown | Tutorials, concepts, package guides, references, architecture, and contributor content. |
22
+ | CLI and configuration catalogs | Public command workflow, diagnostics, schemas, environment variables, and other generated reference material. |
23
+ | `scripts/documentation-site/` | Shared design tokens, dark syntax theme, layout and component styles, browser behavior, favicon, and the decorative Pulse field animation. |
24
+
25
+ Do not copy release versions, provider names, CLI command descriptions, package roles, or canonical routes into templates. Add or change the owning catalog and let the site builder consume it.
26
+
27
+ ## Editorial manifest
28
+
29
+ `release/documentation-site.json` uses the `pulse.public-site.v1` schema. Its
30
+ document map assigns stable IDs such as `getting-started` and `preview-scope` to
31
+ Markdown sources. Homepage and header actions refer to those IDs, never
32
+ handwritten URLs. The generator resolves each action to the current exact
33
+ release or the `latest` alias as appropriate. `sourceAliases` maps
34
+ repository-only landing files to their canonical hosted document; `routeAliases`
35
+ preserves intentional redirects after a public route is renamed without
36
+ creating a second content owner.
37
+
38
+ Navigation sections classify every public page exactly once. Explicit `sources`
39
+ take precedence over directory `prefixes`; `navigation.overrides` controls
40
+ concise labels, order, and whether a page is hidden from the flat sidebar
41
+ without adding front matter to generated or installed Markdown. A hidden page
42
+ remains generated, versioned, and link-checked, and the builder requires it to
43
+ remain linked from visible documentation. `hiddenInSearch` is reserved for a
44
+ hidden compatibility page that should remain reachable without competing in
45
+ task search. Section `searchPriority` gives Start, Guide, Concept, Package, and
46
+ Reference material a deterministic ranking boost over contributor material. A
47
+ section may instead set `hiddenInNavigation` and `hiddenInSearch` to classify a
48
+ gated audience namespace without rendering that category in the sidebar or
49
+ general search. The Reference overview is the discovery gate for the hidden
50
+ Maintainers section. A new public Markdown page that
51
+ matches no section, matches more than one section, or has a duplicate route
52
+ fails the site build. Alias sources are excluded from hosted navigation, and
53
+ stale overrides or aliases fail the release gate.
54
+
55
+ The installed CLI exposes the same machine-readable value as `@pulse-compute/cli/documentation-site.json`, and the hosted build emits it as `public-site-manifest.json`. The editorial manifest owns copy and composition, not release identity or provider contracts. The homepage may choose which parts of the product story deserve emphasis, while version, channel, package, and provider facts remain release-owned.
56
+
57
+ ## Shared presentation layer
58
+
59
+ The homepage and documentation shell load the same exact-version assets:
60
+
61
+ - `tokens.css` — colors, typography, spacing, radii, shadows, content widths, breakpoints, and motion values;
62
+ - `syntax-dark.css` — the vendored Starry Night dark syntax theme;
63
+ - `site.css` — reusable header, buttons, terminal, content, navigation, search, table-of-contents, and responsive layouts;
64
+ - `site.js` — search, version selection, mobile navigation, code copying, and table-of-contents state;
65
+ - `network-field.js` — the release-local decorative canvas animation used by the homepage;
66
+ - `favicon.svg` — the Pulse mark.
67
+
68
+ Fenced code is highlighted during site generation by `scripts/highlight-code-blocks.mjs` with `@wooorm/starry-night`. The generated HTML contains token spans and uses release-local CSS; no browser highlighter, CDN stylesheet, or runtime grammar download is required. Unknown fence languages remain safely escaped and readable.
69
+
70
+ The source assets live under `scripts/documentation-site/`. The builder copies them into `v<version>/assets/`; both the root homepage and exact documentation use those release-local copies. Historical exact releases therefore retain the presentation they shipped with instead of inheriting future root CSS or JavaScript.
71
+
72
+ Style refinements should usually start with tokens or a shared component. Avoid page-specific inline CSS and avoid duplicating a component between homepage and documentation templates.
73
+
74
+ ## Homepage generation
75
+
76
+ The public base path, `/`, is a product homepage rather than a redirect. It is generated from:
77
+
78
+ - product positioning, the Router example, and homepage sections in the editorial manifest;
79
+ - candidate display information in the release manifest;
80
+ - the quick-start commands;
81
+ - a checked `pulse inspect` fixture;
82
+ - named routes resolved through the document map.
83
+
84
+ The current story leads with the application rather than the compiler: a
85
+ minimal hero, a primary Router example, a secondary quick-start strip, a
86
+ gradual path toward Native execution, practical containment principles, a
87
+ collapsed compiler inspection proof, and the explicit Beta scope.
88
+ Package inventories, target matrices, and full references remain in
89
+ documentation.
90
+
91
+ The hero Pulse field is deterministic and dependency-free. It restores the earlier restrained visual treatment: a dense, low-opacity network with sparse travelling pulses and no embedded compiler labels. It pauses while offscreen or while the document is hidden, offers a visible pause/resume control, caps device-pixel ratio, and honors `prefers-reduced-motion`. When reduced motion is requested, the decorative canvas and motion control are not started; the hero copy remains complete without them. The animation is decorative; all meaning remains in the surrounding copy.
92
+
93
+ The Router example follows the hero as the primary product proof. The install commands then live in a separate full-width quick-start card so long package names remain readable without competing with the application model.
94
+
95
+ ## Documentation shell
96
+
97
+ Each exact-version page receives generated:
98
+
99
+ - product header, release selector, and release-local search;
100
+ - breadcrumbs;
101
+ - grouped and ordered left navigation;
102
+ - mobile off-canvas navigation that does not precede article content;
103
+ - an “On this page” list from level-two and level-three headings;
104
+ - previous/next links from the same navigation order;
105
+ - owner, status, review date, and canonical source metadata;
106
+ - a shared footer and exact-version assets.
107
+
108
+ The Markdown renderer folds an explicit anchor immediately before a heading into that heading ID. This preserves generated diagnostic and environment anchors while preventing duplicate HTML IDs.
109
+
110
+ ## Build and inspect
111
+
112
+ ```bash
113
+ pnpm docs:sync
114
+ pnpm docs:site
115
+ pnpm docs:site:check
116
+ node scripts/documentation-release.cjs
117
+ ```
118
+
119
+ `pnpm docs:site` writes `.pulse-docs-site/`. `docs:site:check` builds into a temporary directory and validates the complete route graph.
120
+
121
+ For normal local development, use the preview adapter instead of manually reproducing the production mount:
122
+
123
+ ```bash
124
+ pnpm docs:preview
125
+ ```
126
+
127
+ The command refreshes generated documentation, builds directly into `.pulse-docs-preview/`, serves it over HTTP, and prints `http://127.0.0.1:4173/`. Production canonical metadata remains HTTPS and byte-identical; localhost changes only the transport used to inspect the artifact. Useful variants include:
128
+
129
+ ```bash
130
+ pnpm docs:preview -- --port 8080
131
+ pnpm docs:preview -- --host 0.0.0.0
132
+ pnpm docs:preview -- --open
133
+ pnpm docs:preview -- --watch
134
+ pnpm docs:preview -- --no-build
135
+ pnpm docs:preview -- --smoke
136
+ ```
137
+
138
+ `--smoke` uses an ephemeral port, verifies the root-mounted homepage, version root, search index, shared assets, the isolated compatibility fixture, output-marker isolation, and the branded 404, then exits. When `--preview-root` is supplied explicitly, the smoke artifact is retained for inspection; otherwise its temporary output is removed.
139
+
140
+ Preview generation writes `.pulse-docs-preview-root.json` at the selected output root. A populated custom directory without that ownership marker is never replaced, symlinked roots are rejected, and `--no-build` serves only a marker-owned artifact with a complete site manifest. These checks keep the convenience command from becoming a general recursive-delete surface.
141
+
142
+ ## Release gates
143
+
144
+ Public-site validation rejects:
145
+
146
+ - stale or invalid public-site manifests;
147
+ - missing named document sources or actions;
148
+ - unclassified, multiply classified, or duplicate public routes;
149
+ - missing shared assets or required no-JavaScript fallbacks;
150
+ - handwritten homepage release facts that disagree with canonical catalogs;
151
+ - missing homepage sections, the Router example, motion controls, quick-start commands, or inspect fixtures;
152
+ - duplicate HTML IDs, broken base-path routes, or missing anchors;
153
+ - a root homepage that regresses to a redirect;
154
+ - documentation pages without search, version selection, mobile navigation, breadcrumbs, table of contents, or previous/next structure;
155
+ - exact pages that depend on mutable root presentation assets;
156
+ - archived versions that no longer satisfy their own version manifest.
157
+
158
+ The generated site is a release artifact. Edit the manifests, Markdown, catalogs, and shared source assets; never hand-edit `.pulse-docs-site/` or a published exact-version subtree.