@pikku/addon-console 0.12.48 → 0.12.49

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 (118) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/.pikku/addon/agent/index.d.ts +1 -1
  3. package/dist/.pikku/addon/agent/index.js +1 -1
  4. package/dist/.pikku/addon/agent/pikku-agent-map.gen.d.ts +1 -1
  5. package/dist/.pikku/addon/agent/pikku-agent-types.gen.d.ts +1 -1
  6. package/dist/.pikku/addon/agent/pikku-model-aliases.gen.js +1 -1
  7. package/dist/.pikku/addon/agent/pikku-scorer-names.gen.d.ts +1 -1
  8. package/dist/.pikku/addon/auth/auth.types.d.ts +1 -1
  9. package/dist/.pikku/addon/auth/auth.types.js +1 -1
  10. package/dist/.pikku/addon/auth/index.d.ts +1 -1
  11. package/dist/.pikku/addon/auth/index.js +1 -1
  12. package/dist/.pikku/addon/auth/pikku-auth-types.gen.d.ts +1 -1
  13. package/dist/.pikku/addon/auth/pikku-auth-types.gen.js +1 -1
  14. package/dist/.pikku/addon/channel/index.d.ts +1 -1
  15. package/dist/.pikku/addon/channel/index.js +1 -1
  16. package/dist/.pikku/addon/channel/pikku-channel-types.gen.d.ts +1 -1
  17. package/dist/.pikku/addon/channel/pikku-channel-types.gen.js +1 -1
  18. package/dist/.pikku/addon/error/index.d.ts +1 -1
  19. package/dist/.pikku/addon/error/index.js +1 -1
  20. package/dist/.pikku/addon/error/pikku-error-types.gen.d.ts +1 -1
  21. package/dist/.pikku/addon/error/pikku-error-types.gen.js +1 -1
  22. package/dist/.pikku/addon/function/index.d.ts +1 -1
  23. package/dist/.pikku/addon/function/index.js +1 -1
  24. package/dist/.pikku/addon/function/pikku-function-types.gen.d.ts +1 -1
  25. package/dist/.pikku/addon/function/pikku-function-types.gen.js +1 -1
  26. package/dist/.pikku/addon/function/pikku-functions-meta-verbose.gen.json +2 -2
  27. package/dist/.pikku/addon/function/pikku-functions-meta.gen.js +1 -1
  28. package/dist/.pikku/addon/function/pikku-functions-meta.gen.json +2 -2
  29. package/dist/.pikku/addon/function/pikku-functions.gen.js +1 -1
  30. package/dist/.pikku/addon/http/index.d.ts +1 -1
  31. package/dist/.pikku/addon/http/index.js +1 -1
  32. package/dist/.pikku/addon/http/pikku-http-types.gen.d.ts +1 -1
  33. package/dist/.pikku/addon/http/pikku-http-types.gen.js +1 -1
  34. package/dist/.pikku/addon/mcp/index.d.ts +1 -1
  35. package/dist/.pikku/addon/mcp/index.js +1 -1
  36. package/dist/.pikku/addon/mcp/pikku-mcp-types.gen.d.ts +1 -1
  37. package/dist/.pikku/addon/mcp/pikku-mcp-types.gen.js +1 -1
  38. package/dist/.pikku/addon/middleware/index.d.ts +1 -1
  39. package/dist/.pikku/addon/middleware/index.js +1 -1
  40. package/dist/.pikku/addon/middleware/pikku-middleware-types.gen.d.ts +1 -1
  41. package/dist/.pikku/addon/middleware/pikku-middleware-types.gen.js +1 -1
  42. package/dist/.pikku/addon/permissions/pikku-permissions.gen.d.ts +1 -1
  43. package/dist/.pikku/addon/permissions/pikku-permissions.gen.js +1 -1
  44. package/dist/.pikku/addon/pikku-bootstrap-scenarios.gen.d.ts +1 -1
  45. package/dist/.pikku/addon/pikku-bootstrap-scenarios.gen.js +1 -1
  46. package/dist/.pikku/addon/pikku-bootstrap.gen.d.ts +1 -1
  47. package/dist/.pikku/addon/pikku-bootstrap.gen.js +1 -1
  48. package/dist/.pikku/addon/pikku-package.gen.js +2 -2
  49. package/dist/.pikku/addon/pikku-package.gen.js.map +1 -1
  50. package/dist/.pikku/addon/pikku-services.gen.d.ts +2 -2
  51. package/dist/.pikku/addon/pikku-services.gen.d.ts.map +1 -1
  52. package/dist/.pikku/addon/pikku-services.gen.js +1 -1
  53. package/dist/.pikku/addon/pikku-services.gen.js.map +1 -1
  54. package/dist/.pikku/addon/rpc/pikku-rpc-wirings-map.gen.d.ts +1 -1
  55. package/dist/.pikku/addon/rpc/pikku-rpc-wirings-map.internal.gen.d.ts +1 -1
  56. package/dist/.pikku/addon/rpc/pikku-rpc-wirings-map.remote.gen.d.ts +1 -1
  57. package/dist/.pikku/addon/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
  58. package/dist/.pikku/addon/scenarios/index.d.ts +1 -1
  59. package/dist/.pikku/addon/scenarios/index.js +1 -1
  60. package/dist/.pikku/addon/scenarios/pikku-personas.gen.js +1 -1
  61. package/dist/.pikku/addon/scenarios/pikku-scenario-functions-meta.gen.js +1 -1
  62. package/dist/.pikku/addon/scenarios/pikku-scenario-functions.gen.d.ts +1 -1
  63. package/dist/.pikku/addon/scenarios/pikku-scenario-types.gen.d.ts +1 -1
  64. package/dist/.pikku/addon/scenarios/pikku-scenario-wirings-meta.gen.js +1 -1
  65. package/dist/.pikku/addon/scenarios/pikku-scenario-wirings.gen.d.ts +1 -1
  66. package/dist/.pikku/addon/scenarios/schemas/register.gen.d.ts +1 -1
  67. package/dist/.pikku/addon/scenarios/schemas/register.gen.js +1 -1
  68. package/dist/.pikku/addon/schemas/register.gen.js +1 -1
  69. package/dist/.pikku/addon/schemas/schemas/KnowledgeBundle.schema.json +1 -1
  70. package/dist/.pikku/addon/scopes/index.d.ts +1 -1
  71. package/dist/.pikku/addon/scopes/index.js +1 -1
  72. package/dist/.pikku/addon/scopes/pikku-personas.gen.js +1 -1
  73. package/dist/.pikku/addon/scopes/pikku-roles.gen.d.ts +1 -1
  74. package/dist/.pikku/addon/scopes/pikku-scope-types.gen.d.ts +1 -1
  75. package/dist/.pikku/addon/scopes/pikku-scope-types.gen.js +1 -1
  76. package/dist/.pikku/addon/scopes/pikku-scopes.gen.d.ts +1 -1
  77. package/dist/.pikku/addon/secrets/index.d.ts +1 -1
  78. package/dist/.pikku/addon/secrets/index.js +1 -1
  79. package/dist/.pikku/addon/secrets/pikku-secret-types.gen.d.ts +1 -1
  80. package/dist/.pikku/addon/secrets/pikku-secret-types.gen.js +1 -1
  81. package/dist/.pikku/addon/secrets/pikku-secrets.gen.d.ts +1 -1
  82. package/dist/.pikku/addon/secrets/pikku-secrets.gen.js +1 -1
  83. package/dist/.pikku/addon/services/pikku-meta-service.gen.d.ts +1 -1
  84. package/dist/.pikku/addon/services/pikku-meta-service.gen.js +1 -1
  85. package/dist/.pikku/addon/setup/index.d.ts +1 -1
  86. package/dist/.pikku/addon/setup/index.js +1 -1
  87. package/dist/.pikku/addon/setup/pikku-addon-setup-types.gen.d.ts +1 -1
  88. package/dist/.pikku/addon/setup/pikku-addon-setup-types.gen.js +1 -1
  89. package/dist/.pikku/addon/setup/pikku-setup-types.gen.d.ts +1 -1
  90. package/dist/.pikku/addon/setup/pikku-setup-types.gen.js +1 -1
  91. package/dist/.pikku/addon/trigger/index.d.ts +1 -1
  92. package/dist/.pikku/addon/trigger/index.js +1 -1
  93. package/dist/.pikku/addon/trigger/pikku-trigger-types.gen.d.ts +1 -1
  94. package/dist/.pikku/addon/trigger/pikku-trigger-types.gen.js +1 -1
  95. package/dist/.pikku/addon/variables/index.d.ts +1 -1
  96. package/dist/.pikku/addon/variables/index.js +1 -1
  97. package/dist/.pikku/addon/variables/pikku-variable-types.gen.d.ts +1 -1
  98. package/dist/.pikku/addon/variables/pikku-variable-types.gen.js +1 -1
  99. package/dist/.pikku/addon/variables/pikku-variables.gen.d.ts +1 -1
  100. package/dist/.pikku/addon/variables/pikku-variables.gen.js +1 -1
  101. package/dist/.pikku/addon/workflow/index.d.ts +1 -1
  102. package/dist/.pikku/addon/workflow/index.js +1 -1
  103. package/dist/.pikku/addon/workflow/pikku-scenario-step-map.gen.d.ts +1 -1
  104. package/dist/.pikku/addon/workflow/pikku-workflow-map.gen.d.ts +1 -1
  105. package/dist/.pikku/addon/workflow/pikku-workflow-types.gen.d.ts +1 -1
  106. package/dist/.pikku/addon/workflow/pikku-workflow-types.gen.js +1 -1
  107. package/dist/.pikku/addon/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
  108. package/dist/.pikku/addon/workflow/pikku-workflow-wirings.gen.d.ts +1 -1
  109. package/dist/.pikku/addon/workflow/pikku-workflow-wirings.gen.js +1 -1
  110. package/dist/src/functions/get-knowledge.function.test.js +1 -0
  111. package/dist/src/functions/get-knowledge.function.test.js.map +1 -1
  112. package/dist/src/services/knowledge.service.d.ts +113 -1
  113. package/dist/src/services/knowledge.service.d.ts.map +1 -1
  114. package/dist/src/services/knowledge.service.js +32 -2
  115. package/dist/src/services/knowledge.service.js.map +1 -1
  116. package/dist/src/services/knowledge.service.test.js +96 -0
  117. package/dist/src/services/knowledge.service.test.js.map +1 -1
  118. package/package.json +3 -3
