@pikku/cli 0.12.90 → 0.12.92

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.
Files changed (264) hide show
  1. package/LICENSE +106 -0
  2. package/README.md +25 -2
  3. package/console-app/assets/{index-CSzCJzBb.css → index-D0HG8q0B.css} +1 -1
  4. package/console-app/assets/{index-C5Bd44e4.js → index-DDpIMCpy.js} +149 -149
  5. package/console-app/index.html +2 -2
  6. package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +1 -1
  7. package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +1 -1
  8. package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
  9. package/dist/.pikku/cli/pikku-cli-channel.js +6 -1
  10. package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +1 -1
  11. package/dist/.pikku/cli/pikku-cli-client.gen.js +1 -1
  12. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.d.ts +1 -1
  13. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.js +1 -1
  14. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.json +15 -0
  15. package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
  16. package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
  17. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
  18. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +43 -0
  19. package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
  20. package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
  21. package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
  22. package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
  23. package/dist/.pikku/console/pikku-node-types.gen.d.ts +1 -1
  24. package/dist/.pikku/function/pikku-function-types.gen.d.ts +4 -4
  25. package/dist/.pikku/function/pikku-function-types.gen.js +1 -1
  26. package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
  27. package/dist/.pikku/function/pikku-functions-meta.gen.json +39 -44
  28. package/dist/.pikku/function/pikku-functions.gen.js +1 -3
  29. package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
  30. package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
  31. package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
  32. package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
  33. package/dist/.pikku/pikku-bootstrap-scenarios.gen.d.ts +9 -0
  34. package/dist/.pikku/pikku-bootstrap-scenarios.gen.js +9 -0
  35. package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -1
  36. package/dist/.pikku/pikku-bootstrap.gen.js +1 -1
  37. package/dist/.pikku/pikku-meta-service.gen.d.ts +1 -1
  38. package/dist/.pikku/pikku-meta-service.gen.js +1 -1
  39. package/dist/.pikku/pikku-services.gen.d.ts +1 -1
  40. package/dist/.pikku/pikku-types.gen.d.ts +1 -1
  41. package/dist/.pikku/pikku-types.gen.js +1 -1
  42. package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
  43. package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
  44. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +1 -1
  45. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
  46. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
  47. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
  48. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +1 -1
  49. package/dist/.pikku/scenarios/pikku-scenario-functions-meta.gen.d.ts +1 -0
  50. package/dist/.pikku/scenarios/pikku-scenario-functions-meta.gen.js +10 -0
  51. package/dist/.pikku/scenarios/pikku-scenario-functions-meta.gen.json +1 -0
  52. package/dist/.pikku/scenarios/pikku-scenario-functions.gen.d.ts +4 -0
  53. package/dist/.pikku/scenarios/pikku-scenario-functions.gen.js +1 -0
  54. package/dist/.pikku/scenarios/pikku-scenario-wirings-meta.gen.d.ts +1 -0
  55. package/dist/.pikku/scenarios/pikku-scenario-wirings-meta.gen.js +10 -0
  56. package/dist/.pikku/scenarios/pikku-scenario-wirings.gen.d.ts +4 -0
  57. package/dist/.pikku/scenarios/pikku-scenario-wirings.gen.js +1 -0
  58. package/dist/.pikku/scenarios/schemas/register.gen.d.ts +4 -0
  59. package/dist/.pikku/scenarios/schemas/register.gen.js +4 -0
  60. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
  61. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
  62. package/dist/.pikku/schemas/register.gen.js +5 -3
  63. package/dist/.pikku/schemas/schemas/FabricSecretsListOutput.schema.json +1 -1
  64. package/dist/.pikku/schemas/schemas/FabricSecretsRotateInput.schema.json +1 -0
  65. package/dist/.pikku/schemas/schemas/FabricSecretsRotateOutput.schema.json +1 -0
  66. package/dist/.pikku/schemas/schemas/FabricSecretsSetOutput.schema.json +1 -1
  67. package/dist/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
  68. package/dist/.pikku/schemas/schemas/ScenarioRunInput.schema.json +1 -1
  69. package/dist/.pikku/scopes/pikku-scope-types.gen.d.ts +1 -1
  70. package/dist/.pikku/scopes/pikku-scope-types.gen.js +1 -1
  71. package/dist/.pikku/scopes/pikku-scopes.gen.d.ts +1 -1
  72. package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
  73. package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
  74. package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
  75. package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
  76. package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
  77. package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
  78. package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
  79. package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
  80. package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
  81. package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
  82. package/dist/.pikku/workflow/meta/allWorkflow.gen.json +2 -8
  83. package/dist/.pikku/workflow/pikku-scenario-actors.gen.d.ts +19 -0
  84. package/dist/.pikku/workflow/pikku-scenario-actors.gen.js +17 -0
  85. package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +152 -3
  86. package/dist/.pikku/workflow/pikku-workflow-types.gen.js +39 -1
  87. package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
  88. package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
  89. package/dist/bin/pikku-bin.mjs +2 -2
  90. package/dist/src/cli.wiring.js +28 -0
  91. package/dist/src/deploy/analyzer/analyzer.js +22 -5
  92. package/dist/src/deploy/build-pipeline.js +5 -1
  93. package/dist/src/fabric/fabric-commands.d.ts +37 -9
  94. package/dist/src/fabric/fabric-commands.js +12 -0
  95. package/dist/src/fabric/functions/domains-add.function.d.ts +4 -4
  96. package/dist/src/fabric/functions/secrets-list.function.d.ts +16 -4
  97. package/dist/src/fabric/functions/secrets-list.function.js +12 -10
  98. package/dist/src/fabric/functions/secrets-rotate.function.d.ts +24 -0
  99. package/dist/src/fabric/functions/secrets-rotate.function.js +36 -0
  100. package/dist/src/fabric/functions/secrets-set.function.d.ts +8 -4
  101. package/dist/src/fabric/functions/secrets-set.function.js +18 -7
  102. package/dist/src/fabric/lib/http.d.ts +7 -1
  103. package/dist/src/fabric/lib/sealed-box.d.ts +16 -0
  104. package/dist/src/fabric/lib/sealed-box.js +72 -0
  105. package/dist/src/functions/commands/dev.js +11 -0
  106. package/dist/src/functions/commands/load-user-project.d.ts +7 -0
  107. package/dist/src/functions/commands/load-user-project.js +21 -0
  108. package/dist/src/functions/commands/pikku-command-bootstrap.js +13 -0
  109. package/dist/src/functions/commands/scenario-browser.d.ts +84 -0
  110. package/dist/src/functions/commands/scenario-browser.js +68 -0
  111. package/dist/src/functions/commands/scenario-environment.d.ts +32 -0
  112. package/dist/src/functions/commands/scenario-environment.js +61 -0
  113. package/dist/src/functions/commands/scenario-formatter.d.ts +81 -0
  114. package/dist/src/functions/commands/scenario-formatter.js +120 -0
  115. package/dist/src/functions/commands/scenario-ladder.d.ts +66 -0
  116. package/dist/src/functions/commands/scenario-ladder.js +132 -0
  117. package/dist/src/functions/commands/scenario-plan.d.ts +61 -0
  118. package/dist/src/functions/commands/scenario-plan.js +106 -0
  119. package/dist/src/functions/commands/scenario.d.ts +24 -0
  120. package/dist/src/functions/commands/scenario.js +322 -50
  121. package/dist/src/functions/commands/serve.js +2 -0
  122. package/dist/src/functions/commands/skills.js +27 -61
  123. package/dist/src/functions/db/db-codegen.d.ts +6 -0
  124. package/dist/src/functions/db/db-codegen.js +9 -0
  125. package/dist/src/functions/db/db-migrator.js +14 -0
  126. package/dist/src/functions/db/local-db.d.ts +8 -0
  127. package/dist/src/functions/db/local-db.js +24 -2
  128. package/dist/src/functions/db/migration-identifiers.d.ts +58 -0
  129. package/dist/src/functions/db/migration-identifiers.js +262 -0
  130. package/dist/src/functions/db/migration-provenance.d.ts +35 -0
  131. package/dist/src/functions/db/migration-provenance.js +80 -0
  132. package/dist/src/functions/db/schema-sql.d.ts +43 -0
  133. package/dist/src/functions/db/schema-sql.js +135 -0
  134. package/dist/src/functions/db/sqlite/sqlite-kysely.js +22 -2
  135. package/dist/src/functions/wirings/functions/pikku-command-functions.js +26 -8
  136. package/dist/src/functions/wirings/functions/schemas.js +13 -1
  137. package/dist/src/functions/wirings/functions/serialize-function-types.js +3 -3
  138. package/dist/src/functions/wirings/rpc/pikku-command-rpc.js +6 -1
  139. package/dist/src/functions/wirings/scenarios/register-scenario-instrumentation.d.ts +10 -0
  140. package/dist/src/functions/wirings/scenarios/register-scenario-instrumentation.js +102 -0
  141. package/dist/src/functions/wirings/scenarios/scenario-partition.d.ts +42 -0
  142. package/dist/src/functions/wirings/scenarios/scenario-partition.js +71 -0
  143. package/dist/src/functions/wirings/scenarios/scenario-schema-partition.d.ts +33 -0
  144. package/dist/src/functions/wirings/scenarios/scenario-schema-partition.js +49 -0
  145. package/dist/src/functions/wirings/scenarios/serialize-feature-meta.d.ts +14 -0
  146. package/dist/src/functions/wirings/scenarios/serialize-feature-meta.js +29 -0
  147. package/dist/src/functions/wirings/scenarios/serialize-scenario-meta.d.ts +12 -0
  148. package/dist/src/functions/wirings/scenarios/serialize-scenario-meta.js +56 -0
  149. package/dist/src/functions/wirings/scenarios/serialize-scenario-registration.d.ts +7 -0
  150. package/dist/src/functions/wirings/scenarios/serialize-scenario-registration.js +40 -0
  151. package/dist/src/functions/wirings/workflow/pikku-command-workflow.js +43 -8
  152. package/dist/src/functions/wirings/workflow/serialize-scenario-actors.d.ts +1 -1
  153. package/dist/src/functions/wirings/workflow/serialize-scenario-actors.js +13 -2
  154. package/dist/src/functions/wirings/workflow/serialize-scenario-step-map.d.ts +4 -0
  155. package/dist/src/functions/wirings/workflow/serialize-scenario-step-map.js +62 -0
  156. package/dist/src/functions/wirings/workflow/serialize-workflow-bootstrap-map.js +10 -3
  157. package/dist/src/functions/wirings/workflow/serialize-workflow-map.js +10 -3
  158. package/dist/src/functions/wirings/workflow/serialize-workflow-meta.js +4 -4
  159. package/dist/src/functions/wirings/workflow/serialize-workflow-types.d.ts +1 -1
  160. package/dist/src/functions/wirings/workflow/serialize-workflow-types.js +232 -3
  161. package/dist/src/functions/workflows/all.workflow.js +2 -7
  162. package/dist/src/server/server-ready.d.ts +12 -0
  163. package/dist/src/server/server-ready.js +12 -0
  164. package/dist/src/server/spawn-dev-server.d.ts +50 -0
  165. package/dist/src/server/spawn-dev-server.js +112 -0
  166. package/dist/src/services.js +12 -1
  167. package/dist/src/utils/file-writer.js +14 -2
  168. package/dist/src/utils/meta-diff.js +5 -2
  169. package/dist/src/utils/pikku-cli-config.d.ts +14 -0
  170. package/dist/src/utils/pikku-cli-config.js +60 -0
  171. package/dist/src/utils/remove-legacy-scaffold-file.d.ts +14 -0
  172. package/dist/src/utils/remove-legacy-scaffold-file.js +23 -0
  173. package/dist/src/utils/resolve-scenario-actors.d.ts +23 -0
  174. package/dist/src/utils/resolve-scenario-actors.js +74 -0
  175. package/dist/src/utils/serialize-schemas.d.ts +3 -1
  176. package/dist/src/utils/serialize-schemas.js +39 -4
  177. package/dist/tsconfig.tsbuildinfo +1 -1
  178. package/package.json +18 -8
  179. package/dist/.pikku/schemas/schemas/PikkuScenarioFunctionsOutput.schema.json +0 -1
  180. package/dist/src/functions/wirings/scenarios/pikku-command-scenario-functions.d.ts +0 -1
  181. package/dist/src/functions/wirings/scenarios/pikku-command-scenario-functions.js +0 -31
  182. package/dist/src/functions/wirings/scenarios/serialize-scenario-functions.d.ts +0 -10
  183. package/dist/src/functions/wirings/scenarios/serialize-scenario-functions.js +0 -104
  184. package/skills/pikku-addon/SKILL.md +0 -243
  185. package/skills/pikku-addon/references/addon-package-manifest.md +0 -63
  186. package/skills/pikku-ai-agent/SKILL.md +0 -231
  187. package/skills/pikku-ai-vercel/SKILL.md +0 -82
  188. package/skills/pikku-ai-voice/SKILL.md +0 -88
  189. package/skills/pikku-audit/SKILL.md +0 -175
  190. package/skills/pikku-aws/SKILL.md +0 -111
  191. package/skills/pikku-backblaze/SKILL.md +0 -71
  192. package/skills/pikku-better-auth/SKILL.md +0 -298
  193. package/skills/pikku-cli/SKILL.md +0 -198
  194. package/skills/pikku-cli/references/complete-example.md +0 -82
  195. package/skills/pikku-concepts/SKILL.md +0 -250
  196. package/skills/pikku-concepts/references/concept-mapping.md +0 -556
  197. package/skills/pikku-concepts/references/packages.md +0 -29
  198. package/skills/pikku-config/SKILL.md +0 -212
  199. package/skills/pikku-cron/SKILL.md +0 -214
  200. package/skills/pikku-deploy-azure/SKILL.md +0 -71
  201. package/skills/pikku-deploy-cloudflare/SKILL.md +0 -82
  202. package/skills/pikku-deploy-express/SKILL.md +0 -86
  203. package/skills/pikku-deploy-fastify/SKILL.md +0 -73
  204. package/skills/pikku-deploy-lambda/SKILL.md +0 -110
  205. package/skills/pikku-deploy-nextjs/SKILL.md +0 -78
  206. package/skills/pikku-deploy-uws/SKILL.md +0 -88
  207. package/skills/pikku-deps/SKILL.md +0 -98
  208. package/skills/pikku-emails/SKILL.md +0 -163
  209. package/skills/pikku-fabric/SKILL.md +0 -318
  210. package/skills/pikku-fabric-debug/SKILL.md +0 -112
  211. package/skills/pikku-feature/SKILL.md +0 -258
  212. package/skills/pikku-gateway-slack/SKILL.md +0 -115
  213. package/skills/pikku-http/SKILL.md +0 -220
  214. package/skills/pikku-http/references/http-options.md +0 -55
  215. package/skills/pikku-i18n/SKILL.md +0 -137
  216. package/skills/pikku-info/SKILL.md +0 -100
  217. package/skills/pikku-jose/SKILL.md +0 -105
  218. package/skills/pikku-kysely/SKILL.md +0 -219
  219. package/skills/pikku-machine-auth/SKILL.md +0 -183
  220. package/skills/pikku-mcp/SKILL.md +0 -241
  221. package/skills/pikku-middleware/SKILL.md +0 -231
  222. package/skills/pikku-middleware/references/middleware-patterns.md +0 -61
  223. package/skills/pikku-mongodb/SKILL.md +0 -105
  224. package/skills/pikku-n8n-import/SKILL.md +0 -109
  225. package/skills/pikku-n8n-import/SPEC.md +0 -84
  226. package/skills/pikku-n8n-import/references/addon-mapping.md +0 -121
  227. package/skills/pikku-n8n-import/references/code-translation.md +0 -121
  228. package/skills/pikku-n8n-import/references/loops-and-control.md +0 -87
  229. package/skills/pikku-paraglide/SKILL.md +0 -117
  230. package/skills/pikku-permissions/SKILL.md +0 -192
  231. package/skills/pikku-pino/SKILL.md +0 -79
  232. package/skills/pikku-product-second-opinion/README.md +0 -43
  233. package/skills/pikku-product-second-opinion/SKILL.md +0 -158
  234. package/skills/pikku-product-second-opinion/example/sample-report.md +0 -90
  235. package/skills/pikku-product-second-opinion/references/report-template.md +0 -73
  236. package/skills/pikku-queue/SKILL.md +0 -240
  237. package/skills/pikku-react/SKILL.md +0 -212
  238. package/skills/pikku-react-query/SKILL.md +0 -242
  239. package/skills/pikku-realtime/SKILL.md +0 -236
  240. package/skills/pikku-realtime/references/other-routes.md +0 -23
  241. package/skills/pikku-redis/SKILL.md +0 -90
  242. package/skills/pikku-rpc/SKILL.md +0 -171
  243. package/skills/pikku-rtl/SKILL.md +0 -219
  244. package/skills/pikku-scenario/SKILL.md +0 -215
  245. package/skills/pikku-schedule/SKILL.md +0 -57
  246. package/skills/pikku-schema-ajv/SKILL.md +0 -62
  247. package/skills/pikku-schema-cfworker/SKILL.md +0 -63
  248. package/skills/pikku-security/SKILL.md +0 -108
  249. package/skills/pikku-services/SKILL.md +0 -248
  250. package/skills/pikku-services/references/audit-wire-service.md +0 -34
  251. package/skills/pikku-software-archaeology/README.md +0 -70
  252. package/skills/pikku-software-archaeology/SKILL.md +0 -186
  253. package/skills/pikku-software-archaeology/references/blueprint.schema.json +0 -625
  254. package/skills/pikku-software-archaeology/references/pikku-mapping.md +0 -49
  255. package/skills/pikku-software-archaeology/scripts/validate.mjs +0 -173
  256. package/skills/pikku-tag-middleware/SKILL.md +0 -13
  257. package/skills/pikku-template-clone/SKILL.md +0 -40
  258. package/skills/pikku-trigger/SKILL.md +0 -181
  259. package/skills/pikku-versioning/SKILL.md +0 -173
  260. package/skills/pikku-websocket/SKILL.md +0 -243
  261. package/skills/pikku-workflow/SKILL.md +0 -172
  262. package/skills/pikku-workflow/references/workflow-reference.md +0 -63
  263. package/skills/pikku-workflows-client/SKILL.md +0 -150
  264. package/skills/pikku-ws/SKILL.md +0 -47
