@jimhoyd/urlcode 0.4.1 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/urlcode-authoring/SKILL.md +60 -7
- package/.claude/skills/urlcode-operations/SKILL.md +4 -0
- package/README.md +19 -15
- package/SECURITY.md +5 -3
- package/dist/BUILD-MANIFEST.json +31 -28
- package/dist/agent-context.js +82 -0
- package/dist/agents-guide.js +42 -42
- package/dist/authoring.js +12 -2
- package/dist/body-schema.js +159 -0
- package/dist/build-cloudflare.js +2 -0
- package/dist/capabilities.js +1 -1
- package/dist/cli.js +29 -12
- package/dist/config.js +74 -6
- package/dist/context.js +4 -6
- package/dist/errors.js +3 -1
- package/dist/examples.js +1 -1
- package/dist/extensions.js +138 -3
- package/dist/http-policy.js +19 -4
- package/dist/http-response.js +2 -2
- package/dist/init-with.js +71 -9
- package/dist/mcp.js +15 -2
- package/dist/pattern-guard.js +32 -0
- package/dist/policies/security.js +0 -0
- package/dist/policy.js +16 -0
- package/dist/project-tests.js +35 -11
- package/dist/readiness.js +188 -32
- package/dist/recipes.js +1 -1
- package/dist/router.js +17 -0
- package/dist/runtime.js +26 -3
- package/dist/scaffold.js +0 -0
- package/dist/server.js +26 -3
- package/dist/site.js +0 -0
- package/dist/tooling.js +3 -1
- package/dist/types/agent-context.d.ts +44 -0
- package/dist/types/authoring.d.ts +3 -1
- package/dist/types/body-schema.d.ts +58 -0
- package/dist/types/config.d.ts +10 -2
- package/dist/types/context.d.ts +1 -1
- package/dist/types/errors.d.ts +9 -1
- package/dist/types/examples.d.ts +1 -1
- package/dist/types/extensions.d.ts +105 -2
- package/dist/types/http-policy.d.ts +3 -0
- package/dist/types/init-with.d.ts +10 -1
- package/dist/types/pattern-guard.d.ts +10 -0
- package/dist/types/project-tests.d.ts +9 -0
- package/dist/types/readiness.d.ts +71 -0
- package/dist/types/recipes.d.ts +1 -1
- package/dist/types/runtime.d.ts +4 -0
- package/dist/types/server.d.ts +9 -1
- package/dist/types/tooling.d.ts +2 -0
- package/dist/types/types.d.ts +13 -0
- package/dist/types.js +10 -2
- package/dist/typescript-authoring.js +5 -3
- package/dist/verify-deployment.js +16 -10
- package/examples/body-validation/README.md +16 -0
- package/examples/body-validation/example.yaml +17 -0
- package/examples/body-validation/tests/requests.json +15 -0
- package/examples/body-validation/urlcode.yaml +34 -0
- package/examples/coverage-waiver/README.md +8 -0
- package/examples/coverage-waiver/example.yaml +16 -0
- package/examples/coverage-waiver/functions/notes.mjs +2 -0
- package/examples/coverage-waiver/tests/requests.json +3 -0
- package/examples/coverage-waiver/urlcode.yaml +10 -0
- package/examples/data-dir/README.md +39 -0
- package/examples/data-dir/data/welcome.txt +1 -0
- package/examples/data-dir/example.yaml +22 -0
- package/examples/data-dir/functions/note.mjs +18 -0
- package/examples/data-dir/tests/requests.json +6 -0
- package/examples/data-dir/urlcode.yaml +6 -0
- package/examples/lifecycle/README.md +15 -0
- package/examples/lifecycle/example.yaml +19 -0
- package/examples/lifecycle/functions/notes.mjs +29 -0
- package/examples/lifecycle/tests/requests.json +12 -0
- package/examples/lifecycle/urlcode.yaml +29 -0
- package/examples/not-found/README.md +10 -0
- package/examples/not-found/example.yaml +17 -0
- package/examples/not-found/public/404.html +3 -0
- package/examples/not-found/public/index.html +3 -0
- package/examples/not-found/tests/requests.json +7 -0
- package/examples/not-found/urlcode.yaml +7 -0
- package/examples/shared-blocks/README.md +11 -0
- package/examples/shared-blocks/example.yaml +17 -0
- package/examples/shared-blocks/tests/requests.json +7 -0
- package/examples/shared-blocks/urlcode.yaml +37 -0
- package/llms-full.txt +436 -149
- package/llms.txt +44 -6
- package/package.json +15 -22
- package/recipes/static-page/README.md +9 -0
- package/recipes/static-page/public/index.html +11 -0
- package/recipes/static-page/recipe.yaml +21 -0
- package/recipes/static-page/tests/requests.json +22 -0
- package/recipes/static-page/urlcode.yaml +7 -0
- package/recipes/static-plus-api/README.md +6 -0
- package/recipes/static-plus-api/urlcode.yaml +4 -0
- package/recipes/store-crud/README.md +53 -0
- package/recipes/store-crud/recipe.yaml +31 -0
- package/recipes/store-crud/tests/requests.json +18 -0
- package/recipes/store-crud/urlcode.yaml +18 -0
- package/schemas/urlcode.schema.json +125 -60
- package/skills/urlcode/SKILL.md +53 -26
- package/starters/default/AGENTS.md +43 -43
- package/starters/page/README.md +14 -0
- package/starters/page/public/index.html +12 -0
- package/starters/page/tests/requests.json +17 -0
- package/starters/page/urlcode.yaml +6 -0
- package/.claude-plugin/marketplace.json +0 -18
- package/CONTRIBUTING.md +0 -112
- package/ROADMAP.md +0 -66
- package/docs/AI-AUTHORING.md +0 -338
- package/docs/ASSETS.md +0 -107
- package/docs/AUTH-BACKUP.md +0 -32
- package/docs/AWS.md +0 -86
- package/docs/BEST-PRACTICES.md +0 -276
- package/docs/BULK.md +0 -79
- package/docs/CAPABILITIES.md +0 -192
- package/docs/CAPACITY.md +0 -305
- package/docs/CI-FOLLOWUP-2026-09-19.md +0 -97
- package/docs/CI-RELEASE-AUDIT-2026-09-19.md +0 -322
- package/docs/CI.md +0 -147
- package/docs/CLOUDFLARE.md +0 -109
- package/docs/CODEBASE-AUDIT-2026-09-20.md +0 -284
- package/docs/COMPLIANCE.md +0 -239
- package/docs/COMPOSING-A-SITE.md +0 -278
- package/docs/CONDITIONS.md +0 -74
- package/docs/DEPLOYMENT-CHECKS.md +0 -108
- package/docs/DEVELOPMENT-PIPELINE.md +0 -270
- package/docs/EGRESS.md +0 -125
- package/docs/EXTENSIONS.md +0 -438
- package/docs/FRAMEWORK.md +0 -217
- package/docs/FUNCTION-SECURITY.md +0 -254
- package/docs/HTTP.md +0 -129
- package/docs/INSTALL.md +0 -128
- package/docs/INTERCHANGE.md +0 -134
- package/docs/LOAD-TESTING.md +0 -91
- package/docs/LOCAL-DEVELOPMENT.md +0 -102
- package/docs/MIDDLEWARE-EXAMPLES.md +0 -75
- package/docs/MIDDLEWARE.md +0 -102
- package/docs/MONITORING.md +0 -115
- package/docs/OBSERVABILITY.md +0 -222
- package/docs/OPEN-DECISIONS.md +0 -224
- package/docs/OPERATIONAL-PROOF.md +0 -41
- package/docs/OPERATIONS.md +0 -201
- package/docs/ORGANIZATION.md +0 -135
- package/docs/PERFORMANCE.md +0 -72
- package/docs/PLUGINS.md +0 -271
- package/docs/POLICIES.md +0 -211
- package/docs/PRERENDER.md +0 -245
- package/docs/PROJECT-DIRECTION.md +0 -118
- package/docs/PROVIDER-VERIFICATION.md +0 -84
- package/docs/READINESS.md +0 -150
- package/docs/README.md +0 -87
- package/docs/RECIPES.md +0 -99
- package/docs/RELEASE-0.4.0-alpha.3.md +0 -50
- package/docs/RELEASE-0.4.1.md +0 -73
- package/docs/RELEASE-READINESS.md +0 -117
- package/docs/RELEASE-SECURITY.md +0 -96
- package/docs/RESILIENCE.md +0 -161
- package/docs/ROUTING.md +0 -92
- package/docs/SANDBOX-REVIEW.md +0 -72
- package/docs/SCAFFOLDING.md +0 -70
- package/docs/SECURITY-AUDIT.md +0 -164
- package/docs/SITE.md +0 -150
- package/docs/SPECIFICATION.md +0 -359
- package/docs/SPIKE-AI-FRAMEWORK-BENCHMARK.md +0 -288
- package/docs/SPIKE-BUSINESS-SUITE.md +0 -1029
- package/docs/SPIKE-CORE-LAYERING.md +0 -368
- package/docs/SPIKE-DEFAULT-TRUST-MODEL.md +0 -211
- package/docs/STANDARDS.md +0 -311
- package/docs/STARTERS.md +0 -83
- package/docs/STATIC.md +0 -105
- package/docs/TOOLING.md +0 -298
- package/docs/TUNNELS.md +0 -72
- package/docs/TYPESCRIPT-AUTHORING.md +0 -87
- package/docs/TYPESCRIPT.md +0 -123
- package/docs/VERCEL.md +0 -114
- package/docs/VERSION-ALIGNMENT.md +0 -80
- package/docs/YAML-GUIDE.md +0 -57
- package/docs/YAML-REFERENCE.md +0 -449
- package/docs/archive/2026-09-19/EXTENSION-IMPLEMENTATION.md +0 -68
- package/docs/archive/2026-09-19/MANAGEMENT-SECURITY.md +0 -102
- package/docs/archive/2026-09-19/NEXT-PHASE-PLAN.md +0 -108
- package/docs/archive/2026-09-19/NEXT-STEPS.md +0 -646
- package/docs/archive/2026-09-19/OPEN-DECISIONS.md +0 -277
- package/docs/archive/2026-09-19/RELEASE-SECURITY.md +0 -186
- package/docs/archive/2026-09-19/ROADMAP.md +0 -387
- package/docs/archive/2026-09-19/SPIKE-EXTENSION-MODEL.md +0 -430
- package/docs/archive/2026-09-19/SPIKE-EXTENSIONS.md +0 -492
- package/docs/archive/2026-09-19/SPIKE-LAMBDA-COMPILE.md +0 -365
- package/docs/archive/2026-09-19/SPIKE-MONOREPO.md +0 -778
- package/docs/archive/2026-09-19/USABILITY-REVIEW.md +0 -139
- package/docs/archive/README.md +0 -28
- package/docs/policies/agents.md +0 -182
- package/docs/policies/cache.md +0 -152
- package/docs/policies/compression.md +0 -169
- package/docs/policies/contract.md +0 -52
- package/docs/policies/hardened.md +0 -56
- package/docs/policies/interoperability.md +0 -169
- package/docs/policies/operations.md +0 -45
- package/docs/policies/security.md +0 -161
- package/docs/policies/throttle.md +0 -103
- package/docs/yaml/assets.md +0 -36
- package/docs/yaml/conditions.md +0 -20
- package/docs/yaml/functions.md +0 -168
- package/docs/yaml/middleware.md +0 -31
- package/docs/yaml/organization.md +0 -74
- package/docs/yaml/policies.md +0 -37
- package/docs/yaml/redirects.md +0 -64
- package/docs/yaml/responses.md +0 -57
- package/docs/yaml/site.md +0 -24
- package/packaging/claude-plugin/.claude-plugin/plugin.json +0 -19
- package/packaging/claude-plugin/skills/urlcode-authoring/SKILL.md +0 -120
- package/packaging/claude-plugin/skills/urlcode-operations/SKILL.md +0 -108
package/docs/READINESS.md
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
# Test every route, then measure it
|
|
2
|
-
|
|
3
|
-
Alpha.5 includes a local coverage gate and an assertion-aware project benchmark.
|
|
4
|
-
These validate a local snapshot, not the reachability of external redirect
|
|
5
|
-
services or the correctness of an entire production deployment.
|
|
6
|
-
|
|
7
|
-
```sh
|
|
8
|
-
urlcode routes --project ../my-links
|
|
9
|
-
urlcode audit --project ../my-links --expect-routes 2
|
|
10
|
-
urlcode benchmark --project ../my-links --requests 1000 --concurrency 2 --max-p95-ms 50
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
All three activate/validate the project with the same runtime that serves it --
|
|
14
|
-
each route in its own declared trust mode, trusted in-process unless it declares
|
|
15
|
-
`sandbox: true` -- and use local environment loading like `test`. Pass an
|
|
16
|
-
external `--policy` for explicitly authorized bindings. No destination redirects are followed, credentials are not
|
|
17
|
-
printed, and no remote load-test target is accepted.
|
|
18
|
-
|
|
19
|
-
## Inventory and count reconciliation
|
|
20
|
-
|
|
21
|
-
`routes` reports each configured route's pattern, handler, exact allowed methods,
|
|
22
|
-
execution mode (`sandbox`, with `sandboxReason` when the route declares one)
|
|
23
|
-
and active/disabled/expired state. It includes routes from YAML includes. A
|
|
24
|
-
parameter pattern is one route; its possible URLs are not a finite route count.
|
|
25
|
-
A static mount is one route, even when it contains many files.
|
|
26
|
-
|
|
27
|
-
`routes --compare previous.json` diffs the current inventory against a saved
|
|
28
|
-
`routes` report: added, removed and changed routes (handler, methods, state,
|
|
29
|
-
execution mode and its reason, middleware count, policies, generated marker and
|
|
30
|
-
the policy description). A route that flips between trusted and sandboxed
|
|
31
|
-
execution is a change, including when its handler is native and only its
|
|
32
|
-
middleware runs project code. It
|
|
33
|
-
prints JSON, or Markdown tables with `--format markdown`, and always exits 0;
|
|
34
|
-
it reports, it does not judge. The [GitHub action](CI.md) posts this diff on
|
|
35
|
-
pull requests.
|
|
36
|
-
|
|
37
|
-
`audit --expect-routes N` compares N with the total configured count. Its summary
|
|
38
|
-
separately counts active, disabled and expired routes and groups by handler.
|
|
39
|
-
A mismatch exits nonzero. Keep N reviewed in your application CI so accidentally
|
|
40
|
-
removing a route cannot silently reduce the test workload. Change it intentionally
|
|
41
|
-
when adding/removing routes; do not calculate the expected value from the same YAML.
|
|
42
|
-
|
|
43
|
-
## Generated checks plus explicit examples
|
|
44
|
-
|
|
45
|
-
The audit generates GET/HEAD checks for concrete native redirects, declared
|
|
46
|
-
responses, pages/downloads and every snapshotted static file. It checks status,
|
|
47
|
-
redirect Location, file metadata/length and declared bodies where applicable.
|
|
48
|
-
It also checks literal disabled/expired routes for 404/410. Generated checks are
|
|
49
|
-
contract consistency checks; they cannot decide whether your intended destination
|
|
50
|
-
or content is correct. Keep independent expected outcomes in fixtures too.
|
|
51
|
-
|
|
52
|
-
Functions, parameterized routes, required inputs/bodies and non-GET/HEAD methods
|
|
53
|
-
need fixtures in `tests/requests.json`:
|
|
54
|
-
|
|
55
|
-
```json
|
|
56
|
-
[
|
|
57
|
-
{"path":"/hello/Ada","status":200,"expectBody":"{\"message\":\"Hello, Ada!\"}"},
|
|
58
|
-
{"path":"/hello/Ada","method":"HEAD","status":200,"expectBody":""},
|
|
59
|
-
{"path":"/go","status":302,"expectHeaders":{"location":"https://example.com/"}},
|
|
60
|
-
{"path":"/go","method":"POST","status":405,"expectHeaders":{"allow":"GET, HEAD"}},
|
|
61
|
-
{"path":"/missing","status":404}
|
|
62
|
-
]
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
Each case may supply `method`, string-valued `headers`, a text `body`, expected
|
|
66
|
-
`status`, string-valued `expectHeaders`, and exact UTF-8 `expectBody`. Status is
|
|
67
|
-
required. A passing case needs at least one body/header assertion to count toward
|
|
68
|
-
coverage; status-only successes appear in `unassertedCases`. Choose assertions
|
|
69
|
-
that verify your intended business result, not just a generic header. Fixtures
|
|
70
|
-
are limited to 10,000 cases/16 MiB; checked response bodies to 16 MiB. Requests have
|
|
71
|
-
10-second transport timeouts. Failures do not stop subsequent checks. Status 0
|
|
72
|
-
means a transport/response-limit failure. Output reports case numbers/statuses,
|
|
73
|
-
not response bodies, header values or fixture URLs that may contain private data.
|
|
74
|
-
|
|
75
|
-
Coverage uses the route that actually matched. A literal route shadowing a
|
|
76
|
-
parameter example cannot count toward parameter coverage. Each active route and
|
|
77
|
-
allowed method needs a passing normal response (below 400); an intentionally
|
|
78
|
-
error-valued native `respond` check can cover its declared outcome. A negative
|
|
79
|
-
fixture alone cannot prove a function works normally. Disabled/expired routes
|
|
80
|
-
are counted separately and excluded from active coverage requirements. Inactive
|
|
81
|
-
parameter patterns still need explicit negative fixtures to exercise them.
|
|
82
|
-
|
|
83
|
-
`ready: true` requires a nonempty active project, matching expected count (when
|
|
84
|
-
supplied), zero failed checks and no uncovered active route/method combinations.
|
|
85
|
-
It means this local gate passed, not that all branches, parameter values or assets
|
|
86
|
-
have independent business assertions. Function routes intentionally serving only
|
|
87
|
-
errors cannot satisfy normal-response coverage in this release. Time-dependent
|
|
88
|
-
expiry is evaluated at audit start; avoid running a gate exactly at expiry.
|
|
89
|
-
|
|
90
|
-
`urlcode test` runs only explicit fixtures. `audit` adds generated native checks,
|
|
91
|
-
counts and coverage. Both execute locally and never follow redirect destinations.
|
|
92
|
-
Audits run sequentially to avoid mistaking worker saturation for a routing failure.
|
|
93
|
-
|
|
94
|
-
## Benchmark your actual project
|
|
95
|
-
|
|
96
|
-
The benchmark cycles generated checks and explicit successful GET/HEAD fixtures.
|
|
97
|
-
POST/PUT/PATCH/DELETE/OPTIONS and expected error cases are excluded. Function
|
|
98
|
-
GET/HEAD handlers still execute: use synthetic test data and reviewed bindings.
|
|
99
|
-
The workload is case-weighted, not a simulation of real user traffic. A short run
|
|
100
|
-
may not reach every case; compare `exercisedWorkloadCases` with `workloadCases`.
|
|
101
|
-
|
|
102
|
-
Output includes requested/completed count, assertion failures, status histogram,
|
|
103
|
-
startup time, throughput, p50/p95/p99 response time, process RSS, Node and OS.
|
|
104
|
-
Any wrong status/header/body, incomplete run or exceeded `--max-p95-ms` budget
|
|
105
|
-
exits nonzero. Warmup is zero and is reported explicitly. Client/server share one
|
|
106
|
-
process; RSS and latency are local measurements, not server-only production SLAs.
|
|
107
|
-
|
|
108
|
-
Defaults: 1,000 requests, concurrency 2, 30-second scheduling budget. Bounds:
|
|
109
|
-
1–100,000 requests, 1–32 concurrent requests, `--seconds` 1–300. In-flight requests
|
|
110
|
-
may finish after the scheduling budget, bounded by their timeout. Higher function
|
|
111
|
-
concurrency can legitimately cause 503 because the default pool has two workers.
|
|
112
|
-
Choose a latency budget from repeatable measurements on your intended host.
|
|
113
|
-
The existing synthetic `npm run benchmark -- 10000` is still a separate scale test.
|
|
114
|
-
|
|
115
|
-
## What a release should prove
|
|
116
|
-
|
|
117
|
-
| Check | Evidence to require |
|
|
118
|
-
|---|---|
|
|
119
|
-
| Counts and coverage | Reviewed expected count; every active route/method covered; disabled/expired routes accounted for |
|
|
120
|
-
| Correct happy paths | Exact redirect destinations/status/query handling; function bodies/headers; representative parameter and asset examples |
|
|
121
|
-
| Invalid inputs | Missing/duplicate/wrong-type inputs; malformed paths/encoding; wrong methods; bad JSON/media type; oversized bodies |
|
|
122
|
-
| Response contracts | HEAD empty bodies, Allow headers, cookies, cache policy, download names/MIME; ETag/304 and range/206/416 fixtures |
|
|
123
|
-
| Configuration changes | Invalid candidate keeps last-good routes; valid reload updates behavior; removed routes are intentional |
|
|
124
|
-
| Code containment | Runtime security suite passes; no ambient filesystem/network access; grants narrow and revision-pinned |
|
|
125
|
-
| Capacity and failure | Representative mix and concurrency; low errors and repeatable latency; timeouts, overload recovery and memory over sustained runs |
|
|
126
|
-
| Deployment | Fresh install; real HTTPS/domain/health smoke; rollback; shutdown; logs/alerts; explicitly authorized destination reachability checks |
|
|
127
|
-
|
|
128
|
-
The runtime suite covers many generic protocol/security/reload cases. Apps must
|
|
129
|
-
supply their own business and boundary fixtures. Automated remote destination
|
|
130
|
-
health, redirect-chain/loop analysis, DNS/TLS checks, sustained soak/load profiles,
|
|
131
|
-
coverage by function branch and historical performance comparison remain planned.
|
|
132
|
-
Run the local audit in CI now (the [project action](CI.md) wires validate, test,
|
|
133
|
-
audit and the route diff into GitHub pull requests); do not label a passing local
|
|
134
|
-
audit “production certified.”
|
|
135
|
-
Once a candidate is deployed, `urlcode verify-deployment --target` compares its
|
|
136
|
-
responses with this project; see [deployment checks](DEPLOYMENT-CHECKS.md).
|
|
137
|
-
|
|
138
|
-
Before writing fixtures, `urlcode explain /route` shows what the compiled
|
|
139
|
-
configuration will do for a path: effective methods, the handler, the middleware
|
|
140
|
-
chain, validated inputs, the policies in effect and the cache outcome, so a
|
|
141
|
-
fixture asserts declared behavior rather than a guess. `urlcode manifest --json`
|
|
142
|
-
(also written by `build` as `manifest.json`) lists every route, the capabilities
|
|
143
|
-
in use, external requirements and per-target support with the revision digest,
|
|
144
|
-
which is the document to attach to a release review. Both read the
|
|
145
|
-
configuration only; they are not evidence that a deployment serves it.
|
|
146
|
-
|
|
147
|
-
Routes with middleware need explicit request fixtures with meaningful response
|
|
148
|
-
assertions for every active method. Audit cannot infer their behavior from the
|
|
149
|
-
underlying redirect or asset handler, so it does not generate native checks for
|
|
150
|
-
those routes. The route inventory includes a middleware count.
|
package/docs/README.md
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# URLCode documentation
|
|
2
|
-
|
|
3
|
-
Start with [the framework](FRAMEWORK.md): the four packages, the ladder from
|
|
4
|
-
redirects to a full application, the composition contract and the rules an AI
|
|
5
|
-
agent must follow. [Project direction](PROJECT-DIRECTION.md) states the
|
|
6
|
-
boundary and the license. Use documentation pinned to your runtime revision;
|
|
7
|
-
`version: "1"` is the stable project-format contract for this release line.
|
|
8
|
-
|
|
9
|
-
## Author a project
|
|
10
|
-
|
|
11
|
-
| Goal | Start here |
|
|
12
|
-
|---|---|
|
|
13
|
-
| Install the CLI | [Installation](INSTALL.md) |
|
|
14
|
-
| Write YAML with examples | [YAML guide and recipes](YAML-GUIDE.md) |
|
|
15
|
-
| Look up every accepted field | [Generated field reference](YAML-REFERENCE.md), [JSON Schema](../schemas/urlcode.schema.json) |
|
|
16
|
-
| Let an AI build routes | [AI authoring guide](AI-AUTHORING.md), [llms.txt](../llms.txt) |
|
|
17
|
-
| Load authoring/operations rules into an agent | [Authoring skill](../.claude/skills/urlcode-authoring/SKILL.md), [operations skill](../.claude/skills/urlcode-operations/SKILL.md), [how they are distributed](AI-AUTHORING.md#agent-skills) |
|
|
18
|
-
| Run examples | [25-route cookbook](../examples/cookbook/README.md), [prerender recipe](../examples/prerender/README.md), [small starter](STARTERS.md) |
|
|
19
|
-
| Understand exact behavior | [Specification](SPECIFICATION.md), [routing](ROUTING.md), [HTTP](HTTP.md) |
|
|
20
|
-
| Run examples | [40-route cookbook](../examples/cookbook/README.md), [prerender recipe](../examples/prerender/README.md), [small starter](STARTERS.md) |
|
|
21
|
-
| Let an AI build routes | [The framework](FRAMEWORK.md), [AI authoring guide](AI-AUTHORING.md), [llms.txt](../llms.txt), [SDK and read-only MCP](TOOLING.md) |
|
|
22
|
-
| Reuse code around routes | [Middleware](MIDDLEWARE.md), [middleware examples](MIDDLEWARE-EXAMPLES.md) |
|
|
23
|
-
| Handle secrets and decide what to sandbox | [Function security](FUNCTION-SECURITY.md) |
|
|
24
|
-
| Author guest functions in TypeScript | [Build-time guest transpilation](TYPESCRIPT-AUTHORING.md) |
|
|
25
|
-
| Serve pages, files and downloads | [Assets](ASSETS.md) |
|
|
26
|
-
| Publish a site with no request-time guest code | [Prerendering helper and recipe](PRERENDER.md) |
|
|
27
|
-
| Select response branches | [Exact conditions](CONDITIONS.md) |
|
|
28
|
-
| Proxy an API or emit a webhook | [Bounded egress and operator grants](EGRESS.md) |
|
|
29
|
-
| Throttle, block agents, set security headers, compress or cache | [Policies](POLICIES.md): [throttle](policies/throttle.md), [agents](policies/agents.md), [security](policies/security.md), [compression](policies/compression.md), [cache](policies/cache.md) |
|
|
30
|
-
| Generate robots.txt, sitemap.xml, favicon, security.txt and llms.txt | [Site conventions](SITE.md) |
|
|
31
|
-
| Organize YAML across folders | [Organization](ORGANIZATION.md), [readability practices](BEST-PRACTICES.md) |
|
|
32
|
-
| Generate placeholders from YAML | [Scaffolding](SCAFFOLDING.md) |
|
|
33
|
-
| Convert provider redirect files | [Strict interchange and conversion reports](INTERCHANGE.md) |
|
|
34
|
-
| Import thousands of redirects | [Bulk import and scale evidence](BULK.md) |
|
|
35
|
-
| Reuse local project recipes | [Recipe catalog](RECIPES.md) |
|
|
36
|
-
| Check declared configuration against standards-referenced rules | [Compliance](COMPLIANCE.md) |
|
|
37
|
-
|
|
38
|
-
## Extend the runtime
|
|
39
|
-
|
|
40
|
-
| Goal | Start here |
|
|
41
|
-
|---|---|
|
|
42
|
-
| Add accounts, sign-in and protected routes | [urlcode-auth](../packages/auth#readme), [auth security](../packages/auth/SECURITY.md) |
|
|
43
|
-
| Manage users, sessions, roles and audit | [urlcode-admin](../packages/admin#readme) |
|
|
44
|
-
| Restyle every extension page and translate copy | [urlcode-ui](../packages/ui#readme), [ui contract](../packages/ui/CONTRACT.md) |
|
|
45
|
-
| Write or install a versioned extension | [Extensions](EXTENSIONS.md), [example fixture](../examples/extensions/README.md) |
|
|
46
|
-
| Follow implementation of the auth, admin and UI extensions | [Extension implementation sequence](archive/2026-09-19/EXTENSION-IMPLEMENTATION.md) |
|
|
47
|
-
| Know which core version an extension package supports, and how it says so | [Core version alignment](VERSION-ALIGNMENT.md) |
|
|
48
|
-
| Add host behavior in operator code | [Plugins](PLUGINS.md) |
|
|
49
|
-
| Use the API from TypeScript | [TypeScript: shipped declarations, exports, build and fidelity](TYPESCRIPT.md) |
|
|
50
|
-
|
|
51
|
-
## Operate and deploy
|
|
52
|
-
|
|
53
|
-
| Goal | Start here |
|
|
54
|
-
|---|---|
|
|
55
|
-
| Work locally | [Local development](LOCAL-DEVELOPMENT.md), [tunnels](TUNNELS.md) |
|
|
56
|
-
| Prove responses and counts | [Readiness](READINESS.md) |
|
|
57
|
-
| Check pull requests of a project on GitHub | [CI action, route diffs and the starter workflow](CI.md) |
|
|
58
|
-
| Deploy and roll back | [Operations](OPERATIONS.md) |
|
|
59
|
-
| Review security findings and gaps | [Internal security audit](SECURITY-AUDIT.md) |
|
|
60
|
-
| Assess release readiness | [Evidence and open gates](RELEASE-READINESS.md) |
|
|
61
|
-
| See unfinished work | [Roadmap](../ROADMAP.md) |
|
|
62
|
-
| Read why per-route Lambda compilation was declined | [Lambda compile spike (archived)](archive/2026-09-19/SPIKE-LAMBDA-COMPILE.md) |
|
|
63
|
-
| Verify a running deployment matches the project | [Deployment checks](DEPLOYMENT-CHECKS.md) |
|
|
64
|
-
| Inspect target support | [Capabilities and normalized representation](CAPABILITIES.md) |
|
|
65
|
-
| Deploy to Vercel, AWS Lambda or Cloudflare Workers | [Vercel](VERCEL.md), [AWS](AWS.md), [Cloudflare](CLOUDFLARE.md), [provider verification evidence](PROVIDER-VERIFICATION.md) |
|
|
66
|
-
| Watch a deployment | [Monitoring](MONITORING.md), [observability](OBSERVABILITY.md) |
|
|
67
|
-
| Estimate concurrency and memory | [Capacity and limits](CAPACITY.md), [measurements](PERFORMANCE.md), [load testing](LOAD-TESTING.md) |
|
|
68
|
-
| Prepare for overload, DDoS and recovery | [Resilience playbook](RESILIENCE.md) |
|
|
69
|
-
|
|
70
|
-
## Direction and evidence
|
|
71
|
-
|
|
72
|
-
Start with [principles and open decisions](OPEN-DECISIONS.md) for a plain-language
|
|
73
|
-
review and [the roadmap](../ROADMAP.md) for next work. Current behavior belongs
|
|
74
|
-
in the guides above and the [specification](SPECIFICATION.md).
|
|
75
|
-
|
|
76
|
-
- [Release readiness](RELEASE-READINESS.md), [security audit](SECURITY-AUDIT.md),
|
|
77
|
-
[sandbox review](SANDBOX-REVIEW.md) and [provider evidence](PROVIDER-VERIFICATION.md)
|
|
78
|
-
distinguish implementation from evidence still missing.
|
|
79
|
-
- [Version alignment](VERSION-ALIGNMENT.md) and [release security](RELEASE-SECURITY.md)
|
|
80
|
-
describe peer compatibility and publication.
|
|
81
|
-
- Open proposals: [middleware layering](SPIKE-CORE-LAYERING.md),
|
|
82
|
-
[agent benchmark](SPIKE-AI-FRAMEWORK-BENCHMARK.md), and
|
|
83
|
-
[business suite](SPIKE-BUSINESS-SUITE.md). None is an implementation promise.
|
|
84
|
-
- [Historical plans and reviews](archive/README.md) are archived separately.
|
|
85
|
-
|
|
86
|
-
Examples are educational unless backed by runnable fixtures. Infrastructure
|
|
87
|
-
limits are deployment settings, not fields to invent in route YAML.
|
package/docs/RECIPES.md
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# Local recipes
|
|
2
|
-
|
|
3
|
-
Recipes are ordinary version-controlled URLCode projects shipped with the
|
|
4
|
-
runtime. There is no network registry, install script, provider account or
|
|
5
|
-
project-code execution during authoring. Search them before writing a common
|
|
6
|
-
route by hand: the catalog is the vocabulary of behavior the runtime already
|
|
7
|
-
supports, and every recipe validates, tests and audits.
|
|
8
|
-
|
|
9
|
-
```sh
|
|
10
|
-
urlcode recipes list
|
|
11
|
-
urlcode recipes search "webhook json" # id, description, tags, capabilities
|
|
12
|
-
urlcode recipes search webhook --json
|
|
13
|
-
urlcode recipes show webhook-receiver # metadata first, then every file
|
|
14
|
-
urlcode recipes add webhook-receiver --out ./orders-hook --dry-run
|
|
15
|
-
urlcode recipes add webhook-receiver --out ./orders-hook
|
|
16
|
-
urlcode validate --local --project ./orders-hook
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## The catalog
|
|
20
|
-
|
|
21
|
-
| Recipe | Complexity | What it shows | Needs |
|
|
22
|
-
|---|---|---|---|
|
|
23
|
-
| `redirect` | starter | Permanent redirect forwarding one allowlisted query key | nothing |
|
|
24
|
-
| `health-page` | starter | Native `/health` text and `/status` JSON, no-store | nothing |
|
|
25
|
-
| `json-api` | starter | Bounded JSON body echoed by a sandboxed function | self-hosted runtime |
|
|
26
|
-
| `webhook-receiver` | starter | JSON event with a type header, shape-checked, `202` | self-hosted runtime |
|
|
27
|
-
| `typescript` | intermediate | Typed guest transpiled by `build-typescript` | build step |
|
|
28
|
-
| `static-plus-api` | intermediate | Page, static directory and one JSON function | self-hosted runtime |
|
|
29
|
-
| `cors-api` | intermediate | Preflight and CORS headers from route middleware | self-hosted runtime |
|
|
30
|
-
| `contact-form` | intermediate | Validated message, fixed signal to a hook after the response | signal grant (`--policy`) |
|
|
31
|
-
| `middleware` | advanced | Fourteen reusable middleware patterns ([described here](MIDDLEWARE-EXAMPLES.md)) | self-hosted runtime |
|
|
32
|
-
| `authenticated-json-api` | advanced | Function behind `auth: true` | operator auth extension, `--host-file`, `--origin` |
|
|
33
|
-
| `protected-download` | advanced | Native attachment behind `auth: true` | operator auth extension, `--host-file`, `--origin` |
|
|
34
|
-
|
|
35
|
-
Each recipe contains a README, `tests/requests.json` and editable files.
|
|
36
|
-
Replace example destinations and review the resulting files before use. The
|
|
37
|
-
authenticated recipes declare `extensions.auth` and protect their route with
|
|
38
|
-
the short form described in [extensions](EXTENSIONS.md); their README shows the
|
|
39
|
-
minimal host-file fixture that reproduces the bundled tests. Nothing in the
|
|
40
|
-
catalog verifies webhook signatures: the sandbox has no crypto or network API,
|
|
41
|
-
so signed webhooks belong behind an operator extension or a trusted host.
|
|
42
|
-
|
|
43
|
-
## `recipe.yaml`
|
|
44
|
-
|
|
45
|
-
Every recipe carries `recipe.yaml`, validated against
|
|
46
|
-
[`schemas/recipe.schema.json`](../schemas/recipe.schema.json) by `npm run check`:
|
|
47
|
-
|
|
48
|
-
- `id`, `description`, `tags`, `complexity` (`starter`, `intermediate`,
|
|
49
|
-
`advanced`): written by hand; `search` matches id, description, tags and
|
|
50
|
-
capabilities, every word must match, and whole-tag or id hits rank first.
|
|
51
|
-
- `capabilities`, `targets`, `routes`: derived from the capability preflight
|
|
52
|
-
(`analyzeProjectCapabilities` per target after site expansion). The check
|
|
53
|
-
refuses a hand-edited value that differs, so a recipe cannot claim a target
|
|
54
|
-
it does not activate on. `targets` is `compatible`, or the strongest issue
|
|
55
|
-
(`conditional`, `unknown`, `refused`); `routes` is the `--expect-routes` value.
|
|
56
|
-
- `services` (external services), `grants` (operator grants, never from project
|
|
57
|
-
files), `inputs` (what to edit), `files` (the copy list), `tests` (fixtures
|
|
58
|
-
and the exact commands) and `behavior` (one observable statement per line).
|
|
59
|
-
|
|
60
|
-
`show` prints this metadata before the file contents so a reader sees what a
|
|
61
|
-
recipe needs before its files scroll past; `--json` returns the same object with
|
|
62
|
-
a `content` map. `list` prints one line per recipe, or the metadata with `--json`.
|
|
63
|
-
|
|
64
|
-
## Examples
|
|
65
|
-
|
|
66
|
-
`examples/*/example.yaml` uses the same schema, and `urlcode examples search
|
|
67
|
-
<text> [--json]` returns the smallest matching runnable example first with the
|
|
68
|
-
file to read. The cookbook's forty routes are indexed per route in the generated
|
|
69
|
-
[`examples/cookbook/route-index.json`](../examples/cookbook/route-index.json)
|
|
70
|
-
(handler, methods, capabilities, policies and middleware module names as tags;
|
|
71
|
-
`npm run docs:cookbook-index` regenerates it and `npm run check` refuses a stale
|
|
72
|
-
copy), so a search for `etag` answers the cookbook and its `/versioned` route.
|
|
73
|
-
Entries without a `urlcode.yaml` (operator rules, monitoring configuration,
|
|
74
|
-
scripts) are `runnable: false` and carry no derived fields.
|
|
75
|
-
|
|
76
|
-
## Adding a recipe
|
|
77
|
-
|
|
78
|
-
`add` creates a new standalone directory. It refuses an existing destination,
|
|
79
|
-
even an empty directory; it never merges or overwrites existing project routes.
|
|
80
|
-
Review or copy selected declarations manually when combining projects. Dry-run
|
|
81
|
-
reads and validates the packaged recipe and checks the destination, but writes
|
|
82
|
-
nothing. The output parent must already exist and be owned by the caller.
|
|
83
|
-
Dependencies are written first and the complete `urlcode.yaml` is published by
|
|
84
|
-
rename last. A failed write removes the new directory. This is atomic project
|
|
85
|
-
activation, not an atomic directory replacement or a guarantee against a local
|
|
86
|
-
attacker concurrently replacing the caller's output directories.
|
|
87
|
-
|
|
88
|
-
## SDK and MCP
|
|
89
|
-
|
|
90
|
-
The SDK provides `listRecipes()`, `searchRecipes(text)`, `showRecipe(name)`,
|
|
91
|
-
`addRecipe(name, output, {dryRun})`, `listExamples()` and `searchExamples(text)`.
|
|
92
|
-
Catalog names are a fixed list in code; metadata and file lists come from each
|
|
93
|
-
schema-checked `recipe.yaml` and are returned as copies. Unknown names and
|
|
94
|
-
arbitrary paths/URLs fail closed. The stdio MCP server adds `search_recipes` and
|
|
95
|
-
`search_examples` beside `recipes_list` and `recipes_show`
|
|
96
|
-
([tooling](TOOLING.md)). Integration tests run every recipe through the real
|
|
97
|
-
runtime with its fixtures and audit it with its declared route count (after
|
|
98
|
-
building the TypeScript recipe, with a fixture registry for the authenticated
|
|
99
|
-
ones and the generated policy for the contact form).
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# Coordinated 0.4.0-alpha.3 release
|
|
2
|
-
|
|
3
|
-
This release prepares core, UI, auth and admin at `0.4.0-alpha.3`, as explicitly
|
|
4
|
-
selected by the maintainer. The shared number identifies this tested package
|
|
5
|
-
set; it does not enable permanent fixed versioning or leave the alpha channel.
|
|
6
|
-
Existing versions, tags, and npm `latest` channels are preserved.
|
|
7
|
-
|
|
8
|
-
## Included changes
|
|
9
|
-
|
|
10
|
-
Core includes the monorepo consolidation, corrected Windows npm invocation,
|
|
11
|
-
current trust-by-default authoring guidance, and support for a TypeScript module
|
|
12
|
-
shared by trusted and sandboxed routes without weakening the sandbox checks.
|
|
13
|
-
The CLI and MCP report the new runtime version. The runtime remains independent
|
|
14
|
-
of the extension implementations.
|
|
15
|
-
|
|
16
|
-
Auth includes deterministic worker cleanup on rejected initialization and
|
|
17
|
-
Windows backup flushing. Auth/admin refresh a lifecycle hook's entry module on
|
|
18
|
-
each activation; changes to the entry module's own imports still require restart.
|
|
19
|
-
The extension changelogs record their package-specific changes.
|
|
20
|
-
|
|
21
|
-
All four packages use the shared release coordinator, immutable release tags,
|
|
22
|
-
exact-commit full verification, retained retry artifacts and trusted npm
|
|
23
|
-
publication. The candidate rehearsal installs their tarballs together outside
|
|
24
|
-
the workspace and checks peers, public imports and scaffolding.
|
|
25
|
-
|
|
26
|
-
## Installation and compatibility
|
|
27
|
-
|
|
28
|
-
Once publication has completed, install an exact, coordinated set in the
|
|
29
|
-
consumer application's directory:
|
|
30
|
-
|
|
31
|
-
```sh
|
|
32
|
-
npm install --save-exact @jimhoyd/urlcode@0.4.0-alpha.3 @jimhoyd/urlcode-ui@0.4.0-alpha.3 @jimhoyd/urlcode-auth@0.4.0-alpha.3 @jimhoyd/urlcode-admin@0.4.0-alpha.3
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Applications only need the extensions they actually use; admin requires auth
|
|
36
|
-
and UI, and auth requires UI. Auth/admin peer floors for this release are
|
|
37
|
-
`>=0.4.0-alpha.3 <0.5.0`. Update their dependencies together when crossing from
|
|
38
|
-
the former `0.1.x` extension line. Commit the resulting lockfile and use `npm ci`
|
|
39
|
-
in deployment. This release changes package peer compatibility intentionally;
|
|
40
|
-
it does not imply all previously mixed versions are supported.
|
|
41
|
-
|
|
42
|
-
Publication order is core, UI, auth, admin. A partial release stops before the
|
|
43
|
-
next package; diagnose and rerun its original workflow without moving tags.
|
|
44
|
-
The standalone template remains an exact core consumer and is updated through
|
|
45
|
-
its own PR after core is published. Archived extension repositories are not
|
|
46
|
-
publication targets.
|
|
47
|
-
|
|
48
|
-
CI and candidate success are not independent security assessment, live-provider
|
|
49
|
-
acceptance, or operational recovery proof. The intermittent Windows startup
|
|
50
|
-
timeout remains tracked in #202.
|
package/docs/RELEASE-0.4.1.md
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# URLCode 0.4.1
|
|
2
|
-
|
|
3
|
-
Core, UI, auth and admin share this explicitly selected stable version. This does not enable permanent fixed versioning. Internal peer minimums advance to this version; install the coordinated set together.
|
|
4
|
-
|
|
5
|
-
```sh
|
|
6
|
-
npm install --save-exact @jimhoyd/urlcode@0.4.1 @jimhoyd/urlcode-ui@0.4.1 @jimhoyd/urlcode-auth@0.4.1 @jimhoyd/urlcode-admin@0.4.1
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
This coordinated release moves core, UI, auth and admin from `0.4.0-alpha.3` to stable `0.4.1`. It makes the reviewed monorepo release line available through npm `latest` and keeps the four packages' peer minimums aligned.
|
|
10
|
-
|
|
11
|
-
The runtime retains its existing trust model: project functions and middleware run trusted in Node by default; routes declaring `sandbox: true` retain QuickJS/WASM isolation. The stable label is a distribution decision, not an independent security assessment or hostile multi-tenant readiness claim.
|
|
12
|
-
|
|
13
|
-
Release preparation now supports an explicit exit from alpha. Publication promotes the exact signed candidate archives, pins their manifest digest in immutable tags, checks actual npm installability, and updates the standalone starter to the published core version. Historical alpha versions and tags remain unchanged.
|
|
14
|
-
|
|
15
|
-
### admin-kit-only-console.md
|
|
16
|
-
|
|
17
|
-
**Breaking:** the console renders only through the urlcode-ui kit. `ui` is now a
|
|
18
|
-
required option of `adminExtension` and of `createAdministrationRuntime`'s
|
|
19
|
-
`admin` block, which is itself no longer optional.
|
|
20
|
-
|
|
21
|
-
`@jimhoyd/urlcode-ui` was already a required peer dependency, so nothing new has
|
|
22
|
-
to be installed. What changed is that the `ui` *extension* must now be supplied
|
|
23
|
-
and active: the primitive render path — the same `admin/*` templates rendered
|
|
24
|
-
through the shared primitives inside a console shell admin built itself — is
|
|
25
|
-
gone, along with the `RenderPath` seam, the `activeKit()` helper, the
|
|
26
|
-
`ScreenOptions.shell.sidebar` markup and `src/admin-presentation.ts`. The kit
|
|
27
|
-
builds the sidebar, page header and skip target from the `nav` items and account
|
|
28
|
-
`menu` admin supplies, so the console shell has one representation instead of
|
|
29
|
-
two. `ScreenOptions.preferences` is gone too: the kit layout now renders through
|
|
30
|
-
the same resolved presentation as the body, so the document's `lang` matches the
|
|
31
|
-
copy on the page.
|
|
32
|
-
|
|
33
|
-
Activation refuses up front, rather than failing per request in production, when
|
|
34
|
-
|
|
35
|
-
- `ui` is missing,
|
|
36
|
-
- `ui` is supplied but not active yet — declare `ui` before `admin` under
|
|
37
|
-
`extensions` in `urlcode.yaml`, since the runtime activates in declaration
|
|
38
|
-
order, and mount its assets route, or
|
|
39
|
-
- the kit was built without `adminUiTemplates`.
|
|
40
|
-
|
|
41
|
-
To migrate, build the extension with admin's templates and pass it:
|
|
42
|
-
|
|
43
|
-
```js
|
|
44
|
-
const ui = createUiExtension({projectSha256, projectRoot, sources: [authCatalogue], extensions: [authUiTemplates, adminUiTemplates]});
|
|
45
|
-
adminExtension({service, csrfKey, projectSha256, ui});
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Scaffolding emits that wiring for you: `scaffold()`, `initAdministration` and
|
|
49
|
-
`urlcode init --with ui,auth,admin` compose the kit and register the admin
|
|
50
|
-
templates with it. `ui` is now required, and must come before `admin`; the
|
|
51
|
-
scaffold refuses otherwise before writing anything.
|
|
52
|
-
|
|
53
|
-
### auth-kit-only-render.md
|
|
54
|
-
|
|
55
|
-
Breaking: the `ui` extension is now required. Every account screen renders through the `urlcode-ui` kit; the shared-primitive fallback is gone. `authExtension({ui, ...})` refuses activation when `ui` is absent or when the runtime has not activated it, naming the missing piece instead of failing per request. Declare `ui` before `auth` in `urlcode.yaml` (with its asset route) and list `ui.registration` before `authExtension` in the host: the runtime activates extensions in the order `urlcode.yaml` declares them. `@jimhoyd/urlcode-ui` was already a required peer dependency, so nothing new needs installing; what changes is that the extension must be supplied and active. `ScreenOptions.ui` is no longer optional and `screenObserver` no longer reports a render path.
|
|
56
|
-
|
|
57
|
-
Scaffolding composes the kit for you: `urlcode init --with ui,auth` and the standalone `initAuthentication` now write a project whose `urlcode.yaml` declares `ui` first and whose host passes it to `authExtension`. The scaffold refuses when `ui` is missing, or ordered after `auth`, before anything is written.
|
|
58
|
-
|
|
59
|
-
### auth-store-startup-diagnostics.md
|
|
60
|
-
|
|
61
|
-
Report which startup phase an auth store worker reached when its 15-second bound elapses, and reject at once when the worker fails or exits before reporting readiness instead of waiting the bound out. The status and code are unchanged; the detail is attached as the error's cause for operator logs and never reaches a response.
|
|
62
|
-
|
|
63
|
-
### pin-generated-site-dependencies.md
|
|
64
|
-
|
|
65
|
-
`urlcode-auth init` now writes a `package.json` that pins this package and each declared peer at the exact version installed beside it, instead of a manifest with no dependencies at all; `initAuthentication` returns those pins and names any peer it could not resolve. Nothing is installed: running `npm install` in the generated directory to produce a lockfile stays the operator's explicit step, and no upgrade command exists.
|
|
66
|
-
|
|
67
|
-
### ui-scaffold-peer-registration.md
|
|
68
|
-
|
|
69
|
-
The scaffold wires kit-rendering peers into the host it generates. `scaffold()` reads the composed `names` and emits `createUiExtension({..., sources: [authCatalogue], extensions: [authUiTemplates, adminUiTemplates]})`, importing each peer it needs, so `urlcode init --with ui,auth,admin` produces a project that activates. Previously it always wrote `sources: []` and no `extensions`, which left auth and admin without their copy and templates. `ui` alone still registers nothing and imports no peer.
|
|
70
|
-
|
|
71
|
-
Name `ui` first: the runtime activates extensions in the order `urlcode.yaml` declares them, core writes that file in `--with` order, and auth and admin both refuse to activate before the kit is active.
|
|
72
|
-
|
|
73
|
-
Publish to the npm `latest` channel in core → UI → auth → admin order after exact-commit CI and candidate verification. Existing tags and the `alpha` channel stay unchanged; this stable release advances `latest`. Changesets prerelease mode is exited. Update the standalone starter's exact core pin after registry installability is verified. This preparation is not evidence of publication or an independent security assessment.
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
# Release readiness
|
|
2
|
-
|
|
3
|
-
Status: `0.4.0-alpha.2` (`package.json`) alpha of the extension contract and
|
|
4
|
-
agent tooling on top of the `0.3.0` self-hosted release; `0.4.0-alpha.1` is the
|
|
5
|
-
most recent alpha actually published; the npm dist-tags for `@jimhoyd/urlcode`
|
|
6
|
-
were `latest` = `0.3.0` and `alpha` = `0.4.0-alpha.1` when checked against the
|
|
7
|
-
registry on 2026-09-19, so the repository's `0.4.0-alpha.2` is unpublished (see
|
|
8
|
-
"Packaging" below). Production approval remains specific to
|
|
9
|
-
the workload and deployment environment.
|
|
10
|
-
This register describes the current public runtime, not future promises.
|
|
11
|
-
Use the contract and docs from the same pinned commit as your installed runtime.
|
|
12
|
-
|
|
13
|
-
## What is aligned
|
|
14
|
-
|
|
15
|
-
- One portable YAML project, explicit includes, one handler per route (redirect, respond, page, static, download, function, proxy, conditional or extension),
|
|
16
|
-
per-route middleware and consistent request/response validation.
|
|
17
|
-
- One starter with a function route first and an ordinary redirect second.
|
|
18
|
-
Clone urlcode-template or use `urlcode init`; neither requires a database.
|
|
19
|
-
- Native handlers avoid user-code execution unless middleware is attached.
|
|
20
|
-
- Functions/middleware run trusted and unsandboxed by default (in-process,
|
|
21
|
-
full Node access); `sandbox: true` opts a route into isolated QuickJS/WASM
|
|
22
|
-
with no ambient filesystem, network or Node APIs (docs/SPIKE-DEFAULT-TRUST-MODEL.md).
|
|
23
|
-
Host bindings require external revision-pinned approval either way.
|
|
24
|
-
- The runtime is released under Apache-2.0.
|
|
25
|
-
|
|
26
|
-
## Regression evidence
|
|
27
|
-
|
|
28
|
-
`npm run verify` is the lint, syntax/schema-reference and unit/HTTP regression gate.
|
|
29
|
-
`npm run test:package` installs the packed artifact and exercises initialized apps,
|
|
30
|
-
route audits, bounded benchmarks and assets. On a push to `main`, CI runs Node
|
|
31
|
-
22/24/26 on Linux/macOS/Windows (nine combinations) and tests the container
|
|
32
|
-
under resource restrictions; a pull request runs the same Node versions on
|
|
33
|
-
Linux only (`.github/workflows/ci.yml`'s matrix), with the macOS/Windows legs
|
|
34
|
-
deferred to the post-merge run.
|
|
35
|
-
|
|
36
|
-
| Area | Covered behavior | Practical limit |
|
|
37
|
-
|---|---|---|
|
|
38
|
-
| Routing and HTTP | Exact/parameter/static precedence, methods, inputs, assets, middleware and response assertions | Stable 0.1 contract; unsupported semantics reject rather than emulate |
|
|
39
|
-
| Isolation | `sandbox: true` capability/permission boundaries, deadlines, memory and invalid outputs; the trusted default's grant scoping | Not an independent security assessment or multi-tenant service certification; trusted-route code safety is the project's own call |
|
|
40
|
-
| Overload | Function pool queue caps; HTTP admission saturation, separate bounded probe budget, health availability and recovery after upload completion/disconnect | 64 application requests default; no fairness, upstream DDoS protection or end-to-end deadline |
|
|
41
|
-
| Worker replacement | Repeated guest deadlines shed load and the pool returns to service after backoff, rather than latching off for the life of the process | Bounded by the configured worker count; no cross-process load balancing |
|
|
42
|
-
| Shutdown | New work rejects; repeated close shares completion | Existing deadlines can still fail during shutdown |
|
|
43
|
-
| Activation/recovery | Invalid reload retains last-good snapshot; corrupt revision metadata rejects activation | No deployment orchestration |
|
|
44
|
-
| Packaging | Packed installation and starter examples tested; sensitive files excluded | `0.3.0` and `0.4.0-alpha.1` are published to npm as `@jimhoyd/urlcode` (`latest` and `alpha` dist-tags respectively; dist-tags verified against the npm registry on 2026-09-19, when the repository stood at the unpublished `0.4.0-alpha.2`). Published extension packages on the same date: `@jimhoyd/urlcode-auth@0.1.0-alpha.2`, `@jimhoyd/urlcode-admin@0.1.0-alpha.2`, `@jimhoyd/urlcode-ui@0.1.0-alpha.4`. (`@jimhoyd/urlcode-short@0.1.0-alpha.1`, `@jimhoyd/urlcode-dynamic-link@0.1.0-alpha.1` and `@jimhoyd/urlcode-middleware@0.1.0-alpha.2` were also published on that date, then retired and unpublished later the same day; all three repositories were deleted. Middleware's withdrawal removed no capability — per-route middleware is native to core.) Observed in passing on that date: auth's dist-tags were split — `alpha` at `0.1.0-alpha.2` while `latest` lagged at `0.1.0-alpha.1`, so a plain `npm install @jimhoyd/urlcode-auth` resolved a build below admin's declared floor. That is resolved: auth and admin both read `latest` = `alpha` = `0.1.0-alpha.3`. `@jimhoyd/urlcode-ui` now carries a split of its own — `alpha` = `0.1.0-alpha.6`, `latest` = `0.1.0-alpha.5` — which is deliberate rather than drift, and safe only because admin's ui floor is exactly `>=0.1.0-alpha.5`. See [VERSION-ALIGNMENT.md](VERSION-ALIGNMENT.md). GitHub Releases attach a Homebrew formula (`urlcode.rb`) for manual copy into a tap, not an automated Homebrew Core/tap publish. No provider adapter guarantee. |
|
|
45
|
-
|
|
46
|
-
`npm run check:downstream-skills` is a manual, advisory report worth running
|
|
47
|
-
before a release: it diffs core's `.claude/skills/` copies against copies
|
|
48
|
-
vendored by downstream repositories (currently `urlcode-template`) when that
|
|
49
|
-
repository is cloned as a sibling checkout, and prints how many lines differ
|
|
50
|
-
per skill. It never fails and never asserts which side is correct -- a
|
|
51
|
-
downstream repo commonly pins an older published core version, and
|
|
52
|
-
divergence from core's current `main` can be the *correct* reflection of
|
|
53
|
-
that pin rather than staleness (see issue #155). It is not part of `check`
|
|
54
|
-
or `verify` because it depends on an out-of-repo sibling checkout that
|
|
55
|
-
normal CI does not have; it is a prompt to review the diff against the
|
|
56
|
-
downstream pin, not a pass/fail gate.
|
|
57
|
-
|
|
58
|
-
`npm audit --omit=dev` now runs in CI and fails the build on any runtime advisory;
|
|
59
|
-
development-only advisories are reported without blocking. Dependabot proposes npm,
|
|
60
|
-
GitHub Actions and base-image updates weekly. Actions and the container base image
|
|
61
|
-
are pinned by immutable SHA/digest, so a rebuild cannot silently change the runtime.
|
|
62
|
-
A passing audit is a dated check against known advisories, not proof of safety.
|
|
63
|
-
|
|
64
|
-
## Gates before production approval
|
|
65
|
-
|
|
66
|
-
These remain open. Record workload, runtime/app/image revisions, environment,
|
|
67
|
-
commands, results and owner for each exercise; do not convert a passing local
|
|
68
|
-
benchmark into a universal throughput claim.
|
|
69
|
-
|
|
70
|
-
1. Independent review of host/sandbox boundaries.
|
|
71
|
-
2. Sustained load and soak on intended hardware, through the actual TLS/proxy
|
|
72
|
-
path: successful throughput, tail latency, 503/504 rate, RSS and recovery.
|
|
73
|
-
`urlcode benchmark --target` measures a running deployment through its real
|
|
74
|
-
path and separates shed responses from transport errors; see
|
|
75
|
-
[load testing](LOAD-TESTING.md). The tool is GET/HEAD only and caps at 300
|
|
76
|
-
seconds, so it does not by itself close this gate.
|
|
77
|
-
Include mixed native/function workloads and slow peers.
|
|
78
|
-
3. Kill/restart, resource exhaustion and rolling deployment/rollback
|
|
79
|
-
exercises with the chosen supervisor and ingress. A future durable-state
|
|
80
|
-
extension needs its own backup/restore drill; core has no durable store.
|
|
81
|
-
4. Alerting and ownership for sustained errors, latency, readiness, dropped logs,
|
|
82
|
-
disk space, restarts and backups. Pick service objectives for the actual app.
|
|
83
|
-
5. Stable-release support commitments before packaging/public reuse claims.
|
|
84
|
-
Private security reporting and the current support baseline are documented in
|
|
85
|
-
SECURITY.md.
|
|
86
|
-
|
|
87
|
-
License selection is resolved: URLCode is released under the Apache License 2.0,
|
|
88
|
-
`package.json` declares it, and the repository carries the full license text.
|
|
89
|
-
The remaining gates above are engineering and operational, not legal.
|
|
90
|
-
|
|
91
|
-
The unreleased next-phase source now includes strict bulk/provider interchange,
|
|
92
|
-
local recipes, TypeScript authoring, bounded self-hosted proxy/signals and read-only
|
|
93
|
-
MCP. Local AWS/Vercel/Cloudflare adapter tests and deployment probe tooling exist,
|
|
94
|
-
but actual provider deployments remain unverified. Node process/container hosting
|
|
95
|
-
remains the reference execution target. Guest networking, durable signals and
|
|
96
|
-
realtime capabilities are not provided. See [implementation status](archive/2026-09-19/NEXT-PHASE-PLAN.md)
|
|
97
|
-
and [roadmap](../ROADMAP.md); these additions do not close the operational gates above.
|
|
98
|
-
|
|
99
|
-
The [internal security audit](SECURITY-AUDIT.md) records reproduced findings, fixes
|
|
100
|
-
and prioritized gaps. Its regressions supplement these gates; they do not replace
|
|
101
|
-
independent assessment or real deployment exercises.
|
|
102
|
-
|
|
103
|
-
## Hardening follow-up
|
|
104
|
-
|
|
105
|
-
Implemented: bounded YAML workers and aggregate source budgets, cooperative route
|
|
106
|
-
compilation deadline, scoped/expiring/revocable operator credentials for host
|
|
107
|
-
bindings, executable local/CI operational drills, and a main-only candidate
|
|
108
|
-
signing/SBOM workflow. The loopback-only management API and its atomic SQLite
|
|
109
|
-
mutation audits were part of the `link`/`dynamicLinks` store that PR #126
|
|
110
|
-
removed from core; that functionality moved to the `urlcode-dynamic-link`
|
|
111
|
-
extension (docs/EXTENSIONS.md), which was retired and unpublished on
|
|
112
|
-
2026-09-19. No supported stored-link package ships today, and this runtime does
|
|
113
|
-
not provide one: a project needing a durable link store owns it itself.
|
|
114
|
-
|
|
115
|
-
Still required: [independent review](SANDBOX-REVIEW.md), [actual deployment proof](OPERATIONAL-PROOF.md),
|
|
116
|
-
and publication/support arrangements. The Apache-2.0 license and the 0.3.0 self-hosted
|
|
117
|
-
release do not close the security and deployment gates. See [release process](RELEASE-SECURITY.md).
|