@inharness-ai/claude4spec 1.0.14 → 1.0.16
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 +31 -0
- package/dist/bin/c4s/args.d.ts +2 -0
- package/dist/bin/c4s/args.js +3 -0
- package/dist/bin/c4s/args.js.map +1 -1
- package/dist/bin/c4s/commands/ask.js +2 -0
- package/dist/bin/c4s/commands/ask.js.map +1 -1
- package/dist/bin/c4s/commands/catalog.js +1 -1
- package/dist/bin/c4s/commands/catalog.js.map +1 -1
- package/dist/bin/c4s/commands/describe.d.ts +2 -0
- package/dist/bin/c4s/commands/describe.js +22 -0
- package/dist/bin/c4s/commands/describe.js.map +1 -0
- package/dist/bin/c4s/commands/find-references.d.ts +13 -0
- package/dist/bin/c4s/commands/find-references.js +81 -0
- package/dist/bin/c4s/commands/find-references.js.map +1 -0
- package/dist/bin/c4s/context.d.ts +4 -3
- package/dist/bin/c4s/context.js +17 -6
- package/dist/bin/c4s/context.js.map +1 -1
- package/dist/bin/c4s/errors.d.ts +1 -1
- package/dist/bin/c4s/errors.js.map +1 -1
- package/dist/bin/c4s/type-validation.d.ts +3 -0
- package/dist/bin/c4s/type-validation.js +14 -0
- package/dist/bin/c4s/type-validation.js.map +1 -1
- package/dist/bin/c4s-mcp.d.ts +1 -1
- package/dist/bin/c4s-mcp.js +23 -12
- package/dist/bin/c4s-mcp.js.map +1 -1
- package/dist/bin/c4s.js +20 -3
- package/dist/bin/c4s.js.map +1 -1
- package/dist/bin/claude4spec.js +122 -74
- package/dist/bin/claude4spec.js.map +1 -1
- package/dist/client/assets/{arc-E0e7X_zn.js → arc-DrA6qHTw.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-BzlqOVZv.js → architectureDiagram-3BPJPVTR-TEnwTtVX.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-BIQcApN7.js → blockDiagram-GPEHLZMM-txRnQm5w.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-CDU0V1yk.js → c4Diagram-AAUBKEIU-ad8X3Q8n.js} +1 -1
- package/dist/client/assets/channel-zmRfuI3H.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-PtDSwC5f.js → chunk-2J33WTMH-Cp08Xa7f.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-DTUPWrSO.js → chunk-4BX2VUAB-Dc_0On6j.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-Cpd59xZT.js → chunk-55IACEB6-8d1qQ5z6.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-C4DOvpJT.js → chunk-727SXJPM-TZenviWx.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CtjeHPBB.js → chunk-AQP2D5EJ-DKRRWy-J.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-CZA3OvVr.js → chunk-FMBD7UC4-DLEErJWK.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-Cbx6nQHm.js → chunk-ND2GUHAM-pKGgwz_0.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-3DunELI_.js → chunk-QZHKN3VN-DVcNz8ng.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-B9RFgPu-.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B9RFgPu-.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-CKYJnuL7.js → cose-bilkent-S5V4N54A-DZejbxEG.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-BrvRwrr_.js → dagre-BM42HDAG-DrPrkFcW.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-BaVLuzcD.js → diagram-2AECGRRQ-Dpn8TJa2.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-9Cu7Wa7J.js → diagram-5GNKFQAL-BxkzEc_t.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-XKiCVdjO.js → diagram-KO2AKTUF-KG0o4LQ7.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-DerecU5v.js → diagram-LMA3HP47-CJ-AjQPt.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-BWcREvZ9.js → diagram-OG6HWLK6-D_FG9cDJ.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-DU3BBQJY.js → erDiagram-TEJ5UH35-DllhUlzY.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-DXO_IJeR.js → flowDiagram-I6XJVG4X-Bg3OotXu.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CXiFZEPx.js → ganttDiagram-6RSMTGT7-BUpUL2Cj.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DHewdln-.js → gitGraphDiagram-PVQCEYII-DMRhyWth.js} +1 -1
- package/dist/client/assets/{index-DT5g2AtL.js → index-BB2RmhGR.js} +1 -1
- package/dist/client/assets/index-BXzOTCgN.css +1 -0
- package/dist/client/assets/index-DRFbyGvK.js +788 -0
- package/dist/client/assets/{index-DD0GkjkG.js → index-Daewu-VD.js} +1 -1
- package/dist/client/assets/{infoDiagram-5YYISTIA-CN40PAGW.js → infoDiagram-5YYISTIA-Bq9D64Ar.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-B8KsyuPk.js → ishikawaDiagram-YF4QCWOH-DIaKHHF-.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-BlEb3E_P.js → journeyDiagram-JHISSGLW-gQWGLTeZ.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-B080CGS9.js → kanban-definition-UN3LZRKU-vRgZ5RjE.js} +1 -1
- package/dist/client/assets/{linear-D6Tg-IET.js → linear-B4a11szP.js} +1 -1
- package/dist/client/assets/{mermaid.core-DP18nW3T.js → mermaid.core-JhUbsJFB.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-bfo7Qm5I.js → mindmap-definition-RKZ34NQL-ZH-Oz_D-.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-ZsPztPu6.js → pieDiagram-4H26LBE5-6rpNrJR6.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DKrTleIL.js → quadrantDiagram-W4KKPZXB-DpTKtxEM.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-D4YX8ZgG.js → requirementDiagram-4Y6WPE33-DpDvZkrK.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Bo-xm6Mc.js → sankeyDiagram-5OEKKPKP-KKjWCTYP.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CozgdKp6.js → sequenceDiagram-3UESZ5HK-BCmXos1U.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CiK61MwV.js → stateDiagram-AJRCARHV-Xq7jqpMj.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C3mDHsxD.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-CgHoguI7.js → timeline-definition-PNZ67QCA-CMmq8p5q.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-TY32dxQb.js → vennDiagram-CIIHVFJN-DgK-w2Jv.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-C6Q7VFwH.js → wardley-L42UT6IY-C5CwlFHh.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-nZLnVsQL.js → wardleyDiagram-YWT4CUSO-D47CtDSc.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DHdYRHEr.js → xychartDiagram-2RQKCTM6-C1M_xTVv.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/core/ask/run-ask.d.ts +3 -1
- package/dist/core/ask/run-ask.js +75 -54
- package/dist/core/ask/run-ask.js.map +1 -1
- package/dist/core/references/find-references.d.ts +13 -0
- package/dist/core/references/find-references.js +41 -0
- package/dist/core/references/find-references.js.map +1 -0
- package/dist/core/references/index.d.ts +2 -0
- package/dist/core/references/index.js +2 -0
- package/dist/core/references/index.js.map +1 -0
- package/dist/core/references/types.d.ts +45 -0
- package/dist/core/references/types.js +9 -0
- package/dist/core/references/types.js.map +1 -0
- package/dist/core/workspace/resolve.d.ts +29 -0
- package/dist/core/workspace/resolve.js +80 -0
- package/dist/core/workspace/resolve.js.map +1 -0
- package/dist/server/config.d.ts +58 -6
- package/dist/server/config.js +94 -19
- package/dist/server/config.js.map +1 -1
- package/dist/server/core/plugin-host/cli-engine.d.ts +8 -0
- package/dist/server/core/plugin-host/cli-engine.js +16 -0
- package/dist/server/core/plugin-host/cli-engine.js.map +1 -0
- package/dist/server/core/plugin-host/cross-cutting.js +1 -1
- package/dist/server/core/plugin-host/cross-cutting.js.map +1 -1
- package/dist/server/core/plugin-host/entities-router.d.ts +3 -1
- package/dist/server/core/plugin-host/entities-router.js +24 -19
- package/dist/server/core/plugin-host/entities-router.js.map +1 -1
- package/dist/server/core/plugin-host/host.js +4 -9
- package/dist/server/core/plugin-host/host.js.map +1 -1
- package/dist/server/core/plugin-host/project-host.d.ts +38 -0
- package/dist/server/core/plugin-host/project-host.js +118 -0
- package/dist/server/core/plugin-host/project-host.js.map +1 -0
- package/dist/server/core/plugin-host/registry.d.ts +14 -0
- package/dist/server/core/plugin-host/registry.js +26 -0
- package/dist/server/core/plugin-host/registry.js.map +1 -0
- package/dist/server/core/plugin-host/serialization-engine.d.ts +38 -8
- package/dist/server/core/plugin-host/serialization-engine.js +63 -39
- package/dist/server/core/plugin-host/serialization-engine.js.map +1 -1
- package/dist/server/core/plugin-host/types.d.ts +49 -27
- package/dist/server/db/index.d.ts +8 -1
- package/dist/server/db/index.js +12 -3
- package/dist/server/db/index.js.map +1 -1
- package/dist/server/db/migrations/035_m29_slug_identity.sql +248 -0
- package/dist/server/db/readonly.d.ts +8 -3
- package/dist/server/db/readonly.js +7 -4
- package/dist/server/db/readonly.js.map +1 -1
- package/dist/server/domain/raw-entity-reader.d.ts +5 -5
- package/dist/server/domain/raw-entity-reader.js +34 -39
- package/dist/server/domain/raw-entity-reader.js.map +1 -1
- package/dist/server/entities/ac/ac-analysis.service.d.ts +54 -0
- package/dist/server/entities/ac/ac-analysis.service.js +162 -0
- package/dist/server/entities/ac/ac-analysis.service.js.map +1 -0
- package/dist/server/entities/ac/mcp-server.d.ts +10 -2
- package/dist/server/entities/ac/mcp-server.js +34 -3
- package/dist/server/entities/ac/mcp-server.js.map +1 -1
- package/dist/server/entities/ac/plugin.d.ts +3 -1
- package/dist/server/entities/ac/plugin.js +9 -5
- package/dist/server/entities/ac/plugin.js.map +1 -1
- package/dist/server/entities/ac/serializer.js +1 -1
- package/dist/server/entities/ac/serializer.js.map +1 -1
- package/dist/server/entities/ac/services.d.ts +19 -7
- package/dist/server/entities/ac/services.js +65 -42
- package/dist/server/entities/ac/services.js.map +1 -1
- package/dist/server/entities/ac/system-prompt.js +1 -8
- package/dist/server/entities/ac/system-prompt.js.map +1 -1
- package/dist/server/entities/database-table/mcp-server.d.ts +2 -2
- package/dist/server/entities/database-table/mcp-server.js +5 -2
- package/dist/server/entities/database-table/mcp-server.js.map +1 -1
- package/dist/server/entities/database-table/plugin.d.ts +3 -1
- package/dist/server/entities/database-table/plugin.js +6 -5
- package/dist/server/entities/database-table/plugin.js.map +1 -1
- package/dist/server/entities/database-table/routes.d.ts +2 -2
- package/dist/server/entities/database-table/serializer.js +1 -1
- package/dist/server/entities/database-table/serializer.js.map +1 -1
- package/dist/server/entities/database-table/services.d.ts +19 -7
- package/dist/server/entities/database-table/services.js +77 -49
- package/dist/server/entities/database-table/services.js.map +1 -1
- package/dist/server/entities/database-table/system-prompt.js +1 -1
- package/dist/server/entities/database-table/system-prompt.js.map +1 -1
- package/dist/server/entities/dto/mcp-server.d.ts +2 -2
- package/dist/server/entities/dto/mcp-server.js +5 -2
- package/dist/server/entities/dto/mcp-server.js.map +1 -1
- package/dist/server/entities/dto/plugin.d.ts +3 -1
- package/dist/server/entities/dto/plugin.js +6 -5
- package/dist/server/entities/dto/plugin.js.map +1 -1
- package/dist/server/entities/dto/serializer.js +2 -2
- package/dist/server/entities/dto/serializer.js.map +1 -1
- package/dist/server/entities/dto/services.d.ts +19 -7
- package/dist/server/entities/dto/services.js +73 -49
- package/dist/server/entities/dto/services.js.map +1 -1
- package/dist/server/entities/dto/system-prompt.js +1 -1
- package/dist/server/entities/dto/system-prompt.js.map +1 -1
- package/dist/server/entities/endpoint/mcp-server.d.ts +2 -2
- package/dist/server/entities/endpoint/mcp-server.js +5 -2
- package/dist/server/entities/endpoint/mcp-server.js.map +1 -1
- package/dist/server/entities/endpoint/plugin.d.ts +3 -1
- package/dist/server/entities/endpoint/plugin.js +6 -5
- package/dist/server/entities/endpoint/plugin.js.map +1 -1
- package/dist/server/entities/endpoint/serializer.js +4 -4
- package/dist/server/entities/endpoint/serializer.js.map +1 -1
- package/dist/server/entities/endpoint/services.d.ts +21 -9
- package/dist/server/entities/endpoint/services.js +94 -65
- package/dist/server/entities/endpoint/services.js.map +1 -1
- package/dist/server/entities/endpoint/system-prompt.js +1 -1
- package/dist/server/entities/endpoint/system-prompt.js.map +1 -1
- package/dist/server/entities/mutate-opts.d.ts +15 -0
- package/dist/server/entities/mutate-opts.js +2 -0
- package/dist/server/entities/mutate-opts.js.map +1 -0
- package/dist/server/entities/ui-view/mcp-server.d.ts +2 -2
- package/dist/server/entities/ui-view/mcp-server.js +5 -2
- package/dist/server/entities/ui-view/mcp-server.js.map +1 -1
- package/dist/server/entities/ui-view/plugin.d.ts +3 -1
- package/dist/server/entities/ui-view/plugin.js +6 -5
- package/dist/server/entities/ui-view/plugin.js.map +1 -1
- package/dist/server/entities/ui-view/routes.d.ts +2 -2
- package/dist/server/entities/ui-view/serializer.js +1 -1
- package/dist/server/entities/ui-view/serializer.js.map +1 -1
- package/dist/server/entities/ui-view/services.d.ts +19 -7
- package/dist/server/entities/ui-view/services.js +68 -44
- package/dist/server/entities/ui-view/services.js.map +1 -1
- package/dist/server/entities/ui-view/system-prompt.d.ts +0 -5
- package/dist/server/entities/ui-view/system-prompt.js +3 -7
- package/dist/server/entities/ui-view/system-prompt.js.map +1 -1
- package/dist/server/external-skills/brief-implementer-template.d.ts +1 -1
- package/dist/server/external-skills/brief-implementer-template.js +1 -1
- package/dist/server/external-skills/spec-reader-template.d.ts +1 -1
- package/dist/server/external-skills/spec-reader-template.js +3 -2
- package/dist/server/external-skills/spec-reader-template.js.map +1 -1
- package/dist/server/fs/entities-watcher.d.ts +31 -0
- package/dist/server/fs/entities-watcher.js +68 -0
- package/dist/server/fs/entities-watcher.js.map +1 -0
- package/dist/server/fs/watcher.d.ts +2 -2
- package/dist/server/fs/watcher.js +7 -1
- package/dist/server/fs/watcher.js.map +1 -1
- package/dist/server/index.d.ts +11 -1
- package/dist/server/index.js +134 -639
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/c4s-reader.d.ts +2 -2
- package/dist/server/mcp/c4s-reader.js +41 -4
- package/dist/server/mcp/c4s-reader.js.map +1 -1
- package/dist/server/mcp/c4s-tools.js +2 -0
- package/dist/server/mcp/c4s-tools.js.map +1 -1
- package/dist/server/mcp/ensure-mcp-json.d.ts +9 -2
- package/dist/server/mcp/ensure-mcp-json.js +18 -4
- package/dist/server/mcp/ensure-mcp-json.js.map +1 -1
- package/dist/server/mcp/reference-tools.d.ts +8 -2
- package/dist/server/mcp/reference-tools.js +52 -179
- package/dist/server/mcp/reference-tools.js.map +1 -1
- package/dist/server/mcp/release-tools/index.d.ts +2 -2
- package/dist/server/routes/agent-turn.d.ts +41 -7
- package/dist/server/routes/agent-turn.js +84 -20
- package/dist/server/routes/agent-turn.js.map +1 -1
- package/dist/server/routes/chat.js +47 -15
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/config.d.ts +24 -0
- package/dist/server/routes/config.js +231 -0
- package/dist/server/routes/config.js.map +1 -0
- package/dist/server/routes/references.d.ts +2 -1
- package/dist/server/routes/references.js +4 -5
- package/dist/server/routes/references.js.map +1 -1
- package/dist/server/routes/releases.d.ts +2 -2
- package/dist/server/routes/static.d.ts +11 -0
- package/dist/server/routes/static.js +44 -0
- package/dist/server/routes/static.js.map +1 -0
- package/dist/server/routes/threads.js +14 -2
- package/dist/server/routes/threads.js.map +1 -1
- package/dist/server/serialization/auto-schema.d.ts +2 -1
- package/dist/server/serialization/auto-schema.js +5 -6
- package/dist/server/serialization/auto-schema.js.map +1 -1
- package/dist/server/serialization/registerAll.d.ts +7 -6
- package/dist/server/serialization/registerAll.js +17 -6
- package/dist/server/serialization/registerAll.js.map +1 -1
- package/dist/server/serialization/resolve-page.d.ts +2 -2
- package/dist/server/serialization/serializers/section.d.ts +6 -1
- package/dist/server/serialization/serializers/section.js +6 -3
- package/dist/server/serialization/serializers/section.js.map +1 -1
- package/dist/server/services/brief.d.ts +2 -2
- package/dist/server/services/chat-context.d.ts +24 -0
- package/dist/server/services/chat-context.js +70 -13
- package/dist/server/services/chat-context.js.map +1 -1
- package/dist/server/services/entity-indexer.d.ts +42 -0
- package/dist/server/services/entity-indexer.js +179 -0
- package/dist/server/services/entity-indexer.js.map +1 -0
- package/dist/server/services/entity-store.d.ts +68 -0
- package/dist/server/services/entity-store.js +162 -0
- package/dist/server/services/entity-store.js.map +1 -0
- package/dist/server/services/entity-writer.d.ts +12 -1
- package/dist/server/services/entity-writer.js +22 -11
- package/dist/server/services/entity-writer.js.map +1 -1
- package/dist/server/services/git.js +6 -1
- package/dist/server/services/git.js.map +1 -1
- package/dist/server/services/pages-frontmatter-indexer.d.ts +2 -2
- package/dist/server/services/pages-link-indexer.d.ts +2 -2
- package/dist/server/services/pages.d.ts +2 -0
- package/dist/server/services/pages.js +24 -9
- package/dist/server/services/pages.js.map +1 -1
- package/dist/server/services/plan.d.ts +2 -2
- package/dist/server/services/references.d.ts +25 -0
- package/dist/server/services/references.js +102 -21
- package/dist/server/services/references.js.map +1 -1
- package/dist/server/services/release-bundle.d.ts +0 -1
- package/dist/server/services/release-bundle.js +0 -1
- package/dist/server/services/release-bundle.js.map +1 -1
- package/dist/server/services/release-import.d.ts +2 -0
- package/dist/server/services/release-import.js +6 -4
- package/dist/server/services/release-import.js.map +1 -1
- package/dist/server/services/release.d.ts +10 -10
- package/dist/server/services/release.js +32 -63
- package/dist/server/services/release.js.map +1 -1
- package/dist/server/services/section-indexer.d.ts +4 -3
- package/dist/server/services/section-indexer.js +8 -9
- package/dist/server/services/section-indexer.js.map +1 -1
- package/dist/server/services/skill-registry.d.ts +28 -1
- package/dist/server/services/skill-registry.js +51 -10
- package/dist/server/services/skill-registry.js.map +1 -1
- package/dist/server/services/slug.js +6 -0
- package/dist/server/services/slug.js.map +1 -1
- package/dist/server/services/static-html.d.ts +24 -0
- package/dist/server/services/static-html.js +49 -0
- package/dist/server/services/static-html.js.map +1 -0
- package/dist/server/services/tags.d.ts +13 -3
- package/dist/server/services/tags.js +65 -26
- package/dist/server/services/tags.js.map +1 -1
- package/dist/server/services/todos-indexer.d.ts +2 -2
- package/dist/server/services/versions.d.ts +7 -7
- package/dist/server/services/versions.js +34 -37
- package/dist/server/services/versions.js.map +1 -1
- package/dist/server/workspace/bootstrap.d.ts +42 -0
- package/dist/server/workspace/bootstrap.js +73 -0
- package/dist/server/workspace/bootstrap.js.map +1 -0
- package/dist/server/workspace/context-cache.d.ts +48 -0
- package/dist/server/workspace/context-cache.js +147 -0
- package/dist/server/workspace/context-cache.js.map +1 -0
- package/dist/server/workspace/db-migration.d.ts +11 -0
- package/dist/server/workspace/db-migration.js +44 -0
- package/dist/server/workspace/db-migration.js.map +1 -0
- package/dist/server/workspace/middleware.d.ts +15 -0
- package/dist/server/workspace/middleware.js +36 -0
- package/dist/server/workspace/middleware.js.map +1 -0
- package/dist/server/workspace/project-context.d.ts +65 -0
- package/dist/server/workspace/project-context.js +655 -0
- package/dist/server/workspace/project-context.js.map +1 -0
- package/dist/server/workspace/project-id.d.ts +7 -0
- package/dist/server/workspace/project-id.js +11 -0
- package/dist/server/workspace/project-id.js.map +1 -0
- package/dist/server/workspace/registry.d.ts +58 -0
- package/dist/server/workspace/registry.js +264 -0
- package/dist/server/workspace/registry.js.map +1 -0
- package/dist/server/workspace/routes.d.ts +21 -0
- package/dist/server/workspace/routes.js +181 -0
- package/dist/server/workspace/routes.js.map +1 -0
- package/dist/server/workspace/types.d.ts +30 -0
- package/dist/server/workspace/types.js +6 -0
- package/dist/server/workspace/types.js.map +1 -0
- package/dist/server/ws/gateway.d.ts +12 -2
- package/dist/server/ws/gateway.js +51 -9
- package/dist/server/ws/gateway.js.map +1 -1
- package/dist/server/ws/project-emitter.d.ts +17 -0
- package/dist/server/ws/project-emitter.js +12 -0
- package/dist/server/ws/project-emitter.js.map +1 -0
- package/dist/shared/entities.d.ts +2 -2
- package/dist/shared/languages.d.ts +17 -0
- package/dist/shared/languages.js +31 -0
- package/dist/shared/languages.js.map +1 -0
- package/dist/shared/types.d.ts +11 -0
- package/dist/shared/xml-tags.d.ts +8 -0
- package/dist/shared/xml-tags.js +24 -0
- package/dist/shared/xml-tags.js.map +1 -1
- package/package.json +10 -3
- package/dist/client/assets/channel-BqjILLUr.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-LjT84-kK.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-LjT84-kK.js +0 -1
- package/dist/client/assets/index-BTXWIk4x.css +0 -1
- package/dist/client/assets/index-DcIG_8JB.js +0 -760
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C6-8M5Sb.js +0 -1
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import type Database from 'better-sqlite3';
|
|
2
2
|
import type { PagesService } from './pages.js';
|
|
3
3
|
import type { PagesWatcher } from '../fs/watcher.js';
|
|
4
|
-
import type {
|
|
4
|
+
import type { WsEmitter } from '../ws/project-emitter.js';
|
|
5
|
+
import type { ProjectPluginHost } from '../core/plugin-host/types.js';
|
|
5
6
|
export declare class SectionIndexerService {
|
|
6
7
|
private db;
|
|
7
8
|
private pages;
|
|
8
9
|
private watcher;
|
|
9
10
|
private ws;
|
|
11
|
+
private host;
|
|
10
12
|
private debounceMs;
|
|
11
13
|
private pending;
|
|
12
|
-
constructor(db: Database.Database, pages: PagesService, watcher: PagesWatcher, ws:
|
|
14
|
+
constructor(db: Database.Database, pages: PagesService, watcher: PagesWatcher, ws: WsEmitter, host: ProjectPluginHost);
|
|
13
15
|
schedulePage(relPath: string): void;
|
|
14
16
|
handleUnlink(relPath: string): Promise<void>;
|
|
15
17
|
private removeSectionIndex;
|
|
16
18
|
indexAll(): Promise<void>;
|
|
17
19
|
indexPage(relPath: string): Promise<void>;
|
|
18
|
-
private resolveEntityId;
|
|
19
20
|
}
|
|
20
21
|
export declare function normalizeContent(content: string): string;
|
|
@@ -2,7 +2,6 @@ import crypto from 'node:crypto';
|
|
|
2
2
|
import { customAlphabet } from 'nanoid';
|
|
3
3
|
import { parseXmlTagsExcludingCode } from '../../shared/xml-tags.js';
|
|
4
4
|
import { ANCHOR_PATTERN_SOURCE } from '../../shared/anchor-pattern.js';
|
|
5
|
-
import { pluginHost } from '../core/plugin-host/host.js';
|
|
6
5
|
// Generator stays strict 8 (per M06 spec `15u7sazr` — auto-inject contract).
|
|
7
6
|
const nanoid8 = customAlphabet('abcdefghijklmnopqrstuvwxyz0123456789', 8);
|
|
8
7
|
const ANCHOR_RE = new RegExp(ANCHOR_PATTERN_SOURCE);
|
|
@@ -12,13 +11,15 @@ export class SectionIndexerService {
|
|
|
12
11
|
pages;
|
|
13
12
|
watcher;
|
|
14
13
|
ws;
|
|
14
|
+
host;
|
|
15
15
|
debounceMs = 300;
|
|
16
16
|
pending = new Map();
|
|
17
|
-
constructor(db, pages, watcher, ws) {
|
|
17
|
+
constructor(db, pages, watcher, ws, host) {
|
|
18
18
|
this.db = db;
|
|
19
19
|
this.pages = pages;
|
|
20
20
|
this.watcher = watcher;
|
|
21
21
|
this.ws = ws;
|
|
22
|
+
this.host = host;
|
|
22
23
|
}
|
|
23
24
|
schedulePage(relPath) {
|
|
24
25
|
const prev = this.pending.get(relPath);
|
|
@@ -128,7 +129,7 @@ export class SectionIndexerService {
|
|
|
128
129
|
this.db
|
|
129
130
|
.prepare(`DELETE FROM section_entity_link WHERE anchor IN (${placeholders})`)
|
|
130
131
|
.run(...anchorsInFile);
|
|
131
|
-
const linkStmt = this.db.prepare(`INSERT OR IGNORE INTO section_entity_link (anchor, entity_type,
|
|
132
|
+
const linkStmt = this.db.prepare(`INSERT OR IGNORE INTO section_entity_link (anchor, entity_type, entity_slug, relation)
|
|
132
133
|
VALUES (?, ?, ?, 'uses')`);
|
|
133
134
|
for (const s of sections) {
|
|
134
135
|
const xmlTags = parseXmlTagsExcludingCode(s.content);
|
|
@@ -143,9 +144,10 @@ export class SectionIndexerService {
|
|
|
143
144
|
if (seen.has(key))
|
|
144
145
|
continue;
|
|
145
146
|
seen.add(key);
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
// M29: link by slug (sole identity); only persist for entities
|
|
148
|
+
// that actually exist, mirroring the prior id-resolver guard.
|
|
149
|
+
if (this.host.entityExists(type, slug))
|
|
150
|
+
linkStmt.run(s.anchor, type, slug);
|
|
149
151
|
}
|
|
150
152
|
}
|
|
151
153
|
}
|
|
@@ -158,9 +160,6 @@ export class SectionIndexerService {
|
|
|
158
160
|
anchors: sections.map((s) => s.anchor),
|
|
159
161
|
});
|
|
160
162
|
}
|
|
161
|
-
resolveEntityId(type, slug) {
|
|
162
|
-
return pluginHost.resolveEntityId(type, slug);
|
|
163
|
-
}
|
|
164
163
|
}
|
|
165
164
|
function parseHeadings(lines) {
|
|
166
165
|
const out = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"section-indexer.js","sourceRoot":"","sources":["../../../src/server/services/section-indexer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"section-indexer.js","sourceRoot":"","sources":["../../../src/server/services/section-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { InlineSkill } from '@inharness-ai/agent-adapters';
|
|
2
2
|
export type SkillScope = 'writing-style' | 'contextual';
|
|
3
|
+
/** Where a skill was discovered: in-package bundle vs a user `.claude/skills` root. */
|
|
4
|
+
export type SkillSource = 'bundled' | 'user';
|
|
3
5
|
export interface SkillMetadata {
|
|
4
6
|
slug: string;
|
|
5
7
|
title: string;
|
|
@@ -7,8 +9,18 @@ export interface SkillMetadata {
|
|
|
7
9
|
version: number;
|
|
8
10
|
language: 'en' | 'pl';
|
|
9
11
|
scope: SkillScope;
|
|
12
|
+
source: SkillSource;
|
|
10
13
|
path: string;
|
|
11
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* A root scanned by {@link SkillRegistry.load}. Roots are scanned in array order
|
|
17
|
+
* (highest precedence first); on a slug collision the first root wins, so callers
|
|
18
|
+
* pass project before global before bundled. See {@link findSkillsRoots}.
|
|
19
|
+
*/
|
|
20
|
+
export interface SkillRoot {
|
|
21
|
+
dir: string;
|
|
22
|
+
source: SkillSource;
|
|
23
|
+
}
|
|
12
24
|
export interface ResolvedSkill {
|
|
13
25
|
metadata: SkillMetadata;
|
|
14
26
|
content: string;
|
|
@@ -16,7 +28,16 @@ export interface ResolvedSkill {
|
|
|
16
28
|
}
|
|
17
29
|
export declare class SkillRegistry {
|
|
18
30
|
private metadataBySlug;
|
|
19
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Scan one or more roots once at startup and merge them, deduplicated per slug
|
|
33
|
+
* by precedence: roots earlier in the array win (project > global > bundled).
|
|
34
|
+
* A missing or unreadable root is treated as empty — no throw. A malformed
|
|
35
|
+
* `SKILL.md` is skipped with a warning. Skills declaring `scope: contextual`
|
|
36
|
+
* found in a `source: 'user'` root are ignored entirely (contextual skills are
|
|
37
|
+
* package-only); bundled contextual skills are kept.
|
|
38
|
+
*/
|
|
39
|
+
static load(roots: SkillRoot[]): SkillRegistry;
|
|
40
|
+
private scanRoot;
|
|
20
41
|
list(): SkillMetadata[];
|
|
21
42
|
listSelectable(): SkillMetadata[];
|
|
22
43
|
has(slug: string): boolean;
|
|
@@ -36,3 +57,9 @@ export declare class SkillResolver {
|
|
|
36
57
|
resolve(): InlineSkill[];
|
|
37
58
|
}
|
|
38
59
|
export declare function findSkillsDir(): string;
|
|
60
|
+
/**
|
|
61
|
+
* Roots to scan for selectable writing styles, highest precedence first:
|
|
62
|
+
* project `<cwd>/.claude/skills` > global `~/.claude/skills` > in-package bundle.
|
|
63
|
+
* Project/global are user-authored (`source: 'user'`); the bundle is `'bundled'`.
|
|
64
|
+
*/
|
|
65
|
+
export declare function findSkillsRoots(cwd: string): SkillRoot[];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
2
3
|
import path from 'node:path';
|
|
3
4
|
import { fileURLToPath } from 'node:url';
|
|
4
5
|
import matter from 'gray-matter';
|
|
@@ -7,16 +8,39 @@ const SUPPORTED_VERSION = 1;
|
|
|
7
8
|
const FILES_SUBDIRS = ['templates', 'examples', 'workflows'];
|
|
8
9
|
export class SkillRegistry {
|
|
9
10
|
metadataBySlug = new Map();
|
|
10
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Scan one or more roots once at startup and merge them, deduplicated per slug
|
|
13
|
+
* by precedence: roots earlier in the array win (project > global > bundled).
|
|
14
|
+
* A missing or unreadable root is treated as empty — no throw. A malformed
|
|
15
|
+
* `SKILL.md` is skipped with a warning. Skills declaring `scope: contextual`
|
|
16
|
+
* found in a `source: 'user'` root are ignored entirely (contextual skills are
|
|
17
|
+
* package-only); bundled contextual skills are kept.
|
|
18
|
+
*/
|
|
19
|
+
static load(roots) {
|
|
11
20
|
const registry = new SkillRegistry();
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
21
|
+
for (const root of roots)
|
|
22
|
+
registry.scanRoot(root);
|
|
23
|
+
return registry;
|
|
24
|
+
}
|
|
25
|
+
scanRoot(root) {
|
|
26
|
+
let entries;
|
|
27
|
+
try {
|
|
28
|
+
if (!fs.existsSync(root.dir))
|
|
29
|
+
return;
|
|
30
|
+
entries = fs.readdirSync(root.dir, { withFileTypes: true });
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.warn(`[skill] root "${root.dir}" unreadable: ${err.message}, treating as empty`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
15
36
|
for (const entry of entries) {
|
|
16
37
|
if (!entry.isDirectory())
|
|
17
38
|
continue;
|
|
18
39
|
const slug = entry.name;
|
|
19
|
-
|
|
40
|
+
// Higher-precedence root already claimed this slug.
|
|
41
|
+
if (this.metadataBySlug.has(slug))
|
|
42
|
+
continue;
|
|
43
|
+
const skillDir = path.join(root.dir, slug);
|
|
20
44
|
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
21
45
|
if (!fs.existsSync(skillFile)) {
|
|
22
46
|
console.warn(`[skill] ${slug}: missing SKILL.md, skipping`);
|
|
@@ -25,18 +49,23 @@ export class SkillRegistry {
|
|
|
25
49
|
try {
|
|
26
50
|
const raw = fs.readFileSync(skillFile, 'utf8');
|
|
27
51
|
const { data } = matter(raw);
|
|
28
|
-
const metadata = parseFrontmatter(slug, skillDir, data);
|
|
52
|
+
const metadata = parseFrontmatter(slug, skillDir, root.source, data);
|
|
29
53
|
if (metadata.version > SUPPORTED_VERSION) {
|
|
30
54
|
console.warn(`[skill] ${slug}: version ${metadata.version} > supported ${SUPPORTED_VERSION}, skipping`);
|
|
31
55
|
continue;
|
|
32
56
|
}
|
|
33
|
-
|
|
57
|
+
// Contextual skills are package-only: ignore them entirely when dropped
|
|
58
|
+
// into a user root (not selectable, not used for contextual resolution).
|
|
59
|
+
if (metadata.scope === 'contextual' && root.source === 'user') {
|
|
60
|
+
console.warn(`[skill] ${slug}: scope "contextual" in user root, ignored (package-only)`);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
this.metadataBySlug.set(slug, metadata);
|
|
34
64
|
}
|
|
35
65
|
catch (err) {
|
|
36
66
|
console.warn(`[skill] ${slug}: ${err.message}, skipping`);
|
|
37
67
|
}
|
|
38
68
|
}
|
|
39
|
-
return registry;
|
|
40
69
|
}
|
|
41
70
|
list() {
|
|
42
71
|
return Array.from(this.metadataBySlug.values());
|
|
@@ -108,7 +137,19 @@ export function findSkillsDir() {
|
|
|
108
137
|
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
109
138
|
return path.resolve(here, '..', 'skills');
|
|
110
139
|
}
|
|
111
|
-
|
|
140
|
+
/**
|
|
141
|
+
* Roots to scan for selectable writing styles, highest precedence first:
|
|
142
|
+
* project `<cwd>/.claude/skills` > global `~/.claude/skills` > in-package bundle.
|
|
143
|
+
* Project/global are user-authored (`source: 'user'`); the bundle is `'bundled'`.
|
|
144
|
+
*/
|
|
145
|
+
export function findSkillsRoots(cwd) {
|
|
146
|
+
return [
|
|
147
|
+
{ dir: path.join(cwd, '.claude', 'skills'), source: 'user' },
|
|
148
|
+
{ dir: path.join(os.homedir(), '.claude', 'skills'), source: 'user' },
|
|
149
|
+
{ dir: findSkillsDir(), source: 'bundled' },
|
|
150
|
+
];
|
|
151
|
+
}
|
|
152
|
+
function parseFrontmatter(slug, skillPath, source, data) {
|
|
112
153
|
const title = data.title;
|
|
113
154
|
const description = data.description;
|
|
114
155
|
const version = data.version;
|
|
@@ -124,7 +165,7 @@ function parseFrontmatter(slug, skillPath, data) {
|
|
|
124
165
|
throw new Error("frontmatter 'language' must be 'en' or 'pl'");
|
|
125
166
|
if (scopeRaw !== 'writing-style' && scopeRaw !== 'contextual')
|
|
126
167
|
throw new Error("frontmatter 'scope' must be 'writing-style' or 'contextual'");
|
|
127
|
-
return { slug, title, description, version, language, scope: scopeRaw, path: skillPath };
|
|
168
|
+
return { slug, title, description, version, language, scope: scopeRaw, source, path: skillPath };
|
|
128
169
|
}
|
|
129
170
|
function loadSkillFiles(skillDir) {
|
|
130
171
|
const out = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../../src/server/services/skill-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../../src/server/services/skill-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAkC1C,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAE7D,MAAM,OAAO,aAAa;IAChB,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE1D;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,CAAC,KAAkB;QAC5B,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,QAAQ,CAAC,IAAe;QAC9B,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO;YACrC,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,GAAG,iBAAkB,GAAa,CAAC,OAAO,qBAAqB,CAAC,CAAC;YACpG,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,oDAAoD;YACpD,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,8BAA8B,CAAC,CAAC;gBAC5D,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACrE,IAAI,QAAQ,CAAC,OAAO,GAAG,iBAAiB,EAAE,CAAC;oBACzC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,aAAa,QAAQ,CAAC,OAAO,gBAAgB,iBAAiB,YAAY,CAAC,CAAC;oBACxG,SAAS;gBACX,CAAC;gBACD,wEAAwE;gBACxE,yEAAyE;gBACzE,IAAI,QAAQ,CAAC,KAAK,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC9D,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,2DAA2D,CAAC,CAAC;oBACzF,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,KAAM,GAAa,CAAC,OAAO,YAAY,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,eAAe,CAAC,CAAC;IAChE,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,eAAe,CAAC;IACxD,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,GAAG,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC;IAC3D,CAAC;CACF;AAED,MAAM,OAAO,aAAa;IAEL;IACA;IAFnB,YACmB,QAAuB,EACvB,GAAW;QADX,aAAQ,GAAR,QAAQ,CAAe;QACvB,QAAG,GAAH,GAAG,CAAQ;IAC3B,CAAC;IAEJ;;;;;OAKG;IACH,OAAO;QACL,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC;QAC/C,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,gCAAgC,IAAI,6BAA6B,CAAC,CAAC;YAChF,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,gCAAgC,IAAI,gBAAgB,KAAK,CAAC,QAAQ,CAAC,KAAK,aAAa,CAAC,CAAC;YACpG,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC;gBACN,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;gBACzB,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW;gBACvC,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,QAAQ,EAAE;oBACR,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;oBAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ;oBACjC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK;iBAC5B;aACF,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,UAAU,aAAa;IAC3B,iEAAiE;IACjE,mEAAmE;IACnE,iEAAiE;IACjE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO;QACL,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;QAC5D,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;QACrE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,SAAiB,EAAE,MAAmB,EAAE,IAA6B;IAC3G,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACvH,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACzI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAClJ,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC3G,IAAI,QAAQ,KAAK,eAAe,IAAI,QAAQ,KAAK,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC9I,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACnG,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QACrC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,OAAO,CAAC,MAAc,EAAE,SAAiB,EAAE,GAA2B;IAC7E,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACjC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,SAAS;QAC9B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,WAAW,QAAQ,kCAAkC,CAAC,CAAC;YACpE,SAAS;QACX,CAAC;QACD,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,iFAAiF;IACjF,KAAK,MAAM,IAAI,IAAI,GAAG;QAAE,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IACrD,IAAI,CAAC;QACH,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export function slugify(input) {
|
|
2
2
|
return input
|
|
3
3
|
.toLowerCase()
|
|
4
|
+
// ł nie ma dekompozycji NFD — mapujemy jawnie przed normalizacją.
|
|
5
|
+
.replace(/ł/g, 'l')
|
|
6
|
+
// Transliteracja diakrytyków: NFD + usunięcie znaków łączących
|
|
7
|
+
// (ó→o, ż→z, ź→z, ę→e, ą→a, ś→s, ć→c, ń→n).
|
|
8
|
+
.normalize('NFD')
|
|
9
|
+
.replace(/[̀-ͯ]/g, '')
|
|
4
10
|
.replace(/[^a-z0-9]+/g, '-')
|
|
5
11
|
.replace(/^-+|-+$/g, '');
|
|
6
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../../../src/server/services/slug.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,WAAW,EAAE;
|
|
1
|
+
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../../../src/server/services/slug.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,WAAW,EAAE;QACd,kEAAkE;SACjE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QACnB,+DAA+D;QAC/D,4CAA4C;SAC3C,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAY;IACvD,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACxD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,cAAc,GAAG,IAAI;SACxB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,cAAc,GAAG,IAAI;SACxB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,cAAc,GAAG,IAAI;SACxB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,4EAA4E;IAC5E,sDAAsD;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M30 (L2): static file server rooted at `pagesDir`, backing `GET /api/static/*`.
|
|
3
|
+
*
|
|
4
|
+
* Used as the iframe `src` for the read-only HTML preview. Deliberately a separate
|
|
5
|
+
* slice from `PagesService`: it copies the `resolveSafe` *pattern* from `pages.ts`
|
|
6
|
+
* rather than sharing a helper, and applies NO extension whitelist (any file under
|
|
7
|
+
* `pagesDir` is servable so relative assets — `./style.css`, `img/x.png` — resolve).
|
|
8
|
+
*/
|
|
9
|
+
/** Thrown when a requested path escapes `pagesDir` (`../`, absolute, null byte). Maps to HTTP 403. */
|
|
10
|
+
export declare class StaticPathTraversalError extends Error {
|
|
11
|
+
constructor(relPath: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class StaticHtmlService {
|
|
14
|
+
readonly root: string;
|
|
15
|
+
constructor(cwd: string, pagesDir?: string);
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a request path (relative to `pagesDir`) to an absolute path, guarding
|
|
18
|
+
* against traversal. No extension check. Throws {@link StaticPathTraversalError}
|
|
19
|
+
* if the path would escape the root.
|
|
20
|
+
*/
|
|
21
|
+
resolveSafe(relPath: string): string;
|
|
22
|
+
/** True if the resolved (in-root) path exists and is a regular file. */
|
|
23
|
+
existsFile(abs: string): Promise<boolean>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* M30 (L2): static file server rooted at `pagesDir`, backing `GET /api/static/*`.
|
|
5
|
+
*
|
|
6
|
+
* Used as the iframe `src` for the read-only HTML preview. Deliberately a separate
|
|
7
|
+
* slice from `PagesService`: it copies the `resolveSafe` *pattern* from `pages.ts`
|
|
8
|
+
* rather than sharing a helper, and applies NO extension whitelist (any file under
|
|
9
|
+
* `pagesDir` is servable so relative assets — `./style.css`, `img/x.png` — resolve).
|
|
10
|
+
*/
|
|
11
|
+
/** Thrown when a requested path escapes `pagesDir` (`../`, absolute, null byte). Maps to HTTP 403. */
|
|
12
|
+
export class StaticPathTraversalError extends Error {
|
|
13
|
+
constructor(relPath) {
|
|
14
|
+
super(`path escapes pages root: ${relPath}`);
|
|
15
|
+
this.name = 'StaticPathTraversalError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class StaticHtmlService {
|
|
19
|
+
root;
|
|
20
|
+
constructor(cwd, pagesDir = 'pages') {
|
|
21
|
+
this.root = path.join(cwd, pagesDir);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve a request path (relative to `pagesDir`) to an absolute path, guarding
|
|
25
|
+
* against traversal. No extension check. Throws {@link StaticPathTraversalError}
|
|
26
|
+
* if the path would escape the root.
|
|
27
|
+
*/
|
|
28
|
+
resolveSafe(relPath) {
|
|
29
|
+
if (!relPath || relPath.includes('\0'))
|
|
30
|
+
throw new StaticPathTraversalError(relPath);
|
|
31
|
+
const abs = path.resolve(this.root, relPath);
|
|
32
|
+
const rel = path.relative(this.root, abs);
|
|
33
|
+
if (rel.startsWith('..') || path.isAbsolute(rel)) {
|
|
34
|
+
throw new StaticPathTraversalError(relPath);
|
|
35
|
+
}
|
|
36
|
+
return abs;
|
|
37
|
+
}
|
|
38
|
+
/** True if the resolved (in-root) path exists and is a regular file. */
|
|
39
|
+
async existsFile(abs) {
|
|
40
|
+
try {
|
|
41
|
+
const stat = await fs.stat(abs);
|
|
42
|
+
return stat.isFile();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=static-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-html.js","sourceRoot":"","sources":["../../../src/server/services/static-html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;GAOG;AAEH,sGAAsG;AACtG,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,iBAAiB;IACnB,IAAI,CAAS;IAEtB,YAAY,GAAW,EAAE,WAAmB,OAAO;QACjD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,OAAe;QACzB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACpF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import type Database from 'better-sqlite3';
|
|
2
2
|
import type { EntityType, Tag, TagCreateInput, TagUpdateInput } from '../../shared/entities.js';
|
|
3
|
+
import type { EntityStore } from './entity-store.js';
|
|
3
4
|
export declare class TagsService {
|
|
4
5
|
private db;
|
|
5
6
|
constructor(db: Database.Database);
|
|
7
|
+
/**
|
|
8
|
+
* M29: tags.json is the registry source of truth. Wired post-construction
|
|
9
|
+
* (the store is built later in boot). When present, every tag mutation
|
|
10
|
+
* re-writes tags.json; a tag rename also re-persists the entity files whose
|
|
11
|
+
* `tags[]` the FK cascade just moved. Null during early boot / index rebuild.
|
|
12
|
+
*/
|
|
13
|
+
private store;
|
|
14
|
+
setEntityStore(store: EntityStore): void;
|
|
6
15
|
list(): Tag[];
|
|
7
16
|
getBySlug(slug: string): Tag | null;
|
|
8
|
-
getIdBySlug(slug: string): number | null;
|
|
9
17
|
create(input: TagCreateInput): Tag;
|
|
18
|
+
/** M29: re-persist the entity files whose `tags[]` changed due to a tag mutation. */
|
|
19
|
+
private persistEntitiesWithTag;
|
|
10
20
|
/** Idempotent: returns existing tag if already present. */
|
|
11
21
|
ensure(name: string): Tag;
|
|
12
22
|
update(slug: string, input: TagUpdateInput): Tag;
|
|
@@ -15,8 +25,8 @@ export declare class TagsService {
|
|
|
15
25
|
affectedEntities: number;
|
|
16
26
|
};
|
|
17
27
|
/** Sets the tag set of an entity to exactly `tagNames` (auto-creating missing tags). */
|
|
18
|
-
assignTags(entityType: EntityType,
|
|
19
|
-
getEntityTagSlugs(entityType: EntityType,
|
|
28
|
+
assignTags(entityType: EntityType, entitySlug: string, tagNames: string[]): string[];
|
|
29
|
+
getEntityTagSlugs(entityType: EntityType, entitySlug: string): string[];
|
|
20
30
|
private countsByTagSlug;
|
|
21
31
|
private pickColor;
|
|
22
32
|
private toTag;
|
|
@@ -8,6 +8,16 @@ export class TagsService {
|
|
|
8
8
|
constructor(db) {
|
|
9
9
|
this.db = db;
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* M29: tags.json is the registry source of truth. Wired post-construction
|
|
13
|
+
* (the store is built later in boot). When present, every tag mutation
|
|
14
|
+
* re-writes tags.json; a tag rename also re-persists the entity files whose
|
|
15
|
+
* `tags[]` the FK cascade just moved. Null during early boot / index rebuild.
|
|
16
|
+
*/
|
|
17
|
+
store = null;
|
|
18
|
+
setEntityStore(store) {
|
|
19
|
+
this.store = store;
|
|
20
|
+
}
|
|
11
21
|
list() {
|
|
12
22
|
const rows = this.db.prepare(`SELECT * FROM tag ORDER BY name`).all();
|
|
13
23
|
const counts = this.countsByTagSlug();
|
|
@@ -19,10 +29,6 @@ export class TagsService {
|
|
|
19
29
|
return null;
|
|
20
30
|
return this.toTag(row, this.countsByTagSlug(slug));
|
|
21
31
|
}
|
|
22
|
-
getIdBySlug(slug) {
|
|
23
|
-
const row = this.db.prepare(`SELECT id FROM tag WHERE slug = ?`).get(slug);
|
|
24
|
-
return row?.id ?? null;
|
|
25
|
-
}
|
|
26
32
|
create(input) {
|
|
27
33
|
const slug = tagSlug(input.name);
|
|
28
34
|
if (!slug)
|
|
@@ -34,8 +40,25 @@ export class TagsService {
|
|
|
34
40
|
this.db
|
|
35
41
|
.prepare(`INSERT INTO tag (slug, name, color, description) VALUES (?, ?, ?, ?)`)
|
|
36
42
|
.run(slug, input.name, color, input.description ?? null);
|
|
43
|
+
this.store?.persistTags();
|
|
37
44
|
return this.getBySlug(slug);
|
|
38
45
|
}
|
|
46
|
+
/** M29: re-persist the entity files whose `tags[]` changed due to a tag mutation. */
|
|
47
|
+
persistEntitiesWithTag(tagSlugValue) {
|
|
48
|
+
if (!this.store)
|
|
49
|
+
return;
|
|
50
|
+
const rows = this.db
|
|
51
|
+
.prepare(`SELECT DISTINCT entity_type, entity_slug FROM entity_tag WHERE tag_slug = ?`)
|
|
52
|
+
.all(tagSlugValue);
|
|
53
|
+
for (const r of rows) {
|
|
54
|
+
try {
|
|
55
|
+
this.store.persist(r.entity_type, r.entity_slug);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* entity may be inactive/missing — skip */
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
39
62
|
/** Idempotent: returns existing tag if already present. */
|
|
40
63
|
ensure(name) {
|
|
41
64
|
const slug = tagSlug(name);
|
|
@@ -66,54 +89,70 @@ export class TagsService {
|
|
|
66
89
|
updated_at = datetime('now')
|
|
67
90
|
WHERE slug = ?`)
|
|
68
91
|
.run(newSlug, newName, input.color !== undefined ? input.color : existing.color, input.description !== undefined ? input.description : existing.description, slug);
|
|
92
|
+
this.store?.persistTags();
|
|
93
|
+
// M29: on rename, entity_tag.tag_slug already cascaded (FK ON UPDATE
|
|
94
|
+
// CASCADE) — re-persist the entity files whose tags[] now reference newSlug.
|
|
95
|
+
if (newSlug !== slug)
|
|
96
|
+
this.persistEntitiesWithTag(newSlug);
|
|
69
97
|
return this.getBySlug(newSlug);
|
|
70
98
|
}
|
|
71
99
|
remove(slug) {
|
|
72
|
-
const existing = this.db.prepare(`SELECT
|
|
100
|
+
const existing = this.db.prepare(`SELECT slug FROM tag WHERE slug = ?`).get(slug);
|
|
73
101
|
if (!existing)
|
|
74
102
|
throw new DomainError('NOT_FOUND', `tag '${slug}' not found`);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
.
|
|
78
|
-
|
|
79
|
-
|
|
103
|
+
// Capture affected entities BEFORE the delete cascades entity_tag away.
|
|
104
|
+
const affectedEntities = this.db
|
|
105
|
+
.prepare(`SELECT DISTINCT entity_type, entity_slug FROM entity_tag WHERE tag_slug = ?`)
|
|
106
|
+
.all(slug);
|
|
107
|
+
this.db.prepare(`DELETE FROM tag WHERE slug = ?`).run(slug);
|
|
108
|
+
this.store?.persistTags();
|
|
109
|
+
if (this.store) {
|
|
110
|
+
for (const r of affectedEntities) {
|
|
111
|
+
try {
|
|
112
|
+
this.store.persist(r.entity_type, r.entity_slug);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
/* skip */
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { deleted: true, affectedEntities: affectedEntities.length };
|
|
80
120
|
}
|
|
81
121
|
/** Sets the tag set of an entity to exactly `tagNames` (auto-creating missing tags). */
|
|
82
|
-
assignTags(entityType,
|
|
122
|
+
assignTags(entityType, entitySlug, tagNames) {
|
|
83
123
|
const names = [...new Set(tagNames.map((n) => n.trim()).filter(Boolean))];
|
|
84
124
|
const tx = this.db.transaction(() => {
|
|
85
|
-
const
|
|
125
|
+
const tagSlugs = [];
|
|
86
126
|
for (const name of names) {
|
|
87
127
|
const tag = this.ensure(name);
|
|
88
|
-
|
|
128
|
+
tagSlugs.push(tag.slug);
|
|
89
129
|
}
|
|
90
130
|
this.db
|
|
91
|
-
.prepare(`DELETE FROM entity_tag WHERE entity_type = ? AND
|
|
92
|
-
.run(entityType,
|
|
93
|
-
const insert = this.db.prepare(`INSERT INTO entity_tag (entity_type,
|
|
94
|
-
for (const
|
|
95
|
-
insert.run(entityType,
|
|
131
|
+
.prepare(`DELETE FROM entity_tag WHERE entity_type = ? AND entity_slug = ?`)
|
|
132
|
+
.run(entityType, entitySlug);
|
|
133
|
+
const insert = this.db.prepare(`INSERT INTO entity_tag (entity_type, entity_slug, tag_slug) VALUES (?, ?, ?)`);
|
|
134
|
+
for (const ts of tagSlugs)
|
|
135
|
+
insert.run(entityType, entitySlug, ts);
|
|
96
136
|
return names.map((n) => tagSlug(n));
|
|
97
137
|
});
|
|
98
138
|
return tx();
|
|
99
139
|
}
|
|
100
|
-
getEntityTagSlugs(entityType,
|
|
140
|
+
getEntityTagSlugs(entityType, entitySlug) {
|
|
101
141
|
const rows = this.db
|
|
102
142
|
.prepare(`SELECT t.slug AS slug
|
|
103
143
|
FROM entity_tag et
|
|
104
|
-
JOIN tag t ON t.
|
|
105
|
-
WHERE et.entity_type = ? AND et.
|
|
144
|
+
JOIN tag t ON t.slug = et.tag_slug
|
|
145
|
+
WHERE et.entity_type = ? AND et.entity_slug = ?
|
|
106
146
|
ORDER BY t.name`)
|
|
107
|
-
.all(entityType,
|
|
147
|
+
.all(entityType, entitySlug);
|
|
108
148
|
return rows.map((r) => r.slug);
|
|
109
149
|
}
|
|
110
150
|
countsByTagSlug(slug) {
|
|
111
151
|
const sql = `
|
|
112
|
-
SELECT
|
|
152
|
+
SELECT et.tag_slug AS slug, et.entity_type AS entity_type, COUNT(*) AS c
|
|
113
153
|
FROM entity_tag et
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
GROUP BY t.slug, et.entity_type
|
|
154
|
+
${slug ? `WHERE et.tag_slug = ?` : ``}
|
|
155
|
+
GROUP BY et.tag_slug, et.entity_type
|
|
117
156
|
`;
|
|
118
157
|
const rows = (slug ? this.db.prepare(sql).all(slug) : this.db.prepare(sql).all());
|
|
119
158
|
const out = new Map();
|