create-ailk 0.29.0 → 0.29.1
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/README.md +0 -5
- package/dist/lib/import-mdx.js +18 -9
- package/dist/topology.js +7 -0
- package/package.json +3 -3
- package/templates/apps/api/CLAUDE.md +1 -1
- package/versions.json +47 -47
package/README.md
CHANGED
|
@@ -592,11 +592,6 @@ command above. A site with no Admin, or a spoke, prints nothing about it. A
|
|
|
592
592
|
seed that fails or is refused at scaffold time prints why and never fails the
|
|
593
593
|
scaffold; `seed-workspace` is where a seed's result is an exit code.
|
|
594
594
|
|
|
595
|
-
On a site carrying `signal-collectors`, the two `ThankYouPage` seeds
|
|
596
|
-
`contact` and `newsletter` share an address (locale and slug) with the
|
|
597
|
-
`ContactPage` and `NewsletterSignup` pages, so those two are reported
|
|
598
|
-
`failed` and the seed exits 1 until one side's slug changes.
|
|
599
|
-
|
|
600
595
|
To check a seed:
|
|
601
596
|
|
|
602
597
|
```bash
|
package/dist/lib/import-mdx.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Reads a site's default-locale MDX pages through the site's own MDX adapter
|
|
5
5
|
* and writes each one as a `text/page` Artifact through the tenant-guarded
|
|
6
6
|
* workspace content routes. Per page (D3): read the draft; create on 404;
|
|
7
|
-
* PATCH under `
|
|
7
|
+
* PATCH under `X-Draft-Version` (#10264) when the content differs; write nothing when it is
|
|
8
8
|
* the same — so a second run over the same files creates nothing and reports
|
|
9
9
|
* every page `unchanged`. A file the adapter rejects is `failed` with its path
|
|
10
10
|
* and reason and the run goes on. The seed step (U6b) and `migrate-content`
|
|
@@ -204,7 +204,10 @@ async function call(t, method, url, body, ifMatch) {
|
|
|
204
204
|
headers: {
|
|
205
205
|
authorization: `Bearer ${t.key}`,
|
|
206
206
|
...(body !== undefined && { "content-type": "application/json" }),
|
|
207
|
-
|
|
207
|
+
// #10264 — the version rides `x-draft-version`; `if-match` rides
|
|
208
|
+
// beside it for one release so this importer still saves against an
|
|
209
|
+
// API that predates the new header (the route prefers the new one).
|
|
210
|
+
...(ifMatch !== undefined && { "x-draft-version": ifMatch, "if-match": ifMatch }),
|
|
208
211
|
},
|
|
209
212
|
...(body !== undefined && { body: JSON.stringify(body) }),
|
|
210
213
|
// A redirect would re-send the key and the body to another URL.
|
|
@@ -304,9 +307,12 @@ async function writePage(t, page, locale, content) {
|
|
|
304
307
|
if (created.status === 201) {
|
|
305
308
|
return wrongLocale(path, created, locale) ?? done("created");
|
|
306
309
|
}
|
|
307
|
-
// 409:
|
|
308
|
-
|
|
310
|
+
// 409 slug_taken: another type holds this page's registry link (#10268
|
|
311
|
+
// D5) — reported as it is, since a re-read at this address finds nothing.
|
|
312
|
+
// Any other 409: created by someone else since the read — read it once more.
|
|
313
|
+
if (created.status !== 409 || created.code === "slug_taken") {
|
|
309
314
|
return refusedAnswer(path, created);
|
|
315
|
+
}
|
|
310
316
|
}
|
|
311
317
|
}
|
|
312
318
|
// ── The report (D6) ─────────────────────────────────────────────────────────
|
|
@@ -348,21 +354,24 @@ export async function importMdx(opts) {
|
|
|
348
354
|
outcomes.push(outcome);
|
|
349
355
|
onLine(outcomeLine(outcome));
|
|
350
356
|
};
|
|
351
|
-
// Two pages at one (locale, slug) address would overwrite each other
|
|
352
|
-
// every run
|
|
357
|
+
// Two pages at one (locale, type, slug) address would overwrite each other
|
|
358
|
+
// on every run — the legacy and the locale-tree copy of one page — so the
|
|
359
|
+
// first in processing order wins and the rest fail. Two pages of different
|
|
360
|
+
// types may share a slug (#10268 D7): the store addresses by type too.
|
|
353
361
|
const addresses = new Map();
|
|
354
362
|
let halt;
|
|
355
363
|
for (const page of pages) {
|
|
356
|
-
const
|
|
364
|
+
const address = `${page.type}/${page.slug}`;
|
|
365
|
+
const holder = addresses.get(address);
|
|
357
366
|
if (holder !== undefined) {
|
|
358
367
|
record({
|
|
359
368
|
path: page.path,
|
|
360
369
|
result: "failed",
|
|
361
|
-
reason: `same address as ${holder} (a page is addressed by locale and slug)`,
|
|
370
|
+
reason: `same address as ${holder} (a page is addressed by locale, type and slug)`,
|
|
362
371
|
});
|
|
363
372
|
continue;
|
|
364
373
|
}
|
|
365
|
-
addresses.set(
|
|
374
|
+
addresses.set(address, page.path);
|
|
366
375
|
if (halt !== undefined) {
|
|
367
376
|
record({ path: page.path, result: "failed", reason: halt });
|
|
368
377
|
continue;
|
package/dist/topology.js
CHANGED
|
@@ -949,6 +949,13 @@ export function renderSpokeHardFloors(opts) {
|
|
|
949
949
|
" # Stripe webhook route, the checkout route, its price map and its e2e",
|
|
950
950
|
" # workflow, and the sign-in paths are floored so their arrival here is a",
|
|
951
951
|
" # human merge.",
|
|
952
|
+
" # Provenance (claude-setup#11353, claude-setup PR #11367): a `paths:` floor",
|
|
953
|
+
" # below fires only when the touched file is site-edited or not template-owned.",
|
|
954
|
+
" # A file whose PR-head bytes match its `.ailk-template-files.json` row AND the",
|
|
955
|
+
" # published create-ailk template at that row's version is exempt, so a",
|
|
956
|
+
" # `create-ailk update` that moves a template-owned file merges unattended.",
|
|
957
|
+
" # Never for a high-cost floor (security_settings, payments), never to an older",
|
|
958
|
+
" # template version, and only while the record already exists on main.",
|
|
952
959
|
" - kind: pricing",
|
|
953
960
|
" - kind: stripe_live_mode",
|
|
954
961
|
" - paths:",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-ailk",
|
|
3
|
-
"version": "0.29.
|
|
3
|
+
"version": "0.29.1",
|
|
4
4
|
"description": "Scaffolder for AI Launch Kit — `pnpm create ailk@latest <dir>` produces a starter repo consuming @working-theory/* from npm (per ADR 0007).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"tar": "^7.5.21"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@working-theory/schema": "0.
|
|
32
|
-
"@working-theory/templates": "0.
|
|
31
|
+
"@working-theory/schema": "0.52.0",
|
|
32
|
+
"@working-theory/templates": "0.52.0"
|
|
33
33
|
},
|
|
34
34
|
"repository": {
|
|
35
35
|
"type": "git",
|
|
@@ -93,7 +93,7 @@ Routes are versioned under `/v1/*`:
|
|
|
93
93
|
- `/v1/workspaces/:workspaceId/members` (GET) — the org's member roster (`userId`, `name`, `email`, `role`), the Pro `workspace` module's Team tab (#5371). Read-only by design: granting a Membership is the invite flow, which is its own spec with a mandatory security review (§2.3), so no POST/PUT/DELETE is routed at this path. Scoped to `request.tenant.organizationId` — Membership is org-level — server-resolved from the validated session. Role floor: `members-read` (owner, admin — `@working-theory/validation`'s permission table (#7636 D2)): the roster carries every member's email, and who the other members are is not a member's job. No MCP twin — identity-bound tenant route (#3591 exception).
|
|
94
94
|
- `GET /v1/workspaces/:workspaceId/knowledge` — the workspace knowledge read (#9683, spec `docs/specs/9683-agent-session-audit-knowledge-spec.md`; `packages-paid/api-workspace/src/routes/workspaces/knowledge.ts`, `// oss: false`): what the business offers, runs and serves, as `workspaceKnowledgeSchema` — `offerings` (the shown offering set, only while the commerce claim is held), `magnets` (the newest flows page's `live` rows), `meetingTypes` (the enabled slugs minus `privateSlugs`, titled by slug), `sitesServed` (the installed hub's live spokes for this workspace, read only when the hub's own gate answers `claimed`, through the optional `HubRegistry.listLiveSpokesForWorkspace`) and `strategyDocs` (`lib/strategy-docs.ts`, `[]` until a store exists) — every key always present, each entry an id, a title and a summary (`null` when it fails its check; an entry whose id or title fails is skipped and counted). Takes no query. Gate: `allows(people-read) || allows(people-memory-propose)` — a person member holds both; an agent only by grant. Every authenticated call writes one `workspace.knowledge.read` audit row (counts only; an agent's carries its session, thread `workspace:<workspaceId>`); `Cache-Control: private, no-store`. Same registration scope as the routes above (`workspace || multi-tenant`, `tenant:settings`). MCP twin: `get_workspace_knowledge` on `/mcp/workspace`.
|
|
95
95
|
- `/v1/workspaces/:workspaceId/agents` (GET `?userId=`, POST), `/v1/workspaces/:workspaceId/agents/:agentId/key` (POST), `/v1/workspaces/:workspaceId/agents/:agentId` (PATCH `{ enabled }`), `PUT /v1/workspaces/:workspaceId/agents/:agentId/grants` (`{ grants }`, #7864), and `/v1/agent/context` (GET) — the agent seat (#3591, `src/routes/workspaces/agents.ts` over `src/lib/agent-store.ts`, `// oss: false`). An agent is a stored delegate of one person, bound to one workspace. The five management routes refuse an agent caller outright (403), check `agents-manage` (owner, admin) before any read, and scope every read and write to `tenant.organizationId`, never a body or query value; an agent of another organization is the same 404 as a missing one. Create returns 201 with the key shown once; re-key returns the new key once. Each successful create, re-key, switch and grant change writes an `agents.*` audit record. **Grants (#7864, `docs/specs/7864-agent-key-grants-spec.md`).** An agent acts at `member`, plus any of nine permissions an owner or admin granted it one by one — `content-edit`, `content-publish`, `assets-write`, `magnets-manage`, `meeting-types-manage`, `people-read` since #852, `member-pieces-manage` since #7878, and `people-memory-propose` and `inbox-act` since #9679 (`@working-theory/validation`'s `AGENT_GRANTABLE_PERMISSIONS`, held to that set by the `agents_grants_allowed` CHECK). The grant PUT replaces the whole set (an empty list removes every grant) and refuses a grant the agent's person's own role does not hold, `409 grant_exceeds_person`. The clamp is one function both tenant guards call (`services/default-tenant.ts`'s `agentTenant`): an agent holds a stored grant only while its person's role holds it, so a demoted person's agent keeps the row but not the permission. The routes for the nine check `allows(tenant, "<permission>")`, which reads the grants — except that the six existing inbox `inbox-act` checks still read `can(tenant.role, …)` until #9686 moves them, and `people-memory-propose` is read today only by the workspace knowledge read (#9683, beside `people-read`); every other check keeps `can(tenant.role, …)`, so no other owner or admin permission is reachable. Every agent write on content, assets and meeting types writes one `recordAgentWrite` row naming the agent and its person (magnets already did); a person's writes there stay unaudited. The member-area writes audit every caller through `recordAuditAction`, whose actor names an agent as the agent. No grant raises the ceiling. `/v1/agent/context` is the agent's own read, unchanged by grants, and needs no permission beyond the workspace guard. Same registration scope as the routes above (`workspace || multi-tenant`).
|
|
96
|
-
- `/v1/workspaces/:workspaceId/content` (GET, POST), `/v1/workspaces/:workspaceId/content/:type/:slug` (GET, PATCH), `/v1/workspaces/:workspaceId/content/:type/:slug/{publish,unpublish}` (POST) — the tenant-guarded content editor's write surface (#5853, `src/routes/workspaces/content.ts`): list, create, read/save the draft tip (under `If-Match`), and publish/unpublish, all over `Artifact`/`ArtifactVersion`. `:type` is validated against the page-type registry (`z.enum(SCHEMA_ORG_TYPES)`) rather than accepted as a free string on every addressed operation — an unregistered type is a 400 before any lookup, since it is echoed back and passed to `notifyRevalidate` as the site's cache tag. Role floors from `@working-theory/validation`'s permission table (#7636 D2): publish and unpublish need `content-publish`, and create, read and save need `content-edit` (both owner, admin — an admin builds, a member operates). The list serves `content-edit` the editor's full view and a caller holding only `docs-read` (a member) a published-only projection (D4): draft rows dropped, every row `status: "published"`, `version: null`, `valid: true`, and a `published_with_draft` page's `type`/`tags` read from its PUBLISHED version — applied before every filter, so a member's `?status=draft` or a draft tip's `?tag=` matches nothing. **The GET list is a UNION of page artifacts and DOCUMENT assets** (#6093, D1/D9 — "one store, two views"): every row carries `tags: string[]` (never null, read from the draft tip's stored content for a page, from `Asset.tags` for a file) and a DERIVED `kind: "page" | "post" | "file"` (`BlogPosting` alone maps to `"post"`; an asset row is always `"file"`) — an optional `?tag=<slug>` filters the union AFTER it is built, so a file is returned under either its own tag or a shared one. The asset half of the union (`DOCUMENT_CONTENT_TYPES`, i.e. `application/pdf`) is skipped entirely when `locale`/`type` is supplied or `status` names anything but `"published"`, since a file row can never satisfy those. A foreign `:workspaceId` costs zero artifact **and** zero asset queries. No MCP twin — identity-bound tenant routes (#3591 exception, same shape as the sibling `/v1/workspaces/*` routes).
|
|
96
|
+
- `/v1/workspaces/:workspaceId/content` (GET, POST), `/v1/workspaces/:workspaceId/content/:type/:slug` (GET, PATCH), `/v1/workspaces/:workspaceId/content/:type/:slug/{publish,unpublish}` (POST) — the tenant-guarded content editor's write surface (#5853, `src/routes/workspaces/content.ts`): list, create, read/save the draft tip (under `X-Draft-Version`; `If-Match` still accepted for one release, #10264), and publish/unpublish, all over `Artifact`/`ArtifactVersion`. `:type` is validated against the page-type registry (`z.enum(SCHEMA_ORG_TYPES)`) rather than accepted as a free string on every addressed operation — an unregistered type is a 400 before any lookup, since it is echoed back and passed to `notifyRevalidate` as the site's cache tag. Role floors from `@working-theory/validation`'s permission table (#7636 D2): publish and unpublish need `content-publish`, and create, read and save need `content-edit` (both owner, admin — an admin builds, a member operates). The list serves `content-edit` the editor's full view and a caller holding only `docs-read` (a member) a published-only projection (D4): draft rows dropped, every row `status: "published"`, `version: null`, `valid: true`, and a `published_with_draft` page's `type`/`tags` read from its PUBLISHED version — applied before every filter, so a member's `?status=draft` or a draft tip's `?tag=` matches nothing. **The GET list is a UNION of page artifacts and DOCUMENT assets** (#6093, D1/D9 — "one store, two views"): every row carries `tags: string[]` (never null, read from the draft tip's stored content for a page, from `Asset.tags` for a file) and a DERIVED `kind: "page" | "post" | "file"` (`BlogPosting` alone maps to `"post"`; an asset row is always `"file"`) — an optional `?tag=<slug>` filters the union AFTER it is built, so a file is returned under either its own tag or a shared one. The asset half of the union (`DOCUMENT_CONTENT_TYPES`, i.e. `application/pdf`) is skipped entirely when `locale`/`type` is supplied or `status` names anything but `"published"`, since a file row can never satisfy those. A foreign `:workspaceId` costs zero artifact **and** zero asset queries. No MCP twin — identity-bound tenant routes (#3591 exception, same shape as the sibling `/v1/workspaces/*` routes).
|
|
97
97
|
- `/v1/workspaces/:workspaceId/assets` (GET, POST), `/v1/workspaces/:workspaceId/assets/:assetId` (PATCH, DELETE), `/v1/assets/:assetId` (GET, public/anonymous) — the workspace asset store (#5854 upload/read; #6093 list/PATCH/DELETE, `src/routes/assets/{index,upload,read,manage}.ts`). Upload accepts an allowlisted union of three named classes (`src/routes/assets/index.ts`): five RASTER images (`image/png`, `image/jpeg`, `image/gif`, `image/webp`, `image/avif`), one VECTOR image (`image/svg+xml`, admitted under the operator's 2026-09-18 `allow-svg-assets` ruling — issue #6093 comment `5731573595` — superseding #5854's original SVG exclusion) and one DOCUMENT type (`application/pdf`), all under the existing 20 MB cap; `?tags=<slug>[,<slug>…]` stores tags on the row. The public read serves a RASTER type `inline` exactly as before; every OTHER admitted type (SVG, PDF) is served `attachment`, with the filename's extension pinned to the stored content type (closing extension spoofing) and a five-directive `Content-Security-Policy` (`default-src 'none'; sandbox; frame-ancestors 'none'; form-action 'none'; base-uri 'none'`) that makes the bytes never a document on this origin — this is what makes admitting SVG safe with NO server-side sanitizer. `GET …/assets` (`assets-read` — every role, a member included) lists a workspace's assets, metadata only, never `bytes`, with an optional `?tag=<slug>` filter; this is what narrows the store's prior "nothing lists assets" premise to its precise form — no ANONYMOUS and no CROSS-TENANT enumeration, both still true. `PATCH …/assets/:assetId` updates `title`/`description`/`tags` (`assets-write`, owner and admin, the upload's permission too; `null` clears a text field to SQL `NULL`, `""` stores empty; the asset's `id` and public URL are untouched). `DELETE …/assets/:assetId` (`assets-write`) removes the row and the bytes at the ORIGIN only — already-cached copies elsewhere are not recallable under the year-long `immutable` promise, and no reference check protects a page that still embeds the URL; absent and foreign ids both take the same 404. Every tenant route here is identity-bound; no MCP twin (#3591 exception). The public read has no MCP twin either — it serves bytes to an `<img>`/download, the same boundary `upload.ts` records for its own sibling. **A client's file is never in the library's public life (#7877 D18):** the default `GET …/assets` listing leaves out every asset tagged `private` — only `?tag=private` lists them (the Admin's Compose) — and the public read answers its uniform 404 for an asset tagged `private`, attached to any member-area message, or (#8171 D3) named by a delivered piece version (one `pieceVersion.count`, since the tag can be removed after delivery), so such a file's bytes are served only by its owner's member reads.
|
|
98
98
|
- `/v1/subscription/me` (GET) — `?include=billing` (#8171 D7), from a cookie session only, adds the optional `planName` and `paymentMethod` (brand, last four, expiry) read from Stripe through `lib/stripe.ts`'s `readCustomerBillingSummary` for the caller's own resolved customer: cached per customer for 60 s (a failure too), one read in flight per customer, bounded at 3 s; a failure leaves both keys absent, a value outside the schema's bounds is `null`, and no id is served or logged. A bearer token, another value or none answers exactly as before.
|
|
99
99
|
- `/v1/billing` (GET), `/v1/billing/portal-session` (POST) — org-scoped billing read + Stripe customer-portal session creation. The read stays open to every member (the Admin's plan gate reads it); the portal needs `billing-manage` — the owner alone (`@working-theory/validation`'s permission table (#7636 D2); an admin is refused before any Stripe call). `/v1/billing/usage` (GET) needs `billing-read` (owner, admin). **The read's `commerce` field (#8907 D14)** is the deployment's commerce claim, `claimed | unclaimed | undetermined` (`resolveCommerceClaim()`; a rejected read is `undetermined` and the answer stays `200`) — what the Admin's Billing card reads (#8908 D10). **`?include=billing` (#9067 D1)** — exactly that string, never an array — adds `details` only for a caller holding `billing-manage` (the owner; an agent never qualifies): `licenseExpiresAt` (`checkLicense().expiresAt`, `null` on a failed read) always, and for an Organization with a Stripe customer `renewsAt` (the current subscription's first item's `current_period_end`, only while it will renew), `sites` (its quantity) and `paymentMethod` (brand, last four, expiry), read through `lib/stripe.ts`'s `readCustomerBillingSummary` by `services/entitlements.ts`'s `readOrgBillingSummary` — cached per customer for 60 s (a failure too), one read in flight per customer, bounded at 3 s; a failure answers `details: { licenseExpiresAt }` and still `200`, a value outside `orgBillingDetailsSchema`'s bounds is `null`, no id is served or logged, and the reply carries `Cache-Control: private, no-store`. Every other request is answered exactly as before, with no Stripe or licence read. **`POST /v1/billing/plan-checkout` (#9067 D3, `routes/billing/plan-checkout.ts`)** is the Billing tab's Purchase plan: a subscription Checkout for the caller's own Organization's plan (`planPurchaseLookupKey` — `ailk-pro_monthly` / `ailk-pro-plus_monthly`, `PLAN_PURCHASE_LOOKUP_KEYS` built by the Offerings lookup-key grammar, #9338 DD1), sandbox-only like the portal. **It sells only an Offerings plan (#9338 DD4):** `createCheckoutSession` gets a `refuseProduct` that refuses every Product whose `metadata.ailk_group` is not exactly `plan` (`isOfferingsPlanProduct`, `services/offerings/catalog.ts`), checked on the same expanded Price it sells; a refused or unexpanded Product answers `500 plan_price_missing`. Check order: tenant → `billing-manage` (403 before any lookup) → write budget (`chargeWriteBudget` scope `plancheckout`, 10 an hour per Organization and per person, `429` with `Retry-After`) → the commerce claim (`409 purchase_unavailable`, `503 license_undetermined`) → a strict `{ returnUrl }` (`bodyLimit` 4 KiB, `400 validation_failed`) → the return URL (canonical, no userinfo, query, fragment or `//` path, `https:` or a local `http:`, on `config.TRUSTED_ORIGINS`; `400 return_url_refused`, `500 config-error` when none is trusted) → no customer yet (`409 billing_customer_exists`) and a purchasable tier (`409 plan_not_purchasable`) → `STRIPE_SECRET_KEY` and `assertSandboxKey` → one payable session (an open earlier one is expired first, a completed one is `409 purchase_pending`) → `createCheckoutSession` with `mode: "subscription"`, 1–50 sites, `metadata` and `subscriptionMetadata` `{ organizationId, ...siteStamp() }` and `PLATFORM_TERMS_OF_SERVICE`, never a `buyer` → a Checkout URL only → the session id recorded on `Organization.planCheckoutSessionId` by compare-and-set (a lost race or a failed write expires the new session). It answers `{ url }` with `Cache-Control: private, no-store`; no body or log line carries the return URL, an id or a Stripe message. **The webhook's Organization arm binds only that recorded session (#9067 D13):** a `checkout.session.completed` with `metadata.organizationId` links `session.customer` through one guarded `updateMany` on `{ id, planCheckoutSessionId: session.id, billingCustomerId: null }` (clearing the session); anything else — an unrecorded session, a bound customer, every `customer.created` — writes nothing and logs `org_bind_unproven`. No MCP twin for the purchase — owner-only, recorded in `tests/parity/README.md`.
|
package/versions.json
CHANGED
|
@@ -1,66 +1,66 @@
|
|
|
1
1
|
{
|
|
2
|
-
"@working-theory/admin-ui": "0.
|
|
3
|
-
"@working-theory/aeo": "0.
|
|
4
|
-
"@working-theory/agent-context": "0.
|
|
2
|
+
"@working-theory/admin-ui": "0.52.0",
|
|
3
|
+
"@working-theory/aeo": "0.52.0",
|
|
4
|
+
"@working-theory/agent-context": "0.52.0",
|
|
5
5
|
"@working-theory/agent-contract": "0.1.0",
|
|
6
6
|
"@working-theory/agent-memory": "0.0.0",
|
|
7
7
|
"@working-theory/ai": "0.1.0",
|
|
8
|
-
"@working-theory/analytics": "0.
|
|
9
|
-
"@working-theory/api": "0.
|
|
10
|
-
"@working-theory/api-client": "0.
|
|
8
|
+
"@working-theory/analytics": "0.52.0",
|
|
9
|
+
"@working-theory/api": "0.52.0",
|
|
10
|
+
"@working-theory/api-client": "0.52.0",
|
|
11
11
|
"@working-theory/cda-filesystem": "0.0.0",
|
|
12
|
-
"@working-theory/cli": "0.
|
|
13
|
-
"@working-theory/common": "0.
|
|
12
|
+
"@working-theory/cli": "0.52.0",
|
|
13
|
+
"@working-theory/common": "0.52.0",
|
|
14
14
|
"@working-theory/consent": "0.1.0",
|
|
15
|
-
"@working-theory/content-adapters": "0.
|
|
16
|
-
"@working-theory/content-projection": "0.
|
|
17
|
-
"@working-theory/email": "0.
|
|
15
|
+
"@working-theory/content-adapters": "0.52.0",
|
|
16
|
+
"@working-theory/content-projection": "0.52.0",
|
|
17
|
+
"@working-theory/email": "0.52.0",
|
|
18
18
|
"@working-theory/env": "0.0.0",
|
|
19
|
-
"@working-theory/eslint-config": "0.
|
|
20
|
-
"@working-theory/fumadocs-schema": "0.
|
|
19
|
+
"@working-theory/eslint-config": "0.52.0",
|
|
20
|
+
"@working-theory/fumadocs-schema": "0.52.0",
|
|
21
21
|
"@working-theory/ids": "0.17.0",
|
|
22
|
-
"@working-theory/jsonld": "0.
|
|
23
|
-
"@working-theory/license": "0.
|
|
24
|
-
"@working-theory/mcp-server": "0.
|
|
25
|
-
"@working-theory/metadata": "0.
|
|
26
|
-
"@working-theory/observability": "0.
|
|
27
|
-
"@working-theory/page-renderer": "0.
|
|
22
|
+
"@working-theory/jsonld": "0.52.0",
|
|
23
|
+
"@working-theory/license": "0.52.0",
|
|
24
|
+
"@working-theory/mcp-server": "0.52.0",
|
|
25
|
+
"@working-theory/metadata": "0.52.0",
|
|
26
|
+
"@working-theory/observability": "0.52.0",
|
|
27
|
+
"@working-theory/page-renderer": "0.52.0",
|
|
28
28
|
"@working-theory/plugin-mcp": "0.1.3",
|
|
29
|
-
"@working-theory/schema": "0.
|
|
30
|
-
"@working-theory/schema-pack-registry": "0.
|
|
31
|
-
"@working-theory/schema-validator": "0.
|
|
32
|
-
"@working-theory/sections-registry": "0.
|
|
33
|
-
"@working-theory/site-config": "0.
|
|
34
|
-
"@working-theory/spoke-checkout": "0.7.
|
|
35
|
-
"@working-theory/stripe-client": "0.
|
|
36
|
-
"@working-theory/templates": "0.
|
|
37
|
-
"@working-theory/theme": "0.
|
|
38
|
-
"@working-theory/ui": "0.
|
|
39
|
-
"@working-theory/validation": "0.
|
|
40
|
-
"@working-theory/web-i18n": "0.
|
|
41
|
-
"@working-theory/admin": "0.8.
|
|
42
|
-
"@working-theory/api-commerce": "0.1.
|
|
43
|
-
"@working-theory/api-content-write": "0.
|
|
44
|
-
"@working-theory/api-hub": "0.3.
|
|
45
|
-
"@working-theory/api-multi-tenant": "0.2.
|
|
46
|
-
"@working-theory/api-scheduling": "0.4.
|
|
47
|
-
"@working-theory/api-signal-collectors": "0.2.
|
|
48
|
-
"@working-theory/api-workspace": "0.3.
|
|
29
|
+
"@working-theory/schema": "0.52.0",
|
|
30
|
+
"@working-theory/schema-pack-registry": "0.52.0",
|
|
31
|
+
"@working-theory/schema-validator": "0.52.0",
|
|
32
|
+
"@working-theory/sections-registry": "0.52.0",
|
|
33
|
+
"@working-theory/site-config": "0.52.0",
|
|
34
|
+
"@working-theory/spoke-checkout": "0.7.8",
|
|
35
|
+
"@working-theory/stripe-client": "0.52.0",
|
|
36
|
+
"@working-theory/templates": "0.52.0",
|
|
37
|
+
"@working-theory/theme": "0.52.0",
|
|
38
|
+
"@working-theory/ui": "0.52.0",
|
|
39
|
+
"@working-theory/validation": "0.52.0",
|
|
40
|
+
"@working-theory/web-i18n": "0.52.0",
|
|
41
|
+
"@working-theory/admin": "0.8.1",
|
|
42
|
+
"@working-theory/api-commerce": "0.1.6",
|
|
43
|
+
"@working-theory/api-content-write": "0.3.0",
|
|
44
|
+
"@working-theory/api-hub": "0.3.3",
|
|
45
|
+
"@working-theory/api-multi-tenant": "0.2.1",
|
|
46
|
+
"@working-theory/api-scheduling": "0.4.3",
|
|
47
|
+
"@working-theory/api-signal-collectors": "0.2.5",
|
|
48
|
+
"@working-theory/api-workspace": "0.3.2",
|
|
49
49
|
"@working-theory/billing-client": "0.0.0",
|
|
50
50
|
"@working-theory/branding": "0.0.0",
|
|
51
51
|
"@working-theory/license-client": "0.0.0",
|
|
52
52
|
"@working-theory/license-manifest": "0.0.0",
|
|
53
|
-
"@working-theory/mcp-scheduling": "0.3.
|
|
54
|
-
"@working-theory/mcp-signal-collectors": "0.2.
|
|
55
|
-
"@working-theory/mcp-workspace": "0.4.
|
|
53
|
+
"@working-theory/mcp-scheduling": "0.3.5",
|
|
54
|
+
"@working-theory/mcp-signal-collectors": "0.2.6",
|
|
55
|
+
"@working-theory/mcp-workspace": "0.4.1",
|
|
56
56
|
"@working-theory/partner-session": "0.0.0",
|
|
57
57
|
"@working-theory/preview-protocol": "0.0.0",
|
|
58
|
-
"@working-theory/ui-commerce": "0.23.
|
|
59
|
-
"@working-theory/ui-docs-blog": "0.23.
|
|
60
|
-
"@working-theory/ui-scheduling": "0.25.
|
|
61
|
-
"@working-theory/ui-signal-collectors": "0.27.
|
|
58
|
+
"@working-theory/ui-commerce": "0.23.30",
|
|
59
|
+
"@working-theory/ui-docs-blog": "0.23.30",
|
|
60
|
+
"@working-theory/ui-scheduling": "0.25.4",
|
|
61
|
+
"@working-theory/ui-signal-collectors": "0.27.8",
|
|
62
62
|
"@working-theory/web": "0.0.0",
|
|
63
63
|
"@working-theory/app-api": "1.0.0",
|
|
64
64
|
"@working-theory/mcp": "0.0.0",
|
|
65
|
-
"@working-theory/database": "0.
|
|
65
|
+
"@working-theory/database": "0.52.0"
|
|
66
66
|
}
|