@contractspec/app.cli-contractspec 3.5.2 → 3.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +40 -0
- package/dist/bun/cli.js +5 -5
- package/dist/node/cli.js +5 -5
- package/package.json +15 -15
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,45 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.5.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- c585fb1: fix: mcp tooling naming
|
|
8
|
+
- Updated dependencies [c585fb1]
|
|
9
|
+
- Updated dependencies [f5d4816]
|
|
10
|
+
- @contractspec/lib.contracts-integrations@3.5.4
|
|
11
|
+
- @contractspec/lib.contracts-transformers@3.5.4
|
|
12
|
+
- @contractspec/lib.contracts-spec@3.5.4
|
|
13
|
+
- @contractspec/bundle.workspace@3.5.4
|
|
14
|
+
- @contractspec/lib.ai-providers@3.5.4
|
|
15
|
+
- @contractspec/module.workspace@3.5.4
|
|
16
|
+
- @contractspec/module.examples@3.5.4
|
|
17
|
+
- @contractspec/module.ai-chat@4.1.4
|
|
18
|
+
- @contractspec/lib.ai-agent@5.0.4
|
|
19
|
+
- @contractspec/lib.plugins@3.5.4
|
|
20
|
+
- @contractspec/lib.testing@3.5.4
|
|
21
|
+
- @contractspec/lib.schema@3.5.4
|
|
22
|
+
|
|
23
|
+
## 3.5.3
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- b0b4da6: fix: release
|
|
28
|
+
- Updated dependencies [b0b4da6]
|
|
29
|
+
- Updated dependencies [56ae36d]
|
|
30
|
+
- @contractspec/lib.contracts-integrations@3.5.3
|
|
31
|
+
- @contractspec/lib.contracts-transformers@3.5.3
|
|
32
|
+
- @contractspec/lib.contracts-spec@3.5.3
|
|
33
|
+
- @contractspec/bundle.workspace@3.5.3
|
|
34
|
+
- @contractspec/lib.ai-providers@3.5.3
|
|
35
|
+
- @contractspec/module.workspace@3.5.3
|
|
36
|
+
- @contractspec/module.examples@3.5.3
|
|
37
|
+
- @contractspec/module.ai-chat@4.1.3
|
|
38
|
+
- @contractspec/lib.ai-agent@5.0.3
|
|
39
|
+
- @contractspec/lib.plugins@3.5.3
|
|
40
|
+
- @contractspec/lib.testing@3.5.3
|
|
41
|
+
- @contractspec/lib.schema@3.5.3
|
|
42
|
+
|
|
3
43
|
## 3.5.2
|
|
4
44
|
|
|
5
45
|
### Patch Changes
|
package/dist/bun/cli.js
CHANGED
|
@@ -44872,7 +44872,7 @@ The result is a consistent docs surface across CLI, web, and MCP.
|
|
|
44872
44872
|
## Key surfaces
|
|
44873
44873
|
|
|
44874
44874
|
- Generation: \`docs.generate\`
|
|
44875
|
-
- Index/search: \`
|
|
44875
|
+
- Index/search: \`docs_search\`
|
|
44876
44876
|
- Contract reference: \`docs.contract.reference\`
|
|
44877
44877
|
- Publish: \`docs.publish\`
|
|
44878
44878
|
`},{id:"docs.tech.docs-generator",title:"Docs generator",summary:"Generate reference docs and metadata from ContractSpecs.",kind:"how",visibility:"public",route:"/docs/tech/docs/generator",tags:["docs","generator","cli"],body:`# Docs generator
|
|
@@ -44890,7 +44890,7 @@ The docs index is the canonical list of DocBlocks exposed to UI and MCP surfaces
|
|
|
44890
44890
|
|
|
44891
44891
|
## Query
|
|
44892
44892
|
|
|
44893
|
-
- Operation: \`
|
|
44893
|
+
- Operation: \`docs_search\`
|
|
44894
44894
|
- Filters: query, tag, kind, visibility
|
|
44895
44895
|
`},{id:"docs.tech.docs-reference",title:"Contract reference pages",summary:"Resolve any spec into a docs-ready reference payload.",kind:"reference",visibility:"public",route:"/docs/tech/docs/reference",tags:["docs","reference"],body:`# Contract reference
|
|
44896
44896
|
|
|
@@ -44912,7 +44912,7 @@ Examples are registered as ExampleSpecs and surface DocBlocks for discovery.
|
|
|
44912
44912
|
|
|
44913
44913
|
- Docs index tags should include \`examples\` to populate the catalog.
|
|
44914
44914
|
- Sandbox support is available under \`/sandbox\`.
|
|
44915
|
-
`}];gJ(CI4)});var Zd=d0(()=>{p_1();aE1();QC1();KC1();NC1();CC1()});var _I4,l_1;var i_1=d0(()=>{r9();RL();Zd();xY();wT();_I4=new Y8({name:"DocsGeneratedPayload",fields:{buildId:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!0},generatedAt:{type:t.DateTime(),isOptional:!1},outputDir:{type:t.String_unsecure(),isOptional:!0},artifactCount:{type:t.Int_unsecure(),isOptional:!0},warnings:{type:t.String_unsecure(),isOptional:!0,isArray:!0}}}),l_1=aX({meta:{key:"docs.generated",version:"1.0.0",description:"Emitted when documentation artifacts are generated.",domain:aO,owners:sO,tags:[...tO,"generation"],stability:eO,docId:[j7("docs.tech.docs-generator")]},payload:_I4})});var jI4,TI4,SI4,kI4;var ST6=d0(()=>{r9();l5();Zd();xY();wT();i_1();jI4=new Y8({name:"DocsArtifact",fields:{path:{type:t.String_unsecure(),isOptional:!1},format:{type:t.String_unsecure(),isOptional:!0},bytes:{type:t.Int_unsecure(),isOptional:!0},kind:{type:t.String_unsecure(),isOptional:!0}}}),TI4=new Y8({name:"DocsGenerateInput",fields:{workspaceRoot:{type:t.String_unsecure(),isOptional:!0},outputDir:{type:t.String_unsecure(),isOptional:!0},version:{type:t.String_unsecure(),isOptional:!0},formats:{type:t.String_unsecure(),isOptional:!0,isArray:!0},includeInternal:{type:t.Boolean(),isOptional:!0},includeExperimental:{type:t.Boolean(),isOptional:!0},contractFilter:{type:t.String_unsecure(),isOptional:!0},docblockFilter:{type:t.String_unsecure(),isOptional:!0},dryRun:{type:t.Boolean(),isOptional:!0}}}),SI4=new Y8({name:"DocsGenerateOutput",fields:{buildId:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!0},generatedAt:{type:t.DateTime(),isOptional:!1},outputDir:{type:t.String_unsecure(),isOptional:!0},artifacts:{type:jI4,isOptional:!0,isArray:!0},warnings:{type:t.String_unsecure(),isOptional:!0,isArray:!0}}}),kI4=JX({meta:{key:"docs.generate",title:"Generate Documentation",version:"1.0.0",description:"Generate documentation artifacts from ContractSpecs.",goal:"Produce up-to-date reference docs and guides from specs and DocBlocks.",context:"Used by CLI and CI to keep docs in sync with contract definitions.",domain:aO,owners:sO,tags:[...tO,"generation"],stability:eO,docId:[j7("docs.tech.docs-generator")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:TI4,output:SI4,errors:{OUTPUT_WRITE_FAILED:{description:"Failed to write generated docs output.",http:500,when:"The generator cannot persist artifacts to the output path."}}},policy:{auth:"admin",pii:[]},sideEffects:{emits:[{ref:l_1.meta,when:"Docs generation completes successfully."}]}})});var xI4,n_1;var r_1=d0(()=>{r9();RL();Zd();xY();wT();xI4=new Y8({name:"DocsPublishedPayload",fields:{publishId:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!0},environment:{type:t.String_unsecure(),isOptional:!0},url:{type:t.String_unsecure(),isOptional:!0},publishedAt:{type:t.DateTime(),isOptional:!1},status:{type:t.String_unsecure(),isOptional:!0},warnings:{type:t.String_unsecure(),isOptional:!0,isArray:!0}}}),n_1=aX({meta:{key:"docs.published",version:"1.0.0",description:"Emitted when documentation is published.",domain:aO,owners:sO,tags:[...tO,"publish"],stability:eO,docId:[j7("docs.tech.docs-publish")]},payload:xI4})});var vI4,bI4,yI4;var kT6=d0(()=>{r9();l5();Zd();xY();wT();r_1();vI4=new Y8({name:"DocsPublishInput",fields:{buildId:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!0},environment:{type:t.String_unsecure(),isOptional:!0},deployTarget:{type:t.String_unsecure(),isOptional:!0},artifactPath:{type:t.String_unsecure(),isOptional:!0},dryRun:{type:t.Boolean(),isOptional:!0},notes:{type:t.String_unsecure(),isOptional:!0}}}),bI4=new Y8({name:"DocsPublishOutput",fields:{publishId:{type:t.String_unsecure(),isOptional:!1},publishedAt:{type:t.DateTime(),isOptional:!1},url:{type:t.String_unsecure(),isOptional:!0},status:{type:t.String_unsecure(),isOptional:!0},warnings:{type:t.String_unsecure(),isOptional:!0,isArray:!0}}}),yI4=JX({meta:{key:"docs.publish",title:"Publish Documentation",version:"1.0.0",description:"Publish generated documentation artifacts.",goal:"Deploy docs to the public docs surface with consistent versioning.",context:"Used by release pipelines to push generated docs to hosting targets.",domain:aO,owners:sO,tags:[...tO,"publish"],stability:eO,docId:[j7("docs.tech.docs-publish")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:vI4,output:bI4,errors:{DEPLOY_FAILED:{description:"Failed to deploy documentation artifacts.",http:500,when:"The docs publish step fails to deploy to the target host."}}},policy:{auth:"admin",pii:[]},sideEffects:{emits:[{ref:n_1.meta,when:"Docs publish completes successfully."}]}})});var o_1=d0(()=>{ST6();kT6()});var xT6,fI4,hI4,AT0;var CL$=d0(()=>{r9();l5();Zd();xY();wT();xT6=new Y8({name:"DocSummary",fields:{id:{type:t.String_unsecure(),isOptional:!1},title:{type:t.String_unsecure(),isOptional:!1},summary:{type:t.String_unsecure(),isOptional:!0},route:{type:t.String_unsecure(),isOptional:!0},visibility:{type:t.String_unsecure(),isOptional:!0},kind:{type:t.String_unsecure(),isOptional:!0},version:{type:t.String_unsecure(),isOptional:!0},tags:{type:t.String_unsecure(),isOptional:!0,isArray:!0}}}),fI4=new Y8({name:"DocsIndexInput",fields:{query:{type:t.String_unsecure(),isOptional:!0},tag:{type:t.String_unsecure(),isOptional:!0,isArray:!0},visibility:{type:t.String_unsecure(),isOptional:!0},kind:{type:t.String_unsecure(),isOptional:!0},limit:{type:t.Int_unsecure(),isOptional:!0},offset:{type:t.Int_unsecure(),isOptional:!0}}}),hI4=new Y8({name:"DocsIndexOutput",fields:{items:{type:xT6,isOptional:!0,isArray:!0},docs:{type:xT6,isOptional:!1,isArray:!0},total:{type:t.Int_unsecure(),isOptional:!0},nextOffset:{type:t.Int_unsecure(),isOptional:!0}}}),AT0=I7({meta:{key:"docs.search",title:"Docs Index",version:"1.0.0",description:"Search and filter DocBlocks by query, tag, or visibility.",goal:"Provide a consistent index of documentation entries for UI and MCP.",context:"Used by docs surfaces to list and filter DocBlocks without coupling to storage.",domain:aO,owners:sO,tags:[...tO,"search","index"],stability:eO,docId:[j7("docs.tech.docs-search")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:fI4,output:hI4},policy:{auth:"anonymous",pii:[]}})});var gI4,mI4,uI4,_L$;var a_1=d0(()=>{r9();l5();Zd();xY();wT();gI4=new Y8({name:"ContractReferenceInput",fields:{key:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!0},type:{type:t.String_unsecure(),isOptional:!0},format:{type:t.String_unsecure(),isOptional:!0},includeSchema:{type:t.Boolean(),isOptional:!0}}}),mI4=new Y8({name:"ContractReference",fields:{key:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!1},type:{type:t.String_unsecure(),isOptional:!1},title:{type:t.String_unsecure(),isOptional:!0},description:{type:t.String_unsecure(),isOptional:!0},markdown:{type:t.String_unsecure(),isOptional:!0},route:{type:t.String_unsecure(),isOptional:!0},schema:{type:t.JSONObject(),isOptional:!0},policy:{type:t.JSONObject(),isOptional:!0},tags:{type:t.String_unsecure(),isOptional:!0,isArray:!0},owners:{type:t.String_unsecure(),isOptional:!0,isArray:!0},stability:{type:t.String_unsecure(),isOptional:!0}}}),uI4=new Y8({name:"ContractReferenceOutput",fields:{reference:{type:mI4,isOptional:!1}}}),_L$=I7({meta:{key:"docs.contract.reference",title:"Contract Reference",version:"1.0.0",description:"Resolve a contract into a documentation-ready reference.",goal:"Expose a canonical reference view for any ContractSpec surface.",context:"Used by docs generators and UI to render consistent reference pages.",domain:aO,owners:sO,tags:[...tO,"reference"],stability:eO,docId:[j7("docs.tech.docs-reference")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:gI4,output:uI4},policy:{auth:"anonymous",pii:[]}})});var s_1=d0(()=>{CL$();a_1()});var t_1=d0(()=>{i_1();r_1()});var NTX;var vT6=d0(()=>{vv();wT();NTX=hD({meta:{key:"docs.system",version:"1.0.0",kind:"ui",title:"Documentation System",description:"End-to-end docs generation, indexing, and presentation.",domain:aO,owners:sO,tags:[...tO,"system"],stability:eO},provides:[{surface:"operation",key:"docs.generate",version:"1.0.0",description:"Generate documentation artifacts."},{surface:"operation",key:"docs.publish",version:"1.0.0",description:"Publish documentation artifacts."},{surface:"operation",key:"docs.search",version:"1.0.0",description:"Index and search DocBlocks."},{surface:"operation",key:"docs.contract.reference",version:"1.0.0",description:"Resolve contract references for docs."},{surface:"event",key:"docs.generated",version:"1.0.0",description:"Docs generation completed."},{surface:"event",key:"docs.published",version:"1.0.0",description:"Docs publish completed."},{surface:"presentation",key:"docs.layout",version:"1.0.0",description:"Docs layout presentation."},{surface:"presentation",key:"docs.reference.page",version:"1.0.0",description:"Docs reference page presentation."}]})});var bT6=d0(()=>{vT6()});var dI4;var yT6=d0(()=>{ZT0();Zd();xY();wT();dI4=YZ({meta:{key:"docs.layout",title:"Docs Layout",version:"1.0.0",description:"Shared layout shell for documentation pages.",goal:"Provide consistent navigation, layout, and docs UI scaffolding.",context:"Used by web docs surfaces to render DocBlock-based content.",domain:aO,owners:sO,tags:[...tO,"layout"],stability:eO,docId:[j7("docs.tech.docs-system")]},capability:{key:"docs.system",version:"1.0.0"},source:{type:"component",framework:"react",componentKey:"docsLayout"},targets:["react"]})});var cI4;var fT6=d0(()=>{ZT0();Zd();xY();wT();cI4=YZ({meta:{key:"docs.reference.page",title:"Docs Reference Page",version:"1.0.0",description:"Reference page layout for contract documentation.",goal:"Render contract references with consistent metadata and formatting.",context:"Used by docs surfaces to present contract reference content and schemas.",domain:aO,owners:sO,tags:[...tO,"reference"],stability:eO,docId:[j7("docs.tech.docs-reference")]},capability:{key:"docs.system",version:"1.0.0"},source:{type:"component",framework:"react",componentKey:"docsReferencePage"},targets:["react","markdown"]})});var e_1=d0(()=>{yT6();fT6()});var pI4,lI4;var hT6=d0(()=>{r9();QT0();Zd();xY();wT();pI4=new Y8({name:"DocsSearchFormModel",fields:{query:{type:t.String_unsecure(),isOptional:!0},visibility:{type:t.String_unsecure(),isOptional:!0},kind:{type:t.String_unsecure(),isOptional:!0}}}),lI4=Y00({meta:{key:"docs.search.form",title:"Docs Search",version:"1.0.0",description:"Search form for documentation discovery.",domain:aO,owners:sO,tags:[...tO,"search"],stability:eO,docId:[j7("docs.tech.docs-search")]},model:pI4,fields:[{kind:"text",name:"query",labelI18n:"Search",placeholderI18n:"Search docs"},{kind:"select",name:"visibility",labelI18n:"Visibility",options:{kind:"static",options:[{labelI18n:"Public",value:"public"},{labelI18n:"Internal",value:"internal"},{labelI18n:"Mixed",value:"mixed"}]}},{kind:"select",name:"kind",labelI18n:"Kind",options:{kind:"static",options:[{labelI18n:"Goal",value:"goal"},{labelI18n:"How",value:"how"},{labelI18n:"Usage",value:"usage"},{labelI18n:"Reference",value:"reference"},{labelI18n:"FAQ",value:"faq"},{labelI18n:"Changelog",value:"changelog"}]}}],actions:[{key:"search",labelI18n:"Search"}],policy:{flags:[],pii:[]}})});var $j1=d0(()=>{hT6()});var iI4;var gT6=d0(()=>{Wz0();Zd();xY();wT();CL$();iI4=zE({meta:{key:"docs.index.view",title:"Docs Index",version:"1.0.0",description:"List and filter documentation entries.",domain:aO,owners:sO,tags:[...tO,"index"],stability:eO,entity:"docs",docId:[j7("docs.tech.docs-search")]},source:{primary:{key:AT0.meta.key,version:AT0.meta.version}},view:{kind:"list",fields:[{key:"id",label:"ID",dataPath:"id"},{key:"title",label:"Title",dataPath:"title"},{key:"summary",label:"Summary",dataPath:"summary"},{key:"route",label:"Route",dataPath:"route"},{key:"tags",label:"Tags",dataPath:"tags",format:"badge"},{key:"kind",label:"Kind",dataPath:"kind"},{key:"visibility",label:"Visibility",dataPath:"visibility"}],primaryField:"title",secondaryFields:["summary","route"],filters:[{key:"query",label:"Search",field:"query",type:"search"},{key:"visibility",label:"Visibility",field:"visibility",type:"enum",options:[{value:"public",label:"Public"},{value:"internal",label:"Internal"},{value:"mixed",label:"Mixed"}]},{key:"kind",label:"Kind",field:"kind",type:"enum",options:[{value:"goal",label:"Goal"},{value:"how",label:"How"},{value:"usage",label:"Usage"},{value:"reference",label:"Reference"},{value:"faq",label:"FAQ"},{value:"changelog",label:"Changelog"}]}]},policy:{flags:[],pii:[]}})});var nI4;var mT6=d0(()=>{Wz0();Zd();xY();wT();a_1();nI4=zE({meta:{key:"docs.contract.reference.view",title:"Contract Reference",version:"1.0.0",description:"Detail view for a single contract reference.",domain:aO,owners:sO,tags:[...tO,"reference"],stability:eO,entity:"contract-reference",docId:[j7("docs.tech.docs-reference")]},source:{primary:{key:_L$.meta.key,version:_L$.meta.version}},view:{kind:"detail",fields:[{key:"key",label:"Key",dataPath:"reference.key"},{key:"version",label:"Version",dataPath:"reference.version"},{key:"type",label:"Type",dataPath:"reference.type"},{key:"title",label:"Title",dataPath:"reference.title"},{key:"description",label:"Description",dataPath:"reference.description",format:"markdown"},{key:"tags",label:"Tags",dataPath:"reference.tags"},{key:"owners",label:"Owners",dataPath:"reference.owners"},{key:"stability",label:"Stability",dataPath:"reference.stability"}],primaryField:"title",secondaryFields:["description"]},policy:{flags:[],pii:[]}})});var rI4;var uT6=d0(()=>{Wz0();Zd();xY();wT();CL$();rI4=zE({meta:{key:"docs.examples.catalog.view",title:"Examples Catalog",version:"1.0.0",description:"Catalog view of ContractSpec examples and demos.",domain:aO,owners:sO,tags:[...tO,"examples"],stability:eO,entity:"docs-examples",docId:[j7("docs.tech.docs-examples")]},source:{primary:{key:AT0.meta.key,version:AT0.meta.version}},view:{kind:"grid",fields:[{key:"id",label:"ID",dataPath:"id"},{key:"title",label:"Title",dataPath:"title"},{key:"summary",label:"Summary",dataPath:"summary"},{key:"route",label:"Route",dataPath:"route"},{key:"tags",label:"Tags",dataPath:"tags",format:"badge"}],primaryField:"title",secondaryFields:["summary"],filters:[{key:"query",label:"Search",field:"query",type:"search"},{key:"tags",label:"Tags",field:"tag",type:"enum",options:[{value:"examples",label:"Examples"},{value:"templates",label:"Templates"},{value:"sandbox",label:"Sandbox"}]}]},policy:{flags:[],pii:[]}})});var Xj1=d0(()=>{gT6();mT6();uT6()});var dT6=d0(()=>{o_1();s_1();t_1();e_1();$j1();Xj1()});var ESX;var cT6=d0(()=>{td();wT();ESX=EU({meta:{key:"platform.docs",version:"1.0.0",title:"Documentation System",description:"Generate, publish, search, and reference contract documentation and DocBlocks",domain:aO,owners:sO,tags:[...tO],stability:eO},operations:[{key:"docs.generate",version:"1.0.0"},{key:"docs.publish",version:"1.0.0"},{key:"docs.search",version:"1.0.0"},{key:"docs.contract.reference",version:"1.0.0"}],events:[{key:"docs.generated",version:"1.0.0"},{key:"docs.published",version:"1.0.0"}],presentations:[{key:"docs.layout",version:"1.0.0"},{key:"docs.reference.page",version:"1.0.0"}],capabilities:{provides:[{key:"docs.system",version:"1.0.0"}]},dataViews:[{key:"docs.index.view",version:"1.0.0"},{key:"docs.contract.reference.view",version:"1.0.0"},{key:"docs.examples.catalog.view",version:"1.0.0"}],forms:[{key:"docs.search.form",version:"1.0.0"}]})});var oI4;var pT6=d0(()=>{xY();oI4=[{id:"docs.tech.contracts.presentations",title:"Presentations \u2014 Unified Descriptor & Transform Engine",summary:"How PresentationSpec and TransformEngine keep docs/renderers consistent.",visibility:"public",route:"/docs/tech/contracts/presentations",kind:"reference",tags:["presentations","docs","mcp"],body:`## Presentations V2 \u2014 Unified Descriptor & Transform Engine
|
|
44915
|
+
`}];gJ(CI4)});var Zd=d0(()=>{p_1();aE1();QC1();KC1();NC1();CC1()});var _I4,l_1;var i_1=d0(()=>{r9();RL();Zd();xY();wT();_I4=new Y8({name:"DocsGeneratedPayload",fields:{buildId:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!0},generatedAt:{type:t.DateTime(),isOptional:!1},outputDir:{type:t.String_unsecure(),isOptional:!0},artifactCount:{type:t.Int_unsecure(),isOptional:!0},warnings:{type:t.String_unsecure(),isOptional:!0,isArray:!0}}}),l_1=aX({meta:{key:"docs.generated",version:"1.0.0",description:"Emitted when documentation artifacts are generated.",domain:aO,owners:sO,tags:[...tO,"generation"],stability:eO,docId:[j7("docs.tech.docs-generator")]},payload:_I4})});var jI4,TI4,SI4,kI4;var ST6=d0(()=>{r9();l5();Zd();xY();wT();i_1();jI4=new Y8({name:"DocsArtifact",fields:{path:{type:t.String_unsecure(),isOptional:!1},format:{type:t.String_unsecure(),isOptional:!0},bytes:{type:t.Int_unsecure(),isOptional:!0},kind:{type:t.String_unsecure(),isOptional:!0}}}),TI4=new Y8({name:"DocsGenerateInput",fields:{workspaceRoot:{type:t.String_unsecure(),isOptional:!0},outputDir:{type:t.String_unsecure(),isOptional:!0},version:{type:t.String_unsecure(),isOptional:!0},formats:{type:t.String_unsecure(),isOptional:!0,isArray:!0},includeInternal:{type:t.Boolean(),isOptional:!0},includeExperimental:{type:t.Boolean(),isOptional:!0},contractFilter:{type:t.String_unsecure(),isOptional:!0},docblockFilter:{type:t.String_unsecure(),isOptional:!0},dryRun:{type:t.Boolean(),isOptional:!0}}}),SI4=new Y8({name:"DocsGenerateOutput",fields:{buildId:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!0},generatedAt:{type:t.DateTime(),isOptional:!1},outputDir:{type:t.String_unsecure(),isOptional:!0},artifacts:{type:jI4,isOptional:!0,isArray:!0},warnings:{type:t.String_unsecure(),isOptional:!0,isArray:!0}}}),kI4=JX({meta:{key:"docs.generate",title:"Generate Documentation",version:"1.0.0",description:"Generate documentation artifacts from ContractSpecs.",goal:"Produce up-to-date reference docs and guides from specs and DocBlocks.",context:"Used by CLI and CI to keep docs in sync with contract definitions.",domain:aO,owners:sO,tags:[...tO,"generation"],stability:eO,docId:[j7("docs.tech.docs-generator")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:TI4,output:SI4,errors:{OUTPUT_WRITE_FAILED:{description:"Failed to write generated docs output.",http:500,when:"The generator cannot persist artifacts to the output path."}}},policy:{auth:"admin",pii:[]},sideEffects:{emits:[{ref:l_1.meta,when:"Docs generation completes successfully."}]}})});var xI4,n_1;var r_1=d0(()=>{r9();RL();Zd();xY();wT();xI4=new Y8({name:"DocsPublishedPayload",fields:{publishId:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!0},environment:{type:t.String_unsecure(),isOptional:!0},url:{type:t.String_unsecure(),isOptional:!0},publishedAt:{type:t.DateTime(),isOptional:!1},status:{type:t.String_unsecure(),isOptional:!0},warnings:{type:t.String_unsecure(),isOptional:!0,isArray:!0}}}),n_1=aX({meta:{key:"docs.published",version:"1.0.0",description:"Emitted when documentation is published.",domain:aO,owners:sO,tags:[...tO,"publish"],stability:eO,docId:[j7("docs.tech.docs-publish")]},payload:xI4})});var vI4,bI4,yI4;var kT6=d0(()=>{r9();l5();Zd();xY();wT();r_1();vI4=new Y8({name:"DocsPublishInput",fields:{buildId:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!0},environment:{type:t.String_unsecure(),isOptional:!0},deployTarget:{type:t.String_unsecure(),isOptional:!0},artifactPath:{type:t.String_unsecure(),isOptional:!0},dryRun:{type:t.Boolean(),isOptional:!0},notes:{type:t.String_unsecure(),isOptional:!0}}}),bI4=new Y8({name:"DocsPublishOutput",fields:{publishId:{type:t.String_unsecure(),isOptional:!1},publishedAt:{type:t.DateTime(),isOptional:!1},url:{type:t.String_unsecure(),isOptional:!0},status:{type:t.String_unsecure(),isOptional:!0},warnings:{type:t.String_unsecure(),isOptional:!0,isArray:!0}}}),yI4=JX({meta:{key:"docs.publish",title:"Publish Documentation",version:"1.0.0",description:"Publish generated documentation artifacts.",goal:"Deploy docs to the public docs surface with consistent versioning.",context:"Used by release pipelines to push generated docs to hosting targets.",domain:aO,owners:sO,tags:[...tO,"publish"],stability:eO,docId:[j7("docs.tech.docs-publish")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:vI4,output:bI4,errors:{DEPLOY_FAILED:{description:"Failed to deploy documentation artifacts.",http:500,when:"The docs publish step fails to deploy to the target host."}}},policy:{auth:"admin",pii:[]},sideEffects:{emits:[{ref:n_1.meta,when:"Docs publish completes successfully."}]}})});var o_1=d0(()=>{ST6();kT6()});var xT6,fI4,hI4,AT0;var CL$=d0(()=>{r9();l5();Zd();xY();wT();xT6=new Y8({name:"DocSummary",fields:{id:{type:t.String_unsecure(),isOptional:!1},title:{type:t.String_unsecure(),isOptional:!1},summary:{type:t.String_unsecure(),isOptional:!0},route:{type:t.String_unsecure(),isOptional:!0},visibility:{type:t.String_unsecure(),isOptional:!0},kind:{type:t.String_unsecure(),isOptional:!0},version:{type:t.String_unsecure(),isOptional:!0},tags:{type:t.String_unsecure(),isOptional:!0,isArray:!0}}}),fI4=new Y8({name:"DocsIndexInput",fields:{query:{type:t.String_unsecure(),isOptional:!0},tag:{type:t.String_unsecure(),isOptional:!0,isArray:!0},visibility:{type:t.String_unsecure(),isOptional:!0},kind:{type:t.String_unsecure(),isOptional:!0},limit:{type:t.Int_unsecure(),isOptional:!0},offset:{type:t.Int_unsecure(),isOptional:!0}}}),hI4=new Y8({name:"DocsIndexOutput",fields:{items:{type:xT6,isOptional:!0,isArray:!0},docs:{type:xT6,isOptional:!1,isArray:!0},total:{type:t.Int_unsecure(),isOptional:!0},nextOffset:{type:t.Int_unsecure(),isOptional:!0}}}),AT0=I7({meta:{key:"docs_search",title:"Docs Index",version:"1.0.0",description:"Search and filter DocBlocks by query, tag, or visibility.",goal:"Provide a consistent index of documentation entries for UI and MCP.",context:"Used by docs surfaces to list and filter DocBlocks without coupling to storage.",domain:aO,owners:sO,tags:[...tO,"search","index"],stability:eO,docId:[j7("docs.tech.docs-search")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:fI4,output:hI4},policy:{auth:"anonymous",pii:[]}})});var gI4,mI4,uI4,_L$;var a_1=d0(()=>{r9();l5();Zd();xY();wT();gI4=new Y8({name:"ContractReferenceInput",fields:{key:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!0},type:{type:t.String_unsecure(),isOptional:!0},format:{type:t.String_unsecure(),isOptional:!0},includeSchema:{type:t.Boolean(),isOptional:!0}}}),mI4=new Y8({name:"ContractReference",fields:{key:{type:t.String_unsecure(),isOptional:!1},version:{type:t.String_unsecure(),isOptional:!1},type:{type:t.String_unsecure(),isOptional:!1},title:{type:t.String_unsecure(),isOptional:!0},description:{type:t.String_unsecure(),isOptional:!0},markdown:{type:t.String_unsecure(),isOptional:!0},route:{type:t.String_unsecure(),isOptional:!0},schema:{type:t.JSONObject(),isOptional:!0},policy:{type:t.JSONObject(),isOptional:!0},tags:{type:t.String_unsecure(),isOptional:!0,isArray:!0},owners:{type:t.String_unsecure(),isOptional:!0,isArray:!0},stability:{type:t.String_unsecure(),isOptional:!0}}}),uI4=new Y8({name:"ContractReferenceOutput",fields:{reference:{type:mI4,isOptional:!1}}}),_L$=I7({meta:{key:"docs.contract.reference",title:"Contract Reference",version:"1.0.0",description:"Resolve a contract into a documentation-ready reference.",goal:"Expose a canonical reference view for any ContractSpec surface.",context:"Used by docs generators and UI to render consistent reference pages.",domain:aO,owners:sO,tags:[...tO,"reference"],stability:eO,docId:[j7("docs.tech.docs-reference")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:gI4,output:uI4},policy:{auth:"anonymous",pii:[]}})});var s_1=d0(()=>{CL$();a_1()});var t_1=d0(()=>{i_1();r_1()});var NTX;var vT6=d0(()=>{vv();wT();NTX=hD({meta:{key:"docs.system",version:"1.0.0",kind:"ui",title:"Documentation System",description:"End-to-end docs generation, indexing, and presentation.",domain:aO,owners:sO,tags:[...tO,"system"],stability:eO},provides:[{surface:"operation",key:"docs.generate",version:"1.0.0",description:"Generate documentation artifacts."},{surface:"operation",key:"docs.publish",version:"1.0.0",description:"Publish documentation artifacts."},{surface:"operation",key:"docs_search",version:"1.0.0",description:"Index and search DocBlocks."},{surface:"operation",key:"docs.contract.reference",version:"1.0.0",description:"Resolve contract references for docs."},{surface:"event",key:"docs.generated",version:"1.0.0",description:"Docs generation completed."},{surface:"event",key:"docs.published",version:"1.0.0",description:"Docs publish completed."},{surface:"presentation",key:"docs.layout",version:"1.0.0",description:"Docs layout presentation."},{surface:"presentation",key:"docs.reference.page",version:"1.0.0",description:"Docs reference page presentation."}]})});var bT6=d0(()=>{vT6()});var dI4;var yT6=d0(()=>{ZT0();Zd();xY();wT();dI4=YZ({meta:{key:"docs.layout",title:"Docs Layout",version:"1.0.0",description:"Shared layout shell for documentation pages.",goal:"Provide consistent navigation, layout, and docs UI scaffolding.",context:"Used by web docs surfaces to render DocBlock-based content.",domain:aO,owners:sO,tags:[...tO,"layout"],stability:eO,docId:[j7("docs.tech.docs-system")]},capability:{key:"docs.system",version:"1.0.0"},source:{type:"component",framework:"react",componentKey:"docsLayout"},targets:["react"]})});var cI4;var fT6=d0(()=>{ZT0();Zd();xY();wT();cI4=YZ({meta:{key:"docs.reference.page",title:"Docs Reference Page",version:"1.0.0",description:"Reference page layout for contract documentation.",goal:"Render contract references with consistent metadata and formatting.",context:"Used by docs surfaces to present contract reference content and schemas.",domain:aO,owners:sO,tags:[...tO,"reference"],stability:eO,docId:[j7("docs.tech.docs-reference")]},capability:{key:"docs.system",version:"1.0.0"},source:{type:"component",framework:"react",componentKey:"docsReferencePage"},targets:["react","markdown"]})});var e_1=d0(()=>{yT6();fT6()});var pI4,lI4;var hT6=d0(()=>{r9();QT0();Zd();xY();wT();pI4=new Y8({name:"DocsSearchFormModel",fields:{query:{type:t.String_unsecure(),isOptional:!0},visibility:{type:t.String_unsecure(),isOptional:!0},kind:{type:t.String_unsecure(),isOptional:!0}}}),lI4=Y00({meta:{key:"docs_search.form",title:"Docs Search",version:"1.0.0",description:"Search form for documentation discovery.",domain:aO,owners:sO,tags:[...tO,"search"],stability:eO,docId:[j7("docs.tech.docs-search")]},model:pI4,fields:[{kind:"text",name:"query",labelI18n:"Search",placeholderI18n:"Search docs"},{kind:"select",name:"visibility",labelI18n:"Visibility",options:{kind:"static",options:[{labelI18n:"Public",value:"public"},{labelI18n:"Internal",value:"internal"},{labelI18n:"Mixed",value:"mixed"}]}},{kind:"select",name:"kind",labelI18n:"Kind",options:{kind:"static",options:[{labelI18n:"Goal",value:"goal"},{labelI18n:"How",value:"how"},{labelI18n:"Usage",value:"usage"},{labelI18n:"Reference",value:"reference"},{labelI18n:"FAQ",value:"faq"},{labelI18n:"Changelog",value:"changelog"}]}}],actions:[{key:"search",labelI18n:"Search"}],policy:{flags:[],pii:[]}})});var $j1=d0(()=>{hT6()});var iI4;var gT6=d0(()=>{Wz0();Zd();xY();wT();CL$();iI4=zE({meta:{key:"docs.index.view",title:"Docs Index",version:"1.0.0",description:"List and filter documentation entries.",domain:aO,owners:sO,tags:[...tO,"index"],stability:eO,entity:"docs",docId:[j7("docs.tech.docs-search")]},source:{primary:{key:AT0.meta.key,version:AT0.meta.version}},view:{kind:"list",fields:[{key:"id",label:"ID",dataPath:"id"},{key:"title",label:"Title",dataPath:"title"},{key:"summary",label:"Summary",dataPath:"summary"},{key:"route",label:"Route",dataPath:"route"},{key:"tags",label:"Tags",dataPath:"tags",format:"badge"},{key:"kind",label:"Kind",dataPath:"kind"},{key:"visibility",label:"Visibility",dataPath:"visibility"}],primaryField:"title",secondaryFields:["summary","route"],filters:[{key:"query",label:"Search",field:"query",type:"search"},{key:"visibility",label:"Visibility",field:"visibility",type:"enum",options:[{value:"public",label:"Public"},{value:"internal",label:"Internal"},{value:"mixed",label:"Mixed"}]},{key:"kind",label:"Kind",field:"kind",type:"enum",options:[{value:"goal",label:"Goal"},{value:"how",label:"How"},{value:"usage",label:"Usage"},{value:"reference",label:"Reference"},{value:"faq",label:"FAQ"},{value:"changelog",label:"Changelog"}]}]},policy:{flags:[],pii:[]}})});var nI4;var mT6=d0(()=>{Wz0();Zd();xY();wT();a_1();nI4=zE({meta:{key:"docs.contract.reference.view",title:"Contract Reference",version:"1.0.0",description:"Detail view for a single contract reference.",domain:aO,owners:sO,tags:[...tO,"reference"],stability:eO,entity:"contract-reference",docId:[j7("docs.tech.docs-reference")]},source:{primary:{key:_L$.meta.key,version:_L$.meta.version}},view:{kind:"detail",fields:[{key:"key",label:"Key",dataPath:"reference.key"},{key:"version",label:"Version",dataPath:"reference.version"},{key:"type",label:"Type",dataPath:"reference.type"},{key:"title",label:"Title",dataPath:"reference.title"},{key:"description",label:"Description",dataPath:"reference.description",format:"markdown"},{key:"tags",label:"Tags",dataPath:"reference.tags"},{key:"owners",label:"Owners",dataPath:"reference.owners"},{key:"stability",label:"Stability",dataPath:"reference.stability"}],primaryField:"title",secondaryFields:["description"]},policy:{flags:[],pii:[]}})});var rI4;var uT6=d0(()=>{Wz0();Zd();xY();wT();CL$();rI4=zE({meta:{key:"docs.examples.catalog.view",title:"Examples Catalog",version:"1.0.0",description:"Catalog view of ContractSpec examples and demos.",domain:aO,owners:sO,tags:[...tO,"examples"],stability:eO,entity:"docs-examples",docId:[j7("docs.tech.docs-examples")]},source:{primary:{key:AT0.meta.key,version:AT0.meta.version}},view:{kind:"grid",fields:[{key:"id",label:"ID",dataPath:"id"},{key:"title",label:"Title",dataPath:"title"},{key:"summary",label:"Summary",dataPath:"summary"},{key:"route",label:"Route",dataPath:"route"},{key:"tags",label:"Tags",dataPath:"tags",format:"badge"}],primaryField:"title",secondaryFields:["summary"],filters:[{key:"query",label:"Search",field:"query",type:"search"},{key:"tags",label:"Tags",field:"tag",type:"enum",options:[{value:"examples",label:"Examples"},{value:"templates",label:"Templates"},{value:"sandbox",label:"Sandbox"}]}]},policy:{flags:[],pii:[]}})});var Xj1=d0(()=>{gT6();mT6();uT6()});var dT6=d0(()=>{o_1();s_1();t_1();e_1();$j1();Xj1()});var ESX;var cT6=d0(()=>{td();wT();ESX=EU({meta:{key:"platform.docs",version:"1.0.0",title:"Documentation System",description:"Generate, publish, search, and reference contract documentation and DocBlocks",domain:aO,owners:sO,tags:[...tO],stability:eO},operations:[{key:"docs.generate",version:"1.0.0"},{key:"docs.publish",version:"1.0.0"},{key:"docs_search",version:"1.0.0"},{key:"docs.contract.reference",version:"1.0.0"}],events:[{key:"docs.generated",version:"1.0.0"},{key:"docs.published",version:"1.0.0"}],presentations:[{key:"docs.layout",version:"1.0.0"},{key:"docs.reference.page",version:"1.0.0"}],capabilities:{provides:[{key:"docs.system",version:"1.0.0"}]},dataViews:[{key:"docs.index.view",version:"1.0.0"},{key:"docs.contract.reference.view",version:"1.0.0"},{key:"docs.examples.catalog.view",version:"1.0.0"}],forms:[{key:"docs_search.form",version:"1.0.0"}]})});var oI4;var pT6=d0(()=>{xY();oI4=[{id:"docs.tech.contracts.presentations",title:"Presentations \u2014 Unified Descriptor & Transform Engine",summary:"How PresentationSpec and TransformEngine keep docs/renderers consistent.",visibility:"public",route:"/docs/tech/contracts/presentations",kind:"reference",tags:["presentations","docs","mcp"],body:`## Presentations V2 \u2014 Unified Descriptor & Transform Engine
|
|
44916
44916
|
|
|
44917
44917
|
### Purpose
|
|
44918
44918
|
|
|
@@ -45674,7 +45674,7 @@ The Next.js proxy/middleware is used for **redirect decisions only**. It must no
|
|
|
45674
45674
|
- \`getCookieCache(request)\`
|
|
45675
45675
|
|
|
45676
45676
|
These checks are intentionally optimistic and should only gate routing. Full authorization must still be enforced on server-side actions/routes and GraphQL resolvers.
|
|
45677
|
-
`}];gJ($N4)});var XN4;var aT6=d0(()=>{xY();XN4=[{id:"docs.tech.schema.README",title:"Multi\u2011File Prisma Schema Conventions (per database)",summary:"We adopt Prisma multi\u2011file schema (GA \u2265 v6.7) to organize each database\u2019s models by domain and to import core LSSM module schemas locally.",kind:"reference",visibility:"public",route:"/docs/tech/schema/README",tags:["tech","schema","README"],body:'# Multi\u2011File Prisma Schema Conventions (per database)\n\nWe adopt Prisma multi\u2011file schema (GA \u2265 v6.7) to organize each database\u2019s models by domain and to import core LSSM module schemas locally.\n\nCanonical layout per DB:\n\n```\nprisma/\n schema/\n main.prisma # datasource + generators only\n imported/\n lssm_sigil/*.prisma # imported models/enums only (no datasource/generator)\n lssm_content/*.prisma # idem\n <domain>/*.prisma # vertical\u2011specific models split by bounded context\n```\n\nNotes:\n\n- Imported files contain only `model` and `enum` blocks (strip `datasource`/`generator`).\n- Preserve `@@schema("\u2026")` annotations to keep tables in their Postgres schemas; we now explicitly list schemas in `main.prisma` to avoid P1012: `schemas = ["public","lssm_sigil","lssm_content","lssm_featureflags","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`.\n- Use `@contractspec/app.cli-database` CLI: `database import|check|generate|migrate:*|seed` to manage a single DB; `@contractspec/app.cli-databases` orchestrates multiple DBs.\n\n## Typed merger config\n\n- Define imported module list once per DB with a typed config:\n\n```ts\n// prisma-merger.config.ts\nimport { defineMergedPrismaConfig } from \'@contractspec/app.cli-database\';\n\nexport default defineMergedPrismaConfig({\n modules: [\n \'@contractspec/app.cli-database-sigil\',\n \'@contractspec/app.cli-database-content\',\n // ...\n ],\n});\n```\n\n- Then run `database import --target .` (no need to pass `--modules`).\n\n## Prisma Config (prisma.config.ts)\n\nWe use Prisma Config per official docs to point Prisma to the multi-file schema folder and migrations:\n\n```ts\n// prisma.config.ts\nimport path from \'node:path\';\nimport { defineConfig } from \'prisma/config\';\n\nexport default defineConfig({\n schema: path.join(\'prisma\', \'schema\'),\n migrations: { path: path.join(\'prisma\', \'migrations\') },\n});\n```\n\nReference: Prisma blog \u2013 Organize Your Prisma Schema into Multiple Files: https://www.prisma.io/blog/organize-your-prisma-schema-with-multi-file-support\n\n---\n\n# LSSM Auth (Sigil) \u2013 Models & Integration\n\nThis document tracks the identity models and integration points used by the LSSM Sigil module.\n\n## Models (Prisma `lssm_sigil`)\n\n- `User` \u2013 core identity with email, optional phone, role, passkeys, apiKeys\n- `Session` \u2013 session tokens and metadata; includes `activeOrganizationId`\n- `Account` \u2013 external providers (password, OAuth)\n- `Organization` \u2013 tenant boundary; includes `type` additional field\n- `Member`, `Invitation`, `Team`, `TeamMember` \u2013 org/teams\n- `Role`, `Permission`, `PolicyBinding` \u2013 RBAC\n- `ApiKey`, `Passkey` \u2013 programmable access and WebAuthn\n- `SsoProvider` \u2013 OIDC/SAML provider configuration (org- or user-scoped)\n- `OAuthApplication`, `OAuthAccessToken`, `OAuthConsent` \u2013 first/third-party OAuth\n\nThese mirror STRIT additions so Better Auth advanced plugins (admin, organization, apiKey, passkey, genericOAuth) work uniformly across apps.\n\n## Better Auth (server)\n\nEnabled methods:\n\n- Email & password\n- Phone OTP (Telnyx)\n- Passkey (WebAuthn)\n- API keys\n- Organizations & Teams\n- Generic OAuth (FranceConnect+ via OIDC with JWE/JWS using JOSE)\n\nServer config lives at `packages/lssm/modules/sigil/src/application/services/auth.ts`.\n\n## Clients (Expo / React)\n\nClient config lives at `packages/lssm/modules/sigil/src/presentation/providers/auth/expo.ts` with plugins for admin, passkey, apiKey, organization, phone, genericOAuth.\n\n## Environment Variables\n\nTelnyx (phone OTP):\n\n- `TELNYX_API_KEY`\n- `TELNYX_MESSAGING_PROFILE_ID`\n- `TELNYX_FROM_NUMBER`\n\nFranceConnect+ (prefer LSSM*\u2026 but STRIT*\u2026 fallbacks are supported):\n\n- `LSSM_FRANCECONNECTPLUS_DISCOVERY_URL`\n- `LSSM_FRANCECONNECTPLUS_CLIENT_ID`\n- `LSSM_FRANCECONNECTPLUS_CLIENT_SECRET`\n- `LSSM_FRANCECONNECTPLUS_ENC_PRIVATE_KEY_PEM` (PKCS8; RSA-OAEP-256)\n\nGeneric:\n\n- `API_URL_IDENTITIES` \u2013 base URL for Better Auth server\n- `BETTER_AUTH_SECRET` \u2013 server secret\n\nKeep this in sync with code changes to avoid drift.\n\n## HCircle domain splits and auth removal\n\n- Auth/identity models are not defined locally anymore. They come from `@contractspec/app.cli-database-sigil` under the `lssm_sigil` schema.\n- `packages/hcircle/libs/database-coliving/prisma/schema/domain/` is split by domain; newsletter/waiting list lives in `newsletter.prisma` and uses `@@map("waiting_list")`.\n- To avoid collisions with module names, the local event models were renamed to `SocialEvent`, `SocialEventAttendee`, and `SocialEventRecurrence` with `@@map` pointing to existing table names.\n\n---\n\n## Vertical profiles (current)\n\n### STRIT\n\n- prisma-merger modules:\n - `@contractspec/app.cli-database-sigil`, `@contractspec/app.cli-database-content`, `@contractspec/app.cli-database-ops`, `@contractspec/app.cli-database-planning`, `@contractspec/app.cli-database-quill`, `@contractspec/app.cli-database-geoterro`\n- main.prisma schemas:\n - `schemas = ["public","lssm_sigil","lssm_content","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`\n- domain splits (`packages/strit/libs/database/prisma/schema/domain/`):\n - `bookings.prisma` (Booking, StritDocument + links to Content `File` and Sigil `Organization`)\n - `commerce.prisma` (Wholesale models; `sellerId` linked to Sigil `Organization`)\n - `files.prisma` (PublicFile, PublicFileAccessLog; `ownerId`\u2192Organization, `uploadedBy`\u2192User)\n - `geo.prisma` (PublicCountry, PublicAddress, City; links to Spots/Series)\n - `spots.prisma`, `urbanism.prisma`, `analytics.prisma`, `onboarding.prisma`, `referrals.prisma`, `subscriptions.prisma`, `content.prisma`\n- auth models are imported from Sigil (no local auth tables).\n- Back-relations for `Organization` (e.g., `files`, seller relations) are declared in the Sigil module to avoid scattering.\n\n### ARTISANOS\n\n- prisma-merger modules:\n - `@contractspec/app.cli-database-sigil`, `@contractspec/app.cli-database-content`, `@contractspec/app.cli-database-featureflags`, `@contractspec/app.cli-database-ops`, `@contractspec/app.cli-database-planning`, `@contractspec/app.cli-database-quill`, `@contractspec/app.cli-database-geoterro`\n- main.prisma schemas:\n - `schemas = ["public","lssm_sigil","lssm_content","lssm_featureflags","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`\n- domain splits (`packages/artisanos/libs/database-artisan/prisma/schema/domain/`):\n - `sales.prisma` (Client, Quote, QuoteTemplate, Invoice, FollowUps)\n - `subsidies.prisma` (SubsidyProgram, AidApplication, SupportingDocument)\n - `projects.prisma` (Project, ProjectPlanningSettings)\n - `crm.prisma` (OrganizationProfessionalProfile, OrganizationCertification)\n - `professions.prisma`, `products.prisma`, `templates.prisma`, `analytics.prisma`, `onboarding.prisma`, `referrals.prisma`, `subscriptions.prisma`, `files.prisma`\n- auth/organization/team models are provided by Sigil; local legacy copies were removed.\n- Where names collide with Content, local models are prefixed (e.g., `PublicFile`) and use `@@map` to keep existing table names where applicable.\n\n## Schema Dictionary: `@contractspec/lib.schema`\n\n### Purpose\n\nDescribe operation I/O once and generate:\n\n- zod (runtime validation)\n- GraphQL (Pothos types/refs)\n- JSON Schema (via `zod-to-json-schema` or native descriptors)\n\n### Primitives\n\n- **FieldType<T>**: describes a scalar or composite field and carries:\n - `zod` schema for validation\n - optional JSON Schema descriptor\n - optional GraphQL scalar reference/name\n- **SchemaModel**: named object model composed of fields. Exposes helpers:\n - `getZod(): z.ZodObject<ZodShapeFromFields<Fields>> | z.ZodArray<z.ZodObject<...>>`\n - Preserves each field\'s schema, optionality, and array-ness\n - Top-level lists are supported via `config.isArray: true`\n - `getJsonSchema(): JSONSchema7` (export for docs, MCP, forms)\n - `getPothosInput()` (GraphQL input object name)\n\n### Multi-Format Wrappers\n\nUse existing schema definitions from other libraries:\n- `ZodSchemaType`: Wraps a raw Zod schema (`z.infer` becomes the TS type).\n- `JsonSchemaType`: Wraps a JSON Schema object.\n- `GraphQLSchemaType`: Wraps a GraphQL SDL string.\n\n### Conventions\n\n- Name models with PascalCase; suffix with `Input`/`Result` when ambiguous.\n- Use explicit enums for multi-value constants; reuse the same enum across input/output.\n- Define domain enums via `defineEnum(\'Name\', [...])` in the relevant domain package (e.g., `packages/strit/libs/contracts-strit/src/enums/`), not in `ScalarTypeEnum`.\n- Reference those enums in `SchemaModel` fields directly (they expose `getZod`, `getPothos`, `getJsonSchema`).\n\n#### Example (STRIT)\n\n```ts\n// packages/strit/libs/contracts-strit/src/enums/recurrence.ts\nimport { defineEnum } from \'@contractspec/lib.schema\';\nexport const SpotEnum = {\n Weekday: () =>\n defineEnum(\'Weekday\', [\'MO\', \'TU\', \'WE\', \'TH\', \'FR\', \'SA\', \'SU\'] as const),\n RecurrenceFrequency: () =>\n defineEnum(\'RecurrenceFrequency\', [\n \'DAILY\',\n \'WEEKLY\',\n \'MONTHLY\',\n \'YEARLY\',\n ] as const),\n} as const;\n```\n\n```ts\n// usage in contracts\nfrequency: { type: SpotEnum.RecurrenceFrequency(), isOptional: false },\nbyWeekday: { type: SpotEnum.Weekday(), isOptional: true, isArray: true },\n```\n\n- Use `Date` type for temporal values and ensure ISO strings in JSON transports where needed.\n\n### Mapping rules (summary)\n\n- Strings \u2192 GraphQL `String`\n- Numbers \u2192 `Int` if safe 32-bit integer else `Float`\n- Booleans \u2192 `Boolean`\n- Dates \u2192 custom `Date` scalar\n- Arrays<T> \u2192 list of mapped T (set `isArray: true` on the field)\n- Top-level arrays \u2192 set `isArray: true` on the model config\n- Objects \u2192 input/output object types with stable field order\n- Unions \u2192 supported for output; input unions map to JSON (structural input is not supported by GraphQL)\n\n### JSON Schema export\n\nPrefer `getZod()` + `zod-to-json-schema` for consistency. For advanced cases, provide a custom `getJsonSchema()` on the model.\n\n### Example\n\n```ts\nimport { ScalarTypeEnum, SchemaModel } from \'@contractspec/lib.schema\';\n\n// Nested model\nconst Weekday = new SchemaModel({\n name: \'Weekday\',\n fields: {\n value: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n },\n});\n\n// Parent model with array field and nested object\nconst Rule = new SchemaModel({\n name: \'Rule\',\n fields: {\n timezone: { type: ScalarTypeEnum.TimeZone(), isOptional: false },\n byWeekday: { type: Weekday, isOptional: true, isArray: true },\n },\n});\n\nconst CreateThingInput = new SchemaModel({\n name: \'CreateThingInput\',\n fields: {\n name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n rule: { type: Rule, isOptional: false },\n },\n});\n\n// zod\nconst z = CreateThingInput.getZod();\n```\n'}];gJ(XN4)});var YN4;var sT6=d0(()=>{xY();YN4=[{id:"docs.tech.workflows.overview",title:"WorkflowSpec Overview",summary:"WorkflowSpec provides a declarative, versioned format for long-running flows that mix automation and human review, including runtime adapter capabilities/ports for checkpointing and suspend-resume orchestration. Specs stay inside `@contractspec/lib.contracts-spec` (`src/workflow/spec.ts`) so the same definition powers runtime execution, documentation, and future generation.",kind:"reference",visibility:"public",route:"/docs/tech/workflows/overview",tags:["tech","workflows","overview"],body:"# WorkflowSpec Overview\n\n## Purpose\n\nWorkflowSpec provides a declarative, versioned format for long-running flows that mix automation and human review. Specs stay inside `@contractspec/lib.contracts-spec` (`src/workflow/spec.ts`) so the same definition powers runtime execution, documentation, and future generation.\n\n## Core Types\n\n- `WorkflowMeta`: ownership metadata (`title`, `domain`, `owners`, `tags`, `stability`) plus `name` and `version`.\n- `WorkflowDefinition`:\n - `entryStepId?`: optional explicit entry point (defaults to first step).\n - `steps[]`: ordered list of `Step` descriptors.\n - `transitions[]`: directed edges between steps with optional expressions.\n - `sla?`: aggregated timing hints for the overall flow or per-step budgets.\n - `compensation?`: fallback operations executed when a workflow is rolled back or fails.\n- `Step`:\n - `type`: `human`, `automation`, or `decision`.\n - `action`: references either a `ContractSpec` (`operation`) or `FormSpec` (`form`).\n - Optional `guard`, `timeoutMs`, and retry policy (`maxAttempts`, `backoff`, `delayMs`, `maxDelayMs?`).\n - `requiredIntegrations?`: integration slot ids that must be bound before the step may execute.\n - `requiredCapabilities?`: `CapabilityRef[]` that must be enabled in the resolved app config.\n- `Transition`: `from` \u2192 `to` with optional `condition` string (simple data expressions).\n\n## Registry & Validation\n\n- `WorkflowRegistry` (`src/workflow/spec.ts`) stores specs by key `<name>.v<version>` and exposes `register`, `list`, and `get`.\n- `validateWorkflowSpec()` (`src/workflow/validation.ts`) checks:\n - Duplicate step IDs.\n - Unknown `from`/`to` transitions.\n - Empty guards/conditions.\n - Reachability from the entry step.\n - Cycles in the graph.\n - Operation/Form references against provided registries.\n- `assertWorkflowSpecValid()` wraps validation and throws `WorkflowValidationError` when errors remain.\n\n## Runtime\n\n- `WorkflowRunner` (`src/workflow/runner.ts`) executes workflows and coordinates steps.\n - `start(name, version?, initialData?)` returns a `workflowId`.\n - `executeStep(workflowId, input?)` runs the current step (automation or human).\n - `getState(workflowId)` retrieves the latest state snapshot.\n - `cancel(workflowId)` marks the workflow as cancelled.\n - `preFlightCheck(name, version?, resolvedConfig?)` evaluates integration/capability requirements before the workflow starts.\n - Throws `WorkflowPreFlightError` if required integration slots are unbound or required capabilities are disabled.\n- `StateStore` (`src/workflow/state.ts`) abstracts persistence. V1 ships with:\n - `InMemoryStateStore` (`src/workflow/adapters/memory-store.ts`) for tests/dev.\n - Placeholder factories for file/database adapters (`adapters/file-adapter.ts`, `adapters/db-adapter.ts`).\n- Guard evaluation: expression guards run through `evaluateExpression()` (`src/workflow/expression.ts`); custom policy guards can be provided via `guardEvaluator`.\n- Events: the runner emits `workflow.started`, `workflow.step_completed`, `workflow.step_failed`, and `workflow.cancelled` through the optional `eventEmitter`.\n- React bindings (`@contractspec/lib.presentation-runtime-react`):\n - `useWorkflow` hook (polls state, exposes `executeStep`, `cancel`, `refresh`).\n - `WorkflowStepper` progress indicator using design-system Stepper.\n - `WorkflowStepRenderer` helper to render human/automation/decision steps with sensible fallbacks.\n\n## Authoring Checklist\n\n1. Reuse existing operations/forms; create new specs when missing.\n2. Prefer explicit `entryStepId` for clarity (especially with decision branches).\n3. Give automation steps an `operation` and human steps a `form` (warnings surface otherwise).\n4. Use short, meaningful step IDs (`submit`, `review`, `finalize`) to simplify analytics.\n5. Keep guard expressions deterministic; complex policy logic should move to PolicySpec (Phase 2).\n\n## Testing\n\n- Add unit tests for new workflows via `assertWorkflowSpecValid`.\n- Use the new Vitest suites (`validation.test.ts`, `expression.test.ts`, `runner.test.ts`) as examples.\n- CLI support will arrive in Phase 1 PR 3 (`contractspec create --type workflow`).\n\n## Tooling\n\n- `contractspec create --type workflow` scaffolds a WorkflowSpec with interactive prompts.\n- `contractspec build <spec.workflow.ts>` generates a runner scaffold (`.runner.ts`) wired to `WorkflowRunner` and the in-memory store.\n- `contractspec validate` understands `.workflow.ts` files and checks core structure (meta, steps, transitions).\n\n## Next Steps (Non-MVP)\n\n- Persistence adapters (database/file) for workflow state (Phase 2).\n- React bindings (`useWorkflow`, `WorkflowStepper`) and presentation-runtime integration (PR 3).\n- Policy engine integration (`guard.type === 'policy'` validated against PolicySpec).\n- Telemetry hooks for step execution metrics.\n\n"}];gJ(YN4)});var JN4;var tT6=d0(()=>{xY();JN4=[{id:"docs.tech.mcp.endpoints",title:"ContractSpec MCP endpoints",summary:"Dedicated MCP servers for docs, CLI usage, and internal development.",kind:"reference",visibility:"mixed",route:"/docs/tech/mcp/endpoints",tags:["mcp","docs","cli","internal"],body:"# ContractSpec MCP endpoints\n\nThree dedicated MCP servers keep AI agents efficient and scoped:\n\n- **Docs MCP**: `/api/mcp/docs` \u2014 exposes DocBlocks as resources + presentations. Tool: `docs.search`.\n- **CLI MCP**: `/api/mcp/cli` \u2014 surfaces CLI quickstart/reference/README and suggests commands. Tool: `cli.suggestCommand`.\n- **Internal MCP**: `/api/mcp/internal` \u2014 internal routing hints, playbook, and example registry access. Tool: `internal.describe`.\n\n### Usage notes\n- Transports are HTTP POST (streamable HTTP); SSE is disabled.\n- Resources are namespaced (`docs://*`, `cli://*`, `internal://*`) and are read-only.\n- Internal MCP also exposes the examples registry via `examples://*` resources:\n - `examples://list?q=<query>`\n - `examples://example/<id>`\n- Prompts mirror each surface (navigator, usage, bootstrap) for quick agent onboarding.\n- GraphQL remains at `/graphql`; health at `/health`.\n\n### Alpic hosting\n- Alpic exposes MCP at `/` (SSE + Streamable HTTP) and `/mcp` (Streamable HTTP).\n- Static UI assets are served at `/assets` from repo `/assets` or build output `dist/assets`.\n- Use the `ALPIC_HOST` environment variable to build absolute asset URLs.\n"}];gJ(JN4)});var WN4;var eT6=d0(()=>{xY();WN4=[{id:"docs.tech.vscode.extension",title:"ContractSpec VS Code Extension",summary:"VS Code extension for spec-first development with validation, scaffolding, and MCP integration.",kind:"reference",visibility:"public",route:"/docs/tech/vscode/extension",tags:["vscode","extension","tooling","dx"],body:`# ContractSpec VS Code Extension
|
|
45677
|
+
`}];gJ($N4)});var XN4;var aT6=d0(()=>{xY();XN4=[{id:"docs.tech.schema.README",title:"Multi\u2011File Prisma Schema Conventions (per database)",summary:"We adopt Prisma multi\u2011file schema (GA \u2265 v6.7) to organize each database\u2019s models by domain and to import core LSSM module schemas locally.",kind:"reference",visibility:"public",route:"/docs/tech/schema/README",tags:["tech","schema","README"],body:'# Multi\u2011File Prisma Schema Conventions (per database)\n\nWe adopt Prisma multi\u2011file schema (GA \u2265 v6.7) to organize each database\u2019s models by domain and to import core LSSM module schemas locally.\n\nCanonical layout per DB:\n\n```\nprisma/\n schema/\n main.prisma # datasource + generators only\n imported/\n lssm_sigil/*.prisma # imported models/enums only (no datasource/generator)\n lssm_content/*.prisma # idem\n <domain>/*.prisma # vertical\u2011specific models split by bounded context\n```\n\nNotes:\n\n- Imported files contain only `model` and `enum` blocks (strip `datasource`/`generator`).\n- Preserve `@@schema("\u2026")` annotations to keep tables in their Postgres schemas; we now explicitly list schemas in `main.prisma` to avoid P1012: `schemas = ["public","lssm_sigil","lssm_content","lssm_featureflags","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`.\n- Use `@contractspec/app.cli-database` CLI: `database import|check|generate|migrate:*|seed` to manage a single DB; `@contractspec/app.cli-databases` orchestrates multiple DBs.\n\n## Typed merger config\n\n- Define imported module list once per DB with a typed config:\n\n```ts\n// prisma-merger.config.ts\nimport { defineMergedPrismaConfig } from \'@contractspec/app.cli-database\';\n\nexport default defineMergedPrismaConfig({\n modules: [\n \'@contractspec/app.cli-database-sigil\',\n \'@contractspec/app.cli-database-content\',\n // ...\n ],\n});\n```\n\n- Then run `database import --target .` (no need to pass `--modules`).\n\n## Prisma Config (prisma.config.ts)\n\nWe use Prisma Config per official docs to point Prisma to the multi-file schema folder and migrations:\n\n```ts\n// prisma.config.ts\nimport path from \'node:path\';\nimport { defineConfig } from \'prisma/config\';\n\nexport default defineConfig({\n schema: path.join(\'prisma\', \'schema\'),\n migrations: { path: path.join(\'prisma\', \'migrations\') },\n});\n```\n\nReference: Prisma blog \u2013 Organize Your Prisma Schema into Multiple Files: https://www.prisma.io/blog/organize-your-prisma-schema-with-multi-file-support\n\n---\n\n# LSSM Auth (Sigil) \u2013 Models & Integration\n\nThis document tracks the identity models and integration points used by the LSSM Sigil module.\n\n## Models (Prisma `lssm_sigil`)\n\n- `User` \u2013 core identity with email, optional phone, role, passkeys, apiKeys\n- `Session` \u2013 session tokens and metadata; includes `activeOrganizationId`\n- `Account` \u2013 external providers (password, OAuth)\n- `Organization` \u2013 tenant boundary; includes `type` additional field\n- `Member`, `Invitation`, `Team`, `TeamMember` \u2013 org/teams\n- `Role`, `Permission`, `PolicyBinding` \u2013 RBAC\n- `ApiKey`, `Passkey` \u2013 programmable access and WebAuthn\n- `SsoProvider` \u2013 OIDC/SAML provider configuration (org- or user-scoped)\n- `OAuthApplication`, `OAuthAccessToken`, `OAuthConsent` \u2013 first/third-party OAuth\n\nThese mirror STRIT additions so Better Auth advanced plugins (admin, organization, apiKey, passkey, genericOAuth) work uniformly across apps.\n\n## Better Auth (server)\n\nEnabled methods:\n\n- Email & password\n- Phone OTP (Telnyx)\n- Passkey (WebAuthn)\n- API keys\n- Organizations & Teams\n- Generic OAuth (FranceConnect+ via OIDC with JWE/JWS using JOSE)\n\nServer config lives at `packages/lssm/modules/sigil/src/application/services/auth.ts`.\n\n## Clients (Expo / React)\n\nClient config lives at `packages/lssm/modules/sigil/src/presentation/providers/auth/expo.ts` with plugins for admin, passkey, apiKey, organization, phone, genericOAuth.\n\n## Environment Variables\n\nTelnyx (phone OTP):\n\n- `TELNYX_API_KEY`\n- `TELNYX_MESSAGING_PROFILE_ID`\n- `TELNYX_FROM_NUMBER`\n\nFranceConnect+ (prefer LSSM*\u2026 but STRIT*\u2026 fallbacks are supported):\n\n- `LSSM_FRANCECONNECTPLUS_DISCOVERY_URL`\n- `LSSM_FRANCECONNECTPLUS_CLIENT_ID`\n- `LSSM_FRANCECONNECTPLUS_CLIENT_SECRET`\n- `LSSM_FRANCECONNECTPLUS_ENC_PRIVATE_KEY_PEM` (PKCS8; RSA-OAEP-256)\n\nGeneric:\n\n- `API_URL_IDENTITIES` \u2013 base URL for Better Auth server\n- `BETTER_AUTH_SECRET` \u2013 server secret\n\nKeep this in sync with code changes to avoid drift.\n\n## HCircle domain splits and auth removal\n\n- Auth/identity models are not defined locally anymore. They come from `@contractspec/app.cli-database-sigil` under the `lssm_sigil` schema.\n- `packages/hcircle/libs/database-coliving/prisma/schema/domain/` is split by domain; newsletter/waiting list lives in `newsletter.prisma` and uses `@@map("waiting_list")`.\n- To avoid collisions with module names, the local event models were renamed to `SocialEvent`, `SocialEventAttendee`, and `SocialEventRecurrence` with `@@map` pointing to existing table names.\n\n---\n\n## Vertical profiles (current)\n\n### STRIT\n\n- prisma-merger modules:\n - `@contractspec/app.cli-database-sigil`, `@contractspec/app.cli-database-content`, `@contractspec/app.cli-database-ops`, `@contractspec/app.cli-database-planning`, `@contractspec/app.cli-database-quill`, `@contractspec/app.cli-database-geoterro`\n- main.prisma schemas:\n - `schemas = ["public","lssm_sigil","lssm_content","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`\n- domain splits (`packages/strit/libs/database/prisma/schema/domain/`):\n - `bookings.prisma` (Booking, StritDocument + links to Content `File` and Sigil `Organization`)\n - `commerce.prisma` (Wholesale models; `sellerId` linked to Sigil `Organization`)\n - `files.prisma` (PublicFile, PublicFileAccessLog; `ownerId`\u2192Organization, `uploadedBy`\u2192User)\n - `geo.prisma` (PublicCountry, PublicAddress, City; links to Spots/Series)\n - `spots.prisma`, `urbanism.prisma`, `analytics.prisma`, `onboarding.prisma`, `referrals.prisma`, `subscriptions.prisma`, `content.prisma`\n- auth models are imported from Sigil (no local auth tables).\n- Back-relations for `Organization` (e.g., `files`, seller relations) are declared in the Sigil module to avoid scattering.\n\n### ARTISANOS\n\n- prisma-merger modules:\n - `@contractspec/app.cli-database-sigil`, `@contractspec/app.cli-database-content`, `@contractspec/app.cli-database-featureflags`, `@contractspec/app.cli-database-ops`, `@contractspec/app.cli-database-planning`, `@contractspec/app.cli-database-quill`, `@contractspec/app.cli-database-geoterro`\n- main.prisma schemas:\n - `schemas = ["public","lssm_sigil","lssm_content","lssm_featureflags","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`\n- domain splits (`packages/artisanos/libs/database-artisan/prisma/schema/domain/`):\n - `sales.prisma` (Client, Quote, QuoteTemplate, Invoice, FollowUps)\n - `subsidies.prisma` (SubsidyProgram, AidApplication, SupportingDocument)\n - `projects.prisma` (Project, ProjectPlanningSettings)\n - `crm.prisma` (OrganizationProfessionalProfile, OrganizationCertification)\n - `professions.prisma`, `products.prisma`, `templates.prisma`, `analytics.prisma`, `onboarding.prisma`, `referrals.prisma`, `subscriptions.prisma`, `files.prisma`\n- auth/organization/team models are provided by Sigil; local legacy copies were removed.\n- Where names collide with Content, local models are prefixed (e.g., `PublicFile`) and use `@@map` to keep existing table names where applicable.\n\n## Schema Dictionary: `@contractspec/lib.schema`\n\n### Purpose\n\nDescribe operation I/O once and generate:\n\n- zod (runtime validation)\n- GraphQL (Pothos types/refs)\n- JSON Schema (via `zod-to-json-schema` or native descriptors)\n\n### Primitives\n\n- **FieldType<T>**: describes a scalar or composite field and carries:\n - `zod` schema for validation\n - optional JSON Schema descriptor\n - optional GraphQL scalar reference/name\n- **SchemaModel**: named object model composed of fields. Exposes helpers:\n - `getZod(): z.ZodObject<ZodShapeFromFields<Fields>> | z.ZodArray<z.ZodObject<...>>`\n - Preserves each field\'s schema, optionality, and array-ness\n - Top-level lists are supported via `config.isArray: true`\n - `getJsonSchema(): JSONSchema7` (export for docs, MCP, forms)\n - `getPothosInput()` (GraphQL input object name)\n\n### Multi-Format Wrappers\n\nUse existing schema definitions from other libraries:\n- `ZodSchemaType`: Wraps a raw Zod schema (`z.infer` becomes the TS type).\n- `JsonSchemaType`: Wraps a JSON Schema object.\n- `GraphQLSchemaType`: Wraps a GraphQL SDL string.\n\n### Conventions\n\n- Name models with PascalCase; suffix with `Input`/`Result` when ambiguous.\n- Use explicit enums for multi-value constants; reuse the same enum across input/output.\n- Define domain enums via `defineEnum(\'Name\', [...])` in the relevant domain package (e.g., `packages/strit/libs/contracts-strit/src/enums/`), not in `ScalarTypeEnum`.\n- Reference those enums in `SchemaModel` fields directly (they expose `getZod`, `getPothos`, `getJsonSchema`).\n\n#### Example (STRIT)\n\n```ts\n// packages/strit/libs/contracts-strit/src/enums/recurrence.ts\nimport { defineEnum } from \'@contractspec/lib.schema\';\nexport const SpotEnum = {\n Weekday: () =>\n defineEnum(\'Weekday\', [\'MO\', \'TU\', \'WE\', \'TH\', \'FR\', \'SA\', \'SU\'] as const),\n RecurrenceFrequency: () =>\n defineEnum(\'RecurrenceFrequency\', [\n \'DAILY\',\n \'WEEKLY\',\n \'MONTHLY\',\n \'YEARLY\',\n ] as const),\n} as const;\n```\n\n```ts\n// usage in contracts\nfrequency: { type: SpotEnum.RecurrenceFrequency(), isOptional: false },\nbyWeekday: { type: SpotEnum.Weekday(), isOptional: true, isArray: true },\n```\n\n- Use `Date` type for temporal values and ensure ISO strings in JSON transports where needed.\n\n### Mapping rules (summary)\n\n- Strings \u2192 GraphQL `String`\n- Numbers \u2192 `Int` if safe 32-bit integer else `Float`\n- Booleans \u2192 `Boolean`\n- Dates \u2192 custom `Date` scalar\n- Arrays<T> \u2192 list of mapped T (set `isArray: true` on the field)\n- Top-level arrays \u2192 set `isArray: true` on the model config\n- Objects \u2192 input/output object types with stable field order\n- Unions \u2192 supported for output; input unions map to JSON (structural input is not supported by GraphQL)\n\n### JSON Schema export\n\nPrefer `getZod()` + `zod-to-json-schema` for consistency. For advanced cases, provide a custom `getJsonSchema()` on the model.\n\n### Example\n\n```ts\nimport { ScalarTypeEnum, SchemaModel } from \'@contractspec/lib.schema\';\n\n// Nested model\nconst Weekday = new SchemaModel({\n name: \'Weekday\',\n fields: {\n value: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n },\n});\n\n// Parent model with array field and nested object\nconst Rule = new SchemaModel({\n name: \'Rule\',\n fields: {\n timezone: { type: ScalarTypeEnum.TimeZone(), isOptional: false },\n byWeekday: { type: Weekday, isOptional: true, isArray: true },\n },\n});\n\nconst CreateThingInput = new SchemaModel({\n name: \'CreateThingInput\',\n fields: {\n name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n rule: { type: Rule, isOptional: false },\n },\n});\n\n// zod\nconst z = CreateThingInput.getZod();\n```\n'}];gJ(XN4)});var YN4;var sT6=d0(()=>{xY();YN4=[{id:"docs.tech.workflows.overview",title:"WorkflowSpec Overview",summary:"WorkflowSpec provides a declarative, versioned format for long-running flows that mix automation and human review, including runtime adapter capabilities/ports for checkpointing and suspend-resume orchestration. Specs stay inside `@contractspec/lib.contracts-spec` (`src/workflow/spec.ts`) so the same definition powers runtime execution, documentation, and future generation.",kind:"reference",visibility:"public",route:"/docs/tech/workflows/overview",tags:["tech","workflows","overview"],body:"# WorkflowSpec Overview\n\n## Purpose\n\nWorkflowSpec provides a declarative, versioned format for long-running flows that mix automation and human review. Specs stay inside `@contractspec/lib.contracts-spec` (`src/workflow/spec.ts`) so the same definition powers runtime execution, documentation, and future generation.\n\n## Core Types\n\n- `WorkflowMeta`: ownership metadata (`title`, `domain`, `owners`, `tags`, `stability`) plus `name` and `version`.\n- `WorkflowDefinition`:\n - `entryStepId?`: optional explicit entry point (defaults to first step).\n - `steps[]`: ordered list of `Step` descriptors.\n - `transitions[]`: directed edges between steps with optional expressions.\n - `sla?`: aggregated timing hints for the overall flow or per-step budgets.\n - `compensation?`: fallback operations executed when a workflow is rolled back or fails.\n- `Step`:\n - `type`: `human`, `automation`, or `decision`.\n - `action`: references either a `ContractSpec` (`operation`) or `FormSpec` (`form`).\n - Optional `guard`, `timeoutMs`, and retry policy (`maxAttempts`, `backoff`, `delayMs`, `maxDelayMs?`).\n - `requiredIntegrations?`: integration slot ids that must be bound before the step may execute.\n - `requiredCapabilities?`: `CapabilityRef[]` that must be enabled in the resolved app config.\n- `Transition`: `from` \u2192 `to` with optional `condition` string (simple data expressions).\n\n## Registry & Validation\n\n- `WorkflowRegistry` (`src/workflow/spec.ts`) stores specs by key `<name>.v<version>` and exposes `register`, `list`, and `get`.\n- `validateWorkflowSpec()` (`src/workflow/validation.ts`) checks:\n - Duplicate step IDs.\n - Unknown `from`/`to` transitions.\n - Empty guards/conditions.\n - Reachability from the entry step.\n - Cycles in the graph.\n - Operation/Form references against provided registries.\n- `assertWorkflowSpecValid()` wraps validation and throws `WorkflowValidationError` when errors remain.\n\n## Runtime\n\n- `WorkflowRunner` (`src/workflow/runner.ts`) executes workflows and coordinates steps.\n - `start(name, version?, initialData?)` returns a `workflowId`.\n - `executeStep(workflowId, input?)` runs the current step (automation or human).\n - `getState(workflowId)` retrieves the latest state snapshot.\n - `cancel(workflowId)` marks the workflow as cancelled.\n - `preFlightCheck(name, version?, resolvedConfig?)` evaluates integration/capability requirements before the workflow starts.\n - Throws `WorkflowPreFlightError` if required integration slots are unbound or required capabilities are disabled.\n- `StateStore` (`src/workflow/state.ts`) abstracts persistence. V1 ships with:\n - `InMemoryStateStore` (`src/workflow/adapters/memory-store.ts`) for tests/dev.\n - Placeholder factories for file/database adapters (`adapters/file-adapter.ts`, `adapters/db-adapter.ts`).\n- Guard evaluation: expression guards run through `evaluateExpression()` (`src/workflow/expression.ts`); custom policy guards can be provided via `guardEvaluator`.\n- Events: the runner emits `workflow.started`, `workflow.step_completed`, `workflow.step_failed`, and `workflow.cancelled` through the optional `eventEmitter`.\n- React bindings (`@contractspec/lib.presentation-runtime-react`):\n - `useWorkflow` hook (polls state, exposes `executeStep`, `cancel`, `refresh`).\n - `WorkflowStepper` progress indicator using design-system Stepper.\n - `WorkflowStepRenderer` helper to render human/automation/decision steps with sensible fallbacks.\n\n## Authoring Checklist\n\n1. Reuse existing operations/forms; create new specs when missing.\n2. Prefer explicit `entryStepId` for clarity (especially with decision branches).\n3. Give automation steps an `operation` and human steps a `form` (warnings surface otherwise).\n4. Use short, meaningful step IDs (`submit`, `review`, `finalize`) to simplify analytics.\n5. Keep guard expressions deterministic; complex policy logic should move to PolicySpec (Phase 2).\n\n## Testing\n\n- Add unit tests for new workflows via `assertWorkflowSpecValid`.\n- Use the new Vitest suites (`validation.test.ts`, `expression.test.ts`, `runner.test.ts`) as examples.\n- CLI support will arrive in Phase 1 PR 3 (`contractspec create --type workflow`).\n\n## Tooling\n\n- `contractspec create --type workflow` scaffolds a WorkflowSpec with interactive prompts.\n- `contractspec build <spec.workflow.ts>` generates a runner scaffold (`.runner.ts`) wired to `WorkflowRunner` and the in-memory store.\n- `contractspec validate` understands `.workflow.ts` files and checks core structure (meta, steps, transitions).\n\n## Next Steps (Non-MVP)\n\n- Persistence adapters (database/file) for workflow state (Phase 2).\n- React bindings (`useWorkflow`, `WorkflowStepper`) and presentation-runtime integration (PR 3).\n- Policy engine integration (`guard.type === 'policy'` validated against PolicySpec).\n- Telemetry hooks for step execution metrics.\n\n"}];gJ(YN4)});var JN4;var tT6=d0(()=>{xY();JN4=[{id:"docs.tech.mcp.endpoints",title:"ContractSpec MCP endpoints",summary:"Dedicated MCP servers for docs, CLI usage, and internal development.",kind:"reference",visibility:"mixed",route:"/docs/tech/mcp/endpoints",tags:["mcp","docs","cli","internal"],body:"# ContractSpec MCP endpoints\n\nThree dedicated MCP servers keep AI agents efficient and scoped:\n\n- **Docs MCP**: `/api/mcp/docs` \u2014 exposes DocBlocks as resources + presentations. Tool: `docs_search`.\n- **CLI MCP**: `/api/mcp/cli` \u2014 surfaces CLI quickstart/reference/README and suggests commands. Tool: `cli_suggestCommand`.\n- **Internal MCP**: `/api/mcp/internal` \u2014 internal routing hints, playbook, and example registry access. Tool: `internal_describe`.\n\n### Usage notes\n- Transports are HTTP POST (streamable HTTP); SSE is disabled.\n- Resources are namespaced (`docs://*`, `cli://*`, `internal://*`) and are read-only.\n- Internal MCP also exposes the examples registry via `examples://*` resources:\n - `examples://list?q=<query>`\n - `examples://example/<id>`\n- Prompts mirror each surface (navigator, usage, bootstrap) for quick agent onboarding.\n- GraphQL remains at `/graphql`; health at `/health`.\n\n### Alpic hosting\n- Alpic exposes MCP at `/` (SSE + Streamable HTTP) and `/mcp` (Streamable HTTP).\n- Static UI assets are served at `/assets` from repo `/assets` or build output `dist/assets`.\n- Use the `ALPIC_HOST` environment variable to build absolute asset URLs.\n"}];gJ(JN4)});var WN4;var eT6=d0(()=>{xY();WN4=[{id:"docs.tech.vscode.extension",title:"ContractSpec VS Code Extension",summary:"VS Code extension for spec-first development with validation, scaffolding, and MCP integration.",kind:"reference",visibility:"public",route:"/docs/tech/vscode/extension",tags:["vscode","extension","tooling","dx"],body:`# ContractSpec VS Code Extension
|
|
45678
45678
|
|
|
45679
45679
|
The ContractSpec VS Code extension provides spec-first development tooling directly in your editor.
|
|
45680
45680
|
|
|
@@ -50720,5 +50720,5 @@ ${j}`}).join(`
|
|
|
50720
50720
|
\u274C Error:`),Y instanceof Error?Y.message:String(Y)),process.exit(1)}});var FU9=bZ.command("regenerator").description("Operate the Regenerator daemon").argument("<blueprint-file>","Path to AppBlueprintSpec file").argument("<tenant-file>","Path to TenantAppConfig file").argument("<rules-file>","Path to module exporting regenerator rules").argument("<sink-file>",'Path to module exporting a proposal sink (use "auto" with --executor)').option("-p, --poll-interval <ms>","Polling interval in ms (default 60000)",($)=>Number.parseInt($,10)).option("-b, --batch-duration <ms>","Lookback duration in ms (default 300000)",($)=>Number.parseInt($,10)).option("--once","Run a single evaluation cycle then exit").option("--contexts <path>","Optional file exporting an array of RegenerationContext overrides").option("--executor <path>",'Module exporting a ProposalExecutor instance, factory, or deps (required when sink is "auto")').option("--dry-run","Execute proposals in dry-run mode when using executor sink").action(async($,Y,W,Q,Z)=>{try{let B=await Xq(),O=uj(B,Z);await Df6($,Y,W,Q,Z,O)}catch(B){console.error(U$.red(`
|
|
50721
50721
|
\u274C Error:`),B instanceof Error?B.message:String(B)),process.exit(1)}});EH(FU9,f00);bZ.addCommand(EH(dJ8,$b));function $W8(){bZ.parse()}$W8();
|
|
50722
50722
|
|
|
50723
|
-
//# debugId=
|
|
50723
|
+
//# debugId=D847E650580E9F0664756E2164756E21
|
|
50724
50724
|
//# sourceMappingURL=cli.js.map
|
package/dist/node/cli.js
CHANGED
|
@@ -45061,7 +45061,7 @@ The result is a consistent docs surface across CLI, web, and MCP.
|
|
|
45061
45061
|
## Key surfaces
|
|
45062
45062
|
|
|
45063
45063
|
- Generation: \`docs.generate\`
|
|
45064
|
-
- Index/search: \`
|
|
45064
|
+
- Index/search: \`docs_search\`
|
|
45065
45065
|
- Contract reference: \`docs.contract.reference\`
|
|
45066
45066
|
- Publish: \`docs.publish\`
|
|
45067
45067
|
`},{id:"docs.tech.docs-generator",title:"Docs generator",summary:"Generate reference docs and metadata from ContractSpecs.",kind:"how",visibility:"public",route:"/docs/tech/docs/generator",tags:["docs","generator","cli"],body:`# Docs generator
|
|
@@ -45079,7 +45079,7 @@ The docs index is the canonical list of DocBlocks exposed to UI and MCP surfaces
|
|
|
45079
45079
|
|
|
45080
45080
|
## Query
|
|
45081
45081
|
|
|
45082
|
-
- Operation: \`
|
|
45082
|
+
- Operation: \`docs_search\`
|
|
45083
45083
|
- Filters: query, tag, kind, visibility
|
|
45084
45084
|
`},{id:"docs.tech.docs-reference",title:"Contract reference pages",summary:"Resolve any spec into a docs-ready reference payload.",kind:"reference",visibility:"public",route:"/docs/tech/docs/reference",tags:["docs","reference"],body:`# Contract reference
|
|
45085
45085
|
|
|
@@ -45101,7 +45101,7 @@ Examples are registered as ExampleSpecs and surface DocBlocks for discovery.
|
|
|
45101
45101
|
|
|
45102
45102
|
- Docs index tags should include \`examples\` to populate the catalog.
|
|
45103
45103
|
- Sandbox support is available under \`/sandbox\`.
|
|
45104
|
-
`}];YG($3X)});var jl=l$(()=>{qh1();Iy1();Sy1();yy1();ry1();ty1()});var X3X,Dh1;var Ah1=l$(()=>{Y9();EM();jl();lY();Fk();X3X=new W4({name:"DocsGeneratedPayload",fields:{buildId:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!0},generatedAt:{type:e.DateTime(),isOptional:!1},outputDir:{type:e.String_unsecure(),isOptional:!0},artifactCount:{type:e.Int_unsecure(),isOptional:!0},warnings:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),Dh1=QJ({meta:{key:"docs.generated",version:"1.0.0",description:"Emitted when documentation artifacts are generated.",domain:aD,owners:tD,tags:[...sD,"generation"],stability:eD,docId:[mJ("docs.tech.docs-generator")]},payload:X3X})});var J3X,Y3X,G3X,W3X;var fe6=l$(()=>{Y9();K5();jl();lY();Fk();Ah1();J3X=new W4({name:"DocsArtifact",fields:{path:{type:e.String_unsecure(),isOptional:!1},format:{type:e.String_unsecure(),isOptional:!0},bytes:{type:e.Int_unsecure(),isOptional:!0},kind:{type:e.String_unsecure(),isOptional:!0}}}),Y3X=new W4({name:"DocsGenerateInput",fields:{workspaceRoot:{type:e.String_unsecure(),isOptional:!0},outputDir:{type:e.String_unsecure(),isOptional:!0},version:{type:e.String_unsecure(),isOptional:!0},formats:{type:e.String_unsecure(),isOptional:!0,isArray:!0},includeInternal:{type:e.Boolean(),isOptional:!0},includeExperimental:{type:e.Boolean(),isOptional:!0},contractFilter:{type:e.String_unsecure(),isOptional:!0},docblockFilter:{type:e.String_unsecure(),isOptional:!0},dryRun:{type:e.Boolean(),isOptional:!0}}}),G3X=new W4({name:"DocsGenerateOutput",fields:{buildId:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!0},generatedAt:{type:e.DateTime(),isOptional:!1},outputDir:{type:e.String_unsecure(),isOptional:!0},artifacts:{type:J3X,isOptional:!0,isArray:!0},warnings:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),W3X=B9({meta:{key:"docs.generate",title:"Generate Documentation",version:"1.0.0",description:"Generate documentation artifacts from ContractSpecs.",goal:"Produce up-to-date reference docs and guides from specs and DocBlocks.",context:"Used by CLI and CI to keep docs in sync with contract definitions.",domain:aD,owners:tD,tags:[...sD,"generation"],stability:eD,docId:[mJ("docs.tech.docs-generator")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:Y3X,output:G3X,errors:{OUTPUT_WRITE_FAILED:{description:"Failed to write generated docs output.",http:500,when:"The generator cannot persist artifacts to the output path."}}},policy:{auth:"admin",pii:[]},sideEffects:{emits:[{ref:Dh1.meta,when:"Docs generation completes successfully."}]}})});var Q3X,Vh1;var Fh1=l$(()=>{Y9();EM();jl();lY();Fk();Q3X=new W4({name:"DocsPublishedPayload",fields:{publishId:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!0},environment:{type:e.String_unsecure(),isOptional:!0},url:{type:e.String_unsecure(),isOptional:!0},publishedAt:{type:e.DateTime(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!0},warnings:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),Vh1=QJ({meta:{key:"docs.published",version:"1.0.0",description:"Emitted when documentation is published.",domain:aD,owners:tD,tags:[...sD,"publish"],stability:eD,docId:[mJ("docs.tech.docs-publish")]},payload:Q3X})});var Z3X,z3X,U3X;var ye6=l$(()=>{Y9();K5();jl();lY();Fk();Fh1();Z3X=new W4({name:"DocsPublishInput",fields:{buildId:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!0},environment:{type:e.String_unsecure(),isOptional:!0},deployTarget:{type:e.String_unsecure(),isOptional:!0},artifactPath:{type:e.String_unsecure(),isOptional:!0},dryRun:{type:e.Boolean(),isOptional:!0},notes:{type:e.String_unsecure(),isOptional:!0}}}),z3X=new W4({name:"DocsPublishOutput",fields:{publishId:{type:e.String_unsecure(),isOptional:!1},publishedAt:{type:e.DateTime(),isOptional:!1},url:{type:e.String_unsecure(),isOptional:!0},status:{type:e.String_unsecure(),isOptional:!0},warnings:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),U3X=B9({meta:{key:"docs.publish",title:"Publish Documentation",version:"1.0.0",description:"Publish generated documentation artifacts.",goal:"Deploy docs to the public docs surface with consistent versioning.",context:"Used by release pipelines to push generated docs to hosting targets.",domain:aD,owners:tD,tags:[...sD,"publish"],stability:eD,docId:[mJ("docs.tech.docs-publish")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:Z3X,output:z3X,errors:{DEPLOY_FAILED:{description:"Failed to deploy documentation artifacts.",http:500,when:"The docs publish step fails to deploy to the target host."}}},policy:{auth:"admin",pii:[]},sideEffects:{emits:[{ref:Vh1.meta,when:"Docs publish completes successfully."}]}})});var wh1=l$(()=>{fe6();ye6()});var ge6,H3X,K3X,Vx$;var AC0=l$(()=>{Y9();K5();jl();lY();Fk();ge6=new W4({name:"DocSummary",fields:{id:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},summary:{type:e.String_unsecure(),isOptional:!0},route:{type:e.String_unsecure(),isOptional:!0},visibility:{type:e.String_unsecure(),isOptional:!0},kind:{type:e.String_unsecure(),isOptional:!0},version:{type:e.String_unsecure(),isOptional:!0},tags:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),H3X=new W4({name:"DocsIndexInput",fields:{query:{type:e.String_unsecure(),isOptional:!0},tag:{type:e.String_unsecure(),isOptional:!0,isArray:!0},visibility:{type:e.String_unsecure(),isOptional:!0},kind:{type:e.String_unsecure(),isOptional:!0},limit:{type:e.Int_unsecure(),isOptional:!0},offset:{type:e.Int_unsecure(),isOptional:!0}}}),K3X=new W4({name:"DocsIndexOutput",fields:{items:{type:ge6,isOptional:!0,isArray:!0},docs:{type:ge6,isOptional:!1,isArray:!0},total:{type:e.Int_unsecure(),isOptional:!0},nextOffset:{type:e.Int_unsecure(),isOptional:!0}}}),Vx$=fJ({meta:{key:"docs.search",title:"Docs Index",version:"1.0.0",description:"Search and filter DocBlocks by query, tag, or visibility.",goal:"Provide a consistent index of documentation entries for UI and MCP.",context:"Used by docs surfaces to list and filter DocBlocks without coupling to storage.",domain:aD,owners:tD,tags:[...sD,"search","index"],stability:eD,docId:[mJ("docs.tech.docs-search")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:H3X,output:K3X},policy:{auth:"anonymous",pii:[]}})});var O3X,B3X,q3X,VC0;var Ih1=l$(()=>{Y9();K5();jl();lY();Fk();O3X=new W4({name:"ContractReferenceInput",fields:{key:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!0},type:{type:e.String_unsecure(),isOptional:!0},format:{type:e.String_unsecure(),isOptional:!0},includeSchema:{type:e.Boolean(),isOptional:!0}}}),B3X=new W4({name:"ContractReference",fields:{key:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!1},type:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!0},description:{type:e.String_unsecure(),isOptional:!0},markdown:{type:e.String_unsecure(),isOptional:!0},route:{type:e.String_unsecure(),isOptional:!0},schema:{type:e.JSONObject(),isOptional:!0},policy:{type:e.JSONObject(),isOptional:!0},tags:{type:e.String_unsecure(),isOptional:!0,isArray:!0},owners:{type:e.String_unsecure(),isOptional:!0,isArray:!0},stability:{type:e.String_unsecure(),isOptional:!0}}}),q3X=new W4({name:"ContractReferenceOutput",fields:{reference:{type:B3X,isOptional:!1}}}),VC0=fJ({meta:{key:"docs.contract.reference",title:"Contract Reference",version:"1.0.0",description:"Resolve a contract into a documentation-ready reference.",goal:"Expose a canonical reference view for any ContractSpec surface.",context:"Used by docs generators and UI to render consistent reference pages.",domain:aD,owners:tD,tags:[...sD,"reference"],stability:eD,docId:[mJ("docs.tech.docs-reference")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:O3X,output:q3X},policy:{auth:"anonymous",pii:[]}})});var Mh1=l$(()=>{AC0();Ih1()});var Lh1=l$(()=>{Ah1();Fh1()});var RVJ;var he6=l$(()=>{bf();Fk();RVJ=vV({meta:{key:"docs.system",version:"1.0.0",kind:"ui",title:"Documentation System",description:"End-to-end docs generation, indexing, and presentation.",domain:aD,owners:tD,tags:[...sD,"system"],stability:eD},provides:[{surface:"operation",key:"docs.generate",version:"1.0.0",description:"Generate documentation artifacts."},{surface:"operation",key:"docs.publish",version:"1.0.0",description:"Publish documentation artifacts."},{surface:"operation",key:"docs.search",version:"1.0.0",description:"Index and search DocBlocks."},{surface:"operation",key:"docs.contract.reference",version:"1.0.0",description:"Resolve contract references for docs."},{surface:"event",key:"docs.generated",version:"1.0.0",description:"Docs generation completed."},{surface:"event",key:"docs.published",version:"1.0.0",description:"Docs publish completed."},{surface:"presentation",key:"docs.layout",version:"1.0.0",description:"Docs layout presentation."},{surface:"presentation",key:"docs.reference.page",version:"1.0.0",description:"Docs reference page presentation."}]})});var me6=l$(()=>{he6()});var D3X;var ue6=l$(()=>{Hx$();jl();lY();Fk();D3X=kz({meta:{key:"docs.layout",title:"Docs Layout",version:"1.0.0",description:"Shared layout shell for documentation pages.",goal:"Provide consistent navigation, layout, and docs UI scaffolding.",context:"Used by web docs surfaces to render DocBlock-based content.",domain:aD,owners:tD,tags:[...sD,"layout"],stability:eD,docId:[mJ("docs.tech.docs-system")]},capability:{key:"docs.system",version:"1.0.0"},source:{type:"component",framework:"react",componentKey:"docsLayout"},targets:["react"]})});var A3X;var de6=l$(()=>{Hx$();jl();lY();Fk();A3X=kz({meta:{key:"docs.reference.page",title:"Docs Reference Page",version:"1.0.0",description:"Reference page layout for contract documentation.",goal:"Render contract references with consistent metadata and formatting.",context:"Used by docs surfaces to present contract reference content and schemas.",domain:aD,owners:tD,tags:[...sD,"reference"],stability:eD,docId:[mJ("docs.tech.docs-reference")]},capability:{key:"docs.system",version:"1.0.0"},source:{type:"component",framework:"react",componentKey:"docsReferencePage"},targets:["react","markdown"]})});var Ph1=l$(()=>{ue6();de6()});var V3X,F3X;var ce6=l$(()=>{Y9();Ux$();jl();lY();Fk();V3X=new W4({name:"DocsSearchFormModel",fields:{query:{type:e.String_unsecure(),isOptional:!0},visibility:{type:e.String_unsecure(),isOptional:!0},kind:{type:e.String_unsecure(),isOptional:!0}}}),F3X=R4$({meta:{key:"docs.search.form",title:"Docs Search",version:"1.0.0",description:"Search form for documentation discovery.",domain:aD,owners:tD,tags:[...sD,"search"],stability:eD,docId:[mJ("docs.tech.docs-search")]},model:V3X,fields:[{kind:"text",name:"query",labelI18n:"Search",placeholderI18n:"Search docs"},{kind:"select",name:"visibility",labelI18n:"Visibility",options:{kind:"static",options:[{labelI18n:"Public",value:"public"},{labelI18n:"Internal",value:"internal"},{labelI18n:"Mixed",value:"mixed"}]}},{kind:"select",name:"kind",labelI18n:"Kind",options:{kind:"static",options:[{labelI18n:"Goal",value:"goal"},{labelI18n:"How",value:"how"},{labelI18n:"Usage",value:"usage"},{labelI18n:"Reference",value:"reference"},{labelI18n:"FAQ",value:"faq"},{labelI18n:"Changelog",value:"changelog"}]}}],actions:[{key:"search",labelI18n:"Search"}],policy:{flags:[],pii:[]}})});var Rh1=l$(()=>{ce6()});var w3X;var le6=l$(()=>{v2$();jl();lY();Fk();AC0();w3X=EE({meta:{key:"docs.index.view",title:"Docs Index",version:"1.0.0",description:"List and filter documentation entries.",domain:aD,owners:tD,tags:[...sD,"index"],stability:eD,entity:"docs",docId:[mJ("docs.tech.docs-search")]},source:{primary:{key:Vx$.meta.key,version:Vx$.meta.version}},view:{kind:"list",fields:[{key:"id",label:"ID",dataPath:"id"},{key:"title",label:"Title",dataPath:"title"},{key:"summary",label:"Summary",dataPath:"summary"},{key:"route",label:"Route",dataPath:"route"},{key:"tags",label:"Tags",dataPath:"tags",format:"badge"},{key:"kind",label:"Kind",dataPath:"kind"},{key:"visibility",label:"Visibility",dataPath:"visibility"}],primaryField:"title",secondaryFields:["summary","route"],filters:[{key:"query",label:"Search",field:"query",type:"search"},{key:"visibility",label:"Visibility",field:"visibility",type:"enum",options:[{value:"public",label:"Public"},{value:"internal",label:"Internal"},{value:"mixed",label:"Mixed"}]},{key:"kind",label:"Kind",field:"kind",type:"enum",options:[{value:"goal",label:"Goal"},{value:"how",label:"How"},{value:"usage",label:"Usage"},{value:"reference",label:"Reference"},{value:"faq",label:"FAQ"},{value:"changelog",label:"Changelog"}]}]},policy:{flags:[],pii:[]}})});var I3X;var pe6=l$(()=>{v2$();jl();lY();Fk();Ih1();I3X=EE({meta:{key:"docs.contract.reference.view",title:"Contract Reference",version:"1.0.0",description:"Detail view for a single contract reference.",domain:aD,owners:tD,tags:[...sD,"reference"],stability:eD,entity:"contract-reference",docId:[mJ("docs.tech.docs-reference")]},source:{primary:{key:VC0.meta.key,version:VC0.meta.version}},view:{kind:"detail",fields:[{key:"key",label:"Key",dataPath:"reference.key"},{key:"version",label:"Version",dataPath:"reference.version"},{key:"type",label:"Type",dataPath:"reference.type"},{key:"title",label:"Title",dataPath:"reference.title"},{key:"description",label:"Description",dataPath:"reference.description",format:"markdown"},{key:"tags",label:"Tags",dataPath:"reference.tags"},{key:"owners",label:"Owners",dataPath:"reference.owners"},{key:"stability",label:"Stability",dataPath:"reference.stability"}],primaryField:"title",secondaryFields:["description"]},policy:{flags:[],pii:[]}})});var M3X;var ie6=l$(()=>{v2$();jl();lY();Fk();AC0();M3X=EE({meta:{key:"docs.examples.catalog.view",title:"Examples Catalog",version:"1.0.0",description:"Catalog view of ContractSpec examples and demos.",domain:aD,owners:tD,tags:[...sD,"examples"],stability:eD,entity:"docs-examples",docId:[mJ("docs.tech.docs-examples")]},source:{primary:{key:Vx$.meta.key,version:Vx$.meta.version}},view:{kind:"grid",fields:[{key:"id",label:"ID",dataPath:"id"},{key:"title",label:"Title",dataPath:"title"},{key:"summary",label:"Summary",dataPath:"summary"},{key:"route",label:"Route",dataPath:"route"},{key:"tags",label:"Tags",dataPath:"tags",format:"badge"}],primaryField:"title",secondaryFields:["summary"],filters:[{key:"query",label:"Search",field:"query",type:"search"},{key:"tags",label:"Tags",field:"tag",type:"enum",options:[{value:"examples",label:"Examples"},{value:"templates",label:"Templates"},{value:"sandbox",label:"Sandbox"}]}]},policy:{flags:[],pii:[]}})});var Nh1=l$(()=>{le6();pe6();ie6()});var ne6=l$(()=>{wh1();Mh1();Lh1();Ph1();Rh1();Nh1()});var jFJ;var re6=l$(()=>{yp();Fk();jFJ=WH({meta:{key:"platform.docs",version:"1.0.0",title:"Documentation System",description:"Generate, publish, search, and reference contract documentation and DocBlocks",domain:aD,owners:tD,tags:[...sD],stability:eD},operations:[{key:"docs.generate",version:"1.0.0"},{key:"docs.publish",version:"1.0.0"},{key:"docs.search",version:"1.0.0"},{key:"docs.contract.reference",version:"1.0.0"}],events:[{key:"docs.generated",version:"1.0.0"},{key:"docs.published",version:"1.0.0"}],presentations:[{key:"docs.layout",version:"1.0.0"},{key:"docs.reference.page",version:"1.0.0"}],capabilities:{provides:[{key:"docs.system",version:"1.0.0"}]},dataViews:[{key:"docs.index.view",version:"1.0.0"},{key:"docs.contract.reference.view",version:"1.0.0"},{key:"docs.examples.catalog.view",version:"1.0.0"}],forms:[{key:"docs.search.form",version:"1.0.0"}]})});var L3X;var oe6=l$(()=>{lY();L3X=[{id:"docs.tech.contracts.presentations",title:"Presentations — Unified Descriptor & Transform Engine",summary:"How PresentationSpec and TransformEngine keep docs/renderers consistent.",visibility:"public",route:"/docs/tech/contracts/presentations",kind:"reference",tags:["presentations","docs","mcp"],body:`## Presentations V2 — Unified Descriptor & Transform Engine
|
|
45104
|
+
`}];YG($3X)});var jl=l$(()=>{qh1();Iy1();Sy1();yy1();ry1();ty1()});var X3X,Dh1;var Ah1=l$(()=>{Y9();EM();jl();lY();Fk();X3X=new W4({name:"DocsGeneratedPayload",fields:{buildId:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!0},generatedAt:{type:e.DateTime(),isOptional:!1},outputDir:{type:e.String_unsecure(),isOptional:!0},artifactCount:{type:e.Int_unsecure(),isOptional:!0},warnings:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),Dh1=QJ({meta:{key:"docs.generated",version:"1.0.0",description:"Emitted when documentation artifacts are generated.",domain:aD,owners:tD,tags:[...sD,"generation"],stability:eD,docId:[mJ("docs.tech.docs-generator")]},payload:X3X})});var J3X,Y3X,G3X,W3X;var fe6=l$(()=>{Y9();K5();jl();lY();Fk();Ah1();J3X=new W4({name:"DocsArtifact",fields:{path:{type:e.String_unsecure(),isOptional:!1},format:{type:e.String_unsecure(),isOptional:!0},bytes:{type:e.Int_unsecure(),isOptional:!0},kind:{type:e.String_unsecure(),isOptional:!0}}}),Y3X=new W4({name:"DocsGenerateInput",fields:{workspaceRoot:{type:e.String_unsecure(),isOptional:!0},outputDir:{type:e.String_unsecure(),isOptional:!0},version:{type:e.String_unsecure(),isOptional:!0},formats:{type:e.String_unsecure(),isOptional:!0,isArray:!0},includeInternal:{type:e.Boolean(),isOptional:!0},includeExperimental:{type:e.Boolean(),isOptional:!0},contractFilter:{type:e.String_unsecure(),isOptional:!0},docblockFilter:{type:e.String_unsecure(),isOptional:!0},dryRun:{type:e.Boolean(),isOptional:!0}}}),G3X=new W4({name:"DocsGenerateOutput",fields:{buildId:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!0},generatedAt:{type:e.DateTime(),isOptional:!1},outputDir:{type:e.String_unsecure(),isOptional:!0},artifacts:{type:J3X,isOptional:!0,isArray:!0},warnings:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),W3X=B9({meta:{key:"docs.generate",title:"Generate Documentation",version:"1.0.0",description:"Generate documentation artifacts from ContractSpecs.",goal:"Produce up-to-date reference docs and guides from specs and DocBlocks.",context:"Used by CLI and CI to keep docs in sync with contract definitions.",domain:aD,owners:tD,tags:[...sD,"generation"],stability:eD,docId:[mJ("docs.tech.docs-generator")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:Y3X,output:G3X,errors:{OUTPUT_WRITE_FAILED:{description:"Failed to write generated docs output.",http:500,when:"The generator cannot persist artifacts to the output path."}}},policy:{auth:"admin",pii:[]},sideEffects:{emits:[{ref:Dh1.meta,when:"Docs generation completes successfully."}]}})});var Q3X,Vh1;var Fh1=l$(()=>{Y9();EM();jl();lY();Fk();Q3X=new W4({name:"DocsPublishedPayload",fields:{publishId:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!0},environment:{type:e.String_unsecure(),isOptional:!0},url:{type:e.String_unsecure(),isOptional:!0},publishedAt:{type:e.DateTime(),isOptional:!1},status:{type:e.String_unsecure(),isOptional:!0},warnings:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),Vh1=QJ({meta:{key:"docs.published",version:"1.0.0",description:"Emitted when documentation is published.",domain:aD,owners:tD,tags:[...sD,"publish"],stability:eD,docId:[mJ("docs.tech.docs-publish")]},payload:Q3X})});var Z3X,z3X,U3X;var ye6=l$(()=>{Y9();K5();jl();lY();Fk();Fh1();Z3X=new W4({name:"DocsPublishInput",fields:{buildId:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!0},environment:{type:e.String_unsecure(),isOptional:!0},deployTarget:{type:e.String_unsecure(),isOptional:!0},artifactPath:{type:e.String_unsecure(),isOptional:!0},dryRun:{type:e.Boolean(),isOptional:!0},notes:{type:e.String_unsecure(),isOptional:!0}}}),z3X=new W4({name:"DocsPublishOutput",fields:{publishId:{type:e.String_unsecure(),isOptional:!1},publishedAt:{type:e.DateTime(),isOptional:!1},url:{type:e.String_unsecure(),isOptional:!0},status:{type:e.String_unsecure(),isOptional:!0},warnings:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),U3X=B9({meta:{key:"docs.publish",title:"Publish Documentation",version:"1.0.0",description:"Publish generated documentation artifacts.",goal:"Deploy docs to the public docs surface with consistent versioning.",context:"Used by release pipelines to push generated docs to hosting targets.",domain:aD,owners:tD,tags:[...sD,"publish"],stability:eD,docId:[mJ("docs.tech.docs-publish")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:Z3X,output:z3X,errors:{DEPLOY_FAILED:{description:"Failed to deploy documentation artifacts.",http:500,when:"The docs publish step fails to deploy to the target host."}}},policy:{auth:"admin",pii:[]},sideEffects:{emits:[{ref:Vh1.meta,when:"Docs publish completes successfully."}]}})});var wh1=l$(()=>{fe6();ye6()});var ge6,H3X,K3X,Vx$;var AC0=l$(()=>{Y9();K5();jl();lY();Fk();ge6=new W4({name:"DocSummary",fields:{id:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!1},summary:{type:e.String_unsecure(),isOptional:!0},route:{type:e.String_unsecure(),isOptional:!0},visibility:{type:e.String_unsecure(),isOptional:!0},kind:{type:e.String_unsecure(),isOptional:!0},version:{type:e.String_unsecure(),isOptional:!0},tags:{type:e.String_unsecure(),isOptional:!0,isArray:!0}}}),H3X=new W4({name:"DocsIndexInput",fields:{query:{type:e.String_unsecure(),isOptional:!0},tag:{type:e.String_unsecure(),isOptional:!0,isArray:!0},visibility:{type:e.String_unsecure(),isOptional:!0},kind:{type:e.String_unsecure(),isOptional:!0},limit:{type:e.Int_unsecure(),isOptional:!0},offset:{type:e.Int_unsecure(),isOptional:!0}}}),K3X=new W4({name:"DocsIndexOutput",fields:{items:{type:ge6,isOptional:!0,isArray:!0},docs:{type:ge6,isOptional:!1,isArray:!0},total:{type:e.Int_unsecure(),isOptional:!0},nextOffset:{type:e.Int_unsecure(),isOptional:!0}}}),Vx$=fJ({meta:{key:"docs_search",title:"Docs Index",version:"1.0.0",description:"Search and filter DocBlocks by query, tag, or visibility.",goal:"Provide a consistent index of documentation entries for UI and MCP.",context:"Used by docs surfaces to list and filter DocBlocks without coupling to storage.",domain:aD,owners:tD,tags:[...sD,"search","index"],stability:eD,docId:[mJ("docs.tech.docs-search")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:H3X,output:K3X},policy:{auth:"anonymous",pii:[]}})});var O3X,B3X,q3X,VC0;var Ih1=l$(()=>{Y9();K5();jl();lY();Fk();O3X=new W4({name:"ContractReferenceInput",fields:{key:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!0},type:{type:e.String_unsecure(),isOptional:!0},format:{type:e.String_unsecure(),isOptional:!0},includeSchema:{type:e.Boolean(),isOptional:!0}}}),B3X=new W4({name:"ContractReference",fields:{key:{type:e.String_unsecure(),isOptional:!1},version:{type:e.String_unsecure(),isOptional:!1},type:{type:e.String_unsecure(),isOptional:!1},title:{type:e.String_unsecure(),isOptional:!0},description:{type:e.String_unsecure(),isOptional:!0},markdown:{type:e.String_unsecure(),isOptional:!0},route:{type:e.String_unsecure(),isOptional:!0},schema:{type:e.JSONObject(),isOptional:!0},policy:{type:e.JSONObject(),isOptional:!0},tags:{type:e.String_unsecure(),isOptional:!0,isArray:!0},owners:{type:e.String_unsecure(),isOptional:!0,isArray:!0},stability:{type:e.String_unsecure(),isOptional:!0}}}),q3X=new W4({name:"ContractReferenceOutput",fields:{reference:{type:B3X,isOptional:!1}}}),VC0=fJ({meta:{key:"docs.contract.reference",title:"Contract Reference",version:"1.0.0",description:"Resolve a contract into a documentation-ready reference.",goal:"Expose a canonical reference view for any ContractSpec surface.",context:"Used by docs generators and UI to render consistent reference pages.",domain:aD,owners:tD,tags:[...sD,"reference"],stability:eD,docId:[mJ("docs.tech.docs-reference")]},capability:{key:"docs.system",version:"1.0.0"},io:{input:O3X,output:q3X},policy:{auth:"anonymous",pii:[]}})});var Mh1=l$(()=>{AC0();Ih1()});var Lh1=l$(()=>{Ah1();Fh1()});var RVJ;var he6=l$(()=>{bf();Fk();RVJ=vV({meta:{key:"docs.system",version:"1.0.0",kind:"ui",title:"Documentation System",description:"End-to-end docs generation, indexing, and presentation.",domain:aD,owners:tD,tags:[...sD,"system"],stability:eD},provides:[{surface:"operation",key:"docs.generate",version:"1.0.0",description:"Generate documentation artifacts."},{surface:"operation",key:"docs.publish",version:"1.0.0",description:"Publish documentation artifacts."},{surface:"operation",key:"docs_search",version:"1.0.0",description:"Index and search DocBlocks."},{surface:"operation",key:"docs.contract.reference",version:"1.0.0",description:"Resolve contract references for docs."},{surface:"event",key:"docs.generated",version:"1.0.0",description:"Docs generation completed."},{surface:"event",key:"docs.published",version:"1.0.0",description:"Docs publish completed."},{surface:"presentation",key:"docs.layout",version:"1.0.0",description:"Docs layout presentation."},{surface:"presentation",key:"docs.reference.page",version:"1.0.0",description:"Docs reference page presentation."}]})});var me6=l$(()=>{he6()});var D3X;var ue6=l$(()=>{Hx$();jl();lY();Fk();D3X=kz({meta:{key:"docs.layout",title:"Docs Layout",version:"1.0.0",description:"Shared layout shell for documentation pages.",goal:"Provide consistent navigation, layout, and docs UI scaffolding.",context:"Used by web docs surfaces to render DocBlock-based content.",domain:aD,owners:tD,tags:[...sD,"layout"],stability:eD,docId:[mJ("docs.tech.docs-system")]},capability:{key:"docs.system",version:"1.0.0"},source:{type:"component",framework:"react",componentKey:"docsLayout"},targets:["react"]})});var A3X;var de6=l$(()=>{Hx$();jl();lY();Fk();A3X=kz({meta:{key:"docs.reference.page",title:"Docs Reference Page",version:"1.0.0",description:"Reference page layout for contract documentation.",goal:"Render contract references with consistent metadata and formatting.",context:"Used by docs surfaces to present contract reference content and schemas.",domain:aD,owners:tD,tags:[...sD,"reference"],stability:eD,docId:[mJ("docs.tech.docs-reference")]},capability:{key:"docs.system",version:"1.0.0"},source:{type:"component",framework:"react",componentKey:"docsReferencePage"},targets:["react","markdown"]})});var Ph1=l$(()=>{ue6();de6()});var V3X,F3X;var ce6=l$(()=>{Y9();Ux$();jl();lY();Fk();V3X=new W4({name:"DocsSearchFormModel",fields:{query:{type:e.String_unsecure(),isOptional:!0},visibility:{type:e.String_unsecure(),isOptional:!0},kind:{type:e.String_unsecure(),isOptional:!0}}}),F3X=R4$({meta:{key:"docs_search.form",title:"Docs Search",version:"1.0.0",description:"Search form for documentation discovery.",domain:aD,owners:tD,tags:[...sD,"search"],stability:eD,docId:[mJ("docs.tech.docs-search")]},model:V3X,fields:[{kind:"text",name:"query",labelI18n:"Search",placeholderI18n:"Search docs"},{kind:"select",name:"visibility",labelI18n:"Visibility",options:{kind:"static",options:[{labelI18n:"Public",value:"public"},{labelI18n:"Internal",value:"internal"},{labelI18n:"Mixed",value:"mixed"}]}},{kind:"select",name:"kind",labelI18n:"Kind",options:{kind:"static",options:[{labelI18n:"Goal",value:"goal"},{labelI18n:"How",value:"how"},{labelI18n:"Usage",value:"usage"},{labelI18n:"Reference",value:"reference"},{labelI18n:"FAQ",value:"faq"},{labelI18n:"Changelog",value:"changelog"}]}}],actions:[{key:"search",labelI18n:"Search"}],policy:{flags:[],pii:[]}})});var Rh1=l$(()=>{ce6()});var w3X;var le6=l$(()=>{v2$();jl();lY();Fk();AC0();w3X=EE({meta:{key:"docs.index.view",title:"Docs Index",version:"1.0.0",description:"List and filter documentation entries.",domain:aD,owners:tD,tags:[...sD,"index"],stability:eD,entity:"docs",docId:[mJ("docs.tech.docs-search")]},source:{primary:{key:Vx$.meta.key,version:Vx$.meta.version}},view:{kind:"list",fields:[{key:"id",label:"ID",dataPath:"id"},{key:"title",label:"Title",dataPath:"title"},{key:"summary",label:"Summary",dataPath:"summary"},{key:"route",label:"Route",dataPath:"route"},{key:"tags",label:"Tags",dataPath:"tags",format:"badge"},{key:"kind",label:"Kind",dataPath:"kind"},{key:"visibility",label:"Visibility",dataPath:"visibility"}],primaryField:"title",secondaryFields:["summary","route"],filters:[{key:"query",label:"Search",field:"query",type:"search"},{key:"visibility",label:"Visibility",field:"visibility",type:"enum",options:[{value:"public",label:"Public"},{value:"internal",label:"Internal"},{value:"mixed",label:"Mixed"}]},{key:"kind",label:"Kind",field:"kind",type:"enum",options:[{value:"goal",label:"Goal"},{value:"how",label:"How"},{value:"usage",label:"Usage"},{value:"reference",label:"Reference"},{value:"faq",label:"FAQ"},{value:"changelog",label:"Changelog"}]}]},policy:{flags:[],pii:[]}})});var I3X;var pe6=l$(()=>{v2$();jl();lY();Fk();Ih1();I3X=EE({meta:{key:"docs.contract.reference.view",title:"Contract Reference",version:"1.0.0",description:"Detail view for a single contract reference.",domain:aD,owners:tD,tags:[...sD,"reference"],stability:eD,entity:"contract-reference",docId:[mJ("docs.tech.docs-reference")]},source:{primary:{key:VC0.meta.key,version:VC0.meta.version}},view:{kind:"detail",fields:[{key:"key",label:"Key",dataPath:"reference.key"},{key:"version",label:"Version",dataPath:"reference.version"},{key:"type",label:"Type",dataPath:"reference.type"},{key:"title",label:"Title",dataPath:"reference.title"},{key:"description",label:"Description",dataPath:"reference.description",format:"markdown"},{key:"tags",label:"Tags",dataPath:"reference.tags"},{key:"owners",label:"Owners",dataPath:"reference.owners"},{key:"stability",label:"Stability",dataPath:"reference.stability"}],primaryField:"title",secondaryFields:["description"]},policy:{flags:[],pii:[]}})});var M3X;var ie6=l$(()=>{v2$();jl();lY();Fk();AC0();M3X=EE({meta:{key:"docs.examples.catalog.view",title:"Examples Catalog",version:"1.0.0",description:"Catalog view of ContractSpec examples and demos.",domain:aD,owners:tD,tags:[...sD,"examples"],stability:eD,entity:"docs-examples",docId:[mJ("docs.tech.docs-examples")]},source:{primary:{key:Vx$.meta.key,version:Vx$.meta.version}},view:{kind:"grid",fields:[{key:"id",label:"ID",dataPath:"id"},{key:"title",label:"Title",dataPath:"title"},{key:"summary",label:"Summary",dataPath:"summary"},{key:"route",label:"Route",dataPath:"route"},{key:"tags",label:"Tags",dataPath:"tags",format:"badge"}],primaryField:"title",secondaryFields:["summary"],filters:[{key:"query",label:"Search",field:"query",type:"search"},{key:"tags",label:"Tags",field:"tag",type:"enum",options:[{value:"examples",label:"Examples"},{value:"templates",label:"Templates"},{value:"sandbox",label:"Sandbox"}]}]},policy:{flags:[],pii:[]}})});var Nh1=l$(()=>{le6();pe6();ie6()});var ne6=l$(()=>{wh1();Mh1();Lh1();Ph1();Rh1();Nh1()});var jFJ;var re6=l$(()=>{yp();Fk();jFJ=WH({meta:{key:"platform.docs",version:"1.0.0",title:"Documentation System",description:"Generate, publish, search, and reference contract documentation and DocBlocks",domain:aD,owners:tD,tags:[...sD],stability:eD},operations:[{key:"docs.generate",version:"1.0.0"},{key:"docs.publish",version:"1.0.0"},{key:"docs_search",version:"1.0.0"},{key:"docs.contract.reference",version:"1.0.0"}],events:[{key:"docs.generated",version:"1.0.0"},{key:"docs.published",version:"1.0.0"}],presentations:[{key:"docs.layout",version:"1.0.0"},{key:"docs.reference.page",version:"1.0.0"}],capabilities:{provides:[{key:"docs.system",version:"1.0.0"}]},dataViews:[{key:"docs.index.view",version:"1.0.0"},{key:"docs.contract.reference.view",version:"1.0.0"},{key:"docs.examples.catalog.view",version:"1.0.0"}],forms:[{key:"docs_search.form",version:"1.0.0"}]})});var L3X;var oe6=l$(()=>{lY();L3X=[{id:"docs.tech.contracts.presentations",title:"Presentations — Unified Descriptor & Transform Engine",summary:"How PresentationSpec and TransformEngine keep docs/renderers consistent.",visibility:"public",route:"/docs/tech/contracts/presentations",kind:"reference",tags:["presentations","docs","mcp"],body:`## Presentations V2 — Unified Descriptor & Transform Engine
|
|
45105
45105
|
|
|
45106
45106
|
### Purpose
|
|
45107
45107
|
|
|
@@ -45863,7 +45863,7 @@ The Next.js proxy/middleware is used for **redirect decisions only**. It must no
|
|
|
45863
45863
|
- \`getCookieCache(request)\`
|
|
45864
45864
|
|
|
45865
45865
|
These checks are intentionally optimistic and should only gate routing. Full authorization must still be enforced on server-side actions/routes and GraphQL resolvers.
|
|
45866
|
-
`}];YG(E3X)});var C3X;var X$4=l$(()=>{lY();C3X=[{id:"docs.tech.schema.README",title:"Multi‑File Prisma Schema Conventions (per database)",summary:"We adopt Prisma multi‑file schema (GA ≥ v6.7) to organize each database’s models by domain and to import core LSSM module schemas locally.",kind:"reference",visibility:"public",route:"/docs/tech/schema/README",tags:["tech","schema","README"],body:'# Multi‑File Prisma Schema Conventions (per database)\n\nWe adopt Prisma multi‑file schema (GA ≥ v6.7) to organize each database’s models by domain and to import core LSSM module schemas locally.\n\nCanonical layout per DB:\n\n```\nprisma/\n schema/\n main.prisma # datasource + generators only\n imported/\n lssm_sigil/*.prisma # imported models/enums only (no datasource/generator)\n lssm_content/*.prisma # idem\n <domain>/*.prisma # vertical‑specific models split by bounded context\n```\n\nNotes:\n\n- Imported files contain only `model` and `enum` blocks (strip `datasource`/`generator`).\n- Preserve `@@schema("…")` annotations to keep tables in their Postgres schemas; we now explicitly list schemas in `main.prisma` to avoid P1012: `schemas = ["public","lssm_sigil","lssm_content","lssm_featureflags","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`.\n- Use `@contractspec/app.cli-database` CLI: `database import|check|generate|migrate:*|seed` to manage a single DB; `@contractspec/app.cli-databases` orchestrates multiple DBs.\n\n## Typed merger config\n\n- Define imported module list once per DB with a typed config:\n\n```ts\n// prisma-merger.config.ts\nimport { defineMergedPrismaConfig } from \'@contractspec/app.cli-database\';\n\nexport default defineMergedPrismaConfig({\n modules: [\n \'@contractspec/app.cli-database-sigil\',\n \'@contractspec/app.cli-database-content\',\n // ...\n ],\n});\n```\n\n- Then run `database import --target .` (no need to pass `--modules`).\n\n## Prisma Config (prisma.config.ts)\n\nWe use Prisma Config per official docs to point Prisma to the multi-file schema folder and migrations:\n\n```ts\n// prisma.config.ts\nimport path from \'node:path\';\nimport { defineConfig } from \'prisma/config\';\n\nexport default defineConfig({\n schema: path.join(\'prisma\', \'schema\'),\n migrations: { path: path.join(\'prisma\', \'migrations\') },\n});\n```\n\nReference: Prisma blog – Organize Your Prisma Schema into Multiple Files: https://www.prisma.io/blog/organize-your-prisma-schema-with-multi-file-support\n\n---\n\n# LSSM Auth (Sigil) – Models & Integration\n\nThis document tracks the identity models and integration points used by the LSSM Sigil module.\n\n## Models (Prisma `lssm_sigil`)\n\n- `User` – core identity with email, optional phone, role, passkeys, apiKeys\n- `Session` – session tokens and metadata; includes `activeOrganizationId`\n- `Account` – external providers (password, OAuth)\n- `Organization` – tenant boundary; includes `type` additional field\n- `Member`, `Invitation`, `Team`, `TeamMember` – org/teams\n- `Role`, `Permission`, `PolicyBinding` – RBAC\n- `ApiKey`, `Passkey` – programmable access and WebAuthn\n- `SsoProvider` – OIDC/SAML provider configuration (org- or user-scoped)\n- `OAuthApplication`, `OAuthAccessToken`, `OAuthConsent` – first/third-party OAuth\n\nThese mirror STRIT additions so Better Auth advanced plugins (admin, organization, apiKey, passkey, genericOAuth) work uniformly across apps.\n\n## Better Auth (server)\n\nEnabled methods:\n\n- Email & password\n- Phone OTP (Telnyx)\n- Passkey (WebAuthn)\n- API keys\n- Organizations & Teams\n- Generic OAuth (FranceConnect+ via OIDC with JWE/JWS using JOSE)\n\nServer config lives at `packages/lssm/modules/sigil/src/application/services/auth.ts`.\n\n## Clients (Expo / React)\n\nClient config lives at `packages/lssm/modules/sigil/src/presentation/providers/auth/expo.ts` with plugins for admin, passkey, apiKey, organization, phone, genericOAuth.\n\n## Environment Variables\n\nTelnyx (phone OTP):\n\n- `TELNYX_API_KEY`\n- `TELNYX_MESSAGING_PROFILE_ID`\n- `TELNYX_FROM_NUMBER`\n\nFranceConnect+ (prefer LSSM*… but STRIT*… fallbacks are supported):\n\n- `LSSM_FRANCECONNECTPLUS_DISCOVERY_URL`\n- `LSSM_FRANCECONNECTPLUS_CLIENT_ID`\n- `LSSM_FRANCECONNECTPLUS_CLIENT_SECRET`\n- `LSSM_FRANCECONNECTPLUS_ENC_PRIVATE_KEY_PEM` (PKCS8; RSA-OAEP-256)\n\nGeneric:\n\n- `API_URL_IDENTITIES` – base URL for Better Auth server\n- `BETTER_AUTH_SECRET` – server secret\n\nKeep this in sync with code changes to avoid drift.\n\n## HCircle domain splits and auth removal\n\n- Auth/identity models are not defined locally anymore. They come from `@contractspec/app.cli-database-sigil` under the `lssm_sigil` schema.\n- `packages/hcircle/libs/database-coliving/prisma/schema/domain/` is split by domain; newsletter/waiting list lives in `newsletter.prisma` and uses `@@map("waiting_list")`.\n- To avoid collisions with module names, the local event models were renamed to `SocialEvent`, `SocialEventAttendee`, and `SocialEventRecurrence` with `@@map` pointing to existing table names.\n\n---\n\n## Vertical profiles (current)\n\n### STRIT\n\n- prisma-merger modules:\n - `@contractspec/app.cli-database-sigil`, `@contractspec/app.cli-database-content`, `@contractspec/app.cli-database-ops`, `@contractspec/app.cli-database-planning`, `@contractspec/app.cli-database-quill`, `@contractspec/app.cli-database-geoterro`\n- main.prisma schemas:\n - `schemas = ["public","lssm_sigil","lssm_content","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`\n- domain splits (`packages/strit/libs/database/prisma/schema/domain/`):\n - `bookings.prisma` (Booking, StritDocument + links to Content `File` and Sigil `Organization`)\n - `commerce.prisma` (Wholesale models; `sellerId` linked to Sigil `Organization`)\n - `files.prisma` (PublicFile, PublicFileAccessLog; `ownerId`→Organization, `uploadedBy`→User)\n - `geo.prisma` (PublicCountry, PublicAddress, City; links to Spots/Series)\n - `spots.prisma`, `urbanism.prisma`, `analytics.prisma`, `onboarding.prisma`, `referrals.prisma`, `subscriptions.prisma`, `content.prisma`\n- auth models are imported from Sigil (no local auth tables).\n- Back-relations for `Organization` (e.g., `files`, seller relations) are declared in the Sigil module to avoid scattering.\n\n### ARTISANOS\n\n- prisma-merger modules:\n - `@contractspec/app.cli-database-sigil`, `@contractspec/app.cli-database-content`, `@contractspec/app.cli-database-featureflags`, `@contractspec/app.cli-database-ops`, `@contractspec/app.cli-database-planning`, `@contractspec/app.cli-database-quill`, `@contractspec/app.cli-database-geoterro`\n- main.prisma schemas:\n - `schemas = ["public","lssm_sigil","lssm_content","lssm_featureflags","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`\n- domain splits (`packages/artisanos/libs/database-artisan/prisma/schema/domain/`):\n - `sales.prisma` (Client, Quote, QuoteTemplate, Invoice, FollowUps)\n - `subsidies.prisma` (SubsidyProgram, AidApplication, SupportingDocument)\n - `projects.prisma` (Project, ProjectPlanningSettings)\n - `crm.prisma` (OrganizationProfessionalProfile, OrganizationCertification)\n - `professions.prisma`, `products.prisma`, `templates.prisma`, `analytics.prisma`, `onboarding.prisma`, `referrals.prisma`, `subscriptions.prisma`, `files.prisma`\n- auth/organization/team models are provided by Sigil; local legacy copies were removed.\n- Where names collide with Content, local models are prefixed (e.g., `PublicFile`) and use `@@map` to keep existing table names where applicable.\n\n## Schema Dictionary: `@contractspec/lib.schema`\n\n### Purpose\n\nDescribe operation I/O once and generate:\n\n- zod (runtime validation)\n- GraphQL (Pothos types/refs)\n- JSON Schema (via `zod-to-json-schema` or native descriptors)\n\n### Primitives\n\n- **FieldType<T>**: describes a scalar or composite field and carries:\n - `zod` schema for validation\n - optional JSON Schema descriptor\n - optional GraphQL scalar reference/name\n- **SchemaModel**: named object model composed of fields. Exposes helpers:\n - `getZod(): z.ZodObject<ZodShapeFromFields<Fields>> | z.ZodArray<z.ZodObject<...>>`\n - Preserves each field\'s schema, optionality, and array-ness\n - Top-level lists are supported via `config.isArray: true`\n - `getJsonSchema(): JSONSchema7` (export for docs, MCP, forms)\n - `getPothosInput()` (GraphQL input object name)\n\n### Multi-Format Wrappers\n\nUse existing schema definitions from other libraries:\n- `ZodSchemaType`: Wraps a raw Zod schema (`z.infer` becomes the TS type).\n- `JsonSchemaType`: Wraps a JSON Schema object.\n- `GraphQLSchemaType`: Wraps a GraphQL SDL string.\n\n### Conventions\n\n- Name models with PascalCase; suffix with `Input`/`Result` when ambiguous.\n- Use explicit enums for multi-value constants; reuse the same enum across input/output.\n- Define domain enums via `defineEnum(\'Name\', [...])` in the relevant domain package (e.g., `packages/strit/libs/contracts-strit/src/enums/`), not in `ScalarTypeEnum`.\n- Reference those enums in `SchemaModel` fields directly (they expose `getZod`, `getPothos`, `getJsonSchema`).\n\n#### Example (STRIT)\n\n```ts\n// packages/strit/libs/contracts-strit/src/enums/recurrence.ts\nimport { defineEnum } from \'@contractspec/lib.schema\';\nexport const SpotEnum = {\n Weekday: () =>\n defineEnum(\'Weekday\', [\'MO\', \'TU\', \'WE\', \'TH\', \'FR\', \'SA\', \'SU\'] as const),\n RecurrenceFrequency: () =>\n defineEnum(\'RecurrenceFrequency\', [\n \'DAILY\',\n \'WEEKLY\',\n \'MONTHLY\',\n \'YEARLY\',\n ] as const),\n} as const;\n```\n\n```ts\n// usage in contracts\nfrequency: { type: SpotEnum.RecurrenceFrequency(), isOptional: false },\nbyWeekday: { type: SpotEnum.Weekday(), isOptional: true, isArray: true },\n```\n\n- Use `Date` type for temporal values and ensure ISO strings in JSON transports where needed.\n\n### Mapping rules (summary)\n\n- Strings → GraphQL `String`\n- Numbers → `Int` if safe 32-bit integer else `Float`\n- Booleans → `Boolean`\n- Dates → custom `Date` scalar\n- Arrays<T> → list of mapped T (set `isArray: true` on the field)\n- Top-level arrays → set `isArray: true` on the model config\n- Objects → input/output object types with stable field order\n- Unions → supported for output; input unions map to JSON (structural input is not supported by GraphQL)\n\n### JSON Schema export\n\nPrefer `getZod()` + `zod-to-json-schema` for consistency. For advanced cases, provide a custom `getJsonSchema()` on the model.\n\n### Example\n\n```ts\nimport { ScalarTypeEnum, SchemaModel } from \'@contractspec/lib.schema\';\n\n// Nested model\nconst Weekday = new SchemaModel({\n name: \'Weekday\',\n fields: {\n value: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n },\n});\n\n// Parent model with array field and nested object\nconst Rule = new SchemaModel({\n name: \'Rule\',\n fields: {\n timezone: { type: ScalarTypeEnum.TimeZone(), isOptional: false },\n byWeekday: { type: Weekday, isOptional: true, isArray: true },\n },\n});\n\nconst CreateThingInput = new SchemaModel({\n name: \'CreateThingInput\',\n fields: {\n name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n rule: { type: Rule, isOptional: false },\n },\n});\n\n// zod\nconst z = CreateThingInput.getZod();\n```\n'}];YG(C3X)});var T3X;var J$4=l$(()=>{lY();T3X=[{id:"docs.tech.workflows.overview",title:"WorkflowSpec Overview",summary:"WorkflowSpec provides a declarative, versioned format for long-running flows that mix automation and human review, including runtime adapter capabilities/ports for checkpointing and suspend-resume orchestration. Specs stay inside `@contractspec/lib.contracts-spec` (`src/workflow/spec.ts`) so the same definition powers runtime execution, documentation, and future generation.",kind:"reference",visibility:"public",route:"/docs/tech/workflows/overview",tags:["tech","workflows","overview"],body:"# WorkflowSpec Overview\n\n## Purpose\n\nWorkflowSpec provides a declarative, versioned format for long-running flows that mix automation and human review. Specs stay inside `@contractspec/lib.contracts-spec` (`src/workflow/spec.ts`) so the same definition powers runtime execution, documentation, and future generation.\n\n## Core Types\n\n- `WorkflowMeta`: ownership metadata (`title`, `domain`, `owners`, `tags`, `stability`) plus `name` and `version`.\n- `WorkflowDefinition`:\n - `entryStepId?`: optional explicit entry point (defaults to first step).\n - `steps[]`: ordered list of `Step` descriptors.\n - `transitions[]`: directed edges between steps with optional expressions.\n - `sla?`: aggregated timing hints for the overall flow or per-step budgets.\n - `compensation?`: fallback operations executed when a workflow is rolled back or fails.\n- `Step`:\n - `type`: `human`, `automation`, or `decision`.\n - `action`: references either a `ContractSpec` (`operation`) or `FormSpec` (`form`).\n - Optional `guard`, `timeoutMs`, and retry policy (`maxAttempts`, `backoff`, `delayMs`, `maxDelayMs?`).\n - `requiredIntegrations?`: integration slot ids that must be bound before the step may execute.\n - `requiredCapabilities?`: `CapabilityRef[]` that must be enabled in the resolved app config.\n- `Transition`: `from` → `to` with optional `condition` string (simple data expressions).\n\n## Registry & Validation\n\n- `WorkflowRegistry` (`src/workflow/spec.ts`) stores specs by key `<name>.v<version>` and exposes `register`, `list`, and `get`.\n- `validateWorkflowSpec()` (`src/workflow/validation.ts`) checks:\n - Duplicate step IDs.\n - Unknown `from`/`to` transitions.\n - Empty guards/conditions.\n - Reachability from the entry step.\n - Cycles in the graph.\n - Operation/Form references against provided registries.\n- `assertWorkflowSpecValid()` wraps validation and throws `WorkflowValidationError` when errors remain.\n\n## Runtime\n\n- `WorkflowRunner` (`src/workflow/runner.ts`) executes workflows and coordinates steps.\n - `start(name, version?, initialData?)` returns a `workflowId`.\n - `executeStep(workflowId, input?)` runs the current step (automation or human).\n - `getState(workflowId)` retrieves the latest state snapshot.\n - `cancel(workflowId)` marks the workflow as cancelled.\n - `preFlightCheck(name, version?, resolvedConfig?)` evaluates integration/capability requirements before the workflow starts.\n - Throws `WorkflowPreFlightError` if required integration slots are unbound or required capabilities are disabled.\n- `StateStore` (`src/workflow/state.ts`) abstracts persistence. V1 ships with:\n - `InMemoryStateStore` (`src/workflow/adapters/memory-store.ts`) for tests/dev.\n - Placeholder factories for file/database adapters (`adapters/file-adapter.ts`, `adapters/db-adapter.ts`).\n- Guard evaluation: expression guards run through `evaluateExpression()` (`src/workflow/expression.ts`); custom policy guards can be provided via `guardEvaluator`.\n- Events: the runner emits `workflow.started`, `workflow.step_completed`, `workflow.step_failed`, and `workflow.cancelled` through the optional `eventEmitter`.\n- React bindings (`@contractspec/lib.presentation-runtime-react`):\n - `useWorkflow` hook (polls state, exposes `executeStep`, `cancel`, `refresh`).\n - `WorkflowStepper` progress indicator using design-system Stepper.\n - `WorkflowStepRenderer` helper to render human/automation/decision steps with sensible fallbacks.\n\n## Authoring Checklist\n\n1. Reuse existing operations/forms; create new specs when missing.\n2. Prefer explicit `entryStepId` for clarity (especially with decision branches).\n3. Give automation steps an `operation` and human steps a `form` (warnings surface otherwise).\n4. Use short, meaningful step IDs (`submit`, `review`, `finalize`) to simplify analytics.\n5. Keep guard expressions deterministic; complex policy logic should move to PolicySpec (Phase 2).\n\n## Testing\n\n- Add unit tests for new workflows via `assertWorkflowSpecValid`.\n- Use the new Vitest suites (`validation.test.ts`, `expression.test.ts`, `runner.test.ts`) as examples.\n- CLI support will arrive in Phase 1 PR 3 (`contractspec create --type workflow`).\n\n## Tooling\n\n- `contractspec create --type workflow` scaffolds a WorkflowSpec with interactive prompts.\n- `contractspec build <spec.workflow.ts>` generates a runner scaffold (`.runner.ts`) wired to `WorkflowRunner` and the in-memory store.\n- `contractspec validate` understands `.workflow.ts` files and checks core structure (meta, steps, transitions).\n\n## Next Steps (Non-MVP)\n\n- Persistence adapters (database/file) for workflow state (Phase 2).\n- React bindings (`useWorkflow`, `WorkflowStepper`) and presentation-runtime integration (PR 3).\n- Policy engine integration (`guard.type === 'policy'` validated against PolicySpec).\n- Telemetry hooks for step execution metrics.\n\n"}];YG(T3X)});var _3X;var Y$4=l$(()=>{lY();_3X=[{id:"docs.tech.mcp.endpoints",title:"ContractSpec MCP endpoints",summary:"Dedicated MCP servers for docs, CLI usage, and internal development.",kind:"reference",visibility:"mixed",route:"/docs/tech/mcp/endpoints",tags:["mcp","docs","cli","internal"],body:"# ContractSpec MCP endpoints\n\nThree dedicated MCP servers keep AI agents efficient and scoped:\n\n- **Docs MCP**: `/api/mcp/docs` — exposes DocBlocks as resources + presentations. Tool: `docs.search`.\n- **CLI MCP**: `/api/mcp/cli` — surfaces CLI quickstart/reference/README and suggests commands. Tool: `cli.suggestCommand`.\n- **Internal MCP**: `/api/mcp/internal` — internal routing hints, playbook, and example registry access. Tool: `internal.describe`.\n\n### Usage notes\n- Transports are HTTP POST (streamable HTTP); SSE is disabled.\n- Resources are namespaced (`docs://*`, `cli://*`, `internal://*`) and are read-only.\n- Internal MCP also exposes the examples registry via `examples://*` resources:\n - `examples://list?q=<query>`\n - `examples://example/<id>`\n- Prompts mirror each surface (navigator, usage, bootstrap) for quick agent onboarding.\n- GraphQL remains at `/graphql`; health at `/health`.\n\n### Alpic hosting\n- Alpic exposes MCP at `/` (SSE + Streamable HTTP) and `/mcp` (Streamable HTTP).\n- Static UI assets are served at `/assets` from repo `/assets` or build output `dist/assets`.\n- Use the `ALPIC_HOST` environment variable to build absolute asset URLs.\n"}];YG(_3X)});var S3X;var G$4=l$(()=>{lY();S3X=[{id:"docs.tech.vscode.extension",title:"ContractSpec VS Code Extension",summary:"VS Code extension for spec-first development with validation, scaffolding, and MCP integration.",kind:"reference",visibility:"public",route:"/docs/tech/vscode/extension",tags:["vscode","extension","tooling","dx"],body:`# ContractSpec VS Code Extension
|
|
45866
|
+
`}];YG(E3X)});var C3X;var X$4=l$(()=>{lY();C3X=[{id:"docs.tech.schema.README",title:"Multi‑File Prisma Schema Conventions (per database)",summary:"We adopt Prisma multi‑file schema (GA ≥ v6.7) to organize each database’s models by domain and to import core LSSM module schemas locally.",kind:"reference",visibility:"public",route:"/docs/tech/schema/README",tags:["tech","schema","README"],body:'# Multi‑File Prisma Schema Conventions (per database)\n\nWe adopt Prisma multi‑file schema (GA ≥ v6.7) to organize each database’s models by domain and to import core LSSM module schemas locally.\n\nCanonical layout per DB:\n\n```\nprisma/\n schema/\n main.prisma # datasource + generators only\n imported/\n lssm_sigil/*.prisma # imported models/enums only (no datasource/generator)\n lssm_content/*.prisma # idem\n <domain>/*.prisma # vertical‑specific models split by bounded context\n```\n\nNotes:\n\n- Imported files contain only `model` and `enum` blocks (strip `datasource`/`generator`).\n- Preserve `@@schema("…")` annotations to keep tables in their Postgres schemas; we now explicitly list schemas in `main.prisma` to avoid P1012: `schemas = ["public","lssm_sigil","lssm_content","lssm_featureflags","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`.\n- Use `@contractspec/app.cli-database` CLI: `database import|check|generate|migrate:*|seed` to manage a single DB; `@contractspec/app.cli-databases` orchestrates multiple DBs.\n\n## Typed merger config\n\n- Define imported module list once per DB with a typed config:\n\n```ts\n// prisma-merger.config.ts\nimport { defineMergedPrismaConfig } from \'@contractspec/app.cli-database\';\n\nexport default defineMergedPrismaConfig({\n modules: [\n \'@contractspec/app.cli-database-sigil\',\n \'@contractspec/app.cli-database-content\',\n // ...\n ],\n});\n```\n\n- Then run `database import --target .` (no need to pass `--modules`).\n\n## Prisma Config (prisma.config.ts)\n\nWe use Prisma Config per official docs to point Prisma to the multi-file schema folder and migrations:\n\n```ts\n// prisma.config.ts\nimport path from \'node:path\';\nimport { defineConfig } from \'prisma/config\';\n\nexport default defineConfig({\n schema: path.join(\'prisma\', \'schema\'),\n migrations: { path: path.join(\'prisma\', \'migrations\') },\n});\n```\n\nReference: Prisma blog – Organize Your Prisma Schema into Multiple Files: https://www.prisma.io/blog/organize-your-prisma-schema-with-multi-file-support\n\n---\n\n# LSSM Auth (Sigil) – Models & Integration\n\nThis document tracks the identity models and integration points used by the LSSM Sigil module.\n\n## Models (Prisma `lssm_sigil`)\n\n- `User` – core identity with email, optional phone, role, passkeys, apiKeys\n- `Session` – session tokens and metadata; includes `activeOrganizationId`\n- `Account` – external providers (password, OAuth)\n- `Organization` – tenant boundary; includes `type` additional field\n- `Member`, `Invitation`, `Team`, `TeamMember` – org/teams\n- `Role`, `Permission`, `PolicyBinding` – RBAC\n- `ApiKey`, `Passkey` – programmable access and WebAuthn\n- `SsoProvider` – OIDC/SAML provider configuration (org- or user-scoped)\n- `OAuthApplication`, `OAuthAccessToken`, `OAuthConsent` – first/third-party OAuth\n\nThese mirror STRIT additions so Better Auth advanced plugins (admin, organization, apiKey, passkey, genericOAuth) work uniformly across apps.\n\n## Better Auth (server)\n\nEnabled methods:\n\n- Email & password\n- Phone OTP (Telnyx)\n- Passkey (WebAuthn)\n- API keys\n- Organizations & Teams\n- Generic OAuth (FranceConnect+ via OIDC with JWE/JWS using JOSE)\n\nServer config lives at `packages/lssm/modules/sigil/src/application/services/auth.ts`.\n\n## Clients (Expo / React)\n\nClient config lives at `packages/lssm/modules/sigil/src/presentation/providers/auth/expo.ts` with plugins for admin, passkey, apiKey, organization, phone, genericOAuth.\n\n## Environment Variables\n\nTelnyx (phone OTP):\n\n- `TELNYX_API_KEY`\n- `TELNYX_MESSAGING_PROFILE_ID`\n- `TELNYX_FROM_NUMBER`\n\nFranceConnect+ (prefer LSSM*… but STRIT*… fallbacks are supported):\n\n- `LSSM_FRANCECONNECTPLUS_DISCOVERY_URL`\n- `LSSM_FRANCECONNECTPLUS_CLIENT_ID`\n- `LSSM_FRANCECONNECTPLUS_CLIENT_SECRET`\n- `LSSM_FRANCECONNECTPLUS_ENC_PRIVATE_KEY_PEM` (PKCS8; RSA-OAEP-256)\n\nGeneric:\n\n- `API_URL_IDENTITIES` – base URL for Better Auth server\n- `BETTER_AUTH_SECRET` – server secret\n\nKeep this in sync with code changes to avoid drift.\n\n## HCircle domain splits and auth removal\n\n- Auth/identity models are not defined locally anymore. They come from `@contractspec/app.cli-database-sigil` under the `lssm_sigil` schema.\n- `packages/hcircle/libs/database-coliving/prisma/schema/domain/` is split by domain; newsletter/waiting list lives in `newsletter.prisma` and uses `@@map("waiting_list")`.\n- To avoid collisions with module names, the local event models were renamed to `SocialEvent`, `SocialEventAttendee`, and `SocialEventRecurrence` with `@@map` pointing to existing table names.\n\n---\n\n## Vertical profiles (current)\n\n### STRIT\n\n- prisma-merger modules:\n - `@contractspec/app.cli-database-sigil`, `@contractspec/app.cli-database-content`, `@contractspec/app.cli-database-ops`, `@contractspec/app.cli-database-planning`, `@contractspec/app.cli-database-quill`, `@contractspec/app.cli-database-geoterro`\n- main.prisma schemas:\n - `schemas = ["public","lssm_sigil","lssm_content","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`\n- domain splits (`packages/strit/libs/database/prisma/schema/domain/`):\n - `bookings.prisma` (Booking, StritDocument + links to Content `File` and Sigil `Organization`)\n - `commerce.prisma` (Wholesale models; `sellerId` linked to Sigil `Organization`)\n - `files.prisma` (PublicFile, PublicFileAccessLog; `ownerId`→Organization, `uploadedBy`→User)\n - `geo.prisma` (PublicCountry, PublicAddress, City; links to Spots/Series)\n - `spots.prisma`, `urbanism.prisma`, `analytics.prisma`, `onboarding.prisma`, `referrals.prisma`, `subscriptions.prisma`, `content.prisma`\n- auth models are imported from Sigil (no local auth tables).\n- Back-relations for `Organization` (e.g., `files`, seller relations) are declared in the Sigil module to avoid scattering.\n\n### ARTISANOS\n\n- prisma-merger modules:\n - `@contractspec/app.cli-database-sigil`, `@contractspec/app.cli-database-content`, `@contractspec/app.cli-database-featureflags`, `@contractspec/app.cli-database-ops`, `@contractspec/app.cli-database-planning`, `@contractspec/app.cli-database-quill`, `@contractspec/app.cli-database-geoterro`\n- main.prisma schemas:\n - `schemas = ["public","lssm_sigil","lssm_content","lssm_featureflags","lssm_ops","lssm_planning","lssm_quill","lssm_geoterro"]`\n- domain splits (`packages/artisanos/libs/database-artisan/prisma/schema/domain/`):\n - `sales.prisma` (Client, Quote, QuoteTemplate, Invoice, FollowUps)\n - `subsidies.prisma` (SubsidyProgram, AidApplication, SupportingDocument)\n - `projects.prisma` (Project, ProjectPlanningSettings)\n - `crm.prisma` (OrganizationProfessionalProfile, OrganizationCertification)\n - `professions.prisma`, `products.prisma`, `templates.prisma`, `analytics.prisma`, `onboarding.prisma`, `referrals.prisma`, `subscriptions.prisma`, `files.prisma`\n- auth/organization/team models are provided by Sigil; local legacy copies were removed.\n- Where names collide with Content, local models are prefixed (e.g., `PublicFile`) and use `@@map` to keep existing table names where applicable.\n\n## Schema Dictionary: `@contractspec/lib.schema`\n\n### Purpose\n\nDescribe operation I/O once and generate:\n\n- zod (runtime validation)\n- GraphQL (Pothos types/refs)\n- JSON Schema (via `zod-to-json-schema` or native descriptors)\n\n### Primitives\n\n- **FieldType<T>**: describes a scalar or composite field and carries:\n - `zod` schema for validation\n - optional JSON Schema descriptor\n - optional GraphQL scalar reference/name\n- **SchemaModel**: named object model composed of fields. Exposes helpers:\n - `getZod(): z.ZodObject<ZodShapeFromFields<Fields>> | z.ZodArray<z.ZodObject<...>>`\n - Preserves each field\'s schema, optionality, and array-ness\n - Top-level lists are supported via `config.isArray: true`\n - `getJsonSchema(): JSONSchema7` (export for docs, MCP, forms)\n - `getPothosInput()` (GraphQL input object name)\n\n### Multi-Format Wrappers\n\nUse existing schema definitions from other libraries:\n- `ZodSchemaType`: Wraps a raw Zod schema (`z.infer` becomes the TS type).\n- `JsonSchemaType`: Wraps a JSON Schema object.\n- `GraphQLSchemaType`: Wraps a GraphQL SDL string.\n\n### Conventions\n\n- Name models with PascalCase; suffix with `Input`/`Result` when ambiguous.\n- Use explicit enums for multi-value constants; reuse the same enum across input/output.\n- Define domain enums via `defineEnum(\'Name\', [...])` in the relevant domain package (e.g., `packages/strit/libs/contracts-strit/src/enums/`), not in `ScalarTypeEnum`.\n- Reference those enums in `SchemaModel` fields directly (they expose `getZod`, `getPothos`, `getJsonSchema`).\n\n#### Example (STRIT)\n\n```ts\n// packages/strit/libs/contracts-strit/src/enums/recurrence.ts\nimport { defineEnum } from \'@contractspec/lib.schema\';\nexport const SpotEnum = {\n Weekday: () =>\n defineEnum(\'Weekday\', [\'MO\', \'TU\', \'WE\', \'TH\', \'FR\', \'SA\', \'SU\'] as const),\n RecurrenceFrequency: () =>\n defineEnum(\'RecurrenceFrequency\', [\n \'DAILY\',\n \'WEEKLY\',\n \'MONTHLY\',\n \'YEARLY\',\n ] as const),\n} as const;\n```\n\n```ts\n// usage in contracts\nfrequency: { type: SpotEnum.RecurrenceFrequency(), isOptional: false },\nbyWeekday: { type: SpotEnum.Weekday(), isOptional: true, isArray: true },\n```\n\n- Use `Date` type for temporal values and ensure ISO strings in JSON transports where needed.\n\n### Mapping rules (summary)\n\n- Strings → GraphQL `String`\n- Numbers → `Int` if safe 32-bit integer else `Float`\n- Booleans → `Boolean`\n- Dates → custom `Date` scalar\n- Arrays<T> → list of mapped T (set `isArray: true` on the field)\n- Top-level arrays → set `isArray: true` on the model config\n- Objects → input/output object types with stable field order\n- Unions → supported for output; input unions map to JSON (structural input is not supported by GraphQL)\n\n### JSON Schema export\n\nPrefer `getZod()` + `zod-to-json-schema` for consistency. For advanced cases, provide a custom `getJsonSchema()` on the model.\n\n### Example\n\n```ts\nimport { ScalarTypeEnum, SchemaModel } from \'@contractspec/lib.schema\';\n\n// Nested model\nconst Weekday = new SchemaModel({\n name: \'Weekday\',\n fields: {\n value: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n },\n});\n\n// Parent model with array field and nested object\nconst Rule = new SchemaModel({\n name: \'Rule\',\n fields: {\n timezone: { type: ScalarTypeEnum.TimeZone(), isOptional: false },\n byWeekday: { type: Weekday, isOptional: true, isArray: true },\n },\n});\n\nconst CreateThingInput = new SchemaModel({\n name: \'CreateThingInput\',\n fields: {\n name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },\n rule: { type: Rule, isOptional: false },\n },\n});\n\n// zod\nconst z = CreateThingInput.getZod();\n```\n'}];YG(C3X)});var T3X;var J$4=l$(()=>{lY();T3X=[{id:"docs.tech.workflows.overview",title:"WorkflowSpec Overview",summary:"WorkflowSpec provides a declarative, versioned format for long-running flows that mix automation and human review, including runtime adapter capabilities/ports for checkpointing and suspend-resume orchestration. Specs stay inside `@contractspec/lib.contracts-spec` (`src/workflow/spec.ts`) so the same definition powers runtime execution, documentation, and future generation.",kind:"reference",visibility:"public",route:"/docs/tech/workflows/overview",tags:["tech","workflows","overview"],body:"# WorkflowSpec Overview\n\n## Purpose\n\nWorkflowSpec provides a declarative, versioned format for long-running flows that mix automation and human review. Specs stay inside `@contractspec/lib.contracts-spec` (`src/workflow/spec.ts`) so the same definition powers runtime execution, documentation, and future generation.\n\n## Core Types\n\n- `WorkflowMeta`: ownership metadata (`title`, `domain`, `owners`, `tags`, `stability`) plus `name` and `version`.\n- `WorkflowDefinition`:\n - `entryStepId?`: optional explicit entry point (defaults to first step).\n - `steps[]`: ordered list of `Step` descriptors.\n - `transitions[]`: directed edges between steps with optional expressions.\n - `sla?`: aggregated timing hints for the overall flow or per-step budgets.\n - `compensation?`: fallback operations executed when a workflow is rolled back or fails.\n- `Step`:\n - `type`: `human`, `automation`, or `decision`.\n - `action`: references either a `ContractSpec` (`operation`) or `FormSpec` (`form`).\n - Optional `guard`, `timeoutMs`, and retry policy (`maxAttempts`, `backoff`, `delayMs`, `maxDelayMs?`).\n - `requiredIntegrations?`: integration slot ids that must be bound before the step may execute.\n - `requiredCapabilities?`: `CapabilityRef[]` that must be enabled in the resolved app config.\n- `Transition`: `from` → `to` with optional `condition` string (simple data expressions).\n\n## Registry & Validation\n\n- `WorkflowRegistry` (`src/workflow/spec.ts`) stores specs by key `<name>.v<version>` and exposes `register`, `list`, and `get`.\n- `validateWorkflowSpec()` (`src/workflow/validation.ts`) checks:\n - Duplicate step IDs.\n - Unknown `from`/`to` transitions.\n - Empty guards/conditions.\n - Reachability from the entry step.\n - Cycles in the graph.\n - Operation/Form references against provided registries.\n- `assertWorkflowSpecValid()` wraps validation and throws `WorkflowValidationError` when errors remain.\n\n## Runtime\n\n- `WorkflowRunner` (`src/workflow/runner.ts`) executes workflows and coordinates steps.\n - `start(name, version?, initialData?)` returns a `workflowId`.\n - `executeStep(workflowId, input?)` runs the current step (automation or human).\n - `getState(workflowId)` retrieves the latest state snapshot.\n - `cancel(workflowId)` marks the workflow as cancelled.\n - `preFlightCheck(name, version?, resolvedConfig?)` evaluates integration/capability requirements before the workflow starts.\n - Throws `WorkflowPreFlightError` if required integration slots are unbound or required capabilities are disabled.\n- `StateStore` (`src/workflow/state.ts`) abstracts persistence. V1 ships with:\n - `InMemoryStateStore` (`src/workflow/adapters/memory-store.ts`) for tests/dev.\n - Placeholder factories for file/database adapters (`adapters/file-adapter.ts`, `adapters/db-adapter.ts`).\n- Guard evaluation: expression guards run through `evaluateExpression()` (`src/workflow/expression.ts`); custom policy guards can be provided via `guardEvaluator`.\n- Events: the runner emits `workflow.started`, `workflow.step_completed`, `workflow.step_failed`, and `workflow.cancelled` through the optional `eventEmitter`.\n- React bindings (`@contractspec/lib.presentation-runtime-react`):\n - `useWorkflow` hook (polls state, exposes `executeStep`, `cancel`, `refresh`).\n - `WorkflowStepper` progress indicator using design-system Stepper.\n - `WorkflowStepRenderer` helper to render human/automation/decision steps with sensible fallbacks.\n\n## Authoring Checklist\n\n1. Reuse existing operations/forms; create new specs when missing.\n2. Prefer explicit `entryStepId` for clarity (especially with decision branches).\n3. Give automation steps an `operation` and human steps a `form` (warnings surface otherwise).\n4. Use short, meaningful step IDs (`submit`, `review`, `finalize`) to simplify analytics.\n5. Keep guard expressions deterministic; complex policy logic should move to PolicySpec (Phase 2).\n\n## Testing\n\n- Add unit tests for new workflows via `assertWorkflowSpecValid`.\n- Use the new Vitest suites (`validation.test.ts`, `expression.test.ts`, `runner.test.ts`) as examples.\n- CLI support will arrive in Phase 1 PR 3 (`contractspec create --type workflow`).\n\n## Tooling\n\n- `contractspec create --type workflow` scaffolds a WorkflowSpec with interactive prompts.\n- `contractspec build <spec.workflow.ts>` generates a runner scaffold (`.runner.ts`) wired to `WorkflowRunner` and the in-memory store.\n- `contractspec validate` understands `.workflow.ts` files and checks core structure (meta, steps, transitions).\n\n## Next Steps (Non-MVP)\n\n- Persistence adapters (database/file) for workflow state (Phase 2).\n- React bindings (`useWorkflow`, `WorkflowStepper`) and presentation-runtime integration (PR 3).\n- Policy engine integration (`guard.type === 'policy'` validated against PolicySpec).\n- Telemetry hooks for step execution metrics.\n\n"}];YG(T3X)});var _3X;var Y$4=l$(()=>{lY();_3X=[{id:"docs.tech.mcp.endpoints",title:"ContractSpec MCP endpoints",summary:"Dedicated MCP servers for docs, CLI usage, and internal development.",kind:"reference",visibility:"mixed",route:"/docs/tech/mcp/endpoints",tags:["mcp","docs","cli","internal"],body:"# ContractSpec MCP endpoints\n\nThree dedicated MCP servers keep AI agents efficient and scoped:\n\n- **Docs MCP**: `/api/mcp/docs` — exposes DocBlocks as resources + presentations. Tool: `docs_search`.\n- **CLI MCP**: `/api/mcp/cli` — surfaces CLI quickstart/reference/README and suggests commands. Tool: `cli_suggestCommand`.\n- **Internal MCP**: `/api/mcp/internal` — internal routing hints, playbook, and example registry access. Tool: `internal_describe`.\n\n### Usage notes\n- Transports are HTTP POST (streamable HTTP); SSE is disabled.\n- Resources are namespaced (`docs://*`, `cli://*`, `internal://*`) and are read-only.\n- Internal MCP also exposes the examples registry via `examples://*` resources:\n - `examples://list?q=<query>`\n - `examples://example/<id>`\n- Prompts mirror each surface (navigator, usage, bootstrap) for quick agent onboarding.\n- GraphQL remains at `/graphql`; health at `/health`.\n\n### Alpic hosting\n- Alpic exposes MCP at `/` (SSE + Streamable HTTP) and `/mcp` (Streamable HTTP).\n- Static UI assets are served at `/assets` from repo `/assets` or build output `dist/assets`.\n- Use the `ALPIC_HOST` environment variable to build absolute asset URLs.\n"}];YG(_3X)});var S3X;var G$4=l$(()=>{lY();S3X=[{id:"docs.tech.vscode.extension",title:"ContractSpec VS Code Extension",summary:"VS Code extension for spec-first development with validation, scaffolding, and MCP integration.",kind:"reference",visibility:"public",route:"/docs/tech/vscode/extension",tags:["vscode","extension","tooling","dx"],body:`# ContractSpec VS Code Extension
|
|
45867
45867
|
|
|
45868
45868
|
The ContractSpec VS Code extension provides spec-first development tooling directly in your editor.
|
|
45869
45869
|
|
|
@@ -50909,5 +50909,5 @@ ${_}`}).join(`
|
|
|
50909
50909
|
❌ Error:`),J instanceof Error?J.message:String(J)),process.exit(1)}});var FJ9=BU.command("regenerator").description("Operate the Regenerator daemon").argument("<blueprint-file>","Path to AppBlueprintSpec file").argument("<tenant-file>","Path to TenantAppConfig file").argument("<rules-file>","Path to module exporting regenerator rules").argument("<sink-file>",'Path to module exporting a proposal sink (use "auto" with --executor)').option("-p, --poll-interval <ms>","Polling interval in ms (default 60000)",($)=>Number.parseInt($,10)).option("-b, --batch-duration <ms>","Lookback duration in ms (default 300000)",($)=>Number.parseInt($,10)).option("--once","Run a single evaluation cycle then exit").option("--contexts <path>","Optional file exporting an array of RegenerationContext overrides").option("--executor <path>",'Module exporting a ProposalExecutor instance, factory, or deps (required when sink is "auto")').option("--dry-run","Execute proposals in dry-run mode when using executor sink").action(async($,J,G,Q,z)=>{try{let H=await aB(),q=ES(H,z);await LX4($,J,G,Q,z,q)}catch(H){console.error(O0.red(`
|
|
50910
50910
|
❌ Error:`),H instanceof Error?H.message:String(H)),process.exit(1)}});$2(FJ9,Z8$);BU.addCommand($2(kN4,Jy));function lN4(){BU.parse()}lN4();
|
|
50911
50911
|
|
|
50912
|
-
//# debugId=
|
|
50912
|
+
//# debugId=6096EE74960A4D4764756E2164756E21
|
|
50913
50913
|
//# sourceMappingURL=cli.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/app.cli-contractspec",
|
|
3
|
-
"version": "3.5.
|
|
3
|
+
"version": "3.5.4",
|
|
4
4
|
"description": "CLI tool for creating, building, and validating contract specifications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -30,17 +30,17 @@
|
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@ai-sdk/anthropic": "3.0.58",
|
|
32
32
|
"@ai-sdk/openai": "3.0.41",
|
|
33
|
-
"@contractspec/bundle.workspace": "3.5.
|
|
34
|
-
"@contractspec/lib.ai-agent": "5.0.
|
|
35
|
-
"@contractspec/lib.ai-providers": "3.5.
|
|
36
|
-
"@contractspec/lib.contracts-spec": "3.5.
|
|
37
|
-
"@contractspec/lib.contracts-transformers": "3.5.
|
|
38
|
-
"@contractspec/lib.plugins": "3.5.
|
|
39
|
-
"@contractspec/lib.schema": "3.5.
|
|
40
|
-
"@contractspec/lib.testing": "3.5.
|
|
41
|
-
"@contractspec/module.ai-chat": "4.1.
|
|
42
|
-
"@contractspec/module.examples": "3.5.
|
|
43
|
-
"@contractspec/module.workspace": "3.5.
|
|
33
|
+
"@contractspec/bundle.workspace": "3.5.4",
|
|
34
|
+
"@contractspec/lib.ai-agent": "5.0.4",
|
|
35
|
+
"@contractspec/lib.ai-providers": "3.5.4",
|
|
36
|
+
"@contractspec/lib.contracts-spec": "3.5.4",
|
|
37
|
+
"@contractspec/lib.contracts-transformers": "3.5.4",
|
|
38
|
+
"@contractspec/lib.plugins": "3.5.4",
|
|
39
|
+
"@contractspec/lib.schema": "3.5.4",
|
|
40
|
+
"@contractspec/lib.testing": "3.5.4",
|
|
41
|
+
"@contractspec/module.ai-chat": "4.1.4",
|
|
42
|
+
"@contractspec/module.examples": "3.5.4",
|
|
43
|
+
"@contractspec/module.workspace": "3.5.4",
|
|
44
44
|
"@inquirer/prompts": "^8.3.0",
|
|
45
45
|
"ai": "6.0.116",
|
|
46
46
|
"chalk": "^5.6.2",
|
|
@@ -51,11 +51,11 @@
|
|
|
51
51
|
"ora": "^9.3.0",
|
|
52
52
|
"typescript": "^5.9.3",
|
|
53
53
|
"zod": "^4.3.5",
|
|
54
|
-
"@contractspec/lib.contracts-integrations": "3.5.
|
|
54
|
+
"@contractspec/lib.contracts-integrations": "3.5.4"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@contractspec/tool.tsdown": "3.5.
|
|
58
|
-
"@contractspec/tool.typescript": "3.5.
|
|
57
|
+
"@contractspec/tool.tsdown": "3.5.4",
|
|
58
|
+
"@contractspec/tool.typescript": "3.5.4",
|
|
59
59
|
"@types/js-yaml": "^4.0.9",
|
|
60
60
|
"@types/node": "^25.3.5",
|
|
61
61
|
"@types/sarif": "^2.1.7",
|