@@ -1 +1 @@
1
- { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "notes": { "type": "array", "items": { "$ref": "#/definitions/KnowledgeGraphNote" } }, "sections": { "type": "array", "items": { "$ref": "#/definitions/KnowledgeSection" } }, "tagCounts": { "type": "object", "additionalProperties": { "type": "number" }, "description": "Tag → how many notes carry it, for a browsable facet." }, "stats": { "type": "object", "properties": { "notes": { "type": "number" }, "sections": { "type": "number" }, "links": { "type": "number" }, "dangling": { "type": "number" } }, "required": ["notes", "sections", "links", "dangling"], "additionalProperties": false }, "findings": { "type": "array", "items": { "$ref": "#/definitions/KnowledgeFinding" }, "description": "What `pikku knowledge validate` would report, so the console shows the same verdict." }, "ok": { "type": "boolean" } }, "required": ["findings", "notes", "ok", "sections", "stats", "tagCounts"], "additionalProperties": false, "definitions": { "KnowledgeGraphNote": { "type": "object", "properties": { "path": { "type": "string" }, "section": { "type": "string", "description": "`''` for a note at the root of knowledge/." }, "type": { "type": "string" }, "title": { "type": "string" }, "description": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } }, "resource": { "type": "array", "items": { "type": "string" }, "description": "The `<kind>:<id>` URIs from `resource:`, already split." }, "status": { "type": "string" }, "statusAt": { "type": "string", "description": "When `status` last changed, for a reader asking how long it has been there." }, "entities": { "type": "array", "items": { "type": "string" } }, "reserved": { "type": "string", "enum": ["index", "log"] }, "body": { "type": "string" }, "outbound": { "type": "array", "items": { "type": "string" }, "description": "Notes this one links to, as bundle-relative paths." }, "inbound": { "type": "array", "items": { "type": "string" }, "description": "Notes that link to this one." }, "dangling": { "type": "array", "items": { "type": "string" }, "description": "Link targets that resolve to no note. Legal in OKF — a note not written yet." } }, "required": ["path", "section", "title", "tags", "resource", "entities", "body", "outbound", "inbound", "dangling"], "additionalProperties": false, "description": "Declared rather than inferred, for the reason given on `KnowledgeFinding`: this shape is the body of the `getKnowledge` RPC's output, and a `z.infer<>` is not something a JSON-schema generator can walk.\n\nNote this is necessary but not sufficient for that RPC to ship an output schema — `KnowledgeBundle` reaches this type across a package boundary, and the inspector registers no type whose base is declared in another package." }, "KnowledgeSection": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "count": { "type": "number" } }, "required": ["name", "count"], "additionalProperties": false }, "KnowledgeFinding": { "type": "object", "properties": { "id": { "type": "string" }, "severity": { "type": "string", "enum": ["error", "warn", "info"] }, "message": { "type": "string" }, "path": { "type": "string" }, "fixHint": { "type": "string" } }, "required": ["id", "severity", "message", "path", "fixHint"], "additionalProperties": false, "description": "Declared, not inferred from the schema below.\n\nA finding crosses an RPC boundary as part of the `getKnowledge` payload, and a `z.infer<>` is not a type a JSON-schema generator can walk: zod's inference bottoms out in `this` types, so ts-json-schema-generator fails outright on it. An interface generates. The `satisfies` is what keeps the two from drifting — a field added to one and not the other is a compile error." } } }
1
+ { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "notes": { "type": "array", "items": { "$ref": "#/definitions/KnowledgeGraphNote" } }, "sections": { "type": "array", "items": { "$ref": "#/definitions/KnowledgeSection" } }, "tagCounts": { "type": "object", "additionalProperties": { "type": "number" }, "description": "Tag → how many notes carry it, for a browsable facet." }, "stats": { "type": "object", "properties": { "notes": { "type": "number" }, "sections": { "type": "number" }, "links": { "type": "number" }, "dangling": { "type": "number" } }, "required": ["notes", "sections", "links", "dangling"], "additionalProperties": false }, "findings": { "type": "array", "items": { "$ref": "#/definitions/KnowledgeFinding" }, "description": "What `pikku knowledge validate` would report, so the console shows the same verdict." }, "ok": { "type": "boolean" }, "plans": { "type": "object", "additionalProperties": { "$ref": "#/definitions/KnowledgeMilestonePlan" }, "description": "Keyed by the milestone note's path, so a note document can find its own plan." } }, "required": ["findings", "notes", "ok", "plans", "sections", "stats", "tagCounts"], "additionalProperties": false, "definitions": { "KnowledgeGraphNote": { "type": "object", "properties": { "path": { "type": "string" }, "section": { "type": "string", "description": "`''` for a note at the root of knowledge/." }, "type": { "type": "string" }, "title": { "type": "string" }, "description": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } }, "resource": { "type": "array", "items": { "type": "string" }, "description": "The `<kind>:<id>` URIs from `resource:`, already split." }, "status": { "type": "string" }, "statusAt": { "type": "string", "description": "When `status` last changed, for a reader asking how long it has been there." }, "entities": { "type": "array", "items": { "type": "string" } }, "reserved": { "type": "string", "enum": ["index", "log"] }, "body": { "type": "string" }, "outbound": { "type": "array", "items": { "type": "string" }, "description": "Notes this one links to, as bundle-relative paths." }, "inbound": { "type": "array", "items": { "type": "string" }, "description": "Notes that link to this one." }, "dangling": { "type": "array", "items": { "type": "string" }, "description": "Link targets that resolve to no note. Legal in OKF — a note not written yet." } }, "required": ["path", "section", "title", "tags", "resource", "entities", "body", "outbound", "inbound", "dangling"], "additionalProperties": false, "description": "Declared rather than inferred, for the reason given on `KnowledgeFinding`: this shape is the body of the `getKnowledge` RPC's output, and a `z.infer<>` is not something a JSON-schema generator can walk.\n\nNote this is necessary but not sufficient for that RPC to ship an output schema — `KnowledgeBundle` reaches this type across a package boundary, and the inspector registers no type whose base is declared in another package." }, "KnowledgeSection": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "count": { "type": "number" } }, "required": ["name", "count"], "additionalProperties": false }, "KnowledgeFinding": { "type": "object", "properties": { "id": { "type": "string" }, "severity": { "type": "string", "enum": ["error", "warn", "info"] }, "message": { "type": "string" }, "path": { "type": "string" }, "fixHint": { "type": "string" } }, "required": ["id", "severity", "message", "path", "fixHint"], "additionalProperties": false, "description": "Declared, not inferred from the schema below.\n\nA finding crosses an RPC boundary as part of the `getKnowledge` payload, and a `z.infer<>` is not a type a JSON-schema generator can walk: zod's inference bottoms out in `this` types, so ts-json-schema-generator fails outright on it. An interface generates. The `satisfies` is what keeps the two from drifting — a field added to one and not the other is a compile error." }, "KnowledgeMilestonePlan": { "type": "object", "properties": { "plan": { "anyOf": [{ "$ref": "#/definitions/WirePlan" }, { "type": "null" }] }, "unavailable": { "type": ["string", "null"], "description": "Why there is no plan, for the reader to be told instead of being shown an empty one. `readPlan` already separates \"nobody wrote one\" from \"one is there and will not parse\", and those want different words in front of a person." }, "checklist": { "type": "array", "items": { "$ref": "#/definitions/PlanChecklistItem" } }, "complete": { "type": "boolean" } }, "required": ["plan", "unavailable", "checklist", "complete"], "additionalProperties": false, "description": "One milestone's technical plan, reconciled against the generated meta.\n\nThe milestone note is the ask — a title and a Gherkin block. The plan beside it is the answer: the tables, functions, roles, screens and scenarios that were promised. The checklist rides along rather than being a second call, because every row is a set-membership test against the same meta read, and a checklist fetched separately could disagree with the plan it is drawn beside." }, "WirePlan": { "type": "object", "properties": { "version": { "type": "number" }, "milestone": { "type": "string" }, "description": { "type": "string" }, "covers": { "type": "array", "items": { "$ref": "#/definitions/PlanCovers" } }, "model": { "$ref": "#/definitions/PlanSlot<PlanModelItem>" }, "functions": { "$ref": "#/definitions/PlanSlot<PlanFunctionItem>" }, "roles": { "$ref": "#/definitions/PlanSlot<PlanRoleItem>" }, "scopes": { "$ref": "#/definitions/PlanSlot<PlanNamedItem>" }, "ui": { "$ref": "#/definitions/PlanSlot<PlanUiItem>" }, "scenarios": { "type": "object", "properties": { "backend": { "$ref": "#/definitions/PlanSlot<PlanScenarioItem>" }, "browser": { "$ref": "#/definitions/PlanSlot<PlanScenarioItem>" }, "permission": { "$ref": "#/definitions/PlanSlot<PlanScenarioItem>" } }, "required": ["backend", "browser", "permission"], "additionalProperties": false } }, "required": ["version", "milestone", "description", "covers", "model", "functions", "roles", "scopes", "ui", "scenarios"], "additionalProperties": false }, "PlanCovers": { "type": "object", "properties": { "note": { "type": "string" }, "hash": { "type": "string" }, "complete": { "type": "boolean" } }, "required": ["note", "hash", "complete"], "additionalProperties": false }, "PlanSlot<PlanModelItem>": { "anyOf": [{ "type": "object", "properties": { "kind": { "type": "string", "const": "built" }, "description": { "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/definitions/PlanModelItem" } } }, "required": ["kind", "description", "items"], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "type": "string", "const": "n/a" }, "description": { "type": "string" } }, "required": ["kind", "description"], "additionalProperties": false }], "description": "The plan as it goes over the wire.\n\nStructurally the same as `Plan` in" }, "PlanModelItem": { "type": "object", "properties": { "table": { "type": "string" }, "description": { "type": "string" }, "fields": { "type": "array", "items": { "$ref": "#/definitions/PlanModelField" } }, "relationships": { "type": "array", "items": { "$ref": "#/definitions/PlanModelRelationship" } } }, "required": ["table", "description", "fields", "relationships"], "additionalProperties": false }, "PlanModelField": { "type": "object", "properties": { "name": { "type": "string" }, "type": { "type": "string" }, "classification": { "type": "string", "enum": ["public", "internal", "personal", "sensitive"] } }, "required": ["name", "type", "classification"], "additionalProperties": false }, "PlanModelRelationship": { "type": "object", "properties": { "column": { "type": "string" }, "references": { "type": "string" }, "onDelete": { "type": "string", "enum": ["cascade", "restrict", "orphan"] }, "provedBy": { "type": "string" } }, "required": ["column", "references", "onDelete"], "additionalProperties": false }, "PlanSlot<PlanFunctionItem>": { "anyOf": [{ "type": "object", "properties": { "kind": { "type": "string", "const": "built" }, "description": { "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/definitions/PlanFunctionItem" } } }, "required": ["kind", "description", "items"], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "type": "string", "const": "n/a" }, "description": { "type": "string" } }, "required": ["kind", "description"], "additionalProperties": false }], "description": "The plan as it goes over the wire.\n\nStructurally the same as `Plan` in" }, "PlanFunctionItem": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "pass": { "type": "number" }, "wire": { "anyOf": [{ "type": "object", "properties": { "transport": { "type": "string" }, "route": { "type": "string" } }, "required": ["transport"], "additionalProperties": false }, { "type": "null" }] }, "scopes": { "type": "array", "items": { "type": "string" } }, "permission": { "type": ["string", "null"] } }, "required": ["name", "description", "pass", "scopes", "permission"], "additionalProperties": false }, "PlanSlot<PlanRoleItem>": { "anyOf": [{ "type": "object", "properties": { "kind": { "type": "string", "const": "built" }, "description": { "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/definitions/PlanRoleItem" } } }, "required": ["kind", "description", "items"], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "type": "string", "const": "n/a" }, "description": { "type": "string" } }, "required": ["kind", "description"], "additionalProperties": false }], "description": "The plan as it goes over the wire.\n\nStructurally the same as `Plan` in" }, "PlanRoleItem": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "app": { "type": "string" } }, "additionalProperties": false, "required": ["description", "name"] }, "PlanSlot<PlanNamedItem>": { "anyOf": [{ "type": "object", "properties": { "kind": { "type": "string", "const": "built" }, "description": { "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/definitions/PlanNamedItem" } } }, "required": ["kind", "description", "items"], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "type": "string", "const": "n/a" }, "description": { "type": "string" } }, "required": ["kind", "description"], "additionalProperties": false }], "description": "The plan as it goes over the wire.\n\nStructurally the same as `Plan` in" }, "PlanNamedItem": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, "required": ["name", "description"], "additionalProperties": false }, "PlanSlot<PlanUiItem>": { "anyOf": [{ "type": "object", "properties": { "kind": { "type": "string", "const": "built" }, "description": { "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/definitions/PlanUiItem" } } }, "required": ["kind", "description", "items"], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "type": "string", "const": "n/a" }, "description": { "type": "string" } }, "required": ["kind", "description"], "additionalProperties": false }], "description": "The plan as it goes over the wire.\n\nStructurally the same as `Plan` in" }, "PlanUiItem": { "type": "object", "properties": { "route": { "type": "string" }, "description": { "type": "string" }, "pass": { "type": "number" }, "app": { "type": "string" }, "scenarios": { "type": "array", "items": { "type": "string" } } }, "required": ["route", "description", "pass", "scenarios"], "additionalProperties": false }, "PlanSlot<PlanScenarioItem>": { "anyOf": [{ "type": "object", "properties": { "kind": { "type": "string", "const": "built" }, "description": { "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/definitions/PlanScenarioItem" } } }, "required": ["kind", "description", "items"], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "type": "string", "const": "n/a" }, "description": { "type": "string" } }, "required": ["kind", "description"], "additionalProperties": false }], "description": "The plan as it goes over the wire.\n\nStructurally the same as `Plan` in" }, "PlanScenarioItem": { "type": "object", "properties": { "feature": { "type": "string" }, "scenario": { "type": "string" }, "fn": { "type": "string" }, "name": { "type": "string" } }, "required": ["feature", "scenario"], "additionalProperties": false }, "PlanChecklistItem": { "type": "object", "properties": { "id": { "type": "string", "description": "Stable across turns so the console can keep row identity as items land." }, "label": { "type": "string", "description": "What the plan called it — the description a reader recognises, not the symbol." }, "kind": { "type": "string", "enum": ["function", "wire", "scope", "scenario"] }, "done": { "type": "boolean" }, "deferred": { "type": "boolean", "description": "Promised by a later pass, so `fabric build-complete` never asks for it.\n\nSet by `planShortfall`, which is the only caller that can see every pass at once — `planProgress` works one pass at a time and leaves it false." } }, "required": ["id", "label", "kind", "done", "deferred"], "additionalProperties": false, "description": "One row of the build checklist the console renders.\n\n`done` is a set-membership test against codegen's meta, never a status anything types. That is the whole reason this replaced the agent's own todo list: a task the agent marks `completed` says only that it claimed to finish, and run 10 is the case against it — refused with four of six tasks unfinished, all four flipped to `completed` nine seconds later with nothing built." } } }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/scopes` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/scopes` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * This file was generated by the @pikku/cli
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * This file was generated by the @pikku/cli
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  export { defineScope } from '@pikku/core/scope';
5
5
  export { defineSystemRole } from '@pikku/core/role';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  export { defineScope } from '@pikku/core/scope';