@@ -1,625 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "title": "Product Blueprint (.knowledge/) contract",
4
- "description": "One schema per output file, keyed by filename under the `files` map. Every extracted concept carries evidence[] and confidence. Facts (observed in code) and inferences (reconstructed intent) must never be merged silently: confidence expresses how directly the evidence supports the claim.",
5
- "$defs": {
6
- "evidence": {
7
- "type": "array",
8
- "minItems": 1,
9
- "items": {
10
- "type": "object",
11
- "required": ["file", "lines"],
12
- "properties": {
13
- "file": { "type": "string", "description": "repo-relative path" },
14
- "lines": { "type": "string", "description": "e.g. '42' or '42-58'" },
15
- "note": { "type": "string", "description": "what this location shows" }
16
- }
17
- }
18
- },
19
- "confidence": {
20
- "type": "string",
21
- "enum": ["high", "medium", "low"],
22
- "description": "high = behavior directly observed in code/schema; medium = strong inference from multiple signals; low = plausible guess, needs human confirmation"
23
- },
24
- "conceptName": {
25
- "type": "string",
26
- "pattern": "^[A-Z][A-Za-z0-9]*$",
27
- "description": "PascalCase domain-language name (SendInvoice, InvoicePaid), never a route or filename"
28
- }
29
- },
30
- "files": {
31
- "product.json": {
32
- "type": "object",
33
- "required": ["name", "purpose", "actors", "capabilities", "terminology", "evidence", "confidence"],
34
- "properties": {
35
- "name": { "type": "string" },
36
- "purpose": { "type": "string", "description": "1-3 sentences: what problem, for whom" },
37
- "targetUsers": { "type": "array", "items": { "type": "string" } },
38
- "actors": {
39
- "type": "array",
40
- "minItems": 1,
41
- "items": {
42
- "type": "object",
43
- "required": ["name", "kind", "description"],
44
- "properties": {
45
- "name": { "type": "string" },
46
- "kind": { "type": "string", "enum": ["human", "system", "external"] },
47
- "description": { "type": "string" }
48
- }
49
- }
50
- },
51
- "capabilities": { "type": "array", "minItems": 1, "items": { "type": "string" } },
52
- "terminology": {
53
- "type": "array",
54
- "items": {
55
- "type": "object",
56
- "required": ["term", "meaning"],
57
- "properties": { "term": { "type": "string" }, "meaning": { "type": "string" } }
58
- }
59
- },
60
- "evidence": { "$ref": "#/$defs/evidence" },
61
- "confidence": { "$ref": "#/$defs/confidence" }
62
- }
63
- },
64
- "domains.json": {
65
- "type": "object",
66
- "required": ["domains"],
67
- "properties": {
68
- "domains": {
69
- "type": "array",
70
- "minItems": 1,
71
- "items": {
72
- "type": "object",
73
- "required": ["name", "description", "entities", "commands", "queries", "events", "evidence", "confidence"],
74
- "properties": {
75
- "name": { "$ref": "#/$defs/conceptName" },
76
- "description": { "type": "string" },
77
- "entities": { "type": "array", "items": { "$ref": "#/$defs/conceptName" } },
78
- "commands": { "type": "array", "items": { "$ref": "#/$defs/conceptName" } },
79
- "queries": { "type": "array", "items": { "$ref": "#/$defs/conceptName" } },
80
- "events": { "type": "array", "items": { "$ref": "#/$defs/conceptName" } },
81
- "policies": { "type": "array", "items": { "$ref": "#/$defs/conceptName" }, "description": "policy names from policies.json owned by this domain" },
82
- "sourcePaths": { "type": "array", "items": { "type": "string" }, "description": "where this domain currently lives (usually scattered)" },
83
- "evidence": { "$ref": "#/$defs/evidence" },
84
- "confidence": { "$ref": "#/$defs/confidence" }
85
- }
86
- }
87
- }
88
- }
89
- },
90
- "entities.json": {
91
- "type": "object",
92
- "required": ["entities"],
93
- "properties": {
94
- "entities": {
95
- "type": "array",
96
- "items": {
97
- "type": "object",
98
- "required": ["name", "domain", "description", "attributes", "evidence", "confidence"],
99
- "properties": {
100
- "name": { "$ref": "#/$defs/conceptName" },
101
- "domain": { "$ref": "#/$defs/conceptName" },
102
- "description": { "type": "string" },
103
- "attributes": {
104
- "type": "array",
105
- "items": {
106
- "type": "object",
107
- "required": ["name", "type"],
108
- "properties": {
109
- "name": { "type": "string" },
110
- "type": { "type": "string" },
111
- "required": { "type": "boolean" },
112
- "notes": { "type": "string" }
113
- }
114
- }
115
- },
116
- "relationships": {
117
- "type": "array",
118
- "items": {
119
- "type": "object",
120
- "required": ["kind", "target"],
121
- "properties": {
122
- "kind": { "type": "string", "enum": ["belongs-to", "has-many", "has-one", "references", "many-to-many"] },
123
- "target": { "$ref": "#/$defs/conceptName" },
124
- "description": { "type": "string" }
125
- }
126
- }
127
- },
128
- "states": { "type": "array", "items": { "type": "string" } },
129
- "transitions": {
130
- "type": "array",
131
- "items": {
132
- "type": "object",
133
- "required": ["from", "to", "trigger"],
134
- "properties": {
135
- "from": { "type": "string" },
136
- "to": { "type": "string" },
137
- "trigger": { "type": "string", "description": "command or event name that causes it" }
138
- }
139
- }
140
- },
141
- "ownership": { "type": "string", "description": "which actor/tenant owns rows of this entity" },
142
- "constraints": { "type": "array", "items": { "type": "string" } },
143
- "evidence": { "$ref": "#/$defs/evidence" },
144
- "confidence": { "$ref": "#/$defs/confidence" }
145
- }
146
- }
147
- }
148
- }
149
- },
150
- "commands.json": {
151
- "type": "object",
152
- "required": ["commands"],
153
- "properties": {
154
- "commands": {
155
- "type": "array",
156
- "items": {
157
- "type": "object",
158
- "required": ["name", "domain", "actor", "input", "preconditions", "effects", "eventsProduced", "evidence", "confidence"],
159
- "properties": {
160
- "name": { "$ref": "#/$defs/conceptName", "description": "imperative VerbNoun: ApproveInvoice" },
161
- "domain": { "$ref": "#/$defs/conceptName" },
162
- "actor": { "type": "string" },
163
- "trigger": { "type": "string", "description": "how it is invoked today (route, job, webhook, cron)" },
164
- "input": {
165
- "type": "array",
166
- "items": {
167
- "type": "object",
168
- "required": ["name", "type"],
169
- "properties": {
170
- "name": { "type": "string" },
171
- "type": { "type": "string" },
172
- "required": { "type": "boolean" }
173
- }
174
- }
175
- },
176
- "preconditions": { "type": "array", "items": { "type": "string" } },
177
- "effects": { "type": "array", "minItems": 1, "items": { "type": "string" } },
178
- "eventsProduced": { "type": "array", "items": { "$ref": "#/$defs/conceptName" } },
179
- "policies": { "type": "array", "items": { "type": "string" }, "description": "policy names from policies.json enforced here" },
180
- "currentImplementation": { "type": "array", "items": { "type": "string" }, "description": "file paths implementing it today" },
181
- "evidence": { "$ref": "#/$defs/evidence" },
182
- "confidence": { "$ref": "#/$defs/confidence" }
183
- }
184
- }
185
- }
186
- }
187
- },
188
- "queries.json": {
189
- "type": "object",
190
- "required": ["queries"],
191
- "properties": {
192
- "queries": {
193
- "type": "array",
194
- "items": {
195
- "type": "object",
196
- "required": ["name", "domain", "actor", "description", "returns", "evidence", "confidence"],
197
- "properties": {
198
- "name": { "$ref": "#/$defs/conceptName", "description": "GetX / ListX / SearchX" },
199
- "domain": { "$ref": "#/$defs/conceptName" },
200
- "actor": { "type": "string" },
201
- "description": { "type": "string" },
202
- "input": {
203
- "type": "array",
204
- "items": {
205
- "type": "object",
206
- "required": ["name", "type"],
207
- "properties": { "name": { "type": "string" }, "type": { "type": "string" }, "required": { "type": "boolean" } }
208
- }
209
- },
210
- "returns": { "type": "string" },
211
- "scoping": { "type": "string", "description": "tenancy/visibility rule applied (e.g. 'rows owned by caller only')" },
212
- "evidence": { "$ref": "#/$defs/evidence" },
213
- "confidence": { "$ref": "#/$defs/confidence" }
214
- }
215
- }
216
- }
217
- }
218
- },
219
- "events.json": {
220
- "type": "object",
221
- "required": ["events"],
222
- "properties": {
223
- "events": {
224
- "type": "array",
225
- "items": {
226
- "type": "object",
227
- "required": ["name", "domain", "description", "producedBy", "evidence", "confidence"],
228
- "properties": {
229
- "name": { "$ref": "#/$defs/conceptName", "description": "past-tense business fact: InvoicePaid. No technical events (ButtonClicked)." },
230
- "domain": { "$ref": "#/$defs/conceptName" },
231
- "description": { "type": "string" },
232
- "producedBy": { "type": "array", "minItems": 1, "items": { "type": "string" }, "description": "command/workflow names" },
233
- "consumedBy": { "type": "array", "items": { "type": "string" }, "description": "what reacts today (email send, status flip, webhook out)" },
234
- "payloadHints": { "type": "array", "items": { "type": "string" } },
235
- "explicit": { "type": "boolean", "description": "true if the code emits a real event; false if reconstructed from inline side-effects" },
236
- "evidence": { "$ref": "#/$defs/evidence" },
237
- "confidence": { "$ref": "#/$defs/confidence" }
238
- }
239
- }
240
- }
241
- }
242
- },
243
- "policies.json": {
244
- "type": "object",
245
- "required": ["policies"],
246
- "properties": {
247
- "policies": {
248
- "type": "array",
249
- "items": {
250
- "type": "object",
251
- "required": ["name", "rule", "type", "domain", "evidence", "confidence"],
252
- "properties": {
253
- "name": { "$ref": "#/$defs/conceptName" },
254
- "rule": { "type": "string", "description": "plain-language statement: 'Only the invoice owner can send it'" },
255
- "type": { "type": "string", "enum": ["authorization", "validation", "state", "business-constraint", "rate-limit"] },
256
- "domain": { "$ref": "#/$defs/conceptName" },
257
- "enforcedAt": { "type": "array", "items": { "type": "string" }, "description": "every code location enforcing it — multiple locations = divergence risk, note in gaps.json" },
258
- "evidence": { "$ref": "#/$defs/evidence" },
259
- "confidence": { "$ref": "#/$defs/confidence" }
260
- }
261
- }
262
- }
263
- }
264
- },
265
- "workflows.json": {
266
- "type": "object",
267
- "required": ["workflows"],
268
- "properties": {
269
- "workflows": {
270
- "type": "array",
271
- "items": {
272
- "type": "object",
273
- "required": ["name", "kind", "actor", "trigger", "steps", "result", "evidence", "confidence"],
274
- "properties": {
275
- "name": { "type": "string" },
276
- "kind": { "type": "string", "enum": ["user", "admin", "system"] },
277
- "actor": { "type": "string" },
278
- "trigger": { "type": "string" },
279
- "steps": { "type": "array", "minItems": 1, "items": { "type": "string" } },
280
- "result": { "type": "string" },
281
- "commandsInvolved": { "type": "array", "items": { "$ref": "#/$defs/conceptName" } },
282
- "eventsInvolved": { "type": "array", "items": { "$ref": "#/$defs/conceptName" } },
283
- "schedule": { "type": "string", "description": "cron expression for system workflows, if any" },
284
- "scenarios": {
285
- "type": "array",
286
- "description": "concrete use cases, primarily excavated from the test suite (describe/it names, fixtures, assertions). A scenario sourced from a test is high-confidence by definition.",
287
- "items": {
288
- "type": "object",
289
- "required": ["name", "outcome"],
290
- "properties": {
291
- "name": { "type": "string" },
292
- "given": { "type": "string" },
293
- "when": { "type": "string" },
294
- "outcome": { "type": "string" },
295
- "fromTest": { "type": "string", "description": "test file path + test name, when sourced from a test" }
296
- }
297
- }
298
- },
299
- "evidence": { "$ref": "#/$defs/evidence" },
300
- "confidence": { "$ref": "#/$defs/confidence" }
301
- }
302
- }
303
- }
304
- }
305
- },
306
- "api.json": {
307
- "type": "object",
308
- "required": ["surfaces"],
309
- "properties": {
310
- "surfaces": {
311
- "type": "array",
312
- "items": {
313
- "type": "object",
314
- "required": ["kind", "path", "auth", "mapsTo", "evidence"],
315
- "properties": {
316
- "kind": { "type": "string", "enum": ["rest", "graphql", "rpc", "webhook-in", "webhook-out", "page", "cli", "websocket", "sse"] },
317
- "method": { "type": "string" },
318
- "path": { "type": "string" },
319
- "auth": { "type": "string", "description": "none | session | jwt | api-key | signature | capability-url | ..." },
320
- "mapsTo": {
321
- "type": "object",
322
- "required": ["type", "name"],
323
- "properties": {
324
- "type": { "type": "string", "enum": ["command", "query", "event-ingress"], "description": "command/query for normal surfaces. event-ingress ONLY for surfaces that relay an external event without a domain command of their own; its name must be an events.json event. A webhook whose handler changes state maps to a command (usual case)." },
325
- "name": { "$ref": "#/$defs/conceptName" }
326
- }
327
- },
328
- "notes": { "type": "string" },
329
- "confidence": { "$ref": "#/$defs/confidence" },
330
- "evidence": { "$ref": "#/$defs/evidence" }
331
- }
332
- }
333
- }
334
- }
335
- },
336
- "integrations.json": {
337
- "type": "object",
338
- "required": ["integrations"],
339
- "properties": {
340
- "integrations": {
341
- "type": "array",
342
- "items": {
343
- "type": "object",
344
- "required": ["name", "category", "purpose", "direction", "importance", "replacementDifficulty", "evidence", "confidence"],
345
- "properties": {
346
- "name": { "type": "string" },
347
- "category": { "type": "string", "description": "payments | email | auth | storage | analytics | llm | sms | ..." },
348
- "purpose": { "type": "string" },
349
- "dataExchanged": { "type": "array", "items": { "type": "string" } },
350
- "direction": { "type": "string", "enum": ["outbound", "inbound", "both"] },
351
- "importance": { "type": "string", "enum": ["critical", "important", "peripheral"] },
352
- "replacementDifficulty": { "type": "string", "enum": ["trivial", "moderate", "hard"] },
353
- "configVia": { "type": "array", "items": { "type": "string" }, "description": "env vars / secrets used" },
354
- "evidence": { "$ref": "#/$defs/evidence" },
355
- "confidence": { "$ref": "#/$defs/confidence" }
356
- }
357
- }
358
- }
359
- }
360
- },
361
- "architecture.json": {
362
- "type": "object",
363
- "required": ["components", "datastores"],
364
- "properties": {
365
- "components": {
366
- "type": "array",
367
- "minItems": 1,
368
- "items": {
369
- "type": "object",
370
- "required": ["name", "kind", "responsibility", "evidence"],
371
- "properties": {
372
- "name": { "type": "string" },
373
- "kind": { "type": "string", "enum": ["frontend", "api", "worker", "job", "webhook-handler", "cli", "service", "proxy", "other"] },
374
- "responsibility": { "type": "string" },
375
- "dependsOn": { "type": "array", "items": { "type": "string" } },
376
- "runtime": { "type": "string", "description": "how it runs today (process, cron, lambda, ...)" },
377
- "confidence": { "$ref": "#/$defs/confidence" },
378
- "evidence": { "$ref": "#/$defs/evidence" }
379
- }
380
- }
381
- },
382
- "datastores": {
383
- "type": "array",
384
- "items": {
385
- "type": "object",
386
- "required": ["name", "kind", "evidence"],
387
- "properties": {
388
- "name": { "type": "string" },
389
- "kind": { "type": "string" },
390
- "usedBy": { "type": "array", "items": { "type": "string" } },
391
- "notes": { "type": "string" },
392
- "confidence": { "$ref": "#/$defs/confidence" },
393
- "evidence": { "$ref": "#/$defs/evidence" }
394
- }
395
- }
396
- },
397
- "notes": { "type": "array", "items": { "type": "string" }, "description": "deployment constraints worth preserving (ports, raw-body routes, ordering)" }
398
- }
399
- },
400
- "invariants.json": {
401
- "type": "object",
402
- "required": ["invariants"],
403
- "properties": {
404
- "invariants": {
405
- "type": "array",
406
- "items": {
407
- "type": "object",
408
- "required": ["statement", "domain", "enforcedBy", "evidence", "confidence"],
409
- "properties": {
410
- "statement": { "type": "string", "description": "must ALWAYS hold: 'Invoice numbers are sequential per user with no gaps'" },
411
- "domain": { "$ref": "#/$defs/conceptName" },
412
- "enforcedBy": { "type": "string", "description": "db-constraint | code-guard | convention | nothing (!)" },
413
- "atRiskBecause": { "type": "string", "description": "why current enforcement is fragile, if it is" },
414
- "evidence": { "$ref": "#/$defs/evidence" },
415
- "confidence": { "$ref": "#/$defs/confidence" }
416
- }
417
- }
418
- }
419
- }
420
- },
421
- "gaps.json": {
422
- "type": "object",
423
- "required": ["gaps"],
424
- "properties": {
425
- "gaps": {
426
- "type": "array",
427
- "items": {
428
- "type": "object",
429
- "required": ["problem", "kind", "impact", "recommendation", "evidence"],
430
- "properties": {
431
- "problem": { "type": "string" },
432
- "kind": { "type": "string", "enum": ["incomplete-feature", "todo", "duplication", "bug", "hack", "dead-code", "unclear-ownership", "architecture", "security", "open-product-decision"] },
433
- "impact": { "type": "string" },
434
- "recommendation": { "type": "string" },
435
- "evidence": { "$ref": "#/$defs/evidence" }
436
- }
437
- }
438
- }
439
- }
440
- },
441
- "migration.json": {
442
- "type": "object",
443
- "required": ["mappings", "decisionsNeeded"],
444
- "properties": {
445
- "mappings": {
446
- "type": "array",
447
- "minItems": 1,
448
- "items": {
449
- "type": "object",
450
- "required": ["current", "future", "recommendation"],
451
- "properties": {
452
- "current": { "type": "array", "minItems": 1, "items": { "type": "string" }, "description": "file paths in the existing repo" },
453
- "future": {
454
- "type": "object",
455
- "required": ["domain"],
456
- "properties": {
457
- "domain": { "$ref": "#/$defs/conceptName" },
458
- "concepts": { "type": "array", "items": { "type": "string" }, "description": "commands/queries/events/entities this code becomes" }
459
- }
460
- },
461
- "recommendation": { "type": "string" }
462
- }
463
- }
464
- },
465
- "dropped": {
466
- "type": "array",
467
- "items": {
468
- "type": "object",
469
- "required": ["path", "reason"],
470
- "properties": { "path": { "type": "string", "description": "file path; for sub-file drops use 'path (symbolName)' when part of a file survives" }, "reason": { "type": "string" } }
471
- }
472
- },
473
- "decisionsNeeded": {
474
- "type": "array",
475
- "items": {
476
- "type": "object",
477
- "required": ["question"],
478
- "properties": {
479
- "question": { "type": "string" },
480
- "options": { "type": "array", "items": { "type": "string" } },
481
- "blockedConcepts": { "type": "array", "items": { "type": "string" } }
482
- }
483
- }
484
- }
485
- }
486
- },
487
- "interfaces.json": {
488
- "x-optional": true,
489
- "type": "object",
490
- "description": "Every way the product is CONSUMED, one entry per channel. The web UI is one channel (detailed further in frontend*.json); CLI, MCP server (for AI agents), OpenAPI/REST, generated SDK, realtime, and webhooks are others. Answers 'who can drive this product and how'.",
491
- "required": ["interfaces"],
492
- "properties": {
493
- "interfaces": {
494
- "type": "array",
495
- "items": {
496
- "type": "object",
497
- "required": ["name", "kind", "audience", "purpose", "evidence", "confidence"],
498
- "properties": {
499
- "name": { "type": "string" },
500
- "kind": { "type": "string", "enum": ["web-ui", "cli", "mcp", "openapi-rest", "graphql", "sdk", "websocket-realtime", "webhook-in", "webhook-out", "email", "other"] },
501
- "audience": { "type": "string", "enum": ["human", "developer", "ai-agent", "external-system", "internal"] },
502
- "purpose": { "type": "string" },
503
- "surfaceCount": { "type": "number", "description": "how many ops/tools/commands/routes this channel exposes" },
504
- "generated": { "type": "boolean", "description": "true if generated from another source (OpenAPI from routes, typed SDK, MCP tools from funcs) rather than hand-written" },
505
- "domainsServed": { "type": "array", "items": { "$ref": "#/$defs/conceptName" } },
506
- "status": { "type": "string", "enum": ["complete", "partial", "stub", "deprecated"] },
507
- "notes": { "type": "string" },
508
- "evidence": { "$ref": "#/$defs/evidence" },
509
- "confidence": { "$ref": "#/$defs/confidence" }
510
- }
511
- }
512
- }
513
- }
514
- },
515
- "frontend.json": {
516
- "x-optional": true,
517
- "type": "object",
518
- "description": "Web-UI app-level shape. Names the framework/router/styling/data/auth so the rebuild can weigh their tradeoffs (e.g. TanStack Start + better-auth + Mantine).",
519
- "required": ["framework", "styling", "dataLayer", "auth", "evidence", "confidence"],
520
- "properties": {
521
- "framework": { "type": "string", "description": "e.g. TanStack Start, Next.js, Remix, Vite SPA" },
522
- "rendering": { "type": "string", "enum": ["spa", "ssr", "ssg", "streaming-ssr", "mixed"] },
523
- "router": { "type": "string", "description": "e.g. TanStack Router (file-based), React Router" },
524
- "styling": { "type": "string", "description": "the design system, e.g. Mantine, Tailwind, MUI, CSS modules" },
525
- "designSystemConsistency": { "type": "string", "enum": ["single-system", "mostly-consistent", "mixed", "ad-hoc"], "description": "how uniformly ONE component/theme system is used — the rebuild target is 'everything Mantine', so divergence is porting work" },
526
- "designFindings": {
527
- "type": "array",
528
- "description": "Concrete broken/inconsistent design patterns observed across the UI. Each is a specific, cited observation of a consistency defect — not a taste opinion. These become the design recommendations in the second-opinion report.",
529
- "items": {
530
- "type": "object",
531
- "required": ["pattern", "observation", "recommendation", "evidence"],
532
- "properties": {
533
- "pattern": {
534
- "type": "string",
535
- "enum": [
536
- "interaction-inconsistency",
537
- "theming-not-tokenized",
538
- "cross-page-inconsistency",
539
- "component-duplication",
540
- "spacing-typography-scale",
541
- "design-system-bypass",
542
- "accessibility",
543
- "responsive",
544
- "other"
545
- ],
546
- "description": "interaction-inconsistency = same job done different ways (modal here, drawer there; inconsistent confirm dialogs). theming-not-tokenized = hardcoded colors/spacing/fonts instead of theme tokens/variables. cross-page-inconsistency = the same element (button/header/card) styled differently across pages. component-duplication = several near-identical components for one purpose. spacing-typography-scale = ad-hoc magic numbers off any scale. design-system-bypass = raw HTML/CSS where a design-system component exists. accessibility / responsive = a11y or breakpoint defects."
547
- },
548
- "observation": { "type": "string", "description": "what is inconsistent, with concrete examples (e.g. 'Add-site uses a Drawer, Edit-site uses a Modal for the same task')" },
549
- "impact": { "type": "string", "description": "what it does to the user (feels unpolished/confusing) or to maintenance (a color change means hunting every file)" },
550
- "recommendation": { "type": "string", "description": "the fix — usually standardize on one pattern, move values to theme tokens, or extract one shared component" },
551
- "severity": { "type": "string", "enum": ["minor", "worth-fixing", "serious"] },
552
- "evidence": { "$ref": "#/$defs/evidence" },
553
- "confidence": { "$ref": "#/$defs/confidence" }
554
- }
555
- }
556
- },
557
- "stateManagement": { "type": "string" },
558
- "dataLayer": { "type": "string", "description": "how the UI talks to the backend: e.g. pikku-react-query, REST fetch helpers, tRPC, GraphQL client" },
559
- "auth": { "type": "string", "description": "client auth mechanism: e.g. better-auth, next-auth, custom JWT" },
560
- "buildTool": { "type": "string" },
561
- "i18n": { "type": "string", "description": "internationalization approach, or 'none'" },
562
- "notes": { "type": "array", "items": { "type": "string" } },
563
- "evidence": { "$ref": "#/$defs/evidence" },
564
- "confidence": { "$ref": "#/$defs/confidence" }
565
- }
566
- },
567
- "frontend-routes.json": {
568
- "x-optional": true,
569
- "type": "object",
570
- "description": "The page/route tree — what a user can navigate to and do, mapped back to the data (queries/commands) each route uses and the components it renders.",
571
- "required": ["routes"],
572
- "properties": {
573
- "routes": {
574
- "type": "array",
575
- "items": {
576
- "type": "object",
577
- "required": ["path", "purpose", "evidence"],
578
- "properties": {
579
- "path": { "type": "string", "description": "URL path, e.g. /app/sites/:id" },
580
- "kind": { "type": "string", "enum": ["page", "layout", "index", "modal-or-drawer", "redirect"] },
581
- "purpose": { "type": "string", "description": "what the user does/sees here, in product terms" },
582
- "auth": { "type": "string", "description": "none | authenticated | admin | role:xyz" },
583
- "dataFrom": { "type": "array", "items": { "type": "string" }, "description": "query/command names (from queries.json/commands.json) this route reads/calls" },
584
- "usesComponents": { "type": "array", "items": { "type": "string" }, "description": "component names from frontend-components.json" },
585
- "userFlows": { "type": "array", "items": { "type": "string" }, "description": "workflows.json (kind=user) names this route participates in" },
586
- "evidence": { "$ref": "#/$defs/evidence" },
587
- "confidence": { "$ref": "#/$defs/confidence" }
588
- }
589
- }
590
- }
591
- }
592
- },
593
- "frontend-components.json": {
594
- "x-optional": true,
595
- "type": "object",
596
- "description": "Component inventory. The load-bearing field is `rebuild`: it separates components that are trivially rebuildable in the target design system (Mantine) from those carrying bespoke logic that must be carefully PORTED (custom charts, complex tables, canvas, drag/drop). That split is the frontend's real migration cost.",
597
- "required": ["components"],
598
- "properties": {
599
- "components": {
600
- "type": "array",
601
- "items": {
602
- "type": "object",
603
- "required": ["name", "role", "rebuild", "evidence", "confidence"],
604
- "properties": {
605
- "name": { "type": "string" },
606
- "role": { "type": "string", "enum": ["layout", "navigation", "presentational", "feature", "form", "data-display", "chart", "table", "overlay", "provider", "other"] },
607
- "purpose": { "type": "string" },
608
- "reuse": { "type": "string", "enum": ["shared", "one-off"], "description": "used across features vs single-use" },
609
- "rebuild": {
610
- "type": "string",
611
- "enum": ["mantine-standard", "mantine-composition", "custom-style", "custom-logic"],
612
- "description": "mantine-standard = maps 1:1 to a Mantine component (trivial); mantine-composition = built from Mantine primitives (straightforward); custom-style = diverges visually from the design system (normalize to Mantine); custom-logic = bespoke behavior (chart/table/canvas/drag/editor) that must be PORTED, not re-skinned"
613
- },
614
- "customLogic": { "type": "string", "description": "REQUIRED when rebuild=custom-logic: what the bespoke behavior is and why a stock component can't replace it" },
615
- "dependencies": { "type": "array", "items": { "type": "string" }, "description": "notable libs it pulls in (charting/table/editor) — replacement considerations for the port" },
616
- "usedBy": { "type": "array", "items": { "type": "string" }, "description": "routes/components that use it" },
617
- "evidence": { "$ref": "#/$defs/evidence" },
618
- "confidence": { "$ref": "#/$defs/confidence" }
619
- }
620
- }
621
- }
622
- }
623
- }
624
- }
625
- }