@inharness-ai/claude4spec 1.0.0
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/.claude/skills/c4s-brief-implementer/SKILL.md +105 -0
- package/.claude/skills/c4s-spec-reader/SKILL.md +46 -0
- package/CHANGELOG.md +19 -0
- package/LICENSE +21 -0
- package/README.md +50 -0
- package/dist/bin/agent-md-template.d.ts +1 -0
- package/dist/bin/agent-md-template.js +76 -0
- package/dist/bin/agent-md-template.js.map +1 -0
- package/dist/bin/bootstrap-template.d.ts +1 -0
- package/dist/bin/bootstrap-template.js +12 -0
- package/dist/bin/bootstrap-template.js.map +1 -0
- package/dist/bin/c4s/args.d.ts +13 -0
- package/dist/bin/c4s/args.js +82 -0
- package/dist/bin/c4s/args.js.map +1 -0
- package/dist/bin/c4s/commands/_meta.d.ts +2 -0
- package/dist/bin/c4s/commands/_meta.js +13 -0
- package/dist/bin/c4s/commands/_meta.js.map +1 -0
- package/dist/bin/c4s/commands/catalog.d.ts +2 -0
- package/dist/bin/c4s/commands/catalog.js +38 -0
- package/dist/bin/c4s/commands/catalog.js.map +1 -0
- package/dist/bin/c4s/commands/detail.d.ts +2 -0
- package/dist/bin/c4s/commands/detail.js +22 -0
- package/dist/bin/c4s/commands/detail.js.map +1 -0
- package/dist/bin/c4s/commands/element-list.d.ts +2 -0
- package/dist/bin/c4s/commands/element-list.js +23 -0
- package/dist/bin/c4s/commands/element-list.js.map +1 -0
- package/dist/bin/c4s/commands/inline-mention.d.ts +2 -0
- package/dist/bin/c4s/commands/inline-mention.js +22 -0
- package/dist/bin/c4s/commands/inline-mention.js.map +1 -0
- package/dist/bin/c4s/commands/list-slugs.d.ts +2 -0
- package/dist/bin/c4s/commands/list-slugs.js +16 -0
- package/dist/bin/c4s/commands/list-slugs.js.map +1 -0
- package/dist/bin/c4s/commands/list-tags.d.ts +2 -0
- package/dist/bin/c4s/commands/list-tags.js +13 -0
- package/dist/bin/c4s/commands/list-tags.js.map +1 -0
- package/dist/bin/c4s/commands/resolve.d.ts +2 -0
- package/dist/bin/c4s/commands/resolve.js +40 -0
- package/dist/bin/c4s/commands/resolve.js.map +1 -0
- package/dist/bin/c4s/commands/section-ref.d.ts +2 -0
- package/dist/bin/c4s/commands/section-ref.js +25 -0
- package/dist/bin/c4s/commands/section-ref.js.map +1 -0
- package/dist/bin/c4s/commands/single-element.d.ts +2 -0
- package/dist/bin/c4s/commands/single-element.js +22 -0
- package/dist/bin/c4s/commands/single-element.js.map +1 -0
- package/dist/bin/c4s/commands/tagged-list-mixed.d.ts +2 -0
- package/dist/bin/c4s/commands/tagged-list-mixed.js +39 -0
- package/dist/bin/c4s/commands/tagged-list-mixed.js.map +1 -0
- package/dist/bin/c4s/commands/tagged-list.d.ts +2 -0
- package/dist/bin/c4s/commands/tagged-list.js +24 -0
- package/dist/bin/c4s/commands/tagged-list.js.map +1 -0
- package/dist/bin/c4s/context.d.ts +12 -0
- package/dist/bin/c4s/context.js +27 -0
- package/dist/bin/c4s/context.js.map +1 -0
- package/dist/bin/c4s/errors.d.ts +6 -0
- package/dist/bin/c4s/errors.js +11 -0
- package/dist/bin/c4s/errors.js.map +1 -0
- package/dist/bin/c4s/output.d.ts +4 -0
- package/dist/bin/c4s/output.js +57 -0
- package/dist/bin/c4s/output.js.map +1 -0
- package/dist/bin/c4s/project.d.ts +1 -0
- package/dist/bin/c4s/project.js +23 -0
- package/dist/bin/c4s/project.js.map +1 -0
- package/dist/bin/c4s/type-validation.d.ts +3 -0
- package/dist/bin/c4s/type-validation.js +11 -0
- package/dist/bin/c4s/type-validation.js.map +1 -0
- package/dist/bin/c4s-mcp.d.ts +2 -0
- package/dist/bin/c4s-mcp.js +118 -0
- package/dist/bin/c4s-mcp.js.map +1 -0
- package/dist/bin/c4s.d.ts +2 -0
- package/dist/bin/c4s.js +134 -0
- package/dist/bin/c4s.js.map +1 -0
- package/dist/bin/claude4spec.d.ts +2 -0
- package/dist/bin/claude4spec.js +132 -0
- package/dist/bin/claude4spec.js.map +1 -0
- package/dist/bin/gitignore.d.ts +1 -0
- package/dist/bin/gitignore.js +44 -0
- package/dist/bin/gitignore.js.map +1 -0
- package/dist/client/assets/arc-D8brDDag.js +1 -0
- package/dist/client/assets/architectureDiagram-3BPJPVTR-Bmh1uTQZ.js +36 -0
- package/dist/client/assets/blockDiagram-GPEHLZMM-55jaVWwd.js +132 -0
- package/dist/client/assets/c4Diagram-AAUBKEIU-Dxm0tLsZ.js +10 -0
- package/dist/client/assets/channel-ArVcv4Yl.js +1 -0
- package/dist/client/assets/chunk-2J33WTMH-vDJ1slcJ.js +1 -0
- package/dist/client/assets/chunk-4BX2VUAB-DP6CC-Qn.js +1 -0
- package/dist/client/assets/chunk-55IACEB6-SgOSJYkL.js +1 -0
- package/dist/client/assets/chunk-727SXJPM-BtRfbjBO.js +206 -0
- package/dist/client/assets/chunk-AQP2D5EJ-yIRaTgFg.js +231 -0
- package/dist/client/assets/chunk-FMBD7UC4-B_VD4t8N.js +15 -0
- package/dist/client/assets/chunk-ND2GUHAM-BvJdtX82.js +1 -0
- package/dist/client/assets/chunk-QZHKN3VN-BLNWKymD.js +1 -0
- package/dist/client/assets/classDiagram-4FO5ZUOK-B3nmPR7w.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B3nmPR7w.js +1 -0
- package/dist/client/assets/cose-bilkent-S5V4N54A-BQyA-r-y.js +1 -0
- package/dist/client/assets/cytoscape.esm-D_LviqZs.js +331 -0
- package/dist/client/assets/dagre-BM42HDAG-CAh0mTzA.js +4 -0
- package/dist/client/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/client/assets/diagram-2AECGRRQ-C83TGK4o.js +43 -0
- package/dist/client/assets/diagram-5GNKFQAL-2L6uowvf.js +10 -0
- package/dist/client/assets/diagram-KO2AKTUF-Cj5n4jdq.js +3 -0
- package/dist/client/assets/diagram-LMA3HP47-Bp5SDMjg.js +24 -0
- package/dist/client/assets/diagram-OG6HWLK6-cFsDQ8Qk.js +24 -0
- package/dist/client/assets/erDiagram-TEJ5UH35-D8G5xpg3.js +85 -0
- package/dist/client/assets/flowDiagram-I6XJVG4X-CuNudlCD.js +162 -0
- package/dist/client/assets/ganttDiagram-6RSMTGT7-CtFlsB15.js +292 -0
- package/dist/client/assets/gitGraphDiagram-PVQCEYII-h66Tso4O.js +106 -0
- package/dist/client/assets/graph-CAnANduQ.js +1 -0
- package/dist/client/assets/index-CZOpb3O7.css +1 -0
- package/dist/client/assets/index-D5ljIkCJ.js +727 -0
- package/dist/client/assets/index-aJE-l7h7.js +11 -0
- package/dist/client/assets/index-aPVup1Re.js +51 -0
- package/dist/client/assets/infoDiagram-5YYISTIA-CO_BLfuW.js +2 -0
- package/dist/client/assets/init-Gi6I4Gst.js +1 -0
- package/dist/client/assets/ishikawaDiagram-YF4QCWOH-D4rSRnQA.js +70 -0
- package/dist/client/assets/journeyDiagram-JHISSGLW-GyHI6dB8.js +139 -0
- package/dist/client/assets/kanban-definition-UN3LZRKU-CrH33WLe.js +89 -0
- package/dist/client/assets/katex-CQk2-UhE.js +257 -0
- package/dist/client/assets/layout-DGIYPm2g.js +1 -0
- package/dist/client/assets/linear-Dh1OyvSm.js +1 -0
- package/dist/client/assets/mermaid.core-C45sMDhS.js +309 -0
- package/dist/client/assets/mindmap-definition-RKZ34NQL-Bgwb0vwA.js +96 -0
- package/dist/client/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/client/assets/pieDiagram-4H26LBE5-l9cCpVfG.js +30 -0
- package/dist/client/assets/quadrantDiagram-W4KKPZXB-BCPSUbC3.js +7 -0
- package/dist/client/assets/requirementDiagram-4Y6WPE33-TEGOe-vV.js +84 -0
- package/dist/client/assets/sankeyDiagram-5OEKKPKP-C69pv_7D.js +40 -0
- package/dist/client/assets/sequenceDiagram-3UESZ5HK-arinzeCk.js +162 -0
- package/dist/client/assets/stateDiagram-AJRCARHV-C2YENpmw.js +1 -0
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CS6ocDH6.js +1 -0
- package/dist/client/assets/timeline-definition-PNZ67QCA-h5qtI99f.js +120 -0
- package/dist/client/assets/vennDiagram-CIIHVFJN-CnuK75Ut.js +34 -0
- package/dist/client/assets/wardley-L42UT6IY-B4bQ0Xyy.js +173 -0
- package/dist/client/assets/wardleyDiagram-YWT4CUSO-apV8olQc.js +78 -0
- package/dist/client/assets/xychartDiagram-2RQKCTM6-OTP6zeEy.js +7 -0
- package/dist/client/index.html +19 -0
- package/dist/server/config.d.ts +59 -0
- package/dist/server/config.js +211 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/core/plugin-host/cross-cutting.d.ts +8 -0
- package/dist/server/core/plugin-host/cross-cutting.js +14 -0
- package/dist/server/core/plugin-host/cross-cutting.js.map +1 -0
- package/dist/server/core/plugin-host/entities-router.d.ts +11 -0
- package/dist/server/core/plugin-host/entities-router.js +77 -0
- package/dist/server/core/plugin-host/entities-router.js.map +1 -0
- package/dist/server/core/plugin-host/host.d.ts +11 -0
- package/dist/server/core/plugin-host/host.js +128 -0
- package/dist/server/core/plugin-host/host.js.map +1 -0
- package/dist/server/core/plugin-host/legacy-adapter.d.ts +31 -0
- package/dist/server/core/plugin-host/legacy-adapter.js +88 -0
- package/dist/server/core/plugin-host/legacy-adapter.js.map +1 -0
- package/dist/server/core/plugin-host/serialization-engine.d.ts +35 -0
- package/dist/server/core/plugin-host/serialization-engine.js +132 -0
- package/dist/server/core/plugin-host/serialization-engine.js.map +1 -0
- package/dist/server/core/plugin-host/types.d.ts +143 -0
- package/dist/server/core/plugin-host/types.js +10 -0
- package/dist/server/core/plugin-host/types.js.map +1 -0
- package/dist/server/db/fixups/backfill-plan-titles.d.ts +2 -0
- package/dist/server/db/fixups/backfill-plan-titles.js +22 -0
- package/dist/server/db/fixups/backfill-plan-titles.js.map +1 -0
- package/dist/server/db/index.d.ts +6 -0
- package/dist/server/db/index.js +26 -0
- package/dist/server/db/index.js.map +1 -0
- package/dist/server/db/migrate.d.ts +2 -0
- package/dist/server/db/migrate.js +33 -0
- package/dist/server/db/migrate.js.map +1 -0
- package/dist/server/db/migrations/000_init.sql +7 -0
- package/dist/server/db/migrations/001_endpoint.sql +51 -0
- package/dist/server/db/migrations/002_dto.sql +23 -0
- package/dist/server/db/migrations/003_drop_endpoint_body.sql +5 -0
- package/dist/server/db/migrations/004_drop_module_and_status.sql +31 -0
- package/dist/server/db/migrations/005_chat.sql +23 -0
- package/dist/server/db/migrations/006_database_table.sql +10 -0
- package/dist/server/db/migrations/007_sections.sql +30 -0
- package/dist/server/db/migrations/008_subagent_task.sql +20 -0
- package/dist/server/db/migrations/009_chat_todo_snapshot.sql +4 -0
- package/dist/server/db/migrations/010_chat_plan_mode.sql +5 -0
- package/dist/server/db/migrations/011_chat_initial_system_prompt.sql +4 -0
- package/dist/server/db/migrations/012_chat_message_status.sql +5 -0
- package/dist/server/db/migrations/013_chat_usage_snapshot.sql +7 -0
- package/dist/server/db/migrations/014_plans.sql +33 -0
- package/dist/server/db/migrations/015_dto_examples.sql +4 -0
- package/dist/server/db/migrations/016_ui_view.sql +10 -0
- package/dist/server/db/migrations/017_entity_version_m17.sql +23 -0
- package/dist/server/db/migrations/018_page_version.sql +20 -0
- package/dist/server/db/migrations/019_spec_release.sql +13 -0
- package/dist/server/db/migrations/020_drop_plan_status.sql +10 -0
- package/dist/server/db/migrations/021_plans_n1.sql +36 -0
- package/dist/server/db/migrations/022_brief_chat_columns.sql +23 -0
- package/dist/server/db/migrations/023_page_version_kind.sql +26 -0
- package/dist/server/db/migrations/024_chat_context_size.sql +10 -0
- package/dist/server/db/migrations/025_ac.sql +19 -0
- package/dist/server/db/migrations/026_ac_seed.sql +75 -0
- package/dist/server/db/migrations/027_page_version_change_summary.sql +10 -0
- package/dist/server/db/readonly.d.ts +12 -0
- package/dist/server/db/readonly.js +32 -0
- package/dist/server/db/readonly.js.map +1 -0
- package/dist/server/domain/raw-entity-reader.d.ts +76 -0
- package/dist/server/domain/raw-entity-reader.js +240 -0
- package/dist/server/domain/raw-entity-reader.js.map +1 -0
- package/dist/server/entities/ac/mcp-server.d.ts +10 -0
- package/dist/server/entities/ac/mcp-server.js +154 -0
- package/dist/server/entities/ac/mcp-server.js.map +1 -0
- package/dist/server/entities/ac/plugin.d.ts +2 -0
- package/dist/server/entities/ac/plugin.js +33 -0
- package/dist/server/entities/ac/plugin.js.map +1 -0
- package/dist/server/entities/ac/routes.d.ts +4 -0
- package/dist/server/entities/ac/routes.js +92 -0
- package/dist/server/entities/ac/routes.js.map +1 -0
- package/dist/server/entities/ac/serializer.d.ts +13 -0
- package/dist/server/entities/ac/serializer.js +124 -0
- package/dist/server/entities/ac/serializer.js.map +1 -0
- package/dist/server/entities/ac/services.d.ts +35 -0
- package/dist/server/entities/ac/services.js +261 -0
- package/dist/server/entities/ac/services.js.map +1 -0
- package/dist/server/entities/ac/system-prompt.d.ts +2 -0
- package/dist/server/entities/ac/system-prompt.js +18 -0
- package/dist/server/entities/ac/system-prompt.js.map +1 -0
- package/dist/server/entities/database-table/mcp-server.d.ts +10 -0
- package/dist/server/entities/database-table/mcp-server.js +184 -0
- package/dist/server/entities/database-table/mcp-server.js.map +1 -0
- package/dist/server/entities/database-table/plugin.d.ts +2 -0
- package/dist/server/entities/database-table/plugin.js +33 -0
- package/dist/server/entities/database-table/plugin.js.map +1 -0
- package/dist/server/entities/database-table/routes.d.ts +5 -0
- package/dist/server/entities/database-table/routes.js +86 -0
- package/dist/server/entities/database-table/routes.js.map +1 -0
- package/dist/server/entities/database-table/serializer.d.ts +12 -0
- package/dist/server/entities/database-table/serializer.js +192 -0
- package/dist/server/entities/database-table/serializer.js.map +1 -0
- package/dist/server/entities/database-table/services.d.ts +45 -0
- package/dist/server/entities/database-table/services.js +323 -0
- package/dist/server/entities/database-table/services.js.map +1 -0
- package/dist/server/entities/database-table/system-prompt.d.ts +2 -0
- package/dist/server/entities/database-table/system-prompt.js +11 -0
- package/dist/server/entities/database-table/system-prompt.js.map +1 -0
- package/dist/server/entities/dto/mcp-server.d.ts +10 -0
- package/dist/server/entities/dto/mcp-server.js +141 -0
- package/dist/server/entities/dto/mcp-server.js.map +1 -0
- package/dist/server/entities/dto/plugin.d.ts +2 -0
- package/dist/server/entities/dto/plugin.js +33 -0
- package/dist/server/entities/dto/plugin.js.map +1 -0
- package/dist/server/entities/dto/routes.d.ts +4 -0
- package/dist/server/entities/dto/routes.js +74 -0
- package/dist/server/entities/dto/routes.js.map +1 -0
- package/dist/server/entities/dto/serializer.d.ts +12 -0
- package/dist/server/entities/dto/serializer.js +184 -0
- package/dist/server/entities/dto/serializer.js.map +1 -0
- package/dist/server/entities/dto/services.d.ts +30 -0
- package/dist/server/entities/dto/services.js +242 -0
- package/dist/server/entities/dto/services.js.map +1 -0
- package/dist/server/entities/dto/system-prompt.d.ts +2 -0
- package/dist/server/entities/dto/system-prompt.js +11 -0
- package/dist/server/entities/dto/system-prompt.js.map +1 -0
- package/dist/server/entities/endpoint/mcp-server.d.ts +10 -0
- package/dist/server/entities/endpoint/mcp-server.js +156 -0
- package/dist/server/entities/endpoint/mcp-server.js.map +1 -0
- package/dist/server/entities/endpoint/plugin.d.ts +2 -0
- package/dist/server/entities/endpoint/plugin.js +36 -0
- package/dist/server/entities/endpoint/plugin.js.map +1 -0
- package/dist/server/entities/endpoint/routes.d.ts +4 -0
- package/dist/server/entities/endpoint/routes.js +107 -0
- package/dist/server/entities/endpoint/routes.js.map +1 -0
- package/dist/server/entities/endpoint/serializer.d.ts +17 -0
- package/dist/server/entities/endpoint/serializer.js +217 -0
- package/dist/server/entities/endpoint/serializer.js.map +1 -0
- package/dist/server/entities/endpoint/services.d.ts +30 -0
- package/dist/server/entities/endpoint/services.js +260 -0
- package/dist/server/entities/endpoint/services.js.map +1 -0
- package/dist/server/entities/endpoint/system-prompt.d.ts +2 -0
- package/dist/server/entities/endpoint/system-prompt.js +11 -0
- package/dist/server/entities/endpoint/system-prompt.js.map +1 -0
- package/dist/server/entities/ui-view/mcp-server.d.ts +10 -0
- package/dist/server/entities/ui-view/mcp-server.js +161 -0
- package/dist/server/entities/ui-view/mcp-server.js.map +1 -0
- package/dist/server/entities/ui-view/plugin.d.ts +2 -0
- package/dist/server/entities/ui-view/plugin.js +33 -0
- package/dist/server/entities/ui-view/plugin.js.map +1 -0
- package/dist/server/entities/ui-view/routes.d.ts +5 -0
- package/dist/server/entities/ui-view/routes.js +82 -0
- package/dist/server/entities/ui-view/routes.js.map +1 -0
- package/dist/server/entities/ui-view/serializer.d.ts +12 -0
- package/dist/server/entities/ui-view/serializer.js +262 -0
- package/dist/server/entities/ui-view/serializer.js.map +1 -0
- package/dist/server/entities/ui-view/services.d.ts +35 -0
- package/dist/server/entities/ui-view/services.js +255 -0
- package/dist/server/entities/ui-view/services.js.map +1 -0
- package/dist/server/entities/ui-view/system-prompt.d.ts +7 -0
- package/dist/server/entities/ui-view/system-prompt.js +15 -0
- package/dist/server/entities/ui-view/system-prompt.js.map +1 -0
- package/dist/server/external-skills/brief-implementer-template.d.ts +2 -0
- package/dist/server/external-skills/brief-implementer-template.js +123 -0
- package/dist/server/external-skills/brief-implementer-template.js.map +1 -0
- package/dist/server/external-skills/external-skills-service.d.ts +3 -0
- package/dist/server/external-skills/external-skills-service.js +47 -0
- package/dist/server/external-skills/external-skills-service.js.map +1 -0
- package/dist/server/external-skills/spec-reader-template.d.ts +2 -0
- package/dist/server/external-skills/spec-reader-template.js +47 -0
- package/dist/server/external-skills/spec-reader-template.js.map +1 -0
- package/dist/server/fs/watcher.d.ts +26 -0
- package/dist/server/fs/watcher.js +64 -0
- package/dist/server/fs/watcher.js.map +1 -0
- package/dist/server/index.d.ts +18 -0
- package/dist/server/index.js +474 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp/brief-tools.d.ts +19 -0
- package/dist/server/mcp/brief-tools.js +189 -0
- package/dist/server/mcp/brief-tools.js.map +1 -0
- package/dist/server/mcp/c4s-reader.d.ts +12 -0
- package/dist/server/mcp/c4s-reader.js +263 -0
- package/dist/server/mcp/c4s-reader.js.map +1 -0
- package/dist/server/mcp/database-tools.d.ts +10 -0
- package/dist/server/mcp/database-tools.js +184 -0
- package/dist/server/mcp/database-tools.js.map +1 -0
- package/dist/server/mcp/dependency-tools.d.ts +12 -0
- package/dist/server/mcp/dependency-tools.js +205 -0
- package/dist/server/mcp/dependency-tools.js.map +1 -0
- package/dist/server/mcp/dto-tools.d.ts +10 -0
- package/dist/server/mcp/dto-tools.js +141 -0
- package/dist/server/mcp/dto-tools.js.map +1 -0
- package/dist/server/mcp/endpoint-tools.d.ts +10 -0
- package/dist/server/mcp/endpoint-tools.js +156 -0
- package/dist/server/mcp/endpoint-tools.js.map +1 -0
- package/dist/server/mcp/ensure-mcp-json.d.ts +6 -0
- package/dist/server/mcp/ensure-mcp-json.js +30 -0
- package/dist/server/mcp/ensure-mcp-json.js.map +1 -0
- package/dist/server/mcp/index.d.ts +29 -0
- package/dist/server/mcp/index.js +40 -0
- package/dist/server/mcp/index.js.map +1 -0
- package/dist/server/mcp/plan-tools.d.ts +7 -0
- package/dist/server/mcp/plan-tools.js +105 -0
- package/dist/server/mcp/plan-tools.js.map +1 -0
- package/dist/server/mcp/reference-tools.d.ts +17 -0
- package/dist/server/mcp/reference-tools.js +630 -0
- package/dist/server/mcp/reference-tools.js.map +1 -0
- package/dist/server/mcp/release-tools/index.d.ts +21 -0
- package/dist/server/mcp/release-tools/index.js +140 -0
- package/dist/server/mcp/release-tools/index.js.map +1 -0
- package/dist/server/mcp/release-tools/projection.d.ts +32 -0
- package/dist/server/mcp/release-tools/projection.js +278 -0
- package/dist/server/mcp/release-tools/projection.js.map +1 -0
- package/dist/server/mcp/release-tools/types.d.ts +91 -0
- package/dist/server/mcp/release-tools/types.js +11 -0
- package/dist/server/mcp/release-tools/types.js.map +1 -0
- package/dist/server/mcp/release-tools.d.ts +14 -0
- package/dist/server/mcp/release-tools.js +83 -0
- package/dist/server/mcp/release-tools.js.map +1 -0
- package/dist/server/mcp/ui-view-tools.d.ts +10 -0
- package/dist/server/mcp/ui-view-tools.js +161 -0
- package/dist/server/mcp/ui-view-tools.js.map +1 -0
- package/dist/server/routes/briefs.d.ts +8 -0
- package/dist/server/routes/briefs.js +178 -0
- package/dist/server/routes/briefs.js.map +1 -0
- package/dist/server/routes/chat.d.ts +29 -0
- package/dist/server/routes/chat.js +604 -0
- package/dist/server/routes/chat.js.map +1 -0
- package/dist/server/routes/database-tables.d.ts +5 -0
- package/dist/server/routes/database-tables.js +86 -0
- package/dist/server/routes/database-tables.js.map +1 -0
- package/dist/server/routes/dependencies.d.ts +6 -0
- package/dist/server/routes/dependencies.js +164 -0
- package/dist/server/routes/dependencies.js.map +1 -0
- package/dist/server/routes/dtos.d.ts +4 -0
- package/dist/server/routes/dtos.js +74 -0
- package/dist/server/routes/dtos.js.map +1 -0
- package/dist/server/routes/endpoints.d.ts +4 -0
- package/dist/server/routes/endpoints.js +107 -0
- package/dist/server/routes/endpoints.js.map +1 -0
- package/dist/server/routes/entities.d.ts +8 -0
- package/dist/server/routes/entities.js +84 -0
- package/dist/server/routes/entities.js.map +1 -0
- package/dist/server/routes/errors.d.ts +2 -0
- package/dist/server/routes/errors.js +37 -0
- package/dist/server/routes/errors.js.map +1 -0
- package/dist/server/routes/page-links.d.ts +3 -0
- package/dist/server/routes/page-links.js +40 -0
- package/dist/server/routes/page-links.js.map +1 -0
- package/dist/server/routes/pages.d.ts +5 -0
- package/dist/server/routes/pages.js +142 -0
- package/dist/server/routes/pages.js.map +1 -0
- package/dist/server/routes/plans.d.ts +3 -0
- package/dist/server/routes/plans.js +192 -0
- package/dist/server/routes/plans.js.map +1 -0
- package/dist/server/routes/references.d.ts +3 -0
- package/dist/server/routes/references.js +34 -0
- package/dist/server/routes/references.js.map +1 -0
- package/dist/server/routes/releases.d.ts +4 -0
- package/dist/server/routes/releases.js +122 -0
- package/dist/server/routes/releases.js.map +1 -0
- package/dist/server/routes/sections.d.ts +3 -0
- package/dist/server/routes/sections.js +32 -0
- package/dist/server/routes/sections.js.map +1 -0
- package/dist/server/routes/tags.d.ts +4 -0
- package/dist/server/routes/tags.js +56 -0
- package/dist/server/routes/tags.js.map +1 -0
- package/dist/server/routes/threads.d.ts +3 -0
- package/dist/server/routes/threads.js +78 -0
- package/dist/server/routes/threads.js.map +1 -0
- package/dist/server/routes/todos.d.ts +3 -0
- package/dist/server/routes/todos.js +28 -0
- package/dist/server/routes/todos.js.map +1 -0
- package/dist/server/routes/ui-views.d.ts +5 -0
- package/dist/server/routes/ui-views.js +82 -0
- package/dist/server/routes/ui-views.js.map +1 -0
- package/dist/server/serialization/auto-schema.d.ts +3 -0
- package/dist/server/serialization/auto-schema.js +55 -0
- package/dist/server/serialization/auto-schema.js.map +1 -0
- package/dist/server/serialization/fallback.d.ts +4 -0
- package/dist/server/serialization/fallback.js +27 -0
- package/dist/server/serialization/fallback.js.map +1 -0
- package/dist/server/serialization/inline-renderer.d.ts +4 -0
- package/dist/server/serialization/inline-renderer.js +151 -0
- package/dist/server/serialization/inline-renderer.js.map +1 -0
- package/dist/server/serialization/registerAll.d.ts +6 -0
- package/dist/server/serialization/registerAll.js +7 -0
- package/dist/server/serialization/registerAll.js.map +1 -0
- package/dist/server/serialization/registry.d.ts +26 -0
- package/dist/server/serialization/registry.js +121 -0
- package/dist/server/serialization/registry.js.map +1 -0
- package/dist/server/serialization/resolve-page.d.ts +24 -0
- package/dist/server/serialization/resolve-page.js +192 -0
- package/dist/server/serialization/resolve-page.js.map +1 -0
- package/dist/server/serialization/serializers/database-table.d.ts +1 -0
- package/dist/server/serialization/serializers/database-table.js +46 -0
- package/dist/server/serialization/serializers/database-table.js.map +1 -0
- package/dist/server/serialization/serializers/dto.d.ts +1 -0
- package/dist/server/serialization/serializers/dto.js +48 -0
- package/dist/server/serialization/serializers/dto.js.map +1 -0
- package/dist/server/serialization/serializers/endpoint.d.ts +1 -0
- package/dist/server/serialization/serializers/endpoint.js +93 -0
- package/dist/server/serialization/serializers/endpoint.js.map +1 -0
- package/dist/server/serialization/serializers/section.d.ts +1 -0
- package/dist/server/serialization/serializers/section.js +24 -0
- package/dist/server/serialization/serializers/section.js.map +1 -0
- package/dist/server/serialization/serializers/ui-view.d.ts +1 -0
- package/dist/server/serialization/serializers/ui-view.js +124 -0
- package/dist/server/serialization/serializers/ui-view.js.map +1 -0
- package/dist/server/serialization/snapshot.d.ts +22 -0
- package/dist/server/serialization/snapshot.js +102 -0
- package/dist/server/serialization/snapshot.js.map +1 -0
- package/dist/server/serialization/types.d.ts +70 -0
- package/dist/server/serialization/types.js +7 -0
- package/dist/server/serialization/types.js.map +1 -0
- package/dist/server/serialization/writer.d.ts +41 -0
- package/dist/server/serialization/writer.js +13 -0
- package/dist/server/serialization/writer.js.map +1 -0
- package/dist/server/services/brief.d.ts +86 -0
- package/dist/server/services/brief.js +218 -0
- package/dist/server/services/brief.js.map +1 -0
- package/dist/server/services/chat-context.d.ts +26 -0
- package/dist/server/services/chat-context.js +434 -0
- package/dist/server/services/chat-context.js.map +1 -0
- package/dist/server/services/chat.d.ts +50 -0
- package/dist/server/services/chat.js +309 -0
- package/dist/server/services/chat.js.map +1 -0
- package/dist/server/services/database-table.d.ts +36 -0
- package/dist/server/services/database-table.js +303 -0
- package/dist/server/services/database-table.js.map +1 -0
- package/dist/server/services/dependencies.d.ts +45 -0
- package/dist/server/services/dependencies.js +302 -0
- package/dist/server/services/dependencies.js.map +1 -0
- package/dist/server/services/dto.d.ts +22 -0
- package/dist/server/services/dto.js +222 -0
- package/dist/server/services/dto.js.map +1 -0
- package/dist/server/services/endpoint.d.ts +22 -0
- package/dist/server/services/endpoint.js +239 -0
- package/dist/server/services/endpoint.js.map +1 -0
- package/dist/server/services/entity-writer.d.ts +46 -0
- package/dist/server/services/entity-writer.js +137 -0
- package/dist/server/services/entity-writer.js.map +1 -0
- package/dist/server/services/page-serializer.d.ts +109 -0
- package/dist/server/services/page-serializer.js +359 -0
- package/dist/server/services/page-serializer.js.map +1 -0
- package/dist/server/services/page-version.d.ts +75 -0
- package/dist/server/services/page-version.js +159 -0
- package/dist/server/services/page-version.js.map +1 -0
- package/dist/server/services/pages-frontmatter-indexer.d.ts +51 -0
- package/dist/server/services/pages-frontmatter-indexer.js +138 -0
- package/dist/server/services/pages-frontmatter-indexer.js.map +1 -0
- package/dist/server/services/pages-link-indexer.d.ts +36 -0
- package/dist/server/services/pages-link-indexer.js +474 -0
- package/dist/server/services/pages-link-indexer.js.map +1 -0
- package/dist/server/services/pages.d.ts +16 -0
- package/dist/server/services/pages.js +149 -0
- package/dist/server/services/pages.js.map +1 -0
- package/dist/server/services/plan.d.ts +59 -0
- package/dist/server/services/plan.js +459 -0
- package/dist/server/services/plan.js.map +1 -0
- package/dist/server/services/references.d.ts +17 -0
- package/dist/server/services/references.js +175 -0
- package/dist/server/services/references.js.map +1 -0
- package/dist/server/services/release.d.ts +146 -0
- package/dist/server/services/release.js +602 -0
- package/dist/server/services/release.js.map +1 -0
- package/dist/server/services/section-indexer.d.ts +20 -0
- package/dist/server/services/section-indexer.js +276 -0
- package/dist/server/services/section-indexer.js.map +1 -0
- package/dist/server/services/sections.d.ts +34 -0
- package/dist/server/services/sections.js +136 -0
- package/dist/server/services/sections.js.map +1 -0
- package/dist/server/services/skill-registry.d.ts +38 -0
- package/dist/server/services/skill-registry.js +171 -0
- package/dist/server/services/skill-registry.js.map +1 -0
- package/dist/server/services/slug.d.ts +7 -0
- package/dist/server/services/slug.js +41 -0
- package/dist/server/services/slug.js.map +1 -0
- package/dist/server/services/tags.d.ts +27 -0
- package/dist/server/services/tags.js +153 -0
- package/dist/server/services/tags.js.map +1 -0
- package/dist/server/services/todos-indexer.d.ts +21 -0
- package/dist/server/services/todos-indexer.js +123 -0
- package/dist/server/services/todos-indexer.js.map +1 -0
- package/dist/server/services/ui-view.d.ts +26 -0
- package/dist/server/services/ui-view.js +235 -0
- package/dist/server/services/ui-view.js.map +1 -0
- package/dist/server/services/versions.d.ts +59 -0
- package/dist/server/services/versions.js +181 -0
- package/dist/server/services/versions.js.map +1 -0
- package/dist/server/skills/brief-author/SKILL.md +117 -0
- package/dist/server/skills/layered-vertical-slices/SKILL.md +135 -0
- package/dist/server/skills/layered-vertical-slices/templates/index.md +97 -0
- package/dist/server/skills/layered-vertical-slices/templates/layer.md +42 -0
- package/dist/server/skills/layered-vertical-slices/templates/module.md +52 -0
- package/dist/server/skills/layered-vertical-slices/workflows/bootstrap.md +116 -0
- package/dist/server/skills/layered-vertical-slices/workflows/brief.md +154 -0
- package/dist/server/skills/layered-vertical-slices/workflows/daily.md +77 -0
- package/dist/server/ws/gateway.d.ts +10 -0
- package/dist/server/ws/gateway.js +35 -0
- package/dist/server/ws/gateway.js.map +1 -0
- package/dist/shared/anchor-pattern.d.ts +15 -0
- package/dist/shared/anchor-pattern.js +16 -0
- package/dist/shared/anchor-pattern.js.map +1 -0
- package/dist/shared/diagram-source-escape.d.ts +2 -0
- package/dist/shared/diagram-source-escape.js +19 -0
- package/dist/shared/diagram-source-escape.js.map +1 -0
- package/dist/shared/entities.d.ts +622 -0
- package/dist/shared/entities.js +9 -0
- package/dist/shared/entities.js.map +1 -0
- package/dist/shared/page-links.d.ts +40 -0
- package/dist/shared/page-links.js +2 -0
- package/dist/shared/page-links.js.map +1 -0
- package/dist/shared/plugin-host/types.d.ts +66 -0
- package/dist/shared/plugin-host/types.js +11 -0
- package/dist/shared/plugin-host/types.js.map +1 -0
- package/dist/shared/reference-extensions.d.ts +13 -0
- package/dist/shared/reference-extensions.js +17 -0
- package/dist/shared/reference-extensions.js.map +1 -0
- package/dist/shared/types.d.ts +86 -0
- package/dist/shared/types.js +2 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/xml-tags.d.ts +16 -0
- package/dist/shared/xml-tags.js +101 -0
- package/dist/shared/xml-tags.js.map +1 -0
- package/package.json +110 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { uiViewSlug } from '../../services/slug.js';
|
|
2
|
+
import { DomainError } from '../../services/tags.js';
|
|
3
|
+
const VALID_LOCATIONS = ['path', 'query', 'hash'];
|
|
4
|
+
export class UiViewService {
|
|
5
|
+
db;
|
|
6
|
+
tags;
|
|
7
|
+
versions;
|
|
8
|
+
constructor(db, tags, versions) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
this.tags = tags;
|
|
11
|
+
this.versions = versions;
|
|
12
|
+
}
|
|
13
|
+
create(input, actor) {
|
|
14
|
+
if (!input.name)
|
|
15
|
+
throw new DomainError('VALIDATION', 'name is required');
|
|
16
|
+
const slug = input.slug?.trim() || uiViewSlug(input.name);
|
|
17
|
+
if (!slug)
|
|
18
|
+
throw new DomainError('VALIDATION', 'slug resolves to empty');
|
|
19
|
+
const params = input.params ?? [];
|
|
20
|
+
const url = normaliseUrl(input.url);
|
|
21
|
+
const tx = this.db.transaction(() => {
|
|
22
|
+
const conflict = this.db.prepare(`SELECT 1 FROM ui_view WHERE slug = ?`).get(slug);
|
|
23
|
+
if (conflict)
|
|
24
|
+
throw new DomainError('SLUG_CONFLICT', `ui view slug '${slug}' already exists`);
|
|
25
|
+
const info = this.db
|
|
26
|
+
.prepare(`INSERT INTO ui_view (slug, name, url, description, params)
|
|
27
|
+
VALUES (?, ?, ?, ?, ?)`)
|
|
28
|
+
.run(slug, input.name, url, input.description ?? null, JSON.stringify(params));
|
|
29
|
+
const id = Number(info.lastInsertRowid);
|
|
30
|
+
if (input.tags?.length)
|
|
31
|
+
this.tags.assignTags('ui-view', id, input.tags);
|
|
32
|
+
const created = this.getByIdInternal(id);
|
|
33
|
+
this.versions.captureEntitySnapshot('ui-view', id, 'create', actor, 'Created', '1.0.0');
|
|
34
|
+
const warnings = computeWarnings(url, params);
|
|
35
|
+
return { uiView: created, warnings };
|
|
36
|
+
});
|
|
37
|
+
return tx();
|
|
38
|
+
}
|
|
39
|
+
list(query = {}) {
|
|
40
|
+
const where = [];
|
|
41
|
+
const params = [];
|
|
42
|
+
if (query.search) {
|
|
43
|
+
where.push(`(name LIKE ? OR description LIKE ? OR slug LIKE ? OR url LIKE ?)`);
|
|
44
|
+
const like = `%${query.search}%`;
|
|
45
|
+
params.push(like, like, like, like);
|
|
46
|
+
}
|
|
47
|
+
const tagSlugs = query.tags?.filter(Boolean) ?? [];
|
|
48
|
+
if (tagSlugs.length) {
|
|
49
|
+
const placeholders = tagSlugs.map(() => '?').join(',');
|
|
50
|
+
if (query.tagFilter === 'or') {
|
|
51
|
+
where.push(`
|
|
52
|
+
id IN (
|
|
53
|
+
SELECT et.entity_id FROM entity_tag et
|
|
54
|
+
JOIN tag t ON t.id = et.tag_id
|
|
55
|
+
WHERE et.entity_type = 'ui-view' AND t.slug IN (${placeholders})
|
|
56
|
+
)
|
|
57
|
+
`);
|
|
58
|
+
params.push(...tagSlugs);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
where.push(`
|
|
62
|
+
id IN (
|
|
63
|
+
SELECT et.entity_id
|
|
64
|
+
FROM entity_tag et
|
|
65
|
+
JOIN tag t ON t.id = et.tag_id
|
|
66
|
+
WHERE et.entity_type = 'ui-view' AND t.slug IN (${placeholders})
|
|
67
|
+
GROUP BY et.entity_id
|
|
68
|
+
HAVING COUNT(DISTINCT t.slug) = ?
|
|
69
|
+
)
|
|
70
|
+
`);
|
|
71
|
+
params.push(...tagSlugs, tagSlugs.length);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const whereSql = where.length ? `WHERE ${where.join(' AND ')}` : '';
|
|
75
|
+
const limit = Math.min(Math.max(query.limit ?? 200, 1), 500);
|
|
76
|
+
const offset = Math.max(query.offset ?? 0, 0);
|
|
77
|
+
const rows = this.db
|
|
78
|
+
.prepare(`SELECT * FROM ui_view ${whereSql}
|
|
79
|
+
ORDER BY name
|
|
80
|
+
LIMIT ? OFFSET ?`)
|
|
81
|
+
.all(...params, limit, offset);
|
|
82
|
+
return rows.map((r) => this.hydrate(r));
|
|
83
|
+
}
|
|
84
|
+
getBySlug(slug) {
|
|
85
|
+
const row = this.db.prepare(`SELECT * FROM ui_view WHERE slug = ?`).get(slug);
|
|
86
|
+
return row ? this.hydrate(row) : null;
|
|
87
|
+
}
|
|
88
|
+
getIdBySlug(slug) {
|
|
89
|
+
const row = this.db.prepare(`SELECT id FROM ui_view WHERE slug = ?`).get(slug);
|
|
90
|
+
return row?.id ?? null;
|
|
91
|
+
}
|
|
92
|
+
update(slug, input, actor) {
|
|
93
|
+
const tx = this.db.transaction(() => {
|
|
94
|
+
const current = this.db.prepare(`SELECT * FROM ui_view WHERE slug = ?`).get(slug);
|
|
95
|
+
if (!current)
|
|
96
|
+
throw new DomainError('NOT_FOUND', `ui view '${slug}' not found`);
|
|
97
|
+
const nextName = input.name ?? current.name;
|
|
98
|
+
const autoSlug = uiViewSlug(nextName);
|
|
99
|
+
const nextSlug = input.newSlug?.trim() || autoSlug;
|
|
100
|
+
if (nextSlug !== slug) {
|
|
101
|
+
const conflict = this.db.prepare(`SELECT 1 FROM ui_view WHERE slug = ?`).get(nextSlug);
|
|
102
|
+
if (conflict)
|
|
103
|
+
throw new DomainError('SLUG_CONFLICT', `ui view slug '${nextSlug}' already exists`);
|
|
104
|
+
}
|
|
105
|
+
const nextParams = input.params !== undefined ? JSON.stringify(input.params) : current.params;
|
|
106
|
+
const nextUrl = input.url !== undefined ? normaliseUrl(input.url) : current.url;
|
|
107
|
+
this.db
|
|
108
|
+
.prepare(`UPDATE ui_view
|
|
109
|
+
SET slug = ?, name = ?, url = ?, description = ?, params = ?,
|
|
110
|
+
updated_at = datetime('now')
|
|
111
|
+
WHERE id = ?`)
|
|
112
|
+
.run(nextSlug, nextName, nextUrl, input.description !== undefined ? input.description : current.description, nextParams, current.id);
|
|
113
|
+
if (input.tags)
|
|
114
|
+
this.tags.assignTags('ui-view', current.id, input.tags);
|
|
115
|
+
const updated = this.getByIdInternal(current.id);
|
|
116
|
+
const summary = nextSlug !== slug ? `Renamed from '${slug}' to '${nextSlug}'` : 'Updated';
|
|
117
|
+
this.versions.captureEntitySnapshot('ui-view', current.id, 'update', actor, summary, '1.0.0');
|
|
118
|
+
const warnings = computeWarnings(updated.url, updated.params);
|
|
119
|
+
return { uiView: updated, previousSlug: slug, warnings };
|
|
120
|
+
});
|
|
121
|
+
return tx();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Idempotent UPSERT for M17 restore. CREATE if slug missing, UPDATE
|
|
125
|
+
* otherwise; preserves slug.
|
|
126
|
+
*/
|
|
127
|
+
upsert(slug, input, actor) {
|
|
128
|
+
const existing = this.getBySlug(slug);
|
|
129
|
+
if (!existing) {
|
|
130
|
+
const result = this.create({ ...input, slug }, actor);
|
|
131
|
+
return { uiView: result.uiView, op: 'created', warnings: result.warnings };
|
|
132
|
+
}
|
|
133
|
+
const result = this.update(slug, {
|
|
134
|
+
name: input.name,
|
|
135
|
+
url: input.url,
|
|
136
|
+
description: input.description,
|
|
137
|
+
params: input.params,
|
|
138
|
+
tags: input.tags,
|
|
139
|
+
}, actor);
|
|
140
|
+
return { uiView: result.uiView, op: 'updated', warnings: result.warnings };
|
|
141
|
+
}
|
|
142
|
+
remove(slug, actor, brokenReferences = []) {
|
|
143
|
+
const tx = this.db.transaction(() => {
|
|
144
|
+
const row = this.db.prepare(`SELECT * FROM ui_view WHERE slug = ?`).get(slug);
|
|
145
|
+
if (!row)
|
|
146
|
+
throw new DomainError('NOT_FOUND', `ui view '${slug}' not found`);
|
|
147
|
+
// M17: capture snapshot BEFORE delete.
|
|
148
|
+
this.versions.captureEntitySnapshot('ui-view', row.id, 'delete', actor, 'Deleted', '1.0.0');
|
|
149
|
+
this.db
|
|
150
|
+
.prepare(`DELETE FROM entity_tag WHERE entity_type = 'ui-view' AND entity_id = ?`)
|
|
151
|
+
.run(row.id);
|
|
152
|
+
this.db.prepare(`DELETE FROM ui_view WHERE id = ?`).run(row.id);
|
|
153
|
+
return { deleted: true, brokenReferences };
|
|
154
|
+
});
|
|
155
|
+
return tx();
|
|
156
|
+
}
|
|
157
|
+
getByIdInternal(id) {
|
|
158
|
+
const row = this.db.prepare(`SELECT * FROM ui_view WHERE id = ?`).get(id);
|
|
159
|
+
if (!row)
|
|
160
|
+
throw new Error(`ui_view id ${id} disappeared mid-tx`);
|
|
161
|
+
return this.hydrate(row);
|
|
162
|
+
}
|
|
163
|
+
hydrate(row) {
|
|
164
|
+
return {
|
|
165
|
+
slug: row.slug,
|
|
166
|
+
name: row.name,
|
|
167
|
+
url: row.url,
|
|
168
|
+
description: row.description,
|
|
169
|
+
params: parseParams(row.params),
|
|
170
|
+
tags: this.tags.getEntityTagSlugs('ui-view', row.id),
|
|
171
|
+
createdAt: row.created_at,
|
|
172
|
+
updatedAt: row.updated_at,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function normaliseUrl(value) {
|
|
177
|
+
if (value === undefined || value === null)
|
|
178
|
+
return null;
|
|
179
|
+
const trimmed = value.trim();
|
|
180
|
+
return trimmed === '' ? null : trimmed;
|
|
181
|
+
}
|
|
182
|
+
function parseParams(raw) {
|
|
183
|
+
try {
|
|
184
|
+
const parsed = JSON.parse(raw);
|
|
185
|
+
if (!Array.isArray(parsed))
|
|
186
|
+
return [];
|
|
187
|
+
return parsed
|
|
188
|
+
.filter((p) => p && typeof p === 'object' && typeof p.name === 'string')
|
|
189
|
+
.map((p) => {
|
|
190
|
+
const inValue = String(p.in ?? '');
|
|
191
|
+
const location = VALID_LOCATIONS.includes(inValue)
|
|
192
|
+
? inValue
|
|
193
|
+
: 'query';
|
|
194
|
+
const out = {
|
|
195
|
+
name: String(p.name),
|
|
196
|
+
in: location,
|
|
197
|
+
};
|
|
198
|
+
if (typeof p.type === 'string')
|
|
199
|
+
out.type = p.type;
|
|
200
|
+
if (typeof p.required === 'boolean')
|
|
201
|
+
out.required = p.required;
|
|
202
|
+
if (typeof p.default === 'string')
|
|
203
|
+
out.default = p.default;
|
|
204
|
+
if (typeof p.description === 'string')
|
|
205
|
+
out.description = p.description;
|
|
206
|
+
return out;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const PATH_PARAM_RE = /:([a-zA-Z_][a-zA-Z0-9_]*)/g;
|
|
214
|
+
export function computeWarnings(url, params) {
|
|
215
|
+
const warnings = [];
|
|
216
|
+
for (let i = 0; i < params.length; i++) {
|
|
217
|
+
const p = params[i];
|
|
218
|
+
if (!p.name) {
|
|
219
|
+
warnings.push(`params[${i}]: missing 'name'`);
|
|
220
|
+
}
|
|
221
|
+
if (!VALID_LOCATIONS.includes(p.in)) {
|
|
222
|
+
warnings.push(`params[${i}] '${p.name ?? '?'}': invalid 'in' value '${p.in}' (expected path|query|hash)`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const seen = new Set();
|
|
226
|
+
for (const p of params) {
|
|
227
|
+
const key = `${p.in}::${p.name}`;
|
|
228
|
+
if (seen.has(key)) {
|
|
229
|
+
warnings.push(`Duplicate param (name='${p.name}', in='${p.in}')`);
|
|
230
|
+
}
|
|
231
|
+
seen.add(key);
|
|
232
|
+
}
|
|
233
|
+
const urlPathParams = new Set();
|
|
234
|
+
if (url) {
|
|
235
|
+
const matches = url.matchAll(PATH_PARAM_RE);
|
|
236
|
+
for (const m of matches)
|
|
237
|
+
urlPathParams.add(m[1]);
|
|
238
|
+
}
|
|
239
|
+
const declaredPathParams = new Set(params.filter((p) => p.in === 'path' && p.name).map((p) => p.name));
|
|
240
|
+
for (const name of urlPathParams) {
|
|
241
|
+
if (!declaredPathParams.has(name)) {
|
|
242
|
+
warnings.push(`path param ":${name}" in URL not declared in params[]`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
for (const name of declaredPathParams) {
|
|
246
|
+
if (url && !urlPathParams.has(name)) {
|
|
247
|
+
warnings.push(`path param '${name}' declared but not present in URL`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
if (url === null && declaredPathParams.size > 0) {
|
|
251
|
+
warnings.push(`path params declared but URL is null (modal/drawer should not have path params)`);
|
|
252
|
+
}
|
|
253
|
+
return warnings;
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../../../src/server/entities/ui-view/services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SystemPromptContribution } from '../../../shared/plugin-host/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* UI views are intentionally absent from the chat system prompt today (legacy
|
|
4
|
+
* behavior). Empty roleNoun signals opt-out — buildSystemPrompt skips this
|
|
5
|
+
* plugin's contribution.
|
|
6
|
+
*/
|
|
7
|
+
export declare const uiViewSystemPrompt: SystemPromptContribution;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI views are intentionally absent from the chat system prompt today (legacy
|
|
3
|
+
* behavior). Empty roleNoun signals opt-out — buildSystemPrompt skips this
|
|
4
|
+
* plugin's contribution.
|
|
5
|
+
*/
|
|
6
|
+
export const uiViewSystemPrompt = {
|
|
7
|
+
roleNoun: '',
|
|
8
|
+
countStat: {
|
|
9
|
+
placeholder: 'uiViewCount',
|
|
10
|
+
sqlQuery: 'SELECT COUNT(*) AS count FROM ui_view',
|
|
11
|
+
label: 'ui-views',
|
|
12
|
+
},
|
|
13
|
+
mcpToolsLine: '',
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../../../src/server/entities/ui-view/system-prompt.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA6B;IAC1D,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE;QACT,WAAW,EAAE,aAAa;QAC1B,QAAQ,EAAE,uCAAuC;QACjD,KAAK,EAAE,UAAU;KAClB;IACD,YAAY,EAAE,EAAE;CACjB,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const BRIEF_IMPLEMENTER_FRONTMATTER = "---\nname: c4s-brief-implementer\ndescription: Implement features described in claude4spec briefs (markdown files in .claude4spec/briefs/). Briefs are self-contained \u2014 they include all context needed for implementation (entity snapshots, section diffs, narrative). After implementation, if you discover drift between the brief and reality (missing details, incorrect assumptions, edge cases not covered), generate a patch file in .claude4spec/patches/ as feedback for the specification author. Use when implementing changes in a code repository that has a .claude4spec/briefs/ directory.\n---\n";
|
|
2
|
+
export declare const BRIEF_IMPLEMENTER_BODY = "# c4s-brief-implementer\n\nThis skill describes how to implement a release brief in **your code repository**\n(not the spec repo). A brief is a self-contained markdown file under\n`.claude4spec/briefs/` that captures everything you need to ship the change:\nentity snapshots, section diffs, narrative, acceptance criteria.\n\n**This skill does NOT assume the `c4s` CLI is installed.** Briefs are designed\nto be self-contained \u2014 you do not need to read the main specification or query\nthe entity database. If the brief references something you cannot find in its\nbody, treat that as drift and file a patch (step 4 below).\n\n## Workflow\n\n### 1. Discover\n\n```sh\nls .claude4spec/briefs/ # list available briefs\ncat .claude4spec/briefs/<slug>.md\n```\n\nIf `.claude4spec/` is not in your current directory, walk up the directory tree\nuntil you find it (similar to how git finds `.git/`).\n\n### 2. Read the brief as self-contained input\n\nEvery brief has YAML frontmatter:\n\n```yaml\n---\ntype: brief\nfrom_release: v0.1.16\nto_release: v0.1.17\ngenerator_version: brief-author@0.1\nimplemented: false\n---\n```\n\nThe body contains everything you need \u2014 entity snapshots, section diffs, the\nnarrative of what changes, and acceptance criteria. **Do not read the main\nspecification.** If the brief omits something, that is drift (see step 4).\n\n### 3. Implement\n\nStandard code flow in your target repository: read existing code, plan, edit,\ntest. Stay focused on what the brief specifies.\n\n### 4. Feedback loop (patches)\n\nWhen you discover that the brief diverges from reality \u2014 a missing detail, an\nincorrect assumption, an edge case not covered, or anything else the\nspec-author should know \u2014 write a patch file:\n\n```sh\nmkdir -p .claude4spec/patches\n```\n\nCreate `.claude4spec/patches/<brief-slug>-<short-desc>.md` with this format:\n\n```markdown\n---\ntype: patch\nbrief: v0-1-16-to-v0-1-17.md # path relative to briefs/\npatch_kind: drift # drift | missing | incorrect | clarification\ncreated_at: 2026-05-11T17:32:00Z\ncreated_by: claude-code # or \"cursor\", \"aider\", ...\n---\n\n# Patch \u2014 short title\n\n## What I found\n\n\u2026description of the drift / missing detail / incorrect assumption\u2026\n\n## Suggestion\n\n\u2026what the spec-author should consider in a follow-up brief or entity edits\u2026\n```\n\nPatch-kind values:\n\n- `drift` \u2014 the brief described behavior X, but the codebase already does Y.\n- `missing` \u2014 the brief is silent on a detail you had to decide yourself.\n- `incorrect` \u2014 the brief is factually wrong about existing code.\n- `clarification` \u2014 the brief is ambiguous; you guessed but it should be made\n explicit for next time.\n\nThe `.claude4spec/patches/` directory is created **lazily** \u2014 only when you\nfile your first patch. The claude4spec server does NOT create it.\n\n### 5. Mark brief as implemented\n\nWhen the implementation is genuinely finished \u2014 code committed, tests green,\nmerged to main / accepted by the user \u2014 flip the brief's frontmatter to\n`implemented: true`:\n\n```bash\n# Option A \u2014 Edit tool: change the line `implemented: false` \u2192 `implemented: true`.\n# Option B \u2014 yq (idempotent; adds the field to legacy briefs that never had it):\nyq -i '.implemented = true' .claude4spec/briefs/<brief-slug>.md\n```\n\n`implemented: true` is a **declaration**, not a computed fact derived from git.\nA revert on main does NOT roll the flag back. Set it ONLY when implementation\nis realistically done \u2014 never proactively or \"just in case\".\n\n### 6. Hand-off\n\nThe spec-author reads patches manually (`ls .claude4spec/patches/`, `cat`)\nand folds them into the next brief or entity edits. There is no UI listing in\nthis release \u2014 patches are raw markdown.\n\n## Notes\n\nThis file is **fully managed** by claude4spec \u2014 it is overwritten on every\nserver start when its rendered content changes. Do not edit it by hand.\n";
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
export const BRIEF_IMPLEMENTER_FRONTMATTER = `---
|
|
2
|
+
name: c4s-brief-implementer
|
|
3
|
+
description: Implement features described in claude4spec briefs (markdown files in .claude4spec/briefs/). Briefs are self-contained — they include all context needed for implementation (entity snapshots, section diffs, narrative). After implementation, if you discover drift between the brief and reality (missing details, incorrect assumptions, edge cases not covered), generate a patch file in .claude4spec/patches/ as feedback for the specification author. Use when implementing changes in a code repository that has a .claude4spec/briefs/ directory.
|
|
4
|
+
---
|
|
5
|
+
`;
|
|
6
|
+
export const BRIEF_IMPLEMENTER_BODY = `# c4s-brief-implementer
|
|
7
|
+
|
|
8
|
+
This skill describes how to implement a release brief in **your code repository**
|
|
9
|
+
(not the spec repo). A brief is a self-contained markdown file under
|
|
10
|
+
\`.claude4spec/briefs/\` that captures everything you need to ship the change:
|
|
11
|
+
entity snapshots, section diffs, narrative, acceptance criteria.
|
|
12
|
+
|
|
13
|
+
**This skill does NOT assume the \`c4s\` CLI is installed.** Briefs are designed
|
|
14
|
+
to be self-contained — you do not need to read the main specification or query
|
|
15
|
+
the entity database. If the brief references something you cannot find in its
|
|
16
|
+
body, treat that as drift and file a patch (step 4 below).
|
|
17
|
+
|
|
18
|
+
## Workflow
|
|
19
|
+
|
|
20
|
+
### 1. Discover
|
|
21
|
+
|
|
22
|
+
\`\`\`sh
|
|
23
|
+
ls .claude4spec/briefs/ # list available briefs
|
|
24
|
+
cat .claude4spec/briefs/<slug>.md
|
|
25
|
+
\`\`\`
|
|
26
|
+
|
|
27
|
+
If \`.claude4spec/\` is not in your current directory, walk up the directory tree
|
|
28
|
+
until you find it (similar to how git finds \`.git/\`).
|
|
29
|
+
|
|
30
|
+
### 2. Read the brief as self-contained input
|
|
31
|
+
|
|
32
|
+
Every brief has YAML frontmatter:
|
|
33
|
+
|
|
34
|
+
\`\`\`yaml
|
|
35
|
+
---
|
|
36
|
+
type: brief
|
|
37
|
+
from_release: v0.1.16
|
|
38
|
+
to_release: v0.1.17
|
|
39
|
+
generator_version: brief-author@0.1
|
|
40
|
+
implemented: false
|
|
41
|
+
---
|
|
42
|
+
\`\`\`
|
|
43
|
+
|
|
44
|
+
The body contains everything you need — entity snapshots, section diffs, the
|
|
45
|
+
narrative of what changes, and acceptance criteria. **Do not read the main
|
|
46
|
+
specification.** If the brief omits something, that is drift (see step 4).
|
|
47
|
+
|
|
48
|
+
### 3. Implement
|
|
49
|
+
|
|
50
|
+
Standard code flow in your target repository: read existing code, plan, edit,
|
|
51
|
+
test. Stay focused on what the brief specifies.
|
|
52
|
+
|
|
53
|
+
### 4. Feedback loop (patches)
|
|
54
|
+
|
|
55
|
+
When you discover that the brief diverges from reality — a missing detail, an
|
|
56
|
+
incorrect assumption, an edge case not covered, or anything else the
|
|
57
|
+
spec-author should know — write a patch file:
|
|
58
|
+
|
|
59
|
+
\`\`\`sh
|
|
60
|
+
mkdir -p .claude4spec/patches
|
|
61
|
+
\`\`\`
|
|
62
|
+
|
|
63
|
+
Create \`.claude4spec/patches/<brief-slug>-<short-desc>.md\` with this format:
|
|
64
|
+
|
|
65
|
+
\`\`\`markdown
|
|
66
|
+
---
|
|
67
|
+
type: patch
|
|
68
|
+
brief: v0-1-16-to-v0-1-17.md # path relative to briefs/
|
|
69
|
+
patch_kind: drift # drift | missing | incorrect | clarification
|
|
70
|
+
created_at: 2026-05-11T17:32:00Z
|
|
71
|
+
created_by: claude-code # or "cursor", "aider", ...
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
# Patch — short title
|
|
75
|
+
|
|
76
|
+
## What I found
|
|
77
|
+
|
|
78
|
+
…description of the drift / missing detail / incorrect assumption…
|
|
79
|
+
|
|
80
|
+
## Suggestion
|
|
81
|
+
|
|
82
|
+
…what the spec-author should consider in a follow-up brief or entity edits…
|
|
83
|
+
\`\`\`
|
|
84
|
+
|
|
85
|
+
Patch-kind values:
|
|
86
|
+
|
|
87
|
+
- \`drift\` — the brief described behavior X, but the codebase already does Y.
|
|
88
|
+
- \`missing\` — the brief is silent on a detail you had to decide yourself.
|
|
89
|
+
- \`incorrect\` — the brief is factually wrong about existing code.
|
|
90
|
+
- \`clarification\` — the brief is ambiguous; you guessed but it should be made
|
|
91
|
+
explicit for next time.
|
|
92
|
+
|
|
93
|
+
The \`.claude4spec/patches/\` directory is created **lazily** — only when you
|
|
94
|
+
file your first patch. The claude4spec server does NOT create it.
|
|
95
|
+
|
|
96
|
+
### 5. Mark brief as implemented
|
|
97
|
+
|
|
98
|
+
When the implementation is genuinely finished — code committed, tests green,
|
|
99
|
+
merged to main / accepted by the user — flip the brief's frontmatter to
|
|
100
|
+
\`implemented: true\`:
|
|
101
|
+
|
|
102
|
+
\`\`\`bash
|
|
103
|
+
# Option A — Edit tool: change the line \`implemented: false\` → \`implemented: true\`.
|
|
104
|
+
# Option B — yq (idempotent; adds the field to legacy briefs that never had it):
|
|
105
|
+
yq -i '.implemented = true' .claude4spec/briefs/<brief-slug>.md
|
|
106
|
+
\`\`\`
|
|
107
|
+
|
|
108
|
+
\`implemented: true\` is a **declaration**, not a computed fact derived from git.
|
|
109
|
+
A revert on main does NOT roll the flag back. Set it ONLY when implementation
|
|
110
|
+
is realistically done — never proactively or "just in case".
|
|
111
|
+
|
|
112
|
+
### 6. Hand-off
|
|
113
|
+
|
|
114
|
+
The spec-author reads patches manually (\`ls .claude4spec/patches/\`, \`cat\`)
|
|
115
|
+
and folds them into the next brief or entity edits. There is no UI listing in
|
|
116
|
+
this release — patches are raw markdown.
|
|
117
|
+
|
|
118
|
+
## Notes
|
|
119
|
+
|
|
120
|
+
This file is **fully managed** by claude4spec — it is overwritten on every
|
|
121
|
+
server start when its rendered content changes. Do not edit it by hand.
|
|
122
|
+
`;
|
|
123
|
+
//# sourceMappingURL=brief-implementer-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief-implementer-template.js","sourceRoot":"","sources":["../../../src/server/external-skills/brief-implementer-template.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,6BAA6B,GAAG;;;;CAI5C,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoHrC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { SPEC_READER_FRONTMATTER, SPEC_READER_BODY, } from './spec-reader-template.js';
|
|
5
|
+
import { BRIEF_IMPLEMENTER_FRONTMATTER, BRIEF_IMPLEMENTER_BODY, } from './brief-implementer-template.js';
|
|
6
|
+
export function renderSpecReaderSkill() {
|
|
7
|
+
return SPEC_READER_FRONTMATTER + '\n' + SPEC_READER_BODY;
|
|
8
|
+
}
|
|
9
|
+
export function renderBriefImplementerSkill() {
|
|
10
|
+
return BRIEF_IMPLEMENTER_FRONTMATTER + '\n' + BRIEF_IMPLEMENTER_BODY;
|
|
11
|
+
}
|
|
12
|
+
function sha256(buf) {
|
|
13
|
+
return createHash('sha256').update(buf).digest('hex');
|
|
14
|
+
}
|
|
15
|
+
function writeIfChanged(absPath, content) {
|
|
16
|
+
if (fs.existsSync(absPath)) {
|
|
17
|
+
const existing = fs.readFileSync(absPath);
|
|
18
|
+
if (sha256(existing) === sha256(content))
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
fs.mkdirSync(path.dirname(absPath), { recursive: true });
|
|
22
|
+
fs.writeFileSync(absPath, content, 'utf8');
|
|
23
|
+
}
|
|
24
|
+
function migrateLegacyAgentMd(cwd) {
|
|
25
|
+
const agentMd = path.join(cwd, '.claude4spec', 'AGENT.md');
|
|
26
|
+
const newSkill = path.join(cwd, '.claude4spec', 'skills', 'c4s-spec-reader', 'SKILL.md');
|
|
27
|
+
if (!fs.existsSync(agentMd))
|
|
28
|
+
return;
|
|
29
|
+
if (fs.existsSync(newSkill))
|
|
30
|
+
return;
|
|
31
|
+
const original = fs.readFileSync(agentMd, 'utf8');
|
|
32
|
+
const header = '<!-- DEPRECATED: this file was AGENT.md. It has been replaced by skills in\n' +
|
|
33
|
+
' .claude4spec/skills/c4s-spec-reader/SKILL.md (and c4s-brief-implementer).\n' +
|
|
34
|
+
' Safe to delete after your team has upgraded. -->\n\n';
|
|
35
|
+
fs.writeFileSync(agentMd + '.deprecated', header + original, 'utf8');
|
|
36
|
+
fs.unlinkSync(agentMd);
|
|
37
|
+
console.log('Migrated .claude4spec/AGENT.md → external-skills format (M22).');
|
|
38
|
+
}
|
|
39
|
+
export function ensureExternalSkills(cwd) {
|
|
40
|
+
migrateLegacyAgentMd(cwd);
|
|
41
|
+
const skillsRoot = path.join(cwd, '.claude4spec', 'skills');
|
|
42
|
+
const specReaderPath = path.join(skillsRoot, 'c4s-spec-reader', 'SKILL.md');
|
|
43
|
+
const briefImplementerPath = path.join(skillsRoot, 'c4s-brief-implementer', 'SKILL.md');
|
|
44
|
+
writeIfChanged(specReaderPath, renderSpecReaderSkill());
|
|
45
|
+
writeIfChanged(briefImplementerPath, renderBriefImplementerSkill());
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=external-skills-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-skills-service.js","sourceRoot":"","sources":["../../../src/server/external-skills/external-skills-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,UAAU,qBAAqB;IACnC,OAAO,uBAAuB,GAAG,IAAI,GAAG,gBAAgB,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO,6BAA6B,GAAG,IAAI,GAAG,sBAAsB,CAAC;AACvE,CAAC;AAED,SAAS,MAAM,CAAC,GAAoB;IAClC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,OAAe;IACtD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC;YAAE,OAAO;IACnD,CAAC;IACD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,GAAG,EACH,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,UAAU,CACX,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO;IACpC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IAEpC,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GACV,8EAA8E;QAC9E,kFAAkF;QAClF,2DAA2D,CAAC;IAC9D,EAAE,CAAC,aAAa,CAAC,OAAO,GAAG,aAAa,EAAE,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAC5E,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CACpC,UAAU,EACV,uBAAuB,EACvB,UAAU,CACX,CAAC;IAEF,cAAc,CAAC,cAAc,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACxD,cAAc,CAAC,oBAAoB,EAAE,2BAA2B,EAAE,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const SPEC_READER_FRONTMATTER = "---\nname: c4s-spec-reader\ndescription: Read claude4spec specification entities (endpoints, DTOs, tables, AC, UI views) referenced from markdown pages through XML tags like <inline_mention/>, <single_element/>, <tagged_list/>. Use when working in a repository whose pages/ contain these tags or whose .claude4spec/ directory exists. Resolves entity slugs to full data via c4s CLI or c4s-reader MCP server.\n---\n";
|
|
2
|
+
export declare const SPEC_READER_BODY = "# c4s-spec-reader\n\nThis repository contains a claude4spec specification. Pages (`*.md`) reference\nentities stored in `.claude4spec/db.sqlite` through XML tags. This skill teaches\nyou how to resolve them.\n\nAll commands below walk up from the agent's cwd to the nearest `.claude4spec/` \u2014\nno absolute paths are required.\n\n## Resolving a tag\n\nInstall `claude4spec` (Node 20+) and use the `c4s` CLI. Subcommand names match\nXML tag names 1:1.\n\n| XML tag | CLI equivalent |\n|---------|----------------|\n| `<inline_mention type=\"endpoint\" slug=\"X\"/>` | `c4s inline_mention --type endpoint --slug X` |\n| `<single_element type=\"dto\" slug=\"X\"/>` | `c4s single_element --type dto --slug X` |\n| `<element_list type=\"endpoint\" slugs=\"a,b,c\"/>` | `c4s element_list --type endpoint --slugs a,b,c` |\n| `<tagged_list type=\"dto\" tags=\"auth\" filter=\"and\"/>` | `c4s tagged_list --type dto --tags auth --filter and` |\n| `<tagged_list_mixed tags=\"public\"/>` | `c4s tagged_list_mixed --tags public` |\n\n## Expanding a whole page\n\n```sh\nc4s resolve some-page.md # writes markdown with tags expanded inline\nc4s resolve some-page.md --format json # writes { content, resolved: [...] }\n```\n\n## Discovery\n\n- `c4s catalog` \u2014 entity types, versions, and JSON Schema per view.\n- `c4s list-tags` \u2014 all tags with per-type counts.\n- `c4s list-slugs --type endpoint` \u2014 all slugs for a given type.\n\nAll output is JSON (pretty) by default. Use `--compact` for pipelines and\n`--format text` for terminal-friendly output. Errors go to stderr as JSON with\nan exit code > 0.\n\nThe database is opened **read-only** \u2014 `c4s` never mutates the project.\n";
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export const SPEC_READER_FRONTMATTER = `---
|
|
2
|
+
name: c4s-spec-reader
|
|
3
|
+
description: Read claude4spec specification entities (endpoints, DTOs, tables, AC, UI views) referenced from markdown pages through XML tags like <inline_mention/>, <single_element/>, <tagged_list/>. Use when working in a repository whose pages/ contain these tags or whose .claude4spec/ directory exists. Resolves entity slugs to full data via c4s CLI or c4s-reader MCP server.
|
|
4
|
+
---
|
|
5
|
+
`;
|
|
6
|
+
export const SPEC_READER_BODY = `# c4s-spec-reader
|
|
7
|
+
|
|
8
|
+
This repository contains a claude4spec specification. Pages (\`*.md\`) reference
|
|
9
|
+
entities stored in \`.claude4spec/db.sqlite\` through XML tags. This skill teaches
|
|
10
|
+
you how to resolve them.
|
|
11
|
+
|
|
12
|
+
All commands below walk up from the agent's cwd to the nearest \`.claude4spec/\` —
|
|
13
|
+
no absolute paths are required.
|
|
14
|
+
|
|
15
|
+
## Resolving a tag
|
|
16
|
+
|
|
17
|
+
Install \`claude4spec\` (Node 20+) and use the \`c4s\` CLI. Subcommand names match
|
|
18
|
+
XML tag names 1:1.
|
|
19
|
+
|
|
20
|
+
| XML tag | CLI equivalent |
|
|
21
|
+
|---------|----------------|
|
|
22
|
+
| \`<inline_mention type="endpoint" slug="X"/>\` | \`c4s inline_mention --type endpoint --slug X\` |
|
|
23
|
+
| \`<single_element type="dto" slug="X"/>\` | \`c4s single_element --type dto --slug X\` |
|
|
24
|
+
| \`<element_list type="endpoint" slugs="a,b,c"/>\` | \`c4s element_list --type endpoint --slugs a,b,c\` |
|
|
25
|
+
| \`<tagged_list type="dto" tags="auth" filter="and"/>\` | \`c4s tagged_list --type dto --tags auth --filter and\` |
|
|
26
|
+
| \`<tagged_list_mixed tags="public"/>\` | \`c4s tagged_list_mixed --tags public\` |
|
|
27
|
+
|
|
28
|
+
## Expanding a whole page
|
|
29
|
+
|
|
30
|
+
\`\`\`sh
|
|
31
|
+
c4s resolve some-page.md # writes markdown with tags expanded inline
|
|
32
|
+
c4s resolve some-page.md --format json # writes { content, resolved: [...] }
|
|
33
|
+
\`\`\`
|
|
34
|
+
|
|
35
|
+
## Discovery
|
|
36
|
+
|
|
37
|
+
- \`c4s catalog\` — entity types, versions, and JSON Schema per view.
|
|
38
|
+
- \`c4s list-tags\` — all tags with per-type counts.
|
|
39
|
+
- \`c4s list-slugs --type endpoint\` — all slugs for a given type.
|
|
40
|
+
|
|
41
|
+
All output is JSON (pretty) by default. Use \`--compact\` for pipelines and
|
|
42
|
+
\`--format text\` for terminal-friendly output. Errors go to stderr as JSON with
|
|
43
|
+
an exit code > 0.
|
|
44
|
+
|
|
45
|
+
The database is opened **read-only** — \`c4s\` never mutates the project.
|
|
46
|
+
`;
|
|
47
|
+
//# sourceMappingURL=spec-reader-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-reader-template.js","sourceRoot":"","sources":["../../../src/server/external-skills/spec-reader-template.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;CAItC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwC/B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { WsGateway } from '../ws/gateway.js';
|
|
2
|
+
type EventKind = 'add' | 'change' | 'unlink';
|
|
3
|
+
export type PagesWatcherCallback = (relPath: string, kind: EventKind) => void;
|
|
4
|
+
export declare class PagesWatcher {
|
|
5
|
+
private pagesRoot;
|
|
6
|
+
private gateway;
|
|
7
|
+
private watcher;
|
|
8
|
+
private suppressUntil;
|
|
9
|
+
private readonly SUPPRESS_WINDOW_MS;
|
|
10
|
+
private callbacks;
|
|
11
|
+
constructor(pagesRoot: string, gateway: WsGateway);
|
|
12
|
+
onChange(cb: PagesWatcherCallback): void;
|
|
13
|
+
start(): void;
|
|
14
|
+
/** Call before a programmatic write so the resulting chokidar event is suppressed. */
|
|
15
|
+
suppress(relPath: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Broadcast a server-origin change event for a programmatic write.
|
|
18
|
+
* Clients receive `page:changed { origin: 'server' }` and should silently reload
|
|
19
|
+
* without showing the "file changed externally" dialog.
|
|
20
|
+
* Does NOT fire the callback chain (callbacks are for external-origin indexing).
|
|
21
|
+
*/
|
|
22
|
+
emitServerWrite(relPath: string): void;
|
|
23
|
+
private emit;
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import chokidar from 'chokidar';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export class PagesWatcher {
|
|
4
|
+
pagesRoot;
|
|
5
|
+
gateway;
|
|
6
|
+
watcher = null;
|
|
7
|
+
suppressUntil = new Map();
|
|
8
|
+
SUPPRESS_WINDOW_MS = 350;
|
|
9
|
+
callbacks = [];
|
|
10
|
+
constructor(pagesRoot, gateway) {
|
|
11
|
+
this.pagesRoot = pagesRoot;
|
|
12
|
+
this.gateway = gateway;
|
|
13
|
+
}
|
|
14
|
+
onChange(cb) {
|
|
15
|
+
this.callbacks.push(cb);
|
|
16
|
+
}
|
|
17
|
+
start() {
|
|
18
|
+
this.watcher = chokidar.watch(this.pagesRoot, {
|
|
19
|
+
ignoreInitial: true,
|
|
20
|
+
ignored: (p) => /(^|\/|\\)\./.test(path.basename(p)),
|
|
21
|
+
awaitWriteFinish: { stabilityThreshold: 80, pollInterval: 20 },
|
|
22
|
+
});
|
|
23
|
+
this.watcher.on('add', (p) => this.emit('add', p));
|
|
24
|
+
this.watcher.on('change', (p) => this.emit('change', p));
|
|
25
|
+
this.watcher.on('unlink', (p) => this.emit('unlink', p));
|
|
26
|
+
}
|
|
27
|
+
/** Call before a programmatic write so the resulting chokidar event is suppressed. */
|
|
28
|
+
suppress(relPath) {
|
|
29
|
+
this.suppressUntil.set(relPath, Date.now() + this.SUPPRESS_WINDOW_MS);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Broadcast a server-origin change event for a programmatic write.
|
|
33
|
+
* Clients receive `page:changed { origin: 'server' }` and should silently reload
|
|
34
|
+
* without showing the "file changed externally" dialog.
|
|
35
|
+
* Does NOT fire the callback chain (callbacks are for external-origin indexing).
|
|
36
|
+
*/
|
|
37
|
+
emitServerWrite(relPath) {
|
|
38
|
+
this.gateway.broadcast({ kind: 'page:changed', event: 'change', path: relPath, origin: 'server' });
|
|
39
|
+
}
|
|
40
|
+
emit(kind, absPath) {
|
|
41
|
+
if (!absPath.endsWith('.md'))
|
|
42
|
+
return;
|
|
43
|
+
const relPath = path.relative(this.pagesRoot, absPath).replaceAll(path.sep, '/');
|
|
44
|
+
const suppressedUntil = this.suppressUntil.get(relPath);
|
|
45
|
+
if (suppressedUntil && Date.now() < suppressedUntil) {
|
|
46
|
+
this.suppressUntil.delete(relPath);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.gateway.broadcast({ kind: 'page:changed', event: kind, path: relPath, origin: 'external' });
|
|
50
|
+
for (const cb of this.callbacks) {
|
|
51
|
+
try {
|
|
52
|
+
cb(relPath, kind);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
console.error('[watcher] callback error:', err);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async close() {
|
|
60
|
+
await this.watcher?.close();
|
|
61
|
+
this.watcher = null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=watcher.js.map
|