5
5
  export { defineSystemRole } from '@pikku/core/role';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * This file was generated by the @pikku/cli
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/secrets` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/secrets` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  export { defineSecret } from '@pikku/core/secret';
5
5
  //# sourceMappingURL=pikku-secret-types.gen.d.ts.map
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  export { defineSecret } from '@pikku/core/secret';
5
5
  //# sourceMappingURL=pikku-secret-types.gen.js.map
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  import { TypedSecretService as CoreTypedSecretService } from '@pikku/core/services';
5
5
  import type { SecretService } from '@pikku/core/services';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  import { TypedSecretService as CoreTypedSecretService } from '@pikku/core/services';
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  import { LocalMetaService } from '@pikku/core/services/local-meta';
5
5
  export declare class PikkuMetaService extends LocalMetaService {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  import { LocalMetaService } from '@pikku/core/services/local-meta';
5
5
  export class PikkuMetaService extends LocalMetaService {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/setup` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/setup` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Addon package types for pikkuAddonConfig and pikkuAddonServices
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Addon package types for pikkuAddonConfig and pikkuAddonServices
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Config and service factory definitions, declared once per application
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Config and service factory definitions, declared once per application
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/trigger` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/trigger` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Trigger-specific type definitions for tree-shaking optimization
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Trigger-specific type definitions for tree-shaking optimization
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/variables` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/variables` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  export { defineVariable } from '@pikku/core/variable';
5
5
  //# sourceMappingURL=pikku-variable-types.gen.d.ts.map
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  export { defineVariable } from '@pikku/core/variable';
5
5
  //# sourceMappingURL=pikku-variable-types.gen.js.map
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  import { TypedVariablesService as CoreTypedVariablesService } from '@pikku/core/services';
5
5
  import type { VariablesService } from '@pikku/core/services';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  import { TypedVariablesService as CoreTypedVariablesService, } from '@pikku/core/services';
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/workflow` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Subpath entry — `#pikku/workflow` resolves here.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Scenario step map: the names `scenario.given/when/then` accepts, with
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  /**
5
5
  * Workflow type map with input/output types for each workflow
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  import { WorkflowCancelledException } from '@pikku/core/workflow';
5
5
  import type { PikkuWorkflowGraphConfig, PikkuWorkflowGraphResult } from '@pikku/core/workflow';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  import { WorkflowCancelledException } from '@pikku/core/workflow';
5
5
  import { pikkuWorkflowGraph as corePikkuWorkflowGraph } from '@pikku/core/workflow';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file was generated by @pikku/cli@0.12.125
2
+ * This file was generated by @pikku/cli@0.12.133
3
3
  */
4
4
  import { pikkuState } from '@pikku/core/state';
5
5
  const workflowsMeta = {};
@@ -1,5 +1,5 @@
1
1
  export {};
2
2
  /**
3
- * This file was generated by @pikku/cli@0.12.125
3
+ * This file was generated by @pikku/cli@0.12.133
4
4
  */
5
5
  //# sourceMappingURL=pikku-workflow-wirings.gen.d.ts.map
@@ -1,5 +1,5 @@
1
1
  export {};
2
2
  /**
3
- * This file was generated by @pikku/cli@0.12.125
3
+ * This file was generated by @pikku/cli@0.12.133
4
4
  */
5
5
  //# sourceMappingURL=pikku-workflow-wirings.gen.js.map
@@ -9,6 +9,7 @@ const BUNDLE = {
9
9
  stats: { notes: 0, sections: 0, links: 0, dangling: 0 },
10
10
  findings: [],
11
11
  ok: true,
12
+ plans: {},
12
13
  };
13
14
  test('getKnowledge hands back whatever the service read off disk', async () => {
14
15
  const result = await getKnowledge.func({ knowledgeService: { getBundle: async () => BUNDLE } }, null, {});
@@ -1 +1 @@
1
- {"version":3,"file":"get-knowledge.function.test.js","sourceRoot":"","sources":["../../../src/functions/get-knowledge.function.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAG1D,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,EAAE;IACb,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;IACvD,QAAQ,EAAE,EAAE;IACZ,EAAE,EAAE,IAAI;CACU,CAAA;AAEpB,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;IAC5E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CACpC,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,EAAW,EAChE,IAAa,EACb,EAAW,CACZ,CAAA;IACD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAClC,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;IAClF,uEAAuE;IACvE,8EAA8E;IAC9E,wEAAwE;IACxE,6CAA6C;IAC7C,MAAM,MAAM,CAAC,OAAO,CAClB,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAW,EAAE,IAAa,EAAE,EAAW,CAAC,EAChE,yBAAyB,CAC1B,CAAA;AACH,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"get-knowledge.function.test.js","sourceRoot":"","sources":["../../../src/functions/get-knowledge.function.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAG1D,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,EAAE;IACb,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;IACvD,QAAQ,EAAE,EAAE;IACZ,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,EAAE;CACS,CAAA;AAEpB,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;IAC5E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CACpC,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,EAAW,EAChE,IAAa,EACb,EAAW,CACZ,CAAA;IACD,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAClC,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;IAClF,uEAAuE;IACvE,8EAA8E;IAC9E,wEAAwE;IACxE,6CAA6C;IAC7C,MAAM,MAAM,CAAC,OAAO,CAClB,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAW,EAAE,IAAa,EAAE,EAAW,CAAC,EAChE,yBAAyB,CAC1B,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,8 +1,119 @@
1
- import { type KnowledgeFinding, type KnowledgeGraph } from '@pikku/knowledge';
1
+ import { type KnowledgeFinding, type KnowledgeGraph, type PlanChecklistItem } from '@pikku/knowledge';
2
+ /**
3
+ * The plan as it goes over the wire.
4
+ *
5
+ * Structurally the same as `Plan` in @pikku/knowledge, restated as plain interfaces
6
+ * because that one is inferred from a zod schema, and schema generation cannot walk
7
+ * an inferred type that deep — the whole bundle then names a schema nobody
8
+ * generated, and `getKnowledge` fails at runtime with `MissingSchemaError`.
9
+ *
10
+ * Nothing here is free to drift: `readPlan` hands back the zod type and it is
11
+ * assigned straight into this field, so a plan schema that grows a case these
12
+ * interfaces do not have stops compiling.
13
+ */
14
+ export type PlanSlot<T> = {
15
+ kind: 'built';
16
+ description: string;
17
+ items: T[];
18
+ } | {
19
+ kind: 'n/a';
20
+ description: string;
21
+ };
22
+ export interface PlanModelField {
23
+ name: string;
24
+ type: string;
25
+ classification: 'public' | 'internal' | 'personal' | 'sensitive';
26
+ }
27
+ export interface PlanModelRelationship {
28
+ column: string;
29
+ references: string;
30
+ onDelete: 'cascade' | 'restrict' | 'orphan';
31
+ provedBy?: string;
32
+ }
33
+ export interface PlanModelItem {
34
+ table: string;
35
+ description: string;
36
+ fields: PlanModelField[];
37
+ relationships: PlanModelRelationship[];
38
+ }
39
+ export interface PlanFunctionItem {
40
+ name: string;
41
+ description: string;
42
+ pass: number;
43
+ wire?: {
44
+ transport: string;
45
+ route?: string;
46
+ } | null;
47
+ scopes: string[];
48
+ permission: string | null;
49
+ }
50
+ export interface PlanUiItem {
51
+ route: string;
52
+ description: string;
53
+ pass: number;
54
+ app?: string;
55
+ scenarios: string[];
56
+ }
57
+ export interface PlanNamedItem {
58
+ name: string;
59
+ description: string;
60
+ }
61
+ export interface PlanRoleItem extends PlanNamedItem {
62
+ app?: string;
63
+ }
64
+ export interface PlanScenarioItem {
65
+ feature: string;
66
+ scenario: string;
67
+ fn?: string;
68
+ name?: string;
69
+ }
70
+ export interface PlanCovers {
71
+ note: string;
72
+ hash: string;
73
+ complete: boolean;
74
+ }
75
+ export interface WirePlan {
76
+ version: number;
77
+ milestone: string;
78
+ description: string;
79
+ covers: PlanCovers[];
80
+ model: PlanSlot<PlanModelItem>;
81
+ functions: PlanSlot<PlanFunctionItem>;
82
+ roles: PlanSlot<PlanRoleItem>;
83
+ scopes: PlanSlot<PlanNamedItem>;
84
+ ui: PlanSlot<PlanUiItem>;
85
+ scenarios: {
86
+ backend: PlanSlot<PlanScenarioItem>;
87
+ browser: PlanSlot<PlanScenarioItem>;
88
+ permission: PlanSlot<PlanScenarioItem>;
89
+ };
90
+ }
91
+ /**
92
+ * One milestone's technical plan, reconciled against the generated meta.
93
+ *
94
+ * The milestone note is the ask — a title and a Gherkin block. The plan beside it is
95
+ * the answer: the tables, functions, roles, screens and scenarios that were promised.
96
+ * The checklist rides along rather than being a second call, because every row is a
97
+ * set-membership test against the same meta read, and a checklist fetched separately
98
+ * could disagree with the plan it is drawn beside.
99
+ */
100
+ export interface KnowledgeMilestonePlan {
101
+ plan: WirePlan | null;
102
+ /**
103
+ * Why there is no plan, for the reader to be told instead of being shown an empty
104
+ * one. `readPlan` already separates "nobody wrote one" from "one is there and will
105
+ * not parse", and those want different words in front of a person.
106
+ */
107
+ unavailable: string | null;
108
+ checklist: PlanChecklistItem[];
109
+ complete: boolean;
110
+ }
2
111
  export interface KnowledgeBundle extends KnowledgeGraph {
3
112
  /** What `pikku knowledge validate` would report, so the console shows the same verdict. */
4
113
  findings: KnowledgeFinding[];
5
114
  ok: boolean;
115
+ /** Keyed by the milestone note's path, so a note document can find its own plan. */
116
+ plans: Record<string, KnowledgeMilestonePlan>;
6
117
  }
7
118
  /**
8
119
  * Reads the project's `knowledge/` notes off disk on every call.
@@ -17,5 +128,6 @@ export declare class KnowledgeService {
17
128
  private readonly outDir;
18
129
  constructor(projectRoot: string, outDir: string);
19
130
  getBundle(): Promise<KnowledgeBundle>;
131
+ private getPlans;
20
132
  }
21
133
  //# sourceMappingURL=knowledge.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge.service.d.ts","sourceRoot":"","sources":["../../../src/services/knowledge.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EAIpB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,2FAA2F;IAC3F,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IAC5B,EAAE,EAAE,OAAO,CAAA;CACZ;AAED;;;;;;;GAOG;AACH,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM;IAG3B,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;CAc5C"}
1
+ {"version":3,"file":"knowledge.service.d.ts","sourceRoot":"","sources":["../../../src/services/knowledge.service.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { buildKnowledgeGraph, readKnowledgeNotes, runKnowledgeValidate, } from '@pikku/knowledge';
1
+ import { buildKnowledgeGraph, functionsDirFor, planShortfall, readKnowledgeNotes, readMilestones, readPikkuMeta, readPlan, runKnowledgeValidate, } from '@pikku/knowledge';
2
2
  /**
3
3
  * Reads the project's `knowledge/` notes off disk on every call.
4
4
  *
@@ -20,7 +20,37 @@ export class KnowledgeService {
20
20
  const notes = await readKnowledgeNotes(this.projectRoot);
21
21
  const graph = buildKnowledgeGraph(notes);
22
22
  const { ok, findings } = await runKnowledgeValidate(this.projectRoot, this.outDir, notes);
23
- return { ...graph, ok, findings };
23
+ return { ...graph, ok, findings, plans: await this.getPlans() };
24
+ }
25
+ async getPlans() {
26
+ const milestones = await readMilestones(this.projectRoot);
27
+ if (milestones.length === 0)
28
+ return {};
29
+ // Read once for every milestone rather than per note: the meta is the whole
30
+ // project's, so re-reading it per plan would say the same thing several times
31
+ // over and let two milestones on one page disagree about what exists.
32
+ const meta = readPikkuMeta(functionsDirFor(this.projectRoot));
33
+ const plans = {};
34
+ for (const note of milestones) {
35
+ const read = readPlan(this.projectRoot, note.path);
36
+ if (!read.ok) {
37
+ plans[note.path] = {
38
+ plan: null,
39
+ unavailable: read.reason,
40
+ checklist: [],
41
+ complete: false,
42
+ };
43
+ continue;
44
+ }
45
+ const { items, missing } = planShortfall(read.plan, meta);
46
+ plans[note.path] = {
47
+ plan: read.plan,
48
+ unavailable: null,
49
+ checklist: items,
50
+ complete: missing.length === 0,
51
+ };
52
+ }
53
+ return plans;
24
54
  }
25
55
  }
26
56
  //# sourceMappingURL=knowledge.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge.service.js","sourceRoot":"","sources":["../../../src/services/knowledge.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,kBAAkB,CAAA;AAQzB;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAgB;IAC3B,YACmB,WAAmB,EACnB,MAAc;QADd,gBAAW,GAAX,WAAW,CAAQ;QACnB,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ,KAAK,CAAC,SAAS;QACb,6EAA6E;QAC7E,4EAA4E;QAC5E,0EAA0E;QAC1E,4BAA4B;QAC5B,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACxD,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,oBAAoB,CACjD,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,EACX,KAAK,CACN,CAAA;QACD,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAA;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"knowledge.service.js","sourceRoot":"","sources":["../../../src/services/knowledge.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,QAAQ,EACR,oBAAoB,GACrB,MAAM,kBAAkB,CAAA;AA2HzB;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAgB;IAC3B,YACmB,WAAmB,EACnB,MAAc;QADd,gBAAW,GAAX,WAAW,CAAQ;QACnB,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ,KAAK,CAAC,SAAS;QACb,6EAA6E;QAC7E,4EAA4E;QAC5E,0EAA0E;QAC1E,4BAA4B;QAC5B,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACxD,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,oBAAoB,CACjD,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,EACX,KAAK,CACN,CAAA;QACD,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAA;IACjE,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACzD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QACtC,4EAA4E;QAC5E,8EAA8E;QAC9E,sEAAsE;QACtE,MAAM,IAAI,GAAG,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;QAC7D,MAAM,KAAK,GAA2C,EAAE,CAAA;QACxD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YAClD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBACjB,IAAI,EAAE,IAAI;oBACV,WAAW,EAAE,IAAI,CAAC,MAAM;oBACxB,SAAS,EAAE,EAAE;oBACb,QAAQ,EAAE,KAAK;iBAChB,CAAA;gBACD,SAAQ;YACV,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;aAC/B,CAAA;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF"}