@lssm/bundle.contractspec-workspace 0.0.0-canary-20251215234340 → 0.0.0-canary-20251216023757
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/dist/adapters/fs.js +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/adapters/workspace.js +2 -0
- package/dist/index.js +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/integrity-diagram.js +6 -0
- package/dist/services/integrity.js +1 -0
- package/dist/services/setup/config-generators.js +125 -0
- package/dist/services/setup/file-merger.js +2 -0
- package/dist/services/setup/setup-service.js +1 -0
- package/dist/services/setup/targets/agents-md.js +1 -0
- package/dist/services/setup/targets/cli-config.js +1 -0
- package/dist/services/setup/targets/cursor-rules.js +1 -0
- package/dist/services/setup/targets/mcp-claude.js +1 -0
- package/dist/services/setup/targets/mcp-cursor.js +1 -0
- package/dist/services/setup/targets/vscode-settings.js +1 -0
- package/dist/services/setup/types.js +1 -0
- package/dist/services/workspace-info.js +2 -0
- package/package.json +1 -1
package/dist/adapters/fs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{access as e,mkdir as t,readFile as n,rm as r,stat as i,writeFile as a}from"node:fs/promises";import{basename as o,dirname as s,isAbsolute as c,join as l,relative as u,resolve as d}from"node:path";import{glob as f}from"glob";const p=[`**/*.contracts.ts`,`**/*.event.ts`,`**/*.presentation.ts`,`**/*.workflow.ts`,`**/*.data-view.ts`,`**/*.migration.ts`,`**/*.telemetry.ts`,`**/*.experiment.ts`,`**/*.app-config.ts`,`**/*.integration.ts`,`**/*.knowledge.ts`],m=[`node_modules/**`,`dist/**`,`.turbo/**`];function h(h){let g=h??process.cwd();return{async exists(t){try{return await e(_(t)),!0}catch{return!1}},async readFile(e){return n(_(e),`utf-8`)},async writeFile(e,n){let r=_(e);await t(s(r),{recursive:!0}),await a(r,n,`utf-8`)},async remove(e){await r(_(e),{recursive:!0,force:!0})},async stat(e){let t=await i(_(e));return{size:t.size,isFile:t.isFile(),isDirectory:t.isDirectory(),mtime:t.mtime}},async mkdir(e){await t(_(e),{recursive:!0})},async glob(e){let t=e.patterns??(e.pattern?[e.pattern]:p),n=e.ignore??m,r=[];for(let e of t){let t=await f(e,{cwd:g,ignore:n});r.push(...t)}return Array.from(new Set(r)).sort((e,t)=>e.localeCompare(t))},resolve(...e){let[t,...n]=e;return t?d(g,t,...n):g},dirname(e){return s(e)},basename(e){return o(e)},join(...e){return l(...e)},relative(e,t){return u(e,t)}};function _(e){return c(e)?e:d(g,e)}}export{h as createNodeFsAdapter};
|
|
1
|
+
import{access as e,mkdir as t,readFile as n,rm as r,stat as i,writeFile as a}from"node:fs/promises";import{basename as o,dirname as s,isAbsolute as c,join as l,relative as u,resolve as d}from"node:path";import{glob as f}from"glob";const p=[`**/*.contracts.ts`,`**/*.event.ts`,`**/*.presentation.ts`,`**/*.feature.ts`,`**/*.capability.ts`,`**/*.workflow.ts`,`**/*.data-view.ts`,`**/*.form.ts`,`**/*.migration.ts`,`**/*.telemetry.ts`,`**/*.experiment.ts`,`**/*.app-config.ts`,`**/*.integration.ts`,`**/*.knowledge.ts`,`**/*.policy.ts`,`**/*.test-spec.ts`],m=[`node_modules/**`,`dist/**`,`.turbo/**`];function h(h){let g=h??process.cwd();return{async exists(t){try{return await e(_(t)),!0}catch{return!1}},async readFile(e){return n(_(e),`utf-8`)},async writeFile(e,n){let r=_(e);await t(s(r),{recursive:!0}),await a(r,n,`utf-8`)},async remove(e){await r(_(e),{recursive:!0,force:!0})},async stat(e){let t=await i(_(e));return{size:t.size,isFile:t.isFile(),isDirectory:t.isDirectory(),mtime:t.mtime}},async mkdir(e){await t(_(e),{recursive:!0})},async glob(e){let t=e.patterns??(e.pattern?[e.pattern]:p),n=e.ignore??m,r=[];for(let e of t){let t=await f(e,{cwd:g,ignore:n});r.push(...t)}return Array.from(new Set(r)).sort((e,t)=>e.localeCompare(t))},resolve(...e){let[t,...n]=e;return t?d(g,t,...n):g},dirname(e){return s(e)},basename(e){return o(e)},join(...e){return l(...e)},relative(e,t){return u(e,t)}};function _(e){return c(e)?e:d(g,e)}}export{h as createNodeFsAdapter};
|
package/dist/adapters/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createNodeFsAdapter as e}from"./fs.js";import{createNodeGitAdapter as t}from"./git.js";import{createNodeWatcherAdapter as n}from"./watcher.js";import{createNodeAiAdapter as r}from"./ai.js";import{createConsoleLoggerAdapter as i,createNoopLoggerAdapter as a}from"./logger.js";import{createNodeAdapters as o}from"./factory.js";
|
|
1
|
+
import{createNodeFsAdapter as e}from"./fs.js";import{createNodeGitAdapter as t}from"./git.js";import{createNodeWatcherAdapter as n}from"./watcher.js";import{createNodeAiAdapter as r}from"./ai.js";import{createConsoleLoggerAdapter as i,createNoopLoggerAdapter as a}from"./logger.js";import{createNodeAdapters as o}from"./factory.js";import{detectPackageManager as s,findPackageRoot as c,findWorkspaceRoot as l,getExecCommand as u,getInstallCommand as d,getPackageName as f,getRunCommand as p,getWorkspaceInfo as m,getWorkspacePackages as h,isMonorepo as g}from"./workspace.js";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{dirname as e,join as t,resolve as n}from"node:path";import{existsSync as r,readFileSync as i}from"node:fs";const a={"bun.lockb":`bun`,"bun.lock":`bun`,"pnpm-lock.yaml":`pnpm`,"yarn.lock":`yarn`,"package-lock.json":`npm`},o=[`pnpm-workspace.yaml`,`lerna.json`,`nx.json`,`turbo.json`,`rush.json`];function s(i=process.cwd()){let a=n(i),o=e(a);for(;a!==o;){if(r(t(a,`package.json`)))return a;a=e(a)}return r(t(o,`package.json`))?o:i}function c(s=process.cwd()){let c=n(s),l=e(c),u=null;for(;c!==l;){for(let e of o)if(r(t(c,e)))return c;let n=t(c,`package.json`);if(r(n)){u=c;try{if(JSON.parse(i(n,`utf-8`)).workspaces)return c}catch{}}for(let e of Object.keys(a))if(r(t(c,e)))return c;c=e(c)}return u??s}function l(e=process.cwd()){for(let n of[`bun`,`pnpm`,`yarn`,`npm`]){let i=Object.entries(a).filter(([,e])=>e===n);for(let[a]of i)if(r(t(e,a)))return n}let n=t(e,`package.json`);if(r(n))try{let e=JSON.parse(i(n,`utf-8`));if(e.packageManager){let t=e.packageManager.match(/^(bun|pnpm|yarn|npm)@/);if(t)return t[1]}}catch{}return process.env.BUN_INSTALL||globalThis.Bun!==void 0?`bun`:`npm`}function u(e=process.cwd()){for(let n of o)if(r(t(e,n)))return!0;let n=t(e,`package.json`);if(r(n))try{if(JSON.parse(i(n,`utf-8`)).workspaces)return!0}catch{}return!1}function d(e){let n=t(e,`pnpm-workspace.yaml`);if(r(n))try{let e=i(n,`utf-8`).match(/packages:\s*\n((?:\s+-\s+['"]?[^\n]+['"]?\n?)+)/);if(e?.[1])return e[1].split(`
|
|
2
|
+
`).map(e=>e.replace(/^\s+-\s+['"]?|['"]?\s*$/g,``)).filter(Boolean)}catch{}let a=t(e,`package.json`);if(r(a))try{let e=JSON.parse(i(a,`utf-8`));if(Array.isArray(e.workspaces))return e.workspaces;if(e.workspaces?.packages&&Array.isArray(e.workspaces.packages))return e.workspaces.packages}catch{}}function f(e){let n=t(e,`package.json`);if(r(n))try{return JSON.parse(i(n,`utf-8`)).name}catch{}}function p(e=process.cwd()){let t=s(e),n=c(e),r=l(n),i=u(n);return{packageManager:r,workspaceRoot:n,packageRoot:t,isMonorepo:i,packages:i?d(n):void 0,packageName:f(t)}}function m(e,t){switch(e){case`bun`:return`bun run ${t}`;case`pnpm`:return`pnpm run ${t}`;case`yarn`:return`yarn ${t}`;case`npm`:return`npm run ${t}`}}function h(e,t){switch(e){case`bun`:return`bunx ${t}`;case`pnpm`:return`pnpm exec ${t}`;case`yarn`:return`yarn ${t}`;case`npm`:return`npx ${t}`}}function g(e,t=!1){let n=t?e===`npm`?`--save-dev`:`-D`:``;switch(e){case`bun`:return`bun add ${n}`.trim();case`pnpm`:return`pnpm add ${n}`.trim();case`yarn`:return`yarn add ${n}`.trim();case`npm`:return`npm install ${n}`.trim()}}export{l as detectPackageManager,s as findPackageRoot,c as findWorkspaceRoot,h as getExecCommand,g as getInstallCommand,f as getPackageName,m as getRunCommand,p as getWorkspaceInfo,d as getWorkspacePackages,u as isMonorepo};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createNodeFsAdapter as e}from"./adapters/fs.js";import{createNodeGitAdapter as t}from"./adapters/git.js";import{createNodeWatcherAdapter as n}from"./adapters/watcher.js";import{createNodeAiAdapter as r}from"./adapters/ai.js";import{createConsoleLoggerAdapter as i,createNoopLoggerAdapter as a}from"./adapters/logger.js";import{createNodeAdapters as o}from"./adapters/factory.js";import"./adapters/index.js";import{validateSpec as
|
|
1
|
+
import{createNodeFsAdapter as e}from"./adapters/fs.js";import{createNodeGitAdapter as t}from"./adapters/git.js";import{createNodeWatcherAdapter as n}from"./adapters/watcher.js";import{createNodeAiAdapter as r}from"./adapters/ai.js";import{createConsoleLoggerAdapter as i,createNoopLoggerAdapter as a}from"./adapters/logger.js";import{createNodeAdapters as o}from"./adapters/factory.js";import{detectPackageManager as s,findPackageRoot as c,findWorkspaceRoot as l,getExecCommand as u,getInstallCommand as d,getPackageName as f,getRunCommand as p,getWorkspaceInfo as m,getWorkspacePackages as h,isMonorepo as g}from"./adapters/workspace.js";import"./adapters/index.js";import{validateSpec as _,validateSpecs as v}from"./services/validate.js";import{validateImplementationFiles as y}from"./services/validate-implementation.js";import{compareSpecs as b}from"./services/diff.js";import{analyzeDeps as x,exportGraphAsDot as S,getContractNode as C,getGraphStats as w}from"./services/deps.js";import{groupSpecsByType as T,listSpecs as E}from"./services/list.js";import{getApiKey as D,loadWorkspaceConfig as O,mergeWorkspaceConfig as k}from"./services/config.js";import{buildSpec as A}from"./services/build.js";import{exportOpenApi as j}from"./services/openapi.js";import{RegistryClient as M,addToRegistry as N,listFromRegistry as P,resolveRegistryUrl as F,searchRegistry as I}from"./services/registry.js";import{syncSpecs as L}from"./services/sync.js";import{watchSpecs as R}from"./services/watch.js";import{cleanArtifacts as z}from"./services/clean.js";import{runTests as B}from"./services/test.js";import{createRegeneratorService as V}from"./services/regenerator.js";import{findAllConfigFiles as H,formatWorkspaceInfo as U,getExtendedWorkspaceInfo as W,mergeMonorepoConfigs as G}from"./services/workspace-info.js";import{analyzeIntegrity as K,filterIssuesBySeverity as q,filterIssuesByType as J,getAllSpecs as Y}from"./services/integrity.js";import{generateMermaidDiagram as X}from"./services/integrity-diagram.js";import{ALL_SETUP_TARGETS as Z,SETUP_TARGET_LABELS as Q}from"./services/setup/types.js";import{generateAgentsMd as $,generateClaudeMcpConfig as ee,generateContractsrcConfig as te,generateCursorMcpConfig as ne,generateCursorRules as re,generateVscodeSettings as ie,getClaudeDesktopConfigPath as ae}from"./services/setup/config-generators.js";import{deepMergeOverwrite as oe,deepMergePreserve as se,formatJson as ce,safeParseJson as le}from"./services/setup/file-merger.js";import{runSetup as ue}from"./services/setup/setup-service.js";import"./services/index.js";import{templates_exports as de}from"./templates/index.js";import{ai_exports as fe}from"./ai/index.js";export*from"@lssm/module.contractspec-workspace";export{Z as ALL_SETUP_TARGETS,M as RegistryClient,Q as SETUP_TARGET_LABELS,N as addToRegistry,fe as ai,x as analyzeDeps,K as analyzeIntegrity,A as buildSpec,z as cleanArtifacts,b as compareSpecs,i as createConsoleLoggerAdapter,o as createNodeAdapters,r as createNodeAiAdapter,e as createNodeFsAdapter,t as createNodeGitAdapter,n as createNodeWatcherAdapter,a as createNoopLoggerAdapter,V as createRegeneratorService,oe as deepMergeOverwrite,se as deepMergePreserve,s as detectPackageManager,S as exportGraphAsDot,j as exportOpenApi,q as filterIssuesBySeverity,J as filterIssuesByType,H as findAllConfigFiles,c as findPackageRoot,l as findWorkspaceRoot,ce as formatJson,U as formatWorkspaceInfo,$ as generateAgentsMd,ee as generateClaudeMcpConfig,te as generateContractsrcConfig,ne as generateCursorMcpConfig,re as generateCursorRules,X as generateMermaidDiagram,ie as generateVscodeSettings,Y as getAllSpecs,D as getApiKey,ae as getClaudeDesktopConfigPath,C as getContractNode,u as getExecCommand,W as getExtendedWorkspaceInfo,w as getGraphStats,d as getInstallCommand,f as getPackageName,p as getRunCommand,m as getWorkspaceInfo,h as getWorkspacePackages,T as groupSpecsByType,g as isMonorepo,P as listFromRegistry,E as listSpecs,O as loadWorkspaceConfig,G as mergeMonorepoConfigs,k as mergeWorkspaceConfig,F as resolveRegistryUrl,ue as runSetup,B as runTests,le as safeParseJson,I as searchRegistry,L as syncSpecs,de as templates,y as validateImplementationFiles,_ as validateSpec,v as validateSpecs,R as watchSpecs};
|
package/dist/services/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{detectPackageManager as e,findPackageRoot as t,findWorkspaceRoot as n,getWorkspaceInfo as r}from"../adapters/workspace.js";import{validateSpec as i,validateSpecs as a}from"./validate.js";import{validateImplementationFiles as o}from"./validate-implementation.js";import{compareSpecs as s}from"./diff.js";import{analyzeDeps as c,exportGraphAsDot as l,getContractNode as u,getGraphStats as d}from"./deps.js";import{groupSpecsByType as f,listSpecs as p}from"./list.js";import{getApiKey as m,loadWorkspaceConfig as h,mergeWorkspaceConfig as g}from"./config.js";import{buildSpec as _}from"./build.js";import{exportOpenApi as v}from"./openapi.js";import{RegistryClient as y,addToRegistry as b,listFromRegistry as x,resolveRegistryUrl as S,searchRegistry as C}from"./registry.js";import{syncSpecs as w}from"./sync.js";import{watchSpecs as T}from"./watch.js";import{cleanArtifacts as E}from"./clean.js";import{runTests as D}from"./test.js";import{createRegeneratorService as O}from"./regenerator.js";import{findAllConfigFiles as k,formatWorkspaceInfo as A,getExtendedWorkspaceInfo as j,mergeMonorepoConfigs as M}from"./workspace-info.js";import{analyzeIntegrity as N,filterIssuesBySeverity as P,filterIssuesByType as F,getAllSpecs as I}from"./integrity.js";import{generateMermaidDiagram as L}from"./integrity-diagram.js";import{ALL_SETUP_TARGETS as R,SETUP_TARGET_LABELS as z}from"./setup/types.js";import{generateAgentsMd as B,generateClaudeMcpConfig as V,generateContractsrcConfig as H,generateCursorMcpConfig as U,generateCursorRules as W,generateVscodeSettings as G,getClaudeDesktopConfigPath as K}from"./setup/config-generators.js";import{deepMergeOverwrite as q,deepMergePreserve as J,formatJson as Y,safeParseJson as X}from"./setup/file-merger.js";import{runSetup as Z}from"./setup/setup-service.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
function e(e,a=`feature-map`,o={}){switch(a){case`feature-map`:return t(e,o);case`orphans`:return n(e,o);case`dependencies`:return r(e,o);case`full`:return i(e,o);default:return t(e,o)}}function t(e,t){let{direction:n=`LR`,showVersions:r=!0,maxNodes:i=50}=t,o=[`flowchart ${n}`],l=e.features;t.featureKeys&&t.featureKeys.length>0&&(l=l.filter(e=>t.featureKeys.includes(e.key)));let u=0;if(l.length>0){o.push(` subgraph features [Features]`);for(let e of l){if(u>=i)break;let t=s(`F_${e.key}`),n=e.title??e.key;o.push(` ${t}["${c(n)}"]`),u++}o.push(` end`)}let d=a(l,`operations`,e.inventory);if(d.length>0&&u<i){o.push(` subgraph ops [Operations]`);for(let e of d){if(u>=i)break;let t=s(`O_${e.name}_v${e.version}`),n=r?`${e.name}.v${e.version}`:e.name;o.push(` ${t}["${c(n)}"]`),u++}o.push(` end`)}let f=a(l,`events`,e.inventory);if(f.length>0&&u<i){o.push(` subgraph events [Events]`);for(let e of f){if(u>=i)break;let t=s(`E_${e.name}_v${e.version}`),n=r?`${e.name}.v${e.version}`:e.name;o.push(` ${t}["${c(n)}"]`),u++}o.push(` end`)}let p=a(l,`presentations`,e.inventory);if(p.length>0&&u<i){o.push(` subgraph presentations [Presentations]`);for(let e of p){if(u>=i)break;let t=s(`P_${e.name}_v${e.version}`),n=r?`${e.name}.v${e.version}`:e.name;o.push(` ${t}["${c(n)}"]`),u++}o.push(` end`)}for(let e of l){let t=s(`F_${e.key}`);for(let n of e.operations){let e=s(`O_${n.name}_v${n.version}`);o.push(` ${t} --> ${e}`)}for(let n of e.events){let e=s(`E_${n.name}_v${n.version}`);o.push(` ${t} -.-> ${e}`)}for(let n of e.presentations){let e=s(`P_${n.name}_v${n.version}`);o.push(` ${t} --> ${e}`)}}return o.join(`
|
|
2
|
+
`)}function n(e,t){let{direction:n=`TB`,showVersions:r=!0,maxNodes:i=50}=t,a=[`flowchart ${n}`],l=new Set,u=new Set,d=new Set;for(let t of e.features){for(let e of t.operations)l.add(`${e.name}.v${e.version}`);for(let e of t.events)u.add(`${e.name}.v${e.version}`);for(let e of t.presentations)d.add(`${e.name}.v${e.version}`)}let f=0;if(e.features.length>0){a.push(` subgraph features [Features]`);for(let t of e.features){if(f>=i)break;let e=s(`F_${t.key}`);a.push(` ${e}["${c(t.title??t.key)}"]`),f++}a.push(` end`)}if(e.orphanedSpecs.length>0){a.push(` subgraph orphaned [Orphaned Specs]`);for(let t of e.orphanedSpecs){if(f>=i)break;let e=s(`orphan_${t.type}_${t.name}_v${t.version}`),n=r?`${t.name}.v${t.version}`:t.name;a.push(` ${e}["${c(n)}"]`),f++}a.push(` end`)}let p=[];for(let e of l){let[t,n]=o(e);t&&n&&p.push({type:`operation`,name:t,version:n})}for(let e of u){let[t,n]=o(e);t&&n&&p.push({type:`event`,name:t,version:n})}for(let e of d){let[t,n]=o(e);t&&n&&p.push({type:`presentation`,name:t,version:n})}if(p.length>0&&f<i){a.push(` subgraph linked [Linked Specs]`);for(let e of p){if(f>=i)break;let t=s(`${e.type}_${e.name}_v${e.version}`),n=r?`${e.name}.v${e.version}`:e.name;a.push(` ${t}["${c(n)}"]`),f++}a.push(` end`)}for(let t of e.features){let e=s(`F_${t.key}`);for(let n of t.operations){let t=s(`operation_${n.name}_v${n.version}`);a.push(` ${e} --> ${t}`)}for(let n of t.events){let t=s(`event_${n.name}_v${n.version}`);a.push(` ${e} -.-> ${t}`)}for(let n of t.presentations){let t=s(`presentation_${n.name}_v${n.version}`);a.push(` ${e} --> ${t}`)}}return a.join(`
|
|
3
|
+
`)}function r(e,t){let{direction:n=`TB`,showVersions:r=!0,maxNodes:i=50}=t,a=[`flowchart ${n}`],o=0;for(let t of e.features){if(o>=i)break;let e=s(`F_${t.key}`);a.push(` ${e}["${c(t.title??t.key)}"]`),o++;for(let n of t.operations){if(o>=i)break;let t=s(`O_${n.name}_v${n.version}`),l=r?`${n.name}.v${n.version}`:n.name;a.push(` ${t}["${c(l)}"]`),a.push(` ${e} --> ${t}`),o++}for(let n of t.events){if(o>=i)break;let t=s(`E_${n.name}_v${n.version}`),l=r?`${n.name}.v${n.version}`:n.name;a.push(` ${t}["${c(l)}"]`),a.push(` ${e} -.-> ${t}`),o++}for(let n of t.presentations){if(o>=i)break;let t=s(`P_${n.name}_v${n.version}`),l=r?`${n.name}.v${n.version}`:n.name;a.push(` ${t}["${c(l)}"]`),a.push(` ${e} --> ${t}`),o++}for(let e of t.opToPresentationLinks){let t=s(`O_${e.op.name}_v${e.op.version}`),n=s(`P_${e.pres.name}_v${e.pres.version}`);a.push(` ${t} --> ${n}`)}}return a.join(`
|
|
4
|
+
`)}function i(e,n){let r=t(e,n);if(e.orphanedSpecs.length===0)return r;let i=r.split(`
|
|
5
|
+
`);i.push(` subgraph orphaned [Orphaned Specs]`);for(let t of e.orphanedSpecs.slice(0,20)){let e=s(`orphan_${t.type}_${t.name}_v${t.version}`),n=`${t.name}.v${t.version}`;i.push(` ${e}["${c(n)}"]:::orphan`)}return i.push(` end`),i.push(` classDef orphan stroke-dasharray: 5 5`),i.join(`
|
|
6
|
+
`)}function a(e,t,n){let r=new Set,i=[];for(let n of e)for(let e of n[t]){let t=`${e.name}.v${e.version}`;r.has(t)||(r.add(t),i.push(e))}return i}function o(e){let t=e.match(/^(.+)\.v(\d+)$/);return t?[t[1],Number(t[2])]:[void 0,void 0]}function s(e){return e.replace(/[^a-zA-Z0-9_]/g,`_`)}function c(e){return e.replace(/"/g,`'`).replace(/\[/g,`(`).replace(/\]/g,`)`).replace(/\{/g,`(`).replace(/\}/g,`)`)}export{e as generateMermaidDiagram};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{isFeatureFile as e,scanFeatureSource as t,scanSpecSource as n}from"@lssm/module.contractspec-workspace";function r(e,t){return`${e}.v${t}`}function i(){return{operations:new Map,events:new Map,presentations:new Map,capabilities:new Map,workflows:new Map,dataViews:new Map,forms:new Map,migrations:new Map,experiments:new Map,integrations:new Map,knowledge:new Map,telemetry:new Map,appConfigs:new Map,policies:new Map,testSpecs:new Map}}function a(e,t){return{operation:e.operations,event:e.events,presentation:e.presentations,capability:e.capabilities,workflow:e.workflows,"data-view":e.dataViews,form:e.forms,migration:e.migrations,experiment:e.experiments,integration:e.integrations,knowledge:e.knowledge,telemetry:e.telemetry,"app-config":e.appConfigs,policy:e.policies,"test-spec":e.testSpecs}[t]}async function o(o,s={}){let{fs:c,logger:l}=o;l.info(`Starting integrity analysis...`,{options:s});let u=await c.glob({pattern:s.pattern}),d=i(),f=[],p=[];for(let i of u){let o=await c.readFile(i);if(e(i)){let e=t(o,i);f.push(e)}else{let e=n(o,i);if(e.specType!==`unknown`&&e.specType!==`feature`){let t=a(d,e.specType);if(t&&e.name&&e.version!==void 0){let n=r(e.name,e.version);t.set(n,{name:e.name,version:e.version,file:e.filePath,type:e.specType,stability:e.stability})}}}}let m=s.featureKey?f.filter(e=>e.key===s.featureKey):f,h=new Set;for(let e of m){for(let t of e.operations){let n=r(t.name,t.version);h.add(`operation:${n}`),d.operations.has(n)||p.push({severity:`error`,type:`unresolved-ref`,message:`Operation ${t.name}.v${t.version} not found`,file:e.filePath,featureKey:e.key,specType:`operation`,ref:t})}for(let t of e.events){let n=r(t.name,t.version);h.add(`event:${n}`),d.events.has(n)||p.push({severity:`error`,type:`unresolved-ref`,message:`Event ${t.name}.v${t.version} not found`,file:e.filePath,featureKey:e.key,specType:`event`,ref:t})}for(let t of e.presentations){let n=r(t.name,t.version);h.add(`presentation:${n}`),d.presentations.has(n)||p.push({severity:`error`,type:`unresolved-ref`,message:`Presentation ${t.name}.v${t.version} not found`,file:e.filePath,featureKey:e.key,specType:`presentation`,ref:t})}for(let t of e.experiments){let n=r(t.name,t.version);h.add(`experiment:${n}`),d.experiments.has(n)||p.push({severity:`error`,type:`unresolved-ref`,message:`Experiment ${t.name}.v${t.version} not found`,file:e.filePath,featureKey:e.key,specType:`experiment`,ref:t})}for(let t of e.capabilities.provides){let n=r(t.name,t.version);h.add(`capability:${n}`),d.capabilities.has(n)||p.push({severity:`warning`,type:`unresolved-ref`,message:`Provided capability ${t.name}.v${t.version} not found`,file:e.filePath,featureKey:e.key,specType:`capability`,ref:t})}for(let t of e.capabilities.requires){let e=r(t.name,t.version);h.add(`capability:${e}`)}for(let t of e.opToPresentationLinks){let n=r(t.op.name,t.op.version),i=r(t.pres.name,t.pres.version);d.operations.has(n)||p.push({severity:`error`,type:`broken-link`,message:`Linked operation ${t.op.name}.v${t.op.version} not found`,file:e.filePath,featureKey:e.key,specType:`operation`,ref:t.op}),d.presentations.has(i)||p.push({severity:`error`,type:`broken-link`,message:`Linked presentation ${t.pres.name}.v${t.pres.version} not found`,file:e.filePath,featureKey:e.key,specType:`presentation`,ref:t.pres})}}let g=[],_=[`operation`,`event`,`presentation`,`experiment`];for(let e of _){let t=a(d,e);if(t)for(let[n,r]of t)h.has(`${e}:${n}`)||(g.push(r),p.push({severity:`warning`,type:`orphaned`,message:`${e} ${r.name}.v${r.version} is not linked to any feature`,file:r.file,specName:r.name,specType:r.type}))}let v={};for(let e of _){let t=a(d,e);if(!t)continue;let n=t.size,r=0;for(let n of t.keys())h.has(`${e}:${n}`)&&r++;v[e]={total:n,covered:r,orphaned:n-r}}let y=Object.values(v).reduce((e,t)=>e+t.total,0),b=Object.values(v).reduce((e,t)=>e+t.covered,0),x={total:y,linkedToFeature:b,orphaned:y-b,byType:v},S=!p.some(e=>e.severity===`error`);return l.info(`Integrity analysis complete`,{features:f.length,totalSpecs:y,orphaned:g.length,issues:p.length,healthy:S}),{inventory:d,features:m,coverage:x,issues:p,orphanedSpecs:g,healthy:S}}function s(e){let t=[];for(let n of Object.values(e))for(let e of n.values())t.push(e);return t}function c(e,t){return e.filter(e=>e.type===t)}function l(e,t){return e.filter(e=>e.severity===t)}export{o as analyzeIntegrity,l as filterIssuesBySeverity,c as filterIssuesByType,s as getAllSpecs};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
function e(e){return{$schema:`https://contractspec.dev/schemas/contractsrc.json`,aiProvider:`claude`,aiModel:`claude-sonnet-4-20250514`,agentMode:`claude-code`,outputDir:`./src`,conventions:{operations:`contracts/operations`,events:`contracts/events`,presentations:`contracts/presentations`,forms:`contracts/forms`,features:`contracts/features`},defaultOwners:e.defaultOwners??[`@team`],defaultTags:[]}}function t(){return{"contractspec.validation.enabled":!0,"contractspec.validation.validateOnSave":!0,"contractspec.validation.validateOnOpen":!0,"contractspec.codeLens.enabled":!0,"contractspec.diagnostics.showWarnings":!0,"contractspec.diagnostics.showHints":!0,"contractspec.integrity.enabled":!0,"contractspec.integrity.checkOnSave":!0}}function n(){return{mcpServers:{"contractspec-local":{command:`bunx`,args:[`contractspec-mcp`]}}}}function r(){return{mcpServers:{"contractspec-local":{command:`bunx`,args:[`contractspec-mcp`]}}}}function i(e){return`# ContractSpec Development Rules
|
|
2
|
+
|
|
3
|
+
This project uses ContractSpec for spec-first development. Follow these guidelines when working with AI agents.
|
|
4
|
+
|
|
5
|
+
## Spec-First Principle
|
|
6
|
+
|
|
7
|
+
- **Always update contracts first** before changing implementation code.
|
|
8
|
+
- Contracts are the source of truth for operations, events, and presentations.
|
|
9
|
+
- Implementation code should be generated or derived from contracts.
|
|
10
|
+
|
|
11
|
+
## Contract Locations
|
|
12
|
+
|
|
13
|
+
Contracts are located in:
|
|
14
|
+
- \`src/contracts/operations/\` - Command and query specs
|
|
15
|
+
- \`src/contracts/events/\` - Event specs
|
|
16
|
+
- \`src/contracts/presentations/\` - UI presentation specs
|
|
17
|
+
- \`src/contracts/features/\` - Feature module specs
|
|
18
|
+
|
|
19
|
+
## When Making Changes
|
|
20
|
+
|
|
21
|
+
1. **Before coding**: Check if a contract exists for the feature.
|
|
22
|
+
2. **If contract exists**: Update the contract first, then regenerate code.
|
|
23
|
+
3. **If no contract**: Create a new contract using \`contractspec create\`.
|
|
24
|
+
4. **After changes**: Validate with \`contractspec validate\`.
|
|
25
|
+
|
|
26
|
+
## Key Commands
|
|
27
|
+
|
|
28
|
+
- \`contractspec create\` - Scaffold new specs
|
|
29
|
+
- \`contractspec validate\` - Validate specs
|
|
30
|
+
- \`contractspec build\` - Generate implementation code
|
|
31
|
+
- \`contractspec integrity\` - Check contract health
|
|
32
|
+
|
|
33
|
+
## Contract Structure
|
|
34
|
+
|
|
35
|
+
Operations follow this pattern:
|
|
36
|
+
\`\`\`typescript
|
|
37
|
+
defineCommand({
|
|
38
|
+
meta: { name: 'service.action', version: 1, ... },
|
|
39
|
+
io: { input: InputSchema, output: OutputSchema },
|
|
40
|
+
policy: { auth: 'user', ... },
|
|
41
|
+
handler: async (args, ctx) => { ... }
|
|
42
|
+
});
|
|
43
|
+
\`\`\`
|
|
44
|
+
|
|
45
|
+
## Rules for ${e.projectName??`this project`}
|
|
46
|
+
|
|
47
|
+
- All API endpoints must have a corresponding operation contract.
|
|
48
|
+
- Events must be declared in contracts before being emitted.
|
|
49
|
+
- UI components should reference presentation contracts.
|
|
50
|
+
- Feature flags should be defined in feature modules.
|
|
51
|
+
`}function a(e){return`# AI Agent Guide
|
|
52
|
+
|
|
53
|
+
This repository uses **ContractSpec** for spec-first development. AI agents should follow these guidelines.
|
|
54
|
+
|
|
55
|
+
## Project: ${e.projectName??`This Project`}
|
|
56
|
+
|
|
57
|
+
## ContractSpec Overview
|
|
58
|
+
|
|
59
|
+
ContractSpec is a deterministic, spec-first compiler that keeps AI-written software coherent, safe, and regenerable.
|
|
60
|
+
|
|
61
|
+
### Key Principles
|
|
62
|
+
|
|
63
|
+
1. **Contracts are the source of truth** - Always check/update contracts before modifying implementation.
|
|
64
|
+
2. **Safe regeneration** - Code can be regenerated from specs without breaking invariants.
|
|
65
|
+
3. **Multi-surface consistency** - API, events, and UI stay in sync via shared contracts.
|
|
66
|
+
|
|
67
|
+
## Working in This Repository
|
|
68
|
+
|
|
69
|
+
### Before Making Changes
|
|
70
|
+
|
|
71
|
+
1. Check for existing contracts in \`src/contracts/\`
|
|
72
|
+
2. If a contract exists, update it first
|
|
73
|
+
3. Regenerate implementation with \`contractspec build\`
|
|
74
|
+
4. Validate with \`contractspec validate\`
|
|
75
|
+
|
|
76
|
+
### Creating New Features
|
|
77
|
+
|
|
78
|
+
1. Create a feature spec: \`contractspec create --type=feature\`
|
|
79
|
+
2. Add operations: \`contractspec create --type=operation\`
|
|
80
|
+
3. Add events if needed: \`contractspec create --type=event\`
|
|
81
|
+
4. Build implementation: \`contractspec build\`
|
|
82
|
+
|
|
83
|
+
### Contract Locations
|
|
84
|
+
|
|
85
|
+
| Type | Location |
|
|
86
|
+
|------|----------|
|
|
87
|
+
| Operations | \`src/contracts/operations/\` |
|
|
88
|
+
| Events | \`src/contracts/events/\` |
|
|
89
|
+
| Presentations | \`src/contracts/presentations/\` |
|
|
90
|
+
| Features | \`src/contracts/features/\` |
|
|
91
|
+
|
|
92
|
+
## MCP Tools Available
|
|
93
|
+
|
|
94
|
+
The ContractSpec MCP server provides these tools:
|
|
95
|
+
|
|
96
|
+
- \`integrity.analyze\` - Check contract health
|
|
97
|
+
- \`specs.list\` - List all specs
|
|
98
|
+
- \`specs.validate\` - Validate a spec file
|
|
99
|
+
- \`specs.create\` - Create new specs
|
|
100
|
+
- \`deps.analyze\` - Analyze dependencies
|
|
101
|
+
|
|
102
|
+
## Common Tasks
|
|
103
|
+
|
|
104
|
+
### Add a new API endpoint
|
|
105
|
+
|
|
106
|
+
\`\`\`bash
|
|
107
|
+
contractspec create --type=operation --name=myService.newAction
|
|
108
|
+
\`\`\`
|
|
109
|
+
|
|
110
|
+
### Add a new event
|
|
111
|
+
|
|
112
|
+
\`\`\`bash
|
|
113
|
+
contractspec create --type=event --name=entity.changed
|
|
114
|
+
\`\`\`
|
|
115
|
+
|
|
116
|
+
### Check contract integrity
|
|
117
|
+
|
|
118
|
+
\`\`\`bash
|
|
119
|
+
contractspec integrity
|
|
120
|
+
\`\`\`
|
|
121
|
+
|
|
122
|
+
## Nested AGENTS.md
|
|
123
|
+
|
|
124
|
+
More specific instructions may exist in subdirectories. Check for \`AGENTS.md\` files in the relevant package or module.
|
|
125
|
+
`}function o(){let e=process.platform,t=process.env.HOME??process.env.USERPROFILE??``;switch(e){case`darwin`:return`${t}/Library/Application Support/Claude/claude_desktop_config.json`;case`win32`:return`${process.env.APPDATA??t}/Claude/claude_desktop_config.json`;default:return`${t}/.config/claude/claude_desktop_config.json`}}export{a as generateAgentsMd,r as generateClaudeMcpConfig,e as generateContractsrcConfig,n as generateCursorMcpConfig,i as generateCursorRules,t as generateVscodeSettings,o as getClaudeDesktopConfigPath};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(t,r){let i={...t};for(let a of Object.keys(r)){let o=t[a],s=r[a];o===void 0?i[a]=s:n(o)&&n(s)&&(i[a]=e(o,s))}return i}function t(e,r){let i={...e};for(let a of Object.keys(r)){let o=e[a],s=r[a];s!==void 0&&(n(o)&&n(s)?i[a]=t(o,s):i[a]=s)}return i}function n(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype}function r(e){try{return JSON.parse(e)}catch{return null}}function i(e){return JSON.stringify(e,null,2)+`
|
|
2
|
+
`}export{t as deepMergeOverwrite,e as deepMergePreserve,i as formatJson,r as safeParseJson};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ALL_SETUP_TARGETS as e,SETUP_TARGET_LABELS as t}from"./types.js";import{setupCliConfig as n}from"./targets/cli-config.js";import{setupVscodeSettings as r}from"./targets/vscode-settings.js";import{setupMcpCursor as i}from"./targets/mcp-cursor.js";import{setupMcpClaude as a}from"./targets/mcp-claude.js";import{setupCursorRules as o}from"./targets/cursor-rules.js";import{setupAgentsMd as s}from"./targets/agents-md.js";const c={confirm:async()=>!0,multiSelect:async(e,t)=>t.filter(e=>e.selected!==!1).map(e=>e.value),input:async(e,t)=>t??``};async function l(n,r,i=c){let a=[],o=r.targets.length>0?r.targets:e,s=o;r.interactive&&(s=await i.multiSelect(`Select components to configure:`,e.map(e=>({value:e,label:t[e],selected:o.includes(e)}))));let l=r.projectName;if(r.interactive&&!l){let e=r.workspaceRoot.split(`/`).pop()??`my-project`;l=await i.input(`Project name:`,e)}let d={...r,projectName:l,targets:s};for(let e of s){let t=await u(n,e,d,i);a.push(t)}let f=a.filter(e=>e.action!==`error`).length,p=a.filter(e=>e.action===`error`).length;return{success:p===0,files:a,summary:`Setup complete: ${f} configured, ${p} failed.`}}async function u(e,t,c,l){switch(t){case`cli-config`:return n(e,c,l);case`vscode-settings`:return r(e,c,l);case`mcp-cursor`:return i(e,c,l);case`mcp-claude`:return a(e,c,l);case`cursor-rules`:return o(e,c,l);case`agents-md`:return s(e,c,l);default:return{target:t,filePath:``,action:`error`,message:`Unknown target: ${t}`}}}export{l as runSetup};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{generateAgentsMd as e}from"../config-generators.js";async function t(t,n,r){let i=t.join(n.workspaceRoot,`AGENTS.md`);try{let a=await t.exists(i),o=e(n);if(a)if(n.interactive){if(!await r.confirm(`${i} exists. Overwrite?`))return{target:`agents-md`,filePath:i,action:`skipped`,message:`User kept existing AGENTS.md`}}else return{target:`agents-md`,filePath:i,action:`skipped`,message:`File already exists`};return await t.writeFile(i,o),{target:`agents-md`,filePath:i,action:a?`merged`:`created`,message:a?`Updated AGENTS.md`:`Created AGENTS.md`}}catch(e){return{target:`agents-md`,filePath:i,action:`error`,message:e instanceof Error?e.message:`Unknown error`}}}export{t as setupAgentsMd};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{generateContractsrcConfig as e}from"../config-generators.js";import{deepMergePreserve as t,formatJson as n,safeParseJson as r}from"../file-merger.js";async function i(i,a,o){let s=i.join(a.workspaceRoot,`.contractsrc.json`);try{let c=await i.exists(s),l=e(a);if(c){let e=r(await i.readFile(s));if(!e)return{target:`cli-config`,filePath:s,action:`error`,message:`Existing file is not valid JSON`};if(a.interactive&&!await o.confirm(`${s} exists. Merge ContractSpec defaults?`))return{target:`cli-config`,filePath:s,action:`skipped`,message:`User skipped merge`};let c=t(e,l);return await i.writeFile(s,n(c)),{target:`cli-config`,filePath:s,action:`merged`,message:`Merged with existing configuration`}}return await i.writeFile(s,n(l)),{target:`cli-config`,filePath:s,action:`created`,message:`Created CLI configuration`}}catch(e){return{target:`cli-config`,filePath:s,action:`error`,message:e instanceof Error?e.message:`Unknown error`}}}export{i as setupCliConfig};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{generateCursorRules as e}from"../config-generators.js";async function t(t,n,r){let i=t.join(n.workspaceRoot,`.cursor`,`rules`),a=t.join(i,`contractspec.mdc`);try{let o=t.join(n.workspaceRoot,`.cursor`);await t.exists(o)||await t.mkdir(o),await t.exists(i)||await t.mkdir(i);let s=await t.exists(a),c=e(n);if(s)if(n.interactive){if(!await r.confirm(`${a} exists. Overwrite with latest rules?`))return{target:`cursor-rules`,filePath:a,action:`skipped`,message:`User kept existing rules`}}else return{target:`cursor-rules`,filePath:a,action:`skipped`,message:`File already exists`};return await t.writeFile(a,c),{target:`cursor-rules`,filePath:a,action:s?`merged`:`created`,message:s?`Updated Cursor rules`:`Created Cursor rules`}}catch(e){return{target:`cursor-rules`,filePath:a,action:`error`,message:e instanceof Error?e.message:`Unknown error`}}}export{t as setupCursorRules};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{generateClaudeMcpConfig as e,getClaudeDesktopConfigPath as t}from"../config-generators.js";import{deepMergePreserve as n,formatJson as r,safeParseJson as i}from"../file-merger.js";async function a(a,o,s){let c=t();try{let t=await a.exists(c),l=e();if(o.interactive&&!await s.confirm(`Configure Claude Desktop at ${c}?`))return{target:`mcp-claude`,filePath:c,action:`skipped`,message:`User skipped Claude Desktop configuration`};if(t){let e=i(await a.readFile(c));if(!e)return{target:`mcp-claude`,filePath:c,action:`error`,message:`Existing file is not valid JSON`};let t=n(e,l);return await a.writeFile(c,r(t)),{target:`mcp-claude`,filePath:c,action:`merged`,message:`Added ContractSpec to Claude Desktop`}}let u=c.substring(0,c.lastIndexOf(`/`));return await a.exists(u)||await a.mkdir(u),await a.writeFile(c,r(l)),{target:`mcp-claude`,filePath:c,action:`created`,message:`Created Claude Desktop configuration`}}catch(e){return{target:`mcp-claude`,filePath:c,action:`error`,message:e instanceof Error?e.message:`Unknown error`}}}export{a as setupMcpClaude};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{generateCursorMcpConfig as e}from"../config-generators.js";import{deepMergePreserve as t,formatJson as n,safeParseJson as r}from"../file-merger.js";async function i(i,a,o){let s=i.join(a.workspaceRoot,`.cursor`),c=i.join(s,`mcp.json`);try{await i.exists(s)||await i.mkdir(s);let l=await i.exists(c),u=e();if(l){let e=r(await i.readFile(c));if(!e)return{target:`mcp-cursor`,filePath:c,action:`error`,message:`Existing file is not valid JSON`};if(a.interactive&&!await o.confirm(`${c} exists. Add ContractSpec MCP server?`))return{target:`mcp-cursor`,filePath:c,action:`skipped`,message:`User skipped merge`};let s=t(e,u);return await i.writeFile(c,n(s)),{target:`mcp-cursor`,filePath:c,action:`merged`,message:`Added ContractSpec MCP server`}}return await i.writeFile(c,n(u)),{target:`mcp-cursor`,filePath:c,action:`created`,message:`Created Cursor MCP configuration`}}catch(e){return{target:`mcp-cursor`,filePath:c,action:`error`,message:e instanceof Error?e.message:`Unknown error`}}}export{i as setupMcpCursor};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{generateVscodeSettings as e}from"../config-generators.js";import{deepMergePreserve as t,formatJson as n,safeParseJson as r}from"../file-merger.js";async function i(i,a,o){let s=i.join(a.workspaceRoot,`.vscode`),c=i.join(s,`settings.json`);try{await i.exists(s)||await i.mkdir(s);let l=await i.exists(c),u=e();if(l){let e=r(await i.readFile(c));if(!e)return{target:`vscode-settings`,filePath:c,action:`error`,message:`Existing file is not valid JSON`};if(a.interactive&&!await o.confirm(`${c} exists. Add ContractSpec settings?`))return{target:`vscode-settings`,filePath:c,action:`skipped`,message:`User skipped merge`};let s=t(e,u);return await i.writeFile(c,n(s)),{target:`vscode-settings`,filePath:c,action:`merged`,message:`Added ContractSpec settings`}}return await i.writeFile(c,n(u)),{target:`vscode-settings`,filePath:c,action:`created`,message:`Created VS Code settings`}}catch(e){return{target:`vscode-settings`,filePath:c,action:`error`,message:e instanceof Error?e.message:`Unknown error`}}}export{i as setupVscodeSettings};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=[`cli-config`,`vscode-settings`,`mcp-cursor`,`mcp-claude`,`cursor-rules`,`agents-md`],t={"cli-config":`CLI Configuration (.contractsrc.json)`,"vscode-settings":`VS Code Settings (.vscode/settings.json)`,"mcp-cursor":`MCP for Cursor (.cursor/mcp.json)`,"mcp-claude":`MCP for Claude Desktop`,"cursor-rules":`Cursor AI Rules (.cursor/rules/)`,"agents-md":`Project AI Guide (AGENTS.md)`};export{e as ALL_SETUP_TARGETS,t as SETUP_TARGET_LABELS};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{detectPackageManager as e,findPackageRoot as t,findWorkspaceRoot as n,getWorkspaceInfo as r}from"../adapters/workspace.js";async function i(e,t){let n=r(t),i=e.join(n.workspaceRoot,`.contractsrc.json`),a=e.join(n.packageRoot,`.contractsrc.json`),o=await e.exists(i),s=n.workspaceRoot===n.packageRoot?!1:await e.exists(a),c;if(o)try{let t=await e.readFile(i),n=JSON.parse(t);(n.packages||n.excludePackages||n.recursive)&&(c={packages:n.packages,excludePackages:n.excludePackages,recursive:n.recursive})}catch{}return{...n,monorepoConfig:c,workspaceConfigPath:o?i:void 0,packageConfigPath:s?a:void 0}}async function a(e,t){let n=[],r=e.join(t,`.contractsrc.json`);await e.exists(r)&&n.push(r);let i=await e.glob({pattern:`**/.contractsrc.json`,ignore:[`node_modules/**`,`.git/**`]});for(let e of i)e!==r&&n.push(e);return n}async function o(e,t,n){let r={};if(t&&await e.exists(t))try{let n=await e.readFile(t);r=JSON.parse(n)}catch{}if(n&&await e.exists(n))try{let t=await e.readFile(n),i=JSON.parse(t);r=s(r,i)}catch{}return r}function s(e,t){let n={...e};for(let r of Object.keys(t)){let i=e[r],a=t[r];typeof i==`object`&&i&&!Array.isArray(i)&&typeof a==`object`&&a&&!Array.isArray(a)?n[r]=s(i,a):n[r]=a}return n}function c(e){let t=[];return t.push(`Package Manager: ${e.packageManager}`),t.push(`Workspace Root: ${e.workspaceRoot}`),e.isMonorepo?(t.push(`Monorepo: Yes`),t.push(`Package Root: ${e.packageRoot}`),e.packageName&&t.push(`Current Package: ${e.packageName}`),e.packages&&e.packages.length>0&&t.push(`Package Patterns: ${e.packages.join(`, `)}`)):t.push(`Monorepo: No`),e.workspaceConfigPath&&t.push(`Workspace Config: ${e.workspaceConfigPath}`),e.packageConfigPath&&t.push(`Package Config: ${e.packageConfigPath}`),t.join(`
|
|
2
|
+
`)}export{a as findAllConfigFiles,c as formatWorkspaceInfo,i as getExtendedWorkspaceInfo,o as mergeMonorepoConfigs};
|