@pikku/cli 0.12.91 → 0.12.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +106 -0
- package/console-app/assets/{index-D0HG8q0B.css → index-BYj7ZbUU.css} +1 -1
- package/console-app/assets/{index-CpkvmAGb.js → index-CmAplHjZ.js} +151 -149
- package/console-app/index.html +2 -2
- package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +1 -1
- package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +1 -1
- package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-channel.js +16 -1
- package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-client.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.json +15 -0
- package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +48 -0
- package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
- package/dist/.pikku/console/pikku-node-types.gen.d.ts +1 -1
- package/dist/.pikku/function/pikku-function-types.gen.d.ts +1 -1
- package/dist/.pikku/function/pikku-function-types.gen.js +1 -1
- package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
- package/dist/.pikku/function/pikku-functions-meta.gen.json +73 -40
- package/dist/.pikku/function/pikku-functions.gen.js +1 -3
- package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
- package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
- package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
- package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
- package/dist/.pikku/pikku-bootstrap-scenarios.gen.d.ts +2 -1
- package/dist/.pikku/pikku-bootstrap-scenarios.gen.js +2 -1
- package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -1
- package/dist/.pikku/pikku-bootstrap.gen.js +1 -1
- package/dist/.pikku/pikku-meta-service.gen.d.ts +1 -1
- package/dist/.pikku/pikku-meta-service.gen.js +1 -1
- package/dist/.pikku/pikku-services.gen.d.ts +1 -1
- package/dist/.pikku/pikku-types.gen.d.ts +1 -1
- package/dist/.pikku/pikku-types.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
- package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +3 -1
- package/dist/.pikku/scenarios/pikku-scenario-functions-meta.gen.js +1 -1
- package/dist/.pikku/scenarios/pikku-scenario-functions.gen.d.ts +1 -1
- package/dist/.pikku/scenarios/pikku-scenario-wirings-meta.gen.js +1 -1
- package/dist/.pikku/scenarios/pikku-scenario-wirings.gen.d.ts +1 -1
- package/dist/.pikku/scenarios/schemas/register.gen.d.ts +4 -0
- package/dist/.pikku/scenarios/schemas/register.gen.js +4 -0
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
- package/dist/.pikku/schemas/register.gen.js +13 -3
- package/dist/.pikku/schemas/schemas/FabricSecretsListOutput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/FabricSecretsRotateInput.schema.json +1 -0
- package/dist/.pikku/schemas/schemas/FabricSecretsRotateOutput.schema.json +1 -0
- package/dist/.pikku/schemas/schemas/FabricSecretsSetOutput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/KnowledgeIndexInput.schema.json +1 -0
- package/dist/.pikku/schemas/schemas/KnowledgeIndexOutput.schema.json +1 -0
- package/dist/.pikku/schemas/schemas/KnowledgeValidateInput.schema.json +1 -0
- package/dist/.pikku/schemas/schemas/KnowledgeValidateOutput.schema.json +1 -0
- package/dist/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/ScenarioRunInput.schema.json +1 -1
- package/dist/.pikku/scopes/pikku-scope-types.gen.d.ts +1 -1
- package/dist/.pikku/scopes/pikku-scope-types.gen.js +1 -1
- package/dist/.pikku/scopes/pikku-scopes.gen.d.ts +1 -1
- package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
- package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
- package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
- package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
- package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
- package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
- package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
- package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
- package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
- package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
- package/dist/.pikku/workflow/meta/allWorkflow.gen.json +2 -8
- package/dist/.pikku/workflow/pikku-scenario-actors.gen.d.ts +1 -1
- package/dist/.pikku/workflow/pikku-scenario-actors.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +1 -1
- package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
- package/dist/bin/pikku-bin.mjs +2 -2
- package/dist/src/cli.wiring.js +29 -0
- package/dist/src/deploy/analyzer/analyzer.js +22 -5
- package/dist/src/deploy/build-pipeline.js +5 -1
- package/dist/src/fabric/fabric-commands.d.ts +37 -9
- package/dist/src/fabric/fabric-commands.js +12 -0
- package/dist/src/fabric/functions/domains-add.function.d.ts +4 -4
- package/dist/src/fabric/functions/secrets-list.function.d.ts +16 -4
- package/dist/src/fabric/functions/secrets-list.function.js +12 -10
- package/dist/src/fabric/functions/secrets-rotate.function.d.ts +24 -0
- package/dist/src/fabric/functions/secrets-rotate.function.js +36 -0
- package/dist/src/fabric/functions/secrets-set.function.d.ts +8 -4
- package/dist/src/fabric/functions/secrets-set.function.js +18 -7
- package/dist/src/fabric/functions/validate.function.js +16 -7
- package/dist/src/fabric/lib/http.d.ts +7 -1
- package/dist/src/fabric/lib/sealed-box.d.ts +16 -0
- package/dist/src/fabric/lib/sealed-box.js +72 -0
- package/dist/src/functions/commands/dev.js +9 -0
- package/dist/src/functions/commands/knowledge-index.d.ts +30 -0
- package/dist/src/functions/commands/knowledge-index.js +11 -0
- package/dist/src/functions/commands/knowledge-validate.d.ts +33 -0
- package/dist/src/functions/commands/knowledge-validate.js +11 -0
- package/dist/src/functions/commands/new-addon.d.ts +18 -0
- package/dist/src/functions/commands/new-addon.js +40 -24
- package/dist/src/functions/commands/pikku-command-bootstrap.js +1 -0
- package/dist/src/functions/commands/scenario-browser.d.ts +17 -2
- package/dist/src/functions/commands/scenario-browser.js +16 -8
- package/dist/src/functions/commands/scenario-environment.d.ts +32 -0
- package/dist/src/functions/commands/scenario-environment.js +61 -0
- package/dist/src/functions/commands/scenario.d.ts +6 -0
- package/dist/src/functions/commands/scenario.js +14 -9
- package/dist/src/functions/commands/skills.js +27 -61
- package/dist/src/functions/db/db-codegen.d.ts +6 -0
- package/dist/src/functions/db/db-codegen.js +9 -0
- package/dist/src/functions/db/db-migrator.js +14 -0
- package/dist/src/functions/db/local-db.d.ts +8 -0
- package/dist/src/functions/db/local-db.js +24 -2
- package/dist/src/functions/db/migration-identifiers.d.ts +58 -0
- package/dist/src/functions/db/migration-identifiers.js +262 -0
- package/dist/src/functions/db/migration-provenance.d.ts +35 -0
- package/dist/src/functions/db/migration-provenance.js +80 -0
- package/dist/src/functions/db/schema-sql.d.ts +43 -0
- package/dist/src/functions/db/schema-sql.js +135 -0
- package/dist/src/functions/db/sqlite/sqlite-kysely.js +22 -2
- package/dist/src/functions/knowledge/render.d.ts +3 -0
- package/dist/src/functions/knowledge/render.js +66 -0
- package/dist/src/functions/knowledge/schemas.d.ts +51 -0
- package/dist/src/functions/knowledge/schemas.js +25 -0
- package/dist/src/functions/wirings/credentials/serialize-credentials-types.js +8 -1
- package/dist/src/functions/wirings/functions/schemas.js +13 -1
- package/dist/src/functions/wirings/rpc/pikku-command-rpc.js +6 -1
- package/dist/src/functions/wirings/scenarios/register-scenario-instrumentation.d.ts +10 -0
- package/dist/src/functions/wirings/scenarios/register-scenario-instrumentation.js +102 -0
- package/dist/src/functions/wirings/scenarios/scenario-partition.d.ts +13 -0
- package/dist/src/functions/wirings/scenarios/scenario-partition.js +15 -2
- package/dist/src/functions/wirings/scenarios/scenario-schema-partition.d.ts +33 -0
- package/dist/src/functions/wirings/scenarios/scenario-schema-partition.js +49 -0
- package/dist/src/functions/wirings/secrets/serialize-secrets-types.js +10 -3
- package/dist/src/functions/wirings/variables/serialize-variables-types.js +8 -1
- package/dist/src/functions/workflows/all.workflow.js +2 -7
- package/dist/src/utils/file-writer.js +14 -2
- package/dist/src/utils/pikku-cli-config.d.ts +14 -0
- package/dist/src/utils/pikku-cli-config.js +34 -0
- package/dist/src/utils/remove-legacy-scaffold-file.d.ts +14 -0
- package/dist/src/utils/remove-legacy-scaffold-file.js +23 -0
- package/dist/src/utils/serialize-schemas.d.ts +3 -1
- package/dist/src/utils/serialize-schemas.js +39 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -9
- package/dist/.pikku/schemas/schemas/PikkuScenarioFunctionsOutput.schema.json +0 -1
- package/dist/src/functions/wirings/scenarios/pikku-command-scenario-functions.d.ts +0 -1
- package/dist/src/functions/wirings/scenarios/pikku-command-scenario-functions.js +0 -31
- package/dist/src/functions/wirings/scenarios/serialize-scenario-functions.d.ts +0 -10
- package/dist/src/functions/wirings/scenarios/serialize-scenario-functions.js +0 -104
- package/skills/pikku-addon/SKILL.md +0 -243
- package/skills/pikku-addon/references/addon-package-manifest.md +0 -63
- package/skills/pikku-ai-agent/SKILL.md +0 -231
- package/skills/pikku-ai-vercel/SKILL.md +0 -82
- package/skills/pikku-ai-voice/SKILL.md +0 -88
- package/skills/pikku-audit/SKILL.md +0 -175
- package/skills/pikku-aws/SKILL.md +0 -111
- package/skills/pikku-backblaze/SKILL.md +0 -71
- package/skills/pikku-better-auth/SKILL.md +0 -298
- package/skills/pikku-cli/SKILL.md +0 -198
- package/skills/pikku-cli/references/complete-example.md +0 -82
- package/skills/pikku-concepts/SKILL.md +0 -250
- package/skills/pikku-concepts/references/concept-mapping.md +0 -556
- package/skills/pikku-concepts/references/packages.md +0 -29
- package/skills/pikku-config/SKILL.md +0 -212
- package/skills/pikku-cron/SKILL.md +0 -214
- package/skills/pikku-deploy-azure/SKILL.md +0 -71
- package/skills/pikku-deploy-cloudflare/SKILL.md +0 -82
- package/skills/pikku-deploy-express/SKILL.md +0 -86
- package/skills/pikku-deploy-fastify/SKILL.md +0 -73
- package/skills/pikku-deploy-lambda/SKILL.md +0 -110
- package/skills/pikku-deploy-nextjs/SKILL.md +0 -78
- package/skills/pikku-deploy-uws/SKILL.md +0 -88
- package/skills/pikku-deps/SKILL.md +0 -98
- package/skills/pikku-emails/SKILL.md +0 -163
- package/skills/pikku-fabric/SKILL.md +0 -318
- package/skills/pikku-fabric-debug/SKILL.md +0 -112
- package/skills/pikku-feature/SKILL.md +0 -258
- package/skills/pikku-gateway-slack/SKILL.md +0 -115
- package/skills/pikku-http/SKILL.md +0 -220
- package/skills/pikku-http/references/http-options.md +0 -55
- package/skills/pikku-i18n/SKILL.md +0 -137
- package/skills/pikku-info/SKILL.md +0 -100
- package/skills/pikku-jose/SKILL.md +0 -105
- package/skills/pikku-kysely/SKILL.md +0 -219
- package/skills/pikku-machine-auth/SKILL.md +0 -183
- package/skills/pikku-mcp/SKILL.md +0 -241
- package/skills/pikku-middleware/SKILL.md +0 -231
- package/skills/pikku-middleware/references/middleware-patterns.md +0 -61
- package/skills/pikku-mongodb/SKILL.md +0 -105
- package/skills/pikku-n8n-import/SKILL.md +0 -109
- package/skills/pikku-n8n-import/SPEC.md +0 -84
- package/skills/pikku-n8n-import/references/addon-mapping.md +0 -121
- package/skills/pikku-n8n-import/references/code-translation.md +0 -121
- package/skills/pikku-n8n-import/references/loops-and-control.md +0 -87
- package/skills/pikku-paraglide/SKILL.md +0 -117
- package/skills/pikku-permissions/SKILL.md +0 -192
- package/skills/pikku-pino/SKILL.md +0 -79
- package/skills/pikku-product-second-opinion/README.md +0 -43
- package/skills/pikku-product-second-opinion/SKILL.md +0 -158
- package/skills/pikku-product-second-opinion/example/sample-report.md +0 -90
- package/skills/pikku-product-second-opinion/references/report-template.md +0 -73
- package/skills/pikku-queue/SKILL.md +0 -240
- package/skills/pikku-react/SKILL.md +0 -212
- package/skills/pikku-react-query/SKILL.md +0 -242
- package/skills/pikku-realtime/SKILL.md +0 -236
- package/skills/pikku-realtime/references/other-routes.md +0 -23
- package/skills/pikku-redis/SKILL.md +0 -90
- package/skills/pikku-rpc/SKILL.md +0 -171
- package/skills/pikku-rtl/SKILL.md +0 -219
- package/skills/pikku-scenario/SKILL.md +0 -382
- package/skills/pikku-schedule/SKILL.md +0 -57
- package/skills/pikku-schema-ajv/SKILL.md +0 -62
- package/skills/pikku-schema-cfworker/SKILL.md +0 -63
- package/skills/pikku-security/SKILL.md +0 -108
- package/skills/pikku-services/SKILL.md +0 -248
- package/skills/pikku-services/references/audit-wire-service.md +0 -34
- package/skills/pikku-software-archaeology/README.md +0 -70
- package/skills/pikku-software-archaeology/SKILL.md +0 -186
- package/skills/pikku-software-archaeology/references/blueprint.schema.json +0 -625
- package/skills/pikku-software-archaeology/references/pikku-mapping.md +0 -49
- package/skills/pikku-software-archaeology/scripts/validate.mjs +0 -173
- package/skills/pikku-tag-middleware/SKILL.md +0 -13
- package/skills/pikku-template-clone/SKILL.md +0 -40
- package/skills/pikku-trigger/SKILL.md +0 -181
- package/skills/pikku-versioning/SKILL.md +0 -173
- package/skills/pikku-websocket/SKILL.md +0 -243
- package/skills/pikku-workflow/SKILL.md +0 -172
- package/skills/pikku-workflow/references/workflow-reference.md +0 -63
- package/skills/pikku-workflows-client/SKILL.md +0 -150
- 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
|
-
}
|