@lssm/bundle.contractspec-workspace 0.0.0-canary-20251216023757 → 0.0.0-canary-20251216025701

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.
@@ -1,2 +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(`
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);for(;;){if(r(t(a,`package.json`)))return a;let n=e(a);if(n===a)break;a=n}return i}function c(s=process.cwd()){let c=n(s),l=null;for(;;){for(let e of o)if(r(t(c,e)))return c;let n=t(c,`package.json`);if(r(n)){l=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;let s=e(c);if(s===c)break;c=s}return l??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
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{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};
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{ALL_CHECK_CATEGORIES as de,CHECK_CATEGORY_LABELS as fe}from"./services/doctor/types.js";import{formatCheckResult as pe,formatDoctorSummary as me,runDoctor as he}from"./services/doctor/doctor-service.js";import"./services/index.js";import{templates_exports as ge}from"./templates/index.js";import{ai_exports as _e}from"./ai/index.js";export*from"@lssm/module.contractspec-workspace";export{de as ALL_CHECK_CATEGORIES,Z as ALL_SETUP_TARGETS,fe as CHECK_CATEGORY_LABELS,M as RegistryClient,Q as SETUP_TARGET_LABELS,N as addToRegistry,_e 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,pe as formatCheckResult,me as formatDoctorSummary,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,he as runDoctor,ue as runSetup,B as runTests,le as safeParseJson,I as searchRegistry,L as syncSpecs,ge as templates,y as validateImplementationFiles,_ as validateSpec,v as validateSpecs,R as watchSpecs};
@@ -0,0 +1,2 @@
1
+ async function e(e,r,i){let a=[],o=await t(e,r);return a.push(o),o.status===`pass`&&a.push(await n(e,r,i)),a}async function t(e,t){let n=e.join(t.workspaceRoot,`.contractsrc.json`);try{if(!await e.exists(n))return{category:`ai`,name:`AI Provider`,status:`skip`,message:`No config file found`};let t=await e.readFile(n),r=JSON.parse(t);return{category:`ai`,name:`AI Provider`,status:`pass`,message:`Provider: ${r.aiProvider??`claude`}, Model: ${r.aiModel??`default`}`}}catch{return{category:`ai`,name:`AI Provider`,status:`skip`,message:`Could not read AI config`}}}async function n(e,t,n){let r=e.join(t.workspaceRoot,`.contractsrc.json`);try{let i=await e.readFile(r),a=JSON.parse(i).aiProvider??`claude`,o={claude:`ANTHROPIC_API_KEY`,openai:`OPENAI_API_KEY`,ollama:``,custom:`CONTRACTSPEC_LLM_API_KEY`}[a];return o?process.env[o]?{category:`ai`,name:`API Key`,status:`pass`,message:`${o} is set`}:{category:`ai`,name:`API Key`,status:`warn`,message:`${o} not set`,details:`Set ${o} in your environment to use AI features`,fix:n?{description:`Set ${o} environment variable`,apply:async()=>{let r=await n.input(`Enter your ${a} API key:`,{password:!0});if(!r)return{success:!1,message:`No API key provided`};let i=e.join(t.workspaceRoot,`.env`);try{let t=``;if(await e.exists(i)){if(t=await e.readFile(i),t.includes(`${o}=`))return{success:!1,message:`${o} already in .env, update manually`};t+=`
2
+ `}return t+=`${o}=${r}\n`,await e.writeFile(i,t),{success:!0,message:`Added ${o} to .env (restart required)`}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}:void 0}:{category:`ai`,name:`API Key`,status:`pass`,message:`${a} does not require an API key`}}catch{return{category:`ai`,name:`API Key`,status:`skip`,message:`Could not check API key`}}}export{e as runAiChecks};
@@ -0,0 +1 @@
1
+ import{exec as e}from"node:child_process";import{promisify as t}from"node:util";const n=t(e);async function r(e,t){let n=[];return n.push(await i(t)),n.push(await a(t)),n.push(await o(e,t)),n}async function i(e){try{return await n(`npx contractspec --version`,{cwd:e.workspaceRoot,timeout:1e4}),{category:`cli`,name:`CLI Accessible`,status:`pass`,message:`ContractSpec CLI is accessible`}}catch{return{category:`cli`,name:`CLI Accessible`,status:`fail`,message:`ContractSpec CLI is not accessible`,details:`Could not run "npx contractspec --version"`,fix:{description:`Install ContractSpec CLI globally`,apply:async()=>{try{return await n(`npm install -g @lssm/app.cli-contracts`,{cwd:e.workspaceRoot,timeout:6e4}),{success:!0,message:`CLI installed globally`}}catch(e){return{success:!1,message:`Failed to install: ${e instanceof Error?e.message:String(e)}`}}}}}}}async function a(e){try{let{stdout:t}=await n(`npx contractspec --version`,{cwd:e.workspaceRoot,timeout:1e4});return{category:`cli`,name:`CLI Version`,status:`pass`,message:`CLI version: ${t.trim()}`}}catch{return{category:`cli`,name:`CLI Version`,status:`skip`,message:`Could not determine CLI version`}}}async function o(e,t){let r=e.join(t.workspaceRoot,`package.json`);try{if(!await e.exists(r))return{category:`cli`,name:`Local Installation`,status:`skip`,message:`No package.json found`};let i=await e.readFile(r),a=JSON.parse(i);return a.dependencies?.[`@lssm/app.cli-contracts`]!==void 0||a.devDependencies?.[`@lssm/app.cli-contracts`]!==void 0?{category:`cli`,name:`Local Installation`,status:`pass`,message:`CLI is installed as a project dependency`}:{category:`cli`,name:`Local Installation`,status:`warn`,message:`CLI is not installed as a project dependency`,details:`Consider adding @lssm/app.cli-contracts to devDependencies`,fix:{description:`Add CLI as a dev dependency`,apply:async()=>{try{return await n(`npm install -D @lssm/app.cli-contracts`,{cwd:t.workspaceRoot,timeout:6e4}),{success:!0,message:`CLI added as dev dependency`}}catch(e){return{success:!1,message:`Failed to install: ${e instanceof Error?e.message:String(e)}`}}}}}}catch{return{category:`cli`,name:`Local Installation`,status:`skip`,message:`Could not check local installation`}}}export{r as runCliChecks};
@@ -0,0 +1 @@
1
+ import{generateContractsrcConfig as e}from"../../setup/config-generators.js";import{formatJson as t}from"../../setup/file-merger.js";async function n(e,t){let n=[];return n.push(await r(e,t)),n.push(await i(e,t)),n.push(await a(e,t)),n}async function r(n,r){let i=n.join(r.workspaceRoot,`.contractsrc.json`);return await n.exists(i)?{category:`config`,name:`Config File Exists`,status:`pass`,message:`.contractsrc.json found`}:{category:`config`,name:`Config File Exists`,status:`fail`,message:`.contractsrc.json not found`,fix:{description:`Create .contractsrc.json with defaults`,apply:async()=>{try{let a=e({workspaceRoot:r.workspaceRoot,interactive:!1,targets:[]});return await n.writeFile(i,t(a)),{success:!0,message:`Created .contractsrc.json`}}catch(e){return{success:!1,message:`Failed to create: ${e instanceof Error?e.message:String(e)}`}}}}}}async function i(n,r){let i=n.join(r.workspaceRoot,`.contractsrc.json`);if(!await n.exists(i))return{category:`config`,name:`Config Valid JSON`,status:`skip`,message:`Config file does not exist`};try{let e=await n.readFile(i);return JSON.parse(e),{category:`config`,name:`Config Valid JSON`,status:`pass`,message:`.contractsrc.json is valid JSON`}}catch(a){return{category:`config`,name:`Config Valid JSON`,status:`fail`,message:`.contractsrc.json is not valid JSON`,details:a instanceof Error?a.message:String(a),fix:{description:`Replace with valid default config`,apply:async()=>{try{let a=e({workspaceRoot:r.workspaceRoot,interactive:!1,targets:[]});return await n.writeFile(i,t(a)),{success:!0,message:`Replaced with valid config`}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}}}}async function a(n,r){let i=n.join(r.workspaceRoot,`.contractsrc.json`);if(!await n.exists(i))return{category:`config`,name:`Config Fields`,status:`skip`,message:`Config file does not exist`};try{let a=await n.readFile(i),o=JSON.parse(a),s=[];return o.outputDir||s.push(`outputDir`),o.conventions||s.push(`conventions`),s.length===0?{category:`config`,name:`Config Fields`,status:`pass`,message:`All recommended fields present`}:{category:`config`,name:`Config Fields`,status:`warn`,message:`Missing recommended fields: ${s.join(`, `)}`,fix:{description:`Add missing fields with defaults`,apply:async()=>{try{let a=e({workspaceRoot:r.workspaceRoot,interactive:!1,targets:[]});for(let e of s)a[e]!==void 0&&(o[e]=a[e]);return await n.writeFile(i,t(o)),{success:!0,message:`Added missing fields`}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}}}catch{return{category:`config`,name:`Config Fields`,status:`skip`,message:`Could not parse config`}}}export{n as runConfigChecks};
@@ -0,0 +1 @@
1
+ import{exec as e}from"node:child_process";import{promisify as t}from"node:util";const n=t(e);async function r(e,t){let n=[];return n.push(await i(t)),n.push(await a(t)),n.push(await o(e,t)),n.push(await s(e,t)),n}async function i(e){try{let{stdout:t}=await n(`node --version`,{cwd:e.workspaceRoot,timeout:5e3});return{category:`deps`,name:`Node.js`,status:`pass`,message:`Node.js ${t.trim()} available`}}catch{return{category:`deps`,name:`Node.js`,status:`fail`,message:`Node.js not found`,details:`Install Node.js from https://nodejs.org`}}}async function a(e){try{let{stdout:t}=await n(`bun --version`,{cwd:e.workspaceRoot,timeout:5e3});return{category:`deps`,name:`Bun Runtime`,status:`pass`,message:`Bun ${t.trim()} available`}}catch{return{category:`deps`,name:`Bun Runtime`,status:`warn`,message:`Bun not found (optional but recommended)`,details:`Install Bun from https://bun.sh for faster execution`}}}async function o(e,t){let r=[{file:`bun.lockb`,name:`bun`},{file:`pnpm-lock.yaml`,name:`pnpm`},{file:`yarn.lock`,name:`yarn`},{file:`package-lock.json`,name:`npm`}],i=null;for(let{file:n,name:a}of r){let r=e.join(t.workspaceRoot,n);if(await e.exists(r)){i=a;break}}if(!i)return{category:`deps`,name:`Package Manager`,status:`warn`,message:`No lock file found`,details:`Run npm install, yarn, pnpm install, or bun install`};try{return await n(`${i} --version`,{cwd:t.workspaceRoot,timeout:5e3}),{category:`deps`,name:`Package Manager`,status:`pass`,message:`Using ${i}`}}catch{return{category:`deps`,name:`Package Manager`,status:`fail`,message:`${i} detected but not available`,details:`Install ${i} or use a different package manager`}}}async function s(e,t){let r=e.join(t.workspaceRoot,`node_modules`);return await e.exists(r)?{category:`deps`,name:`Dependencies Installed`,status:`pass`,message:`node_modules directory exists`}:{category:`deps`,name:`Dependencies Installed`,status:`fail`,message:`node_modules not found`,details:`Run your package manager install command`,fix:{description:`Install dependencies`,apply:async()=>{try{try{return await n(`bun install`,{cwd:t.workspaceRoot,timeout:12e4}),{success:!0,message:`Installed with bun`}}catch{return await n(`npm install`,{cwd:t.workspaceRoot,timeout:12e4}),{success:!0,message:`Installed with npm`}}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}}}export{r as runDepsChecks};
@@ -0,0 +1 @@
1
+ import{runCliChecks as e}from"./cli.js";import{runConfigChecks as t}from"./config.js";import{runMcpChecks as n}from"./mcp.js";import{runDepsChecks as r}from"./deps.js";import{runWorkspaceChecks as i}from"./workspace.js";import{runAiChecks as a}from"./ai.js";
@@ -0,0 +1 @@
1
+ import{generateCursorMcpConfig as e,getClaudeDesktopConfigPath as t}from"../../setup/config-generators.js";import{deepMergePreserve as n,formatJson as r}from"../../setup/file-merger.js";async function i(e,t){let n=[];return n.push(await a(e,t)),n.push(await o(e,t)),n.push(await s(e,t)),n}async function a(t,n){let i=t.join(n.workspaceRoot,`.cursor`,`mcp.json`);return await t.exists(i)?{category:`mcp`,name:`Cursor MCP Config`,status:`pass`,message:`.cursor/mcp.json found`}:{category:`mcp`,name:`Cursor MCP Config`,status:`warn`,message:`.cursor/mcp.json not found`,details:`MCP integration with Cursor will not work`,fix:{description:`Create .cursor/mcp.json`,apply:async()=>{try{let a=t.join(n.workspaceRoot,`.cursor`);await t.exists(a)||await t.mkdir(a);let o=e();return await t.writeFile(i,r(o)),{success:!0,message:`Created .cursor/mcp.json`}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}}}async function o(t,i){let a=t.join(i.workspaceRoot,`.cursor`,`mcp.json`);if(!await t.exists(a))return{category:`mcp`,name:`MCP Server Registered`,status:`skip`,message:`Cursor MCP config does not exist`};try{let i=await t.readFile(a),o=JSON.parse(i);return o.mcpServers?.[`contractspec-local`]===void 0?{category:`mcp`,name:`MCP Server Registered`,status:`fail`,message:`ContractSpec MCP server not registered`,fix:{description:`Register ContractSpec MCP server`,apply:async()=>{try{let i=n(o,e());return await t.writeFile(a,r(i)),{success:!0,message:`Registered MCP server`}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}}:{category:`mcp`,name:`MCP Server Registered`,status:`pass`,message:`ContractSpec MCP server is registered`}}catch{return{category:`mcp`,name:`MCP Server Registered`,status:`skip`,message:`Could not parse Cursor MCP config`}}}async function s(e,n){let r=t();try{if(!await e.exists(r))return{category:`mcp`,name:`Claude Desktop MCP`,status:`skip`,message:`Claude Desktop config not found (optional)`};let t=await e.readFile(r);return JSON.parse(t).mcpServers?.[`contractspec-local`]===void 0?{category:`mcp`,name:`Claude Desktop MCP`,status:`warn`,message:`ContractSpec not registered in Claude Desktop`,details:`Optional: Run setup to configure Claude Desktop`}:{category:`mcp`,name:`Claude Desktop MCP`,status:`pass`,message:`ContractSpec registered in Claude Desktop`}}catch{return{category:`mcp`,name:`Claude Desktop MCP`,status:`skip`,message:`Could not check Claude Desktop config`}}}export{i as runMcpChecks};
@@ -0,0 +1 @@
1
+ async function e(e,a){let o=[];return o.push(await t(e,a)),o.push(await n(e,a)),o.push(await r(e,a)),o.push(await i(e,a)),o}async function t(e,t){let n=e.join(t.workspaceRoot,`package.json`);return await e.exists(n)?{category:`workspace`,name:`Valid Workspace`,status:`pass`,message:`package.json found`}:{category:`workspace`,name:`Valid Workspace`,status:`fail`,message:`No package.json found`,details:`This does not appear to be a Node.js/TypeScript project`}}async function n(e,t){for(let n of[`src/contracts`,`contracts`,`src/specs`,`specs`]){let r=e.join(t.workspaceRoot,n);if(await e.exists(r))return{category:`workspace`,name:`Contracts Directory`,status:`pass`,message:`Contracts directory found: ${n}`}}return{category:`workspace`,name:`Contracts Directory`,status:`warn`,message:`No contracts directory found`,details:`Create src/contracts/ to organize your specs`,fix:{description:`Create src/contracts/ directory`,apply:async()=>{try{let n=e.join(t.workspaceRoot,`src`,`contracts`);return await e.mkdir(n),{success:!0,message:`Created src/contracts/`}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}}}async function r(e,t){try{let n=await e.glob({patterns:[`**/*.contracts.ts`,`**/*.event.ts`,`**/*.presentation.ts`,`**/*.feature.ts`],ignore:[`node_modules/**`,`dist/**`]});return n.length>0?{category:`workspace`,name:`Contract Files`,status:`pass`,message:`Found ${n.length} contract file(s)`,details:t.verbose?n.slice(0,5).join(`, `):void 0}:{category:`workspace`,name:`Contract Files`,status:`warn`,message:`No contract files found`,details:`Create specs using "contractspec create" or VS Code command`}}catch{return{category:`workspace`,name:`Contract Files`,status:`skip`,message:`Could not search for contract files`}}}async function i(e,t){let n=e.join(t.workspaceRoot,`.contractsrc.json`);try{if(!await e.exists(n))return{category:`workspace`,name:`Output Directory`,status:`skip`,message:`No config file to check output directory`};let r=await e.readFile(n),i=JSON.parse(r).outputDir??`./src`,a=e.join(t.workspaceRoot,i);return await e.exists(a)?{category:`workspace`,name:`Output Directory`,status:`pass`,message:`Output directory exists: ${i}`}:{category:`workspace`,name:`Output Directory`,status:`warn`,message:`Output directory not found: ${i}`,fix:{description:`Create ${i} directory`,apply:async()=>{try{return await e.mkdir(a),{success:!0,message:`Created ${i}`}}catch(e){return{success:!1,message:`Failed: ${e instanceof Error?e.message:String(e)}`}}}}}}catch{return{category:`workspace`,name:`Output Directory`,status:`skip`,message:`Could not check output directory`}}}export{e as runWorkspaceChecks};
@@ -0,0 +1,2 @@
1
+ import{ALL_CHECK_CATEGORIES as e,CHECK_CATEGORY_LABELS as t}from"./types.js";import{runCliChecks as n}from"./checks/cli.js";import{runConfigChecks as r}from"./checks/config.js";import{runMcpChecks as i}from"./checks/mcp.js";import{runDepsChecks as a}from"./checks/deps.js";import{runWorkspaceChecks as o}from"./checks/workspace.js";import{runAiChecks as s}from"./checks/ai.js";import"./checks/index.js";const c={confirm:async()=>!1,input:async()=>``};async function l(n,r,i=c){let{fs:a,logger:o}=n,s=r.categories??e,l={workspaceRoot:r.workspaceRoot,verbose:r.verbose??!1},d=[];for(let e of s){if(r.skipAi&&e===`ai`)continue;o.info(`Checking ${t[e]}...`);let n=await u(e,a,l,i);for(let e of n){if(e.fix&&(e.status===`fail`||e.status===`warn`)&&(r.autoFix||await i.confirm(`Fix "${e.name}"? ${e.fix.description}`))){o.info(`Applying fix: ${e.fix.description}`);let t=await e.fix.apply();t.success?(o.info(`✓ ${t.message}`),e.status=`pass`,e.message=`Fixed: ${t.message}`,e.fix=void 0):o.warn(`✗ ${t.message}`)}d.push(e)}}let f=d.filter(e=>e.status===`pass`).length,p=d.filter(e=>e.status===`warn`).length,m=d.filter(e=>e.status===`fail`).length;return{checks:d,passed:f,warnings:p,failures:m,skipped:d.filter(e=>e.status===`skip`).length,healthy:m===0}}async function u(e,t,c,l){switch(e){case`cli`:return n(t,c);case`config`:return r(t,c);case`mcp`:return i(t,c);case`deps`:return a(t,c);case`workspace`:return o(t,c);case`ai`:return s(t,c,l);default:return[]}}function d(e){let t=[];return t.push(``),t.push(`=== Health Check Summary ===`),t.push(``),e.healthy?t.push(`✓ All checks passed!`):t.push(`✗ Some issues found`),t.push(``),t.push(` Passed: ${e.passed}`),t.push(` Warnings: ${e.warnings}`),t.push(` Failures: ${e.failures}`),t.push(` Skipped: ${e.skipped}`),t.join(`
2
+ `)}function f(e){let t=`${e.status===`pass`?`✓`:e.status===`warn`?`⚠`:e.status===`fail`?`✗`:`○`} ${e.name}: ${e.message}`;return e.details&&(t+=`\n ${e.details}`),e.fix&&(t+=`\n Fix available: ${e.fix.description}`),t}export{f as formatCheckResult,d as formatDoctorSummary,l as runDoctor};
@@ -0,0 +1 @@
1
+ import{ALL_CHECK_CATEGORIES as e,CHECK_CATEGORY_LABELS as t}from"./types.js";import{formatCheckResult as n,formatDoctorSummary as r,runDoctor as i}from"./doctor-service.js";
@@ -0,0 +1 @@
1
+ const e=[`cli`,`config`,`mcp`,`deps`,`workspace`,`ai`],t={cli:`CLI Installation`,config:`Configuration Files`,mcp:`MCP Server`,deps:`Dependencies`,workspace:`Workspace Structure`,ai:`AI Provider`};export{e as ALL_CHECK_CATEGORIES,t as CHECK_CATEGORY_LABELS};
@@ -1 +1 @@
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";
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";import{ALL_CHECK_CATEGORIES as Q,CHECK_CATEGORY_LABELS as $}from"./doctor/types.js";import{formatCheckResult as ee,formatDoctorSummary as te,runDoctor as ne}from"./doctor/doctor-service.js";import"./doctor/index.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lssm/bundle.contractspec-workspace",
3
- "version": "0.0.0-canary-20251216023757",
3
+ "version": "0.0.0-canary-20251216025701",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",