UNPKG

@eristack/ai-knowledge

Version:

Eristack knowledge pack for AI agents: recommend packages first, load the right Intent skills, and keep catalog facts in sync

1 lines 116 kB
{"version":3,"sources":["../src/index.ts","../src/generated/catalog.ts","../src/generated/local-skills.ts","../src/generated/recipes.ts","../src/recommend.ts"],"sourcesContent":["export {\n  getCatalog,\n  listPackages,\n  listRecipes,\n  listSkills,\n  loadPlan,\n  recommend,\n} from \"./recommend.js\";\n\nexport type {\n  CatalogPackage,\n  CatalogSkill,\n  KnowledgeCatalog,\n  LoadPlan,\n  LoadPlanStep,\n  RecommendationMatch,\n  RecommendationResult,\n  Recipe,\n  RecipePackageRef,\n} from \"./types.js\";\n","// AUTO-GENERATED — run pnpm --filter @eristack/ai-knowledge sync\n// Do not edit by hand.\n\nimport type { KnowledgeCatalog } from \"../types.js\";\n\nexport const catalog = {\n  \"generatedAt\": \"2026-08-29T09:58:29.257Z\",\n  \"packages\": [\n    {\n      \"name\": \"@eristack/abac\",\n      \"version\": \"0.2.3\",\n      \"description\": \"Attribute-based access control for Eristack: policy functions over subject/resource/environment attributes\",\n      \"slug\": \"abac\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"express\",\n        \"nest\",\n        \"react\",\n        \"testing\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"abac-adapters\",\n          \"name\": \"abac-adapters\",\n          \"packageName\": \"@eristack/abac\",\n          \"description\": \"@eristack/abac adapters: express createRequirePolicy, nest AbacModule + AbacGuard + RequirePolicy + AbacContextFactory, react usePolicy. Use when wiring attribute policy checks into HTTP/UI shells.\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/abac#abac-adapters\"\n        },\n        {\n          \"id\": \"abac-core\",\n          \"name\": \"abac-core\",\n          \"packageName\": \"@eristack/abac\",\n          \"description\": \"Pure @eristack/abac: createAbac, registerPolicy, evaluate/authorize, attrs helpers — attribute-based policies (algorithms with arguments → boolean). Use for per-user limits and scopes (e.g. max book value) beyond boolean RBAC.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/abac#abac-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/address\",\n      \"version\": \"0.1.1\",\n      \"description\": \"Normalized postal addresses with ISO country codes — string fields, no geocoding\",\n      \"slug\": \"address\",\n      \"adapters\": [\n        \"zod\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"address-core\",\n          \"name\": \"address-core\",\n          \"packageName\": \"@eristack/address\",\n          \"description\": \"@eristack/address normalized PostalAddress with ISO alpha-2 country codes — trim, formatAddressOneLine/Lines, isSameCountry. App owns partner tables; no geocoding.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/address#address-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/ai-dev\",\n      \"version\": \"0.1.2\",\n      \"description\": \"Unified agent-first dev tooling for Eristack monorepos: plan (token-minimal), check profiles, sync, compact JSON + MCP\",\n      \"slug\": \"ai-dev\",\n      \"adapters\": [\n        \"repo\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"ai-dev-core\",\n          \"name\": \"ai-dev-core\",\n          \"packageName\": \"@eristack/ai-dev\",\n          \"description\": \"@eristack/ai-dev unified monorepo tooling: eristack plan (token-minimal), eristack check profiles (catalog/pr/full = CI), sync docs/knowledge, MCP dev_plan/dev_check. Use before ad-hoc pnpm script chains or reading every check doc.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-dev#ai-dev-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/ai-ticket-generator\",\n      \"version\": \"0.1.2\",\n      \"description\": \"Generate portable maintainer tickets (bugs + suggestions) for every @eristack package — logs, scenario, fix plan, and agent-ready handoff files\",\n      \"slug\": \"ai-ticket-generator\",\n      \"adapters\": [],\n      \"skills\": [\n        {\n          \"id\": \"ai-ticket-bug\",\n          \"name\": \"ai-ticket-bug\",\n          \"packageName\": \"@eristack/ai-ticket-generator\",\n          \"description\": \"Generate a portable @eristack bug ticket (logs, scenario, repro, fix plan, agent handoff) as a markdown file the user can send to maintainers. Use when a consumer hits a package bug or wants a fixer-upper file for support.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-ticket-generator#ai-ticket-bug\"\n        },\n        {\n          \"id\": \"ai-ticket-suggest\",\n          \"name\": \"ai-ticket-suggest\",\n          \"packageName\": \"@eristack/ai-ticket-generator\",\n          \"description\": \"Turn a user feature idea into a portable @eristack suggestion ticket with feasibility (possible/partial/unlikely/needs-decision) and an implementation sketch for maintainers/agents. Use when a consumer proposes a change.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-ticket-generator#ai-ticket-suggest\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/ai-workflow\",\n      \"version\": \"0.1.2\",\n      \"description\": \"Local-first AI workflow for Eristack projects: MCP server, FTS+vector index, backlog/sprint/ADR artifacts — low-token agent tools that do not replace existing editors or Intent\",\n      \"slug\": \"ai-workflow\",\n      \"adapters\": [],\n      \"skills\": [\n        {\n          \"id\": \"ai-workflow-core\",\n          \"name\": \"ai-workflow-core\",\n          \"packageName\": \"@eristack/ai-workflow\",\n          \"description\": \"Local-first @eristack/ai-workflow: .eristack/workflow backlog/sprints/ADR/summary, FTS+vector index, low-token search discipline. Use when scaffolding AI-native project memory or sprint cadence without replacing Intent, git, or editors.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-workflow#ai-workflow-core\"\n        },\n        {\n          \"id\": \"ai-workflow-mcp\",\n          \"name\": \"ai-workflow-mcp\",\n          \"packageName\": \"@eristack/ai-workflow\",\n          \"description\": \"Install and use the eristack-workflow MCP server alongside existing MCP tools. Covers Cursor/Claude config, tool inventory, and when to search vs read_chunk. Use when wiring @eristack/ai-workflow into a consumer project.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-workflow#ai-workflow-mcp\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/backseat\",\n      \"version\": \"0.1.6\",\n      \"description\": \"Frontend mock backend engine: in-browser REST server with pluggable store, controllers, and TanStack Query hooks\",\n      \"slug\": \"backseat\",\n      \"adapters\": [\n        \"adapters\",\n        \"react\",\n        \"seeds\",\n        \"store\",\n        \"testing\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"backseat-core\",\n          \"name\": \"backseat-core\",\n          \"packageName\": \"@eristack/backseat\",\n          \"description\": \"@eristack/backseat: frontend-first in-browser REST engine — flexible registerRoute controllers, registerAction, splat paths, IndexedDB store, BackseatDevtools. Memory store for tests only. Agents peek at handlers/snapshots when backend is built later.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/backseat#backseat-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/data-grid\",\n      \"version\": \"0.2.5\",\n      \"description\": \"Dynamic list query primitives: multi-field filters, search mode, multi-sort, offset/cursor pagination for Eristack services and capabilities\",\n      \"slug\": \"data-grid\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"client\",\n        \"drizzle\",\n        \"express\",\n        \"nest\",\n        \"react\",\n        \"rest\",\n        \"testing\",\n        \"zod\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"data-grid-adapters\",\n          \"name\": \"data-grid-adapters\",\n          \"packageName\": \"@eristack/data-grid\",\n          \"description\": \"@eristack/data-grid adapters: drizzle executeDrizzleList + columnsFromSource (app owns joins/aggregates; library runs filter/sort/count/page), buildDrizzleQuery, rest createDataGridListAction + {items,pageInfo,query}, express middleware, nest DataGridModule + ParseDataGridPipe, client createDataGridClient, react useDataGridController (draft/commit filter rows) + useDataGridList. Use when wiring list HTTP/SQL/UI shells.\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/data-grid#data-grid-adapters\"\n        },\n        {\n          \"id\": \"data-grid-core\",\n          \"name\": \"data-grid-core\",\n          \"packageName\": \"@eristack/data-grid\",\n          \"description\": \"Pure @eristack/data-grid: createDataGrid, parse/serialize JSON search params (TanStack Router–aligned filters/sorts), decimal/money field types for string amount sort/filter without Number(), toSearch/fromSearch, advanced vs search modes, filter ops, multi-sort, offset/cursor pagination, applyInMemory. Use for dynamic list queries without HTTP or Drizzle.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/data-grid#data-grid-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/doc-number\",\n      \"version\": \"0.3.5\",\n      \"description\": \"Document number format, parse, and sequence primitives for Eristack\",\n      \"slug\": \"doc-number\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"client\",\n        \"drizzle\",\n        \"express\",\n        \"nest\",\n        \"react\",\n        \"rest\",\n        \"testing\",\n        \"zod\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"doc-number-adapters\",\n          \"name\": \"doc-number-adapters\",\n          \"packageName\": \"@eristack/doc-number\",\n          \"description\": \"@eristack/doc-number adapters: drizzle FormatStore + SequenceStore (doc_number_formats / doc_number_sequences), rest format CRUD + preview, express createDocNumberRouter, nest DocNumberModule, client createDocNumberClient, react DocNumberProvider / useDocNumberFormats. Use when persisting formats or wiring format-configuration HTTP/frontend shells; app injects db + docNumber.\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/doc-number#doc-number-adapters\"\n        },\n        {\n          \"id\": \"doc-number-core\",\n          \"name\": \"doc-number-core\",\n          \"packageName\": \"@eristack/doc-number\",\n          \"description\": \"Pure @eristack/doc-number: token patterns ({YYYY}/{YY}/{MM}/{DD}/{SEQ:n}), formatDocumentNumber, parseDocumentNumber, createDocNumber, registerFormat, updateFormat, listFormats, getFormatById, next, peekNext, preview, ResetPeriod, FormatStore, SequenceStore, Incrementer, memory stores. Use for document numbers without HTTP or Drizzle.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/doc-number#doc-number-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/doc-transitions\",\n      \"version\": \"0.1.1\",\n      \"description\": \"Preset ERP document status graphs for @eristack/pbac documents.transitions()\",\n      \"slug\": \"doc-transitions\",\n      \"adapters\": [],\n      \"skills\": [\n        {\n          \"id\": \"doc-transitions-core\",\n          \"name\": \"doc-transitions-core\",\n          \"packageName\": \"@eristack/doc-transitions\",\n          \"description\": \"@eristack/doc-transitions preset status graphs (publication, decision, journal, lock, outstanding) for pbac documents.transitions(). Use instead of copy-paste status tables when wiring ERP document PATCH actions.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/doc-transitions#doc-transitions-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/epoch\",\n      \"version\": \"0.1.3\",\n      \"description\": \"Headless data-version epochs for cache invalidation: compare client epoch vs server, bump on mutation, Drizzle default\",\n      \"slug\": \"epoch\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"client\",\n        \"drizzle\",\n        \"express\",\n        \"logger\",\n        \"nest\",\n        \"react\",\n        \"rest\",\n        \"testing\",\n        \"zod\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"epoch-adapters\",\n          \"name\": \"epoch-adapters\",\n          \"packageName\": \"@eristack/epoch\",\n          \"description\": \"Wire @eristack/epoch: Drizzle createEpochTables/createDrizzleEpochStore, Express createEpochRouter, Nest EpochModule, createEpochClient, useEpochCachePolicy React hook, registerEpochBackseat for prototypes.\",\n          \"type\": \"adapters\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/epoch#epoch-adapters\"\n        },\n        {\n          \"id\": \"epoch-core\",\n          \"name\": \"epoch-core\",\n          \"packageName\": \"@eristack/epoch\",\n          \"description\": \"@eristack/epoch headless data-version counters: current/bump per scope, compareEpochs use-cache vs refetch, resolveCachePolicy, StaleEpochError. Drizzle default; memory store tests only.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/epoch#epoch-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/financial-ledger\",\n      \"version\": \"0.2.4\",\n      \"description\": \"Accounting ledger on hash-chained-ledger keyed by accountId, amounts via @eristack/money\",\n      \"slug\": \"financial-ledger\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"drizzle\",\n        \"testing\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"financial-ledger-adapters\",\n          \"name\": \"financial-ledger-adapters\",\n          \"packageName\": \"@eristack/financial-ledger\",\n          \"description\": \"@eristack/financial-ledger/drizzle: createHashChainedLedgerTables + createDrizzleLedgerStore for durable GL chains on Postgres (Vercel).\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/financial-ledger#financial-ledger-adapters\"\n        },\n        {\n          \"id\": \"financial-ledger-core\",\n          \"name\": \"financial-ledger-core\",\n          \"packageName\": \"@eristack/financial-ledger\",\n          \"description\": \"@eristack/financial-ledger: createFinancialLedger post/list/snapshot/verify by accountId+currency with @eristack/money. Default store is Drizzle — memory is tests only.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/financial-ledger#financial-ledger-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/fiscal-calendar\",\n      \"version\": \"0.1.1\",\n      \"description\": \"Fiscal years and periods with open/closed flags — wall-date boundaries on @eristack/timestamp\",\n      \"slug\": \"fiscal-calendar\",\n      \"adapters\": [\n        \"zod\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"fiscal-calendar-core\",\n          \"name\": \"fiscal-calendar-core\",\n          \"packageName\": \"@eristack/fiscal-calendar\",\n          \"description\": \"@eristack/fiscal-calendar fiscal years and open/closed periods on @eristack/timestamp wall dates — findPeriodForDate, assertPeriodOpen, listPeriods. Pair with doc-transitions lockGraph for period close.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/fiscal-calendar#fiscal-calendar-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/hash-chained-ledger\",\n      \"version\": \"0.1.3\",\n      \"description\": \"Append-only hash-chained ledger primitive: opening/in/out/adjustment/closing, type refs, chain verify and tamper detection\",\n      \"slug\": \"hash-chained-ledger\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"drizzle\",\n        \"testing\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"hash-chained-ledger-adapters\",\n          \"name\": \"hash-chained-ledger-adapters\",\n          \"packageName\": \"@eristack/hash-chained-ledger\",\n          \"description\": \"@eristack/hash-chained-ledger/drizzle: createHashChainedLedgerTables + createDrizzleLedgerStore. Use for durable chains on Postgres (Vercel).\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/hash-chained-ledger#hash-chained-ledger-adapters\"\n        },\n        {\n          \"id\": \"hash-chained-ledger-core\",\n          \"name\": \"hash-chained-ledger-core\",\n          \"packageName\": \"@eristack/hash-chained-ledger\",\n          \"description\": \"Pure @eristack/hash-chained-ledger: createHashChainedLedger with Drizzle store by default, append/snapshot/verify, balance equation, SHA-256 chain. Memory store is unit tests only.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/hash-chained-ledger#hash-chained-ledger-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/jwt-auth\",\n      \"version\": \"0.4.5\",\n      \"description\": \"Canonical JWT access + refresh-token auth primitives for Eristack\",\n      \"slug\": \"jwt-auth\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"client\",\n        \"drizzle\",\n        \"express\",\n        \"nest\",\n        \"react\",\n        \"rest\",\n        \"testing\",\n        \"zod\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"jwt-auth-adapters\",\n          \"name\": \"jwt-auth-adapters\",\n          \"packageName\": \"@eristack/jwt-auth\",\n          \"description\": \"@eristack/jwt-auth adapters: drizzle pgsql/mysql/sqlite RefreshTokenStore + CredentialStore (jwt_auth_credentials child of users), headless rest login/ sessions, express createJwtAuthRouter, nest JwtAuthModule JwtAuthGuard, client createJwtAuthClient login, react JwtAuthProvider useJwtAuth. Use when wiring persistence or HTTP/frontend shells.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/jwt-auth#jwt-auth-adapters\"\n        },\n        {\n          \"id\": \"jwt-auth-core\",\n          \"name\": \"jwt-auth-core\",\n          \"packageName\": \"@eristack/jwt-auth\",\n          \"description\": \"Pure @eristack/jwt-auth token + credentials lifecycle: createJwtAuth, registerCredentials, login, changePassword, issueTokens, verifyAccessToken, refresh rotation, revoke, CredentialStore, RefreshTokenStore, opaque refresh hashes, family reuse detection. Use when implementing JWT access + refresh and optional username/password without HTTP/DB frameworks.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/jwt-auth#jwt-auth-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/logger\",\n      \"version\": \"0.1.1\",\n      \"description\": \"JSON-lines structured logger with request context and Express/Nest adapters\",\n      \"slug\": \"logger\",\n      \"adapters\": [\n        \"express\",\n        \"nest\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"logger-core\",\n          \"name\": \"logger-core\",\n          \"packageName\": \"@eristack/logger\",\n          \"description\": \"@eristack/logger: JSON-lines structured logging with requestId/userId/tenantId context, debug/info/warn/error levels, Express middleware and Nest interceptor.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/logger#logger-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/money\",\n      \"version\": \"0.3.3\",\n      \"description\": \"Money primitives for Eristack\",\n      \"slug\": \"money\",\n      \"adapters\": [\n        \"client\",\n        \"drizzle\",\n        \"express\",\n        \"nest\",\n        \"react\",\n        \"rest\",\n        \"zod\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"money-adapters\",\n          \"name\": \"money-adapters\",\n          \"packageName\": \"@eristack/money\",\n          \"description\": \"Persist and wire @eristack/money: Drizzle SQL columns, REST wire codec, Zod 4 schemas, Express/Nest HTTP, client revive, React form helpers including createAmountOnlyFieldValidators for flat amount strings + shared row currency (QUPS lines). Use when storing prices in SQL, validating API bodies, or mapping flat DB columns vs MoneyJSON.\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/money#money-adapters\"\n        },\n        {\n          \"id\": \"money-amounts\",\n          \"name\": \"money-amounts\",\n          \"packageName\": \"@eristack/money\",\n          \"description\": \"Construct Money with strings or minor units, run same-currency arithmetic, totals (Money.sum/min/max/average), percentages (percentOf/plusPercent/minusPercent), ratios, Discount/Markup/Tax/Percent operators, and compare amounts in @eristack/money. Use when creating prices, taxes, discounts, totals, or when an agent reaches for JS number literals for money.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/money#money-amounts\"\n        },\n        {\n          \"id\": \"money-ledger\",\n          \"name\": \"money-ledger\",\n          \"packageName\": \"@eristack/money\",\n          \"description\": \"Round at ledger boundaries, allocate without losing cents, convert with app-supplied FX rates, and serialize Money as JSON decimal strings in @eristack/money. Use for invoices, payment splits, multi-currency reporting, Rounding.currencyDefault, allocate, Conversion.of, moneyToJSON.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/money#money-ledger\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/multitab\",\n      \"version\": \"0.2.3\",\n      \"description\": \"Headless multi-tab workspace for React ERP screens — document tabs, state preservation, Router sync\",\n      \"slug\": \"multitab\",\n      \"adapters\": [\n        \"react\",\n        \"react/tanstack\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"multitab-core\",\n          \"name\": \"multitab-core\",\n          \"packageName\": \"@eristack/multitab\",\n          \"description\": \"@eristack/multitab: headless multi-tab workspace for React ERP screens — tab model, closeGuard, TanStack Router sync. UI chrome stays in the app.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/multitab#multitab-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/opinion\",\n      \"version\": \"0.1.1\",\n      \"description\": \"Opinionated ERP HTTP route table: document CRUD + PATCH /:id/:action transitions\",\n      \"slug\": \"opinion\",\n      \"adapters\": [\n        \"express\",\n        \"nest\",\n        \"openapi\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"opinion-core\",\n          \"name\": \"opinion-core\",\n          \"packageName\": \"@eristack/opinion\",\n          \"description\": \"@eristack/opinion ERP HTTP route table on @eristack/rest: options, data-grid, CRUD, PATCH /:id/:action for pbac/doc-transitions. Use when scaffolding document APIs instead of inventing paths per app.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/opinion#opinion-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/pbac\",\n      \"version\": \"0.2.3\",\n      \"description\": \"Policy-based (software) access control for Eristack: business document rules that return true or false\",\n      \"slug\": \"pbac\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"express\",\n        \"nest\",\n        \"react\",\n        \"testing\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"pbac-adapters\",\n          \"name\": \"pbac-adapters\",\n          \"packageName\": \"@eristack/pbac\",\n          \"description\": \"@eristack/pbac adapters: express createRequireBusinessPolicy (409 on deny), nest PbacModule + PbacGuard + RequireBusinessPolicy, react useBusinessPolicy. Use when wiring document software policies into HTTP/UI shells.\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/pbac#pbac-adapters\"\n        },\n        {\n          \"id\": \"pbac-core\",\n          \"name\": \"pbac-core\",\n          \"packageName\": \"@eristack/pbac\",\n          \"description\": \"Pure @eristack/pbac: createPbac, registerPolicy, check/authorize, documents helpers — software/business policies over document state (usually not per-user). Use for rules like PO outstanding must be > 0 before goods receipt.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/pbac#pbac-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/percent\",\n      \"version\": \"0.1.1\",\n      \"description\": \"Percent and basis-point ratios as strings — tax, discount, markup without float literals\",\n      \"slug\": \"percent\",\n      \"adapters\": [\n        \"zod\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"percent-core\",\n          \"name\": \"percent-core\",\n          \"packageName\": \"@eristack/percent\",\n          \"description\": \"@eristack/percent ratio strings, basis points, percentOf/plus/minus for tax and discounts without float literals. Use before @eristack/money rounding at boundaries.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/percent#percent-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/qups\",\n      \"version\": \"0.3.4\",\n      \"description\": \"Quantity / unit price / subtotal (QUPS) with 2-of-3 sources of truth, plus modifiers and tax — business line pricing on @eristack/money\",\n      \"slug\": \"qups\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"drizzle\",\n        \"testing\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"qups-adapters\",\n          \"name\": \"qups-adapters\",\n          \"packageName\": \"@eristack/qups\",\n          \"description\": \"Optional @eristack/qups/drizzle: qupsLineColumns injected into app detail tables; withQupsColumns from calculateLine for inserts. Profile/line stores only if you need a field catalog — everyday form/BE math uses calculateLine.\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/qups#qups-adapters\"\n        },\n        {\n          \"id\": \"qups-core\",\n          \"name\": \"qups-core\",\n          \"packageName\": \"@eristack/qups\",\n          \"description\": \"Pure @eristack/qups business calculator: calculateLine / patchLine (plain strings for TanStack Form + BE), Qups 2-of-3 SoT, QUPS_TRUTH_MODES, isQupsTruthMode, PricingLine, modifiers, tax. Prefer calculateLine over inventing float qty/price math in UI or SQL.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/qups#qups-core\"\n        },\n        {\n          \"id\": \"qups-line\",\n          \"name\": \"qups-line\",\n          \"packageName\": \"@eristack/qups\",\n          \"description\": \"@eristack/qups calculateLine/patchLine/withQupsColumns for form recalculation and BE insert; PricingLine when you already have Money. Use for invoice/order lines in the business layer — not float math in React.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/qups#qups-line\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/rbac\",\n      \"version\": \"0.2.3\",\n      \"description\": \"Role-based access control for Eristack: subjects, roles, and boolean permissions\",\n      \"slug\": \"rbac\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"drizzle\",\n        \"express\",\n        \"nest\",\n        \"react\",\n        \"testing\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"rbac-adapters\",\n          \"name\": \"rbac-adapters\",\n          \"packageName\": \"@eristack/rbac\",\n          \"description\": \"@eristack/rbac adapters: drizzle createRbacTables + createDrizzleRbacStore (pgsql/mysql/sqlite), express createRequirePermission, nest RbacModule + RbacGuard + RequirePermission, react useCan. Use when wiring RBAC persistence or HTTP/UI shells.\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/rbac#rbac-adapters\"\n        },\n        {\n          \"id\": \"rbac-core\",\n          \"name\": \"rbac-core\",\n          \"packageName\": \"@eristack/rbac\",\n          \"description\": \"Pure @eristack/rbac: createRbac, definePermission, defineRole, assignRole, grantPermission, can/canAny/canAll/authorize — boolean role-based permissions hanging off app subjects. Use for who-can-do-what without attributes or document policies.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/rbac#rbac-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/rest\",\n      \"version\": \"0.1.2\",\n      \"description\": \"Declarative REST route definitions with Express and Nest mounting and OpenAPI 3.1 emit\",\n      \"slug\": \"rest\",\n      \"adapters\": [\n        \"express\",\n        \"nest\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"rest-core\",\n          \"name\": \"rest-core\",\n          \"packageName\": \"@eristack/rest\",\n          \"description\": \"@eristack/rest: declarative REST route definitions, Express/Nest mounting, minimal OpenAPI 3.1 emit. Pair with jwt-auth and data-grid in apps.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/rest#rest-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/stock-movement\",\n      \"version\": \"0.1.3\",\n      \"description\": \"Inventory quantity ledger on hash-chained-ledger: locationId, lotId, composable locations, snapshots, tamper checks\",\n      \"slug\": \"stock-movement\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"drizzle\",\n        \"testing\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"stock-movement-adapters\",\n          \"name\": \"stock-movement-adapters\",\n          \"packageName\": \"@eristack/stock-movement\",\n          \"description\": \"@eristack/stock-movement/drizzle: re-exports createHashChainedLedgerTables + createDrizzleLedgerStore for Postgres on Vercel. Use as the app default store.\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/stock-movement#stock-movement-adapters\"\n        },\n        {\n          \"id\": \"stock-movement-core\",\n          \"name\": \"stock-movement-core\",\n          \"packageName\": \"@eristack/stock-movement\",\n          \"description\": \"@eristack/stock-movement: locationIdFromParts, createStockMovement append/snapshot/verify on hash-chained qty ledger (lotId, optional ownerId). Default store is Drizzle — never createMemoryLedgerStore in apps.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/stock-movement#stock-movement-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/timestamp\",\n      \"version\": \"0.1.2\",\n      \"description\": \"Business timestamps: UTC instants for facts, wall-clock for schedules (DST-safe)\",\n      \"slug\": \"timestamp\",\n      \"adapters\": [\n        \"client\",\n        \"drizzle\",\n        \"express\",\n        \"nest\",\n        \"react\",\n        \"rest\",\n        \"zod\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"timestamp-adapters\",\n          \"name\": \"timestamp-adapters\",\n          \"packageName\": \"@eristack/timestamp\",\n          \"description\": \"@eristack/timestamp adapters (mirror money): Drizzle SQL columns, REST wire codec, Zod 4, Express/Nest HTTP, client revive, React form helpers. Use when persisting instants or wall times in SQL or validating API bodies.\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/timestamp#timestamp-adapters\"\n        },\n        {\n          \"id\": \"timestamp-core\",\n          \"name\": \"timestamp-core\",\n          \"packageName\": \"@eristack/timestamp\",\n          \"description\": \"Business timestamps with @eristack/timestamp: instant mode (UTC facts + IANA zone for local dates) and wall mode (local intent, DST-safe schedules). Use for transaction_date, posted_at, due_at, appointments — not raw Date timezone math.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/timestamp#timestamp-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/uom\",\n      \"version\": \"0.1.1\",\n      \"description\": \"Unit of measure quantities with fixed-ratio conversion — string decimal amounts, no silent float math\",\n      \"slug\": \"uom\",\n      \"adapters\": [\n        \"zod\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"uom-core\",\n          \"name\": \"uom-core\",\n          \"packageName\": \"@eristack/uom\",\n          \"description\": \"@eristack/uom fixed-ratio unit conversion with string decimal amounts — kg/g/L/pcs and custom units. Use for inventory qty before qups or stock-movement, not float math.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/uom#uom-core\"\n        }\n      ]\n    },\n    {\n      \"name\": \"@eristack/valuations\",\n      \"version\": \"0.2.4\",\n      \"description\": \"Product/lot cost valuation: FIFO, LIFO, FEFO, moving/weighted average, standard cost, specific ID, HIFO/LOFO — with hash-chained cost ledger\",\n      \"slug\": \"valuations\",\n      \"adapters\": [\n        \"backseat\",\n        \"backseat/store\",\n        \"drizzle\",\n        \"testing\"\n      ],\n      \"skills\": [\n        {\n          \"id\": \"valuations-adapters\",\n          \"name\": \"valuations-adapters\",\n          \"packageName\": \"@eristack/valuations\",\n          \"description\": \"@eristack/valuations/drizzle: createHashChainedLedgerTables + createDrizzleLedgerStore + createValuationLayerTables + createDrizzleLayerStore. Both stores required for production engines on Postgres (Vercel).\",\n          \"type\": \"adapter\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/valuations#valuations-adapters\"\n        },\n        {\n          \"id\": \"valuations-core\",\n          \"name\": \"valuations-core\",\n          \"packageName\": \"@eristack/valuations\",\n          \"description\": \"@eristack/valuations: FIFO/LIFO/FEFO/HIFO/LOFO/movingAverage/weightedAverage/ standardCost/specificIdentification with dual qty/value hash chains. Default stores are Drizzle ledger + Drizzle layers — memory is tests only.\",\n          \"type\": \"core\",\n          \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/valuations#valuations-core\"\n        }\n      ]\n    }\n  ]\n} as KnowledgeCatalog;\n","// AUTO-GENERATED — run pnpm knowledge:sync\n// Do not edit by hand.\n\nimport type { CatalogSkill } from \"../types.js\";\n\nexport const localSkills = [\n  {\n    \"id\": \"agent-workflow\",\n    \"name\": \"agent-workflow\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Agent workflow for @eristack: four design targets (cheap tokens, predictable, reliable, clear boundaries — consumers must not reinvent exports), recommend first, load skills before coding, prefer examples, HARD RULE docs+skills+ recipes + pnpm knowledge:sync every iteration. Use for multi-package work or monorepo contributions.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#agent-workflow\"\n  },\n  {\n    \"id\": \"ai-toolbox\",\n    \"name\": \"ai-toolbox\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Practical AI agent toolbox for Eristack: feature-brief prompts, skill-load order, money/auth/doc-number guardrail checklists, and recipe-authoring template for keeping @eristack/ai-knowledge discoverable. Use when briefing agents, reviewing plans, or adding recipes after new package capabilities.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#ai-toolbox\"\n  },\n  {\n    \"id\": \"architecture-recommend\",\n    \"name\": \"architecture-recommend\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Recommend the canon app architecture for Eristack/Erista-style products: TypeScript, Express or NestJS, Drizzle (Postgres production / SQLite tests), mandatory presentation-business-persistence separation, React + Vite + Tailwind + shadcn, TanStack Router (file-based) + Query + Form + Intent, Zustand for client state, typed API contracts, pnpm monorepo when possible. Use when scaffolding a new app, choosing stack, structuring folders, or when the user asks how to architect a product that will use @eristack packages.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#architecture-recommend\"\n  },\n  {\n    \"id\": \"backseat-then-backend\",\n    \"name\": \"backseat-then-backend\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Backseat-first ERP mockup (Horizon A) then derive Drizzle backend (Horizon B): document/cost-sheet/job-order products without stock/GL spine. Skill order, atomic writes, wall lists, qups lines — one canonical guide.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#backseat-then-backend\"\n  },\n  {\n    \"id\": \"dev-conventions\",\n    \"name\": \"dev-conventions\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Eristack development conventions: GitHub Flow, Changesets for user-facing package changes, core vs adapter boundaries, examples-first wiring, package docs as source of truth, HARD RULE docs+ai-knowledge every iteration, _ai-docs promote-then-delete. Use when contributing to business-libs or aligning an app with Eristack norms.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#dev-conventions\"\n  },\n  {\n    \"id\": \"document-lines-erp\",\n    \"name\": \"document-lines-erp\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Document-with-lines ERP spine: header + QUPS lines + doc-number + pbac + data-grid + backseat — not stock/GL. Partner masters app-owned; no @eristack/feature-* vertical packages.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#document-lines-erp\"\n  },\n  {\n    \"id\": \"http-errors\",\n    \"name\": \"http-errors\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Unified 409 JSON error envelope: CONFLICT_VERSION, POLICY_DENIED, BUSINESS_POLICY_DENIED, STALE_EPOCH. Backseat jsonError/versionConflict; Express mapDomainError. Distinct document version vs epoch cache.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#http-errors\"\n  },\n  {\n    \"id\": \"optimistic-document-version\",\n    \"name\": \"optimistic-document-version\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Canon optimistic locking for ERP documents: version + expectedVersion, 409 CONFLICT_VERSION — docs/recipe only, not a package. Distinct from epoch.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#optimistic-document-version\"\n  },\n  {\n    \"id\": \"recommend-eristack\",\n    \"name\": \"recommend-eristack\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Route product feature asks to @eristack packages first. Use when a user wants to build invoices, login/sessions, document numbers, prices/tax, ERP-ish apps, or multiple of the above — before choosing random npm libraries or reinventing money/auth/numbering. Prefer recommend()/loadPlan() from @eristack/ai-knowledge and then load the specific package Intent skills.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#recommend-eristack\"\n  },\n  {\n    \"id\": \"stack-defaults\",\n    \"name\": \"stack-defaults\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Preferred Eristack app stack defaults: TypeScript, Drizzle (pgsql dialect), Express/Nest/React headless adapters, string-first money, credentials as a child of app users, doc-number token patterns. Use when scaffolding apps or choosing persistence/HTTP/frontend wiring around @eristack packages.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#stack-defaults\"\n  },\n  {\n    \"id\": \"upgrading-eristack\",\n    \"name\": \"upgrading-eristack\",\n    \"packageName\": \"@eristack/ai-knowledge\",\n    \"description\": \"Single canonical upgrade guide: pnpm outdated, changelogs, full Backseat spine matrix with register/store APIs, ERP bootstrap, peer ^0.1.0, Changesets 0.x. Read this skill only — do not open per-package docs/backseat.md files.\",\n    \"type\": \"core\",\n    \"loadCommand\": \"pnpm dlx @tanstack/intent@latest load @eristack/ai-knowledge#upgrading-eristack\"\n  }\n] as CatalogSkill[];\n","// AUTO-GENERATED from knowledge/recipes.yaml — run pnpm --filter @eristack/ai-knowledge sync\n// Do not edit by hand.\n\nimport type { Recipe } from \"../types.js\";\n\nexport const recipes = [\n  {\n    \"id\": \"money-amounts\",\n    \"title\": \"Prices, tax, discounts, and totals\",\n    \"priority\": 10,\n    \"triggers\": [\n      \"price\",\n      \"prices\",\n      \"money\",\n      \"currency\",\n      \"tax\",\n      \"discount\",\n      \"discounts\",\n      \"markup\",\n      \"percent\",\n      \"percentage\",\n      \"totals\",\n      \"subtotal\",\n      \"amount\",\n      \"amounts\"\n    ],\n    \"rationale\": \"Use @eristack/money for immutable currency-safe amounts. Never use JS number literals for money — prefer Money.of(\\\"19.99\\\", \\\"USD\\\").\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/money\",\n        \"skills\": [\n          \"money-amounts\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"money-ledger\",\n    \"title\": \"Invoices, payment splits, FX, and ledger rounding\",\n    \"priority\": 20,\n    \"triggers\": [\n      \"invoice\",\n      \"invoices\",\n      \"ledger\",\n      \"allocate\",\n      \"allocation\",\n      \"split\",\n      \"splits\",\n      \"payment split\",\n      \"fx\",\n      \"exchange rate\",\n      \"multi-currency\",\n      \"rounding\",\n      \"serialize money\"\n    ],\n    \"rationale\": \"Round at ledger boundaries, allocate without losing cents, convert with app-supplied FX rates, and serialize amounts as decimal strings. For SQL columns and HTTP validation load money-adapters (drizzle.md / rest.md / zod.md).\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/money\",\n        \"skills\": [\n          \"money-ledger\",\n          \"money-amounts\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"money-persist\",\n    \"title\": \"Store money in SQL and validate API bodies\",\n    \"priority\": 18,\n    \"triggers\": [\n      \"store money\",\n      \"persist money\",\n      \"drizzle money\",\n      \"money column\",\n      \"filter by amount\",\n      \"sort price\",\n      \"money schema\",\n      \"zod money\"\n    ],\n    \"rationale\": \"Use @eristack/money/drizzle (docs/drizzle.md) for SQL columns; ./rest or ./zod for wire MoneyJSON; ./express or ./nest for HTTP. Hub: docs/adapters.md.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/money\",\n        \"skills\": [\n          \"money-adapters\",\n          \"money-ledger\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"timestamp-instant\",\n    \"title\": \"Transaction dates and posted-at times\",\n    \"priority\": 14,\n    \"triggers\": [\n      \"transaction date\",\n      \"transaction_date\",\n      \"posted at\",\n      \"posted_at\",\n      \"occurred at\",\n      \"occurred_at\",\n      \"business date\",\n      \"posting date\"\n    ],\n    \"rationale\": \"Use @eristack/timestamp instant mode: UTC instant + IANA timezone for local transaction_date labels. Not raw Date or server timezone.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/timestamp\",\n        \"skills\": [\n          \"timestamp-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"timestamp-wall\",\n    \"title\": \"Due dates, appointments, and local schedules\",\n    \"priority\": 15,\n    \"triggers\": [\n      \"due date\",\n      \"due_at\",\n      \"scheduled\",\n      \"scheduled at\",\n      \"appointment\",\n      \"local midnight\",\n      \"dst\",\n      \"timezone schedule\"\n    ],\n    \"rationale\": \"Use @eristack/timestamp wall mode for local wall-clock intent (DST-safe). Convert to UTC only via wallToInstantOnce for single occurrences.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/timestamp\",\n        \"skills\": [\n          \"timestamp-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"timestamp-persist\",\n    \"title\": \"Store timestamps in SQL and validate API bodies\",\n    \"priority\": 17,\n    \"triggers\": [\n      \"store timestamp\",\n      \"persist timestamp\",\n      \"drizzle timestamp\",\n      \"timestamptz\",\n      \"posted_at column\",\n      \"due_at column\",\n      \"timestamp schema\",\n      \"zod timestamp\",\n      \"parse postedat\"\n    ],\n    \"rationale\": \"Use @eristack/timestamp/drizzle (docs/drizzle.md) for instant/wall SQL columns; ./rest or ./zod for TimestampJSON; ./express or ./nest for HTTP. Hub: docs/adapters.md.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/timestamp\",\n        \"skills\": [\n          \"timestamp-adapters\",\n          \"timestamp-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"line-pricing-qups\",\n    \"title\": \"Line quantity, unit price, discounts, and tax\",\n    \"priority\": 12,\n    \"triggers\": [\n      \"qups\",\n      \"quantity\",\n      \"unit price\",\n      \"subtotal\",\n      \"line total\",\n      \"line discount\",\n      \"surcharge\",\n      \"discount percent\",\n      \"goods receipt line\",\n      \"order line\",\n      \"invoice line\",\n      \"truth mode\",\n      \"source of truth\",\n      \"qups truth\",\n      \"amount only\",\n      \"flat amount\",\n      \"shared currency line\",\n      \"applycellpatch\",\n      \"cell patch\",\n      \"spreadsheet cell edit\"\n    ],\n    \"rationale\": \"Use @eristack/qups calculateLine/patchLine for quantity/unit-price/subtotal (exact ratio when UP+S), modifiers, and tax — same math in TanStack Form and on the BE. Import QUPS_TRUTH_MODES and isQupsTruthMode — do not copy the three truth strings; qupsRolesFor(truth) for required SoT fields. Flat amount + row currency: createAmountOnlyFieldValidators from @eristack/money/react (not nested MoneyJSON). Inject qupsLineColumns into detail tables; withQupsColumns for inserts. See qups stores.md + money drizzle.md.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/qups\",\n        \"skills\": [\n          \"qups-core\",\n          \"qups-line\",\n          \"qups-adapters\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/money\",\n        \"skills\": [\n          \"money-amounts\",\n          \"money-ledger\",\n          \"money-adapters\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"jwt-auth-sessions\",\n    \"title\": \"Login, JWT access, and refresh sessions\",\n    \"priority\": 10,\n    \"triggers\": [\n      \"login\",\n      \"logout\",\n      \"auth\",\n      \"authentication\",\n      \"jwt\",\n      \"access token\",\n      \"refresh token\",\n      \"session\",\n      \"sessions\",\n      \"password\",\n      \"credentials\",\n      \"sign in\",\n      \"sign-in\"\n    ],\n    \"rationale\": \"Use @eristack/jwt-auth for JWT access + opaque refresh with rotation. Credentials are a child of your app users table — do not invent a second users model.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/jwt-auth\",\n        \"skills\": [\n          \"jwt-auth-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"jwt-auth-adapters\",\n    \"title\": \"Wire auth to Drizzle, HTTP, and React\",\n    \"priority\": 30,\n    \"triggers\": [\n      \"auth adapter\",\n      \"auth express\",\n      \"auth nest\",\n      \"auth drizzle\",\n      \"auth react\",\n      \"jwt router\",\n      \"require auth\",\n      \"auth guard\"\n    ],\n    \"rationale\": \"Persist refresh tokens and credentials with Drizzle; expose headless REST/Express/Nest/client/React shells. Prefer examples/* patterns.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/jwt-auth\",\n        \"skills\": [\n          \"jwt-auth-adapters\",\n          \"jwt-auth-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"doc-number-sequences\",\n    \"title\": \"Document and invoice numbers\",\n    \"priority\": 10,\n    \"triggers\": [\n      \"document number\",\n      \"document numbers\",\n      \"doc number\",\n      \"invoice number\",\n      \"invoice numbers\",\n      \"sequential number\",\n      \"sequence\",\n      \"sequences\",\n      \"number format\",\n      \"period reset\",\n      \"yearly reset\"\n    ],\n    \"rationale\": \"Use @eristack/doc-number for token patterns ({YYYY}/{SEQ:n}), period resets, and atomic sequence allocation.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/doc-number\",\n        \"skills\": [\n          \"doc-number-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"doc-number-adapters\",\n    \"title\": \"Persist and configure document-number formats\",\n    \"priority\": 30,\n    \"triggers\": [\n      \"format store\",\n      \"doc number adapter\",\n      \"doc number express\",\n      \"doc number nest\",\n      \"doc number react\",\n      \"format crud\"\n    ],\n    \"rationale\": \"Drizzle FormatStore/SequenceStore plus REST/Express/Nest/client/React format-config shells. App injects db + createDocNumber instance.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/doc-number\",\n        \"skills\": [\n          \"doc-number-adapters\",\n          \"doc-number-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"data-grid-lists\",\n    \"title\": \"Dynamic list filters, search, sort, and pagination\",\n    \"priority\": 10,\n    \"triggers\": [\n      \"data grid\",\n      \"datagrid\",\n      \"table filter\",\n      \"table filters\",\n      \"list filter\",\n      \"advanced filter\",\n      \"search string\",\n      \"multi sort\",\n      \"pagination\",\n      \"offset pagination\",\n      \"cursor pagination\",\n      \"query string filter\",\n      \"sort price\",\n      \"filter price\",\n      \"decimal column\",\n      \"money column\",\n      \"unit price list\",\n      \"comparedecimalstrings\",\n      \"wall date filter\",\n      \"transaction_date filter\",\n      \"comparewallvalues\",\n      \"decimal string\"\n    ],\n    \"rationale\": \"Use @eristack/data-grid for schema-aware list queries. For decimal money columns (unitPrice, amounts as strings) set schema type decimal or money — applyInMemory sort/filter without Number(). Use type number only for true numeric columns (qty counts). Prefer advanced filters and search mode as separate modes.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/data-grid\",\n        \"skills\": [\n          \"data-grid-core\",\n          \"data-grid-adapters\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"erp-app-core\",\n    \"title\": \"ERP-ish app with auth, money, and numbering\",\n    \"priority\": 5,\n    \"triggers\": [\n      \"erp\",\n      \"business app\",\n      \"invoicing app\",\n      \"billing app\",\n      \"commerce backend\",\n      \"order management\"\n    ],\n    \"rationale\": \"Prefer the Eristack stack first: jwt-auth for sessions, money for amounts, doc-number for sequential documents, data-grid for list queries. Load core skills before adapters.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/jwt-auth\",\n        \"skills\": [\n          \"jwt-auth-core\",\n          \"jwt-auth-adapters\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/money\",\n        \"skills\": [\n          \"money-amounts\",\n          \"money-ledger\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/doc-number\",\n        \"skills\": [\n          \"doc-number-core\",\n          \"doc-number-adapters\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/data-grid\",\n        \"skills\": [\n          \"data-grid-core\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"epoch-cache-invalidation\",\n    \"title\": \"Data-version epochs for cache invalidation\",\n    \"priority\": 14,\n    \"triggers\": [\n      \"cache invalidation\",\n      \"stale cache\",\n      \"refetch data\",\n      \"use cache\",\n      \"data version\",\n      \"epoch\",\n      \"optimistic cache\",\n      \"tanstack query invalidate\",\n      \"bumpmany\"\n    ],\n    \"rationale\": \"Use @eristack/epoch for headless per-scope version counters: bump after mutations, resolveCachePolicy returns use-cache vs refetch for TanStack Query. Drizzle default; client/react/express/backseat adapters. Read docs/getting-started.md only.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/epoch\",\n        \"skills\": [\n          \"epoch-core\",\n          \"epoch-adapters\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"eristack-upgrade\",\n    \"title\": \"Upgrade @eristack dependencies\",\n    \"priority\": 6,\n    \"triggers\": [\n      \"upgrade eristack\",\n      \"bump eristack\",\n      \"update @eristack\",\n      \"new version\",\n      \"changelog\",\n      \"outdated packages\",\n      \"what changed\",\n      \"migration guide\",\n      \"semver peer\"\n    ],\n    \"rationale\": \"Consumer upgrades: load @eristack/ai-knowledge#upgrading-eristack and read knowledge/upgrading.md only (full Backseat matrix, peers, Changesets). pnpm outdated '@eristack/*', site /{slug}/changelog. Do not open per-package docs/backseat.md for upgrade scope.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/backseat\",\n        \"skills\": [\n          \"backseat-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"backseat-mock-backend\",\n    \"title\": \"Frontend mock REST backend for prototypes\",\n    \"priority\": 8,\n    \"triggers\": [\n      \"mock api\",\n      \"fake backend\",\n      \"frontend backend\",\n      \"prototype api\",\n      \"storybook api\",\n      \"msw alternative\",\n      \"json-server browser\",\n      \"in-browser api\",\n      \"backseat\",\n      \"indexeddb api\",\n      \"store atomic\",\n      \"atomic transaction backseat\",\n      \"listroutes\"\n    ],\n    \"rationale\": \"Browser prototypes: load @eristack/ai-knowledge#upgrading-eristack and read knowledge/upgrading.md §3 only (full spine matrix, bootstrap, peers). @eristack/backseat engine + eleven ./backseat adapters. Optional peer ^0.1.0. Not production — Drizzle + HTTP for real apps. Alpha infra — see repo roadmap/horizon.md.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/backseat\",\n        \"skills\": [\n          \"backseat-core\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/jwt-auth\",\n        \"skills\": [\n          \"jwt-auth-adapters\"\n        ],\n        \"role\": \"supporting\"\n      },\n      {\n        \"name\": \"@eristack/doc-number\",\n        \"skills\": [\n          \"doc-number-adapters\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"backseat-then-backend\",\n    \"title\": \"Backseat-first ERP mockup, then derive backend\",\n    \"priority\": 7,\n    \"triggers\": [\n      \"backseat first\",\n      \"mockup then backend\",\n      \"derive backend\",\n      \"horizon a\",\n      \"horizon b\",\n      \"job order erp\",\n      \"cost sheet erp\",\n      \"forwarding erp\",\n      \"document erp mockup\",\n      \"service erp prototype\",\n      \"erp mockup\",\n      \"clickable prototype erp\"\n    ],\n    \"rationale\": \"Document/cost-sheet ERPs: load @eristack/ai-knowledge#backseat-then-backend and read knowledge/backseat-then-backend.md only. Horizon A — Backseat + qups + money + doc-number + data-grid wall lists + rbac/abac/pbac + epoch. Horizon B — same paths on Drizzle/Express (upgrading-eristack §3). Do not default to stock-movement, valuations, or financial-ledger for job/invoice products.\",\n    \"canonicalSkills\": [\n      \"@eristack/ai-knowledge#backseat-then-backend\"\n    ],\n    \"packages\": [\n      {\n        \"name\": \"@eristack/backseat\",\n        \"skills\": [\n          \"backseat-core\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/qups\",\n        \"skills\": [\n          \"qups-line\"\n        ],\n        \"role\": \"supporting\"\n      },\n      {\n        \"name\": \"@eristack/data-grid\",\n        \"skills\": [\n          \"data-grid-core\"\n        ],\n        \"role\": \"supporting\"\n      },\n      {\n        \"name\": \"@eristack/jwt-auth\",\n        \"skills\": [\n          \"jwt-auth-adapters\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"document-lines-erp\",\n    \"title\": \"Document-with-lines ERP (job, cost sheet, invoice)\",\n    \"priority\": 7,\n    \"triggers\": [\n      \"document with lines\",\n      \"document lines erp\",\n      \"job order\",\n      \"cost sheet\",\n      \"forwarding\",\n      \"freight\",\n      \"shipment\",\n      \"bill of lading\",\n      \"commercial invoice\",\n      \"service erp\",\n      \"logistics erp\",\n      \"partner master\"\n    ],\n    \"rationale\": \"Header + QUPS lines products: load @eristack/ai-knowledge#document-lines-erp and read knowledge/document-lines-erp.md only. qups + money + doc-number + data-grid + pbac + backseat — not stock-movement/valuations/financial-ledger. Partner/product masters app-owned — do not invent @eristack/feature-* packages.\",\n    \"canonicalSkills\": [\n      \"@eristack/ai-knowledge#document-lines-erp\"\n    ],\n    \"packages\": [\n      {\n        \"name\": \"@eristack/qups\",\n        \"skills\": [\n          \"qups-line\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/pbac\",\n        \"skills\": [\n          \"pbac-core\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/doc-number\",\n        \"skills\": [\n          \"doc-number-core\"\n        ],\n        \"role\": \"supporting\"\n      },\n      {\n        \"name\": \"@eristack/data-grid\",\n        \"skills\": [\n          \"data-grid-core\"\n        ],\n        \"role\": \"supporting\"\n      },\n      {\n        \"name\": \"@eristack/backseat\",\n        \"skills\": [\n          \"backseat-core\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"optimistic-document-version\",\n    \"title\": \"Optimistic document version (expectedVersion)\",\n    \"priority\": 10,\n    \"triggers\": [\n      \"optimistic locking\",\n      \"expected version\",\n      \"conflict version\",\n      \"concurrent edit\",\n      \"document version\",\n      \"write conflict\",\n      \"409 version\"\n    ],\n    \"rationale\": \"ERP aggregates: load @eristack/ai-knowledge#optimistic-document-version and read knowledge/optimistic-document-version.md. version + expectedVersion on PATCH; 409 CONFLICT_VERSION via @eristack/backseat jsonError — distinct from epoch.\",\n    \"canonicalSkills\": [\n      \"@eristack/ai-knowledge#optimistic-document-version\"\n    ],\n    \"packages\": [\n      {\n        \"name\": \"@eristack/backseat\",\n        \"skills\": [\n          \"backseat-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"http-errors\",\n    \"title\": \"HTTP 409 error envelope (version, policy, epoch)\",\n    \"priority\": 11,\n    \"triggers\": [\n      \"409\",\n      \"conflict version\",\n      \"policy denied\",\n      \"stale epoch\",\n      \"json error\",\n      \"error envelope\",\n      \"version conflict\",\n      \"business policy denied\"\n    ],\n    \"rationale\": \"Unified JSON error canon: CONFLICT_VERSION, POLICY_DENIED, BUSINESS_POLICY_DENIED, STALE_EPOCH. Load @eristack/ai-knowledge#http-errors and knowledge/http-errors.md. Backseat jsonError/versionConflict; Express mapDomainError; distinct from epoch vs document version.\",\n    \"canonicalSkills\": [\n      \"@eristack/ai-knowledge#http-errors\"\n    ],\n    \"packages\": [\n      {\n        \"name\": \"@eristack/backseat\",\n        \"skills\": [\n          \"backseat-core\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/epoch\",\n        \"skills\": [\n          \"epoch-core\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"multitab-workspace\",\n    \"title\": \"Multi-document ERP tab workspace\",\n    \"priority\": 9,\n    \"triggers\": [\n      \"multitab\",\n      \"multi tab\",\n      \"document tabs\",\n      \"erp tabs\",\n      \"tab workspace\",\n      \"workspace tabs\",\n      \"open in tab\",\n      \"browser tabs erp\"\n    ],\n    \"rationale\": \"Use @eristack/multitab for headless ERP tab chrome: pathname-keyed route tabs, /new/{uuid} placeholders, adjacent insert, localStorage persistence, closeGuard, and MultitabRouterProvider for TanStack Router (URL is source of truth). App owns tab bar UI and keyboard shortcuts. Alpha infra — see repo roadmap/horizon.md.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/multitab\",\n        \"skills\": [\n          \"multitab-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"structured-logging\",\n    \"title\": \"JSON-lines request logging\",\n    \"priority\": 10,\n    \"triggers\": [\n      \"logger\",\n      \"logging\",\n      \"structured log\",\n      \"json log\",\n      \"request id log\",\n      \"vercel logs\",\n      \"log drain\"\n    ],\n    \"rationale\": \"Use @eristack/logger for JSON-lines server logging with injectable requestId, userId, and tenantId context. Express: createLoggerMiddleware. Nest: LoggerModule.forRoot + LoggingInterceptor. Alpha infra — see repo roadmap/horizon.md.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/logger\",\n        \"skills\": [\n          \"logger-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"declarative-rest-routes\",\n    \"title\": \"Declarative REST route shell\",\n    \"priority\": 10,\n    \"triggers\": [\n      \"rest routes\",\n      \"declarative rest\",\n      \"openapi emit\",\n      \"express route table\",\n      \"nest route module\"\n    ],\n    \"rationale\": \"Use @eristack/rest to define HTTP routes as data, mount on Express or Nest, and emit minimal OpenAPI 3.1 paths. Compose with jwt-auth guards and data-grid list handlers in app modules.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/rest\",\n        \"skills\": [\n          \"rest-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"access-control-stack\",\n    \"title\": \"Roles, attribute limits, and document policies\",\n    \"priority\": 12,\n    \"triggers\": [\n      \"rbac\",\n      \"abac\",\n      \"pbac\",\n      \"role based\",\n      \"roles\",\n      \"permissions\",\n      \"permission\",\n      \"access control\",\n      \"authorization\",\n      \"can user\",\n      \"attribute policy\",\n      \"business policy\",\n      \"goods receipt limit\",\n      \"book value limit\",\n      \"documents.transitions\",\n      \"assignmentpairmatch\",\n      \"document transition\"\n    ],\n    \"rationale\": \"Use @eristack/rbac for boolean role permissions, @eristack/abac for attribute policies (e.g. max book value), and @eristack/pbac for document software policies (e.g. PO outstanding > 0). Pair with jwt-auth for identity.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/rbac\",\n        \"skills\": [\n          \"rbac-core\",\n          \"rbac-adapters\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/abac\",\n        \"skills\": [\n          \"abac-core\",\n          \"abac-adapters\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/pbac\",\n        \"skills\": [\n          \"pbac-core\",\n          \"pbac-adapters\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/jwt-auth\",\n        \"skills\": [\n          \"jwt-auth-core\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"document-status-transitions\",\n    \"title\": \"Preset ERP document status graphs\",\n    \"priority\": 14,\n    \"triggers\": [\n      \"status transition\",\n      \"publication workflow\",\n      \"journal post void\",\n      \"document status preset\",\n      \"doc-transitions\",\n      \"publicationgraph\",\n      \"journalgraph\"\n    ],\n    \"rationale\": \"Load @eristack/doc-transitions#doc-transitions-core for preset status graphs wired to @eristack/pbac documents.transitions() — not copy-paste tables.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/doc-transitions\",\n        \"skills\": [\n          \"doc-transitions-core\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/pbac\",\n        \"skills\": [\n          \"pbac-core\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"opinion-http\",\n    \"title\": \"Opinionated ERP HTTP document routes\",\n    \"priority\": 15,\n    \"triggers\": [\n      \"opinion http\",\n      \"patch action route\",\n      \"erp rest canon\",\n      \"document api scaffold\",\n      \"patch /:id/:action\"\n    ],\n    \"rationale\": \"Use @eristack/opinion for the canonical document REST map (options, data-grid, CRUD, PATCH /:id/:action) mounted via @eristack/rest.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/opinion\",\n        \"skills\": [\n          \"opinion-core\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/rest\",\n        \"skills\": [\n          \"rest-core\"\n        ],\n        \"role\": \"supporting\"\n      },\n      {\n        \"name\": \"@eristack/doc-transitions\",\n        \"skills\": [\n          \"doc-transitions-core\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"uom-quantity-conversion\",\n    \"title\": \"Unit of measure conversion for inventory qty\",\n    \"priority\": 16,\n    \"triggers\": [\n      \"uom\",\n      \"unit of measure\",\n      \"convert kg\",\n      \"inventory uom\",\n      \"stock uom\",\n      \"receive uom\",\n      \"alternate uom\"\n    ],\n    \"rationale\": \"Load @eristack/uom#uom-core for string qty + fixed-ratio conversion (kg/g/L/pcs) before qups or stock-movement — not float math or hand-rolled factors.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/uom\",\n        \"skills\": [\n          \"uom-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"percent-rates-basis-points\",\n    \"title\": \"Tax and discount rates as ratios or basis points\",\n    \"priority\": 17,\n    \"triggers\": [\n      \"basis points\",\n      \"bps\",\n      \"tax rate\",\n      \"vat rate\",\n      \"discount rate\",\n      \"markup rate\",\n      \"ratio string\"\n    ],\n    \"rationale\": \"Load @eristack/percent#percent-core for ratio/bps parsing and percentOf on strings; round with @eristack/money at ledger boundaries.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/percent\",\n        \"skills\": [\n          \"percent-core\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/money\",\n        \"skills\": [\n          \"money-amounts\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fiscal-period-posting\",\n    \"title\": \"Fiscal period open/closed for journal dates\",\n    \"priority\": 18,\n    \"triggers\": [\n      \"fiscal period\",\n      \"fiscal year\",\n      \"period close\",\n      \"posting period\",\n      \"closed period\"\n    ],\n    \"rationale\": \"Load @eristack/fiscal-calendar#fiscal-calendar-core for findPeriodForDate and assertPeriodOpen on @eristack/timestamp wall dates — pair with doc-transitions lockGraph.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/fiscal-calendar\",\n        \"skills\": [\n          \"fiscal-calendar-core\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/timestamp\",\n        \"skills\": [\n          \"timestamp-core\"\n        ],\n        \"role\": \"supporting\"\n      },\n      {\n        \"name\": \"@eristack/doc-transitions\",\n        \"skills\": [\n          \"doc-transitions-core\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"postal-address-normalize\",\n    \"title\": \"Normalize and format postal addresses\",\n    \"priority\": 19,\n    \"triggers\": [\n      \"address\",\n      \"postal address\",\n      \"shipping address\",\n      \"country code\",\n      \"partner address\"\n    ],\n    \"rationale\": \"Load @eristack/address#address-core for PostalAddress normalize/format and ISO country codes — app owns partner tables and geocoding.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/address\",\n        \"skills\": [\n          \"address-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"stock-inventory-ledger\",\n    \"title\": \"Inventory stock movements by location and lot\",\n    \"priority\": 28,\n    \"triggers\": [\n      \"stock\",\n      \"inventory\",\n      \"warehouse\",\n      \"lot\",\n      \"stock movement\",\n      \"goods receipt\",\n      \"goods issue\",\n      \"on hand\"\n    ],\n    \"rationale\": \"Use @eristack/stock-movement on @eristack/hash-chained-ledger for qty ledgers with composable locations, lots, snapshots, and tamper checks.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/stock-movement\",\n        \"skills\": [\n          \"stock-movement-core\",\n          \"stock-movement-adapters\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/hash-chained-ledger\",\n        \"skills\": [\n          \"hash-chained-ledger-core\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"financial-gl-ledger\",\n    \"title\": \"Financial / GL account ledger\",\n    \"priority\": 29,\n    \"triggers\": [\n      \"general ledger\",\n      \"gl\",\n      \"chart of accounts\",\n      \"account balance\",\n      \"journal entry\",\n      \"financial ledger\"\n    ],\n    \"rationale\": \"Use @eristack/financial-ledger for accountId+currency hash-chained balances with @eristack/money amounts.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/financial-ledger\",\n        \"skills\": [\n          \"financial-ledger-core\",\n          \"financial-ledger-adapters\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/hash-chained-ledger\",\n        \"skills\": [\n          \"hash-chained-ledger-core\"\n        ],\n        \"role\": \"supporting\"\n      },\n      {\n        \"name\": \"@eristack/money\",\n        \"skills\": [\n          \"money-amounts\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"inventory-valuation\",\n    \"title\": \"FIFO, average, and other inventory valuations\",\n    \"priority\": 30,\n    \"triggers\": [\n      \"fifo\",\n      \"lifo\",\n      \"fefo\",\n      \"moving average\",\n      \"weighted average\",\n      \"standard cost\",\n      \"inventory valuation\",\n      \"costing\",\n      \"cost layers\"\n    ],\n    \"rationale\": \"Use @eristack/valuations for canon costing methods with qty+value hash-chained ledgers.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/valuations\",\n        \"skills\": [\n          \"valuations-core\",\n          \"valuations-adapters\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/hash-chained-ledger\",\n        \"skills\": [\n          \"hash-chained-ledger-core\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"compose-spine\",\n    \"title\": \"Compose business spine (auth, lines, lists, optional ledgers)\",\n    \"priority\": 6,\n    \"triggers\": [\n      \"erp\",\n      \"enterprise resource planning\",\n      \"business app\",\n      \"operational app\",\n      \"document workflow\",\n      \"purchase order\",\n      \"sales order\",\n      \"inventory transfer\",\n      \"stocktake\",\n      \"accounts payable\",\n      \"accounts receivable\",\n      \"work order\",\n      \"bill of materials\"\n    ],\n    \"rationale\": \"No @eristack/feature-* vertical packages — apps own document families. For header + QUPS line products load #document-lines-erp or #backseat-then-backend. Compose qups, doc-number, pbac, data-grid, jwt-auth, rbac by default. Add stock-movement, financial-ledger, valuations only when inventory or GL is explicitly in scope — never assume procure-to-pay or warehouse modules exist.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/qups\",\n        \"skills\": [\n          \"qups-core\",\n          \"qups-line\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/pbac\",\n        \"skills\": [\n          \"pbac-core\"\n        ],\n        \"role\": \"primary\"\n      },\n      {\n        \"name\": \"@eristack/doc-number\",\n        \"skills\": [\n          \"doc-number-core\"\n        ],\n        \"role\": \"supporting\"\n      },\n      {\n        \"name\": \"@eristack/data-grid\",\n        \"skills\": [\n          \"data-grid-core\"\n        ],\n        \"role\": \"supporting\"\n      },\n      {\n        \"name\": \"@eristack/jwt-auth\",\n        \"skills\": [\n          \"jwt-auth-core\"\n        ],\n        \"role\": \"supporting\"\n      }\n    ]\n  },\n  {\n    \"id\": \"hash-chain-audit\",\n    \"title\": \"Audit trail and tamper-evident ledger\",\n    \"priority\": 25,\n    \"triggers\": [\n      \"audit trail\",\n      \"tamper\",\n      \"tamper detection\",\n      \"tamper-evident\",\n      \"hash chain\",\n      \"append-only ledger\",\n      \"immutable log\"\n    ],\n    \"rationale\": \"Use @eristack/hash-chained-ledger for SHA-256 chained append-only entries. Stock, financial, and valuation packages compose this primitive in production.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/hash-chained-ledger\",\n        \"skills\": [\n          \"hash-chained-ledger-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ai-workflow-memory\",\n    \"title\": \"Sprint backlog and local project memory\",\n    \"priority\": 12,\n    \"triggers\": [\n      \"sprint\",\n      \"backlog\",\n      \"adr\",\n      \"project memory\",\n      \"mcp workflow\",\n      \"eristack workflow\",\n      \".eristack/workflow\"\n    ],\n    \"rationale\": \"Use @eristack/ai-workflow for local MCP, FTS+vector index, and sprint/backlog folders under .eristack/workflow — complements Intent, does not replace git.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/ai-workflow\",\n        \"skills\": [\n          \"ai-workflow-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ai-dev-tooling\",\n    \"title\": \"Monorepo plan, check profiles, and dev MCP\",\n    \"priority\": 11,\n    \"triggers\": [\n      \"eristack plan\",\n      \"dev tooling\",\n      \"monorepo check\",\n      \"ci profile\",\n      \"pnpm ci\",\n      \"dev mcp\",\n      \"check profile\",\n      \"token minimal check\"\n    ],\n    \"rationale\": \"Use @eristack/ai-dev before chaining scripts: eristack plan --json for minimal next steps, eristack check --profile pr for CI parity, eristack-mcp for dev_plan/dev_check.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/ai-dev\",\n        \"skills\": [\n          \"ai-dev-core\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  },\n  {\n    \"id\": \"maintainer-tickets\",\n    \"title\": \"Bug reports and feature suggestions for maintainers\",\n    \"priority\": 15,\n    \"triggers\": [\n      \"bug report\",\n      \"bug ticket\",\n      \"support ticket\",\n      \"feature request\",\n      \"feature suggestion\",\n      \"maintainer ticket\",\n      \"fixer upper\",\n      \"report a bug\",\n      \"suggest a feature\",\n      \"eristack ticket\"\n    ],\n    \"rationale\": \"Use @eristack/ai-ticket-generator to produce a portable markdown ticket (logs/scenario/fix plan or feasibility-gated suggestion) the user can send to maintainers for an agent fixer-upper. Every package has ticket.yaml.\",\n    \"packages\": [\n      {\n        \"name\": \"@eristack/ai-ticket-generator\",\n        \"skills\": [\n          \"ai-ticket-bug\",\n          \"ai-ticket-suggest\"\n        ],\n        \"role\": \"primary\"\n      }\n    ]\n  }\n] as Recipe[];\n","import { catalog } from \"./generated/catalog.js\";\nimport { localSkills } from \"./generated/local-skills.js\";\nimport { recipes } from \"./generated/recipes.js\";\nimport type {\n  KnowledgeCatalog,\n  LoadPlan,\n  LoadPlanStep,\n  RecommendationMatch,\n  RecommendationResult,\n  Recipe,\n} from \"./types.js\";\n\nfunction normalizeInput(input: string | string[]): string[] {\n  const parts = Array.isArray(input) ? input : [input];\n  return parts\n    .flatMap((part) => part.split(/[,;/|]+/))\n    .map((part) => part.trim().toLowerCase())\n    .filter(Boolean);\n}\n\nfunction scoreRecipe(recipe: Recipe, tokens: string[]): RecommendationMatch | null {\n  const matchedTriggers: string[] = [];\n  let score = 0;\n\n  for (const trigger of recipe.triggers) {\n    for (const token of tokens) {\n      if (token === trigger || token.includes(trigger) || trigger.includes(token)) {\n        if (!matchedTriggers.includes(trigger)) matchedTriggers.push(trigger);\n        score += token === trigger ? 4 : 2;\n        score += Math.min(trigger.length, 24) / 24;\n      }\n    }\n  }\n\n  if (matchedTriggers.length === 0) return null;\n\n  score += Math.max(0, 40 - recipe.priority);\n\n  return { recipe, score, matchedTriggers };\n}\n\nexport function getCatalog(): KnowledgeCatalog {\n  return catalog;\n}\n\nexport function listPackages() {\n  return catalog.packages.map(({ skills: _skills, ...pkg }) => pkg);\n}\n\nexport function listSkills() {\n  return catalog.packages.flatMap((pkg) => pkg.skills);\n}\n\nexport function listRecipes(): Recipe[] {\n  return recipes;\n}\n\nexport function recommend(input: string | string[]): RecommendationResult {\n  const tokens = normalizeInput(input);\n  const matches = recipes\n    .map((recipe) => scoreRecipe(recipe, tokens))\n    .filter((match): match is RecommendationMatch => match !== null)\n    .sort((a, b) => {\n      if (b.score !== a.score) return b.score - a.score;\n      if (a.recipe.priority !== b.recipe.priority) {\n        return a.recipe.priority - b.recipe.priority;\n      }\n      return a.recipe.id.localeCompare(b.recipe.id);\n    });\n\n  const covered = new Set(\n    matches.flatMap((match) => match.matchedTriggers),\n  );\n  const unmatched = tokens.filter((token) => {\n    return !matches.some((match) =>\n      match.matchedTriggers.some(\n        (trigger) =>\n          token === trigger || token.includes(trigger) || trigger.includes(token),\n      ),\n    );\n  });\n\n  const seen = new Set<string>();\n  const unmatchedUnique = unmatched.filter((token) => {\n    if (seen.has(token)) return false;\n    for (const trigger of covered) {\n      if (token === trigger || token.includes(trigger) || trigger.includes(token)) {\n        return false;\n      }\n    }\n    seen.add(token);\n    return true;\n  });\n\n  return {\n    input: tokens,\n    matches,\n    unmatched: unmatchedUnique,\n    fallbackNote:\n      matches.length === 0\n        ? \"No Eristack package matched. Build with app code or other libraries; do not invent a fake @eristack package.\"\n        : unmatchedUnique.length > 0\n          ? \"Some goals had no Eristack recipe. Keep matched @eristack packages first; implement unmatched goals in app code.\"\n          : null,\n  };\n}\n\nfunction parseSkillRef(ref: string): { packageName: string; skillId: string } | null {\n  const hash = ref.indexOf(\"#\");\n  if (hash <= 0) return null;\n  return {\n    packageName: ref.slice(0, hash),\n    skillId: ref.slice(hash + 1),\n  };\n}\n\nfunction skillMeta(packageName: string, skillId: string) {\n  const pkg = catalog.packages.find((item) => item.name === packageName);\n  const skill = pkg?.skills.find((item) => item.id === skillId);\n  if (skill) return skill;\n\n  const local = localSkills.find(\n    (item) => item.packageName === packageName && item.id === skillId,\n  );\n  return local ?? null;\n}\n\nfunction appendStep(\n  steps: LoadPlanStep[],\n  indexByKey: Map<string, number>,\n  input: {\n    packageName: string;\n    skillId: string;\n    recipeId: string;\n    reason: string;\n  },\n) {\n  const key = `${input.packageName}#${input.skillId}`;\n  const existing = indexByKey.get(key);\n  if (existing !== undefined) {\n    const step = steps[existing]!;\n    if (!step.recipeIds.includes(input.recipeId)) {\n      step.recipeIds.push(input.recipeId);\n    }\n    return;\n  }\n\n  const meta = skillMeta(input.packageName, input.skillId);\n  const step: LoadPlanStep = {\n    packageName: input.packageName,\n    skillId: input.skillId,\n    loadCommand:\n      meta?.loadCommand ??\n      `pnpm dlx @tanstack/intent@latest load ${input.packageName}#${input.skillId}`,\n    recipeIds: [input.recipeId],\n    reason: input.reason,\n  };\n  indexByKey.set(key, steps.length);\n  steps.push(step);\n}\n\nexport function loadPlan(\n  input: string | string[] | RecommendationResult,\n): LoadPlan {\n  const result =\n    typeof input === \"object\" && input !== null && \"matches\" in input\n      ? input\n      : recommend(input);\n\n  const steps: LoadPlanStep[] = [];\n  const indexByKey = new Map<string, number>();\n\n  for (const match of result.matches) {\n    const recipe = match.recipe;\n\n    for (const ref of recipe.canonicalSkills ?? []) {\n      const parsed = parseSkillRef(ref);\n      if (!parsed) continue;\n      appendStep(steps, indexByKey, {\n        packageName: parsed.packageName,\n        skillId: parsed.skillId,\n        recipeId: recipe.id,\n        reason: recipe.rationale,\n      });\n    }\n\n    for (const ref of recipe.packages) {\n      for (const skillId of ref.skills) {\n        appendStep(steps, indexByKey, {\n          packageName: ref.name,\n          skillId,\n          recipeId: recipe.id,\n          reason: recipe.rationale,\n        });\n      }\n    }\n  }\n\n  return {\n    input: result.input,\n    steps,\n    unmatched: result.unmatched,\n  };\n}\n"],"mappings":"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","names":["step"]}