@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,105 @@
|
|
|
1
|
+
---
|
|
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
|
+
# 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
|
+
archived: 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. Hand-off
|
|
97
|
+
|
|
98
|
+
The spec-author reads patches manually (`ls .claude4spec/patches/`, `cat`)
|
|
99
|
+
and folds them into the next brief or entity edits. There is no UI listing in
|
|
100
|
+
this release — patches are raw markdown.
|
|
101
|
+
|
|
102
|
+
## Notes
|
|
103
|
+
|
|
104
|
+
This file is **fully managed** by claude4spec — it is overwritten on every
|
|
105
|
+
server start when its rendered content changes. Do not edit it by hand.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
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
|
+
# 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
|
+
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.0.0] - 2026-05-13
|
|
9
|
+
|
|
10
|
+
Initial public release.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- `claude4spec` CLI — local-first editor for system specifications (markdown + SQLite).
|
|
14
|
+
- `c4s` CLI — read specification entities (endpoints, DTOs, tables, AC, UI views) by slug.
|
|
15
|
+
- `c4s-mcp` — MCP server for reading specification entities.
|
|
16
|
+
- React-based web editor with tiptap, chat overlay, and live page rendering.
|
|
17
|
+
- Skills `c4s-spec-reader` and `c4s-brief-implementer` for Claude Code integration.
|
|
18
|
+
- Acceptance Criteria entity and tooling.
|
|
19
|
+
- Briefs and patches workflow for spec-driven implementation.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Michael Tomala
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# claude4spec
|
|
2
|
+
|
|
3
|
+
Local-first spec editor — markdown + SQLite + AI agent.
|
|
4
|
+
|
|
5
|
+
`claude4spec` is a developer tool for writing and maintaining **system specifications** alongside your code. It runs entirely on your machine: a web-based editor (tiptap + React), a local SQLite database for structured entities (endpoints, DTOs, tables, acceptance criteria, UI views), and a built-in AI chat for spec authoring assistance.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
- **Specifications live with the code.** No external SaaS, no copy-paste between Notion and your repo.
|
|
10
|
+
- **Structured entities, not just markdown.** Endpoints, DTOs, and AC are first-class records you can reference, link, and query.
|
|
11
|
+
- **Briefs → implementation.** Specs can produce self-contained implementation briefs that an AI coding agent (Claude Code) can execute directly.
|
|
12
|
+
- **Open data.** Everything is markdown files + a SQLite file in your repo. No vendor lock-in.
|
|
13
|
+
|
|
14
|
+
## Install & run
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npx @inharness-ai/claude4spec
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
This launches the editor on `http://localhost:3000` and creates a `.claude4spec/` directory in the current working directory (database + config).
|
|
21
|
+
|
|
22
|
+
For a global install:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm i -g @inharness-ai/claude4spec
|
|
26
|
+
claude4spec
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## CLIs
|
|
30
|
+
|
|
31
|
+
| Command | Purpose |
|
|
32
|
+
|---------------|-------------------------------------------------------------------------|
|
|
33
|
+
| `claude4spec` | Launch the web editor. |
|
|
34
|
+
| `c4s` | Read specification entities from the terminal (`c4s endpoint <slug>`). |
|
|
35
|
+
| `c4s-mcp` | MCP server exposing specification entities to MCP-aware clients. |
|
|
36
|
+
|
|
37
|
+
## Claude Code integration
|
|
38
|
+
|
|
39
|
+
When used inside a Claude Code project, this package installs two skills:
|
|
40
|
+
|
|
41
|
+
- **`c4s-spec-reader`** — resolves XML entity tags (`<inline_mention/>`, `<single_element/>`, `<tagged_list/>`) in markdown pages into full entity data.
|
|
42
|
+
- **`c4s-brief-implementer`** — implements features described in self-contained briefs from `.claude4spec/briefs/`.
|
|
43
|
+
|
|
44
|
+
## Requirements
|
|
45
|
+
|
|
46
|
+
- Node.js >= 20
|
|
47
|
+
|
|
48
|
+
## License
|
|
49
|
+
|
|
50
|
+
MIT — see [LICENSE](./LICENSE).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const AGENT_MD_TEMPLATE = "# Integration guide for external AI agents\n\nThis directory contains a claude4spec specification. Pages (`*.md`) reference\nentities stored in `.claude4spec/db.sqlite` through XML tags.\n\n## Resolving a tag\n\nInstall `claude4spec` (Node 20+) and use the `c4s` CLI. Subcommand names\nmatch XML 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\n## MCP server (for MCP-aware agents)\n\nAgents that prefer typed MCP tools over shell-out (Claude Code, Cursor,\nWindsurf, ...) can register `c4s-reader` as an MCP server. Add to your\neditor's MCP config (`.mcp.json` for Claude Code, `~/.cursor/mcp.json` for\nCursor, ...):\n\n```json\n{\n \"mcpServers\": {\n \"c4s-reader\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"claude4spec\", \"c4s-mcp\", \"--project\", \"/path/to/this/project\"]\n }\n }\n}\n```\n\nOr, with a global install (`npm i -g claude4spec`):\n\n```json\n{\n \"mcpServers\": {\n \"c4s-reader\": {\n \"command\": \"c4s-mcp\",\n \"args\": [\"--project\", \"/path/to/this/project\"]\n }\n }\n}\n```\n\nThe server exposes 8 readonly tools: `get_entity`, `get_entities`,\n`find_by_tag`, `get_section`, `resolve_page`, `catalog`, `list_tags`,\n`list_slugs`. Each tool that returns serialized entities accepts a `view`\nparameter (`inline_mention`, `single_element`, `element_list_item`,\n`tagged_list_item`, `detail`). Like the CLI, the database is opened\n**read-only** \u2014 writes always go through the main `claude4spec` server.\n";
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export const AGENT_MD_TEMPLATE = `# Integration guide for external AI agents
|
|
2
|
+
|
|
3
|
+
This directory contains a claude4spec specification. Pages (\`*.md\`) reference
|
|
4
|
+
entities stored in \`.claude4spec/db.sqlite\` through XML tags.
|
|
5
|
+
|
|
6
|
+
## Resolving a tag
|
|
7
|
+
|
|
8
|
+
Install \`claude4spec\` (Node 20+) and use the \`c4s\` CLI. Subcommand names
|
|
9
|
+
match XML tag names 1:1.
|
|
10
|
+
|
|
11
|
+
| XML tag | CLI equivalent |
|
|
12
|
+
|---------|----------------|
|
|
13
|
+
| \`<inline_mention type="endpoint" slug="X"/>\` | \`c4s inline_mention --type endpoint --slug X\` |
|
|
14
|
+
| \`<single_element type="dto" slug="X"/>\` | \`c4s single_element --type dto --slug X\` |
|
|
15
|
+
| \`<element_list type="endpoint" slugs="a,b,c"/>\` | \`c4s element_list --type endpoint --slugs a,b,c\` |
|
|
16
|
+
| \`<tagged_list type="dto" tags="auth" filter="and"/>\` | \`c4s tagged_list --type dto --tags auth --filter and\` |
|
|
17
|
+
| \`<tagged_list_mixed tags="public"/>\` | \`c4s tagged_list_mixed --tags public\` |
|
|
18
|
+
|
|
19
|
+
## Expanding a whole page
|
|
20
|
+
|
|
21
|
+
\`\`\`sh
|
|
22
|
+
c4s resolve some-page.md # writes markdown with tags expanded inline
|
|
23
|
+
c4s resolve some-page.md --format json # writes { content, resolved: [...] }
|
|
24
|
+
\`\`\`
|
|
25
|
+
|
|
26
|
+
## Discovery
|
|
27
|
+
|
|
28
|
+
- \`c4s catalog\` — entity types, versions, and JSON Schema per view.
|
|
29
|
+
- \`c4s list-tags\` — all tags with per-type counts.
|
|
30
|
+
- \`c4s list-slugs --type endpoint\` — all slugs for a given type.
|
|
31
|
+
|
|
32
|
+
All output is JSON (pretty) by default. Use \`--compact\` for pipelines and
|
|
33
|
+
\`--format text\` for terminal-friendly output. Errors go to stderr as JSON with
|
|
34
|
+
an exit code > 0.
|
|
35
|
+
|
|
36
|
+
The database is opened **read-only** — \`c4s\` never mutates the project.
|
|
37
|
+
|
|
38
|
+
## MCP server (for MCP-aware agents)
|
|
39
|
+
|
|
40
|
+
Agents that prefer typed MCP tools over shell-out (Claude Code, Cursor,
|
|
41
|
+
Windsurf, ...) can register \`c4s-reader\` as an MCP server. Add to your
|
|
42
|
+
editor's MCP config (\`.mcp.json\` for Claude Code, \`~/.cursor/mcp.json\` for
|
|
43
|
+
Cursor, ...):
|
|
44
|
+
|
|
45
|
+
\`\`\`json
|
|
46
|
+
{
|
|
47
|
+
"mcpServers": {
|
|
48
|
+
"c4s-reader": {
|
|
49
|
+
"command": "npx",
|
|
50
|
+
"args": ["-y", "claude4spec", "c4s-mcp", "--project", "/path/to/this/project"]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
\`\`\`
|
|
55
|
+
|
|
56
|
+
Or, with a global install (\`npm i -g claude4spec\`):
|
|
57
|
+
|
|
58
|
+
\`\`\`json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"c4s-reader": {
|
|
62
|
+
"command": "c4s-mcp",
|
|
63
|
+
"args": ["--project", "/path/to/this/project"]
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
\`\`\`
|
|
68
|
+
|
|
69
|
+
The server exposes 8 readonly tools: \`get_entity\`, \`get_entities\`,
|
|
70
|
+
\`find_by_tag\`, \`get_section\`, \`resolve_page\`, \`catalog\`, \`list_tags\`,
|
|
71
|
+
\`list_slugs\`. Each tool that returns serialized entities accepts a \`view\`
|
|
72
|
+
parameter (\`inline_mention\`, \`single_element\`, \`element_list_item\`,
|
|
73
|
+
\`tagged_list_item\`, \`detail\`). Like the CLI, the database is opened
|
|
74
|
+
**read-only** — writes always go through the main \`claude4spec\` server.
|
|
75
|
+
`;
|
|
76
|
+
//# sourceMappingURL=agent-md-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-md-template.js","sourceRoot":"","sources":["../../src/bin/agent-md-template.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0EhC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const BOOTSTRAP_TEMPLATE = "# Welcome to claude4spec\n\nThis is your first page. Start writing your specification here.\n\n## Quick start\n\n- Press `/` to invoke slash commands (`/endpoint`, `/dto`, `/dbtable`, `/dep`, `/todo`, ...).\n- Open the chat on the right edge and ask the agent to scaffold entities for you.\n- Alt+click (option+click on macOS) any chip to edit its attributes.\n- Delete this page once you have your own entries.\n";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const BOOTSTRAP_TEMPLATE = `# Welcome to claude4spec
|
|
2
|
+
|
|
3
|
+
This is your first page. Start writing your specification here.
|
|
4
|
+
|
|
5
|
+
## Quick start
|
|
6
|
+
|
|
7
|
+
- Press \`/\` to invoke slash commands (\`/endpoint\`, \`/dto\`, \`/dbtable\`, \`/dep\`, \`/todo\`, ...).
|
|
8
|
+
- Open the chat on the right edge and ask the agent to scaffold entities for you.
|
|
9
|
+
- Alt+click (option+click on macOS) any chip to edit its attributes.
|
|
10
|
+
- Delete this page once you have your own entries.
|
|
11
|
+
`;
|
|
12
|
+
//# sourceMappingURL=bootstrap-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-template.js","sourceRoot":"","sources":["../../src/bin/bootstrap-template.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;CAUjC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ParsedArgs {
|
|
2
|
+
command: string | null;
|
|
3
|
+
positional: string[];
|
|
4
|
+
flags: Map<string, string | boolean>;
|
|
5
|
+
project?: string;
|
|
6
|
+
format: 'json' | 'text';
|
|
7
|
+
compact: boolean;
|
|
8
|
+
sortKeys: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
11
|
+
export declare function requireString(args: ParsedArgs, flag: string): string;
|
|
12
|
+
export declare function optionalString(args: ParsedArgs, flag: string): string | undefined;
|
|
13
|
+
export declare function requireStringList(args: ParsedArgs, flag: string): string[];
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { CliError } from './errors.js';
|
|
2
|
+
const KNOWN_BOOLEAN_FLAGS = new Set(['compact', 'sort-keys', 'help', 'version']);
|
|
3
|
+
export function parseArgs(argv) {
|
|
4
|
+
const result = {
|
|
5
|
+
command: null,
|
|
6
|
+
positional: [],
|
|
7
|
+
flags: new Map(),
|
|
8
|
+
format: 'json',
|
|
9
|
+
compact: false,
|
|
10
|
+
sortKeys: false,
|
|
11
|
+
};
|
|
12
|
+
let i = 0;
|
|
13
|
+
if (argv[0] && !argv[0].startsWith('-')) {
|
|
14
|
+
result.command = argv[0];
|
|
15
|
+
i = 1;
|
|
16
|
+
}
|
|
17
|
+
for (; i < argv.length; i++) {
|
|
18
|
+
const token = argv[i];
|
|
19
|
+
if (!token)
|
|
20
|
+
continue;
|
|
21
|
+
if (!token.startsWith('--')) {
|
|
22
|
+
result.positional.push(token);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const eqIdx = token.indexOf('=');
|
|
26
|
+
const name = eqIdx >= 0 ? token.slice(2, eqIdx) : token.slice(2);
|
|
27
|
+
let value;
|
|
28
|
+
if (eqIdx >= 0) {
|
|
29
|
+
value = token.slice(eqIdx + 1);
|
|
30
|
+
}
|
|
31
|
+
else if (KNOWN_BOOLEAN_FLAGS.has(name)) {
|
|
32
|
+
value = true;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const next = argv[i + 1];
|
|
36
|
+
if (next === undefined || next.startsWith('--')) {
|
|
37
|
+
value = true;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
value = next;
|
|
41
|
+
i++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
result.flags.set(name, value);
|
|
45
|
+
}
|
|
46
|
+
const format = result.flags.get('format');
|
|
47
|
+
if (typeof format === 'string') {
|
|
48
|
+
if (format !== 'json' && format !== 'text') {
|
|
49
|
+
throw new CliError('INVALID_ARGS', `--format must be 'json' or 'text', got '${format}'`);
|
|
50
|
+
}
|
|
51
|
+
result.format = format;
|
|
52
|
+
}
|
|
53
|
+
if (result.flags.get('compact') === true)
|
|
54
|
+
result.compact = true;
|
|
55
|
+
if (result.flags.get('sort-keys') === true)
|
|
56
|
+
result.sortKeys = true;
|
|
57
|
+
const project = result.flags.get('project');
|
|
58
|
+
if (typeof project === 'string')
|
|
59
|
+
result.project = project;
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
export function requireString(args, flag) {
|
|
63
|
+
const v = args.flags.get(flag);
|
|
64
|
+
if (typeof v !== 'string' || !v) {
|
|
65
|
+
throw new CliError('INVALID_ARGS', `--${flag} is required`);
|
|
66
|
+
}
|
|
67
|
+
return v;
|
|
68
|
+
}
|
|
69
|
+
export function optionalString(args, flag) {
|
|
70
|
+
const v = args.flags.get(flag);
|
|
71
|
+
if (typeof v === 'string' && v)
|
|
72
|
+
return v;
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
export function requireStringList(args, flag) {
|
|
76
|
+
const raw = requireString(args, flag);
|
|
77
|
+
return raw
|
|
78
|
+
.split(',')
|
|
79
|
+
.map((s) => s.trim())
|
|
80
|
+
.filter(Boolean);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/bin/c4s/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function withMeta(result) {
|
|
2
|
+
if (!result.fallback && !result.error)
|
|
3
|
+
return result.data;
|
|
4
|
+
if (typeof result.data === 'object' && result.data !== null) {
|
|
5
|
+
return {
|
|
6
|
+
...result.data,
|
|
7
|
+
...(result.fallback ? { _fallback: true } : {}),
|
|
8
|
+
...(result.error ? { _error: result.error } : {}),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
return result.data;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=_meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_meta.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/_meta.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,MAAuB;IAC9C,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAC1D,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC5D,OAAO;YACL,GAAI,MAAM,CAAC,IAAe;YAC1B,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { createContext } from '../context.js';
|
|
5
|
+
import { writeOutput } from '../output.js';
|
|
6
|
+
export function runCatalog(args) {
|
|
7
|
+
const ctx = createContext(args);
|
|
8
|
+
try {
|
|
9
|
+
const catalog = ctx.registry.catalog(ctx.reader, ctx.db);
|
|
10
|
+
writeOutput({ ...catalog, claude4spec: readPackageVersion() }, args);
|
|
11
|
+
}
|
|
12
|
+
finally {
|
|
13
|
+
ctx.close();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function readPackageVersion() {
|
|
17
|
+
try {
|
|
18
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
// dist/bin/c4s/commands → packageRoot, or src/bin/c4s/commands → packageRoot
|
|
20
|
+
const roots = [
|
|
21
|
+
path.resolve(here, '..', '..', '..', '..'),
|
|
22
|
+
path.resolve(here, '..', '..', '..'),
|
|
23
|
+
];
|
|
24
|
+
for (const root of roots) {
|
|
25
|
+
const pkgPath = path.join(root, 'package.json');
|
|
26
|
+
if (fs.existsSync(pkgPath)) {
|
|
27
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
28
|
+
if (pkg.version)
|
|
29
|
+
return pkg.version;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
/* ignore */
|
|
35
|
+
}
|
|
36
|
+
return 'unknown';
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACzD,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,6EAA6E;QAC7E,MAAM,KAAK,GAAG;YACZ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;SACrC,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAChD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;gBACjF,IAAI,GAAG,CAAC,OAAO;oBAAE,OAAO,GAAG,CAAC,OAAO,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { requireString } from '../args.js';
|
|
2
|
+
import { createContext } from '../context.js';
|
|
3
|
+
import { CliError } from '../errors.js';
|
|
4
|
+
import { writeOutput } from '../output.js';
|
|
5
|
+
import { normalizeEntityType } from '../type-validation.js';
|
|
6
|
+
import { withMeta } from './_meta.js';
|
|
7
|
+
export function runDetail(args) {
|
|
8
|
+
const type = normalizeEntityType(requireString(args, 'type'));
|
|
9
|
+
const slug = requireString(args, 'slug');
|
|
10
|
+
const ctx = createContext(args);
|
|
11
|
+
try {
|
|
12
|
+
const entity = ctx.reader.getEntity(type, slug);
|
|
13
|
+
if (!entity)
|
|
14
|
+
throw new CliError('ENTITY_NOT_FOUND', `${type}/${slug}`);
|
|
15
|
+
const result = ctx.registry.serializeEntity(type, 'detail', entity, ctx.reader);
|
|
16
|
+
writeOutput(withMeta(result), args);
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
ctx.close();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/detail.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,MAAM,IAAI,GAAG,mBAAmB,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAChF,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { requireString, requireStringList } from '../args.js';
|
|
2
|
+
import { createContext } from '../context.js';
|
|
3
|
+
import { CliError } from '../errors.js';
|
|
4
|
+
import { writeOutput } from '../output.js';
|
|
5
|
+
import { normalizeEntityType } from '../type-validation.js';
|
|
6
|
+
import { withMeta } from './_meta.js';
|
|
7
|
+
export function runElementList(args) {
|
|
8
|
+
const type = normalizeEntityType(requireString(args, 'type'));
|
|
9
|
+
const slugs = requireStringList(args, 'slugs');
|
|
10
|
+
const ctx = createContext(args);
|
|
11
|
+
try {
|
|
12
|
+
const { items: entities, missing } = ctx.reader.getEntities(type, slugs);
|
|
13
|
+
if (entities.length === 0) {
|
|
14
|
+
throw new CliError('ENTITY_NOT_FOUND', `no ${type} found for slugs: ${slugs.join(', ')}`);
|
|
15
|
+
}
|
|
16
|
+
const items = entities.map((entity) => withMeta(ctx.registry.serializeEntity(type, 'element_list_item', entity, ctx.reader)));
|
|
17
|
+
writeOutput({ items, missing }, args);
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
ctx.close();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=element-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-list.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/element-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,MAAM,IAAI,GAAG,mBAAmB,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,MAAM,IAAI,qBAAqB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClD,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACpC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CACtF,CAAC;QACF,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { requireString } from '../args.js';
|
|
2
|
+
import { createContext } from '../context.js';
|
|
3
|
+
import { CliError } from '../errors.js';
|
|
4
|
+
import { writeOutput } from '../output.js';
|
|
5
|
+
import { normalizeEntityType } from '../type-validation.js';
|
|
6
|
+
import { withMeta } from './_meta.js';
|
|
7
|
+
export function runInlineMention(args) {
|
|
8
|
+
const type = normalizeEntityType(requireString(args, 'type'));
|
|
9
|
+
const slug = requireString(args, 'slug');
|
|
10
|
+
const ctx = createContext(args);
|
|
11
|
+
try {
|
|
12
|
+
const entity = ctx.reader.getEntity(type, slug);
|
|
13
|
+
if (!entity)
|
|
14
|
+
throw new CliError('ENTITY_NOT_FOUND', `${type}/${slug}`);
|
|
15
|
+
const result = ctx.registry.serializeEntity(type, 'inline_mention', entity, ctx.reader);
|
|
16
|
+
writeOutput(withMeta(result), args);
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
ctx.close();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=inline-mention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-mention.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/inline-mention.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,MAAM,IAAI,GAAG,mBAAmB,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACxF,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
|