rcf-lite 0.13.0 → 0.14.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/CHANGELOG.md +29 -1
- package/bin/rcf.js +3 -1
- package/blueprints/application-api-rest/docs/topics.md +1 -1
- package/blueprints/application-spa/README.md +3 -3
- package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +7 -7
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +7 -7
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +8 -8
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +8 -8
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +8 -8
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +3 -3
- package/blueprints/application-spa/docs/topics.md +1 -1
- package/blueprints/delivery-ci-workflows/CHANGELOG.md +39 -0
- package/blueprints/delivery-ci-workflows/README.md +57 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/default-branch-checks.yml +55 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/pull-request-checks.yml +65 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/release.yml +71 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/github-actions/scheduled-audit.yml +61 -0
- package/blueprints/delivery-ci-workflows/assets/ci-provider-examples/notes.md +61 -0
- package/blueprints/{ci-pipeline → delivery-ci-workflows}/assets/report-samples/per-gate.json +2 -1
- package/blueprints/delivery-ci-workflows/blueprint.json +87 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-701-delivery-ci-workflows-ci-gates.json +30 -0
- package/blueprints/{ci-pipeline/contributions/adrs/adr-702-ci-pipeline-strict-coverage-gate.json → delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/adrs/adr-703-ci-pipeline-node-only-runner.json → delivery-ci-workflows/contributions/adrs/adr-703-delivery-ci-workflows-node-only-runner.json} +1 -1
- package/blueprints/{ci-pipeline/contributions/adrs/adr-704-ci-pipeline-report-shape.json → delivery-ci-workflows/contributions/adrs/adr-704-delivery-ci-workflows-report-shape.json} +3 -3
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-705-delivery-ci-workflows-elicitation-surface.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-706-delivery-ci-workflows-branch-model-defaults.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-707-delivery-ci-workflows-release-workflow-shape.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-708-delivery-ci-workflows-provider-hint-shape.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-709-delivery-ci-workflows-release-artefacts.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-710-delivery-ci-workflows-scheduled-audit.json +25 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-001.json +18 -0
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-002.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-002.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-003.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-003.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-004.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-005.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-005.json} +4 -4
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-006.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-006.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-007.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-007.json} +2 -2
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-008.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-008.json} +2 -2
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-009.json +18 -0
- package/blueprints/{ci-pipeline/contributions/requirements/ci-pipeline-req-010.json → delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-010.json} +2 -2
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-011.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-012.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-013.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-014.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-015.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-016.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-017.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-018.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-019.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-020.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-021.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-022.json +18 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-023.json +18 -0
- package/blueprints/{ci-pipeline/contributions/tacs/tac-701-ci-pipeline-gate-runner.json → delivery-ci-workflows/contributions/tacs/tac-701-delivery-ci-workflows-gate-runner.json} +3 -3
- package/blueprints/{ci-pipeline/contributions/tacs/tac-702-ci-pipeline-gate-report.json → delivery-ci-workflows/contributions/tacs/tac-702-delivery-ci-workflows-gate-report.json} +1 -1
- package/blueprints/{ci-pipeline/contributions/tacs/tac-703-ci-pipeline-aggregate-report.json → delivery-ci-workflows/contributions/tacs/tac-703-delivery-ci-workflows-aggregate-report.json} +2 -2
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-704-delivery-ci-workflows-workflow-materialiser.json +64 -0
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-705-delivery-ci-workflows-release-workflow.json +51 -0
- package/blueprints/delivery-ci-workflows/contributions/tacs/tac-706-delivery-ci-workflows-scheduled-audit.json +38 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6101.json +37 -0
- package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6102.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6102.json} +3 -3
- package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6103.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6103.json} +4 -4
- package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6104.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6104.json} +4 -4
- package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6105.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6105.json} +6 -6
- package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6106.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6106.json} +3 -3
- package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6107.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6107.json} +5 -5
- package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6108.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6108.json} +4 -4
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6109.json +36 -0
- package/blueprints/{ci-pipeline/contributions/user-stories/ci-pipeline-us-6110.json → delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6110.json} +3 -3
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6111.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6112.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6113.json +36 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6114.json +46 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6115.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6116.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6117.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6118.json +37 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6119.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6120.json +28 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6121.json +46 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6122.json +46 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6123.json +37 -0
- package/blueprints/delivery-ci-workflows/docs/topics.md +61 -0
- package/blueprints/delivery-ci-workflows/guide/delivery-ci-workflows.md +136 -0
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +3 -3
- package/blueprints/email-smtp-resend/docs/topics.md +1 -1
- package/blueprints/observability-essentials/README.md +2 -2
- package/blueprints/observability-essentials/docs/topics.md +5 -5
- package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
- package/blueprints/persistence-data-d1/README.md +2 -2
- package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +1 -1
- package/blueprints/persistence-data-d1/contributions/tacs/tac-1403-persistence-data-d1-deploy-gate.json +1 -1
- package/blueprints/persistence-data-d1/docs/topics.md +2 -2
- package/blueprints/persistence-data-d1/guide/persistence-data-d1.md +1 -1
- package/blueprints/persistence-data-sqlite/README.md +1 -1
- package/blueprints/persistence-data-sqlite/docs/topics.md +1 -1
- package/blueprints/security-auth-clerk/README.md +5 -3
- package/blueprints/security-auth-clerk/assets/middleware/workers-fetch-shape.md +123 -0
- package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +51 -0
- package/blueprints/security-auth-clerk/blueprint.json +1 -1
- package/blueprints/security-auth-clerk/docs/topics.md +2 -2
- package/blueprints/security-auth-clerk/guide/security-auth-clerk.md +9 -0
- package/blueprints/security-auth-keycloak/docs/topics.md +2 -2
- package/blueprints/security-auth-magic-link/README.md +1 -1
- package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
- package/blueprints/security-auth-oauth2/README.md +1 -1
- package/blueprints/security-auth-oauth2/docs/topics.md +2 -2
- package/blueprints/security-secrets-management/README.md +1 -1
- package/blueprints/security-secrets-management/docs/topics.md +3 -3
- package/guidance/build-cycle-playbook.md +2 -2
- package/guidance/document-model.md +1 -1
- package/guidance/harness-template.md +13 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +13 -0
- package/package.json +5 -2
- package/rcf/adrs/adr-001.json +1 -1
- package/rcf/adrs/adr-009.json +1 -1
- package/rcf/build-sequence.json +1 -1
- package/rcf/manifest.json +2 -2
- package/rcf/prd.json +2 -2
- package/releases/releases.yaml +116 -0
- package/src/blueprint/apply.js +51 -13
- package/src/blueprint/index.js +12 -0
- package/src/blueprint/library-loader.js +271 -0
- package/src/blueprint/library-registry.js +341 -0
- package/src/blueprint/list.js +38 -4
- package/src/blueprint/shelf-resolver.js +144 -31
- package/src/cli/blueprint-library.js +419 -0
- package/src/cli/blueprint.js +46 -9
- package/src/cli/guidance.js +1 -1
- package/src/cli/help.js +27 -1
- package/src/cli/version.js +673 -0
- package/src/cli/view.js +282 -1
- package/src/server/index.js +3 -0
- package/src/server/routes.js +15 -1
- package/src/server/scope-endpoint.js +105 -0
- package/src/view/live-client.js +253 -6
- package/src/view/scope.js +231 -0
- package/src/view/style.css +42 -0
- package/blueprints/ci-pipeline/README.md +0 -49
- package/blueprints/ci-pipeline/assets/ci-provider-examples/github-actions.yml +0 -61
- package/blueprints/ci-pipeline/assets/ci-provider-examples/notes.md +0 -50
- package/blueprints/ci-pipeline/blueprint.json +0 -46
- package/blueprints/ci-pipeline/contributions/adrs/adr-701-ci-pipeline-ci-gates.json +0 -25
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-001.json +0 -18
- package/blueprints/ci-pipeline/contributions/requirements/ci-pipeline-req-009.json +0 -18
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6101.json +0 -37
- package/blueprints/ci-pipeline/contributions/user-stories/ci-pipeline-us-6109.json +0 -36
- package/blueprints/ci-pipeline/docs/topics.md +0 -49
- package/blueprints/ci-pipeline/guide/ci-pipeline.md +0 -79
- package/rcf/.identity/profile.md +0 -37
- package/rcf/knowledge/INDEX.md +0 -12
- package/rcf/knowledge/README.md +0 -41
- package/rcf/knowledge/docs/.gitkeep +0 -0
- package/rcf/knowledge/notes/.gitkeep +0 -0
- /package/blueprints/{ci-pipeline → delivery-ci-workflows}/assets/report-samples/pipeline.json +0 -0
|
@@ -26,7 +26,7 @@ One page per document type, the reference rule that keeps the tree drift-proof,
|
|
|
26
26
|
|
|
27
27
|
**TC (Test Case).** One test: which AC it verifies, where the executable test lives (its test pointer), and its status.
|
|
28
28
|
|
|
29
|
-
**CN (Code Node).** The spec-to-code bridge: a working-tree source path, optionally `#symbol`-suffixed, that implements one or more acceptance criteria (`implementsAcIds`, which may be empty - an orphan CN is a legitimate state for utilities and glue code). `rcf define validate` checks every CN's path/symbol against the working tree, so a rename or deletion that leaves the pointer dangling is caught the same way a broken spec-side reference is. Author CNs during Stage 2 of the build cycle (see below), not after: `rcf build mark <fbs-id> complete` refuses when an in-scope acceptance criterion has none. Full detail, including the honest limits, is `docs/code-nodes.md` in the rcf-
|
|
29
|
+
**CN (Code Node).** The spec-to-code bridge: a working-tree source path, optionally `#symbol`-suffixed, that implements one or more acceptance criteria (`implementsAcIds`, which may be empty - an orphan CN is a legitimate state for utilities and glue code). `rcf define validate` checks every CN's path/symbol against the working tree, so a rename or deletion that leaves the pointer dangling is caught the same way a broken spec-side reference is. Author CNs during Stage 2 of the build cycle (see below), not after: `rcf build mark <fbs-id> complete` refuses when an in-scope acceptance criterion has none. Full detail, including the honest limits, is `docs/code-nodes.md` in the rcf-lite repo.
|
|
30
30
|
|
|
31
31
|
## Edges live on the child
|
|
32
32
|
|
|
@@ -222,6 +222,19 @@ ask for. A failure the operator has to point out is a failure you did
|
|
|
222
222
|
not check for. The depth for each stage's self-check lives in the
|
|
223
223
|
build-cycle playbook.
|
|
224
224
|
|
|
225
|
+
### RULE 14: Check freshness at session start; offer, never install.
|
|
226
|
+
|
|
227
|
+
At the start of a new session on this project, run `rcf version --check`
|
|
228
|
+
(one call, silent on network trouble) and note the result. If a newer
|
|
229
|
+
release is available, tell the operator in one line what changed and
|
|
230
|
+
OFFER the upgrade. The exact command to run depends on how rcf-lite is
|
|
231
|
+
installed here (global npm, per-repo dep, npx pin); propose the command
|
|
232
|
+
that matches this repo's setup and wait for the operator's yes before
|
|
233
|
+
running it. If the check reports `status: "unknown"` (offline, cache
|
|
234
|
+
miss, feed unreachable) say nothing to the operator; freshness is a
|
|
235
|
+
convenience, not a gate. Never run the upgrade without the operator's
|
|
236
|
+
explicit go.
|
|
237
|
+
|
|
225
238
|
### Session start
|
|
226
239
|
|
|
227
240
|
Run `rcf define validate`. A broken tree is fixed or reported before anything
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
a36dfe0d47c57bafa2ace121e7390fac95c7fff70ee362e864adf75c07be190a
|
|
@@ -209,6 +209,19 @@ ask for. A failure the operator has to point out is a failure you did
|
|
|
209
209
|
not check for. The depth for each stage's self-check lives in the
|
|
210
210
|
build-cycle playbook.
|
|
211
211
|
|
|
212
|
+
### RULE 14: Check freshness at session start; offer, never install.
|
|
213
|
+
|
|
214
|
+
At the start of a new session on this project, run `rcf version --check`
|
|
215
|
+
(one call, silent on network trouble) and note the result. If a newer
|
|
216
|
+
release is available, tell the operator in one line what changed and
|
|
217
|
+
OFFER the upgrade. The exact command to run depends on how rcf-lite is
|
|
218
|
+
installed here (global npm, per-repo dep, npx pin); propose the command
|
|
219
|
+
that matches this repo's setup and wait for the operator's yes before
|
|
220
|
+
running it. If the check reports `status: "unknown"` (offline, cache
|
|
221
|
+
miss, feed unreachable) say nothing to the operator; freshness is a
|
|
222
|
+
convenience, not a gate. Never run the upgrade without the operator's
|
|
223
|
+
explicit go.
|
|
224
|
+
|
|
212
225
|
### Session start
|
|
213
226
|
|
|
214
227
|
Run `rcf define validate`. A broken tree is fixed or reported before anything
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rcf-lite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "One-install tooling for the Requirements Confidence Framework (RCF): the unified `rcf` CLI grouped into the five RCF tool groups (discover, define, build, verify, audit) plus a small core set (init, doctor, guidance, mcp), an MCP server, the live tree viewer and the fresh-context adversarial ship-gate verifier. Consumes @stravica-ai/rcf-schemas.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"src",
|
|
28
28
|
"guidance",
|
|
29
29
|
"rcf",
|
|
30
|
+
"releases",
|
|
30
31
|
"fixtures",
|
|
31
32
|
"blueprints",
|
|
32
33
|
"scripts/preinstall-node-check.mjs",
|
|
@@ -43,10 +44,11 @@
|
|
|
43
44
|
"vendor": "node scripts/vendor-mermaid.mjs",
|
|
44
45
|
"build:managed": "node scripts/gen-managed-artefacts.mjs",
|
|
45
46
|
"canary:register": "node scripts/canary-register.mjs",
|
|
47
|
+
"validate:releases": "node scripts/validate-releases.mjs",
|
|
46
48
|
"stage:blueprints": "node scripts/stage-blueprint-shelf.mjs",
|
|
47
49
|
"preinstall": "node scripts/preinstall-node-check.mjs",
|
|
48
50
|
"prepack": "node scripts/stage-blueprint-shelf.mjs",
|
|
49
|
-
"prepublishOnly": "node scripts/gen-managed-artefacts.mjs && node scripts/stage-blueprint-shelf.mjs",
|
|
51
|
+
"prepublishOnly": "node scripts/gen-managed-artefacts.mjs && node scripts/stage-blueprint-shelf.mjs && node scripts/validate-releases.mjs",
|
|
50
52
|
"rcf": "node bin/rcf.js"
|
|
51
53
|
},
|
|
52
54
|
"repository": {
|
|
@@ -76,6 +78,7 @@
|
|
|
76
78
|
},
|
|
77
79
|
"devDependencies": {
|
|
78
80
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
81
|
+
"js-yaml": "^4.1.0",
|
|
79
82
|
"mermaid": "11.6.0"
|
|
80
83
|
}
|
|
81
84
|
}
|
package/rcf/adrs/adr-001.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"version": "0.1.0",
|
|
6
6
|
"status": "accepted",
|
|
7
7
|
"title": "Local filesystem is the single source of truth",
|
|
8
|
-
"context": "RCF
|
|
8
|
+
"context": "RCF Lite must guarantee that a project's RCF documents live in the source repository, beside the code. v1 tooling operated over the GitHub API rather than the local repo, which broke the in-repository differentiator and tied the tool to a network surface.",
|
|
9
9
|
"decision": "Every read and write targets the local rcf tree directly. No external service, cache or database mirrors the documents. The CLI, the MCP server and the build loop all reach the filesystem only through the document store.",
|
|
10
10
|
"consequences": "The tool works offline and stays harness-agnostic. There is no sync problem and no second source to drift. The cost is that any multi-user or hosted scenario is out of scope by construction, which matches the product boundaries.",
|
|
11
11
|
"alternativesConsidered": [
|
package/rcf/adrs/adr-009.json
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"name": "Build an independent-gate subsystem now",
|
|
15
|
-
"summary": "Solve the independent-verification problem inside rcf-
|
|
15
|
+
"summary": "Solve the independent-verification problem inside rcf-lite immediately.",
|
|
16
16
|
"reasonNotChosen": "That is a separate product being scoped at HQ; duplicating it here pre-empts a repo reshape and over-builds the lite tier. The Tier-1 scope is guidance, not a gate."
|
|
17
17
|
}
|
|
18
18
|
],
|
package/rcf/build-sequence.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"status": "draft",
|
|
6
|
-
"title": "RCF
|
|
6
|
+
"title": "RCF Lite initial delivery",
|
|
7
7
|
"buildPhilosophy": "Dependency-first. Build the document store, then the read-only view surface, then mutating CRUD, then the query layer, then the build loop, then the MCP surface over everything below. Each layer is usable on its own before the next is added.",
|
|
8
8
|
"generationStrategy": "dependencyFirst",
|
|
9
9
|
"createdAt": "2026-06-25T00:00:00Z",
|
package/rcf/manifest.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "2.0.0",
|
|
3
|
-
"projectName": "RCF
|
|
4
|
-
"description": "RCF tree for the RCF
|
|
3
|
+
"projectName": "RCF Lite",
|
|
4
|
+
"description": "RCF tree for the RCF Lite product. Manifest declares the three root documents; every other document is discovered by walking from the roots.",
|
|
5
5
|
"prd": {
|
|
6
6
|
"id": "PRD-001",
|
|
7
7
|
"path": "prd.json"
|
package/rcf/prd.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"prdId": "PRD-001",
|
|
3
|
-
"productName": "RCF
|
|
3
|
+
"productName": "RCF Lite",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"status": "draft",
|
|
6
|
-
"executiveSummary": "RCF
|
|
6
|
+
"executiveSummary": "RCF Lite is the tooling product of the RCF suite. It runs the full Requirements Confidence Framework over a project whose RCF documents live in the source repository, alongside the code. It gives a non-engineering product owner deterministic create, read, update and delete operations on every RCF document type, a visual review surface, traceability and query, a build loop that turns build specifications into implementation prompts, and a local MCP surface that exposes all of this to AI tooling.",
|
|
7
7
|
"problemStatement": "Power vibe-coders build real applications without engineering teams. They cannot read code, so they cannot judge whether what an AI tool produces is trustworthy. The full RCF chain makes output trustworthy without reading code, but authoring that chain by hand is the very effort these users lack the time and discipline for. There is no tool that runs the full RCF method over in-repository documents and surfaces it through structured, deterministic operations.",
|
|
8
8
|
"targetUsers": [
|
|
9
9
|
"Power vibe-coders: product owners, founders and business voices building applications without engineering teams",
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# rcf-lite release feed source of truth.
|
|
2
|
+
#
|
|
3
|
+
# This file is the single source that the docs site (stravica.ai) reads
|
|
4
|
+
# at build time to publish the machine-readable feed at
|
|
5
|
+
# https://stravica.ai/docs/rcf/releases.json
|
|
6
|
+
# and that the rcf-lite package's prepublishOnly step validates against
|
|
7
|
+
# `package.json:version` so a release cannot ship without its own entry.
|
|
8
|
+
#
|
|
9
|
+
# Contract lives in
|
|
10
|
+
# projects/rcf-lite-wsd/specs/update-awareness-spec-2026-08-28.md
|
|
11
|
+
# section 1 (ratified 2026-08-30).
|
|
12
|
+
#
|
|
13
|
+
# Editing rules at release time:
|
|
14
|
+
# 1. Add the new release as the top entry under `releases:` (newest
|
|
15
|
+
# first).
|
|
16
|
+
# 2. Update `latest:` to match the new top entry's `version`.
|
|
17
|
+
# 3. Keep `headlines[]` operator-facing: one to three sentences, plain
|
|
18
|
+
# language, sentence case, terminal period, no method vocabulary
|
|
19
|
+
# shortcuts.
|
|
20
|
+
# 4. Set `breaking: true` only when the release is a semver-breaking
|
|
21
|
+
# change per the pre-1.0 breaking-is-minor convention (see
|
|
22
|
+
# CHANGELOG.md preamble).
|
|
23
|
+
# 5. `minAgentAction` names the extra work the agent needs to do beyond
|
|
24
|
+
# running the install command. `null` means no extra action. The
|
|
25
|
+
# enumerated values are listed in the spec section 1.5:
|
|
26
|
+
# - rewrite-shell-invocations
|
|
27
|
+
# - rerun-init
|
|
28
|
+
# - regenerate-chain
|
|
29
|
+
# - schema-migration
|
|
30
|
+
# 6. `notesUrl` is optional. It currently points at the top of the
|
|
31
|
+
# human changelog; per-release deep links are a follow-up once the
|
|
32
|
+
# docs pipeline gives /docs/ headings stable anchor ids.
|
|
33
|
+
# 7. Do not delete or rewrite historical entries; the feed is append-only.
|
|
34
|
+
#
|
|
35
|
+
# Every published release under the `rcf-lite` npm name is listed here.
|
|
36
|
+
# The pre-rename history (packages published under
|
|
37
|
+
# `@stravica-ai/rcf-build-lite`, `@stravica-ai/rcf-lite-core`, and
|
|
38
|
+
# `@stravica-ai/rcf-verify-lite`) lives in CHANGELOG.md but is not part of
|
|
39
|
+
# this feed; the feed is scoped to what an operator can install today as
|
|
40
|
+
# `npm install rcf-lite`.
|
|
41
|
+
|
|
42
|
+
feedVersion: 1
|
|
43
|
+
latest: "0.14.0"
|
|
44
|
+
releases:
|
|
45
|
+
- version: "0.14.0"
|
|
46
|
+
date: "2026-08-31"
|
|
47
|
+
breaking: true
|
|
48
|
+
headlines:
|
|
49
|
+
- "The ci-pipeline blueprint is renamed to delivery-ci-workflows and gains a broader set of CI workflows and optional checks."
|
|
50
|
+
- "A new rcf version command reports the installed version, with --check comparing against the release feed."
|
|
51
|
+
- "Rerun rcf init to refresh the agent guidance block with the new session-start freshness check."
|
|
52
|
+
minAgentAction: "rerun-init"
|
|
53
|
+
notesUrl: "https://stravica.ai/docs/rcf/changelog/"
|
|
54
|
+
|
|
55
|
+
- version: "0.13.0"
|
|
56
|
+
date: "2026-08-31"
|
|
57
|
+
breaking: false
|
|
58
|
+
headlines:
|
|
59
|
+
- "The 14 first-party blueprints now ship inside the installed package, so any doc pointing at a blueprint slug works on a fresh install."
|
|
60
|
+
- "rcf define blueprint add resolves bare slugs and @stock slugs against the packaged shelf, matching how the docs write the commands."
|
|
61
|
+
- "Installing on Node earlier than 24 now refuses outright instead of silently resolving an old placeholder release."
|
|
62
|
+
minAgentAction: null
|
|
63
|
+
notesUrl: "https://stravica.ai/docs/rcf/changelog/"
|
|
64
|
+
|
|
65
|
+
- version: "0.12.0"
|
|
66
|
+
date: "2026-08-28"
|
|
67
|
+
breaking: true
|
|
68
|
+
headlines:
|
|
69
|
+
- "Tests that claim to pass or fail must now point at a real test file, enforced by the shared schema."
|
|
70
|
+
- "Tests marked pending or skipped no longer need a pointer, matching how in-progress coverage really looks."
|
|
71
|
+
minAgentAction: "schema-migration"
|
|
72
|
+
notesUrl: "https://stravica.ai/docs/rcf/changelog/"
|
|
73
|
+
|
|
74
|
+
- version: "0.11.0"
|
|
75
|
+
date: "2026-08-27"
|
|
76
|
+
breaking: false
|
|
77
|
+
headlines:
|
|
78
|
+
- "The shipped agent guidance gained three new rules for how the agent drives the method loop."
|
|
79
|
+
- "Re-run rcf init to refresh the managed block in your project's agent instructions file."
|
|
80
|
+
minAgentAction: "rerun-init"
|
|
81
|
+
notesUrl: "https://stravica.ai/docs/rcf/changelog/"
|
|
82
|
+
|
|
83
|
+
- version: "0.10.0"
|
|
84
|
+
date: "2026-08-26"
|
|
85
|
+
breaking: true
|
|
86
|
+
headlines:
|
|
87
|
+
- "The command-line interface is reorganised: every command now sits under one of five groups."
|
|
88
|
+
- "Old flat command forms fail with a message that names the new form."
|
|
89
|
+
minAgentAction: "rewrite-shell-invocations"
|
|
90
|
+
notesUrl: "https://stravica.ai/docs/rcf/changelog/"
|
|
91
|
+
|
|
92
|
+
- version: "0.9.0"
|
|
93
|
+
date: "2026-08-25"
|
|
94
|
+
breaking: false
|
|
95
|
+
headlines:
|
|
96
|
+
- "Blueprints landed: compose pre-built implementation patterns onto your project instead of inventing them from a blank page."
|
|
97
|
+
- "Six starter blueprints ship in the same release, covering web app, REST API, auth, persistence, CI pipeline and observability."
|
|
98
|
+
minAgentAction: null
|
|
99
|
+
notesUrl: "https://stravica.ai/docs/rcf/changelog/"
|
|
100
|
+
|
|
101
|
+
- version: "0.8.0"
|
|
102
|
+
date: "2026-08-12"
|
|
103
|
+
breaking: false
|
|
104
|
+
headlines:
|
|
105
|
+
- "A shared standards ruleset ships bundled with the package and now feeds refuse-first admissibility checks on the chain."
|
|
106
|
+
- "The verifier catches a subtle dishonesty: a test that is narrower in scope than the check it claims to prove."
|
|
107
|
+
minAgentAction: null
|
|
108
|
+
notesUrl: "https://stravica.ai/docs/rcf/changelog/"
|
|
109
|
+
|
|
110
|
+
- version: "0.7.1"
|
|
111
|
+
date: "2026-08-12"
|
|
112
|
+
breaking: false
|
|
113
|
+
headlines:
|
|
114
|
+
- "The first release under the unified rcf-lite name, bringing the previously separate tools together as one package on the public npm registry."
|
|
115
|
+
minAgentAction: null
|
|
116
|
+
notesUrl: "https://stravica.ai/docs/rcf/changelog/"
|
package/src/blueprint/apply.js
CHANGED
|
@@ -15,6 +15,7 @@ import { readFile } from 'node:fs/promises';
|
|
|
15
15
|
import { rcfError } from '../core/errors/index.js';
|
|
16
16
|
import { subdirFor } from '#core/store';
|
|
17
17
|
import { detectCrossBlueprintClaims, detectGlobalAdrConflicts } from './conflicts.js';
|
|
18
|
+
import { detectContributionsOutOfBand } from './library-registry.js';
|
|
18
19
|
import { loadBlueprint } from './loader.js';
|
|
19
20
|
import { updateManifest } from './manifest-writer.js';
|
|
20
21
|
import { stampId } from './namespace.js';
|
|
@@ -40,6 +41,19 @@ import { nextResolutionId } from './resolutions.js';
|
|
|
40
41
|
* string the operator can copy back. Defaults to `source` when omitted (so
|
|
41
42
|
* existing callers keep today's byte-for-byte behaviour).
|
|
42
43
|
* @param {string} [args.namespaceOverride] - non-default namespace slug
|
|
44
|
+
* @param {string} [args.effectiveSlug] - override for the blueprint's own slug
|
|
45
|
+
* when applied through an external-library qualified reference (spec §5.3):
|
|
46
|
+
* `<libraryPrefix>-<blueprintSlug>`. When set, this becomes BOTH the
|
|
47
|
+
* stamping namespace (so contributions inherit the library prefix) AND
|
|
48
|
+
* the value written into `manifest.blueprints[].slug` on the applied
|
|
49
|
+
* record, so `rcf define blueprint remove wsd-auth-oauth2` reads back
|
|
50
|
+
* cleanly. `namespaceOverride` still wins over `effectiveSlug` if both
|
|
51
|
+
* are set (operator explicitly chose a different namespace).
|
|
52
|
+
* @param {{ ac: { start: number, end: number }, suffixBlocks?: Array<{ kind: string, start: number, end: number }> }} [args.libraryBands]
|
|
53
|
+
* Declared bands from the resolved library. When set, every stamped
|
|
54
|
+
* contribution is band-gated before write; a contribution whose numeric
|
|
55
|
+
* portion falls outside the library's bands refuses at apply-time (spec
|
|
56
|
+
* §8.3, open question 9.9 ratified as "add both").
|
|
43
57
|
* @param {Array<{ topic: string, resolvedByAdrId: string }>} [args.resolveDeclarations]
|
|
44
58
|
* Operator-supplied conflict resolutions declared on the add
|
|
45
59
|
* itself. One entry per resolved topic. For each, the resolution
|
|
@@ -58,25 +72,38 @@ import { nextResolutionId } from './resolutions.js';
|
|
|
58
72
|
* prove the rollback runs. Never used in production.
|
|
59
73
|
* @returns {Promise<ApplyResult | import('../core/errors/index.js').RcfError>}
|
|
60
74
|
*/
|
|
61
|
-
export async function applyBlueprint({ projectRoot, tree, source, displaySource, namespaceOverride, resolveDeclarations, now = new Date(), dryRun = false, _copyFileForTest }) {
|
|
75
|
+
export async function applyBlueprint({ projectRoot, tree, source, displaySource, namespaceOverride, effectiveSlug, libraryBands, resolveDeclarations, now = new Date(), dryRun = false, _copyFileForTest }) {
|
|
62
76
|
const hintSource = typeof displaySource === 'string' && displaySource.length > 0 ? displaySource : source;
|
|
63
77
|
const blueprint = await loadBlueprint(source);
|
|
64
78
|
if (blueprint.kind) return blueprint; // RcfError
|
|
65
|
-
|
|
79
|
+
// Effective slug rewires the blueprint's identity under a library
|
|
80
|
+
// prefix (spec §5.3). It becomes both the stamping namespace and the
|
|
81
|
+
// slug written into `manifest.blueprints[].slug`. `namespaceOverride`
|
|
82
|
+
// still wins over `effectiveSlug` (operator's explicit --namespace on
|
|
83
|
+
// the CLI). When neither is set the blueprint's own slug applies.
|
|
84
|
+
const appliedSlug = typeof effectiveSlug === 'string' && effectiveSlug.length > 0
|
|
85
|
+
? effectiveSlug
|
|
86
|
+
: blueprint.slug;
|
|
87
|
+
const namespace = namespaceOverride ?? appliedSlug;
|
|
66
88
|
|
|
67
89
|
const applied = tree.manifest?.blueprints ?? [];
|
|
68
|
-
const existing = applied.find((b) => b.slug ===
|
|
90
|
+
const existing = applied.find((b) => b.slug === appliedSlug);
|
|
69
91
|
const stamped = stampContributions(blueprint.contributions, namespace);
|
|
70
92
|
if (stamped.error) {
|
|
71
93
|
return rcfError({ kind: 'validation', message: stamped.error });
|
|
72
94
|
}
|
|
95
|
+
// Apply-time band gate for external-library blueprints.
|
|
96
|
+
if (libraryBands) {
|
|
97
|
+
const bandErr = detectContributionsOutOfBand(stamped.contributions, libraryBands);
|
|
98
|
+
if (bandErr) return bandErr;
|
|
99
|
+
}
|
|
73
100
|
|
|
74
101
|
// Pre-detection: fold operator-supplied --resolve declarations into a
|
|
75
102
|
// WORKING COPY of the manifest so the detector honours them on this
|
|
76
103
|
// run. The final manifest write later composes the same resolution
|
|
77
104
|
// records into the persisted manifest, so the in-memory copy and the
|
|
78
105
|
// on-disk write agree.
|
|
79
|
-
const incomingForConflicts = { slug:
|
|
106
|
+
const incomingForConflicts = { slug: appliedSlug, contributions: stamped.contributions };
|
|
80
107
|
const declResult = composeDeclaredResolutions({
|
|
81
108
|
manifest: tree.manifest,
|
|
82
109
|
applied,
|
|
@@ -109,7 +136,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
|
|
|
109
136
|
...detectCrossBlueprintClaims(applied, incomingForConflicts),
|
|
110
137
|
];
|
|
111
138
|
if (conflicts.length > 0) {
|
|
112
|
-
return { applied: false, slug:
|
|
139
|
+
return { applied: false, slug: appliedSlug, version: blueprint.version, contributions: [], conflicts };
|
|
113
140
|
}
|
|
114
141
|
|
|
115
142
|
// Ownership set for the overwrite guard below. On a re-apply, the
|
|
@@ -122,7 +149,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
|
|
|
122
149
|
if (existing && existing.version === blueprint.version) {
|
|
123
150
|
return {
|
|
124
151
|
applied: false, alreadyApplied: true,
|
|
125
|
-
slug:
|
|
152
|
+
slug: appliedSlug, version: blueprint.version,
|
|
126
153
|
contributions: stamped.contributions,
|
|
127
154
|
...(duplicateResolveTopics.length > 0 ? { warnings: [{ kind: 'duplicateResolveTopic', topics: duplicateResolveTopics }] } : {}),
|
|
128
155
|
};
|
|
@@ -151,7 +178,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
|
|
|
151
178
|
writtenContributions.push(preserveScope({ id: c.id, kind: c.kind, path: relDest }, c));
|
|
152
179
|
}
|
|
153
180
|
} else {
|
|
154
|
-
const tmpSuffix = `.rcf-tmp-${
|
|
181
|
+
const tmpSuffix = `.rcf-tmp-${appliedSlug}-${now.getTime()}`;
|
|
155
182
|
const stagedWrites = []; // { tmpAbs, absDest, relDest, id, kind, c }
|
|
156
183
|
const rollback = async (err) => {
|
|
157
184
|
for (const w of stagedWrites) {
|
|
@@ -184,7 +211,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
|
|
|
184
211
|
for (const w of stagedWrites) await unlink(w.tmpAbs).catch(() => {});
|
|
185
212
|
return rcfError({
|
|
186
213
|
kind: 'duplicateId',
|
|
187
|
-
message: `blueprint apply: contribution ${c.id} would overwrite an existing file at ${relDest} that is not recorded as owned by blueprint '${
|
|
214
|
+
message: `blueprint apply: contribution ${c.id} would overwrite an existing file at ${relDest} that is not recorded as owned by blueprint '${appliedSlug}'.`,
|
|
188
215
|
filePath: relDest,
|
|
189
216
|
});
|
|
190
217
|
}
|
|
@@ -225,12 +252,23 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
|
|
|
225
252
|
}
|
|
226
253
|
}
|
|
227
254
|
|
|
228
|
-
// Update manifest.blueprints[].
|
|
255
|
+
// Update manifest.blueprints[]. The applied record's `source` field
|
|
256
|
+
// carries the qualified typed ref for library-resolved blueprints
|
|
257
|
+
// (`wsd:auth-oauth2`) so `rcf define blueprint upgrade` reads back
|
|
258
|
+
// cleanly (spec §5.3); local-path applies carry the absolute path as
|
|
259
|
+
// today. The optional `libraryPrefix` field named in spec §5.3 is a
|
|
260
|
+
// schema-additive change on `appliedBlueprintRecord` (the record's
|
|
261
|
+
// schema is `additionalProperties: false`); it is deferred and
|
|
262
|
+
// tracked in the PR description as a follow-up so the shape lands as
|
|
263
|
+
// a coordinated schemas + rcf-lite bump.
|
|
264
|
+
const recordSource = typeof displaySource === 'string' && displaySource.length > 0 && displaySource !== source
|
|
265
|
+
? displaySource
|
|
266
|
+
: source;
|
|
229
267
|
const nextEntry = {
|
|
230
|
-
slug:
|
|
268
|
+
slug: appliedSlug,
|
|
231
269
|
version: blueprint.version,
|
|
232
270
|
appliedAt: now.toISOString(),
|
|
233
|
-
source,
|
|
271
|
+
source: recordSource,
|
|
234
272
|
...(namespaceOverride ? { namespace: namespaceOverride } : {}),
|
|
235
273
|
...(writtenContributions.length > 0 ? { contributions: writtenContributions } : {}),
|
|
236
274
|
};
|
|
@@ -239,7 +277,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
|
|
|
239
277
|
manifest: tree.manifest,
|
|
240
278
|
mutate: (next) => {
|
|
241
279
|
const list = Array.isArray(next.blueprints) ? next.blueprints : [];
|
|
242
|
-
const filtered = list.filter((b) => b.slug !==
|
|
280
|
+
const filtered = list.filter((b) => b.slug !== appliedSlug);
|
|
243
281
|
filtered.push(nextEntry);
|
|
244
282
|
next.blueprints = filtered;
|
|
245
283
|
// Fold any --resolve declarations recorded on this add into the
|
|
@@ -257,7 +295,7 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
|
|
|
257
295
|
|
|
258
296
|
return {
|
|
259
297
|
applied: true,
|
|
260
|
-
slug:
|
|
298
|
+
slug: appliedSlug,
|
|
261
299
|
version: blueprint.version,
|
|
262
300
|
contributions: writtenContributions,
|
|
263
301
|
...(duplicateResolveTopics.length > 0 ? { warnings: [{ kind: 'duplicateResolveTopic', topics: duplicateResolveTopics }] } : {}),
|
package/src/blueprint/index.js
CHANGED
|
@@ -11,3 +11,15 @@ export { nextResolutionId, matchingResolution } from './resolutions.js';
|
|
|
11
11
|
export { supersedeBlueprintTopic } from './supersede.js';
|
|
12
12
|
export { diffBlueprintTopic, renderDiff } from './diff.js';
|
|
13
13
|
export { resolveBlueprintSource, knownShelfSlugs, packagedShelfPath } from './shelf-resolver.js';
|
|
14
|
+
export { loadLibrary } from './library-loader.js';
|
|
15
|
+
export {
|
|
16
|
+
REGISTRY_PATH,
|
|
17
|
+
REGISTRY_VERSION,
|
|
18
|
+
readLibraryRegistry,
|
|
19
|
+
writeLibraryRegistry,
|
|
20
|
+
findLibrary,
|
|
21
|
+
loadCoreBandReservations,
|
|
22
|
+
detectBandOverlap,
|
|
23
|
+
detectContributionsOutOfBand,
|
|
24
|
+
detectPrefixCollision,
|
|
25
|
+
} from './library-registry.js';
|