@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.
- package/API.md +572 -0
- package/CHANGELOG.md +71 -0
- package/README.md +71 -1
- package/bin/pulse.js +15 -0
- package/bin/pulsewasm-extract.js +22 -0
- package/cli-spec.json +575 -0
- package/completions/_pulse +106 -0
- package/completions/pulse.bash +31 -0
- package/completions/pulse.fish +76 -0
- package/docs/README.md +77 -0
- package/docs/architecture/current-contracts.md +470 -0
- package/docs/architecture/overview.md +93 -0
- package/docs/architecture/vision.md +515 -0
- package/docs/concepts/bodies.md +186 -0
- package/docs/concepts/compilation-and-lowering.md +496 -0
- package/docs/concepts/contracts-and-providers.md +158 -0
- package/docs/concepts/effects-and-continuations.md +300 -0
- package/docs/concepts/entities-and-adapters.md +71 -0
- package/docs/concepts/package-owned-lowering.md +175 -0
- package/docs/concepts/targets-and-hosts.md +70 -0
- package/docs/contributing/README.md +38 -0
- package/docs/contributing/adding-core-provider.md +315 -0
- package/docs/contributing/adding-first-party-lowerer.md +327 -0
- package/docs/contributing/entities-lowering.md +91 -0
- package/docs/contributing/package-lowerer-contract.md +383 -0
- package/docs/contributing/pulse-aware-packages.md +149 -0
- package/docs/examples.md +112 -0
- package/docs/fixtures/inspect-fetch-composition.selected.json +181 -0
- package/docs/getting-started.md +128 -0
- package/docs/guides/compatibility-imports.md +60 -0
- package/docs/guides/deploying-fastly.md +188 -0
- package/docs/guides/deploying-node.md +143 -0
- package/docs/guides/events.md +233 -0
- package/docs/guides/fastly-capabilities.md +153 -0
- package/docs/guides/fetching-and-composition.md +101 -0
- package/docs/guides/grip.md +94 -0
- package/docs/guides/json-schemas.md +233 -0
- package/docs/guides/migrating-from-express.md +192 -0
- package/docs/guides/project-lifecycle.md +143 -0
- package/docs/guides/routing.md +202 -0
- package/docs/guides/troubleshooting.md +47 -0
- package/docs/maintainers/README.md +60 -0
- package/docs/maintainers/codex-maintainer.md +71 -0
- package/docs/maintainers/documentation-deployment.md +147 -0
- package/docs/maintainers/documentation-system.md +58 -0
- package/docs/maintainers/documentation-versioning.md +65 -0
- package/docs/maintainers/maintainer-charter.md +100 -0
- package/docs/maintainers/maintenance-policy.json +809 -0
- package/docs/maintainers/maintenance-policy.md +124 -0
- package/docs/maintainers/npm-publishing.md +154 -0
- package/docs/maintainers/plugin-readiness.json +19 -0
- package/docs/maintainers/plugin-readiness.md +31 -0
- package/docs/maintainers/public-site.md +158 -0
- package/docs/maintainers/release-acceptance.md +293 -0
- package/docs/maintainers/release-manifest.md +89 -0
- package/docs/maintainers/repository-setup.md +145 -0
- package/docs/maintainers/scope-policy.md +105 -0
- package/docs/maintainers/support-and-triage.md +74 -0
- package/docs/maintainers/testing.md +334 -0
- package/docs/packages/README.md +60 -0
- package/docs/packages/assets.md +85 -0
- package/docs/packages/cli.md +190 -0
- package/docs/packages/crypto.md +78 -0
- package/docs/packages/entities.md +129 -0
- package/docs/packages/grip.md +82 -0
- package/docs/packages/implementation-packages.md +122 -0
- package/docs/packages/jwt.md +55 -0
- package/docs/packages/provider-fastly.md +243 -0
- package/docs/packages/pulse.md +159 -0
- package/docs/packages/runtime.md +265 -0
- package/docs/packages/s3.md +101 -0
- package/docs/preview-scope.md +142 -0
- package/docs/reference/README.md +33 -0
- package/docs/reference/cli-spec.json +575 -0
- package/docs/reference/cli.md +457 -0
- package/docs/reference/compatibility-matrix.md +169 -0
- package/docs/reference/diagnostics.md +1872 -0
- package/docs/reference/documentation-versions.json +22 -0
- package/docs/reference/environment.md +347 -0
- package/docs/reference/handler-authoring.md +264 -0
- package/docs/reference/project-config.md +582 -0
- package/docs/reference/project-config.schema.json +981 -0
- package/docs/reference/release-manifest.json +441 -0
- package/docs/reference/shell-completion.md +23 -0
- package/documentation-site.json +668 -0
- package/documentation-versions.json +22 -0
- package/examples/01-hello-json/.pulse/.gitignore +3 -0
- package/examples/01-hello-json/.pulse/config.ts +16 -0
- package/examples/01-hello-json/README.md +119 -0
- package/examples/01-hello-json/package.json +20 -0
- package/examples/01-hello-json/src/index.ts +9 -0
- package/examples/01-hello-json/tests/pulse.harness.ts +22 -0
- package/examples/01-hello-json/tsconfig.json +14 -0
- package/examples/02-request-schema/.pulse/.gitignore +3 -0
- package/examples/02-request-schema/.pulse/config.ts +17 -0
- package/examples/02-request-schema/README.md +145 -0
- package/examples/02-request-schema/package.json +20 -0
- package/examples/02-request-schema/src/index.ts +18 -0
- package/examples/02-request-schema/src/schemas.ts +20 -0
- package/examples/02-request-schema/tests/pulse.harness.ts +37 -0
- package/examples/02-request-schema/tsconfig.json +14 -0
- package/examples/03-fetch-composition/.pulse/.gitignore +3 -0
- package/examples/03-fetch-composition/.pulse/config.ts +31 -0
- package/examples/03-fetch-composition/README.md +210 -0
- package/examples/03-fetch-composition/package.json +20 -0
- package/examples/03-fetch-composition/src/index.ts +60 -0
- package/examples/03-fetch-composition/tests/pulse.harness.ts +47 -0
- package/examples/03-fetch-composition/tsconfig.json +14 -0
- package/examples/05-fastly-capabilities/.pulse/.gitignore +3 -0
- package/examples/05-fastly-capabilities/.pulse/config.ts +57 -0
- package/examples/05-fastly-capabilities/README.md +257 -0
- package/examples/05-fastly-capabilities/package.json +22 -0
- package/examples/05-fastly-capabilities/src/index.ts +55 -0
- package/examples/05-fastly-capabilities/tests/pulse.harness.ts +66 -0
- package/examples/05-fastly-capabilities/tsconfig.json +14 -0
- package/examples/07-opaque-proxy/.pulse/.gitignore +3 -0
- package/examples/07-opaque-proxy/.pulse/config.ts +38 -0
- package/examples/07-opaque-proxy/README.md +150 -0
- package/examples/07-opaque-proxy/package.json +21 -0
- package/examples/07-opaque-proxy/src/index.ts +9 -0
- package/examples/07-opaque-proxy/tests/pulse.harness.ts +25 -0
- package/examples/07-opaque-proxy/tsconfig.json +14 -0
- package/examples/09-router-lowering/.pulse/.gitignore +3 -0
- package/examples/09-router-lowering/.pulse/config.ts +22 -0
- package/examples/09-router-lowering/README.md +287 -0
- package/examples/09-router-lowering/package.json +22 -0
- package/examples/09-router-lowering/src/index.ts +65 -0
- package/examples/09-router-lowering/tests/pulse.harness.ts +91 -0
- package/examples/09-router-lowering/tsconfig.json +14 -0
- package/examples/10-entities-tools/.pulse/.gitignore +4 -0
- package/examples/10-entities-tools/.pulse/config.ts +23 -0
- package/examples/10-entities-tools/README.md +165 -0
- package/examples/10-entities-tools/package.json +21 -0
- package/examples/10-entities-tools/src/handlers.ts +15 -0
- package/examples/10-entities-tools/src/index.ts +31 -0
- package/examples/10-entities-tools/src/schemas.ts +18 -0
- package/examples/10-entities-tools/tests/pulse.harness.ts +40 -0
- package/examples/10-entities-tools/tools-facade.cjs +158 -0
- package/examples/10-entities-tools/tsconfig.json +14 -0
- package/examples/11-events/.pulse/.gitignore +4 -0
- package/examples/11-events/.pulse/config.ts +24 -0
- package/examples/11-events/README.md +194 -0
- package/examples/11-events/package.json +20 -0
- package/examples/11-events/src/index.ts +27 -0
- package/examples/11-events/src/schemas.ts +19 -0
- package/examples/11-events/tests/pulse.harness.ts +34 -0
- package/examples/11-events/tsconfig.json +15 -0
- package/examples/12-mcp-proxy/.pulse/.gitignore +3 -0
- package/examples/12-mcp-proxy/.pulse/config.ts +25 -0
- package/examples/12-mcp-proxy/README.md +149 -0
- package/examples/12-mcp-proxy/package.json +20 -0
- package/examples/12-mcp-proxy/src/index.ts +17 -0
- package/examples/12-mcp-proxy/tests/pulse.harness.ts +29 -0
- package/examples/12-mcp-proxy/tsconfig.json +14 -0
- package/examples/13-jwt-es256/.pulse/config.ts +19 -0
- package/examples/13-jwt-es256/README.md +195 -0
- package/examples/13-jwt-es256/package.json +21 -0
- package/examples/13-jwt-es256/src/index.ts +21 -0
- package/examples/13-jwt-es256/tests/pulse.harness.ts +54 -0
- package/examples/13-jwt-es256/tsconfig.json +14 -0
- package/examples/README.md +36 -0
- package/package.json +66 -6
- package/project-config.schema.json +981 -0
- package/release-manifest.json +441 -0
- package/src/command-spec.js +279 -0
- package/src/completion.js +113 -0
- package/src/diagnostics.js +350 -0
- package/src/documentation.js +45 -0
- package/src/index.d.ts +133 -0
- package/src/index.js +15 -0
- package/src/internal/command-executor.d.ts +29 -0
- package/src/internal/command-executor.js +143 -0
- package/src/internal/command-plan.d.ts +9 -0
- package/src/internal/command-plan.js +73 -0
- package/src/internal/command-reporter.d.ts +15 -0
- package/src/internal/command-reporter.js +133 -0
- package/src/internal/command-request.d.ts +35 -0
- package/src/internal/command-request.js +154 -0
- package/src/internal/node-http.js +54 -0
- package/src/internal/project-context.d.ts +66 -0
- package/src/internal/project-context.js +175 -0
- package/src/project-config-reference.js +4 -0
- package/src/project-config-schema.d.ts +23 -0
- package/src/project-config-schema.js +271 -0
- package/src/project-config.js +724 -0
- package/src/project-execution.js +2946 -0
- package/src/provider-drivers.js +3 -0
- package/src/target-support.js +3 -0
- package/src/typescript-module-loader.js +269 -0
- package/src/workflow.js +78 -0
- 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.
|