@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.
- package/CHANGELOG.md +26 -0
- package/dist/.pikku/addon/agent/index.d.ts +1 -1
- package/dist/.pikku/addon/agent/index.js +1 -1
- package/dist/.pikku/addon/agent/pikku-agent-map.gen.d.ts +1 -1
- package/dist/.pikku/addon/agent/pikku-agent-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/agent/pikku-model-aliases.gen.js +1 -1
- package/dist/.pikku/addon/agent/pikku-scorer-names.gen.d.ts +1 -1
- package/dist/.pikku/addon/auth/auth.types.d.ts +1 -1
- package/dist/.pikku/addon/auth/auth.types.js +1 -1
- package/dist/.pikku/addon/auth/index.d.ts +1 -1
- package/dist/.pikku/addon/auth/index.js +1 -1
- package/dist/.pikku/addon/auth/pikku-auth-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/auth/pikku-auth-types.gen.js +1 -1
- package/dist/.pikku/addon/channel/index.d.ts +1 -1
- package/dist/.pikku/addon/channel/index.js +1 -1
- package/dist/.pikku/addon/channel/pikku-channel-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/channel/pikku-channel-types.gen.js +1 -1
- package/dist/.pikku/addon/error/index.d.ts +1 -1
- package/dist/.pikku/addon/error/index.js +1 -1
- package/dist/.pikku/addon/error/pikku-error-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/error/pikku-error-types.gen.js +1 -1
- package/dist/.pikku/addon/function/index.d.ts +1 -1
- package/dist/.pikku/addon/function/index.js +1 -1
- package/dist/.pikku/addon/function/pikku-function-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/function/pikku-function-types.gen.js +1 -1
- package/dist/.pikku/addon/function/pikku-functions-meta-verbose.gen.json +2 -2
- package/dist/.pikku/addon/function/pikku-functions-meta.gen.js +1 -1
- package/dist/.pikku/addon/function/pikku-functions-meta.gen.json +2 -2
- package/dist/.pikku/addon/function/pikku-functions.gen.js +1 -1
- package/dist/.pikku/addon/http/index.d.ts +1 -1
- package/dist/.pikku/addon/http/index.js +1 -1
- package/dist/.pikku/addon/http/pikku-http-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/http/pikku-http-types.gen.js +1 -1
- package/dist/.pikku/addon/mcp/index.d.ts +1 -1
- package/dist/.pikku/addon/mcp/index.js +1 -1
- package/dist/.pikku/addon/mcp/pikku-mcp-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/mcp/pikku-mcp-types.gen.js +1 -1
- package/dist/.pikku/addon/middleware/index.d.ts +1 -1
- package/dist/.pikku/addon/middleware/index.js +1 -1
- package/dist/.pikku/addon/middleware/pikku-middleware-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/middleware/pikku-middleware-types.gen.js +1 -1
- package/dist/.pikku/addon/permissions/pikku-permissions.gen.d.ts +1 -1
- package/dist/.pikku/addon/permissions/pikku-permissions.gen.js +1 -1
- package/dist/.pikku/addon/pikku-bootstrap-scenarios.gen.d.ts +1 -1
- package/dist/.pikku/addon/pikku-bootstrap-scenarios.gen.js +1 -1
- package/dist/.pikku/addon/pikku-bootstrap.gen.d.ts +1 -1
- package/dist/.pikku/addon/pikku-bootstrap.gen.js +1 -1
- package/dist/.pikku/addon/pikku-package.gen.js +2 -2
- package/dist/.pikku/addon/pikku-package.gen.js.map +1 -1
- package/dist/.pikku/addon/pikku-services.gen.d.ts +2 -2
- package/dist/.pikku/addon/pikku-services.gen.d.ts.map +1 -1
- package/dist/.pikku/addon/pikku-services.gen.js +1 -1
- package/dist/.pikku/addon/pikku-services.gen.js.map +1 -1
- package/dist/.pikku/addon/rpc/pikku-rpc-wirings-map.gen.d.ts +1 -1
- package/dist/.pikku/addon/rpc/pikku-rpc-wirings-map.internal.gen.d.ts +1 -1
- package/dist/.pikku/addon/rpc/pikku-rpc-wirings-map.remote.gen.d.ts +1 -1
- package/dist/.pikku/addon/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
- package/dist/.pikku/addon/scenarios/index.d.ts +1 -1
- package/dist/.pikku/addon/scenarios/index.js +1 -1
- package/dist/.pikku/addon/scenarios/pikku-personas.gen.js +1 -1
- package/dist/.pikku/addon/scenarios/pikku-scenario-functions-meta.gen.js +1 -1
- package/dist/.pikku/addon/scenarios/pikku-scenario-functions.gen.d.ts +1 -1
- package/dist/.pikku/addon/scenarios/pikku-scenario-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/scenarios/pikku-scenario-wirings-meta.gen.js +1 -1
- package/dist/.pikku/addon/scenarios/pikku-scenario-wirings.gen.d.ts +1 -1
- package/dist/.pikku/addon/scenarios/schemas/register.gen.d.ts +1 -1
- package/dist/.pikku/addon/scenarios/schemas/register.gen.js +1 -1
- package/dist/.pikku/addon/schemas/register.gen.js +1 -1
- package/dist/.pikku/addon/schemas/schemas/KnowledgeBundle.schema.json +1 -1
- package/dist/.pikku/addon/scopes/index.d.ts +1 -1
- package/dist/.pikku/addon/scopes/index.js +1 -1
- package/dist/.pikku/addon/scopes/pikku-personas.gen.js +1 -1
- package/dist/.pikku/addon/scopes/pikku-roles.gen.d.ts +1 -1
- package/dist/.pikku/addon/scopes/pikku-scope-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/scopes/pikku-scope-types.gen.js +1 -1
- package/dist/.pikku/addon/scopes/pikku-scopes.gen.d.ts +1 -1
- package/dist/.pikku/addon/secrets/index.d.ts +1 -1
- package/dist/.pikku/addon/secrets/index.js +1 -1
- package/dist/.pikku/addon/secrets/pikku-secret-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/secrets/pikku-secret-types.gen.js +1 -1
- package/dist/.pikku/addon/secrets/pikku-secrets.gen.d.ts +1 -1
- package/dist/.pikku/addon/secrets/pikku-secrets.gen.js +1 -1
- package/dist/.pikku/addon/services/pikku-meta-service.gen.d.ts +1 -1
- package/dist/.pikku/addon/services/pikku-meta-service.gen.js +1 -1
- package/dist/.pikku/addon/setup/index.d.ts +1 -1
- package/dist/.pikku/addon/setup/index.js +1 -1
- package/dist/.pikku/addon/setup/pikku-addon-setup-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/setup/pikku-addon-setup-types.gen.js +1 -1
- package/dist/.pikku/addon/setup/pikku-setup-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/setup/pikku-setup-types.gen.js +1 -1
- package/dist/.pikku/addon/trigger/index.d.ts +1 -1
- package/dist/.pikku/addon/trigger/index.js +1 -1
- package/dist/.pikku/addon/trigger/pikku-trigger-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/trigger/pikku-trigger-types.gen.js +1 -1
- package/dist/.pikku/addon/variables/index.d.ts +1 -1
- package/dist/.pikku/addon/variables/index.js +1 -1
- package/dist/.pikku/addon/variables/pikku-variable-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/variables/pikku-variable-types.gen.js +1 -1
- package/dist/.pikku/addon/variables/pikku-variables.gen.d.ts +1 -1
- package/dist/.pikku/addon/variables/pikku-variables.gen.js +1 -1
- package/dist/.pikku/addon/workflow/index.d.ts +1 -1
- package/dist/.pikku/addon/workflow/index.js +1 -1
- package/dist/.pikku/addon/workflow/pikku-scenario-step-map.gen.d.ts +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-map.gen.d.ts +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-types.gen.js +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-wirings.gen.d.ts +1 -1
- package/dist/.pikku/addon/workflow/pikku-workflow-wirings.gen.js +1 -1
- package/dist/src/functions/get-knowledge.function.test.js +1 -0
- package/dist/src/functions/get-knowledge.function.test.js.map +1 -1
- package/dist/src/services/knowledge.service.d.ts +113 -1
- package/dist/src/services/knowledge.service.d.ts.map +1 -1
- package/dist/src/services/knowledge.service.js +32 -2
- package/dist/src/services/knowledge.service.js.map +1 -1
- package/dist/src/services/knowledge.service.test.js +96 -0
- package/dist/src/services/knowledge.service.test.js.map +1 -1
- 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.
|
|
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';
|
|
@@ -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;
|
|
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,
|
|
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,
|
|
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"}
|