@happyvertical/smrt-dev-mcp 0.40.53 → 0.40.55

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/README.md CHANGED
@@ -381,7 +381,7 @@ Prompts:
381
381
 
382
382
  ## Dependencies
383
383
 
384
- - `@modelcontextprotocol/sdk` -- MCP server protocol
384
+ - `@modelcontextprotocol/server` -- MCP server protocol
385
385
  - `@happyvertical/smrt-core` -- manifest and object registry
386
386
  - `@happyvertical/smrt-types` -- shared domain knowledge contract
387
387
 
package/dist/index.d.ts CHANGED
@@ -1,8 +1,4 @@
1
- /**
2
- * SMRT Development MCP Server
3
- * Provides code generation, project introspection, knowledge context,
4
- * review/architecture prompt bundles, and portable agent skills.
5
- */
1
+ import { Server } from '@modelcontextprotocol/server';
6
2
  export declare const SERVER_VERSION: string;
7
3
  export declare const TOOLS: ({
8
4
  name: string;
@@ -911,4 +907,5 @@ export declare const TOOLS: ({
911
907
  required: string[];
912
908
  };
913
909
  })[];
910
+ export declare function createServer(): Server;
914
911
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoCH,eAAO,MAAM,cAAc,QAAuB,CAAC;AAcnD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgbjB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAGL,MAAM,EAEP,MAAM,8BAA8B,CAAC;AAqBtC,eAAO,MAAM,cAAc,QAAuB,CAAC;AAcnD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgbjB,CAAC;AAEF,wBAAgB,YAAY,IAAI,MAAM,CAmerC"}
package/dist/index.js CHANGED
@@ -3,9 +3,8 @@ import { a as checkKnowledgeFreshnessFromIndex, d as smrtReview, i as checkKnowl
3
3
  import { existsSync, readFileSync, realpathSync } from "node:fs";
4
4
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
5
5
  import { fileURLToPath, pathToFileURL } from "node:url";
6
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
7
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
8
- import { CallToolRequestSchema, ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, McpError, ReadResourceRequestSchema } from "@modelcontextprotocol/sdk/types.js";
6
+ import { ProtocolError, ProtocolErrorCode, Server } from "@modelcontextprotocol/server";
7
+ import { serveStdio } from "@modelcontextprotocol/server/stdio";
9
8
  import { ManifestAdapter, OxcScanner } from "@happyvertical/smrt-scanner";
10
9
  import { access, readFile, readdir } from "node:fs/promises";
11
10
  import { ManifestGenerator } from "@happyvertical/smrt-core/scanner";
@@ -1520,7 +1519,7 @@ var TOOLS = [
1520
1519
  }
1521
1520
  }
1522
1521
  ];
1523
- async function main() {
1522
+ function createServer() {
1524
1523
  if (DEBUG) console.error(`[${SERVER_NAME}] Starting server v${SERVER_VERSION}`);
1525
1524
  const server = new Server({
1526
1525
  name: SERVER_NAME,
@@ -1530,11 +1529,11 @@ async function main() {
1530
1529
  resources: {},
1531
1530
  tools: {}
1532
1531
  } });
1533
- server.setRequestHandler(ListToolsRequestSchema, async () => {
1532
+ server.setRequestHandler("tools/list", async () => {
1534
1533
  if (DEBUG) console.error(`[${SERVER_NAME}] ListTools request`);
1535
1534
  return { tools: TOOLS };
1536
1535
  });
1537
- server.setRequestHandler(ListPromptsRequestSchema, async () => {
1536
+ server.setRequestHandler("prompts/list", async () => {
1538
1537
  return { prompts: [
1539
1538
  {
1540
1539
  name: REVIEW_SKILL_NAME,
@@ -1617,7 +1616,7 @@ async function main() {
1617
1616
  }
1618
1617
  ] };
1619
1618
  });
1620
- server.setRequestHandler(GetPromptRequestSchema, async (request) => {
1619
+ server.setRequestHandler("prompts/get", async (request) => {
1621
1620
  const { name } = request.params;
1622
1621
  if (name === REVIEW_SKILL_NAME) return {
1623
1622
  description: "Use this procedure when reviewing downstream SMRT projects.",
@@ -1649,9 +1648,9 @@ async function main() {
1649
1648
  }
1650
1649
  }]
1651
1650
  };
1652
- throw new McpError(ErrorCode.InvalidParams, `Unknown prompt: ${name}`);
1651
+ throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Unknown prompt: ${name}`);
1653
1652
  });
1654
- server.setRequestHandler(ListResourcesRequestSchema, async () => {
1653
+ server.setRequestHandler("resources/list", async () => {
1655
1654
  const index = await buildKnowledgeIndex();
1656
1655
  return { resources: [
1657
1656
  {
@@ -1677,7 +1676,7 @@ async function main() {
1677
1676
  }))
1678
1677
  ] };
1679
1678
  });
1680
- server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
1679
+ server.setRequestHandler("resources/read", async (request) => {
1681
1680
  const { uri } = request.params;
1682
1681
  if (uri === REVIEW_SKILL_URI) return { contents: [{
1683
1682
  uri,
@@ -1695,16 +1694,16 @@ async function main() {
1695
1694
  if (uri.startsWith(KNOWLEDGE_PACKAGE_PREFIX)) {
1696
1695
  const packageName = decodeURIComponent(uri.slice(25));
1697
1696
  const pkg = (await buildKnowledgeIndex()).packages.find((item) => item.name === packageName);
1698
- if (!pkg) throw new McpError(ErrorCode.InvalidParams, `Unknown knowledge package: ${packageName}`);
1697
+ if (!pkg) throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Unknown knowledge package: ${packageName}`);
1699
1698
  return { contents: [{
1700
1699
  uri,
1701
1700
  mimeType: "application/json",
1702
1701
  text: JSON.stringify(sanitizeKnowledgePackage(pkg), null, 2)
1703
1702
  }] };
1704
1703
  }
1705
- throw new McpError(ErrorCode.InvalidParams, `Unknown resource: ${uri}`);
1704
+ throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Unknown resource: ${uri}`);
1706
1705
  });
1707
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
1706
+ server.setRequestHandler("tools/call", async (request) => {
1708
1707
  const { name, arguments: args } = request.params;
1709
1708
  if (DEBUG) {
1710
1709
  console.error(`[${SERVER_NAME}] CallTool: ${name}`);
@@ -1798,17 +1797,19 @@ async function main() {
1798
1797
  };
1799
1798
  }
1800
1799
  });
1801
- const transport = new StdioServerTransport();
1802
- await server.connect(transport);
1800
+ return server;
1801
+ }
1802
+ async function main() {
1803
+ const handle = serveStdio(() => createServer(), { onerror: (error) => console.error(`[${SERVER_NAME}] Protocol error:`, error) });
1803
1804
  if (DEBUG) console.error(`[${SERVER_NAME}] Server connected via stdio`);
1804
1805
  process.on("SIGINT", async () => {
1805
1806
  if (DEBUG) console.error(`[${SERVER_NAME}] Shutting down...`);
1806
- await server.close();
1807
+ await handle.close();
1807
1808
  process.exit(0);
1808
1809
  });
1809
1810
  process.on("SIGTERM", async () => {
1810
1811
  if (DEBUG) console.error(`[${SERVER_NAME}] Shutting down...`);
1811
- await server.close();
1812
+ await handle.close();
1812
1813
  process.exit(0);
1813
1814
  });
1814
1815
  }
@@ -1945,6 +1946,6 @@ if (isEntrypoint()) main().catch((error) => {
1945
1946
  process.exit(1);
1946
1947
  });
1947
1948
  //#endregion
1948
- export { SERVER_VERSION, TOOLS };
1949
+ export { SERVER_VERSION, TOOLS, createServer };
1949
1950
 
1950
1951
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/agent-skills.ts","../src/tools/generate-smrt-class.ts","../src/tools/introspect-project.ts","../src/tools/review-smrt-project.ts","../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface AgentSkillSummary {\n name: string;\n description: string;\n path: string;\n references: string[];\n}\n\nexport interface AgentSkillBundle extends AgentSkillSummary {\n skillMarkdown: string;\n referenceFiles: Array<{\n path: string;\n content: string;\n }>;\n}\n\ninterface AgentSkillDefinition extends AgentSkillSummary {\n skillFile: string;\n}\n\nconst AGENT_SKILLS: AgentSkillDefinition[] = [\n {\n name: 'smrt-code-review',\n description:\n 'Harness-agnostic downstream SMRT code review workflow using smrt-dev-mcp deterministic context and prompt bundles.',\n path: 'agent-skills/smrt-code-review/SKILL.md',\n skillFile: 'agent-skills/smrt-code-review/SKILL.md',\n references: ['agent-skills/smrt-code-review/references/review-output.md'],\n },\n];\n\nexport function listAgentSkills(): AgentSkillSummary[] {\n return AGENT_SKILLS.map(({ skillFile: _skillFile, ...skill }) => skill);\n}\n\nexport function getAgentSkill(options: {\n name: string;\n includeReferences?: boolean;\n}): AgentSkillBundle {\n const skill = AGENT_SKILLS.find((item) => item.name === options.name);\n if (!skill) {\n throw new Error(`Unknown agent skill: ${options.name}`);\n }\n\n return {\n name: skill.name,\n description: skill.description,\n path: skill.path,\n references: skill.references,\n skillMarkdown: readPackageFile(skill.skillFile),\n referenceFiles:\n options.includeReferences === false\n ? []\n : skill.references.map((path) => ({\n path,\n content: readPackageFile(path),\n })),\n };\n}\n\nfunction readPackageFile(relativePath: string): string {\n const packageRoot = resolvePackageRoot();\n return readFileSync(join(packageRoot, relativePath), 'utf8');\n}\n\nfunction resolvePackageRoot(): string {\n // Works in both source tests (`src/agent-skills.ts`) and built packages\n // (`dist/agent-skills.js`); guard it so packaging layout drift fails clearly.\n const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));\n if (!existsSync(join(packageRoot, 'package.json'))) {\n throw new Error(\n `Unable to resolve smrt-dev-mcp package root from ${import.meta.url}`,\n );\n }\n return packageRoot;\n}\n","/**\n * Generate SMRT Class Tool\n * Creates a package-ready SMRT class using current object-package patterns.\n */\n\ntype PropertyType =\n | 'text'\n | 'integer'\n | 'decimal'\n | 'boolean'\n | 'datetime'\n | 'json';\ntype BaseClass = 'SmrtObject' | 'SmrtCollection';\ntype TemplateVariant =\n | 'basic'\n | 'global-catalog'\n | 'optional-catalog'\n | 'tenant-project-object'\n | 'tenant-event-log-object'\n | 'cross-package-reference';\ntype RelationshipType =\n | 'foreignKey'\n | 'crossPackageRef'\n | 'oneToMany'\n | 'manyToMany';\n\ninterface PropertyDefinition {\n name: string;\n type: PropertyType;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n defaultValue?: unknown;\n}\n\ninterface RelationshipDefinition {\n name: string;\n type: RelationshipType;\n related: string;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n validate?: boolean;\n foreignKey?: string;\n through?: string;\n sourceKey?: string;\n targetKey?: string;\n}\n\ninterface TenantScopedDefinition {\n mode?: 'required' | 'optional';\n field?: string;\n autoFilter?: boolean;\n autoPopulate?: boolean;\n allowSuperAdminBypass?: boolean;\n}\n\ninterface GenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass?: BaseClass;\n template?: TemplateVariant;\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: boolean | TenantScopedDefinition;\n includeTenantIdField?: boolean;\n relationships?: RelationshipDefinition[];\n includeApiConfig?: boolean;\n includeMcpConfig?: boolean;\n includeCliConfig?: boolean;\n includeCompanionSnippets?: boolean;\n}\n\ninterface NormalizedGenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass: BaseClass;\n template: TemplateVariant;\n tableName?: string;\n conflictColumns: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField: boolean;\n relationships: RelationshipDefinition[];\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n includeCompanionSnippets: boolean;\n}\n\nconst TYPE_MAPPING: Record<\n PropertyType,\n { tsType: string; defaultValue: string }\n> = {\n text: { tsType: 'string', defaultValue: \"''\" },\n integer: { tsType: 'number', defaultValue: '0' },\n decimal: { tsType: 'number', defaultValue: '0.0' },\n boolean: { tsType: 'boolean', defaultValue: 'false' },\n datetime: { tsType: 'Date', defaultValue: 'new Date()' },\n json: { tsType: 'any', defaultValue: '{}' },\n};\n\nexport async function generateSmrtClass(\n args: GenerateSmrtClassArgs,\n): Promise<string> {\n const normalized = normalizeArgs(args);\n const {\n className,\n properties,\n relationships,\n baseClass,\n tableName,\n conflictColumns,\n tenantScoped,\n includeTenantIdField,\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n includeCompanionSnippets,\n } = normalized;\n\n const coreImports = new Set<string>([baseClass, 'smrt']);\n if (needsFieldDecorator(properties)) coreImports.add('field');\n for (const relationship of relationships) {\n coreImports.add(relationship.type);\n }\n\n const imports = [\n `import { ${Array.from(coreImports).join(', ')} } from '@happyvertical/smrt-core';`,\n ];\n\n if (tenantScoped) {\n const tenancyImports = ['TenantScoped'];\n if (includeTenantIdField) tenancyImports.push('tenantId');\n imports.push(\n `import { ${tenancyImports.join(', ')} } from '@happyvertical/smrt-tenancy';`,\n );\n }\n\n const decoratorLines = [\n ...(tenantScoped\n ? [`@TenantScoped(${renderObjectLiteral({ ...tenantScoped })})`]\n : []),\n renderSmrtDecorator({\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n tableName,\n conflictColumns,\n }),\n ];\n\n const classMembers = [\n ...(includeTenantIdField && tenantScoped\n ? [renderTenantIdField(tenantScoped)]\n : []),\n ...properties.map(renderProperty),\n ...relationships.map(renderRelationship),\n ].filter(Boolean);\n\n const companionSnippets = includeCompanionSnippets\n ? `\\n${renderCompanionSnippets(className, Boolean(tenantScoped))}`\n : '';\n\n return `${imports.join('\\n')}\n\n${decoratorLines.join('\\n')}\nexport class ${className} extends ${baseClass} {\n${classMembers.join('\\n\\n')}\n\n constructor(options: any = {}) {\n super(options);\n Object.assign(this, options);\n }\n}\n${companionSnippets}`;\n}\n\nfunction normalizeArgs(\n args: GenerateSmrtClassArgs,\n): NormalizedGenerateSmrtClassArgs {\n const template = args.template ?? 'basic';\n const templateDefaults = defaultsForTemplate(template);\n const tenantScoped =\n args.tenantScoped === true\n ? (templateDefaults.tenantScoped ?? { mode: 'required' as const })\n : args.tenantScoped === false\n ? undefined\n : (args.tenantScoped ?? templateDefaults.tenantScoped);\n\n return {\n className: args.className,\n properties: args.properties,\n baseClass: args.baseClass ?? 'SmrtObject',\n template,\n tableName: args.tableName ?? templateDefaults.tableName,\n conflictColumns:\n args.conflictColumns ?? templateDefaults.conflictColumns ?? [],\n tenantScoped: normalizeTenantScoped(tenantScoped),\n includeTenantIdField:\n args.includeTenantIdField ??\n templateDefaults.includeTenantIdField ??\n Boolean(tenantScoped),\n relationships: args.relationships ?? [],\n includeApiConfig: args.includeApiConfig ?? true,\n includeMcpConfig: args.includeMcpConfig ?? true,\n includeCliConfig: args.includeCliConfig ?? true,\n includeCompanionSnippets: args.includeCompanionSnippets ?? false,\n };\n}\n\nfunction defaultsForTemplate(template: TemplateVariant): {\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField?: boolean;\n} {\n switch (template) {\n case 'optional-catalog':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n conflictColumns: ['tenant_id', 'slug'],\n };\n case 'tenant-project-object':\n return {\n tenantScoped: { mode: 'required' },\n includeTenantIdField: true,\n };\n case 'tenant-event-log-object':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n };\n case 'global-catalog':\n return { conflictColumns: ['slug'] };\n case 'cross-package-reference':\n case 'basic':\n return {};\n }\n}\n\nfunction normalizeTenantScoped(\n value: boolean | TenantScopedDefinition | undefined,\n): TenantScopedDefinition | undefined {\n if (!value) return undefined;\n return {\n mode: typeof value === 'object' ? (value.mode ?? 'required') : 'required',\n field: typeof value === 'object' ? (value.field ?? 'tenantId') : 'tenantId',\n autoFilter: typeof value === 'object' ? value.autoFilter : undefined,\n autoPopulate: typeof value === 'object' ? value.autoPopulate : undefined,\n allowSuperAdminBypass:\n typeof value === 'object' ? value.allowSuperAdminBypass : undefined,\n };\n}\n\nfunction renderSmrtDecorator(options: {\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n tableName?: string;\n conflictColumns: string[];\n}): string {\n const decoratorConfig: Record<string, unknown> = {};\n\n if (options.tableName) {\n decoratorConfig.tableName = options.tableName;\n }\n\n if (options.conflictColumns.length > 0) {\n decoratorConfig.conflictColumns = options.conflictColumns;\n }\n\n if (options.includeApiConfig) {\n decoratorConfig.api = {\n include: ['list', 'get', 'create', 'update'],\n exclude: ['delete'],\n };\n }\n\n if (options.includeMcpConfig) {\n decoratorConfig.mcp = {\n include: ['list', 'get'],\n };\n }\n\n if (options.includeCliConfig) {\n decoratorConfig.cli = true;\n }\n\n return Object.keys(decoratorConfig).length > 0\n ? `@smrt(${JSON.stringify(decoratorConfig, null, 2)})`\n : '@smrt()';\n}\n\nfunction renderTenantIdField(tenantScoped: TenantScopedDefinition): string {\n const nullable = tenantScoped.mode === 'optional';\n const field = tenantScoped.field ?? 'tenantId';\n return nullable\n ? ` @tenantId({ nullable: true })\\n ${field}: string | null = null;`\n : ` @tenantId()\\n ${field}: string = '';`;\n}\n\nfunction renderProperty(prop: PropertyDefinition): string {\n const mapping = TYPE_MAPPING[prop.type];\n const nullable = prop.nullable === true;\n const tsType = nullable ? `${mapping.tsType} | null` : mapping.tsType;\n const defaultValue =\n prop.defaultValue !== undefined\n ? renderLiteral(prop.defaultValue)\n : nullable\n ? 'null'\n : mapping.defaultValue;\n const fieldOptions = compactObject({\n required: prop.required,\n nullable: prop.nullable,\n description: prop.description,\n });\n const jsdoc = prop.description ? ` /** ${prop.description} */\\n` : '';\n const decorator =\n Object.keys(fieldOptions).length > 0\n ? ` @field(${JSON.stringify(fieldOptions)})\\n`\n : '';\n\n return `${jsdoc}${decorator} ${prop.name}: ${tsType} = ${defaultValue};`;\n}\n\nfunction renderRelationship(relationship: RelationshipDefinition): string {\n const options = compactObject({\n required: relationship.required,\n nullable: relationship.nullable,\n description: relationship.description,\n validate: relationship.validate,\n foreignKey: relationship.foreignKey,\n through: relationship.through,\n sourceKey: relationship.sourceKey,\n targetKey: relationship.targetKey,\n });\n const args = [\n renderLiteral(relationship.related),\n ...(Object.keys(options).length > 0 ? [JSON.stringify(options)] : []),\n ];\n const decorator = `@${relationship.type}(${args.join(', ')})`;\n const fieldType =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? 'unknown[]'\n : relationship.nullable\n ? 'string | null'\n : 'string';\n const defaultValue =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? '[]'\n : relationship.nullable\n ? 'null'\n : \"''\";\n\n return ` ${decorator}\\n ${relationship.name}: ${fieldType} = ${defaultValue};`;\n}\n\nfunction needsFieldDecorator(properties: PropertyDefinition[]): boolean {\n return properties.some(\n (property) =>\n property.required !== undefined ||\n property.nullable !== undefined ||\n property.description !== undefined,\n );\n}\n\nfunction renderCompanionSnippets(\n className: string,\n usesTenantScoped: boolean,\n): string {\n const dependencyNote = usesTenantScoped\n ? `\\n * - Ensure package.json declares \"@happyvertical/smrt-tenancy\".`\n : '';\n return `/*\n * Package wiring:\n * - Export ${className} from the package entrypoint used by consumers.\n * - Import this module from any package registration file that eagerly loads objects.${dependencyNote}\n */`;\n}\n\nfunction renderObjectLiteral(value: Record<string, unknown>): string {\n return JSON.stringify(compactObject(value), null, 2);\n}\n\nfunction renderLiteral(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (value === null) return 'null';\n return JSON.stringify(value, null, 2);\n}\n\nfunction compactObject<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n","/**\n * Project Introspection Tool\n * Returns a manifest-equivalent inventory of SMRT objects in a project.\n */\n\nimport type { Dirent } from 'node:fs';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { isAbsolute, join, relative, resolve } from 'node:path';\nimport {\n ManifestGenerator,\n type SmartObjectManifest,\n} from '@happyvertical/smrt-core/scanner';\nimport type { ScanError } from '@happyvertical/smrt-scanner';\nimport { ManifestAdapter, OxcScanner } from '@happyvertical/smrt-scanner';\n\n/**\n * `summary` (default) returns one compact record per object; `full` returns the\n * verbose shape. A 42-object project produced 338,462 characters in the only\n * mode that used to exist, which put every call over tool-result budgets and\n * forced callers to write-to-file and `jq` (#2143).\n */\nexport type IntrospectDetail = 'summary' | 'full';\n\n/** Common shape both detail modes emit, so the two branches share a list. */\ntype IntrospectedObject = Record<string, unknown> & { className: string };\n\ninterface IntrospectProjectArgs {\n directory?: string;\n manifestPath?: string;\n includeFields?: boolean;\n includeRelationships?: boolean;\n includeMethods?: boolean;\n detail?: IntrospectDetail;\n /**\n * Overrides the default character budget for the serialized `objects` array.\n *\n * Project metadata and diagnostics are deliberately exempt: a diagnostic is\n * how discovery reports that it found nothing (#2143), so budgeting it away\n * would hide the very failure the caller needs to see. The full response is\n * therefore somewhat larger than this budget.\n */\n maxChars?: number;\n}\n\ntype DiagnosticSeverity = 'error' | 'warning' | 'info';\n\ninterface Diagnostic {\n severity: DiagnosticSeverity;\n message: string;\n filePath?: string;\n line?: number;\n column?: number;\n}\n\ninterface ManifestLike {\n version?: string;\n packageName?: string;\n packageVersion?: string;\n objects?: Record<string, ManifestObject>;\n}\n\ninterface ManifestObject {\n name?: string;\n className: string;\n qualifiedName?: string;\n collection?: string;\n filePath: string;\n packageName?: string;\n packageVersion?: string;\n importPath?: string;\n modulePath?: string;\n exportName?: string;\n collectionExportName?: string;\n fields?: Record<string, ManifestField>;\n methods?: Record<string, ManifestMethod>;\n decoratorConfig?: Record<string, unknown>;\n extends?: string;\n extendsTypeArg?: string;\n schema?: ManifestSchema;\n staticProperties?: Record<string, unknown>;\n validationRules?: Record<string, unknown>;\n}\n\ninterface ManifestField {\n type: string;\n required?: boolean;\n default?: unknown;\n related?: string;\n description?: string;\n _meta?: Record<string, unknown>;\n transient?: boolean;\n}\n\ninterface ManifestMethod {\n name?: string;\n async?: boolean;\n parameters?: Array<{\n name: string;\n type?: string;\n optional?: boolean;\n default?: unknown;\n }>;\n returnType?: string;\n description?: string;\n isStatic?: boolean;\n isPublic?: boolean;\n}\n\ninterface ManifestSchema {\n tableName?: string;\n ddl?: string;\n columns?: Record<string, unknown>;\n indexes?: Array<{\n name?: string;\n columns?: string[];\n unique?: boolean;\n where?: string;\n jsonPath?: unknown;\n }>;\n version?: string;\n}\n\ninterface PackageMetadata {\n name?: string;\n version?: string;\n json?: Record<string, unknown>;\n}\n\nconst DEFAULT_MANIFEST_PATHS = [\n '.smrt/manifest.json',\n 'dist/manifest.json',\n 'src/manifest/manifest.json',\n];\n\nconst SCAN_EXCLUDE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.smrt/**',\n '**/*.d.ts',\n '**/*.test.ts',\n '**/*.spec.ts',\n '**/__tests__/**',\n];\n\nconst RELATIONSHIP_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n]);\n\n/**\n * Response budget in characters. Generous enough that a 42-object summary never\n * truncates, while still capping a runaway payload instead of emitting one.\n */\nconst DEFAULT_MAX_CHARS = 50_000;\n\nconst DEFAULT_MCP_OPERATIONS = ['list', 'get', 'create', 'update', 'delete'];\n\nexport async function introspectProject(\n args: IntrospectProjectArgs,\n): Promise<string> {\n const {\n directory = process.cwd(),\n includeFields = true,\n includeRelationships = true,\n includeMethods = true,\n detail = 'summary',\n maxChars = DEFAULT_MAX_CHARS,\n } = args;\n const projectPath = resolve(directory);\n\n const exists = await pathExists(projectPath);\n if (!exists) {\n return JSON.stringify(\n {\n projectPath,\n manifestSource: 'none',\n objectCount: 0,\n objects: [],\n diagnostics: [\n {\n severity: 'warning',\n message: `Project directory does not exist: ${projectPath}`,\n },\n ],\n },\n null,\n 2,\n );\n }\n\n const packageMetadata = await readPackageMetadata(projectPath);\n const tenantScopes = await scanTenantScopes(projectPath);\n const manifestResult =\n (await loadManifestArtifact(projectPath, args.manifestPath)) ??\n (await scanSourceManifest(projectPath, packageMetadata));\n\n const entries = Object.entries(manifestResult.manifest.objects ?? {});\n const objects: IntrospectedObject[] =\n detail === 'summary'\n ? entries.map(([manifestKey, object]) =>\n summarizeObject({\n manifestKey,\n object,\n projectPath,\n tenantScope: tenantScopes.get(object.className),\n }),\n )\n : entries.map(([manifestKey, object]) =>\n formatObject({\n manifestKey,\n object,\n projectPath,\n includeFields,\n includeRelationships,\n includeMethods,\n tenantScope: tenantScopes.get(object.className),\n }),\n );\n objects.sort((left, right) => left.className.localeCompare(right.className));\n\n const { kept, omitted } = applyObjectBudget(objects, maxChars);\n\n const output = {\n projectPath,\n manifestSource: manifestResult.source,\n manifestPath:\n 'path' in manifestResult\n ? relative(projectPath, manifestResult.path)\n : undefined,\n packageName:\n manifestResult.manifest.packageName ?? packageMetadata.name ?? undefined,\n packageVersion:\n manifestResult.manifest.packageVersion ??\n packageMetadata.version ??\n undefined,\n detail,\n objectCount: objects.length,\n scannedFileCount: manifestResult.scannedFileCount,\n parseTimeMs: manifestResult.parseTimeMs,\n ...(omitted > 0\n ? {\n truncated: {\n returnedObjectCount: kept.length,\n omittedObjectCount: omitted,\n budgetChars: maxChars,\n guidance:\n 'The object list hit its character budget; metadata and diagnostics are still complete. Narrow the scan with `directory` (a single package), keep `detail: \"summary\"`, or raise `maxChars` deliberately. Object names are sorted alphabetically, so omitted objects are the alphabetical tail.',\n },\n }\n : {}),\n objects: kept,\n diagnostics: manifestResult.diagnostics,\n };\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Trims the object list to the character budget, always keeping at least one so\n * a caller sees the shape rather than an empty list.\n */\nfunction applyObjectBudget<T>(\n objects: T[],\n maxChars: number,\n): { kept: T[]; omitted: number } {\n const kept: T[] = [];\n let used = 0;\n\n for (const object of objects) {\n const size = JSON.stringify(object, null, 2).length + 2;\n if (used + size > maxChars && kept.length > 0) break;\n used += size;\n kept.push(object);\n }\n\n return { kept, omitted: objects.length - kept.length };\n}\n\nfunction summarizeObject({\n manifestKey,\n object,\n projectPath,\n tenantScope,\n}: {\n manifestKey: string;\n object: ManifestObject;\n projectPath: string;\n tenantScope?: Record<string, unknown>;\n}) {\n const fields = Object.entries(object.fields ?? {});\n const decoratorConfig = object.decoratorConfig ?? {};\n\n return compactObject({\n manifestKey,\n className: object.className,\n qualifiedName: object.qualifiedName,\n filePath: sanitizePath(projectPath, object.filePath),\n extends: object.extends,\n collection: object.collection,\n tableName:\n object.schema?.tableName ??\n stringFromConfig(decoratorConfig.tableName) ??\n object.collection,\n tenantScope:\n tenantScope ?? normalizeTenantScopedConfig(decoratorConfig.tenantScoped),\n fieldCount: fields.length,\n relationships:\n fields\n .filter(([, field]) => RELATIONSHIP_TYPES.has(field.type))\n .map(\n ([name, field]) =>\n `${name} -> ${field.related ?? ''} (${field.type})`,\n )\n .join(', ') || undefined,\n mcpOperations: mcpOperationsFromConfig(decoratorConfig.mcp),\n });\n}\n\n/**\n * An omitted `mcp` config means full CRUD, not a closed surface — the same rule\n * the knowledge index applies.\n */\nfunction mcpOperationsFromConfig(config: unknown): string[] {\n if (config === false) return [];\n if (typeof config !== 'object' || config === null || Array.isArray(config)) {\n return [...DEFAULT_MCP_OPERATIONS];\n }\n\n const record = config as Record<string, unknown>;\n const include = Array.isArray(record.include)\n ? record.include.filter((item): item is string => typeof item === 'string')\n : DEFAULT_MCP_OPERATIONS;\n const exclude = new Set(\n Array.isArray(record.exclude)\n ? record.exclude.filter(\n (item): item is string => typeof item === 'string',\n )\n : [],\n );\n\n return include.filter((operation) => !exclude.has(operation));\n}\n\nasync function loadManifestArtifact(\n projectPath: string,\n manifestPath: string | undefined,\n): Promise<\n | {\n source: 'manifest';\n path: string;\n manifest: ManifestLike;\n diagnostics: Diagnostic[];\n scannedFileCount?: number;\n parseTimeMs?: number;\n }\n | undefined\n> {\n const candidates = manifestPath\n ? [resolve(projectPath, manifestPath)]\n : DEFAULT_MANIFEST_PATHS.map((candidate) => join(projectPath, candidate));\n\n const diagnostics: Diagnostic[] = [];\n for (const candidate of candidates) {\n if (!(await pathExists(candidate))) {\n continue;\n }\n\n try {\n const parsed = JSON.parse(await readFile(candidate, 'utf-8')) as unknown;\n if (isManifestLike(parsed)) {\n return {\n source: 'manifest',\n path: candidate,\n manifest: parsed,\n diagnostics,\n };\n }\n\n diagnostics.push({\n severity: 'warning',\n filePath: candidate,\n message: 'Manifest artifact is present but does not contain objects.',\n });\n } catch (error) {\n diagnostics.push({\n severity: 'error',\n filePath: candidate,\n message: `Unable to parse manifest artifact: ${messageFromError(error)}`,\n });\n }\n }\n\n return manifestPath\n ? {\n source: 'manifest',\n path: resolve(projectPath, manifestPath),\n manifest: { objects: {} },\n diagnostics: [\n ...diagnostics,\n {\n severity: 'warning',\n filePath: resolve(projectPath, manifestPath),\n message: 'Requested manifest artifact was not found.',\n },\n ],\n }\n : undefined;\n}\n\nasync function scanSourceManifest(\n projectPath: string,\n packageMetadata: PackageMetadata,\n): Promise<{\n source: 'scanner';\n manifest: ManifestLike;\n diagnostics: Diagnostic[];\n scannedFileCount: number;\n parseTimeMs: number;\n}> {\n const scanner = new OxcScanner({\n cwd: projectPath,\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: SCAN_EXCLUDE,\n });\n const { results, resolved } = await scanner.scanAndResolve();\n const adapter = new ManifestAdapter();\n const manifest = adapter.toManifest(\n resolved.filter((classDef) => classDef.hasSmartDecorator),\n {\n packageName: packageMetadata.name,\n packageVersion: packageMetadata.version,\n typeAliases: results.typeAliases,\n },\n ) as ManifestLike;\n finalizeScannerManifest(manifest, packageMetadata);\n\n return {\n source: 'scanner',\n manifest,\n diagnostics: results.errors.map(scanErrorToDiagnostic),\n scannedFileCount: results.fileCount,\n parseTimeMs: Math.round(results.totalParseTimeMs),\n };\n}\n\nfunction finalizeScannerManifest(\n manifest: ManifestLike,\n packageMetadata: PackageMetadata,\n): void {\n const manifestGen = new ManifestGenerator();\n const fullManifest = manifest as unknown as SmartObjectManifest;\n withSuppressedConsoleLog(() => {\n manifestGen.injectTenantScopedFields(fullManifest);\n manifestGen.mergeInheritedFields(fullManifest);\n manifestGen.generateValidationRules(fullManifest);\n manifestGen.generateSchemas(fullManifest);\n manifestGen.assertTenantScopedSchemaContract(fullManifest);\n manifestGen.generateAgentManifests(\n fullManifest,\n packageMetadata.name,\n packageMetadata.json,\n );\n });\n}\n\nfunction withSuppressedConsoleLog<T>(callback: () => T): T {\n const originalLog = console.log;\n console.log = () => undefined;\n try {\n return callback();\n } finally {\n console.log = originalLog;\n }\n}\n\nfunction formatObject({\n manifestKey,\n object,\n projectPath,\n includeFields,\n includeRelationships,\n includeMethods,\n tenantScope,\n}: {\n manifestKey: string;\n object: ManifestObject;\n projectPath: string;\n includeFields: boolean;\n includeRelationships: boolean;\n includeMethods: boolean;\n tenantScope?: Record<string, unknown>;\n}) {\n const fieldDetails = Object.entries(object.fields ?? {}).map(\n ([name, field]) => ({\n name,\n type: field.type,\n ...(field.required !== undefined ? { required: field.required } : {}),\n ...(field.default !== undefined ? { default: field.default } : {}),\n ...(field.related ? { related: field.related } : {}),\n ...(field.description ? { description: field.description } : {}),\n ...(field._meta ? { meta: field._meta } : {}),\n ...(field.transient !== undefined ? { transient: field.transient } : {}),\n }),\n );\n const relationshipDetails = fieldDetails\n .filter((field) => RELATIONSHIP_TYPES.has(field.type))\n .map((field) => ({\n field: field.name,\n relatedClass: field.related ?? '',\n type: field.type,\n ...(field.meta ? { meta: field.meta } : {}),\n }));\n const methodDetails = Object.entries(object.methods ?? {}).map(\n ([name, method]) => ({\n name: method.name ?? name,\n isAsync: method.async === true,\n isStatic: method.isStatic === true,\n isPublic: method.isPublic !== false,\n parameters: method.parameters ?? [],\n returnType: method.returnType ?? 'unknown',\n ...(method.description ? { description: method.description } : {}),\n }),\n );\n\n const decoratorConfig = object.decoratorConfig ?? {};\n const effectiveTenantScope =\n tenantScope ?? normalizeTenantScopedConfig(decoratorConfig.tenantScoped);\n const schema = object.schema;\n\n return compactObject({\n manifestKey,\n name: object.name,\n className: object.className,\n qualifiedName: object.qualifiedName,\n filePath: sanitizePath(projectPath, object.filePath),\n packageName: object.packageName,\n packageVersion: object.packageVersion,\n importPath: object.importPath,\n modulePath: object.modulePath,\n exportName: object.exportName,\n collectionExportName: object.collectionExportName,\n collection: object.collection,\n extends: object.extends,\n extendsTypeArg: object.extendsTypeArg,\n tableName:\n schema?.tableName ??\n stringFromConfig(decoratorConfig.tableName) ??\n object.collection,\n tableStrategy: stringFromConfig(decoratorConfig.tableStrategy) ?? 'cti',\n conflictColumns: arrayFromConfig(decoratorConfig.conflictColumns),\n tenantScope: effectiveTenantScope,\n decoratorConfig,\n schema: schema\n ? {\n tableName: schema.tableName,\n columns: schema.columns,\n indexes: schema.indexes ?? [],\n version: schema.version,\n }\n : undefined,\n indexes: schema?.indexes ?? [],\n staticProperties: object.staticProperties,\n validationRules: object.validationRules,\n ...(includeFields && {\n fields: fieldDetails\n .map((field) => `${field.name}: ${field.type}`)\n .join(', '),\n fieldDetails,\n }),\n ...(includeRelationships &&\n relationshipDetails.length > 0 && {\n relationships: relationshipDetails\n .map(\n (relationship) =>\n `${relationship.field} -> ${relationship.relatedClass} (${relationship.type})`,\n )\n .join(', '),\n relationshipDetails,\n }),\n ...(includeMethods &&\n methodDetails.length > 0 && {\n methods: methodDetails\n .map((method) => `${method.isAsync ? 'async ' : ''}${method.name}()`)\n .join(', '),\n methodDetails,\n }),\n });\n}\n\nasync function scanTenantScopes(\n projectPath: string,\n): Promise<Map<string, Record<string, unknown>>> {\n const files = await listSourceFiles(projectPath);\n const scopes = new Map<string, Record<string, unknown>>();\n\n await Promise.all(\n files.map(async (filePath) => {\n const content = await readFile(filePath, 'utf-8');\n const classMatches = content.matchAll(/class\\s+([A-Za-z_]\\w*)\\b/g);\n for (const match of classMatches) {\n const className = match[1];\n if (!className || match.index === undefined) continue;\n const prefix = content.slice(\n Math.max(0, match.index - 800),\n match.index,\n );\n const tenantMatches = Array.from(\n prefix.matchAll(/@TenantScoped\\s*\\(([\\s\\S]*?)\\)/g),\n );\n const tenantMatch = tenantMatches.at(-1);\n if (!tenantMatch) continue;\n scopes.set(className, {\n source: 'TenantScoped',\n ...parseTenantScopedOptions(tenantMatch[1]),\n });\n }\n }),\n );\n\n return scopes;\n}\n\nasync function listSourceFiles(projectPath: string): Promise<string[]> {\n const files: string[] = [];\n\n async function visit(dir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (\n [\n 'node_modules',\n 'dist',\n 'build',\n '.git',\n '.smrt',\n '__tests__',\n ].includes(entry.name) ||\n entry.name.startsWith('.')\n ) {\n continue;\n }\n await visit(fullPath);\n continue;\n }\n\n if (\n entry.isFile() &&\n /\\.(tsx?|jsx?)$/.test(entry.name) &&\n !entry.name.endsWith('.d.ts') &&\n !entry.name.endsWith('.test.ts') &&\n !entry.name.endsWith('.spec.ts')\n ) {\n files.push(fullPath);\n }\n }\n }\n\n await visit(projectPath);\n return files;\n}\n\nfunction parseTenantScopedOptions(raw: string): Record<string, unknown> {\n const mode = raw.match(/mode\\s*:\\s*['\"`](required|optional)['\"`]/)?.[1];\n const field = raw.match(/field\\s*:\\s*['\"`]([A-Za-z_]\\w*)['\"`]/)?.[1];\n const allowSuperAdminBypass = raw.match(\n /allowSuperAdminBypass\\s*:\\s*(true|false)/,\n )?.[1];\n const autoFilter = raw.match(/autoFilter\\s*:\\s*(true|false)/)?.[1];\n const autoPopulate = raw.match(/autoPopulate\\s*:\\s*(true|false)/)?.[1];\n\n return compactObject({\n mode: mode ?? 'required',\n field: field ?? 'tenantId',\n autoFilter: autoFilter === undefined ? undefined : autoFilter === 'true',\n autoPopulate:\n autoPopulate === undefined ? undefined : autoPopulate === 'true',\n allowSuperAdminBypass:\n allowSuperAdminBypass === undefined\n ? undefined\n : allowSuperAdminBypass === 'true',\n });\n}\n\nfunction normalizeTenantScopedConfig(\n tenantScoped: unknown,\n): Record<string, unknown> | undefined {\n if (!tenantScoped) return undefined;\n const options =\n typeof tenantScoped === 'object' && !Array.isArray(tenantScoped)\n ? (tenantScoped as Record<string, unknown>)\n : {};\n return {\n source: 'smrt',\n mode: options.mode ?? 'required',\n field: options.field ?? 'tenantId',\n autoFilter: options.autoFilter ?? true,\n autoPopulate: options.autoPopulate ?? true,\n allowSuperAdminBypass: options.allowSuperAdminBypass ?? false,\n };\n}\n\nasync function readPackageMetadata(\n projectPath: string,\n): Promise<PackageMetadata> {\n const packageJsonPath = join(projectPath, 'package.json');\n if (!(await pathExists(packageJsonPath))) return {};\n\n try {\n const json = JSON.parse(await readFile(packageJsonPath, 'utf-8')) as Record<\n string,\n unknown\n >;\n return {\n name: typeof json.name === 'string' ? json.name : undefined,\n version: typeof json.version === 'string' ? json.version : undefined,\n json,\n };\n } catch {\n return {};\n }\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isManifestLike(value: unknown): value is ManifestLike {\n return (\n !!value &&\n typeof value === 'object' &&\n !!(value as ManifestLike).objects &&\n typeof (value as ManifestLike).objects === 'object'\n );\n}\n\nfunction scanErrorToDiagnostic(error: ScanError): Diagnostic {\n return {\n severity: error.severity,\n message: error.message,\n filePath: error.filePath,\n line: error.line,\n column: error.column,\n };\n}\n\nfunction sanitizePath(projectPath: string, filePath: string): string {\n const absolute = isAbsolute(filePath)\n ? filePath\n : resolve(projectPath, filePath);\n const relativePath = relative(projectPath, absolute);\n if (!relativePath.startsWith('..')) {\n return relativePath || filePath;\n }\n return filePath;\n}\n\nfunction stringFromConfig(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction arrayFromConfig(value: unknown): string[] | undefined {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : undefined;\n}\n\nfunction compactObject<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\nfunction messageFromError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * Ecosystem-aware downstream project review.\n * Advisory only: scans manifests and source files, then reports alignment risks.\n */\n\nimport { type Dirent, existsSync } from 'node:fs';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\n\ninterface ReviewSmrtProjectArgs {\n directory?: string;\n rootDir?: string;\n includeSourceEvidence?: boolean;\n maxFindings?: number;\n}\n\ntype Severity = 'high' | 'medium' | 'low';\n\ninterface Evidence {\n filePath: string;\n line?: number;\n detail: string;\n}\n\ninterface Finding {\n severity: Severity;\n area:\n | 'dependencies'\n | 'storage'\n | 'api-shell'\n | 'manifest'\n | 'auth-tenancy'\n | 'ui-shell';\n code: string;\n title: string;\n evidence: Evidence[];\n recommendation: string;\n suggestedIssueTitle: string;\n}\n\ninterface PackageInventory {\n name: string;\n path: string;\n private?: boolean;\n scripts: string[];\n declaredHappyVerticalDependencies: string[];\n importedHappyVerticalPackages: string[];\n missingHappyVerticalDependencies: string[];\n hasSvelteKit: boolean;\n hasSmrtSvelte: boolean;\n}\n\ninterface PackageContext {\n directory: string;\n relativePath: string;\n packageJsonPath: string;\n json: Record<string, unknown>;\n dependencies: Set<string>;\n scripts: Record<string, unknown>;\n imports: Map<string, Evidence[]>;\n sourceFiles: SourceFile[];\n}\n\ninterface SourceFile {\n path: string;\n packageDir: string;\n content: string;\n}\n\nconst SOURCE_EXTENSIONS = /\\.(tsx?|jsx?|svelte)$/;\nconst SKIP_DIRS = new Set([\n 'node_modules',\n 'dist',\n 'build',\n '.git',\n '.smrt',\n '.svelte-kit',\n 'coverage',\n]);\nconst DEPENDENCY_SECTIONS = [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n];\nconst SMRT_PACKAGE_PREFIX = '@happyvertical/smrt-';\nconst HAPPYVERTICAL_PACKAGE_PREFIX = '@happyvertical/';\n\nexport async function reviewSmrtProject(\n args: ReviewSmrtProjectArgs,\n): Promise<string> {\n const projectPath = resolve(args.directory ?? args.rootDir ?? process.cwd());\n if (!(await pathExists(projectPath))) {\n return JSON.stringify(\n {\n projectPath,\n packageCount: 0,\n packages: [],\n findings: [],\n summary: { high: 0, medium: 0, low: 0 },\n diagnostics: [\n {\n severity: 'warning',\n message: `Project directory does not exist: ${projectPath}`,\n },\n ],\n },\n null,\n 2,\n );\n }\n\n const packageContexts = await buildPackageContexts(projectPath);\n const sourceFiles = await listSourceFiles(projectPath, packageContexts);\n await attachSourceFiles(sourceFiles, packageContexts, projectPath);\n\n const findings = limitFindings(\n [\n ...findMissingHappyVerticalDependencies(packageContexts),\n ...findCustomManifestGeneration(sourceFiles, projectPath),\n ...findDirectStorageBypasses(sourceFiles, packageContexts, projectPath),\n ...findCustomHttpShells(sourceFiles, packageContexts, projectPath),\n ...findLocalAuthTenancy(sourceFiles, packageContexts, projectPath),\n ...findUiShellDrift(packageContexts, projectPath),\n ...findMissingManifestArtifacts(\n sourceFiles,\n packageContexts,\n projectPath,\n ),\n ],\n args.maxFindings,\n );\n\n const packages = packageContexts\n .map(packageInventory)\n .sort((left, right) => left.path.localeCompare(right.path));\n const summary = summarizeFindings(findings);\n\n return JSON.stringify(\n {\n projectPath,\n packageCount: packages.length,\n packages,\n findings:\n args.includeSourceEvidence === false\n ? findings.map(({ evidence: _evidence, ...finding }) => finding)\n : findings,\n summary,\n referenceChecks: [\n 'Prefer SMRT scanner/runtime manifests over custom manifest builders.',\n 'Prefer SvelteKit plus @happyvertical/smrt-svelte for app shells.',\n 'Prefer @happyvertical/sql and @happyvertical/files/assets/content over direct durable node:fs storage.',\n 'Prefer smrt-users, smrt-tenancy, and profile/audit packages over local static auth seams.',\n ],\n suggestedFollowUpIssues: findings.map((finding) => ({\n title: finding.suggestedIssueTitle,\n severity: finding.severity,\n area: finding.area,\n })),\n },\n null,\n 2,\n );\n}\n\nasync function buildPackageContexts(\n projectPath: string,\n): Promise<PackageContext[]> {\n const packageJsonPaths = await listPackageJsonFiles(projectPath);\n const contexts = await Promise.all(\n packageJsonPaths.map(async (packageJsonPath) => {\n const json = JSON.parse(\n await readFile(packageJsonPath, 'utf-8'),\n ) as Record<string, unknown>;\n const directory = dirname(packageJsonPath);\n return {\n directory,\n relativePath: relative(projectPath, directory) || '.',\n packageJsonPath,\n json,\n dependencies: collectDependencies(json),\n scripts: isRecord(json.scripts)\n ? (json.scripts as Record<string, unknown>)\n : {},\n imports: new Map<string, Evidence[]>(),\n sourceFiles: [],\n };\n }),\n );\n\n if (contexts.length === 0) {\n contexts.push({\n directory: projectPath,\n relativePath: '.',\n packageJsonPath: join(projectPath, 'package.json'),\n json: {},\n dependencies: new Set(),\n scripts: {},\n imports: new Map(),\n sourceFiles: [],\n });\n }\n\n return contexts.sort(\n (left, right) => left.directory.length - right.directory.length,\n );\n}\n\nasync function listPackageJsonFiles(projectPath: string): Promise<string[]> {\n const files: string[] = [];\n await visit(projectPath, async (filePath, entryName) => {\n if (entryName === 'package.json') files.push(filePath);\n });\n return files;\n}\n\nasync function listSourceFiles(\n projectPath: string,\n packages: PackageContext[],\n): Promise<SourceFile[]> {\n const files: SourceFile[] = [];\n await visit(projectPath, async (filePath, entryName) => {\n if (!SOURCE_EXTENSIONS.test(entryName)) return;\n if (\n entryName.endsWith('.d.ts') ||\n entryName.endsWith('.test.ts') ||\n entryName.endsWith('.spec.ts')\n ) {\n return;\n }\n\n const packageDir = findOwningPackage(filePath, packages).directory;\n const content = await readFile(filePath, 'utf-8');\n files.push({ path: filePath, packageDir, content });\n });\n return files;\n}\n\nasync function attachSourceFiles(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Promise<void> {\n for (const sourceFile of sourceFiles) {\n const owner = packages.find(\n (pkg) => pkg.directory === sourceFile.packageDir,\n );\n if (!owner) continue;\n owner.sourceFiles.push(sourceFile);\n for (const importedPackage of extractImports(sourceFile.content)) {\n if (!importedPackage.startsWith(HAPPYVERTICAL_PACKAGE_PREFIX)) continue;\n const evidence = {\n filePath: relative(projectPath, sourceFile.path),\n line: lineNumber(sourceFile.content, importedPackage),\n detail: `Imports ${importedPackage}`,\n };\n const existing = owner.imports.get(importedPackage) ?? [];\n existing.push(evidence);\n owner.imports.set(importedPackage, existing);\n }\n }\n}\n\nfunction findMissingHappyVerticalDependencies(\n packages: PackageContext[],\n): Finding[] {\n return packages.flatMap((pkg) => {\n const ownName =\n typeof pkg.json.name === 'string' ? pkg.json.name : undefined;\n const missing = Array.from(pkg.imports.keys()).filter(\n (importedPackage) =>\n importedPackage !== ownName && !pkg.dependencies.has(importedPackage),\n );\n if (missing.length === 0) return [];\n\n const hasSmrtMissing = missing.some((name) =>\n name.startsWith(SMRT_PACKAGE_PREFIX),\n );\n return [\n {\n severity: hasSmrtMissing ? 'high' : 'medium',\n area: 'dependencies',\n code: 'missing-happyvertical-dependencies',\n title: `${packageLabel(pkg)} imports HappyVertical packages that package.json does not declare`,\n evidence: missing.flatMap((name) => pkg.imports.get(name) ?? []),\n recommendation:\n 'Declare every imported @happyvertical package in the owning package manifest so downstream installs and generated knowledge stay reproducible.',\n suggestedIssueTitle: `Declare missing HappyVertical dependencies in ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nfunction findCustomManifestGeneration(\n sourceFiles: SourceFile[],\n projectPath: string,\n): Finding[] {\n return sourceFiles\n .filter(\n (file) =>\n /manifest\\.json/.test(file.content) &&\n /objects\\s*:/.test(file.content) &&\n /\\b(writeFile|writeFileSync)\\b/.test(file.content) &&\n !/@happyvertical\\/smrt-scanner/.test(file.content),\n )\n .map((file) => ({\n severity: 'high',\n area: 'manifest',\n code: 'custom-object-manifest-generation',\n title: 'Custom SMRT object manifest generation detected',\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'manifest.json'),\n detail:\n 'Writes a manifest.json object inventory outside the SMRT scanner/runtime path.',\n },\n ],\n recommendation:\n 'Use the SMRT scanner/runtime manifest path so defaults, relationships, schemas, tenant fields, and cross-package references match framework behavior.',\n suggestedIssueTitle:\n 'Replace custom object manifest generation with SMRT scanner/runtime manifest generation',\n }));\n}\n\nfunction findDirectStorageBypasses(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return sourceFiles.flatMap((file) => {\n const owner = findOwningPackage(file.path, packages);\n const usesFs =\n /from\\s+['\"](?:node:fs|node:fs\\/promises|fs|fs\\/promises)['\"]|require\\(['\"](?:node:fs|node:fs\\/promises|fs|fs\\/promises)['\"]\\)/.test(\n file.content,\n );\n const writesDurableData =\n /\\b(writeFile|appendFile|mkdir|rm|rename)\\b/.test(file.content) &&\n /(\\.json|data|storage|persist|cache|db)/i.test(file.content);\n const usesDirectSql =\n /from\\s+['\"](?:better-sqlite3|sqlite3|pg|mysql2?|knex|drizzle-orm)['\"]/.test(\n file.content,\n );\n if ((!usesFs || !writesDurableData) && !usesDirectSql) return [];\n\n const hasApprovedStorage =\n owner.dependencies.has('@happyvertical/sql') ||\n owner.dependencies.has('@happyvertical/files') ||\n owner.dependencies.has('@happyvertical/smrt-assets') ||\n owner.dependencies.has('@happyvertical/smrt-content');\n\n if (hasApprovedStorage) return [];\n\n return [\n {\n severity: 'medium',\n area: 'storage',\n code: 'direct-storage-bypass',\n title: `${packageLabel(owner)} appears to bypass HappyVertical storage packages`,\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(\n file.content,\n usesDirectSql ? 'sqlite' : 'writeFile',\n ),\n detail: usesDirectSql\n ? 'Imports a direct SQL/storage library without @happyvertical/sql.'\n : 'Uses node:fs-style durable writes without @happyvertical/files/assets/content.',\n },\n ],\n recommendation:\n 'Route durable data through @happyvertical/sql, @happyvertical/files, SMRT assets, or SMRT content unless this is explicitly build-only tooling.',\n suggestedIssueTitle: `Review direct storage usage in ${packageLabel(owner)}`,\n },\n ];\n });\n}\n\nfunction findCustomHttpShells(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n const evidenceByPackage = new Map<PackageContext, Evidence[]>();\n\n for (const pkg of packages) {\n if (pkg.dependencies.has('@sveltejs/kit')) continue;\n\n const routerDependencies = ['express', 'fastify', 'hono', 'koa'].filter(\n (dep) => pkg.dependencies.has(dep),\n );\n if (routerDependencies.length === 0) continue;\n\n appendEvidence(evidenceByPackage, pkg, {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail: `Declares custom router package(s): ${routerDependencies.join(', ')}.`,\n });\n }\n\n for (const file of sourceFiles) {\n const owner = findOwningPackage(file.path, packages);\n if (owner.dependencies.has('@sveltejs/kit')) continue;\n\n const usesNodeHttp =\n /from\\s+['\"](?:node:http|http|node:https|https)['\"]|createServer\\s*\\(/.test(\n file.content,\n );\n if (!usesNodeHttp) continue;\n\n appendEvidence(evidenceByPackage, owner, {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'createServer'),\n detail:\n 'Custom HTTP routing found without the SvelteKit/SMRT app-shell dependency pattern.',\n });\n }\n\n return Array.from(evidenceByPackage.entries()).map(([owner, evidence]) => ({\n severity: 'medium',\n area: 'api-shell',\n code: 'custom-http-shell',\n title: `${packageLabel(owner)} uses a custom HTTP shell`,\n evidence,\n recommendation:\n 'Compare the app shell against the Anytown/Ergot SvelteKit + SMRT shell pattern before adding custom HTTP infrastructure.',\n suggestedIssueTitle: `Align ${packageLabel(owner)} app shell with SMRT/SvelteKit conventions`,\n }));\n}\n\nfunction appendEvidence(\n evidenceByPackage: Map<PackageContext, Evidence[]>,\n pkg: PackageContext,\n evidence: Evidence,\n): void {\n const existing = evidenceByPackage.get(pkg);\n if (existing) {\n existing.push(evidence);\n return;\n }\n\n evidenceByPackage.set(pkg, [evidence]);\n}\n\nfunction findLocalAuthTenancy(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return sourceFiles.flatMap((file) => {\n const owner = findOwningPackage(file.path, packages);\n const pathSignal = /(auth|tenant|audit|session|rbac|user)/i.test(file.path);\n const codeSignal =\n /\\b(tenantId|tenant|role|permission|session|auditLog|apiKey)\\b/.test(\n file.content,\n );\n if (!pathSignal || !codeSignal) return [];\n\n const hasApprovedPackages =\n owner.dependencies.has('@happyvertical/smrt-users') ||\n owner.dependencies.has('@happyvertical/smrt-tenancy') ||\n owner.dependencies.has('@happyvertical/smrt-profiles');\n if (hasApprovedPackages) return [];\n\n return [\n {\n severity: 'medium',\n area: 'auth-tenancy',\n code: 'local-auth-tenancy',\n title: `${packageLabel(owner)} contains local auth/tenancy/audit logic`,\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'tenant'),\n detail:\n 'Auth, tenancy, session, role, or audit terminology appears without smrt-users/smrt-tenancy/smrt-profiles dependencies.',\n },\n ],\n recommendation:\n 'Add explicit adapters to smrt-users, smrt-tenancy, and profile/audit models or document why this local implementation is intentionally isolated.',\n suggestedIssueTitle: `Review auth and tenancy adapters in ${packageLabel(owner)}`,\n },\n ];\n });\n}\n\nfunction findUiShellDrift(\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return packages.flatMap((pkg) => {\n const hasUiSource = pkg.sourceFiles.some((file) =>\n file.path.endsWith('.svelte'),\n );\n const likelyUiPackage =\n hasUiSource ||\n /(?:web|ui|app|site|frontend)/i.test(packageLabel(pkg)) ||\n pkg.dependencies.has('svelte') ||\n pkg.dependencies.has('vite');\n if (!likelyUiPackage) return [];\n if (pkg.dependencies.has('@happyvertical/smrt-svelte')) return [];\n\n return [\n {\n severity: 'low',\n area: 'ui-shell',\n code: 'missing-smrt-svelte-shell',\n title: `${packageLabel(pkg)} looks like UI work without @happyvertical/smrt-svelte`,\n evidence: [\n {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail:\n 'UI-facing package does not declare @happyvertical/smrt-svelte.',\n },\n ],\n recommendation:\n 'Use @happyvertical/smrt-svelte and the SvelteKit shell pattern for downstream app UI unless this package is intentionally framework-agnostic.',\n suggestedIssueTitle: `Check SMRT Svelte shell alignment for ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nfunction findMissingManifestArtifacts(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return packages.flatMap((pkg) => {\n const hasSmrtSource = pkg.sourceFiles.some((file) =>\n /@smrt\\s*\\(/.test(file.content),\n );\n if (!hasSmrtSource) return [];\n const hasManifest =\n sourceFiles.some(\n (file) =>\n file.packageDir === pkg.directory &&\n /@happyvertical\\/smrt-scanner/.test(file.content),\n ) ||\n pathExistsSyncHint(join(pkg.directory, '.smrt', 'manifest.json')) ||\n pathExistsSyncHint(join(pkg.directory, 'dist', 'manifest.json'));\n if (hasManifest) return [];\n\n return [\n {\n severity: 'low',\n area: 'manifest',\n code: 'missing-generated-manifest-artifact',\n title: `${packageLabel(pkg)} has @smrt objects but no generated manifest artifact was found`,\n evidence: [\n {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail:\n 'No .smrt/manifest.json or dist/manifest.json was visible during review.',\n },\n ],\n recommendation:\n 'Run the package build/test manifest generation path and verify it uses the SMRT scanner/runtime manifest pipeline.',\n suggestedIssueTitle: `Verify SMRT manifest generation for ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nasync function visit(\n dir: string,\n onFile: (filePath: string, entryName: string) => Promise<void> | void,\n): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n await visit(fullPath, onFile);\n continue;\n }\n if (entry.isFile()) await onFile(fullPath, entry.name);\n }\n}\n\nfunction collectDependencies(\n packageJson: Record<string, unknown>,\n): Set<string> {\n const dependencies = new Set<string>();\n for (const sectionName of DEPENDENCY_SECTIONS) {\n const section = packageJson[sectionName];\n if (!isRecord(section)) continue;\n for (const dependencyName of Object.keys(section)) {\n dependencies.add(dependencyName);\n }\n }\n return dependencies;\n}\n\nfunction extractImports(content: string): string[] {\n const imports = new Set<string>();\n const patterns = [\n /(?:import|export)\\s+(?:type\\s+)?(?:[^'\"]+\\s+from\\s+)?['\"]([^'\"]+)['\"]/g,\n /\\bimport\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n /\\brequire\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n ];\n for (const pattern of patterns) {\n for (const match of content.matchAll(pattern)) {\n const imported = normalizePackageImport(match[1]);\n if (imported) imports.add(imported);\n }\n }\n return Array.from(imports);\n}\n\nfunction normalizePackageImport(value: string | undefined): string | undefined {\n if (!value || value.startsWith('.') || value.startsWith('/'))\n return undefined;\n if (value.startsWith('@')) {\n const [scope, name] = value.split('/');\n return scope && name ? `${scope}/${name}` : value;\n }\n return value.split('/')[0];\n}\n\nfunction findOwningPackage(\n filePath: string,\n packages: PackageContext[],\n): PackageContext {\n const normalized = resolve(filePath);\n const matches = packages\n .filter(\n (pkg) =>\n normalized === pkg.directory ||\n normalized.startsWith(`${pkg.directory}${sep}`),\n )\n .sort((left, right) => right.directory.length - left.directory.length);\n return matches[0] ?? packages[0];\n}\n\nfunction packageInventory(pkg: PackageContext): PackageInventory {\n const declaredHappyVerticalDependencies = Array.from(pkg.dependencies)\n .filter((dependency) => dependency.startsWith(HAPPYVERTICAL_PACKAGE_PREFIX))\n .sort();\n const importedHappyVerticalPackages = Array.from(pkg.imports.keys()).sort();\n const ownName = typeof pkg.json.name === 'string' ? pkg.json.name : undefined;\n return {\n name: packageLabel(pkg),\n path: pkg.relativePath,\n private:\n typeof pkg.json.private === 'boolean' ? pkg.json.private : undefined,\n scripts: Object.keys(pkg.scripts).sort(),\n declaredHappyVerticalDependencies,\n importedHappyVerticalPackages,\n missingHappyVerticalDependencies: importedHappyVerticalPackages.filter(\n (name) => name !== ownName && !pkg.dependencies.has(name),\n ),\n hasSvelteKit: pkg.dependencies.has('@sveltejs/kit'),\n hasSmrtSvelte: pkg.dependencies.has('@happyvertical/smrt-svelte'),\n };\n}\n\nfunction summarizeFindings(findings: Finding[]): Record<Severity, number> {\n return findings.reduce(\n (summary, finding) => {\n summary[finding.severity]++;\n return summary;\n },\n { high: 0, medium: 0, low: 0 },\n );\n}\n\nfunction limitFindings(\n findings: Finding[],\n maxFindings: number | undefined,\n): Finding[] {\n const sorted = findings.sort(\n (left, right) =>\n severityRank(left.severity) - severityRank(right.severity) ||\n left.area.localeCompare(right.area) ||\n left.title.localeCompare(right.title),\n );\n return maxFindings && maxFindings > 0 ? sorted.slice(0, maxFindings) : sorted;\n}\n\nfunction severityRank(severity: Severity): number {\n return severity === 'high' ? 0 : severity === 'medium' ? 1 : 2;\n}\n\nfunction packageLabel(pkg: PackageContext): string {\n return typeof pkg.json.name === 'string' ? pkg.json.name : pkg.relativePath;\n}\n\nfunction lineNumber(content: string, needle: string): number | undefined {\n const index = content.indexOf(needle);\n if (index < 0) return undefined;\n return content.slice(0, index).split('\\n').length;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pathExistsSyncHint(path: string): boolean {\n return existsSync(path);\n}\n","/**\n * SMRT Development MCP Server\n * Provides code generation, project introspection, knowledge context,\n * review/architecture prompt bundles, and portable agent skills.\n */\n\nimport { readFileSync, realpathSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ErrorCode,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n McpError,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport { getAgentSkill, listAgentSkills } from './agent-skills.js';\nimport {\n buildArchitectureContext,\n buildKnowledgeIndex,\n buildReviewContext,\n checkKnowledgeFreshness,\n checkKnowledgeFreshnessFromIndex,\n packageDocPaths,\n smrtArchitecture,\n smrtReview,\n} from './knowledge/index.js';\nimport {\n generateSmrtClass,\n introspectProject,\n reviewSmrtProject,\n} from './tools/index.js';\n\nconst SERVER_NAME = 'smrt-dev-mcp';\nexport const SERVER_VERSION = readPackageVersion();\nconst DEBUG = process.env.DEBUG === 'true';\nconst REVIEW_SKILL_NAME = 'smrt-code-review';\nconst REVIEW_SKILL_URI = `smrt-dev-mcp://agent-skills/${REVIEW_SKILL_NAME}`;\nconst DOMAIN_CODE_REVIEW_PROMPT = 'domain-code-review';\nconst DOMAIN_ARCHITECTURE_PROMPT = 'domain-architecture';\nconst KNOWLEDGE_PROJECT_URI = 'smrt://knowledge/project';\nconst KNOWLEDGE_PACKAGE_PREFIX = 'smrt://knowledge/package/';\n\ntype KnowledgeIndexResult = Awaited<ReturnType<typeof buildKnowledgeIndex>>;\ntype KnowledgePackageResult = KnowledgeIndexResult['packages'][number];\ntype PromptArguments = Record<string, string> | undefined;\n\n// Tool definitions\nexport const TOOLS = [\n // Code Generation Tools\n {\n name: 'generate-smrt-class',\n description: 'Generate a complete SMRT class with @smrt() decorator',\n inputSchema: {\n type: 'object',\n properties: {\n className: {\n type: 'string',\n description: 'Name of the class (PascalCase)',\n },\n properties: {\n type: 'array',\n description: 'Array of property definitions',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n type: {\n type: 'string',\n enum: [\n 'text',\n 'integer',\n 'decimal',\n 'boolean',\n 'datetime',\n 'json',\n ],\n },\n required: { type: 'boolean' },\n nullable: { type: 'boolean' },\n description: { type: 'string' },\n defaultValue: {\n oneOf: [\n { type: 'string' },\n { type: 'number' },\n { type: 'boolean' },\n { type: 'object' },\n { type: 'null' },\n ],\n },\n },\n required: ['name', 'type'],\n },\n },\n baseClass: {\n type: 'string',\n enum: ['SmrtObject', 'SmrtCollection'],\n default: 'SmrtObject',\n },\n template: {\n type: 'string',\n enum: [\n 'basic',\n 'global-catalog',\n 'optional-catalog',\n 'tenant-project-object',\n 'tenant-event-log-object',\n 'cross-package-reference',\n ],\n default: 'basic',\n },\n tableName: { type: 'string' },\n conflictColumns: {\n type: 'array',\n items: { type: 'string' },\n },\n tenantScoped: {\n oneOf: [\n { type: 'boolean' },\n {\n type: 'object',\n properties: {\n mode: { type: 'string', enum: ['required', 'optional'] },\n field: { type: 'string' },\n autoFilter: { type: 'boolean' },\n autoPopulate: { type: 'boolean' },\n allowSuperAdminBypass: { type: 'boolean' },\n },\n },\n ],\n },\n includeTenantIdField: { type: 'boolean' },\n relationships: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n type: {\n type: 'string',\n enum: [\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n ],\n },\n related: { type: 'string' },\n required: { type: 'boolean' },\n nullable: { type: 'boolean' },\n description: { type: 'string' },\n validate: { type: 'boolean' },\n foreignKey: { type: 'string' },\n through: { type: 'string' },\n sourceKey: { type: 'string' },\n targetKey: { type: 'string' },\n },\n required: ['name', 'type', 'related'],\n },\n },\n includeCompanionSnippets: { type: 'boolean', default: false },\n includeApiConfig: { type: 'boolean', default: true },\n includeMcpConfig: { type: 'boolean', default: true },\n includeCliConfig: { type: 'boolean', default: true },\n },\n required: ['className', 'properties'],\n },\n },\n // Project Introspection Tools\n {\n name: 'introspect-project',\n description:\n 'Scan a directory for SMRT objects. Returns a compact summary by default; pass detail: \"full\" for field, schema, and method details.',\n inputSchema: {\n type: 'object',\n properties: {\n directory: {\n type: 'string',\n description: 'Project directory (default: cwd)',\n },\n manifestPath: {\n type: 'string',\n description:\n 'Optional manifest path. Defaults to .smrt/manifest.json, dist/manifest.json, then source scanning.',\n },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: one compact record per object. full: complete field/schema/method detail (large).',\n },\n maxChars: {\n type: 'number',\n description:\n 'Character budget for the `objects` payload. Objects past the budget are omitted and reported under `truncated`. Project metadata and diagnostics are always returned in full, so the serialized response is somewhat larger than this budget.',\n },\n includeFields: {\n type: 'boolean',\n description: 'Include field details (detail: \"full\" only)',\n },\n includeRelationships: {\n type: 'boolean',\n description: 'Analyze relationships (detail: \"full\" only)',\n },\n includeMethods: {\n type: 'boolean',\n description: 'Include public method details (detail: \"full\" only)',\n },\n },\n },\n },\n {\n name: 'review-smrt-project',\n description:\n 'Advisory ecosystem alignment review for downstream SMRT projects',\n inputSchema: {\n type: 'object',\n properties: {\n directory: {\n type: 'string',\n description: 'Project directory (default: cwd)',\n },\n rootDir: {\n type: 'string',\n description: 'Compatibility alias for directory',\n },\n includeSourceEvidence: {\n type: 'boolean',\n description: 'Include file and line evidence in findings',\n default: true,\n },\n maxFindings: {\n type: 'number',\n description: 'Optional maximum number of findings to return',\n },\n },\n },\n },\n {\n name: 'reflect-knowledge',\n description:\n 'Report deterministic SMRT + HappyVertical SDK knowledge coverage and freshness',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: {\n type: 'string',\n description: 'Project root directory (default: cwd)',\n },\n },\n },\n },\n {\n name: 'reflect-domain-knowledge',\n description:\n 'Report domain-scoped SMRT knowledge artifacts, SDK packages, and freshness',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n scope: {\n type: 'string',\n enum: ['project', 'local', 'package', 'sdk'],\n default: 'project',\n },\n package: { type: 'string' },\n },\n },\n },\n {\n name: 'check-knowledge-freshness',\n description: 'Run deterministic freshness checks for SMRT agent knowledge',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n changed: {\n type: 'boolean',\n description: 'Limit stale-pattern checks to changed files',\n },\n strict: {\n type: 'boolean',\n description: 'Treat stale-pattern findings as errors',\n },\n },\n },\n },\n {\n name: 'check-domain-knowledge',\n description:\n 'Run deterministic freshness checks for domain knowledge artifacts',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n changed: { type: 'boolean' },\n strict: { type: 'boolean' },\n scope: {\n type: 'string',\n enum: ['project', 'local', 'package', 'sdk'],\n default: 'project',\n },\n package: { type: 'string' },\n },\n },\n },\n {\n name: 'build-review-context',\n description:\n 'Build model-ready SMRT review context from changed files and optional focus text',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n changedFiles: { type: 'array', items: { type: 'string' } },\n focus: { type: 'string' },\n documentation: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'build-domain-review-context',\n description:\n 'Build domain-scoped model-ready SMRT review context and prompt bundle',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n changedFiles: { type: 'array', items: { type: 'string' } },\n focus: { type: 'string' },\n documentation: { type: 'string' },\n scope: {\n type: 'string',\n enum: ['project', 'local', 'package', 'sdk'],\n default: 'project',\n },\n package: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'smrt-review',\n description:\n 'Return deterministic review findings and/or a reusable model prompt bundle. For a formal downstream review, first call get-agent-skill with { \"name\": \"smrt-code-review\" } or load the smrt-code-review MCP prompt/resource.',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n changedFiles: { type: 'array', items: { type: 'string' } },\n focus: { type: 'string' },\n documentation: { type: 'string' },\n mode: {\n type: 'string',\n enum: ['findings', 'prompt-bundle', 'both'],\n default: 'both',\n },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'build-architecture-context',\n description:\n 'Build model-ready SMRT architecture context from an idea or documentation',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n idea: { type: 'string' },\n documentation: { type: 'string' },\n focus: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'build-domain-architecture-context',\n description:\n 'Build domain-scoped model-ready SMRT architecture context and prompt bundle',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n idea: { type: 'string' },\n documentation: { type: 'string' },\n focus: { type: 'string' },\n scope: {\n type: 'string',\n enum: ['project', 'local', 'package', 'sdk'],\n default: 'project',\n },\n package: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'smrt-architecture',\n description:\n 'Suggest SMRT and HappyVertical SDK packages and return an architecture prompt bundle',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n idea: { type: 'string' },\n documentation: { type: 'string' },\n focus: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'list-agent-skills',\n description:\n 'List bundled harness-agnostic agent skills shipped with smrt-dev-mcp',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'get-agent-skill',\n description:\n 'Return a bundled harness-agnostic agent skill as Markdown plus optional references',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n enum: [REVIEW_SKILL_NAME],\n description: 'Bundled agent skill name',\n },\n includeReferences: {\n type: 'boolean',\n default: true,\n description: 'Include referenced files with the skill bundle',\n },\n },\n required: ['name'],\n },\n },\n];\n\nasync function main() {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Starting server v${SERVER_VERSION}`);\n }\n\n const server = new Server(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n {\n capabilities: {\n prompts: {},\n resources: {},\n tools: {},\n },\n },\n );\n\n // List tools handler\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] ListTools request`);\n }\n return { tools: TOOLS };\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => {\n return {\n prompts: [\n {\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review',\n description:\n 'Harness-agnostic downstream SMRT review procedure that uses smrt-dev-mcp deterministic context and prompt bundles.',\n },\n {\n name: DOMAIN_CODE_REVIEW_PROMPT,\n title: 'Domain Code Review',\n description:\n 'Model-ready domain-scoped SMRT code review prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'changedFiles',\n description:\n 'Changed file paths as newline-separated, comma-separated, or JSON array text.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Review focus text.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'scope',\n description: 'Knowledge scope: project, local, package, or sdk.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n {\n name: DOMAIN_ARCHITECTURE_PROMPT,\n title: 'Domain Architecture',\n description:\n 'Model-ready domain-scoped SMRT architecture planning prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'idea',\n description: 'Architecture idea or product concept.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Planning focus text.',\n required: false,\n },\n {\n name: 'scope',\n description: 'Knowledge scope: project, local, package, or sdk.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n ],\n };\n });\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const { name } = request.params;\n if (name === REVIEW_SKILL_NAME) {\n return {\n description:\n 'Use this procedure when reviewing downstream SMRT projects.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_CODE_REVIEW_PROMPT) {\n const context = await buildReviewContext(\n reviewPromptArguments(request.params.arguments),\n );\n return {\n description: 'Review downstream SMRT code with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_ARCHITECTURE_PROMPT) {\n const context = await buildArchitectureContext(\n architecturePromptArguments(request.params.arguments),\n );\n return {\n description: 'Plan a downstream SMRT project with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n throw new McpError(ErrorCode.InvalidParams, `Unknown prompt: ${name}`);\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => {\n const index = await buildKnowledgeIndex();\n return {\n resources: [\n {\n uri: REVIEW_SKILL_URI,\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review Skill',\n description:\n 'Bundled Markdown skill for downstream SMRT code reviews.',\n mimeType: 'text/markdown',\n },\n {\n uri: KNOWLEDGE_PROJECT_URI,\n name: 'smrt-domain-knowledge-project',\n title: 'SMRT Domain Knowledge Project Index',\n description:\n 'Composed SMRT, downstream domain, and HappyVertical SDK knowledge index.',\n mimeType: 'application/json',\n },\n ...index.packages.map((pkg) => ({\n uri: `${KNOWLEDGE_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n name: `smrt-domain-knowledge-${pkg.name}`,\n title: `SMRT Domain Knowledge: ${pkg.name}`,\n description:\n 'Package-scoped SMRT domain knowledge, generated surfaces, and authored context.',\n mimeType: 'application/json',\n })),\n ],\n };\n });\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n if (uri === REVIEW_SKILL_URI) {\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n ],\n };\n }\n\n if (uri === KNOWLEDGE_PROJECT_URI) {\n const index = await buildKnowledgeIndex();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgeIndex(index), null, 2),\n },\n ],\n };\n }\n\n if (uri.startsWith(KNOWLEDGE_PACKAGE_PREFIX)) {\n const packageName = decodeURIComponent(\n uri.slice(KNOWLEDGE_PACKAGE_PREFIX.length),\n );\n const index = await buildKnowledgeIndex();\n const pkg = index.packages.find((item) => item.name === packageName);\n if (!pkg) {\n throw new McpError(\n ErrorCode.InvalidParams,\n `Unknown knowledge package: ${packageName}`,\n );\n }\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgePackage(pkg), null, 2),\n },\n ],\n };\n }\n\n throw new McpError(ErrorCode.InvalidParams, `Unknown resource: ${uri}`);\n });\n\n // Call tool handler\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] CallTool: ${name}`);\n console.error(\n `[${SERVER_NAME}] Arguments:`,\n JSON.stringify(args, null, 2),\n );\n }\n\n try {\n let result: string;\n\n switch (name) {\n case 'generate-smrt-class':\n result = await generateSmrtClass(\n args as unknown as Parameters<typeof generateSmrtClass>[0],\n );\n break;\n\n case 'introspect-project':\n result = await introspectProject(\n args as unknown as Parameters<typeof introspectProject>[0],\n );\n break;\n\n case 'review-smrt-project':\n result = await reviewSmrtProject(\n args as unknown as Parameters<typeof reviewSmrtProject>[0],\n );\n break;\n\n case 'reflect-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'reflect-domain-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n domainKnowledgePackageCount: index.packages.filter(\n (pkg) => pkg.hasDomainKnowledge,\n ).length,\n missingDomainKnowledgePackages: index.packages\n .filter(\n (pkg) =>\n pkg.exportKeys.includes('./smrt-knowledge.json') &&\n !pkg.hasDomainKnowledge,\n )\n .map((pkg) => pkg.name),\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'check-knowledge-freshness':\n result = JSON.stringify(\n await checkKnowledgeFreshness(\n args as unknown as Parameters<typeof checkKnowledgeFreshness>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'check-domain-knowledge':\n result = JSON.stringify(\n await checkKnowledgeFreshness(\n args as unknown as Parameters<typeof checkKnowledgeFreshness>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'build-review-context':\n case 'build-domain-review-context':\n result = JSON.stringify(\n compactContextResult(\n await buildReviewContext(\n args as unknown as Parameters<typeof buildReviewContext>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'smrt-review':\n result = JSON.stringify(\n compactContextResult(\n await smrtReview(\n args as unknown as Parameters<typeof smrtReview>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'build-architecture-context':\n case 'build-domain-architecture-context':\n result = JSON.stringify(\n compactContextResult(\n await buildArchitectureContext(\n args as unknown as Parameters<\n typeof buildArchitectureContext\n >[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'smrt-architecture':\n result = JSON.stringify(\n compactContextResult(\n await smrtArchitecture(\n args as unknown as Parameters<typeof smrtArchitecture>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'list-agent-skills':\n result = JSON.stringify({ skills: listAgentSkills() }, null, 2);\n break;\n\n case 'get-agent-skill':\n result = JSON.stringify(\n await getAgentSkill(\n args as unknown as Parameters<typeof getAgentSkill>[0],\n ),\n null,\n 2,\n );\n break;\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: result,\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n console.error(`[${SERVER_NAME}] Error:`, error);\n\n return {\n content: [\n {\n type: 'text',\n text: `Error executing tool ${name}: ${errorMessage}`,\n },\n ],\n isError: true,\n };\n }\n });\n\n // Setup stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Server connected via stdio`);\n }\n\n // Graceful shutdown\n process.on('SIGINT', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await server.close();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await server.close();\n process.exit(0);\n });\n}\n\nfunction isEntrypoint(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(entry);\n } catch {\n return import.meta.url === pathToFileURL(entry).href;\n }\n}\n\nfunction readPackageVersion(): string {\n try {\n const packageRoot = dirname(fileURLToPath(import.meta.url));\n const packageJsonPath = join(packageRoot, '..', 'package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as {\n version?: unknown;\n };\n return typeof packageJson.version === 'string'\n ? packageJson.version\n : '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nfunction renderAgentSkillMarkdown(name: string): string {\n const skill = getAgentSkill({ name, includeReferences: true });\n const references = skill.referenceFiles.map(\n (file) => `## Reference: ${file.path}\\n\\n${file.content.trim()}`,\n );\n return [skill.skillMarkdown.trim(), ...references].join('\\n\\n');\n}\n\nfunction reviewPromptArguments(args: PromptArguments): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n changedFiles: parseStringList(args?.changedFiles),\n focus: args?.focus,\n documentation: args?.documentation,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction architecturePromptArguments(\n args: PromptArguments,\n): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n idea: args?.idea,\n documentation: args?.documentation,\n focus: args?.focus,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction parseStringList(value: string | undefined): string[] | undefined {\n if (!value?.trim()) return undefined;\n\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return parsed.filter((item): item is string => typeof item === 'string');\n }\n } catch {\n // Fall through to delimiter parsing.\n }\n\n return value\n .split(/[\\n,]/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction compactRecord(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n );\n}\n\nfunction sanitizeKnowledgeIndex(index: KnowledgeIndexResult) {\n const packages = index.packages.map((pkg) => sanitizeKnowledgePackage(pkg));\n return {\n ...index,\n rootDir: '.',\n packages,\n smrtPackages: packages.filter((pkg) => pkg.kind === 'smrt'),\n sdkPackages: packages.filter((pkg) => pkg.kind === 'sdk'),\n };\n}\n\n/**\n * Compact projection of a context result for MCP callers (#2143).\n *\n * `selectedPackages` carries each package's whole authored `agentDoc`, its\n * module-doc contents, and its full domain manifest. A three-package downstream\n * product serialized to 329,003 characters that way, which is what made these\n * tools unusable as planning aids. `detail: \"full\"` returns the whole shape.\n */\nfunction compactContextResult(\n result: object,\n detail: string | undefined,\n): Record<string, unknown> {\n const source = result as Record<string, unknown>;\n if (detail === 'full') return source;\n\n const compact: Record<string, unknown> = { ...source, detail: 'summary' };\n for (const key of ['selectedPackages', 'selectedSdkPackages']) {\n const packages = source[key];\n if (!Array.isArray(packages)) continue;\n compact[key] = (packages as KnowledgePackageResult[]).map(\n compactKnowledgePackage,\n );\n }\n return compact;\n}\n\nfunction compactKnowledgePackage(pkg: KnowledgePackageResult) {\n return {\n name: pkg.name,\n version: pkg.version,\n kind: pkg.kind,\n directory: pkg.relativeDirectory,\n objectSource: pkg.objectSource,\n ...(pkg.objectSourceReason\n ? { objectSourceReason: pkg.objectSourceReason }\n : {}),\n // Paths, not prose: the caller reads what it needs.\n docs: packageDocPaths(pkg),\n domainKnowledgePath: pkg.domainKnowledgePath,\n relationshipFeatures: pkg.relationshipFeatures,\n smrtDependencies: pkg.smrtDependencies,\n sdkDependencies: pkg.sdkDependencies,\n exportKeys: pkg.exportKeys,\n objectCount: pkg.objects.length,\n objects: pkg.objects.map((object) =>\n object.tableName\n ? `${object.qualifiedName ?? object.className} (${object.tableName})`\n : (object.qualifiedName ?? object.className),\n ),\n mcpToolCount: pkg.mcpTools.length,\n };\n}\n\nfunction detailArg(args: unknown): string | undefined {\n const detail = (args as Record<string, unknown> | undefined)?.detail;\n return typeof detail === 'string' ? detail : undefined;\n}\n\nfunction sanitizeKnowledgePackage(pkg: KnowledgePackageResult) {\n const { directory: _directory, objects, checkedObjectPaths, ...rest } = pkg;\n return {\n ...rest,\n // Paths outside the workspace root stay absolute in the index; redact them\n // here the same way object file paths are redacted.\n checkedObjectPaths: checkedObjectPaths.map(\n (path) => sanitizePath(path) ?? path,\n ),\n objects: objects.map((object) => ({\n ...object,\n filePath: sanitizePath(object.filePath),\n })),\n };\n}\n\nfunction sanitizePath(path: string | undefined): string | undefined {\n if (!path) return path;\n if (path.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(path)) {\n return '<absolute-path>';\n }\n return path;\n}\n\nif (isEntrypoint()) {\n main().catch((error) => {\n console.error(`[${SERVER_NAME}] Fatal error:`, error);\n process.exit(1);\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/agent-skills.ts","../src/tools/generate-smrt-class.ts","../src/tools/introspect-project.ts","../src/tools/review-smrt-project.ts","../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface AgentSkillSummary {\n name: string;\n description: string;\n path: string;\n references: string[];\n}\n\nexport interface AgentSkillBundle extends AgentSkillSummary {\n skillMarkdown: string;\n referenceFiles: Array<{\n path: string;\n content: string;\n }>;\n}\n\ninterface AgentSkillDefinition extends AgentSkillSummary {\n skillFile: string;\n}\n\nconst AGENT_SKILLS: AgentSkillDefinition[] = [\n {\n name: 'smrt-code-review',\n description:\n 'Harness-agnostic downstream SMRT code review workflow using smrt-dev-mcp deterministic context and prompt bundles.',\n path: 'agent-skills/smrt-code-review/SKILL.md',\n skillFile: 'agent-skills/smrt-code-review/SKILL.md',\n references: ['agent-skills/smrt-code-review/references/review-output.md'],\n },\n];\n\nexport function listAgentSkills(): AgentSkillSummary[] {\n return AGENT_SKILLS.map(({ skillFile: _skillFile, ...skill }) => skill);\n}\n\nexport function getAgentSkill(options: {\n name: string;\n includeReferences?: boolean;\n}): AgentSkillBundle {\n const skill = AGENT_SKILLS.find((item) => item.name === options.name);\n if (!skill) {\n throw new Error(`Unknown agent skill: ${options.name}`);\n }\n\n return {\n name: skill.name,\n description: skill.description,\n path: skill.path,\n references: skill.references,\n skillMarkdown: readPackageFile(skill.skillFile),\n referenceFiles:\n options.includeReferences === false\n ? []\n : skill.references.map((path) => ({\n path,\n content: readPackageFile(path),\n })),\n };\n}\n\nfunction readPackageFile(relativePath: string): string {\n const packageRoot = resolvePackageRoot();\n return readFileSync(join(packageRoot, relativePath), 'utf8');\n}\n\nfunction resolvePackageRoot(): string {\n // Works in both source tests (`src/agent-skills.ts`) and built packages\n // (`dist/agent-skills.js`); guard it so packaging layout drift fails clearly.\n const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));\n if (!existsSync(join(packageRoot, 'package.json'))) {\n throw new Error(\n `Unable to resolve smrt-dev-mcp package root from ${import.meta.url}`,\n );\n }\n return packageRoot;\n}\n","/**\n * Generate SMRT Class Tool\n * Creates a package-ready SMRT class using current object-package patterns.\n */\n\ntype PropertyType =\n | 'text'\n | 'integer'\n | 'decimal'\n | 'boolean'\n | 'datetime'\n | 'json';\ntype BaseClass = 'SmrtObject' | 'SmrtCollection';\ntype TemplateVariant =\n | 'basic'\n | 'global-catalog'\n | 'optional-catalog'\n | 'tenant-project-object'\n | 'tenant-event-log-object'\n | 'cross-package-reference';\ntype RelationshipType =\n | 'foreignKey'\n | 'crossPackageRef'\n | 'oneToMany'\n | 'manyToMany';\n\ninterface PropertyDefinition {\n name: string;\n type: PropertyType;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n defaultValue?: unknown;\n}\n\ninterface RelationshipDefinition {\n name: string;\n type: RelationshipType;\n related: string;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n validate?: boolean;\n foreignKey?: string;\n through?: string;\n sourceKey?: string;\n targetKey?: string;\n}\n\ninterface TenantScopedDefinition {\n mode?: 'required' | 'optional';\n field?: string;\n autoFilter?: boolean;\n autoPopulate?: boolean;\n allowSuperAdminBypass?: boolean;\n}\n\ninterface GenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass?: BaseClass;\n template?: TemplateVariant;\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: boolean | TenantScopedDefinition;\n includeTenantIdField?: boolean;\n relationships?: RelationshipDefinition[];\n includeApiConfig?: boolean;\n includeMcpConfig?: boolean;\n includeCliConfig?: boolean;\n includeCompanionSnippets?: boolean;\n}\n\ninterface NormalizedGenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass: BaseClass;\n template: TemplateVariant;\n tableName?: string;\n conflictColumns: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField: boolean;\n relationships: RelationshipDefinition[];\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n includeCompanionSnippets: boolean;\n}\n\nconst TYPE_MAPPING: Record<\n PropertyType,\n { tsType: string; defaultValue: string }\n> = {\n text: { tsType: 'string', defaultValue: \"''\" },\n integer: { tsType: 'number', defaultValue: '0' },\n decimal: { tsType: 'number', defaultValue: '0.0' },\n boolean: { tsType: 'boolean', defaultValue: 'false' },\n datetime: { tsType: 'Date', defaultValue: 'new Date()' },\n json: { tsType: 'any', defaultValue: '{}' },\n};\n\nexport async function generateSmrtClass(\n args: GenerateSmrtClassArgs,\n): Promise<string> {\n const normalized = normalizeArgs(args);\n const {\n className,\n properties,\n relationships,\n baseClass,\n tableName,\n conflictColumns,\n tenantScoped,\n includeTenantIdField,\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n includeCompanionSnippets,\n } = normalized;\n\n const coreImports = new Set<string>([baseClass, 'smrt']);\n if (needsFieldDecorator(properties)) coreImports.add('field');\n for (const relationship of relationships) {\n coreImports.add(relationship.type);\n }\n\n const imports = [\n `import { ${Array.from(coreImports).join(', ')} } from '@happyvertical/smrt-core';`,\n ];\n\n if (tenantScoped) {\n const tenancyImports = ['TenantScoped'];\n if (includeTenantIdField) tenancyImports.push('tenantId');\n imports.push(\n `import { ${tenancyImports.join(', ')} } from '@happyvertical/smrt-tenancy';`,\n );\n }\n\n const decoratorLines = [\n ...(tenantScoped\n ? [`@TenantScoped(${renderObjectLiteral({ ...tenantScoped })})`]\n : []),\n renderSmrtDecorator({\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n tableName,\n conflictColumns,\n }),\n ];\n\n const classMembers = [\n ...(includeTenantIdField && tenantScoped\n ? [renderTenantIdField(tenantScoped)]\n : []),\n ...properties.map(renderProperty),\n ...relationships.map(renderRelationship),\n ].filter(Boolean);\n\n const companionSnippets = includeCompanionSnippets\n ? `\\n${renderCompanionSnippets(className, Boolean(tenantScoped))}`\n : '';\n\n return `${imports.join('\\n')}\n\n${decoratorLines.join('\\n')}\nexport class ${className} extends ${baseClass} {\n${classMembers.join('\\n\\n')}\n\n constructor(options: any = {}) {\n super(options);\n Object.assign(this, options);\n }\n}\n${companionSnippets}`;\n}\n\nfunction normalizeArgs(\n args: GenerateSmrtClassArgs,\n): NormalizedGenerateSmrtClassArgs {\n const template = args.template ?? 'basic';\n const templateDefaults = defaultsForTemplate(template);\n const tenantScoped =\n args.tenantScoped === true\n ? (templateDefaults.tenantScoped ?? { mode: 'required' as const })\n : args.tenantScoped === false\n ? undefined\n : (args.tenantScoped ?? templateDefaults.tenantScoped);\n\n return {\n className: args.className,\n properties: args.properties,\n baseClass: args.baseClass ?? 'SmrtObject',\n template,\n tableName: args.tableName ?? templateDefaults.tableName,\n conflictColumns:\n args.conflictColumns ?? templateDefaults.conflictColumns ?? [],\n tenantScoped: normalizeTenantScoped(tenantScoped),\n includeTenantIdField:\n args.includeTenantIdField ??\n templateDefaults.includeTenantIdField ??\n Boolean(tenantScoped),\n relationships: args.relationships ?? [],\n includeApiConfig: args.includeApiConfig ?? true,\n includeMcpConfig: args.includeMcpConfig ?? true,\n includeCliConfig: args.includeCliConfig ?? true,\n includeCompanionSnippets: args.includeCompanionSnippets ?? false,\n };\n}\n\nfunction defaultsForTemplate(template: TemplateVariant): {\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField?: boolean;\n} {\n switch (template) {\n case 'optional-catalog':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n conflictColumns: ['tenant_id', 'slug'],\n };\n case 'tenant-project-object':\n return {\n tenantScoped: { mode: 'required' },\n includeTenantIdField: true,\n };\n case 'tenant-event-log-object':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n };\n case 'global-catalog':\n return { conflictColumns: ['slug'] };\n case 'cross-package-reference':\n case 'basic':\n return {};\n }\n}\n\nfunction normalizeTenantScoped(\n value: boolean | TenantScopedDefinition | undefined,\n): TenantScopedDefinition | undefined {\n if (!value) return undefined;\n return {\n mode: typeof value === 'object' ? (value.mode ?? 'required') : 'required',\n field: typeof value === 'object' ? (value.field ?? 'tenantId') : 'tenantId',\n autoFilter: typeof value === 'object' ? value.autoFilter : undefined,\n autoPopulate: typeof value === 'object' ? value.autoPopulate : undefined,\n allowSuperAdminBypass:\n typeof value === 'object' ? value.allowSuperAdminBypass : undefined,\n };\n}\n\nfunction renderSmrtDecorator(options: {\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n tableName?: string;\n conflictColumns: string[];\n}): string {\n const decoratorConfig: Record<string, unknown> = {};\n\n if (options.tableName) {\n decoratorConfig.tableName = options.tableName;\n }\n\n if (options.conflictColumns.length > 0) {\n decoratorConfig.conflictColumns = options.conflictColumns;\n }\n\n if (options.includeApiConfig) {\n decoratorConfig.api = {\n include: ['list', 'get', 'create', 'update'],\n exclude: ['delete'],\n };\n }\n\n if (options.includeMcpConfig) {\n decoratorConfig.mcp = {\n include: ['list', 'get'],\n };\n }\n\n if (options.includeCliConfig) {\n decoratorConfig.cli = true;\n }\n\n return Object.keys(decoratorConfig).length > 0\n ? `@smrt(${JSON.stringify(decoratorConfig, null, 2)})`\n : '@smrt()';\n}\n\nfunction renderTenantIdField(tenantScoped: TenantScopedDefinition): string {\n const nullable = tenantScoped.mode === 'optional';\n const field = tenantScoped.field ?? 'tenantId';\n return nullable\n ? ` @tenantId({ nullable: true })\\n ${field}: string | null = null;`\n : ` @tenantId()\\n ${field}: string = '';`;\n}\n\nfunction renderProperty(prop: PropertyDefinition): string {\n const mapping = TYPE_MAPPING[prop.type];\n const nullable = prop.nullable === true;\n const tsType = nullable ? `${mapping.tsType} | null` : mapping.tsType;\n const defaultValue =\n prop.defaultValue !== undefined\n ? renderLiteral(prop.defaultValue)\n : nullable\n ? 'null'\n : mapping.defaultValue;\n const fieldOptions = compactObject({\n required: prop.required,\n nullable: prop.nullable,\n description: prop.description,\n });\n const jsdoc = prop.description ? ` /** ${prop.description} */\\n` : '';\n const decorator =\n Object.keys(fieldOptions).length > 0\n ? ` @field(${JSON.stringify(fieldOptions)})\\n`\n : '';\n\n return `${jsdoc}${decorator} ${prop.name}: ${tsType} = ${defaultValue};`;\n}\n\nfunction renderRelationship(relationship: RelationshipDefinition): string {\n const options = compactObject({\n required: relationship.required,\n nullable: relationship.nullable,\n description: relationship.description,\n validate: relationship.validate,\n foreignKey: relationship.foreignKey,\n through: relationship.through,\n sourceKey: relationship.sourceKey,\n targetKey: relationship.targetKey,\n });\n const args = [\n renderLiteral(relationship.related),\n ...(Object.keys(options).length > 0 ? [JSON.stringify(options)] : []),\n ];\n const decorator = `@${relationship.type}(${args.join(', ')})`;\n const fieldType =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? 'unknown[]'\n : relationship.nullable\n ? 'string | null'\n : 'string';\n const defaultValue =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? '[]'\n : relationship.nullable\n ? 'null'\n : \"''\";\n\n return ` ${decorator}\\n ${relationship.name}: ${fieldType} = ${defaultValue};`;\n}\n\nfunction needsFieldDecorator(properties: PropertyDefinition[]): boolean {\n return properties.some(\n (property) =>\n property.required !== undefined ||\n property.nullable !== undefined ||\n property.description !== undefined,\n );\n}\n\nfunction renderCompanionSnippets(\n className: string,\n usesTenantScoped: boolean,\n): string {\n const dependencyNote = usesTenantScoped\n ? `\\n * - Ensure package.json declares \"@happyvertical/smrt-tenancy\".`\n : '';\n return `/*\n * Package wiring:\n * - Export ${className} from the package entrypoint used by consumers.\n * - Import this module from any package registration file that eagerly loads objects.${dependencyNote}\n */`;\n}\n\nfunction renderObjectLiteral(value: Record<string, unknown>): string {\n return JSON.stringify(compactObject(value), null, 2);\n}\n\nfunction renderLiteral(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (value === null) return 'null';\n return JSON.stringify(value, null, 2);\n}\n\nfunction compactObject<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n","/**\n * Project Introspection Tool\n * Returns a manifest-equivalent inventory of SMRT objects in a project.\n */\n\nimport type { Dirent } from 'node:fs';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { isAbsolute, join, relative, resolve } from 'node:path';\nimport {\n ManifestGenerator,\n type SmartObjectManifest,\n} from '@happyvertical/smrt-core/scanner';\nimport type { ScanError } from '@happyvertical/smrt-scanner';\nimport { ManifestAdapter, OxcScanner } from '@happyvertical/smrt-scanner';\n\n/**\n * `summary` (default) returns one compact record per object; `full` returns the\n * verbose shape. A 42-object project produced 338,462 characters in the only\n * mode that used to exist, which put every call over tool-result budgets and\n * forced callers to write-to-file and `jq` (#2143).\n */\nexport type IntrospectDetail = 'summary' | 'full';\n\n/** Common shape both detail modes emit, so the two branches share a list. */\ntype IntrospectedObject = Record<string, unknown> & { className: string };\n\ninterface IntrospectProjectArgs {\n directory?: string;\n manifestPath?: string;\n includeFields?: boolean;\n includeRelationships?: boolean;\n includeMethods?: boolean;\n detail?: IntrospectDetail;\n /**\n * Overrides the default character budget for the serialized `objects` array.\n *\n * Project metadata and diagnostics are deliberately exempt: a diagnostic is\n * how discovery reports that it found nothing (#2143), so budgeting it away\n * would hide the very failure the caller needs to see. The full response is\n * therefore somewhat larger than this budget.\n */\n maxChars?: number;\n}\n\ntype DiagnosticSeverity = 'error' | 'warning' | 'info';\n\ninterface Diagnostic {\n severity: DiagnosticSeverity;\n message: string;\n filePath?: string;\n line?: number;\n column?: number;\n}\n\ninterface ManifestLike {\n version?: string;\n packageName?: string;\n packageVersion?: string;\n objects?: Record<string, ManifestObject>;\n}\n\ninterface ManifestObject {\n name?: string;\n className: string;\n qualifiedName?: string;\n collection?: string;\n filePath: string;\n packageName?: string;\n packageVersion?: string;\n importPath?: string;\n modulePath?: string;\n exportName?: string;\n collectionExportName?: string;\n fields?: Record<string, ManifestField>;\n methods?: Record<string, ManifestMethod>;\n decoratorConfig?: Record<string, unknown>;\n extends?: string;\n extendsTypeArg?: string;\n schema?: ManifestSchema;\n staticProperties?: Record<string, unknown>;\n validationRules?: Record<string, unknown>;\n}\n\ninterface ManifestField {\n type: string;\n required?: boolean;\n default?: unknown;\n related?: string;\n description?: string;\n _meta?: Record<string, unknown>;\n transient?: boolean;\n}\n\ninterface ManifestMethod {\n name?: string;\n async?: boolean;\n parameters?: Array<{\n name: string;\n type?: string;\n optional?: boolean;\n default?: unknown;\n }>;\n returnType?: string;\n description?: string;\n isStatic?: boolean;\n isPublic?: boolean;\n}\n\ninterface ManifestSchema {\n tableName?: string;\n ddl?: string;\n columns?: Record<string, unknown>;\n indexes?: Array<{\n name?: string;\n columns?: string[];\n unique?: boolean;\n where?: string;\n jsonPath?: unknown;\n }>;\n version?: string;\n}\n\ninterface PackageMetadata {\n name?: string;\n version?: string;\n json?: Record<string, unknown>;\n}\n\nconst DEFAULT_MANIFEST_PATHS = [\n '.smrt/manifest.json',\n 'dist/manifest.json',\n 'src/manifest/manifest.json',\n];\n\nconst SCAN_EXCLUDE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.smrt/**',\n '**/*.d.ts',\n '**/*.test.ts',\n '**/*.spec.ts',\n '**/__tests__/**',\n];\n\nconst RELATIONSHIP_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n]);\n\n/**\n * Response budget in characters. Generous enough that a 42-object summary never\n * truncates, while still capping a runaway payload instead of emitting one.\n */\nconst DEFAULT_MAX_CHARS = 50_000;\n\nconst DEFAULT_MCP_OPERATIONS = ['list', 'get', 'create', 'update', 'delete'];\n\nexport async function introspectProject(\n args: IntrospectProjectArgs,\n): Promise<string> {\n const {\n directory = process.cwd(),\n includeFields = true,\n includeRelationships = true,\n includeMethods = true,\n detail = 'summary',\n maxChars = DEFAULT_MAX_CHARS,\n } = args;\n const projectPath = resolve(directory);\n\n const exists = await pathExists(projectPath);\n if (!exists) {\n return JSON.stringify(\n {\n projectPath,\n manifestSource: 'none',\n objectCount: 0,\n objects: [],\n diagnostics: [\n {\n severity: 'warning',\n message: `Project directory does not exist: ${projectPath}`,\n },\n ],\n },\n null,\n 2,\n );\n }\n\n const packageMetadata = await readPackageMetadata(projectPath);\n const tenantScopes = await scanTenantScopes(projectPath);\n const manifestResult =\n (await loadManifestArtifact(projectPath, args.manifestPath)) ??\n (await scanSourceManifest(projectPath, packageMetadata));\n\n const entries = Object.entries(manifestResult.manifest.objects ?? {});\n const objects: IntrospectedObject[] =\n detail === 'summary'\n ? entries.map(([manifestKey, object]) =>\n summarizeObject({\n manifestKey,\n object,\n projectPath,\n tenantScope: tenantScopes.get(object.className),\n }),\n )\n : entries.map(([manifestKey, object]) =>\n formatObject({\n manifestKey,\n object,\n projectPath,\n includeFields,\n includeRelationships,\n includeMethods,\n tenantScope: tenantScopes.get(object.className),\n }),\n );\n objects.sort((left, right) => left.className.localeCompare(right.className));\n\n const { kept, omitted } = applyObjectBudget(objects, maxChars);\n\n const output = {\n projectPath,\n manifestSource: manifestResult.source,\n manifestPath:\n 'path' in manifestResult\n ? relative(projectPath, manifestResult.path)\n : undefined,\n packageName:\n manifestResult.manifest.packageName ?? packageMetadata.name ?? undefined,\n packageVersion:\n manifestResult.manifest.packageVersion ??\n packageMetadata.version ??\n undefined,\n detail,\n objectCount: objects.length,\n scannedFileCount: manifestResult.scannedFileCount,\n parseTimeMs: manifestResult.parseTimeMs,\n ...(omitted > 0\n ? {\n truncated: {\n returnedObjectCount: kept.length,\n omittedObjectCount: omitted,\n budgetChars: maxChars,\n guidance:\n 'The object list hit its character budget; metadata and diagnostics are still complete. Narrow the scan with `directory` (a single package), keep `detail: \"summary\"`, or raise `maxChars` deliberately. Object names are sorted alphabetically, so omitted objects are the alphabetical tail.',\n },\n }\n : {}),\n objects: kept,\n diagnostics: manifestResult.diagnostics,\n };\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Trims the object list to the character budget, always keeping at least one so\n * a caller sees the shape rather than an empty list.\n */\nfunction applyObjectBudget<T>(\n objects: T[],\n maxChars: number,\n): { kept: T[]; omitted: number } {\n const kept: T[] = [];\n let used = 0;\n\n for (const object of objects) {\n const size = JSON.stringify(object, null, 2).length + 2;\n if (used + size > maxChars && kept.length > 0) break;\n used += size;\n kept.push(object);\n }\n\n return { kept, omitted: objects.length - kept.length };\n}\n\nfunction summarizeObject({\n manifestKey,\n object,\n projectPath,\n tenantScope,\n}: {\n manifestKey: string;\n object: ManifestObject;\n projectPath: string;\n tenantScope?: Record<string, unknown>;\n}) {\n const fields = Object.entries(object.fields ?? {});\n const decoratorConfig = object.decoratorConfig ?? {};\n\n return compactObject({\n manifestKey,\n className: object.className,\n qualifiedName: object.qualifiedName,\n filePath: sanitizePath(projectPath, object.filePath),\n extends: object.extends,\n collection: object.collection,\n tableName:\n object.schema?.tableName ??\n stringFromConfig(decoratorConfig.tableName) ??\n object.collection,\n tenantScope:\n tenantScope ?? normalizeTenantScopedConfig(decoratorConfig.tenantScoped),\n fieldCount: fields.length,\n relationships:\n fields\n .filter(([, field]) => RELATIONSHIP_TYPES.has(field.type))\n .map(\n ([name, field]) =>\n `${name} -> ${field.related ?? ''} (${field.type})`,\n )\n .join(', ') || undefined,\n mcpOperations: mcpOperationsFromConfig(decoratorConfig.mcp),\n });\n}\n\n/**\n * An omitted `mcp` config means full CRUD, not a closed surface — the same rule\n * the knowledge index applies.\n */\nfunction mcpOperationsFromConfig(config: unknown): string[] {\n if (config === false) return [];\n if (typeof config !== 'object' || config === null || Array.isArray(config)) {\n return [...DEFAULT_MCP_OPERATIONS];\n }\n\n const record = config as Record<string, unknown>;\n const include = Array.isArray(record.include)\n ? record.include.filter((item): item is string => typeof item === 'string')\n : DEFAULT_MCP_OPERATIONS;\n const exclude = new Set(\n Array.isArray(record.exclude)\n ? record.exclude.filter(\n (item): item is string => typeof item === 'string',\n )\n : [],\n );\n\n return include.filter((operation) => !exclude.has(operation));\n}\n\nasync function loadManifestArtifact(\n projectPath: string,\n manifestPath: string | undefined,\n): Promise<\n | {\n source: 'manifest';\n path: string;\n manifest: ManifestLike;\n diagnostics: Diagnostic[];\n scannedFileCount?: number;\n parseTimeMs?: number;\n }\n | undefined\n> {\n const candidates = manifestPath\n ? [resolve(projectPath, manifestPath)]\n : DEFAULT_MANIFEST_PATHS.map((candidate) => join(projectPath, candidate));\n\n const diagnostics: Diagnostic[] = [];\n for (const candidate of candidates) {\n if (!(await pathExists(candidate))) {\n continue;\n }\n\n try {\n const parsed = JSON.parse(await readFile(candidate, 'utf-8')) as unknown;\n if (isManifestLike(parsed)) {\n return {\n source: 'manifest',\n path: candidate,\n manifest: parsed,\n diagnostics,\n };\n }\n\n diagnostics.push({\n severity: 'warning',\n filePath: candidate,\n message: 'Manifest artifact is present but does not contain objects.',\n });\n } catch (error) {\n diagnostics.push({\n severity: 'error',\n filePath: candidate,\n message: `Unable to parse manifest artifact: ${messageFromError(error)}`,\n });\n }\n }\n\n return manifestPath\n ? {\n source: 'manifest',\n path: resolve(projectPath, manifestPath),\n manifest: { objects: {} },\n diagnostics: [\n ...diagnostics,\n {\n severity: 'warning',\n filePath: resolve(projectPath, manifestPath),\n message: 'Requested manifest artifact was not found.',\n },\n ],\n }\n : undefined;\n}\n\nasync function scanSourceManifest(\n projectPath: string,\n packageMetadata: PackageMetadata,\n): Promise<{\n source: 'scanner';\n manifest: ManifestLike;\n diagnostics: Diagnostic[];\n scannedFileCount: number;\n parseTimeMs: number;\n}> {\n const scanner = new OxcScanner({\n cwd: projectPath,\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: SCAN_EXCLUDE,\n });\n const { results, resolved } = await scanner.scanAndResolve();\n const adapter = new ManifestAdapter();\n const manifest = adapter.toManifest(\n resolved.filter((classDef) => classDef.hasSmartDecorator),\n {\n packageName: packageMetadata.name,\n packageVersion: packageMetadata.version,\n typeAliases: results.typeAliases,\n },\n ) as ManifestLike;\n finalizeScannerManifest(manifest, packageMetadata);\n\n return {\n source: 'scanner',\n manifest,\n diagnostics: results.errors.map(scanErrorToDiagnostic),\n scannedFileCount: results.fileCount,\n parseTimeMs: Math.round(results.totalParseTimeMs),\n };\n}\n\nfunction finalizeScannerManifest(\n manifest: ManifestLike,\n packageMetadata: PackageMetadata,\n): void {\n const manifestGen = new ManifestGenerator();\n const fullManifest = manifest as unknown as SmartObjectManifest;\n withSuppressedConsoleLog(() => {\n manifestGen.injectTenantScopedFields(fullManifest);\n manifestGen.mergeInheritedFields(fullManifest);\n manifestGen.generateValidationRules(fullManifest);\n manifestGen.generateSchemas(fullManifest);\n manifestGen.assertTenantScopedSchemaContract(fullManifest);\n manifestGen.generateAgentManifests(\n fullManifest,\n packageMetadata.name,\n packageMetadata.json,\n );\n });\n}\n\nfunction withSuppressedConsoleLog<T>(callback: () => T): T {\n const originalLog = console.log;\n console.log = () => undefined;\n try {\n return callback();\n } finally {\n console.log = originalLog;\n }\n}\n\nfunction formatObject({\n manifestKey,\n object,\n projectPath,\n includeFields,\n includeRelationships,\n includeMethods,\n tenantScope,\n}: {\n manifestKey: string;\n object: ManifestObject;\n projectPath: string;\n includeFields: boolean;\n includeRelationships: boolean;\n includeMethods: boolean;\n tenantScope?: Record<string, unknown>;\n}) {\n const fieldDetails = Object.entries(object.fields ?? {}).map(\n ([name, field]) => ({\n name,\n type: field.type,\n ...(field.required !== undefined ? { required: field.required } : {}),\n ...(field.default !== undefined ? { default: field.default } : {}),\n ...(field.related ? { related: field.related } : {}),\n ...(field.description ? { description: field.description } : {}),\n ...(field._meta ? { meta: field._meta } : {}),\n ...(field.transient !== undefined ? { transient: field.transient } : {}),\n }),\n );\n const relationshipDetails = fieldDetails\n .filter((field) => RELATIONSHIP_TYPES.has(field.type))\n .map((field) => ({\n field: field.name,\n relatedClass: field.related ?? '',\n type: field.type,\n ...(field.meta ? { meta: field.meta } : {}),\n }));\n const methodDetails = Object.entries(object.methods ?? {}).map(\n ([name, method]) => ({\n name: method.name ?? name,\n isAsync: method.async === true,\n isStatic: method.isStatic === true,\n isPublic: method.isPublic !== false,\n parameters: method.parameters ?? [],\n returnType: method.returnType ?? 'unknown',\n ...(method.description ? { description: method.description } : {}),\n }),\n );\n\n const decoratorConfig = object.decoratorConfig ?? {};\n const effectiveTenantScope =\n tenantScope ?? normalizeTenantScopedConfig(decoratorConfig.tenantScoped);\n const schema = object.schema;\n\n return compactObject({\n manifestKey,\n name: object.name,\n className: object.className,\n qualifiedName: object.qualifiedName,\n filePath: sanitizePath(projectPath, object.filePath),\n packageName: object.packageName,\n packageVersion: object.packageVersion,\n importPath: object.importPath,\n modulePath: object.modulePath,\n exportName: object.exportName,\n collectionExportName: object.collectionExportName,\n collection: object.collection,\n extends: object.extends,\n extendsTypeArg: object.extendsTypeArg,\n tableName:\n schema?.tableName ??\n stringFromConfig(decoratorConfig.tableName) ??\n object.collection,\n tableStrategy: stringFromConfig(decoratorConfig.tableStrategy) ?? 'cti',\n conflictColumns: arrayFromConfig(decoratorConfig.conflictColumns),\n tenantScope: effectiveTenantScope,\n decoratorConfig,\n schema: schema\n ? {\n tableName: schema.tableName,\n columns: schema.columns,\n indexes: schema.indexes ?? [],\n version: schema.version,\n }\n : undefined,\n indexes: schema?.indexes ?? [],\n staticProperties: object.staticProperties,\n validationRules: object.validationRules,\n ...(includeFields && {\n fields: fieldDetails\n .map((field) => `${field.name}: ${field.type}`)\n .join(', '),\n fieldDetails,\n }),\n ...(includeRelationships &&\n relationshipDetails.length > 0 && {\n relationships: relationshipDetails\n .map(\n (relationship) =>\n `${relationship.field} -> ${relationship.relatedClass} (${relationship.type})`,\n )\n .join(', '),\n relationshipDetails,\n }),\n ...(includeMethods &&\n methodDetails.length > 0 && {\n methods: methodDetails\n .map((method) => `${method.isAsync ? 'async ' : ''}${method.name}()`)\n .join(', '),\n methodDetails,\n }),\n });\n}\n\nasync function scanTenantScopes(\n projectPath: string,\n): Promise<Map<string, Record<string, unknown>>> {\n const files = await listSourceFiles(projectPath);\n const scopes = new Map<string, Record<string, unknown>>();\n\n await Promise.all(\n files.map(async (filePath) => {\n const content = await readFile(filePath, 'utf-8');\n const classMatches = content.matchAll(/class\\s+([A-Za-z_]\\w*)\\b/g);\n for (const match of classMatches) {\n const className = match[1];\n if (!className || match.index === undefined) continue;\n const prefix = content.slice(\n Math.max(0, match.index - 800),\n match.index,\n );\n const tenantMatches = Array.from(\n prefix.matchAll(/@TenantScoped\\s*\\(([\\s\\S]*?)\\)/g),\n );\n const tenantMatch = tenantMatches.at(-1);\n if (!tenantMatch) continue;\n scopes.set(className, {\n source: 'TenantScoped',\n ...parseTenantScopedOptions(tenantMatch[1]),\n });\n }\n }),\n );\n\n return scopes;\n}\n\nasync function listSourceFiles(projectPath: string): Promise<string[]> {\n const files: string[] = [];\n\n async function visit(dir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (\n [\n 'node_modules',\n 'dist',\n 'build',\n '.git',\n '.smrt',\n '__tests__',\n ].includes(entry.name) ||\n entry.name.startsWith('.')\n ) {\n continue;\n }\n await visit(fullPath);\n continue;\n }\n\n if (\n entry.isFile() &&\n /\\.(tsx?|jsx?)$/.test(entry.name) &&\n !entry.name.endsWith('.d.ts') &&\n !entry.name.endsWith('.test.ts') &&\n !entry.name.endsWith('.spec.ts')\n ) {\n files.push(fullPath);\n }\n }\n }\n\n await visit(projectPath);\n return files;\n}\n\nfunction parseTenantScopedOptions(raw: string): Record<string, unknown> {\n const mode = raw.match(/mode\\s*:\\s*['\"`](required|optional)['\"`]/)?.[1];\n const field = raw.match(/field\\s*:\\s*['\"`]([A-Za-z_]\\w*)['\"`]/)?.[1];\n const allowSuperAdminBypass = raw.match(\n /allowSuperAdminBypass\\s*:\\s*(true|false)/,\n )?.[1];\n const autoFilter = raw.match(/autoFilter\\s*:\\s*(true|false)/)?.[1];\n const autoPopulate = raw.match(/autoPopulate\\s*:\\s*(true|false)/)?.[1];\n\n return compactObject({\n mode: mode ?? 'required',\n field: field ?? 'tenantId',\n autoFilter: autoFilter === undefined ? undefined : autoFilter === 'true',\n autoPopulate:\n autoPopulate === undefined ? undefined : autoPopulate === 'true',\n allowSuperAdminBypass:\n allowSuperAdminBypass === undefined\n ? undefined\n : allowSuperAdminBypass === 'true',\n });\n}\n\nfunction normalizeTenantScopedConfig(\n tenantScoped: unknown,\n): Record<string, unknown> | undefined {\n if (!tenantScoped) return undefined;\n const options =\n typeof tenantScoped === 'object' && !Array.isArray(tenantScoped)\n ? (tenantScoped as Record<string, unknown>)\n : {};\n return {\n source: 'smrt',\n mode: options.mode ?? 'required',\n field: options.field ?? 'tenantId',\n autoFilter: options.autoFilter ?? true,\n autoPopulate: options.autoPopulate ?? true,\n allowSuperAdminBypass: options.allowSuperAdminBypass ?? false,\n };\n}\n\nasync function readPackageMetadata(\n projectPath: string,\n): Promise<PackageMetadata> {\n const packageJsonPath = join(projectPath, 'package.json');\n if (!(await pathExists(packageJsonPath))) return {};\n\n try {\n const json = JSON.parse(await readFile(packageJsonPath, 'utf-8')) as Record<\n string,\n unknown\n >;\n return {\n name: typeof json.name === 'string' ? json.name : undefined,\n version: typeof json.version === 'string' ? json.version : undefined,\n json,\n };\n } catch {\n return {};\n }\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isManifestLike(value: unknown): value is ManifestLike {\n return (\n !!value &&\n typeof value === 'object' &&\n !!(value as ManifestLike).objects &&\n typeof (value as ManifestLike).objects === 'object'\n );\n}\n\nfunction scanErrorToDiagnostic(error: ScanError): Diagnostic {\n return {\n severity: error.severity,\n message: error.message,\n filePath: error.filePath,\n line: error.line,\n column: error.column,\n };\n}\n\nfunction sanitizePath(projectPath: string, filePath: string): string {\n const absolute = isAbsolute(filePath)\n ? filePath\n : resolve(projectPath, filePath);\n const relativePath = relative(projectPath, absolute);\n if (!relativePath.startsWith('..')) {\n return relativePath || filePath;\n }\n return filePath;\n}\n\nfunction stringFromConfig(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction arrayFromConfig(value: unknown): string[] | undefined {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : undefined;\n}\n\nfunction compactObject<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\nfunction messageFromError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * Ecosystem-aware downstream project review.\n * Advisory only: scans manifests and source files, then reports alignment risks.\n */\n\nimport { type Dirent, existsSync } from 'node:fs';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\n\ninterface ReviewSmrtProjectArgs {\n directory?: string;\n rootDir?: string;\n includeSourceEvidence?: boolean;\n maxFindings?: number;\n}\n\ntype Severity = 'high' | 'medium' | 'low';\n\ninterface Evidence {\n filePath: string;\n line?: number;\n detail: string;\n}\n\ninterface Finding {\n severity: Severity;\n area:\n | 'dependencies'\n | 'storage'\n | 'api-shell'\n | 'manifest'\n | 'auth-tenancy'\n | 'ui-shell';\n code: string;\n title: string;\n evidence: Evidence[];\n recommendation: string;\n suggestedIssueTitle: string;\n}\n\ninterface PackageInventory {\n name: string;\n path: string;\n private?: boolean;\n scripts: string[];\n declaredHappyVerticalDependencies: string[];\n importedHappyVerticalPackages: string[];\n missingHappyVerticalDependencies: string[];\n hasSvelteKit: boolean;\n hasSmrtSvelte: boolean;\n}\n\ninterface PackageContext {\n directory: string;\n relativePath: string;\n packageJsonPath: string;\n json: Record<string, unknown>;\n dependencies: Set<string>;\n scripts: Record<string, unknown>;\n imports: Map<string, Evidence[]>;\n sourceFiles: SourceFile[];\n}\n\ninterface SourceFile {\n path: string;\n packageDir: string;\n content: string;\n}\n\nconst SOURCE_EXTENSIONS = /\\.(tsx?|jsx?|svelte)$/;\nconst SKIP_DIRS = new Set([\n 'node_modules',\n 'dist',\n 'build',\n '.git',\n '.smrt',\n '.svelte-kit',\n 'coverage',\n]);\nconst DEPENDENCY_SECTIONS = [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n];\nconst SMRT_PACKAGE_PREFIX = '@happyvertical/smrt-';\nconst HAPPYVERTICAL_PACKAGE_PREFIX = '@happyvertical/';\n\nexport async function reviewSmrtProject(\n args: ReviewSmrtProjectArgs,\n): Promise<string> {\n const projectPath = resolve(args.directory ?? args.rootDir ?? process.cwd());\n if (!(await pathExists(projectPath))) {\n return JSON.stringify(\n {\n projectPath,\n packageCount: 0,\n packages: [],\n findings: [],\n summary: { high: 0, medium: 0, low: 0 },\n diagnostics: [\n {\n severity: 'warning',\n message: `Project directory does not exist: ${projectPath}`,\n },\n ],\n },\n null,\n 2,\n );\n }\n\n const packageContexts = await buildPackageContexts(projectPath);\n const sourceFiles = await listSourceFiles(projectPath, packageContexts);\n await attachSourceFiles(sourceFiles, packageContexts, projectPath);\n\n const findings = limitFindings(\n [\n ...findMissingHappyVerticalDependencies(packageContexts),\n ...findCustomManifestGeneration(sourceFiles, projectPath),\n ...findDirectStorageBypasses(sourceFiles, packageContexts, projectPath),\n ...findCustomHttpShells(sourceFiles, packageContexts, projectPath),\n ...findLocalAuthTenancy(sourceFiles, packageContexts, projectPath),\n ...findUiShellDrift(packageContexts, projectPath),\n ...findMissingManifestArtifacts(\n sourceFiles,\n packageContexts,\n projectPath,\n ),\n ],\n args.maxFindings,\n );\n\n const packages = packageContexts\n .map(packageInventory)\n .sort((left, right) => left.path.localeCompare(right.path));\n const summary = summarizeFindings(findings);\n\n return JSON.stringify(\n {\n projectPath,\n packageCount: packages.length,\n packages,\n findings:\n args.includeSourceEvidence === false\n ? findings.map(({ evidence: _evidence, ...finding }) => finding)\n : findings,\n summary,\n referenceChecks: [\n 'Prefer SMRT scanner/runtime manifests over custom manifest builders.',\n 'Prefer SvelteKit plus @happyvertical/smrt-svelte for app shells.',\n 'Prefer @happyvertical/sql and @happyvertical/files/assets/content over direct durable node:fs storage.',\n 'Prefer smrt-users, smrt-tenancy, and profile/audit packages over local static auth seams.',\n ],\n suggestedFollowUpIssues: findings.map((finding) => ({\n title: finding.suggestedIssueTitle,\n severity: finding.severity,\n area: finding.area,\n })),\n },\n null,\n 2,\n );\n}\n\nasync function buildPackageContexts(\n projectPath: string,\n): Promise<PackageContext[]> {\n const packageJsonPaths = await listPackageJsonFiles(projectPath);\n const contexts = await Promise.all(\n packageJsonPaths.map(async (packageJsonPath) => {\n const json = JSON.parse(\n await readFile(packageJsonPath, 'utf-8'),\n ) as Record<string, unknown>;\n const directory = dirname(packageJsonPath);\n return {\n directory,\n relativePath: relative(projectPath, directory) || '.',\n packageJsonPath,\n json,\n dependencies: collectDependencies(json),\n scripts: isRecord(json.scripts)\n ? (json.scripts as Record<string, unknown>)\n : {},\n imports: new Map<string, Evidence[]>(),\n sourceFiles: [],\n };\n }),\n );\n\n if (contexts.length === 0) {\n contexts.push({\n directory: projectPath,\n relativePath: '.',\n packageJsonPath: join(projectPath, 'package.json'),\n json: {},\n dependencies: new Set(),\n scripts: {},\n imports: new Map(),\n sourceFiles: [],\n });\n }\n\n return contexts.sort(\n (left, right) => left.directory.length - right.directory.length,\n );\n}\n\nasync function listPackageJsonFiles(projectPath: string): Promise<string[]> {\n const files: string[] = [];\n await visit(projectPath, async (filePath, entryName) => {\n if (entryName === 'package.json') files.push(filePath);\n });\n return files;\n}\n\nasync function listSourceFiles(\n projectPath: string,\n packages: PackageContext[],\n): Promise<SourceFile[]> {\n const files: SourceFile[] = [];\n await visit(projectPath, async (filePath, entryName) => {\n if (!SOURCE_EXTENSIONS.test(entryName)) return;\n if (\n entryName.endsWith('.d.ts') ||\n entryName.endsWith('.test.ts') ||\n entryName.endsWith('.spec.ts')\n ) {\n return;\n }\n\n const packageDir = findOwningPackage(filePath, packages).directory;\n const content = await readFile(filePath, 'utf-8');\n files.push({ path: filePath, packageDir, content });\n });\n return files;\n}\n\nasync function attachSourceFiles(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Promise<void> {\n for (const sourceFile of sourceFiles) {\n const owner = packages.find(\n (pkg) => pkg.directory === sourceFile.packageDir,\n );\n if (!owner) continue;\n owner.sourceFiles.push(sourceFile);\n for (const importedPackage of extractImports(sourceFile.content)) {\n if (!importedPackage.startsWith(HAPPYVERTICAL_PACKAGE_PREFIX)) continue;\n const evidence = {\n filePath: relative(projectPath, sourceFile.path),\n line: lineNumber(sourceFile.content, importedPackage),\n detail: `Imports ${importedPackage}`,\n };\n const existing = owner.imports.get(importedPackage) ?? [];\n existing.push(evidence);\n owner.imports.set(importedPackage, existing);\n }\n }\n}\n\nfunction findMissingHappyVerticalDependencies(\n packages: PackageContext[],\n): Finding[] {\n return packages.flatMap((pkg) => {\n const ownName =\n typeof pkg.json.name === 'string' ? pkg.json.name : undefined;\n const missing = Array.from(pkg.imports.keys()).filter(\n (importedPackage) =>\n importedPackage !== ownName && !pkg.dependencies.has(importedPackage),\n );\n if (missing.length === 0) return [];\n\n const hasSmrtMissing = missing.some((name) =>\n name.startsWith(SMRT_PACKAGE_PREFIX),\n );\n return [\n {\n severity: hasSmrtMissing ? 'high' : 'medium',\n area: 'dependencies',\n code: 'missing-happyvertical-dependencies',\n title: `${packageLabel(pkg)} imports HappyVertical packages that package.json does not declare`,\n evidence: missing.flatMap((name) => pkg.imports.get(name) ?? []),\n recommendation:\n 'Declare every imported @happyvertical package in the owning package manifest so downstream installs and generated knowledge stay reproducible.',\n suggestedIssueTitle: `Declare missing HappyVertical dependencies in ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nfunction findCustomManifestGeneration(\n sourceFiles: SourceFile[],\n projectPath: string,\n): Finding[] {\n return sourceFiles\n .filter(\n (file) =>\n /manifest\\.json/.test(file.content) &&\n /objects\\s*:/.test(file.content) &&\n /\\b(writeFile|writeFileSync)\\b/.test(file.content) &&\n !/@happyvertical\\/smrt-scanner/.test(file.content),\n )\n .map((file) => ({\n severity: 'high',\n area: 'manifest',\n code: 'custom-object-manifest-generation',\n title: 'Custom SMRT object manifest generation detected',\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'manifest.json'),\n detail:\n 'Writes a manifest.json object inventory outside the SMRT scanner/runtime path.',\n },\n ],\n recommendation:\n 'Use the SMRT scanner/runtime manifest path so defaults, relationships, schemas, tenant fields, and cross-package references match framework behavior.',\n suggestedIssueTitle:\n 'Replace custom object manifest generation with SMRT scanner/runtime manifest generation',\n }));\n}\n\nfunction findDirectStorageBypasses(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return sourceFiles.flatMap((file) => {\n const owner = findOwningPackage(file.path, packages);\n const usesFs =\n /from\\s+['\"](?:node:fs|node:fs\\/promises|fs|fs\\/promises)['\"]|require\\(['\"](?:node:fs|node:fs\\/promises|fs|fs\\/promises)['\"]\\)/.test(\n file.content,\n );\n const writesDurableData =\n /\\b(writeFile|appendFile|mkdir|rm|rename)\\b/.test(file.content) &&\n /(\\.json|data|storage|persist|cache|db)/i.test(file.content);\n const usesDirectSql =\n /from\\s+['\"](?:better-sqlite3|sqlite3|pg|mysql2?|knex|drizzle-orm)['\"]/.test(\n file.content,\n );\n if ((!usesFs || !writesDurableData) && !usesDirectSql) return [];\n\n const hasApprovedStorage =\n owner.dependencies.has('@happyvertical/sql') ||\n owner.dependencies.has('@happyvertical/files') ||\n owner.dependencies.has('@happyvertical/smrt-assets') ||\n owner.dependencies.has('@happyvertical/smrt-content');\n\n if (hasApprovedStorage) return [];\n\n return [\n {\n severity: 'medium',\n area: 'storage',\n code: 'direct-storage-bypass',\n title: `${packageLabel(owner)} appears to bypass HappyVertical storage packages`,\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(\n file.content,\n usesDirectSql ? 'sqlite' : 'writeFile',\n ),\n detail: usesDirectSql\n ? 'Imports a direct SQL/storage library without @happyvertical/sql.'\n : 'Uses node:fs-style durable writes without @happyvertical/files/assets/content.',\n },\n ],\n recommendation:\n 'Route durable data through @happyvertical/sql, @happyvertical/files, SMRT assets, or SMRT content unless this is explicitly build-only tooling.',\n suggestedIssueTitle: `Review direct storage usage in ${packageLabel(owner)}`,\n },\n ];\n });\n}\n\nfunction findCustomHttpShells(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n const evidenceByPackage = new Map<PackageContext, Evidence[]>();\n\n for (const pkg of packages) {\n if (pkg.dependencies.has('@sveltejs/kit')) continue;\n\n const routerDependencies = ['express', 'fastify', 'hono', 'koa'].filter(\n (dep) => pkg.dependencies.has(dep),\n );\n if (routerDependencies.length === 0) continue;\n\n appendEvidence(evidenceByPackage, pkg, {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail: `Declares custom router package(s): ${routerDependencies.join(', ')}.`,\n });\n }\n\n for (const file of sourceFiles) {\n const owner = findOwningPackage(file.path, packages);\n if (owner.dependencies.has('@sveltejs/kit')) continue;\n\n const usesNodeHttp =\n /from\\s+['\"](?:node:http|http|node:https|https)['\"]|createServer\\s*\\(/.test(\n file.content,\n );\n if (!usesNodeHttp) continue;\n\n appendEvidence(evidenceByPackage, owner, {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'createServer'),\n detail:\n 'Custom HTTP routing found without the SvelteKit/SMRT app-shell dependency pattern.',\n });\n }\n\n return Array.from(evidenceByPackage.entries()).map(([owner, evidence]) => ({\n severity: 'medium',\n area: 'api-shell',\n code: 'custom-http-shell',\n title: `${packageLabel(owner)} uses a custom HTTP shell`,\n evidence,\n recommendation:\n 'Compare the app shell against the Anytown/Ergot SvelteKit + SMRT shell pattern before adding custom HTTP infrastructure.',\n suggestedIssueTitle: `Align ${packageLabel(owner)} app shell with SMRT/SvelteKit conventions`,\n }));\n}\n\nfunction appendEvidence(\n evidenceByPackage: Map<PackageContext, Evidence[]>,\n pkg: PackageContext,\n evidence: Evidence,\n): void {\n const existing = evidenceByPackage.get(pkg);\n if (existing) {\n existing.push(evidence);\n return;\n }\n\n evidenceByPackage.set(pkg, [evidence]);\n}\n\nfunction findLocalAuthTenancy(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return sourceFiles.flatMap((file) => {\n const owner = findOwningPackage(file.path, packages);\n const pathSignal = /(auth|tenant|audit|session|rbac|user)/i.test(file.path);\n const codeSignal =\n /\\b(tenantId|tenant|role|permission|session|auditLog|apiKey)\\b/.test(\n file.content,\n );\n if (!pathSignal || !codeSignal) return [];\n\n const hasApprovedPackages =\n owner.dependencies.has('@happyvertical/smrt-users') ||\n owner.dependencies.has('@happyvertical/smrt-tenancy') ||\n owner.dependencies.has('@happyvertical/smrt-profiles');\n if (hasApprovedPackages) return [];\n\n return [\n {\n severity: 'medium',\n area: 'auth-tenancy',\n code: 'local-auth-tenancy',\n title: `${packageLabel(owner)} contains local auth/tenancy/audit logic`,\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'tenant'),\n detail:\n 'Auth, tenancy, session, role, or audit terminology appears without smrt-users/smrt-tenancy/smrt-profiles dependencies.',\n },\n ],\n recommendation:\n 'Add explicit adapters to smrt-users, smrt-tenancy, and profile/audit models or document why this local implementation is intentionally isolated.',\n suggestedIssueTitle: `Review auth and tenancy adapters in ${packageLabel(owner)}`,\n },\n ];\n });\n}\n\nfunction findUiShellDrift(\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return packages.flatMap((pkg) => {\n const hasUiSource = pkg.sourceFiles.some((file) =>\n file.path.endsWith('.svelte'),\n );\n const likelyUiPackage =\n hasUiSource ||\n /(?:web|ui|app|site|frontend)/i.test(packageLabel(pkg)) ||\n pkg.dependencies.has('svelte') ||\n pkg.dependencies.has('vite');\n if (!likelyUiPackage) return [];\n if (pkg.dependencies.has('@happyvertical/smrt-svelte')) return [];\n\n return [\n {\n severity: 'low',\n area: 'ui-shell',\n code: 'missing-smrt-svelte-shell',\n title: `${packageLabel(pkg)} looks like UI work without @happyvertical/smrt-svelte`,\n evidence: [\n {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail:\n 'UI-facing package does not declare @happyvertical/smrt-svelte.',\n },\n ],\n recommendation:\n 'Use @happyvertical/smrt-svelte and the SvelteKit shell pattern for downstream app UI unless this package is intentionally framework-agnostic.',\n suggestedIssueTitle: `Check SMRT Svelte shell alignment for ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nfunction findMissingManifestArtifacts(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return packages.flatMap((pkg) => {\n const hasSmrtSource = pkg.sourceFiles.some((file) =>\n /@smrt\\s*\\(/.test(file.content),\n );\n if (!hasSmrtSource) return [];\n const hasManifest =\n sourceFiles.some(\n (file) =>\n file.packageDir === pkg.directory &&\n /@happyvertical\\/smrt-scanner/.test(file.content),\n ) ||\n pathExistsSyncHint(join(pkg.directory, '.smrt', 'manifest.json')) ||\n pathExistsSyncHint(join(pkg.directory, 'dist', 'manifest.json'));\n if (hasManifest) return [];\n\n return [\n {\n severity: 'low',\n area: 'manifest',\n code: 'missing-generated-manifest-artifact',\n title: `${packageLabel(pkg)} has @smrt objects but no generated manifest artifact was found`,\n evidence: [\n {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail:\n 'No .smrt/manifest.json or dist/manifest.json was visible during review.',\n },\n ],\n recommendation:\n 'Run the package build/test manifest generation path and verify it uses the SMRT scanner/runtime manifest pipeline.',\n suggestedIssueTitle: `Verify SMRT manifest generation for ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nasync function visit(\n dir: string,\n onFile: (filePath: string, entryName: string) => Promise<void> | void,\n): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n await visit(fullPath, onFile);\n continue;\n }\n if (entry.isFile()) await onFile(fullPath, entry.name);\n }\n}\n\nfunction collectDependencies(\n packageJson: Record<string, unknown>,\n): Set<string> {\n const dependencies = new Set<string>();\n for (const sectionName of DEPENDENCY_SECTIONS) {\n const section = packageJson[sectionName];\n if (!isRecord(section)) continue;\n for (const dependencyName of Object.keys(section)) {\n dependencies.add(dependencyName);\n }\n }\n return dependencies;\n}\n\nfunction extractImports(content: string): string[] {\n const imports = new Set<string>();\n const patterns = [\n /(?:import|export)\\s+(?:type\\s+)?(?:[^'\"]+\\s+from\\s+)?['\"]([^'\"]+)['\"]/g,\n /\\bimport\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n /\\brequire\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n ];\n for (const pattern of patterns) {\n for (const match of content.matchAll(pattern)) {\n const imported = normalizePackageImport(match[1]);\n if (imported) imports.add(imported);\n }\n }\n return Array.from(imports);\n}\n\nfunction normalizePackageImport(value: string | undefined): string | undefined {\n if (!value || value.startsWith('.') || value.startsWith('/'))\n return undefined;\n if (value.startsWith('@')) {\n const [scope, name] = value.split('/');\n return scope && name ? `${scope}/${name}` : value;\n }\n return value.split('/')[0];\n}\n\nfunction findOwningPackage(\n filePath: string,\n packages: PackageContext[],\n): PackageContext {\n const normalized = resolve(filePath);\n const matches = packages\n .filter(\n (pkg) =>\n normalized === pkg.directory ||\n normalized.startsWith(`${pkg.directory}${sep}`),\n )\n .sort((left, right) => right.directory.length - left.directory.length);\n return matches[0] ?? packages[0];\n}\n\nfunction packageInventory(pkg: PackageContext): PackageInventory {\n const declaredHappyVerticalDependencies = Array.from(pkg.dependencies)\n .filter((dependency) => dependency.startsWith(HAPPYVERTICAL_PACKAGE_PREFIX))\n .sort();\n const importedHappyVerticalPackages = Array.from(pkg.imports.keys()).sort();\n const ownName = typeof pkg.json.name === 'string' ? pkg.json.name : undefined;\n return {\n name: packageLabel(pkg),\n path: pkg.relativePath,\n private:\n typeof pkg.json.private === 'boolean' ? pkg.json.private : undefined,\n scripts: Object.keys(pkg.scripts).sort(),\n declaredHappyVerticalDependencies,\n importedHappyVerticalPackages,\n missingHappyVerticalDependencies: importedHappyVerticalPackages.filter(\n (name) => name !== ownName && !pkg.dependencies.has(name),\n ),\n hasSvelteKit: pkg.dependencies.has('@sveltejs/kit'),\n hasSmrtSvelte: pkg.dependencies.has('@happyvertical/smrt-svelte'),\n };\n}\n\nfunction summarizeFindings(findings: Finding[]): Record<Severity, number> {\n return findings.reduce(\n (summary, finding) => {\n summary[finding.severity]++;\n return summary;\n },\n { high: 0, medium: 0, low: 0 },\n );\n}\n\nfunction limitFindings(\n findings: Finding[],\n maxFindings: number | undefined,\n): Finding[] {\n const sorted = findings.sort(\n (left, right) =>\n severityRank(left.severity) - severityRank(right.severity) ||\n left.area.localeCompare(right.area) ||\n left.title.localeCompare(right.title),\n );\n return maxFindings && maxFindings > 0 ? sorted.slice(0, maxFindings) : sorted;\n}\n\nfunction severityRank(severity: Severity): number {\n return severity === 'high' ? 0 : severity === 'medium' ? 1 : 2;\n}\n\nfunction packageLabel(pkg: PackageContext): string {\n return typeof pkg.json.name === 'string' ? pkg.json.name : pkg.relativePath;\n}\n\nfunction lineNumber(content: string, needle: string): number | undefined {\n const index = content.indexOf(needle);\n if (index < 0) return undefined;\n return content.slice(0, index).split('\\n').length;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pathExistsSyncHint(path: string): boolean {\n return existsSync(path);\n}\n","/**\n * SMRT Development MCP Server\n * Provides code generation, project introspection, knowledge context,\n * review/architecture prompt bundles, and portable agent skills.\n */\n\nimport { readFileSync, realpathSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport {\n ProtocolError,\n ProtocolErrorCode,\n Server,\n type Tool,\n} from '@modelcontextprotocol/server';\nimport { serveStdio } from '@modelcontextprotocol/server/stdio';\n\nimport { getAgentSkill, listAgentSkills } from './agent-skills.js';\nimport {\n buildArchitectureContext,\n buildKnowledgeIndex,\n buildReviewContext,\n checkKnowledgeFreshness,\n checkKnowledgeFreshnessFromIndex,\n packageDocPaths,\n smrtArchitecture,\n smrtReview,\n} from './knowledge/index.js';\nimport {\n generateSmrtClass,\n introspectProject,\n reviewSmrtProject,\n} from './tools/index.js';\n\nconst SERVER_NAME = 'smrt-dev-mcp';\nexport const SERVER_VERSION = readPackageVersion();\nconst DEBUG = process.env.DEBUG === 'true';\nconst REVIEW_SKILL_NAME = 'smrt-code-review';\nconst REVIEW_SKILL_URI = `smrt-dev-mcp://agent-skills/${REVIEW_SKILL_NAME}`;\nconst DOMAIN_CODE_REVIEW_PROMPT = 'domain-code-review';\nconst DOMAIN_ARCHITECTURE_PROMPT = 'domain-architecture';\nconst KNOWLEDGE_PROJECT_URI = 'smrt://knowledge/project';\nconst KNOWLEDGE_PACKAGE_PREFIX = 'smrt://knowledge/package/';\n\ntype KnowledgeIndexResult = Awaited<ReturnType<typeof buildKnowledgeIndex>>;\ntype KnowledgePackageResult = KnowledgeIndexResult['packages'][number];\ntype PromptArguments = Record<string, string> | undefined;\n\n// Tool definitions\nexport const TOOLS = [\n // Code Generation Tools\n {\n name: 'generate-smrt-class',\n description: 'Generate a complete SMRT class with @smrt() decorator',\n inputSchema: {\n type: 'object',\n properties: {\n className: {\n type: 'string',\n description: 'Name of the class (PascalCase)',\n },\n properties: {\n type: 'array',\n description: 'Array of property definitions',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n type: {\n type: 'string',\n enum: [\n 'text',\n 'integer',\n 'decimal',\n 'boolean',\n 'datetime',\n 'json',\n ],\n },\n required: { type: 'boolean' },\n nullable: { type: 'boolean' },\n description: { type: 'string' },\n defaultValue: {\n oneOf: [\n { type: 'string' },\n { type: 'number' },\n { type: 'boolean' },\n { type: 'object' },\n { type: 'null' },\n ],\n },\n },\n required: ['name', 'type'],\n },\n },\n baseClass: {\n type: 'string',\n enum: ['SmrtObject', 'SmrtCollection'],\n default: 'SmrtObject',\n },\n template: {\n type: 'string',\n enum: [\n 'basic',\n 'global-catalog',\n 'optional-catalog',\n 'tenant-project-object',\n 'tenant-event-log-object',\n 'cross-package-reference',\n ],\n default: 'basic',\n },\n tableName: { type: 'string' },\n conflictColumns: {\n type: 'array',\n items: { type: 'string' },\n },\n tenantScoped: {\n oneOf: [\n { type: 'boolean' },\n {\n type: 'object',\n properties: {\n mode: { type: 'string', enum: ['required', 'optional'] },\n field: { type: 'string' },\n autoFilter: { type: 'boolean' },\n autoPopulate: { type: 'boolean' },\n allowSuperAdminBypass: { type: 'boolean' },\n },\n },\n ],\n },\n includeTenantIdField: { type: 'boolean' },\n relationships: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n type: {\n type: 'string',\n enum: [\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n ],\n },\n related: { type: 'string' },\n required: { type: 'boolean' },\n nullable: { type: 'boolean' },\n description: { type: 'string' },\n validate: { type: 'boolean' },\n foreignKey: { type: 'string' },\n through: { type: 'string' },\n sourceKey: { type: 'string' },\n targetKey: { type: 'string' },\n },\n required: ['name', 'type', 'related'],\n },\n },\n includeCompanionSnippets: { type: 'boolean', default: false },\n includeApiConfig: { type: 'boolean', default: true },\n includeMcpConfig: { type: 'boolean', default: true },\n includeCliConfig: { type: 'boolean', default: true },\n },\n required: ['className', 'properties'],\n },\n },\n // Project Introspection Tools\n {\n name: 'introspect-project',\n description:\n 'Scan a directory for SMRT objects. Returns a compact summary by default; pass detail: \"full\" for field, schema, and method details.',\n inputSchema: {\n type: 'object',\n properties: {\n directory: {\n type: 'string',\n description: 'Project directory (default: cwd)',\n },\n manifestPath: {\n type: 'string',\n description:\n 'Optional manifest path. Defaults to .smrt/manifest.json, dist/manifest.json, then source scanning.',\n },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: one compact record per object. full: complete field/schema/method detail (large).',\n },\n maxChars: {\n type: 'number',\n description:\n 'Character budget for the `objects` payload. Objects past the budget are omitted and reported under `truncated`. Project metadata and diagnostics are always returned in full, so the serialized response is somewhat larger than this budget.',\n },\n includeFields: {\n type: 'boolean',\n description: 'Include field details (detail: \"full\" only)',\n },\n includeRelationships: {\n type: 'boolean',\n description: 'Analyze relationships (detail: \"full\" only)',\n },\n includeMethods: {\n type: 'boolean',\n description: 'Include public method details (detail: \"full\" only)',\n },\n },\n },\n },\n {\n name: 'review-smrt-project',\n description:\n 'Advisory ecosystem alignment review for downstream SMRT projects',\n inputSchema: {\n type: 'object',\n properties: {\n directory: {\n type: 'string',\n description: 'Project directory (default: cwd)',\n },\n rootDir: {\n type: 'string',\n description: 'Compatibility alias for directory',\n },\n includeSourceEvidence: {\n type: 'boolean',\n description: 'Include file and line evidence in findings',\n default: true,\n },\n maxFindings: {\n type: 'number',\n description: 'Optional maximum number of findings to return',\n },\n },\n },\n },\n {\n name: 'reflect-knowledge',\n description:\n 'Report deterministic SMRT + HappyVertical SDK knowledge coverage and freshness',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: {\n type: 'string',\n description: 'Project root directory (default: cwd)',\n },\n },\n },\n },\n {\n name: 'reflect-domain-knowledge',\n description:\n 'Report domain-scoped SMRT knowledge artifacts, SDK packages, and freshness',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n scope: {\n type: 'string',\n enum: ['project', 'local', 'package', 'sdk'],\n default: 'project',\n },\n package: { type: 'string' },\n },\n },\n },\n {\n name: 'check-knowledge-freshness',\n description: 'Run deterministic freshness checks for SMRT agent knowledge',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n changed: {\n type: 'boolean',\n description: 'Limit stale-pattern checks to changed files',\n },\n strict: {\n type: 'boolean',\n description: 'Treat stale-pattern findings as errors',\n },\n },\n },\n },\n {\n name: 'check-domain-knowledge',\n description:\n 'Run deterministic freshness checks for domain knowledge artifacts',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n changed: { type: 'boolean' },\n strict: { type: 'boolean' },\n scope: {\n type: 'string',\n enum: ['project', 'local', 'package', 'sdk'],\n default: 'project',\n },\n package: { type: 'string' },\n },\n },\n },\n {\n name: 'build-review-context',\n description:\n 'Build model-ready SMRT review context from changed files and optional focus text',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n changedFiles: { type: 'array', items: { type: 'string' } },\n focus: { type: 'string' },\n documentation: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'build-domain-review-context',\n description:\n 'Build domain-scoped model-ready SMRT review context and prompt bundle',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n changedFiles: { type: 'array', items: { type: 'string' } },\n focus: { type: 'string' },\n documentation: { type: 'string' },\n scope: {\n type: 'string',\n enum: ['project', 'local', 'package', 'sdk'],\n default: 'project',\n },\n package: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'smrt-review',\n description:\n 'Return deterministic review findings and/or a reusable model prompt bundle. For a formal downstream review, first call get-agent-skill with { \"name\": \"smrt-code-review\" } or load the smrt-code-review MCP prompt/resource.',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n changedFiles: { type: 'array', items: { type: 'string' } },\n focus: { type: 'string' },\n documentation: { type: 'string' },\n mode: {\n type: 'string',\n enum: ['findings', 'prompt-bundle', 'both'],\n default: 'both',\n },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'build-architecture-context',\n description:\n 'Build model-ready SMRT architecture context from an idea or documentation',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n idea: { type: 'string' },\n documentation: { type: 'string' },\n focus: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'build-domain-architecture-context',\n description:\n 'Build domain-scoped model-ready SMRT architecture context and prompt bundle',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n idea: { type: 'string' },\n documentation: { type: 'string' },\n focus: { type: 'string' },\n scope: {\n type: 'string',\n enum: ['project', 'local', 'package', 'sdk'],\n default: 'project',\n },\n package: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'smrt-architecture',\n description:\n 'Suggest SMRT and HappyVertical SDK packages and return an architecture prompt bundle',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n idea: { type: 'string' },\n documentation: { type: 'string' },\n focus: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description:\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed them.',\n },\n },\n },\n },\n {\n name: 'list-agent-skills',\n description:\n 'List bundled harness-agnostic agent skills shipped with smrt-dev-mcp',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'get-agent-skill',\n description:\n 'Return a bundled harness-agnostic agent skill as Markdown plus optional references',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n enum: [REVIEW_SKILL_NAME],\n description: 'Bundled agent skill name',\n },\n includeReferences: {\n type: 'boolean',\n default: true,\n description: 'Include referenced files with the skill bundle',\n },\n },\n required: ['name'],\n },\n },\n];\n\nexport function createServer(): Server {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Starting server v${SERVER_VERSION}`);\n }\n\n const server = new Server(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n {\n capabilities: {\n prompts: {},\n resources: {},\n tools: {},\n },\n },\n );\n\n // List tools handler\n server.setRequestHandler('tools/list', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] ListTools request`);\n }\n return { tools: TOOLS as Tool[] };\n });\n\n server.setRequestHandler('prompts/list', async () => {\n return {\n prompts: [\n {\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review',\n description:\n 'Harness-agnostic downstream SMRT review procedure that uses smrt-dev-mcp deterministic context and prompt bundles.',\n },\n {\n name: DOMAIN_CODE_REVIEW_PROMPT,\n title: 'Domain Code Review',\n description:\n 'Model-ready domain-scoped SMRT code review prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'changedFiles',\n description:\n 'Changed file paths as newline-separated, comma-separated, or JSON array text.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Review focus text.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'scope',\n description: 'Knowledge scope: project, local, package, or sdk.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n {\n name: DOMAIN_ARCHITECTURE_PROMPT,\n title: 'Domain Architecture',\n description:\n 'Model-ready domain-scoped SMRT architecture planning prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'idea',\n description: 'Architecture idea or product concept.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Planning focus text.',\n required: false,\n },\n {\n name: 'scope',\n description: 'Knowledge scope: project, local, package, or sdk.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n ],\n };\n });\n\n server.setRequestHandler('prompts/get', async (request) => {\n const { name } = request.params;\n if (name === REVIEW_SKILL_NAME) {\n return {\n description:\n 'Use this procedure when reviewing downstream SMRT projects.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_CODE_REVIEW_PROMPT) {\n const context = await buildReviewContext(\n reviewPromptArguments(request.params.arguments),\n );\n return {\n description: 'Review downstream SMRT code with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_ARCHITECTURE_PROMPT) {\n const context = await buildArchitectureContext(\n architecturePromptArguments(request.params.arguments),\n );\n return {\n description: 'Plan a downstream SMRT project with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown prompt: ${name}`,\n );\n });\n\n server.setRequestHandler('resources/list', async () => {\n const index = await buildKnowledgeIndex();\n return {\n resources: [\n {\n uri: REVIEW_SKILL_URI,\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review Skill',\n description:\n 'Bundled Markdown skill for downstream SMRT code reviews.',\n mimeType: 'text/markdown',\n },\n {\n uri: KNOWLEDGE_PROJECT_URI,\n name: 'smrt-domain-knowledge-project',\n title: 'SMRT Domain Knowledge Project Index',\n description:\n 'Composed SMRT, downstream domain, and HappyVertical SDK knowledge index.',\n mimeType: 'application/json',\n },\n ...index.packages.map((pkg) => ({\n uri: `${KNOWLEDGE_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n name: `smrt-domain-knowledge-${pkg.name}`,\n title: `SMRT Domain Knowledge: ${pkg.name}`,\n description:\n 'Package-scoped SMRT domain knowledge, generated surfaces, and authored context.',\n mimeType: 'application/json',\n })),\n ],\n };\n });\n\n server.setRequestHandler('resources/read', async (request) => {\n const { uri } = request.params;\n if (uri === REVIEW_SKILL_URI) {\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n ],\n };\n }\n\n if (uri === KNOWLEDGE_PROJECT_URI) {\n const index = await buildKnowledgeIndex();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgeIndex(index), null, 2),\n },\n ],\n };\n }\n\n if (uri.startsWith(KNOWLEDGE_PACKAGE_PREFIX)) {\n const packageName = decodeURIComponent(\n uri.slice(KNOWLEDGE_PACKAGE_PREFIX.length),\n );\n const index = await buildKnowledgeIndex();\n const pkg = index.packages.find((item) => item.name === packageName);\n if (!pkg) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown knowledge package: ${packageName}`,\n );\n }\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgePackage(pkg), null, 2),\n },\n ],\n };\n }\n\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown resource: ${uri}`,\n );\n });\n\n // Call tool handler\n server.setRequestHandler('tools/call', async (request) => {\n const { name, arguments: args } = request.params;\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] CallTool: ${name}`);\n console.error(\n `[${SERVER_NAME}] Arguments:`,\n JSON.stringify(args, null, 2),\n );\n }\n\n try {\n let result: string;\n\n switch (name) {\n case 'generate-smrt-class':\n result = await generateSmrtClass(\n args as unknown as Parameters<typeof generateSmrtClass>[0],\n );\n break;\n\n case 'introspect-project':\n result = await introspectProject(\n args as unknown as Parameters<typeof introspectProject>[0],\n );\n break;\n\n case 'review-smrt-project':\n result = await reviewSmrtProject(\n args as unknown as Parameters<typeof reviewSmrtProject>[0],\n );\n break;\n\n case 'reflect-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'reflect-domain-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n domainKnowledgePackageCount: index.packages.filter(\n (pkg) => pkg.hasDomainKnowledge,\n ).length,\n missingDomainKnowledgePackages: index.packages\n .filter(\n (pkg) =>\n pkg.exportKeys.includes('./smrt-knowledge.json') &&\n !pkg.hasDomainKnowledge,\n )\n .map((pkg) => pkg.name),\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'check-knowledge-freshness':\n result = JSON.stringify(\n await checkKnowledgeFreshness(\n args as unknown as Parameters<typeof checkKnowledgeFreshness>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'check-domain-knowledge':\n result = JSON.stringify(\n await checkKnowledgeFreshness(\n args as unknown as Parameters<typeof checkKnowledgeFreshness>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'build-review-context':\n case 'build-domain-review-context':\n result = JSON.stringify(\n compactContextResult(\n await buildReviewContext(\n args as unknown as Parameters<typeof buildReviewContext>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'smrt-review':\n result = JSON.stringify(\n compactContextResult(\n await smrtReview(\n args as unknown as Parameters<typeof smrtReview>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'build-architecture-context':\n case 'build-domain-architecture-context':\n result = JSON.stringify(\n compactContextResult(\n await buildArchitectureContext(\n args as unknown as Parameters<\n typeof buildArchitectureContext\n >[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'smrt-architecture':\n result = JSON.stringify(\n compactContextResult(\n await smrtArchitecture(\n args as unknown as Parameters<typeof smrtArchitecture>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'list-agent-skills':\n result = JSON.stringify({ skills: listAgentSkills() }, null, 2);\n break;\n\n case 'get-agent-skill':\n result = JSON.stringify(\n await getAgentSkill(\n args as unknown as Parameters<typeof getAgentSkill>[0],\n ),\n null,\n 2,\n );\n break;\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: result,\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n console.error(`[${SERVER_NAME}] Error:`, error);\n\n return {\n content: [\n {\n type: 'text',\n text: `Error executing tool ${name}: ${errorMessage}`,\n },\n ],\n isError: true,\n };\n }\n });\n\n return server;\n}\n\nasync function main() {\n const handle = serveStdio(() => createServer(), {\n onerror: (error) =>\n console.error(`[${SERVER_NAME}] Protocol error:`, error),\n });\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Server connected via stdio`);\n }\n\n // Graceful shutdown\n process.on('SIGINT', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await handle.close();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await handle.close();\n process.exit(0);\n });\n}\n\nfunction isEntrypoint(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(entry);\n } catch {\n return import.meta.url === pathToFileURL(entry).href;\n }\n}\n\nfunction readPackageVersion(): string {\n try {\n const packageRoot = dirname(fileURLToPath(import.meta.url));\n const packageJsonPath = join(packageRoot, '..', 'package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as {\n version?: unknown;\n };\n return typeof packageJson.version === 'string'\n ? packageJson.version\n : '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nfunction renderAgentSkillMarkdown(name: string): string {\n const skill = getAgentSkill({ name, includeReferences: true });\n const references = skill.referenceFiles.map(\n (file) => `## Reference: ${file.path}\\n\\n${file.content.trim()}`,\n );\n return [skill.skillMarkdown.trim(), ...references].join('\\n\\n');\n}\n\nfunction reviewPromptArguments(args: PromptArguments): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n changedFiles: parseStringList(args?.changedFiles),\n focus: args?.focus,\n documentation: args?.documentation,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction architecturePromptArguments(\n args: PromptArguments,\n): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n idea: args?.idea,\n documentation: args?.documentation,\n focus: args?.focus,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction parseStringList(value: string | undefined): string[] | undefined {\n if (!value?.trim()) return undefined;\n\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return parsed.filter((item): item is string => typeof item === 'string');\n }\n } catch {\n // Fall through to delimiter parsing.\n }\n\n return value\n .split(/[\\n,]/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction compactRecord(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n );\n}\n\nfunction sanitizeKnowledgeIndex(index: KnowledgeIndexResult) {\n const packages = index.packages.map((pkg) => sanitizeKnowledgePackage(pkg));\n return {\n ...index,\n rootDir: '.',\n packages,\n smrtPackages: packages.filter((pkg) => pkg.kind === 'smrt'),\n sdkPackages: packages.filter((pkg) => pkg.kind === 'sdk'),\n };\n}\n\n/**\n * Compact projection of a context result for MCP callers (#2143).\n *\n * `selectedPackages` carries each package's whole authored `agentDoc`, its\n * module-doc contents, and its full domain manifest. A three-package downstream\n * product serialized to 329,003 characters that way, which is what made these\n * tools unusable as planning aids. `detail: \"full\"` returns the whole shape.\n */\nfunction compactContextResult(\n result: object,\n detail: string | undefined,\n): Record<string, unknown> {\n const source = result as Record<string, unknown>;\n if (detail === 'full') return source;\n\n const compact: Record<string, unknown> = { ...source, detail: 'summary' };\n for (const key of ['selectedPackages', 'selectedSdkPackages']) {\n const packages = source[key];\n if (!Array.isArray(packages)) continue;\n compact[key] = (packages as KnowledgePackageResult[]).map(\n compactKnowledgePackage,\n );\n }\n return compact;\n}\n\nfunction compactKnowledgePackage(pkg: KnowledgePackageResult) {\n return {\n name: pkg.name,\n version: pkg.version,\n kind: pkg.kind,\n directory: pkg.relativeDirectory,\n objectSource: pkg.objectSource,\n ...(pkg.objectSourceReason\n ? { objectSourceReason: pkg.objectSourceReason }\n : {}),\n // Paths, not prose: the caller reads what it needs.\n docs: packageDocPaths(pkg),\n domainKnowledgePath: pkg.domainKnowledgePath,\n relationshipFeatures: pkg.relationshipFeatures,\n smrtDependencies: pkg.smrtDependencies,\n sdkDependencies: pkg.sdkDependencies,\n exportKeys: pkg.exportKeys,\n objectCount: pkg.objects.length,\n objects: pkg.objects.map((object) =>\n object.tableName\n ? `${object.qualifiedName ?? object.className} (${object.tableName})`\n : (object.qualifiedName ?? object.className),\n ),\n mcpToolCount: pkg.mcpTools.length,\n };\n}\n\nfunction detailArg(args: unknown): string | undefined {\n const detail = (args as Record<string, unknown> | undefined)?.detail;\n return typeof detail === 'string' ? detail : undefined;\n}\n\nfunction sanitizeKnowledgePackage(pkg: KnowledgePackageResult) {\n const { directory: _directory, objects, checkedObjectPaths, ...rest } = pkg;\n return {\n ...rest,\n // Paths outside the workspace root stay absolute in the index; redact them\n // here the same way object file paths are redacted.\n checkedObjectPaths: checkedObjectPaths.map(\n (path) => sanitizePath(path) ?? path,\n ),\n objects: objects.map((object) => ({\n ...object,\n filePath: sanitizePath(object.filePath),\n })),\n };\n}\n\nfunction sanitizePath(path: string | undefined): string | undefined {\n if (!path) return path;\n if (path.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(path)) {\n return '<absolute-path>';\n }\n return path;\n}\n\nif (isEntrypoint()) {\n main().catch((error) => {\n console.error(`[${SERVER_NAME}] Fatal error:`, error);\n process.exit(1);\n });\n}\n"],"mappings":"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AAM;KACN,MAAM,CAAC,WAAW,MAAM;KACxB,SAAS;KACT,aACE;IACJ;GACF;EACF;CACF;CACA;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY,CAAC;EACf;CACF;CACA;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,MAAM;KACJ,MAAM;KACN,MAAM,CAAC,iBAAiB;KACxB,aAAa;IACf;IACA,mBAAmB;KACjB,MAAM;KACN,SAAS;KACT,aAAa;IACf;GACF;GACA,UAAU,CAAC,MAAM;EACnB;CACF;AACF;AAEA,SAAgB,eAAuB;CACrC,IAAI,OACF,QAAQ,MAAM,IAAI,YAAY,qBAAqB,gBAAgB;CAGrE,MAAM,SAAS,IAAI,OACjB;EACE,MAAM;EACN,SAAS;CACX,GACA,EACE,cAAc;EACZ,SAAS,CAAC;EACV,WAAW,CAAC;EACZ,OAAO,CAAC;CACV,EACF,CACF;CAGA,OAAO,kBAAkB,cAAc,YAAY;EACjD,IAAI,OACF,QAAQ,MAAM,IAAI,YAAY,oBAAoB;EAEpD,OAAO,EAAE,OAAO,MAAgB;CAClC,CAAC;CAED,OAAO,kBAAkB,gBAAgB,YAAY;EACnD,OAAO,EACL,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,aACE;GACJ;GACA;IACE,MAAM;IACN,OAAO;IACP,aACE;IACF,WAAW;KACT;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aACE;MACF,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;IACP,aACE;IACF,WAAW;KACT;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;M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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-dev-mcp",
3
- "version": "0.40.53",
3
+ "version": "0.40.55",
4
4
  "description": "Development MCP server for SMRT framework knowledge, review context, architecture context, and code generation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -40,12 +40,15 @@
40
40
  "homepage": "https://github.com/happyvertical/smrt/tree/main/packages/smrt-dev-mcp#readme",
41
41
  "license": "MIT",
42
42
  "dependencies": {
43
- "@modelcontextprotocol/sdk": "^1.25.2",
44
- "@happyvertical/smrt-core": "0.40.53",
45
- "@happyvertical/smrt-types": "0.40.53",
46
- "@happyvertical/smrt-scanner": "0.40.53"
43
+ "@modelcontextprotocol/server": "2.0.0",
44
+ "@happyvertical/smrt-scanner": "0.40.55",
45
+ "@happyvertical/smrt-types": "0.40.55",
46
+ "@happyvertical/smrt-core": "0.40.55"
47
47
  },
48
48
  "devDependencies": {
49
+ "@modelcontextprotocol/client": "2.0.0",
50
+ "@modelcontextprotocol/conformance": "0.2.0-alpha.10",
51
+ "@modelcontextprotocol/node": "2.0.0",
49
52
  "@types/node": "24.13.2",
50
53
  "typescript": "5.9.3",
51
54
  "vite": "8.1.4",