@happyvertical/smrt-dev-mcp 0.40.70 → 0.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-CLGmlHl6.js","names":[],"sources":["../src/tool-catalog.ts","../src/knowledge/mcp-docs.ts","../src/knowledge/index.ts"],"sourcesContent":["import type { Tool } from '@modelcontextprotocol/server';\n\nexport const REVIEW_SKILL_NAME = 'smrt-code-review';\n\nconst JSON_SCHEMA_2020_12 = 'https://json-schema.org/draft/2020-12/schema';\n\nfunction compareToolNames(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\n/**\n * Stable success/error envelope for development tools. `data` preserves each\n * tool's existing payload exactly; coverage/diagnostics are promoted only when\n * the underlying result actually reports them.\n */\nconst DEV_MCP_OUTPUT_SCHEMA: NonNullable<Tool['outputSchema']> = {\n $schema: JSON_SCHEMA_2020_12,\n type: 'object',\n additionalProperties: false,\n required: ['ok', 'coverage', 'diagnostics', 'data'],\n properties: {\n ok: { type: 'boolean' },\n coverage: { type: ['object', 'null'], additionalProperties: true },\n diagnostics: {\n type: 'array',\n items: { type: 'object', additionalProperties: true },\n },\n data: {},\n },\n};\n\nconst KNOWLEDGE_DETAIL_DESCRIPTION =\n 'summary: authored package docs are listed by path to stay inside tool-result budgets. full: embed docs and render structural object facts.';\n\n// Tool definitions\nconst TOOL_DEFINITIONS: Array<\n Pick<Tool, 'name' | 'description' | 'inputSchema'>\n> = [\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', 'installed'],\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', 'installed'],\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: KNOWLEDGE_DETAIL_DESCRIPTION,\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', 'installed'],\n default: 'project',\n },\n package: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description: KNOWLEDGE_DETAIL_DESCRIPTION,\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: KNOWLEDGE_DETAIL_DESCRIPTION,\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: KNOWLEDGE_DETAIL_DESCRIPTION,\n },\n },\n },\n },\n {\n name: 'build-package-specialist-context',\n description:\n 'Build deterministic package specialist context for the SMRT workbench',\n inputSchema: {\n type: 'object',\n properties: {\n rootDir: { type: 'string' },\n package: {\n type: 'string',\n description:\n 'Package name or short package query, e.g. @happyvertical/smrt-content or content',\n },\n focus: { type: 'string' },\n },\n required: ['package'],\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', 'installed'],\n default: 'project',\n },\n package: { type: 'string' },\n detail: {\n type: 'string',\n enum: ['summary', 'full'],\n default: 'summary',\n description: KNOWLEDGE_DETAIL_DESCRIPTION,\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: KNOWLEDGE_DETAIL_DESCRIPTION,\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 const TOOLS: Tool[] = TOOL_DEFINITIONS.map((tool) => ({\n ...tool,\n inputSchema: {\n ...tool.inputSchema,\n $schema: JSON_SCHEMA_2020_12,\n },\n outputSchema: DEV_MCP_OUTPUT_SCHEMA,\n})).sort((left, right) => compareToolNames(left.name, right.name));\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type { Tool } from '@modelcontextprotocol/server';\n\nexport interface McpDocumentationIssue {\n severity: 'error';\n code: string;\n message: string;\n file: string;\n packageName: string;\n}\n\ninterface DocumentedParameter {\n name: string;\n required: boolean;\n type: string;\n}\n\nconst PACKAGE_NAME = '@happyvertical/smrt-dev-mcp';\n\n/**\n * Compare the authored development-MCP catalog to the actual exported tools.\n * The parser intentionally checks only stable structural Markdown: tool names\n * plus top-level input-property names, types, enums, and requiredness.\n * Descriptive prose and prose-embedded defaults remain authored.\n */\nexport function checkMcpToolDocumentation(\n rootDir: string,\n packageDir: string,\n tools: readonly Tool[],\n): McpDocumentationIssue[] {\n const readmePath = join(packageDir, 'README.md');\n const agentsPath = join(packageDir, 'AGENTS.md');\n const issues: McpDocumentationIssue[] = [];\n\n if (!existsSync(readmePath)) {\n issues.push(\n issue(\n rootDir,\n readmePath,\n 'mcp-readme-missing',\n 'MCP package README.md is missing',\n ),\n );\n return issues;\n }\n\n const expectedTools = [...tools].sort((left, right) =>\n compareNames(left.name, right.name),\n );\n const readme = readFileSync(readmePath, 'utf8');\n const { sections: readmeSections, names: documentedToolNames } =\n readToolSections(readme);\n const expectedToolNames = expectedTools.map((tool) => tool.name);\n const readmeCatalogDiff = setDifference(\n expectedToolNames,\n documentedToolNames,\n );\n\n if (readmeCatalogDiff) {\n issues.push(\n issue(\n rootDir,\n readmePath,\n 'mcp-readme-tool-drift',\n `README tool catalog differs from exported TOOLS (${readmeCatalogDiff})`,\n ),\n );\n }\n\n for (const tool of expectedTools) {\n const section = readmeSections.get(tool.name);\n if (section === undefined) continue;\n\n const {\n parameters: documentedParameters,\n names: documentedParameterNames,\n } = readParameterTable(section);\n const expectedProperties = Object.keys(\n tool.inputSchema.properties ?? {},\n ).sort(compareNames);\n const propertyDiff = setDifference(\n expectedProperties,\n documentedParameterNames,\n );\n const required = new Set(tool.inputSchema.required ?? []);\n const requiredness = expectedProperties\n .filter(\n (name) =>\n documentedParameters.has(name) &&\n documentedParameters.get(name)?.required !== required.has(name),\n )\n .map(\n (name) =>\n `${name} expected ${required.has(name) ? 'Yes' : 'No'} but documented ${documentedParameters.get(name)?.required ? 'Yes' : 'No'}`,\n );\n const inputProperties = tool.inputSchema.properties ?? {};\n const types = expectedProperties\n .filter((name) => documentedParameters.has(name))\n .flatMap((name) => {\n const expected = formatSchemaType(inputProperties[name]);\n const documented = documentedParameters.get(name)?.type;\n return documented === expected\n ? []\n : [`${name} expected ${expected} but documented ${documented}`];\n });\n const details = [\n propertyDiff,\n requiredness.length > 0\n ? `requiredness: ${requiredness.join(', ')}`\n : undefined,\n types.length > 0 ? `types: ${types.join(', ')}` : undefined,\n ].filter((value): value is string => Boolean(value));\n\n if (details.length > 0) {\n issues.push(\n issue(\n rootDir,\n readmePath,\n 'mcp-readme-schema-drift',\n `README parameters for \"${tool.name}\" differ from its exported input schema (${details.join('; ')})`,\n ),\n );\n }\n }\n\n if (!existsSync(agentsPath)) return issues;\n const documentedAgentTools = readAgentToolNames(\n readFileSync(agentsPath, 'utf8'),\n ).sort(compareNames);\n const agentsCatalogDiff = setDifference(\n expectedToolNames,\n documentedAgentTools,\n );\n if (agentsCatalogDiff) {\n issues.push(\n issue(\n rootDir,\n agentsPath,\n 'mcp-agents-tool-drift',\n `AGENTS.md tool catalog differs from exported TOOLS (${agentsCatalogDiff})`,\n ),\n );\n }\n\n return issues;\n}\n\nfunction issue(\n rootDir: string,\n path: string,\n code: string,\n message: string,\n): McpDocumentationIssue {\n return {\n severity: 'error',\n code,\n message,\n file: relative(rootDir, path),\n packageName: PACKAGE_NAME,\n };\n}\n\nfunction readToolSections(markdown: string): {\n sections: Map<string, string>;\n names: string[];\n} {\n const availableTools = sectionAfterHeading(markdown, 'Available Tools');\n if (!availableTools) return { sections: new Map(), names: [] };\n\n const headings = [...availableTools.matchAll(/^### `([^`]+)`\\s*$/gm)];\n return {\n sections: new Map(\n headings.map((heading, index) => {\n const start = (heading.index ?? 0) + heading[0].length;\n const end = headings[index + 1]?.index ?? availableTools.length;\n return [heading[1], availableTools.slice(start, end)];\n }),\n ),\n names: headings.map((heading) => heading[1]),\n };\n}\n\nfunction readParameterTable(section: string): {\n parameters: Map<string, DocumentedParameter>;\n names: string[];\n} {\n const parameters = new Map<string, DocumentedParameter>();\n const names: string[] = [];\n for (const line of section.split('\\n')) {\n if (!line.trimStart().startsWith('|')) continue;\n const cells = splitMarkdownRow(line);\n const name = /^`([^`]+)`$/.exec(cells[0]?.trim() ?? '')?.[1];\n const required = cells[2]?.trim();\n if (!name || (required !== 'Yes' && required !== 'No')) continue;\n names.push(name);\n parameters.set(name, {\n name,\n required: required === 'Yes',\n type: normalizeDocumentedType(cells[1] ?? ''),\n });\n }\n return { parameters, names };\n}\n\nfunction normalizeDocumentedType(value: string): string {\n const trimmed = value.trim();\n const unquoted =\n trimmed.startsWith('`') && trimmed.endsWith('`')\n ? trimmed.slice(1, -1)\n : trimmed;\n return unquoted\n .replaceAll('\\\\|', '|')\n .replace(/\\s*\\|\\s*/g, ' | ')\n .trim();\n}\n\nfunction formatSchemaType(value: unknown): string {\n if (!isRecord(value)) return 'unknown';\n\n if (Array.isArray(value.oneOf)) {\n return unique(value.oneOf.map(formatSchemaType)).join(' | ');\n }\n\n if (Array.isArray(value.enum) && value.enum.length > 0) {\n return value.enum.map(formatEnumValue).join(' | ');\n }\n\n if (value.type === 'array') {\n const itemType = formatSchemaType(value.items);\n return itemType.includes(' | ') ? `(${itemType})[]` : `${itemType}[]`;\n }\n\n if (Array.isArray(value.type)) {\n return unique(value.type.map(String)).join(' | ');\n }\n\n return typeof value.type === 'string' ? value.type : 'unknown';\n}\n\nfunction formatEnumValue(value: unknown): string {\n if (typeof value === 'string') {\n return `'${value.replaceAll(\"'\", \"\\\\'\")}'`;\n }\n return String(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction unique(values: readonly string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction splitMarkdownRow(row: string): string[] {\n const content = row.trim().replace(/^\\|/, '').replace(/\\|$/, '');\n const cells: string[] = [];\n let cell = '';\n for (let index = 0; index < content.length; index += 1) {\n const character = content[index];\n if (character === '|' && content[index - 1] !== '\\\\') {\n cells.push(cell);\n cell = '';\n } else {\n cell += character;\n }\n }\n cells.push(cell);\n return cells;\n}\n\nfunction readAgentToolNames(markdown: string): string[] {\n const toolsSection = sectionAfterHeading(markdown, 'Tools');\n if (!toolsSection) return [];\n return [...toolsSection.matchAll(/^\\|\\s*`([^`]+)`\\s*\\|/gm)].map(\n (match) => match[1],\n );\n}\n\nfunction sectionAfterHeading(markdown: string, heading: string): string {\n const marker = new RegExp(`^## ${heading}\\\\s*$`, 'm').exec(markdown);\n if (!marker) return '';\n const start = (marker.index ?? 0) + marker[0].length;\n const remainder = markdown.slice(start);\n const nextHeading = /^##\\s+/m.exec(remainder);\n return remainder.slice(0, nextHeading?.index ?? remainder.length);\n}\n\nfunction setDifference(\n expected: readonly string[],\n actual: readonly string[],\n): string | undefined {\n const expectedSet = new Set(expected);\n const actualSet = new Set(actual);\n const missing = expected\n .filter((value) => !actualSet.has(value))\n .sort(compareNames);\n const extra = unique(actual.filter((value) => !expectedSet.has(value))).sort(\n compareNames,\n );\n const expectedDuplicates = duplicateNames(expected);\n const actualDuplicates = duplicateNames(actual);\n const parts = [\n missing.length > 0 ? `missing: ${missing.join(', ')}` : undefined,\n extra.length > 0 ? `extra: ${extra.join(', ')}` : undefined,\n expectedDuplicates.length > 0\n ? `exported duplicates: ${expectedDuplicates.join(', ')}`\n : undefined,\n actualDuplicates.length > 0\n ? `duplicates: ${actualDuplicates.join(', ')}`\n : undefined,\n ].filter((value): value is string => Boolean(value));\n return parts.length > 0 ? parts.join('; ') : undefined;\n}\n\nfunction duplicateNames(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n for (const value of values) {\n if (seen.has(value)) duplicates.add(value);\n seen.add(value);\n }\n return [...duplicates].sort(compareNames);\n}\n\nfunction compareNames(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n","import { execFileSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport type { Dirent } from 'node:fs';\nimport {\n existsSync,\n lstatSync,\n opendirSync,\n readdirSync,\n readFileSync,\n realpathSync,\n} from 'node:fs';\nimport {\n basename,\n dirname,\n isAbsolute,\n join,\n relative,\n resolve,\n sep,\n} from 'node:path';\nimport {\n MODULE_DOC_HASH_PREFIX,\n readAgentModuleDocs,\n} from '@happyvertical/smrt-core/knowledge';\nimport { toSnakeCase } from '@happyvertical/smrt-core/utils';\nimport {\n lintNumericPrecision,\n ManifestAdapter,\n OxcScanner,\n parseSource,\n sourceMayContainNumericPrecisionIssue,\n} from '@happyvertical/smrt-scanner';\nimport type {\n DomainKnowledgeField,\n DomainKnowledgeFieldConstraints,\n DomainKnowledgeManifest,\n DomainKnowledgeMethodSignature,\n DomainKnowledgeModuleDoc,\n DomainKnowledgeObject,\n DomainKnowledgeTenant,\n} from '@happyvertical/smrt-types';\nimport { TOOLS } from '../tool-catalog.js';\nimport { checkMcpToolDocumentation } from './mcp-docs.js';\n\nexport type KnowledgePackageKind = 'smrt' | 'sdk' | 'workspace';\nexport type KnowledgeIssueSeverity = 'error' | 'warning';\n/**\n * `installed` is the consumer-app scope (#2275): installed\n * `@happyvertical/smrt-*` packages and packages in the known HappyVertical SDK\n * allowlist, rather than packages the project authors. The other scopes all\n * describe the workspace's own sources.\n */\nexport type KnowledgeScope =\n | 'project'\n | 'local'\n | 'package'\n | 'sdk'\n | 'installed';\n\n/**\n * Where a package's objects actually came from (#2143). Recording provenance is\n * what makes an empty answer distinguishable from an unseen one: `none` means\n * discovery failed or the package has no SMRT model, and only the recorded\n * reason says which.\n */\nexport type KnowledgeObjectSource =\n | 'domain-artifact'\n | 'manifest'\n | 'scanner'\n | 'none';\n\n/**\n * `summary` keeps prompt bundles inside tool-result budgets by listing authored\n * docs by path instead of embedding them; `full` restores embedding (#2143).\n */\nexport type KnowledgeDetail = 'summary' | 'full';\n\n/** Where the workspace package globs were read from. */\nexport type WorkspaceGlobSource =\n | 'pnpm-workspace.yaml'\n | 'package.json#workspaces'\n | 'fallback';\n\nexport type KnowledgeField = DomainKnowledgeField;\n\nexport interface KnowledgeObject {\n className: string;\n qualifiedName?: string;\n filePath?: string;\n extends?: string;\n collection?: string;\n mcpOperations: string[];\n tableName?: string;\n idColumnType?: string;\n fields: KnowledgeField[];\n relationships: KnowledgeField[];\n methods: string[];\n methodSignatures?: DomainKnowledgeMethodSignature[];\n tenant?: DomainKnowledgeTenant;\n tableStrategy?: 'cti' | 'sti';\n conflictColumns?: string[];\n}\n\nexport interface KnowledgePrompt {\n filePath: string;\n key?: string;\n}\n\nexport interface KnowledgeMcpTool {\n name: string;\n sourceObject: string;\n operation: string;\n}\n\nexport type KnowledgeModuleDoc = DomainKnowledgeModuleDoc;\n\nexport interface KnowledgePackage {\n name: string;\n version: string;\n kind: KnowledgePackageKind;\n directory: string;\n relativeDirectory: string;\n files: string[];\n exportKeys: string[];\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n peerDependencies: Record<string, string>;\n smrtDependencies: string[];\n sdkDependencies: string[];\n hasAgentsMd: boolean;\n hasClaudeMd: boolean;\n hasClaudeShim: boolean;\n docSource: 'AGENTS.md' | 'CLAUDE.md' | null;\n agentDoc?: string;\n /**\n * SHA-256 of the shipped `AGENTS.md`, when there is one.\n *\n * A version bump is a poor drift signal because most releases do not touch a\n * package's documented surface. This hash is the stable identity a consumer\n * diffs against its own recorded baseline to answer \"which installed packages\n * changed their documented surface since I last verified my copy?\" (#2275).\n */\n agentDocSha256?: string;\n /**\n * Sibling module docs linked from the package's `AGENTS.md` (#2108). Oversized\n * package docs are split by module into `agents/<module>.md` rather than nested\n * `AGENTS.md` files (chains are additive), so this prose is only reachable\n * through the links — and it is curated, not regenerable from the manifest.\n */\n moduleDocs: KnowledgeModuleDoc[];\n hasDomainKnowledge: boolean;\n domainKnowledgePath?: string;\n domainKnowledge?: DomainKnowledgeManifest;\n manifestPath?: string;\n manifestVersion?: string;\n objects: KnowledgeObject[];\n prompts: KnowledgePrompt[];\n mcpTools: KnowledgeMcpTool[];\n relationshipFeatures: string[];\n /** True for the workspace root itself, which is not a publishable package. */\n isWorkspaceRoot: boolean;\n /** `private: true` packages publish nothing, so packaging rules do not apply. */\n isPrivate: boolean;\n /**\n * True when the package was resolved out of `node_modules` rather than\n * authored in this workspace. This repository's docs and packaging rules do\n * not apply to it — a consumer cannot add an `AGENTS.md` to a dependency —\n * so the freshness gate skips it entirely: indexed, never checked (#2275).\n */\n isInstalledDependency: boolean;\n objectSource: KnowledgeObjectSource;\n /**\n * Machine-readable reason a package produced no objects, or a note about\n * objects rejected during ownership validation.\n */\n objectSourceReason?: string;\n /** Artifact paths consulted while resolving objects, relative to the root. */\n checkedObjectPaths: string[];\n}\n\n/** A package the index looked at but got no objects from, and why (#2143). */\nexport interface KnowledgeCoverageGap {\n name: string;\n reason: string;\n checkedPaths: string[];\n remedy: string;\n}\n\n/**\n * What the index actually saw. Without this, a caller cannot tell \"this project\n * has no relationships\" from \"I could not see this project\" (#2143).\n */\nexport interface KnowledgeCoverage {\n workspaceGlobs: string[];\n workspaceGlobSource: WorkspaceGlobSource;\n packageDirs: string[];\n packagesWithObjects: string[];\n packagesWithoutObjects: KnowledgeCoverageGap[];\n}\n\n/**\n * A discovery-quality signal, kept separate from `KnowledgeIssue` so coverage\n * reporting never feeds the `dev:knowledge-check` freshness gate.\n */\nexport interface KnowledgeDiagnostic {\n severity: KnowledgeIssueSeverity;\n code: string;\n message: string;\n packageName?: string;\n checkedPaths?: string[];\n remedy?: string;\n}\n\nexport interface SmrtKnowledgeIndex {\n /**\n * 2 adds `coverage` and `diagnostics` (additive, #2143); 3 adds\n * `installedPackages` plus each package's `isInstalledDependency` and\n * `agentDocSha256` (additive, #2275).\n */\n schemaVersion: 3;\n generatedAt: string;\n rootDir: string;\n packages: KnowledgePackage[];\n smrtPackages: KnowledgePackage[];\n sdkPackages: KnowledgePackage[];\n /**\n * Installed `@happyvertical/*` dependencies, SMRT and SDK alike. In a\n * consumer app this is the whole audit surface. In this monorepo it holds the\n * registry-installed SDK packages; the `smrt-*` names resolve to workspace\n * copies, which win the name-keyed dedupe (#2275).\n */\n installedPackages: KnowledgePackage[];\n relationshipsV2: {\n foreignKeyFields: number;\n crossPackageRefFields: number;\n junctionCollections: number;\n hierarchicalObjects: number;\n polymorphicAssociations: number;\n uuidColumns: number;\n };\n coverage: KnowledgeCoverage;\n diagnostics: KnowledgeDiagnostic[];\n}\n\nexport interface KnowledgeIssue {\n severity: KnowledgeIssueSeverity;\n code: string;\n message: string;\n file?: string;\n packageName?: string;\n}\n\nexport interface KnowledgeFreshnessResult {\n ok: boolean;\n checkedAt: string;\n rootDir: string;\n issueCount: number;\n errorCount: number;\n warningCount: number;\n issues: KnowledgeIssue[];\n}\n\nexport interface KnowledgePromptBundle {\n title: string;\n instructions: string;\n contextMarkdown: string;\n selectedPackages: string[];\n selectedSdkPackages: string[];\n sourceFiles: string[];\n}\n\nexport interface ReviewContextResult {\n selectedPackages: KnowledgePackage[];\n selectedSdkPackages: KnowledgePackage[];\n deterministicFindings: KnowledgeIssue[];\n promptBundle: KnowledgePromptBundle;\n coverage: KnowledgeCoverage;\n diagnostics: KnowledgeDiagnostic[];\n}\n\nexport interface ArchitectureContextResult {\n selectedPackages: KnowledgePackage[];\n selectedSdkPackages: KnowledgePackage[];\n promptBundle: KnowledgePromptBundle;\n coverage: KnowledgeCoverage;\n diagnostics: KnowledgeDiagnostic[];\n}\n\nexport interface PackageSpecialistContextResult {\n selectedPackage: KnowledgePackage;\n selectedSdkPackages: KnowledgePackage[];\n promptBundle: KnowledgePromptBundle;\n sourceFiles: string[];\n}\n\nexport interface SmrtReviewResult {\n mode: 'findings' | 'prompt-bundle' | 'both';\n selectedPackages: KnowledgePackage[];\n selectedSdkPackages: KnowledgePackage[];\n deterministicFindings?: KnowledgeIssue[];\n promptBundle?: KnowledgePromptBundle;\n coverage: KnowledgeCoverage;\n diagnostics: KnowledgeDiagnostic[];\n}\n\nexport interface SmrtArchitectureResult extends ArchitectureContextResult {\n recommendations: {\n smrtPackages: string[];\n sdkPackages: string[];\n objectModelSketch: string[];\n risks: string[];\n questions: string[];\n notes: string[];\n };\n}\n\ninterface BuildKnowledgeIndexOptions {\n rootDir?: string;\n includeDocs?: boolean;\n scope?: KnowledgeScope;\n package?: string;\n packageName?: string;\n}\n\ninterface CheckKnowledgeFreshnessOptions extends BuildKnowledgeIndexOptions {\n changed?: boolean;\n strict?: boolean;\n}\n\n/**\n * Signals used to narrow which module docs a prompt bundle embeds (#2108).\n * Absent or non-matching hints mean \"embed everything\" — see `selectModuleDocs`.\n */\ninterface ModuleDocHints {\n changedFiles?: string[];\n text?: string;\n}\n\ninterface ContextSelectorOptions {\n rootDir?: string;\n changedFiles?: string[];\n idea?: string;\n documentation?: string;\n focus?: string;\n scope?: KnowledgeScope;\n package?: string;\n packageName?: string;\n /**\n * Defaults to `summary` so MCP callers stay inside tool-result budgets. CLI\n * consumers pass `full` to keep the #2108 module-doc embedding contract.\n */\n detail?: KnowledgeDetail;\n}\n\nconst SDK_PACKAGE_NAMES = new Set([\n '@happyvertical/ai',\n '@happyvertical/cache',\n '@happyvertical/documents',\n '@happyvertical/email',\n '@happyvertical/encryption',\n '@happyvertical/files',\n '@happyvertical/geo',\n '@happyvertical/images',\n '@happyvertical/jobs',\n '@happyvertical/json',\n '@happyvertical/logger',\n '@happyvertical/messages',\n '@happyvertical/ocr',\n '@happyvertical/pdf',\n '@happyvertical/projects',\n '@happyvertical/repos',\n '@happyvertical/secrets',\n '@happyvertical/spider',\n '@happyvertical/sql',\n '@happyvertical/utils',\n]);\n\nconst RELATIONSHIP_FIELD_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n]);\n\nconst WALK_SKIP_DIRS = new Set([\n '.git',\n '.svelte-kit',\n '.turbo',\n 'coverage',\n 'dist',\n 'node_modules',\n]);\n\n/** Used only when neither pnpm-workspace.yaml nor package.json#workspaces exists. */\nconst WORKSPACE_GLOB_FALLBACK = ['packages/*'];\n\n/**\n * Bounds total directory-entry work across every workspace glob. This is a\n * cardinality budget rather than a depth cap: valid deeply nested workspaces\n * remain discoverable, while broad or repeated globstars fail loudly before\n * they can amplify into unbounded filesystem work.\n */\nconst MAX_WORKSPACE_GLOB_TRAVERSAL_ENTRIES = 10_000;\n\n/** Prevents a broad but sub-budget glob from fanning out package reads. */\nconst MAX_DISCOVERED_WORKSPACE_PACKAGES = 512;\n\n/** Bounds simultaneous OxcScanner instances and their filesystem handles. */\nconst MAX_SCANNER_CONCURRENCY = 8;\n\n/** Caps the downstream package fallback so a large product stays in budget. */\nconst MAX_FALLBACK_PACKAGES = 8;\n\n/** Kept in sync with `tools/introspect-project.ts` so both paths see one corpus. */\nconst SCAN_INCLUDE = ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'];\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 STALE_PATTERNS: Array<{\n code: string;\n pattern: RegExp;\n message: string;\n}> = [\n {\n code: 'stale-have-namespace',\n pattern: new RegExp(`@${'have'}/`),\n message: 'Stale HappyVertical legacy namespace reference found',\n },\n {\n code: 'stale-smrt-core-namespace',\n pattern: new RegExp(`@${'smrt'}/core`),\n message: 'Stale SMRT core namespace reference found',\n },\n {\n code: 'stale-field-helper-import',\n pattern: /@happyvertical\\/smrt-core\\/fields/,\n message: 'Stale field-helper import path found',\n },\n {\n code: 'stale-docs-codex-command',\n pattern: new RegExp(\n `docs:${'codex'}|docs-${'codex'}|\\\\.${'codex'}|${'codex'}-command`,\n 'i',\n ),\n message: 'Stale Codex-specific downstream-doc reference found',\n },\n];\n\nexport async function buildKnowledgeIndex(\n options: BuildKnowledgeIndexOptions = {},\n): Promise<SmrtKnowledgeIndex> {\n const rootDir = findProjectRoot(options.rootDir ?? process.cwd());\n const includeDocs = options.includeDocs ?? true;\n const {\n globs,\n globSource,\n dirs: discoveredPackageDirs,\n diagnostics: discoveryDiagnostics,\n } = discoverProjectPackageDirs(rootDir);\n const resolvedRoot = realpathSync(rootDir);\n const packageDirs: string[] = [];\n const packages: KnowledgePackage[] = [];\n for (const dir of discoveredPackageDirs) {\n if (confinedRealPath(resolvedRoot, dir) === undefined) {\n discoveryDiagnostics.push({\n severity: 'error',\n code: 'workspace-package-root-escape',\n message:\n 'Rejected a workspace package whose real path changed or escaped the workspace root before it could be read.',\n remedy:\n 'Keep workspace package paths stable and inside the workspace root throughout knowledge discovery.',\n });\n continue;\n }\n packageDirs.push(dir);\n packages.push(readKnowledgePackage(rootDir, dir, includeDocs));\n }\n\n // A workspace root can own objects of its own, but scanning it naively would\n // also sweep every member package and claim their objects as the root's. Scan\n // it with the member directories excluded instead of skipping it (#2143).\n const memberExcludes = packageDirs\n .filter((dir) => resolve(dir) !== resolve(rootDir))\n .map((dir) => `${relative(rootDir, dir).replaceAll('\\\\', '/')}/**`);\n await applyScannerFallbacks(packages, memberExcludes);\n\n packages.push(\n ...discoverInstalledPackages(rootDir, packageDirs, includeDocs),\n );\n\n const uniquePackages = dedupePackages(packages);\n const scopedPackages = filterKnowledgePackages(uniquePackages, options);\n const smrtPackages = scopedPackages.filter((pkg) => pkg.kind === 'smrt');\n const sdkPackages = scopedPackages.filter((pkg) => pkg.kind === 'sdk');\n // Coverage and diagnostics answer \"did discovery work\", which is a property of\n // the whole workspace. Computing them from the scoped subset made\n // `scope: 'sdk'` (or a `--package` filter) report a false discovery failure on\n // a repository whose model was found perfectly well.\n const coverage = buildCoverage({\n rootDir,\n globs,\n globSource,\n packageDirs,\n packages: uniquePackages,\n });\n\n return {\n schemaVersion: 3,\n generatedAt: new Date().toISOString(),\n rootDir,\n packages: scopedPackages,\n smrtPackages,\n sdkPackages,\n installedPackages: scopedPackages.filter(\n (pkg) => pkg.isInstalledDependency,\n ),\n relationshipsV2: summarizeRelationshipsV2(scopedPackages),\n coverage,\n diagnostics: buildIndexDiagnostics(\n rootDir,\n uniquePackages,\n coverage,\n discoveryDiagnostics,\n ),\n };\n}\n\nfunction buildCoverage(options: {\n rootDir: string;\n globs: string[];\n globSource: WorkspaceGlobSource;\n packageDirs: string[];\n packages: KnowledgePackage[];\n}): KnowledgeCoverage {\n // Coverage answers \"did discovery see THIS PROJECT\", so it reports on the\n // packages the project authors. An installed dependency's objects are not\n // project coverage, and listing every dependency that ships no model as a\n // gap made the answer unreadable in a consumer app (#2275).\n const authored = options.packages.filter((pkg) => !pkg.isInstalledDependency);\n return {\n workspaceGlobs: options.globs,\n workspaceGlobSource: options.globSource,\n packageDirs: options.packageDirs.map(\n (dir) => relative(options.rootDir, dir) || '.',\n ),\n packagesWithObjects: authored\n .filter((pkg) => pkg.objects.length > 0)\n .map((pkg) => `${pkg.name} (${pkg.objects.length}, ${pkg.objectSource})`),\n packagesWithoutObjects: authored\n .filter((pkg) => pkg.objects.length === 0)\n .map((pkg) => ({\n name: pkg.name,\n reason: pkg.objectSourceReason ?? pkg.objectSource,\n checkedPaths: pkg.checkedObjectPaths,\n remedy: remedyForReason(pkg),\n })),\n };\n}\n\nfunction remedyForReason(pkg: KnowledgePackage): string {\n const reason = pkg.objectSourceReason ?? '';\n if (reason.startsWith('manifest-objects-owned-by-other-packages')) {\n return `${pkg.relativeDirectory || '.'} has an aggregate or stale manifest owned by other packages. Regenerate it (pnpm build in that package) so it declares this package's own objects.`;\n }\n if (reason.startsWith('scanner-failed')) {\n return `Source scanning failed for ${pkg.relativeDirectory || '.'}; fix the parse error or generate a manifest with pnpm build.`;\n }\n if (reason === 'no-smrt-objects-in-sources') {\n return 'No @smrt() classes were found in this package. Expected if it is a UI, contract, or tooling package.';\n }\n return `Add @smrt() classes, or run pnpm build in ${pkg.relativeDirectory || '.'} to emit .smrt/manifest.json.`;\n}\n\n/**\n * Turns a discovery failure into an explicit signal.\n *\n * A zero-object index used to be indistinguishable from a project with no\n * relationships, so callers acted on empty context as if it were an answer\n * (#2143). The zero case is therefore error-grade and names what was checked.\n */\nfunction buildIndexDiagnostics(\n rootDir: string,\n packages: KnowledgePackage[],\n coverage: KnowledgeCoverage,\n discoveryDiagnostics: KnowledgeDiagnostic[] = [],\n): KnowledgeDiagnostic[] {\n const diagnostics: KnowledgeDiagnostic[] = [...discoveryDiagnostics];\n // Counted over authored packages only. Installed `@happyvertical/smrt-*`\n // dependencies ship their own `smrt-knowledge.json`, so counting them would\n // make this guard unreachable in any project that depends on the framework —\n // exactly the projects whose own discovery is most likely to be broken\n // (#2143, #2275).\n const authoredPackages = packages.filter((pkg) => !pkg.isInstalledDependency);\n const authoredObjects = authoredPackages.reduce(\n (total, pkg) => total + pkg.objects.length,\n 0,\n );\n const installedObjects = packages.reduce(\n (total, pkg) =>\n total + (pkg.isInstalledDependency ? pkg.objects.length : 0),\n 0,\n );\n\n if (authoredObjects === 0 && installedObjects > 0) {\n diagnostics.push({\n severity: 'warning',\n code: 'no-authored-smrt-objects',\n message: [\n `No SMRT objects were discovered in the project's own packages under ${rootDir},`,\n `though ${installedObjects} were read from installed dependencies.`,\n 'Expected for an application that only consumes the framework;',\n 'a discovery failure if this workspace is supposed to declare @smrt() classes.',\n ].join(' '),\n remedy: [\n 'If this workspace authors SMRT objects, confirm rootDir is the workspace root,',\n 'confirm the workspace globs cover the directories that hold @smrt() classes,',\n 'and run `pnpm build` in the owning package to emit .smrt/manifest.json.',\n ].join(' '),\n });\n }\n\n if (authoredObjects === 0 && installedObjects === 0) {\n diagnostics.push({\n severity: 'error',\n code: 'no-smrt-objects-discovered',\n message: [\n `No SMRT objects were discovered under ${rootDir}.`,\n `Workspace globs (${coverage.workspaceGlobSource}): ${coverage.workspaceGlobs.join(', ') || '(none)'}.`,\n `Package directories checked (${coverage.packageDirs.length}): ${coverage.packageDirs.join(', ') || '(none)'}.`,\n 'Treat this as a discovery failure, not as evidence that the project has no SMRT model.',\n ].join(' '),\n checkedPaths: [\n ...new Set(authoredPackages.flatMap((pkg) => pkg.checkedObjectPaths)),\n ],\n remedy: [\n 'Confirm rootDir is the workspace root;',\n 'confirm pnpm-workspace.yaml `packages:` covers the directories that hold @smrt() classes (for example apps/*);',\n 'run `pnpm build` in the owning package to emit .smrt/manifest.json;',\n 'then re-run. Cross-check with introspect-project on the same root.',\n ].join(' '),\n });\n }\n\n for (const pkg of packages) {\n const reason = pkg.objectSourceReason ?? '';\n if (reason.startsWith('manifest-objects-owned-by-other-packages')) {\n diagnostics.push({\n severity: 'warning',\n code: 'foreign-manifest-objects',\n message: `${pkg.name}: every object in the discovered manifest is owned by another package (${reason}); it was rejected instead of being counted as this package's.`,\n packageName: pkg.name,\n checkedPaths: pkg.checkedObjectPaths,\n remedy: remedyForReason(pkg),\n });\n continue;\n }\n if (reason.startsWith('rejected ')) {\n diagnostics.push({\n severity: 'warning',\n code: 'partial-foreign-manifest-objects',\n message: `${pkg.name}: ${reason}.`,\n packageName: pkg.name,\n checkedPaths: pkg.checkedObjectPaths,\n remedy: remedyForReason(pkg),\n });\n continue;\n }\n if (reason.startsWith('scanner-failed')) {\n diagnostics.push({\n severity: 'warning',\n code: 'scanner-fallback-failed',\n message: `${pkg.name}: ${reason}`,\n packageName: pkg.name,\n checkedPaths: pkg.checkedObjectPaths,\n remedy: remedyForReason(pkg),\n });\n }\n }\n\n diagnostics.push(...buildDuplicateIdentityDiagnostics(packages));\n return diagnostics;\n}\n\n/**\n * Reports one table claimed by more than one package. Relationships-v2 already\n * counts it once, but the duplication itself usually means a stale or\n * re-qualified generated artifact, which the caller should know about (#2143).\n */\nfunction buildDuplicateIdentityDiagnostics(\n packages: KnowledgePackage[],\n): KnowledgeDiagnostic[] {\n const duplicates: Array<[string, string[]]> = [];\n for (const [identity, entries] of groupObjectsByIdentity(packages)) {\n // Report only the collisions the corpus actually collapses.\n if (collapseIdentityGroup(entries).length >= entries.length) continue;\n duplicates.push([\n identity,\n [...new Set(entries.map((entry) => entry.pkg.name))],\n ]);\n }\n if (duplicates.length === 0) return [];\n\n const sample = duplicates\n .slice(0, 5)\n .map(([identity, names]) => `${identity} (${names.join(' + ')})`)\n .join('; ');\n\n return [\n {\n severity: 'warning',\n code: 'duplicate-object-identity',\n message: `${duplicates.length} object identit${duplicates.length === 1 ? 'y is' : 'ies are'} reported by more than one package: ${sample}${duplicates.length > 5 ? '; …' : ''}. Relationships-v2 counts each once.`,\n remedy:\n \"Usually a stale or aggregate generated artifact in a consuming package that re-qualifies its dependencies' objects. Regenerate it (pnpm build) so each package reports only the objects it declares.\",\n },\n ];\n}\n\nexport async function checkKnowledgeFreshness(\n options: CheckKnowledgeFreshnessOptions = {},\n): Promise<KnowledgeFreshnessResult> {\n const index = await buildKnowledgeIndex(options);\n return checkKnowledgeFreshnessFromIndex(index, options);\n}\n\nexport async function checkKnowledgeFreshnessFromIndex(\n index: SmrtKnowledgeIndex,\n options: CheckKnowledgeFreshnessOptions = {},\n): Promise<KnowledgeFreshnessResult> {\n const issues: KnowledgeIssue[] = [];\n const changedFiles = options.changed\n ? getChangedFiles(index.rootDir)\n : undefined;\n\n // Keep these structured MCP/CLI checks in sync with\n // scripts/check-standards.mjs, which enforces the same package docs rules.\n //\n // A monorepo root is glue rather than a publishable package, so it is exempt —\n // it only became visible to this loop when discovery stopped gating root\n // inclusion (#2143). But in a single-package repository the root IS the\n // published package, so exempting every root would turn this gate into a\n // no-op for exactly the layout #2143 added support for.\n //\n // Installed dependencies are excluded throughout: a consumer app cannot add\n // an AGENTS.md to a package it merely installs, so gating on one would make\n // `dev:knowledge-check` unpassable everywhere downstream (#2275). They are\n // still indexed and reported — only the authored-source rules skip them.\n const authoredPackages = index.packages.filter(\n (item) => !item.isInstalledDependency,\n );\n const hasMemberPackages = authoredPackages.some(\n (item) => item.kind !== 'sdk' && !item.isWorkspaceRoot,\n );\n const memberDirectories = authoredPackages\n .filter(\n (item) =>\n item.kind !== 'sdk' && !item.isWorkspaceRoot && item.relativeDirectory,\n )\n .map((item) => item.relativeDirectory);\n // Instruction chains are ADDITIVE, so the kernel forbids nesting AGENTS.md:\n // an agent editing `packages/x/host/**` would load the parent's file and this\n // one. A workspace package nested inside another workspace package therefore\n // cannot own canonical docs at all — its expertise belongs in the parent's\n // linked module doc (`packages/x/agents/host.md`). Demanding an AGENTS.md\n // here would require exactly the file the kernel prohibits.\n const isNestedMember = (pkg: KnowledgePackage): boolean =>\n Boolean(pkg.relativeDirectory) &&\n memberDirectories.some(\n (directory) =>\n directory !== pkg.relativeDirectory &&\n pkg.relativeDirectory.startsWith(`${directory}/`),\n );\n for (const pkg of authoredPackages.filter(\n (item) =>\n item.kind !== 'sdk' && !(item.isWorkspaceRoot && hasMemberPackages),\n )) {\n const packageJsonPath = join(pkg.directory, 'package.json');\n const nested = isNestedMember(pkg);\n\n if (!pkg.hasAgentsMd && !nested) {\n issues.push({\n severity: 'error',\n code: 'missing-agents-md',\n message: 'Workspace package is missing canonical AGENTS.md',\n file: relative(index.rootDir, join(pkg.directory, 'AGENTS.md')),\n packageName: pkg.name,\n });\n }\n\n if (nested && pkg.hasAgentsMd) {\n issues.push({\n severity: 'error',\n code: 'nested-agents-md',\n message:\n 'Nested workspace package must not define AGENTS.md; move it to the parent package as a linked agents/<module>.md',\n file: relative(index.rootDir, join(pkg.directory, 'AGENTS.md')),\n packageName: pkg.name,\n });\n }\n\n if (!pkg.hasClaudeMd && !nested) {\n issues.push({\n severity: 'error',\n code: 'missing-claude-shim',\n message: 'Workspace package is missing CLAUDE.md compatibility shim',\n file: relative(index.rootDir, join(pkg.directory, 'CLAUDE.md')),\n packageName: pkg.name,\n });\n } else if (pkg.hasClaudeMd && !pkg.hasClaudeShim) {\n issues.push({\n severity: 'error',\n code: 'claude-not-shim',\n message: 'CLAUDE.md must contain only @AGENTS.md',\n file: relative(index.rootDir, join(pkg.directory, 'CLAUDE.md')),\n packageName: pkg.name,\n });\n }\n\n for (const entry of pkg.files) {\n if (\n entry === 'dist' ||\n entry.startsWith('dist/') ||\n entry.includes('*')\n ) {\n continue;\n }\n const entryPath = join(pkg.directory, entry);\n if (!existsSync(entryPath)) {\n issues.push({\n severity: 'error',\n code: 'package-files-entry-missing',\n message: `package.json files entry \"${entry}\" does not exist`,\n file: relative(index.rootDir, packageJsonPath),\n packageName: pkg.name,\n });\n }\n }\n\n // The `files` allowlist governs what ships to npm, so it is meaningless for\n // a `private: true` package. Authored docs are still required above —\n // agents read those regardless of publishing.\n if (pkg.isPrivate) continue;\n\n if (!pkg.files.includes('AGENTS.md')) {\n issues.push({\n severity: 'error',\n code: 'package-files-missing-agents',\n message: 'package.json files allowlist must include AGENTS.md',\n file: relative(index.rootDir, packageJsonPath),\n packageName: pkg.name,\n });\n }\n\n if (!pkg.files.includes('CLAUDE.md')) {\n issues.push({\n severity: 'error',\n code: 'package-files-missing-claude-shim',\n message: 'package.json files allowlist must include CLAUDE.md shim',\n file: relative(index.rootDir, packageJsonPath),\n packageName: pkg.name,\n });\n }\n }\n\n for (const pkg of authoredPackages) {\n issues.push(...checkDomainKnowledgeArtifact(index.rootDir, pkg));\n }\n\n const devMcpPackage = authoredPackages.find(\n (pkg) => pkg.name === '@happyvertical/smrt-dev-mcp',\n );\n if (devMcpPackage) {\n issues.push(\n ...checkMcpToolDocumentation(\n index.rootDir,\n devMcpPackage.directory,\n TOOLS,\n ),\n );\n }\n\n issues.push(...findStalePatternIssues(index.rootDir, changedFiles));\n issues.push(\n ...findNumericPrecisionIssues(index, authoredPackages, changedFiles),\n );\n\n const effectiveIssues = issues.map((issue) =>\n issue.code.startsWith('stale-')\n ? {\n ...issue,\n severity: options.strict ? ('error' as const) : ('warning' as const),\n }\n : issue,\n );\n const errorCount = effectiveIssues.filter(\n (i) => i.severity === 'error',\n ).length;\n const warningCount = effectiveIssues.filter(\n (i) => i.severity === 'warning',\n ).length;\n\n return {\n ok: errorCount === 0,\n checkedAt: new Date().toISOString(),\n rootDir: index.rootDir,\n issueCount: effectiveIssues.length,\n errorCount,\n warningCount,\n issues: effectiveIssues,\n };\n}\n\nfunction checkDomainKnowledgeArtifact(\n rootDir: string,\n pkg: KnowledgePackage,\n): KnowledgeIssue[] {\n const issues: KnowledgeIssue[] = [];\n if (\n pkg.exportKeys.includes('./smrt-knowledge.json') &&\n !pkg.hasDomainKnowledge\n ) {\n issues.push({\n severity: 'error',\n code: 'missing-domain-knowledge',\n message:\n 'package exports ./smrt-knowledge.json but no domain knowledge artifact was found',\n file: relative(rootDir, join(pkg.directory, 'package.json')),\n packageName: pkg.name,\n });\n }\n\n if (!pkg.domainKnowledge || !pkg.domainKnowledgePath) {\n return issues;\n }\n\n const hashes = pkg.domainKnowledge.sourceHashes ?? {};\n const checks: Array<{\n key: string;\n filePath: string | undefined;\n kind: 'raw' | 'json';\n label: string;\n }> = [\n {\n key: 'packageJson',\n filePath: join(pkg.directory, 'package.json'),\n kind: 'raw',\n label: 'package.json',\n },\n {\n key: 'agents',\n filePath: existsSync(join(pkg.directory, 'AGENTS.md'))\n ? join(pkg.directory, 'AGENTS.md')\n : undefined,\n kind: 'raw',\n label: 'AGENTS.md',\n },\n {\n key: 'manifest',\n filePath: domainSourceManifestPath(rootDir, pkg),\n kind: 'json',\n label: 'manifest',\n },\n // Module docs linked from AGENTS.md are authored sources too (#2108), so an\n // edit to one must mark the artifact stale exactly like an AGENTS.md edit.\n ...Object.keys(hashes)\n .filter((key) => key.startsWith(MODULE_DOC_HASH_PREFIX))\n .sort()\n .map((key) => {\n const docPath = key.slice(MODULE_DOC_HASH_PREFIX.length);\n const filePath = join(pkg.directory, docPath);\n return {\n key,\n filePath: existsSync(filePath) ? filePath : undefined,\n kind: 'raw' as const,\n label: docPath,\n };\n }),\n ];\n\n for (const check of checks) {\n const expected = hashes[check.key];\n if (!expected) continue;\n if (!check.filePath || !existsSync(check.filePath)) {\n issues.push({\n severity: 'error',\n code: 'domain-knowledge-source-missing',\n message: `${check.label} source for smrt-knowledge.json is missing`,\n file: pkg.domainKnowledgePath,\n packageName: pkg.name,\n });\n continue;\n }\n\n const actual =\n check.kind === 'json'\n ? hashJsonFile(check.filePath)\n : hashFile(check.filePath);\n if (actual !== expected) {\n issues.push({\n severity: 'error',\n code: 'stale-domain-knowledge',\n message: `${check.label} changed since smrt-knowledge.json was generated`,\n file: pkg.domainKnowledgePath,\n packageName: pkg.name,\n });\n }\n }\n\n return issues;\n}\n\nfunction domainSourceManifestPath(\n rootDir: string,\n pkg: KnowledgePackage,\n): string | undefined {\n if (pkg.domainKnowledge?.sourceManifestPath) {\n return join(pkg.directory, pkg.domainKnowledge.sourceManifestPath);\n }\n if (pkg.manifestPath) {\n return join(rootDir, pkg.manifestPath);\n }\n return undefined;\n}\n\nexport async function diffKnowledgeIndex(\n options: {\n rootDir?: string;\n base?: string;\n scope?: KnowledgeScope;\n package?: string;\n packageName?: string;\n } = {},\n): Promise<{\n base: string;\n changedFiles: string[];\n changedPackages: string[];\n index: SmrtKnowledgeIndex;\n}> {\n const index = await buildKnowledgeIndex({ rootDir: options.rootDir });\n const base = options.base ?? 'HEAD';\n const changedFiles = getChangedFiles(index.rootDir, base);\n const packageQuery = options.packageName ?? options.package;\n const selected = selectPackagesForFiles(index, changedFiles)\n .filter((pkg) => scopeAllowsPackage(pkg, options.scope))\n .filter((pkg) =>\n packageQuery ? packageMatches(pkg, packageQuery.toLowerCase()) : true,\n );\n const changedPackages = selected.map((pkg) => pkg.name);\n return { base, changedFiles, changedPackages, index };\n}\n\nexport async function buildReviewContext(\n options: ContextSelectorOptions = {},\n): Promise<ReviewContextResult> {\n const index = await buildKnowledgeIndex({ rootDir: options.rootDir });\n const changedFiles = options.changedFiles ?? getChangedFiles(index.rootDir);\n const selectedPackages = selectPackages(index, {\n changedFiles,\n text: [options.focus, options.documentation].filter(Boolean).join('\\n'),\n scope: options.scope,\n packageName: options.packageName ?? options.package,\n });\n const selectedSdkPackages = selectSdkPackages(\n index,\n selectedPackages,\n [\n options.focus,\n options.documentation,\n options.packageName ?? options.package,\n ],\n {\n scope: options.scope,\n packageName: options.packageName ?? options.package,\n },\n );\n const deterministicFindings = findStalePatternIssues(\n index.rootDir,\n changedFiles.length > 0 ? changedFiles : undefined,\n ).concat(buildReviewFindings(index, changedFiles, selectedPackages));\n\n return {\n selectedPackages,\n selectedSdkPackages,\n deterministicFindings,\n promptBundle: buildPromptBundle({\n title: 'SMRT code review',\n task: 'Review the changed SMRT code. Prioritize correctness, relationships-v2 invariants, tenancy, SDK usage, prompt/data safety, and stale documentation.',\n index,\n packages: selectedPackages,\n sdkPackages: selectedSdkPackages,\n sourceFiles: changedFiles,\n extraContext: options.focus,\n detail: options.detail,\n moduleDocHints: {\n changedFiles,\n text: [options.focus, options.documentation].filter(Boolean).join('\\n'),\n },\n }),\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n };\n}\n\nexport async function smrtReview(\n options: ContextSelectorOptions & {\n mode?: 'findings' | 'prompt-bundle' | 'both';\n } = {},\n): Promise<SmrtReviewResult> {\n const context = await buildReviewContext(options);\n const mode = options.mode ?? 'both';\n return {\n mode,\n selectedPackages: context.selectedPackages,\n selectedSdkPackages: context.selectedSdkPackages,\n ...(mode !== 'prompt-bundle'\n ? { deterministicFindings: context.deterministicFindings }\n : {}),\n ...(mode !== 'findings' ? { promptBundle: context.promptBundle } : {}),\n coverage: context.coverage,\n diagnostics: context.diagnostics,\n };\n}\n\nexport async function buildArchitectureContext(\n options: ContextSelectorOptions = {},\n): Promise<ArchitectureContextResult> {\n const index = await buildKnowledgeIndex({ rootDir: options.rootDir });\n const text = [options.idea, options.documentation, options.focus]\n .filter(Boolean)\n .join('\\n');\n const selectedPackages = selectPackages(index, {\n text,\n scope: options.scope,\n packageName: options.packageName ?? options.package,\n });\n const selectedSdkPackages = selectSdkPackages(\n index,\n selectedPackages,\n [text, options.packageName ?? options.package],\n {\n scope: options.scope,\n packageName: options.packageName ?? options.package,\n },\n );\n\n return {\n selectedPackages,\n selectedSdkPackages,\n promptBundle: buildPromptBundle({\n title: 'SMRT architecture planning',\n task: 'Suggest the SMRT packages, HappyVertical SDK packages, object model, integration points, risks, and implementation slices for this project idea.',\n index,\n packages: selectedPackages,\n sdkPackages: selectedSdkPackages,\n sourceFiles: [],\n extraContext: text,\n detail: options.detail,\n // `--package @happyvertical/smrt-sales` alone must NOT narrow: the package\n // selector is not a module selector, so a bare package request still gets\n // every module doc. Only idea/focus text narrows.\n moduleDocHints: { text },\n }),\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n };\n}\n\nexport async function buildPackageSpecialistContext(\n options: ContextSelectorOptions = {},\n): Promise<PackageSpecialistContextResult> {\n const packageQuery = options.packageName ?? options.package;\n if (!packageQuery) {\n throw new Error('Package specialist context requires a package name');\n }\n\n const index = await buildKnowledgeIndex({\n rootDir: options.rootDir,\n includeDocs: true,\n });\n const selectedPackage = index.packages.find(\n (pkg) =>\n pkg.kind !== 'sdk' && packageMatches(pkg, packageQuery.toLowerCase()),\n );\n\n if (!selectedPackage) {\n throw new Error(`Unknown SMRT package: ${packageQuery}`);\n }\n\n const selectedSdkPackages = selectSdkPackages(\n index,\n [selectedPackage],\n [selectedPackage.name, ...selectedPackage.sdkDependencies],\n {\n scope: 'project',\n packageName: selectedPackage.name,\n },\n );\n const sourceFiles = packageSpecialistSourceFiles(\n index.rootDir,\n selectedPackage,\n );\n\n return {\n selectedPackage,\n selectedSdkPackages,\n sourceFiles,\n promptBundle: buildPromptBundle({\n title: `SMRT package specialist: ${selectedPackage.name}`,\n task: 'Act as a deterministic specialist for this package. Use only the supplied package docs, manifest/knowledge artifacts, routes, tests, prompts, and dependency context. Explain package concepts, integration surfaces, validation commands, and likely implementation risks with source references. Do not assume provider-backed chat or external model access.',\n index,\n packages: [selectedPackage],\n sdkPackages: selectedSdkPackages,\n sourceFiles,\n extraContext: options.focus,\n }),\n };\n}\n\nexport async function smrtArchitecture(\n options: ContextSelectorOptions = {},\n): Promise<SmrtArchitectureResult> {\n const context = await buildArchitectureContext(options);\n const ideaText = [options.idea, options.documentation, options.focus]\n .filter(Boolean)\n .join('\\n');\n return {\n ...context,\n recommendations: buildArchitectureRecommendations(context, ideaText),\n };\n}\n\nexport function renderKnowledgeIndexMarkdown(\n index: SmrtKnowledgeIndex,\n): string {\n const lines: string[] = [\n '# SMRT Knowledge Index',\n '',\n `Generated: ${index.generatedAt}`,\n `Root: ${index.rootDir}`,\n '',\n '## Summary',\n '',\n `- SMRT packages: ${index.smrtPackages.length}`,\n `- SDK packages: ${index.sdkPackages.length}`,\n `- Installed dependencies: ${index.installedPackages.length}`,\n `- foreignKey fields: ${index.relationshipsV2.foreignKeyFields}`,\n `- crossPackageRef fields: ${index.relationshipsV2.crossPackageRefFields}`,\n `- junction collections: ${index.relationshipsV2.junctionCollections}`,\n `- hierarchical objects: ${index.relationshipsV2.hierarchicalObjects}`,\n `- polymorphic associations: ${index.relationshipsV2.polymorphicAssociations}`,\n `- UUID columns: ${index.relationshipsV2.uuidColumns}`,\n '',\n // Only rendered when something is actually wrong, so healthy output is\n // byte-for-byte unchanged for existing CLI consumers.\n ...renderDiagnosticsSection(index.diagnostics),\n '## Packages',\n '',\n ];\n\n for (const pkg of index.packages) {\n lines.push(`### ${pkg.name}`);\n lines.push('');\n lines.push(`- kind: ${pkg.kind}`);\n lines.push(`- version: ${pkg.version}`);\n lines.push(`- objects: ${pkg.objects.length}`);\n lines.push(`- SMRT deps: ${pkg.smrtDependencies.join(', ') || '(none)'}`);\n lines.push(`- SDK deps: ${pkg.sdkDependencies.join(', ') || '(none)'}`);\n lines.push(`- exports: ${pkg.exportKeys.join(', ') || '(none)'}`);\n lines.push(`- MCP tools: ${pkg.mcpTools.length}`);\n lines.push(\n `- domain knowledge: ${pkg.domainKnowledgePath ?? '(manifest fallback)'}`,\n );\n lines.push(\n `- docs: ${pkg.docSource ?? '(none)'}${pkg.hasClaudeShim ? ' + CLAUDE.md shim' : ''}`,\n );\n if (pkg.isInstalledDependency) {\n lines.push('- source: installed dependency');\n lines.push(`- AGENTS.md sha256: ${pkg.agentDocSha256 ?? '(none)'}`);\n }\n if (pkg.moduleDocs.length > 0) {\n lines.push(\n `- module docs: ${pkg.moduleDocs.map((doc) => doc.path).join(', ')}`,\n );\n }\n if (pkg.relationshipFeatures.length > 0) {\n lines.push(`- relationships-v2: ${pkg.relationshipFeatures.join(', ')}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nexport function renderFreshnessResult(\n result: KnowledgeFreshnessResult,\n): string {\n const lines = [\n result.ok ? '✓ SMRT knowledge is fresh' : '✗ SMRT knowledge has issues',\n '',\n `Root: ${result.rootDir}`,\n `Errors: ${result.errorCount}`,\n `Warnings: ${result.warningCount}`,\n '',\n ];\n\n for (const issue of result.issues) {\n const location = issue.file ? ` (${issue.file})` : '';\n lines.push(\n `- [${issue.severity.toUpperCase()}] ${issue.code}: ${issue.message}${location}`,\n );\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Nearest ancestor that declares a workspace (#2143).\n *\n * The old rule also required a literal `packages/` directory, which silently\n * mis-rooted every `apps/*`-shaped product. A workspace declaration is the\n * actual signal; `startDir` is the fallback so single-package repos still work.\n */\nfunction findProjectRoot(startDir: string): string {\n let current = resolve(startDir);\n for (;;) {\n if (existsSync(join(current, 'pnpm-workspace.yaml'))) return current;\n if (readPackageJsonWorkspaceGlobs(current).length > 0) return current;\n const parent = dirname(current);\n if (parent === current) return resolve(startDir);\n current = parent;\n }\n}\n\nfunction readPackageJsonWorkspaceGlobs(dir: string): string[] {\n const packageJson = objectRecord(readJson(join(dir, 'package.json')));\n const workspaces = packageJson.workspaces;\n return Array.isArray(workspaces)\n ? stringArray(workspaces)\n : stringArray(objectRecord(workspaces).packages);\n}\n\nfunction readWorkspaceGlobs(rootDir: string): {\n globs: string[];\n source: WorkspaceGlobSource;\n} {\n const pnpmWorkspacePath = join(rootDir, 'pnpm-workspace.yaml');\n if (existsSync(pnpmWorkspacePath)) {\n const globs = parseYamlStringList(\n readFileSync(pnpmWorkspacePath, 'utf8'),\n 'packages',\n );\n if (globs.length > 0) return { globs, source: 'pnpm-workspace.yaml' };\n }\n\n const packageJsonGlobs = readPackageJsonWorkspaceGlobs(rootDir);\n if (packageJsonGlobs.length > 0) {\n return { globs: packageJsonGlobs, source: 'package.json#workspaces' };\n }\n\n return { globs: [...WORKSPACE_GLOB_FALLBACK], source: 'fallback' };\n}\n\n/**\n * Reads a top-level `key:` string list out of `pnpm-workspace.yaml`.\n *\n * Deliberately dependency-free: the shape consumed here is a fixed, tiny list\n * of globs, and a read-only dev server should not pull in a YAML parser for it.\n * Handles both block sequences and a single-line flow sequence.\n */\nfunction parseYamlStringList(content: string, key: string): string[] {\n const keyPattern = new RegExp(`^${escapeRegExp(key)}\\\\s*:\\\\s*(.*)$`);\n const values: string[] = [];\n let inBlock = false;\n\n for (const line of content.split(/\\r?\\n/)) {\n if (!inBlock) {\n const match = line.match(keyPattern);\n if (!match) continue;\n const rest = (match[1] ?? '').trim();\n if (rest.startsWith('[')) {\n return rest\n .replace(/^\\[/, '')\n .replace(/\\]\\s*$/, '')\n .split(',')\n .map((entry) => unquoteYamlScalar(entry))\n .filter(Boolean);\n }\n // A scalar value on the key line is not a list; only an empty remainder\n // (or a trailing comment) opens a block sequence.\n if (rest !== '' && !rest.startsWith('#')) continue;\n inBlock = true;\n continue;\n }\n\n if (line.trim() === '' || line.trimStart().startsWith('#')) continue;\n const item = line.match(/^\\s+-\\s*(.+?)\\s*$/);\n if (!item) break; // dedented back to the next top-level key\n const value = unquoteYamlScalar(item[1] ?? '');\n if (value) values.push(value);\n }\n\n return values;\n}\n\nfunction unquoteYamlScalar(value: string): string {\n const trimmed = value.trim();\n const quoted = trimmed.match(/^(['\"])([\\s\\S]*?)\\1/);\n if (quoted) return (quoted[2] ?? '').trim();\n return trimmed.replace(/\\s+#.*$/, '').trim();\n}\n\n/**\n * Expands workspace globs to package directories.\n *\n * Supports the shapes pnpm workspaces actually use in these repos: literals,\n * single-star directory globs (`packages/*`, `apps/*`), recursive `**`, and `!`\n * negations. Expansion walks the tree with `readdir` rather than adding a glob\n * dependency.\n */\ninterface WorkspaceGlobExpansion {\n dirs: string[];\n diagnostics: KnowledgeDiagnostic[];\n fatal: boolean;\n}\n\ninterface WorkspaceGlobTraversalBudget {\n entries: number;\n}\n\nclass WorkspaceGlobTraversalLimitError extends Error {\n constructor(readonly glob: string) {\n super(\n `Workspace glob traversal exceeded ${MAX_WORKSPACE_GLOB_TRAVERSAL_ENTRIES} directory entries while expanding ${glob}`,\n );\n this.name = 'WorkspaceGlobTraversalLimitError';\n }\n}\n\nfunction expandWorkspaceGlobs(\n rootDir: string,\n globs: string[],\n): WorkspaceGlobExpansion {\n const diagnostics: KnowledgeDiagnostic[] = [];\n const positiveGlobs: string[] = [];\n const negations: RegExp[] = [];\n\n for (const rawGlob of globs) {\n const negated = rawGlob.trim().startsWith('!');\n const glob = normalizeGlob(\n negated ? rawGlob.trim().slice(1) : rawGlob.trim(),\n );\n const unsafeReason = unsafeWorkspaceGlobReason(glob);\n if (unsafeReason) {\n diagnostics.push({\n severity: 'error',\n code: 'unsafe-workspace-glob',\n message: `Rejected workspace glob ${JSON.stringify(rawGlob)}: ${unsafeReason}.`,\n remedy:\n 'Keep every workspace glob relative to the declared workspace root; absolute paths and parent-directory (`..`) segments are not supported.',\n });\n continue;\n }\n if (!glob) continue;\n if (negated) {\n negations.push(globToRegExp(glob));\n } else {\n positiveGlobs.push(glob);\n }\n }\n\n const matched = new Set<string>();\n const budget: WorkspaceGlobTraversalBudget = { entries: 0 };\n\n try {\n for (const glob of positiveGlobs) {\n for (const dir of expandGlob(rootDir, glob, budget)) {\n matched.add(dir);\n }\n }\n } catch (error) {\n if (!(error instanceof WorkspaceGlobTraversalLimitError)) throw error;\n diagnostics.push({\n severity: 'error',\n code: 'workspace-glob-expansion-limit',\n message: error.message,\n remedy:\n 'Narrow the workspace package globs or remove repeated broad globstars. Discovery stopped without reading any partially matched package set.',\n });\n return { dirs: [], diagnostics, fatal: true };\n }\n\n const resolvedRoot = realpathSync(rootDir);\n const confined = [...matched]\n .map((dir) => confinedRealPath(resolvedRoot, dir))\n .filter((dir): dir is string => dir !== undefined);\n if (confined.length !== matched.size) {\n diagnostics.push({\n severity: 'error',\n code: 'workspace-glob-root-escape',\n message:\n 'Rejected a workspace package directory whose real path resolves outside the workspace root.',\n remedy:\n 'Keep workspace packages inside the workspace root and do not route workspace globs through symlinks to sibling directories.',\n });\n }\n\n const dirs = [...new Set(confined)]\n .filter((dir) => existsSync(join(dir, 'package.json')))\n .filter((dir) => {\n const rel = relative(rootDir, dir).replaceAll('\\\\', '/');\n return rel !== '' && !negations.some((pattern) => pattern.test(rel));\n })\n .sort();\n\n return { dirs, diagnostics, fatal: false };\n}\n\nfunction normalizeGlob(glob: string): string {\n return glob\n .trim()\n .replaceAll('\\\\', '/')\n .replace(/^\\.\\//, '')\n .replace(/\\/+$/, '');\n}\n\nfunction unsafeWorkspaceGlobReason(glob: string): string | undefined {\n if (glob.includes('\\0')) return 'NUL bytes are not valid path content';\n if (isAbsolute(glob) || /^[A-Za-z]:\\//.test(glob)) {\n return 'absolute paths are outside the workspace trust boundary';\n }\n if (glob.split('/').includes('..')) {\n return 'parent-directory segments can escape the workspace root';\n }\n return undefined;\n}\n\nfunction confinedRealPath(\n resolvedRoot: string,\n candidate: string,\n): string | undefined {\n try {\n const resolvedCandidate = realpathSync(candidate);\n const rel = relative(resolvedRoot, resolvedCandidate);\n if (\n rel === '' ||\n (!isAbsolute(rel) && rel !== '..' && !rel.startsWith(`..${sep}`))\n ) {\n // Preserve the caller's lexical root for stable relative paths after\n // validating the candidate's canonical target.\n return candidate;\n }\n } catch {\n // A disappeared or unreadable candidate is not a package directory.\n }\n return undefined;\n}\n\nfunction expandGlob(\n rootDir: string,\n glob: string,\n budget: WorkspaceGlobTraversalBudget,\n): string[] {\n const segments = glob.split('/').filter((segment) => segment !== '');\n if (segments.length === 0) return [];\n\n let current = [rootDir];\n for (const [segmentIndex, segment] of segments.entries()) {\n const next: string[] = [];\n for (const dir of current) {\n if (segment === '**') {\n // A globstar may consume zero segments, so `apps/**/host` must also\n // match `apps/host`.\n next.push(dir, ...descendantDirs(dir, budget, glob));\n continue;\n }\n if (segment.includes('*')) {\n const pattern = globToRegExp(segment);\n next.push(\n ...childDirs(dir, budget, glob).filter((child) =>\n pattern.test(basename(child)),\n ),\n );\n continue;\n }\n const literal = join(dir, segment);\n const isFinalSegment = segmentIndex === segments.length - 1;\n if (isDirectory(literal) || (isFinalSegment && isSymbolicLink(literal))) {\n next.push(literal);\n }\n }\n current = [...new Set(next)];\n if (current.length === 0) break;\n }\n\n return current;\n}\n\nfunction childDirs(\n dir: string,\n budget: WorkspaceGlobTraversalBudget,\n glob: string,\n): string[] {\n const children: string[] = [];\n try {\n const directory = opendirSync(dir);\n try {\n let entry: Dirent | null = directory.readSync();\n while (entry !== null) {\n budget.entries += 1;\n if (budget.entries > MAX_WORKSPACE_GLOB_TRAVERSAL_ENTRIES) {\n throw new WorkspaceGlobTraversalLimitError(glob);\n }\n if (entry.isDirectory() && !WALK_SKIP_DIRS.has(entry.name)) {\n children.push(join(dir, entry.name));\n }\n entry = directory.readSync();\n }\n } finally {\n directory.closeSync();\n }\n return children;\n } catch (error) {\n if (error instanceof WorkspaceGlobTraversalLimitError) throw error;\n return children;\n }\n}\n\nfunction descendantDirs(\n dir: string,\n budget: WorkspaceGlobTraversalBudget,\n glob: string,\n): string[] {\n const descendants: string[] = [];\n const pending = [dir];\n for (let index = 0; index < pending.length; index += 1) {\n const children = childDirs(pending[index] as string, budget, glob);\n descendants.push(...children);\n pending.push(...children);\n }\n return descendants;\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return lstatSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isSymbolicLink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\n/**\n * Translates a workspace glob into an anchored regular expression. `*` stays\n * within one path segment; `**` spans any depth (and collapses so `a/**` also\n * matches `a`).\n */\nfunction globToRegExp(glob: string): RegExp {\n // Tokenize before escaping so the escape pass cannot damage the placeholders.\n const ANY_DEPTH = '\\u0000';\n const ANY_SEGMENT = '\\u0001';\n const tokenized = glob\n .replace(/\\*\\*/g, ANY_DEPTH)\n .replace(/\\*/g, ANY_SEGMENT);\n const escaped = tokenized.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const source = escaped\n .replaceAll(`/${ANY_DEPTH}`, '(?:/.*)?')\n .replaceAll(`${ANY_DEPTH}/`, '(?:.*/)?')\n .replaceAll(ANY_DEPTH, '.*')\n .replaceAll(ANY_SEGMENT, '[^/]*');\n return new RegExp(`^${source}$`);\n}\n\nfunction discoverProjectPackageDirs(rootDir: string): {\n globs: string[];\n globSource: WorkspaceGlobSource;\n dirs: string[];\n diagnostics: KnowledgeDiagnostic[];\n} {\n const { globs, source } = readWorkspaceGlobs(rootDir);\n const expansion = expandWorkspaceGlobs(rootDir, globs);\n // A single-package repo is its own package, and a workspace root can also own\n // objects. Coverage reporting makes an empty root visible instead of hiding\n // it behind the old \"only if it already has an artifact\" gate (#2143).\n const dirs = expansion.fatal\n ? []\n : existsSync(join(rootDir, 'package.json'))\n ? [\n rootDir,\n ...expansion.dirs.filter((dir) => resolve(dir) !== resolve(rootDir)),\n ]\n : expansion.dirs;\n if (dirs.length > MAX_DISCOVERED_WORKSPACE_PACKAGES) {\n return {\n globs,\n globSource: source,\n dirs: [],\n diagnostics: [\n ...expansion.diagnostics,\n {\n severity: 'error',\n code: 'workspace-package-limit',\n message: `Workspace discovery found ${dirs.length} packages, exceeding the ${MAX_DISCOVERED_WORKSPACE_PACKAGES}-package limit.`,\n remedy:\n 'Narrow the workspace package globs. Discovery stopped without reading any partially matched package set.',\n },\n ],\n };\n }\n return {\n globs,\n globSource: source,\n dirs,\n diagnostics: expansion.diagnostics,\n };\n}\n\n/**\n * Installed `@happyvertical/*` packages, resolved once each (#2275).\n *\n * Reads the `@happyvertical` scope directory of the project and of every\n * workspace package — one `readdir` per scope directory, resolving each entry's\n * real path — instead of descending through `node_modules`. Under pnpm those\n * entries are symlinks into a store whose entries link back out to each other,\n * so a descent revisits the same package once per path that reaches it. The\n * realpath is the dedupe key only: the same store entry reached from three\n * scope directories is read once, but it is read through its `node_modules`\n * path, because a realpath is the wrong thing to report. On a host where any\n * ancestor of the root is a symlink (`/var` on macOS, a symlinked worktree),\n * `relative(rootDir, realpath)` escapes the root entirely.\n *\n * Workspace packages linked into a sibling's `node_modules` are skipped here.\n * They are authored source that happens to be reachable through a link, and\n * calling them installed would exempt them from the freshness gate.\n *\n * Both SMRT and SDK packages are returned. A consumer app authors neither, and\n * its `@happyvertical/smrt-*` dependencies are exactly the surface it needs to\n * audit; excluding them is why the index could see nothing in a consumer app.\n */\nfunction discoverInstalledPackages(\n rootDir: string,\n packageDirs: string[],\n includeDocs: boolean,\n): KnowledgePackage[] {\n const scopeDirs = [\n join(rootDir, 'node_modules', '@happyvertical'),\n ...packageDirs.map((dir) => join(dir, 'node_modules', '@happyvertical')),\n ];\n const workspaceRealPaths = new Set(\n [rootDir, ...packageDirs].flatMap((dir) => {\n try {\n return [realpathSync(dir)];\n } catch {\n return [];\n }\n }),\n );\n\n const byRealPath = new Map<string, string>();\n for (const scopeDir of new Set(scopeDirs)) {\n if (!existsSync(scopeDir)) continue;\n let entries: Dirent[];\n try {\n entries = readdirSync(scopeDir, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const entryPath = join(scopeDir, entry.name);\n let resolved: string;\n try {\n resolved = realpathSync(entryPath);\n } catch {\n // A dangling link is not an installed package.\n continue;\n }\n if (workspaceRealPaths.has(resolved)) continue;\n if (byRealPath.has(resolved)) continue;\n byRealPath.set(resolved, entryPath);\n }\n }\n\n const packages: KnowledgePackage[] = [];\n for (const directory of byRealPath.values()) {\n const packageJson = objectRecord(readJson(join(directory, 'package.json')));\n const name = packageJson.name;\n if (typeof name !== 'string') continue;\n if (\n !SDK_PACKAGE_NAMES.has(name) &&\n !name.startsWith('@happyvertical/smrt-')\n )\n continue;\n packages.push(\n readKnowledgePackage(rootDir, directory, includeDocs, {\n installed: true,\n }),\n );\n }\n return packages.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction filterKnowledgePackages(\n packages: KnowledgePackage[],\n options: BuildKnowledgeIndexOptions,\n): KnowledgePackage[] {\n const packageQuery = options.packageName ?? options.package;\n return packages.filter((pkg) => {\n if (packageQuery && !packageMatches(pkg, packageQuery.toLowerCase())) {\n return false;\n }\n\n switch (options.scope) {\n case 'local':\n return (\n pkg.kind !== 'sdk' &&\n !pkg.isInstalledDependency &&\n !pkg.relativeDirectory.includes('node_modules')\n );\n case 'package':\n return pkg.kind !== 'sdk' && !pkg.isInstalledDependency;\n case 'sdk':\n return pkg.kind === 'sdk';\n case 'installed':\n return pkg.isInstalledDependency;\n case 'project':\n case undefined:\n return true;\n default:\n return true;\n }\n });\n}\n\nfunction readKnowledgePackage(\n rootDir: string,\n directory: string,\n includeDocs: boolean,\n options: { installed?: boolean } = {},\n): KnowledgePackage {\n const packageJson = objectRecord(readJson(join(directory, 'package.json')));\n const dependencies = stringRecord(packageJson.dependencies);\n const devDependencies = stringRecord(packageJson.devDependencies);\n const peerDependencies = stringRecord(packageJson.peerDependencies);\n const allDeps = { ...dependencies, ...devDependencies, ...peerDependencies };\n const name = String(packageJson.name ?? directory);\n const agentsPath = join(directory, 'AGENTS.md');\n const claudePath = join(directory, 'CLAUDE.md');\n const hasAgentsMd = existsSync(agentsPath);\n const hasClaudeMd = existsSync(claudePath);\n const claudeContent = hasClaudeMd ? readFileSync(claudePath, 'utf8') : '';\n const agentsContent = hasAgentsMd ? readFileSync(agentsPath, 'utf8') : '';\n const fallbackClaudeDoc =\n hasClaudeMd && claudeContent.trim() !== '@AGENTS.md' ? claudeContent : '';\n const manifest = readManifest(directory);\n const discoveredDomainKnowledge = readDomainKnowledge(directory);\n const domainKnowledge = discoveredDomainKnowledge\n ? {\n ...discoveredDomainKnowledge,\n content: sanitizeDomainKnowledgeManifest(\n discoveredDomainKnowledge.content,\n manifest?.content,\n name,\n ),\n }\n : null;\n const docSource = hasAgentsMd\n ? 'AGENTS.md'\n : fallbackClaudeDoc\n ? 'CLAUDE.md'\n : null;\n const resolvedObjects = resolvePackageObjects({\n packageName: name,\n directory,\n rootDir,\n domainKnowledge,\n manifest,\n });\n const objects = resolvedObjects.objects;\n const prompts = domainKnowledge\n ? readDomainKnowledgePrompts(domainKnowledge.content, directory, rootDir)\n : readPrompts(directory, rootDir);\n const smrtDependencies = Object.keys(allDeps)\n .filter((dep) => dep.startsWith('@happyvertical/smrt-'))\n .sort();\n const sdkDependencies = Object.keys(allDeps)\n .filter((dep) => SDK_PACKAGE_NAMES.has(dep))\n .sort();\n\n return {\n name,\n version: String(packageJson.version ?? '0.0.0'),\n kind: packageKind(name),\n directory,\n relativeDirectory: relative(rootDir, directory),\n files: stringArray(packageJson.files),\n exportKeys: exportKeys(packageJson.exports),\n dependencies,\n devDependencies,\n peerDependencies,\n smrtDependencies,\n sdkDependencies,\n hasAgentsMd,\n hasClaudeMd,\n hasClaudeShim: claudeContent.trim() === '@AGENTS.md',\n docSource,\n agentDoc: includeDocs\n ? domainKnowledge?.content.agentDoc ||\n (hasAgentsMd ? agentsContent : fallbackClaudeDoc || undefined)\n : undefined,\n // Always hashed, even when doc bodies are excluded: the hash is the drift\n // signal, and dropping it with the body would make `includeDocs: false`\n // useless for a consumer audit (#2275).\n agentDocSha256: hasAgentsMd\n ? createHash('sha256').update(agentsContent).digest('hex')\n : undefined,\n // Prefer the built artifact, but fall back to resolving the links straight\n // from AGENTS.md so a package without a generated smrt-knowledge.json still\n // surfaces its module docs.\n moduleDocs: includeDocs\n ? (domainKnowledge?.content.moduleDocs ??\n readAgentModuleDocs(directory, agentsContent || undefined))\n : [],\n hasDomainKnowledge: Boolean(domainKnowledge),\n domainKnowledgePath: domainKnowledge?.path\n ? relative(rootDir, domainKnowledge.path)\n : undefined,\n domainKnowledge: domainKnowledge?.content,\n manifestPath: manifest?.path ? relative(rootDir, manifest.path) : undefined,\n manifestVersion:\n typeof manifest?.content.version === 'string'\n ? manifest.content.version\n : undefined,\n objects,\n prompts,\n mcpTools: domainKnowledge\n ? domainMcpTools(domainKnowledge.content)\n : mcpTools(objects),\n relationshipFeatures: relationshipFeatures(objects),\n isWorkspaceRoot: resolve(directory) === resolve(rootDir),\n isPrivate: packageJson.private === true,\n isInstalledDependency: options.installed === true,\n objectSource: resolvedObjects.source,\n objectSourceReason: resolvedObjects.reason,\n checkedObjectPaths: resolvedObjects.checkedPaths,\n };\n}\n\n/** Artifact paths consulted for a package's objects, in precedence order. */\nfunction objectArtifactCandidates(directory: string): string[] {\n return [\n join(directory, '.smrt', 'smrt-knowledge.json'),\n join(directory, 'dist', 'smrt-knowledge.json'),\n join(directory, 'src', 'manifest', 'smrt-knowledge.json'),\n join(directory, 'src', 'manifest', 'manifest.json'),\n join(directory, '.smrt', 'manifest.json'),\n join(directory, 'dist', 'manifest.json'),\n ];\n}\n\nfunction resolvePackageObjects(options: {\n packageName: string;\n directory: string;\n rootDir: string;\n domainKnowledge: { path: string; content: DomainKnowledgeManifest } | null;\n manifest: { path: string; content: Record<string, unknown> } | null;\n}): {\n objects: KnowledgeObject[];\n source: KnowledgeObjectSource;\n reason?: string;\n checkedPaths: string[];\n} {\n const checkedPaths = objectArtifactCandidates(options.directory).map((path) =>\n relativeOrAbsolute(options.rootDir, path),\n );\n\n if (options.domainKnowledge) {\n return {\n objects: readDomainKnowledgeObjects(options.domainKnowledge.content),\n source: 'domain-artifact',\n checkedPaths,\n };\n }\n\n if (!options.manifest) {\n return { objects: [], source: 'none', reason: 'no-artifact', checkedPaths };\n }\n\n const { owned, foreignCount } = partitionOwnedObjects(\n options.manifest.content,\n options.packageName,\n );\n const objects = readManifestObjects({ objects: owned });\n\n if (objects.length === 0) {\n return {\n objects: [],\n source: 'none',\n reason:\n foreignCount > 0\n ? `manifest-objects-owned-by-other-packages (${foreignCount} rejected)`\n : 'manifest-has-no-objects',\n checkedPaths,\n };\n }\n\n return {\n objects,\n source: 'manifest',\n reason:\n foreignCount > 0\n ? `rejected ${foreignCount} manifest object(s) owned by other packages`\n : undefined,\n checkedPaths,\n };\n}\n\nfunction relativeOrAbsolute(rootDir: string, path: string): string {\n const rel = relative(rootDir, path);\n return rel && !rel.startsWith('..') ? rel : path;\n}\n\n/**\n * Resolves objects from source when no artifact could supply them (#2143).\n *\n * `introspect-project` already reports `manifestSource: \"scanner\"` and works on\n * an unbuilt checkout. Without the same fallback here, an unbuilt package\n * silently contributed nothing and the two tools disagreed about one root —\n * which was the defect underneath every symptom in #2143.\n *\n * Mutates in place because `mcpTools` and `relationshipFeatures` are derived\n * from `objects` and have to be recomputed together.\n */\nasync function applyScannerFallback(\n pkg: KnowledgePackage,\n extraExcludes: string[] = [],\n): Promise<void> {\n if (pkg.objectSource !== 'none') return;\n if (!hasScannableSources(pkg.directory)) {\n pkg.objectSourceReason = `${pkg.objectSourceReason ?? 'no-artifact'}; no-typescript-sources`;\n return;\n }\n\n try {\n const objects = await scanPackageObjects(\n pkg.directory,\n pkg.name,\n extraExcludes,\n );\n if (objects.length === 0) {\n pkg.objectSourceReason = 'no-smrt-objects-in-sources';\n return;\n }\n pkg.objects = objects;\n pkg.objectSource = 'scanner';\n pkg.objectSourceReason = undefined;\n pkg.mcpTools = mcpTools(objects);\n pkg.relationshipFeatures = relationshipFeatures(objects);\n } catch (error) {\n pkg.objectSourceReason = `scanner-failed: ${messageFromError(error)}`;\n }\n}\n\nasync function applyScannerFallbacks(\n packages: KnowledgePackage[],\n memberExcludes: string[],\n): Promise<void> {\n for (\n let offset = 0;\n offset < packages.length;\n offset += MAX_SCANNER_CONCURRENCY\n ) {\n await Promise.all(\n packages\n .slice(offset, offset + MAX_SCANNER_CONCURRENCY)\n .map((pkg) =>\n applyScannerFallback(pkg, pkg.isWorkspaceRoot ? memberExcludes : []),\n ),\n );\n }\n}\n\n/**\n * Stops at the first candidate instead of walking a whole tree.\n *\n * Deliberately unbounded in depth: a package may keep its models at\n * `src/features/billing/models/internal/Invoice.ts`, and a shallow probe would\n * report \"no TypeScript sources\" for a package `OxcScanner` can actually read.\n */\nfunction hasScannableSources(directory: string): boolean {\n let entries: Dirent[];\n try {\n entries = readdirSync(directory, { withFileTypes: true });\n } catch {\n return false;\n }\n\n const subdirectories: string[] = [];\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (!WALK_SKIP_DIRS.has(entry.name)) {\n subdirectories.push(join(directory, entry.name));\n }\n continue;\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 return true;\n }\n }\n\n return subdirectories.some((child) => hasScannableSources(child));\n}\n\nasync function scanPackageObjects(\n directory: string,\n packageName: string,\n extraExcludes: string[] = [],\n): Promise<KnowledgeObject[]> {\n const scanner = new OxcScanner({\n cwd: directory,\n include: SCAN_INCLUDE,\n exclude: [...SCAN_EXCLUDE, ...extraExcludes],\n });\n const { results, resolved } = await scanner.scanAndResolve();\n const decorated = resolved.filter((classDef) => classDef.hasSmartDecorator);\n if (decorated.length === 0) return [];\n\n const adapter = new ManifestAdapter();\n const manifest = adapter.toManifest(decorated, {\n packageName,\n typeAliases: results.typeAliases,\n }) as unknown as Record<string, unknown>;\n\n // Deliberately no ManifestGenerator schema enrichment here. Fields and\n // relationships are what this projection needs, and `generateSchemas` writes\n // progress lines to stdout through the SDK logger — which is the MCP server's\n // JSON-RPC channel, so invoking it here would corrupt the protocol stream.\n // Consequence: scanner-provenance packages report no `columnType`, so they\n // contribute 0 to the `uuidColumns` fact. `objectSource` makes that visible.\n return readManifestObjects(manifest);\n}\n\nfunction messageFromError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction readDomainKnowledge(\n directory: string,\n): { path: string; content: DomainKnowledgeManifest } | null {\n for (const path of [\n join(directory, '.smrt', 'smrt-knowledge.json'),\n join(directory, 'dist', 'smrt-knowledge.json'),\n join(directory, 'src', 'manifest', 'smrt-knowledge.json'),\n ]) {\n const content = readJson(path);\n if (isDomainKnowledgeManifest(content)) {\n return { path, content };\n }\n }\n return null;\n}\n\nfunction isDomainKnowledgeManifest(\n value: unknown,\n): value is DomainKnowledgeManifest {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const record = value as Record<string, unknown>;\n return record.schemaVersion === 1 && Array.isArray(record.objects);\n}\n\nfunction readManifest(\n directory: string,\n): { path: string; content: Record<string, unknown> } | null {\n for (const path of [\n join(directory, 'src', 'manifest', 'manifest.json'),\n join(directory, '.smrt', 'manifest.json'),\n join(directory, 'dist', 'manifest.json'),\n ]) {\n const content = readJson(path);\n if (content) return { path, content: objectRecord(content) };\n }\n return null;\n}\n\n/**\n * Rejects objects a manifest does not own (#2143).\n *\n * A runtime `.smrt/manifest.json` is frequently an *aggregate*: it registers\n * every object reachable from the app, including its dependencies'. Counting\n * those as the package's own doubles Relationships-v2 (a stale 759KB\n * `packages/cli/.smrt/manifest.json` reported 200 foreignKey / 413 UUID against\n * a real 89 / 206). Ownership is decided per object, so an aggregate still\n * contributes the objects it genuinely owns.\n */\nfunction partitionOwnedObjects(\n manifest: Record<string, unknown>,\n packageName: string,\n): { owned: Record<string, unknown>; foreignCount: number } {\n const objects = objectRecord(manifest.objects);\n const owned: Record<string, unknown> = {};\n let foreignCount = 0;\n\n for (const [key, raw] of Object.entries(objects)) {\n if (manifestObjectIsOwned(objectRecord(raw), packageName)) {\n owned[key] = raw;\n continue;\n }\n foreignCount += 1;\n }\n\n return { owned, foreignCount };\n}\n\nfunction manifestObjectIsOwned(\n object: Record<string, unknown>,\n packageName: string,\n): boolean {\n const declared =\n typeof object.packageName === 'string' ? object.packageName : undefined;\n if (declared) return declared === packageName;\n\n const qualifiedName =\n typeof object.qualifiedName === 'string' ? object.qualifiedName : undefined;\n const qualifier = qualifiedName?.includes(':')\n ? qualifiedName.slice(0, qualifiedName.lastIndexOf(':'))\n : undefined;\n if (qualifier) return qualifier === packageName;\n\n // Neither marker present: a package-local manifest cannot be attributed\n // elsewhere, so ownership is assumed rather than silently dropping objects.\n return true;\n}\n\nfunction readManifestObjects(\n manifest: Record<string, unknown>,\n): KnowledgeObject[] {\n const objects = objectRecord(manifest.objects);\n return Object.values(objects).map((raw) => {\n const item = objectRecord(raw);\n const schema = objectRecord(item.schema);\n const fields = objectRecord(item.fields);\n const schemaColumns = objectRecord(schema.columns);\n const decoratorConfig = objectRecord(item.decoratorConfig);\n const knowledgeFields = Object.entries(fields)\n .filter(([, field]) => !isSensitiveKnowledgeField(field))\n .map(([fieldName, field]) => {\n const columnName = camelToSnake(fieldName);\n const column = objectRecord(schemaColumns[columnName]);\n return projectKnowledgeField(fieldName, field, column.type);\n });\n const methods = objectRecord(item.methods);\n const sensitiveIdentifiers = sensitiveKnowledgeFieldIdentifiers(\n Object.entries(fields),\n );\n const tenant = sanitizeKnowledgeTenant(\n projectTenant(decoratorConfig.tenantScoped),\n sensitiveIdentifiers,\n );\n const conflictColumns = stringArray(decoratorConfig.conflictColumns).filter(\n (column) => !sensitiveIdentifiers.has(column),\n );\n\n return {\n className: String(item.className ?? item.name ?? 'Unknown'),\n qualifiedName:\n typeof item.qualifiedName === 'string' ? item.qualifiedName : undefined,\n filePath: typeof item.filePath === 'string' ? item.filePath : undefined,\n extends: typeof item.extends === 'string' ? item.extends : undefined,\n collection:\n typeof item.collection === 'string' ? item.collection : undefined,\n mcpOperations: mcpOperations(decoratorConfig.mcp),\n tableName:\n typeof decoratorConfig.tableName === 'string'\n ? decoratorConfig.tableName\n : typeof schema.tableName === 'string'\n ? schema.tableName\n : undefined,\n idColumnType:\n typeof objectRecord(schemaColumns.id).type === 'string'\n ? (objectRecord(schemaColumns.id).type as string)\n : undefined,\n fields: knowledgeFields,\n relationships: knowledgeFields.filter((field) =>\n RELATIONSHIP_FIELD_TYPES.has(field.type),\n ),\n methods: Object.keys(methods).sort(),\n methodSignatures: projectMethodSignatures(methods),\n tenant,\n tableStrategy:\n decoratorConfig.tableStrategy === 'cti' ||\n decoratorConfig.tableStrategy === 'sti'\n ? decoratorConfig.tableStrategy\n : undefined,\n conflictColumns: conflictColumns.length > 0 ? conflictColumns : undefined,\n };\n });\n}\n\nfunction readDomainKnowledgeObjects(\n manifest: DomainKnowledgeManifest,\n): KnowledgeObject[] {\n return manifest.objects.map((object) => {\n const sensitiveIdentifiers = sensitiveKnowledgeFieldIdentifiers(\n object.fields.map((field) => [field.name, field]),\n );\n const fields = object.fields\n .filter((field) => !isSensitiveKnowledgeField(field))\n .map((field) => projectKnowledgeField(field.name, field));\n const safeFieldNames = new Set(fields.map((field) => field.name));\n const conflictColumns = object.conflictColumns?.filter(\n (column) => !sensitiveIdentifiers.has(column),\n );\n const tenant = sanitizeKnowledgeTenant(\n object.tenant ? { ...object.tenant } : undefined,\n sensitiveIdentifiers,\n );\n return {\n className: object.name,\n qualifiedName: object.qualifiedName,\n extends: object.extends,\n collection: object.collection,\n mcpOperations: object.surfaces\n .filter((surface) => surface.kind === 'mcp')\n .map((surface) => surface.operation)\n .sort(),\n tableName: object.tableName,\n idColumnType: fields.find((field) => field.name === 'id')?.columnType,\n fields,\n relationships: object.relationships\n .filter(\n (field) =>\n safeFieldNames.has(field.name) && !isSensitiveKnowledgeField(field),\n )\n .map((field) => projectKnowledgeField(field.name, field)),\n methods: object.methods,\n methodSignatures: object.methodSignatures?.map((signature) => ({\n name: signature.name,\n async: signature.async,\n static: signature.static,\n params: signature.params ? [...signature.params] : undefined,\n returns: signature.returns,\n })),\n tenant,\n tableStrategy: object.tableStrategy,\n conflictColumns:\n conflictColumns && conflictColumns.length > 0\n ? conflictColumns\n : undefined,\n };\n });\n}\n\nfunction sanitizeDomainKnowledgeManifest(\n manifest: DomainKnowledgeManifest,\n rawManifest?: Record<string, unknown>,\n packageName?: string,\n): DomainKnowledgeManifest {\n const rawObjects = rawManifest\n ? ownedManifestObjectsByIdentity(rawManifest, packageName)\n : new Map<string, Record<string, unknown>>();\n const projectionIsSanitized = manifest.sensitiveFieldsExcluded === true;\n return {\n ...manifest,\n objects: manifest.objects.map((object): DomainKnowledgeObject => {\n const rawObject =\n (object.qualifiedName\n ? rawObjects.get(object.qualifiedName)\n : undefined) ?? rawObjects.get(object.name);\n const rawFields = objectRecord(rawObject?.fields);\n const artifactSensitiveIdentifiers = sensitiveKnowledgeFieldIdentifiers(\n object.fields.map((field) => [field.name, field]),\n );\n const rawSensitiveIdentifiers = sensitiveKnowledgeFieldIdentifiers(\n Object.entries(rawFields),\n );\n const sensitiveIdentifiers = new Set([\n ...artifactSensitiveIdentifiers,\n ...rawSensitiveIdentifiers,\n ]);\n const rawSafeFieldNames = new Set(\n Object.entries(rawFields)\n .filter(([, field]) => !isSensitiveKnowledgeField(field))\n .map(([name]) => name),\n );\n const canTrustField = (field: DomainKnowledgeField) =>\n projectionIsSanitized ||\n (rawObject !== undefined && rawSafeFieldNames.has(field.name));\n const fields = object.fields\n .filter(\n (field) => canTrustField(field) && !isSensitiveKnowledgeField(field),\n )\n .map((field) => projectKnowledgeField(field.name, field));\n const safeFieldNames = new Set(fields.map((field) => field.name));\n const rawDecoratorConfig = objectRecord(rawObject?.decoratorConfig);\n const projectedConflictColumns = projectionIsSanitized\n ? object.conflictColumns\n : rawObject\n ? stringArray(rawDecoratorConfig.conflictColumns)\n : undefined;\n const conflictColumns = projectedConflictColumns?.filter(\n (column) => !sensitiveIdentifiers.has(column),\n );\n const projectedTenant = projectionIsSanitized\n ? object.tenant\n : rawObject\n ? projectTenant(rawDecoratorConfig.tenantScoped)\n : object.tenant\n ? { scoped: object.tenant.scoped, mode: object.tenant.mode }\n : undefined;\n return {\n ...object,\n fields,\n relationships: object.relationships\n .filter(\n (field) =>\n safeFieldNames.has(field.name) &&\n !isSensitiveKnowledgeField(field),\n )\n .map((field) => projectKnowledgeField(field.name, field)),\n tenant: sanitizeKnowledgeTenant(projectedTenant, sensitiveIdentifiers),\n conflictColumns:\n conflictColumns && conflictColumns.length > 0\n ? conflictColumns\n : undefined,\n };\n }),\n };\n}\n\nfunction ownedManifestObjectsByIdentity(\n manifest: Record<string, unknown>,\n packageName?: string,\n): Map<string, Record<string, unknown>> {\n const owned = packageName\n ? partitionOwnedObjects(manifest, packageName).owned\n : objectRecord(manifest.objects);\n const objects = new Map<string, Record<string, unknown>>();\n for (const [key, value] of Object.entries(owned)) {\n const object = objectRecord(value);\n objects.set(key, object);\n if (typeof object.className === 'string') {\n objects.set(object.className, object);\n }\n if (typeof object.qualifiedName === 'string') {\n objects.set(object.qualifiedName, object);\n }\n }\n return objects;\n}\n\nfunction isSensitiveKnowledgeField(value: unknown): boolean {\n const field = objectRecord(value);\n return (\n field.sensitive === true || objectRecord(field._meta).sensitive === true\n );\n}\n\nfunction sensitiveKnowledgeFieldIdentifiers(\n fields: Array<[string, unknown]>,\n): Set<string> {\n return new Set(\n fields\n .filter(([, field]) => isSensitiveKnowledgeField(field))\n .flatMap(([name]) => [name, toSnakeCase(name), camelToSnake(name)]),\n );\n}\n\nfunction projectKnowledgeField(\n name: string,\n value: unknown,\n columnType?: unknown,\n): KnowledgeField {\n const field = objectRecord(value);\n const meta = objectRecord(field._meta);\n const declaredConstraints = objectRecord(field.constraints);\n const constraints: DomainKnowledgeFieldConstraints = {};\n for (const key of ['min', 'max', 'minLength', 'maxLength'] as const) {\n const candidate = field[key] ?? meta[key] ?? declaredConstraints[key];\n if (typeof candidate === 'number') constraints[key] = candidate;\n }\n const pattern = normalizeKnowledgePattern(\n field.pattern ?? meta.pattern ?? declaredConstraints.pattern,\n );\n if (pattern !== undefined) constraints.pattern = pattern;\n const hasDefault = Object.hasOwn(field, 'default')\n ? field.default !== undefined\n : meta.default !== undefined;\n\n return {\n name,\n type: String(field.type ?? 'unknown'),\n required: typeof field.required === 'boolean' ? field.required : undefined,\n related: typeof field.related === 'string' ? field.related : undefined,\n columnType:\n typeof columnType === 'string'\n ? columnType\n : typeof field.columnType === 'string'\n ? field.columnType\n : undefined,\n ...(hasDefault\n ? {\n default: Object.hasOwn(field, 'default')\n ? field.default\n : meta.default,\n }\n : {}),\n constraints: Object.keys(constraints).length > 0 ? constraints : undefined,\n readonly:\n field.readonly === true || meta.readonly === true ? true : undefined,\n transient:\n field.transient === true || meta.transient === true ? true : undefined,\n };\n}\n\nfunction normalizeKnowledgePattern(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n const source = objectRecord(value).source;\n return typeof source === 'string' ? source : undefined;\n}\n\nfunction projectTenant(value: unknown): DomainKnowledgeTenant | undefined {\n if (value === true) {\n return { scoped: true, mode: 'required', field: 'tenantId' };\n }\n const config = objectRecord(value);\n if (Object.keys(config).length === 0) return undefined;\n return {\n scoped: true,\n mode: config.mode === 'optional' ? 'optional' : 'required',\n field: typeof config.field === 'string' ? config.field : 'tenantId',\n };\n}\n\nfunction sanitizeKnowledgeTenant(\n tenant: DomainKnowledgeTenant | undefined,\n sensitiveIdentifiers: Set<string>,\n): DomainKnowledgeTenant | undefined {\n if (!tenant?.field || !sensitiveIdentifiers.has(tenant.field)) return tenant;\n return { scoped: tenant.scoped, mode: tenant.mode };\n}\n\nfunction projectMethodSignatures(\n methods: Record<string, unknown>,\n): DomainKnowledgeMethodSignature[] | undefined {\n const signatures = Object.entries(methods)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([methodName, value]) => {\n const method = objectRecord(value);\n const params = Array.isArray(method.parameters)\n ? method.parameters.map((raw) => {\n const parameter = objectRecord(raw);\n const name =\n typeof parameter.name === 'string' ? parameter.name : 'arg';\n const type =\n typeof parameter.type === 'string' ? parameter.type : 'unknown';\n return `${name}${parameter.optional === true ? '?' : ''}: ${type}`;\n })\n : undefined;\n return {\n name: typeof method.name === 'string' ? method.name : methodName,\n async: method.async === true ? true : undefined,\n static: method.isStatic === true ? true : undefined,\n params: params && params.length > 0 ? params : undefined,\n returns:\n typeof method.returnType === 'string' && method.returnType\n ? method.returnType\n : undefined,\n };\n });\n return signatures.length > 0 ? signatures : undefined;\n}\n\nfunction readDomainKnowledgePrompts(\n manifest: DomainKnowledgeManifest,\n directory: string,\n rootDir: string,\n): KnowledgePrompt[] {\n return manifest.prompts.map((prompt) => ({\n filePath: relative(rootDir, join(directory, prompt.filePath)),\n key: prompt.key,\n }));\n}\n\nfunction readPrompts(directory: string, rootDir: string): KnowledgePrompt[] {\n const srcDir = join(directory, 'src');\n if (!existsSync(srcDir)) return [];\n const prompts: KnowledgePrompt[] = [];\n for (const filePath of walkFiles(srcDir)) {\n if (!filePath.endsWith('.ts')) continue;\n const content = readFileSync(filePath, 'utf8');\n if (!content.includes('definePrompt')) continue;\n const keyMatch = content.match(/definePrompt\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/);\n prompts.push({\n filePath: relative(rootDir, filePath),\n key: keyMatch?.[1],\n });\n }\n return prompts;\n}\n\nfunction walkFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (WALK_SKIP_DIRS.has(entry.name)) continue;\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...walkFiles(fullPath));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n return files;\n}\n\nfunction packageKind(name: string): KnowledgePackageKind {\n if (name.startsWith('@happyvertical/smrt-')) return 'smrt';\n if (SDK_PACKAGE_NAMES.has(name)) return 'sdk';\n return 'workspace';\n}\n\nfunction exportKeys(exportsField: unknown): string[] {\n if (typeof exportsField === 'string') return ['.'];\n if (\n typeof exportsField !== 'object' ||\n exportsField === null ||\n Array.isArray(exportsField)\n ) {\n return [];\n }\n return Object.keys(exportsField).sort();\n}\n\nfunction mcpOperations(config: unknown): string[] {\n if (config === false) return [];\n const defaultOperations = ['list', 'get', 'create', 'update', 'delete'];\n if (typeof config !== 'object' || config === null || Array.isArray(config)) {\n return defaultOperations;\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 : defaultOperations;\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\nfunction mcpTools(objects: KnowledgeObject[]): KnowledgeMcpTool[] {\n return objects\n .flatMap((object) => {\n const collection = object.collection ?? object.className.toLowerCase();\n return object.mcpOperations.map((operation) => ({\n name: `${operation}_${collection}`,\n sourceObject: object.qualifiedName ?? object.className,\n operation,\n }));\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction domainMcpTools(manifest: DomainKnowledgeManifest): KnowledgeMcpTool[] {\n return manifest.surfaces\n .filter((surface) => surface.kind === 'mcp')\n .map((surface) => ({\n name: surface.name,\n sourceObject: surface.objectName ?? '',\n operation: surface.operation,\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Identity of the table an object maps to, used to avoid counting one table\n * twice (#2143).\n *\n * A consuming app's generated artifact can re-qualify a dependency's objects\n * under the app's own package name (observed: 18 of `apps/work-web`'s 21\n * artifact objects are classes declared in `packages/work`, same tables). Name\n * prefixes cannot detect that, so corpus-level facts are keyed by class plus\n * table instead.\n */\nfunction objectIdentity(object: KnowledgeObject): string {\n return `${object.className}::${object.tableName ?? object.collection ?? ''}`;\n}\n\n/**\n * True when either package declares the other as a dependency.\n *\n * This is what separates a re-qualified copy from a coincidence. A consuming\n * package can only restate its *dependencies'* objects, so a shared identity\n * across a dependency edge is one table reported twice. Two unrelated packages\n * that happen to share a class and table name (observed: `Account::accounts` in\n * both smrt-messages and smrt-ledgers) are genuinely distinct objects and must\n * both keep contributing their fields.\n */\nfunction hasDependencyEdge(a: KnowledgePackage, b: KnowledgePackage): boolean {\n return dependsOn(a, b.name) || dependsOn(b, a.name);\n}\n\n/**\n * Picks the copy that owns the class within one connected group.\n *\n * Ownership follows the dependency direction: a consumer can restate its\n * *dependency's* objects, never the reverse, so the entry that the most other\n * members of the group depend on is the declaring package. Provenance alone is\n * not enough — preferring a scanner copy kept `smrt-support`'s compatibility\n * subtype over the canonical `smrt-projects` model and changed the facts.\n */\nfunction pickOwningEntry(\n entries: Array<{ pkg: KnowledgePackage; object: KnowledgeObject }>,\n): { pkg: KnowledgePackage; object: KnowledgeObject } {\n let best = entries[0];\n let bestScore = -1;\n for (const entry of entries) {\n const score = entries.filter(\n (other) => other !== entry && dependsOn(other.pkg, entry.pkg.name),\n ).length;\n // Entries arrive name-sorted, so ties resolve deterministically.\n if (score > bestScore) {\n best = entry;\n bestScore = score;\n }\n }\n return best;\n}\n\nfunction dependsOn(pkg: KnowledgePackage, name: string): boolean {\n return (\n name in pkg.dependencies ||\n name in pkg.devDependencies ||\n name in pkg.peerDependencies\n );\n}\n\nfunction dedupeObjectsByIdentity(\n packages: KnowledgePackage[],\n): KnowledgeObject[] {\n const groups = groupObjectsByIdentity(packages);\n return [...groups.values()].flatMap((entries) =>\n collapseIdentityGroup(entries).map((entry) => entry.object),\n );\n}\n\nfunction groupObjectsByIdentity(\n packages: KnowledgePackage[],\n): Map<string, Array<{ pkg: KnowledgePackage; object: KnowledgeObject }>> {\n const groups = new Map<\n string,\n Array<{ pkg: KnowledgePackage; object: KnowledgeObject }>\n >();\n for (const pkg of packages) {\n for (const object of pkg.objects) {\n const identity = objectIdentity(object);\n const entries = groups.get(identity) ?? [];\n entries.push({ pkg, object });\n groups.set(identity, entries);\n }\n }\n return groups;\n}\n\n/**\n * Collapses entries linked by dependency edges, leaving unrelated same-named\n * objects intact.\n *\n * Grouping is by connected component, not a greedy first match: when two\n * independent consumers both restate one shared dependency's object, neither\n * consumer has an edge to the other, so a greedy pass would keep both and\n * double-count the very table this exists to collapse. Packages arrive\n * name-sorted, so the result is stable.\n */\nfunction collapseIdentityGroup(\n entries: Array<{ pkg: KnowledgePackage; object: KnowledgeObject }>,\n): Array<{ pkg: KnowledgePackage; object: KnowledgeObject }> {\n if (entries.length === 1) return entries;\n\n const parent = entries.map((_, index) => index);\n const find = (index: number): number => {\n let root = index;\n while (parent[root] !== root) root = parent[root];\n return root;\n };\n for (let a = 0; a < entries.length; a += 1) {\n for (let b = a + 1; b < entries.length; b += 1) {\n if (!hasDependencyEdge(entries[a].pkg, entries[b].pkg)) continue;\n const rootA = find(a);\n const rootB = find(b);\n if (rootA !== rootB) parent[rootB] = rootA;\n }\n }\n\n const components = new Map<\n number,\n Array<{ pkg: KnowledgePackage; object: KnowledgeObject }>\n >();\n for (const [index, entry] of entries.entries()) {\n const root = find(index);\n components.set(root, [...(components.get(root) ?? []), entry]);\n }\n\n return [...components.values()].map((component) =>\n component.length === 1 ? component[0] : pickOwningEntry(component),\n );\n}\n\nfunction summarizeRelationshipsV2(packages: KnowledgePackage[]) {\n // Relationships-v2 describes the project's model, so one table must\n // contribute its fields once even when two packages both report it.\n const objects = dedupeObjectsByIdentity(packages);\n const fields = objects.flatMap((object) => object.fields);\n return {\n foreignKeyFields: fields.filter((field) => field.type === 'foreignKey')\n .length,\n crossPackageRefFields: fields.filter(\n (field) => field.type === 'crossPackageRef',\n ).length,\n junctionCollections: objects.filter(\n (object) => object.extends === 'SmrtJunction',\n ).length,\n hierarchicalObjects: objects.filter(\n (object) => object.extends === 'SmrtHierarchical',\n ).length,\n polymorphicAssociations: objects.filter((object) =>\n object.fields.some(\n (field) => field.name === 'metaType' || field.name === 'metaId',\n ),\n ).length,\n uuidColumns: fields.filter((field) => field.columnType === 'UUID').length,\n };\n}\n\nfunction relationshipFeatures(objects: KnowledgeObject[]): string[] {\n const features = new Set<string>();\n if (\n objects.some((object) =>\n object.fields.some((field) => field.type === 'foreignKey'),\n )\n ) {\n features.add('foreignKey');\n }\n if (\n objects.some((object) =>\n object.fields.some((field) => field.type === 'crossPackageRef'),\n )\n ) {\n features.add('crossPackageRef');\n }\n if (objects.some((object) => object.extends === 'SmrtJunction')) {\n features.add('SmrtJunction');\n }\n if (objects.some((object) => object.extends === 'SmrtHierarchical')) {\n features.add('SmrtHierarchical');\n }\n if (\n objects.some((object) =>\n object.fields.some(\n (field) => field.name === 'metaType' || field.name === 'metaId',\n ),\n )\n ) {\n features.add('SmrtPolymorphicAssociation');\n }\n if (\n objects.some((object) =>\n object.fields.some((field) => field.columnType === 'UUID'),\n )\n ) {\n features.add('uuidColumns');\n }\n return [...features].sort();\n}\n\nfunction findStalePatternIssues(\n rootDir: string,\n changedFiles?: string[],\n): KnowledgeIssue[] {\n const candidates =\n changedFiles && changedFiles.length > 0\n ? changedFiles.map((file) => join(rootDir, file))\n : walkFiles(rootDir);\n const issues: KnowledgeIssue[] = [];\n for (const file of candidates.filter((candidate) =>\n shouldScanStalePatternFile(rootDir, candidate),\n )) {\n if (!existsSync(file) || lstatSync(file).isDirectory()) continue;\n const rel = relative(rootDir, file);\n const content = readFileSync(file, 'utf8');\n for (const stale of STALE_PATTERNS) {\n if (!stale.pattern.test(content)) continue;\n issues.push({\n severity: 'warning',\n code: stale.code,\n message: stale.message,\n file: rel,\n });\n }\n }\n return issues;\n}\n\n/**\n * Flag fields whose declared numeric precision contradicts their name (#2361):\n * money declared decimal, or a rate declared integer.\n *\n * Both kinds fail closed on `@happyvertical/smrt-*`. The framework has zero\n * violations of either rule: the rates were already correct (#2361), and the\n * twenty-one money fields across commerce, projects, subscriptions, support and\n * the conformance fixture converted to integer minor units in #2401, along with\n * the data migration that rescales existing columns. The gate now holds both\n * lines at zero rather than watching money drift back.\n *\n * Consumer packages always warn: the framework cannot know a downstream\n * project's money convention, and a hard failure would make\n * `dev:knowledge-check` unpassable there.\n *\n * Source, not manifest, is the oracle: the manifest records the resulting\n * column type but not whether the author chose it, so only the source can tell\n * `@field({ type: 'decimal' })` (a decision) from `= 0.0` (a default nobody\n * made).\n */\nfunction findNumericPrecisionIssues(\n index: SmrtKnowledgeIndex,\n authoredPackages: KnowledgePackage[],\n changedFiles?: string[],\n): KnowledgeIssue[] {\n const changedAbsolutePaths = changedFiles\n ? new Set(changedFiles.map((file) => resolve(index.rootDir, file)))\n : undefined;\n const issues: KnowledgeIssue[] = [];\n\n for (const pkg of authoredPackages) {\n if (pkg.kind === 'sdk') continue;\n const srcDir = join(pkg.directory, 'src');\n if (!existsSync(srcDir)) continue;\n const isFramework = pkg.kind === 'smrt';\n\n for (const filePath of walkFiles(srcDir)) {\n if (!isLintableModelSource(filePath)) continue;\n if (changedAbsolutePaths && !changedAbsolutePaths.has(filePath)) continue;\n let sourceText: string;\n try {\n sourceText = readFileSync(filePath, 'utf8');\n } catch {\n continue;\n }\n // Parsing every file in the workspace would dominate this check; the\n // pre-filter is conservative, so it only ever skips files that could not\n // have produced a finding.\n if (!sourceMayContainNumericPrecisionIssue(sourceText)) continue;\n\n const parsed = parseSource(sourceText, filePath);\n for (const finding of lintNumericPrecision(parsed.classes, sourceText)) {\n const location = finding.line > 0 ? `:${finding.line}` : '';\n // See this function's doc comment: the framework is at zero for both\n // rules, so both fail closed there; consumers always warn.\n const severity: KnowledgeIssueSeverity = isFramework\n ? 'error'\n : 'warning';\n issues.push({\n severity,\n code: `numeric-precision-${finding.kind}`,\n message: `${finding.message} ${finding.remedy}`,\n file: `${relative(index.rootDir, filePath)}${location}`,\n packageName: pkg.name,\n });\n }\n }\n }\n\n return issues;\n}\n\n/** Only authored, non-generated TypeScript model sources are linted. */\nfunction isLintableModelSource(filePath: string): boolean {\n if (!filePath.endsWith('.ts') && !filePath.endsWith('.tsx')) return false;\n if (filePath.endsWith('.d.ts')) return false;\n if (/\\.(test|spec)\\.tsx?$/.test(filePath)) return false;\n const parts = filePath.split(sep);\n // `template/` holds consumer scaffolding this repo's rules do not govern\n // (biome skips it too), and `__tests__/` is fixtures.\n return !parts.includes('__tests__') && !parts.includes('template');\n}\n\nfunction shouldScanStalePatternFile(\n rootDir: string,\n filePath: string,\n): boolean {\n const rel = relative(rootDir, filePath).replaceAll('\\\\', '/');\n if (!rel || rel.startsWith('..')) return false;\n const parts = rel.split('/');\n if (parts.includes('node_modules') || parts.includes('dist')) return false;\n if (rel === 'AGENTS.md' || rel === 'README.md') return true;\n if (rel.endsWith('/AGENTS.md') || rel.endsWith('/README.md')) return true;\n if (!rel.startsWith('docs/content/') || !rel.endsWith('.md')) return false;\n return !(\n rel.startsWith('docs/content/api/') ||\n rel.startsWith('docs/content/rfcs/') ||\n rel.startsWith('docs/content/architecture/')\n );\n}\n\nfunction buildReviewFindings(\n index: SmrtKnowledgeIndex,\n changedFiles: string[],\n selectedPackages: KnowledgePackage[],\n): KnowledgeIssue[] {\n const issues: KnowledgeIssue[] = [];\n\n for (const pkg of selectedPackages) {\n const changedPackageFiles = changedFiles.filter((file) =>\n packageOwnsFile(pkg, file, index.packages),\n );\n\n if (!pkg.agentDoc && pkg.kind === 'smrt') {\n issues.push({\n severity: 'warning',\n code: 'missing-package-expertise',\n message: 'Selected SMRT package has no authored AGENTS.md expertise',\n file: pkg.relativeDirectory,\n packageName: pkg.name,\n });\n }\n\n if (\n changedPackageFiles.some((file) => file.endsWith('.ts')) &&\n pkg.relationshipFeatures.length > 0\n ) {\n issues.push({\n severity: 'warning',\n code: 'relationship-sensitive-review',\n message: `Package uses relationships-v2 features: ${pkg.relationshipFeatures.join(', ')}`,\n file: changedPackageFiles.find((file) => file.endsWith('.ts')),\n packageName: pkg.name,\n });\n }\n\n if (\n changedPackageFiles.some((file) => file.endsWith('.ts')) &&\n pkg.mcpTools.length > 0\n ) {\n issues.push({\n severity: 'warning',\n code: 'mcp-surface-review',\n message: `Package exposes ${pkg.mcpTools.length} generated MCP tool(s); check public tool compatibility`,\n file: changedPackageFiles.find((file) => file.endsWith('.ts')),\n packageName: pkg.name,\n });\n }\n\n const manifestFile = changedPackageFiles.find((file) =>\n isPackageManifestFile(pkg, file),\n );\n if (manifestFile) {\n issues.push({\n severity: 'warning',\n code: 'package-manifest-review',\n message:\n 'package.json changed; verify exports, files, dependencies, AGENTS.md, and CLAUDE.md shim packaging',\n file: manifestFile,\n packageName: pkg.name,\n });\n }\n\n const publicEntrypointFile = changedPackageFiles.find((file) =>\n isPublicEntrypointFile(pkg, file),\n );\n if (publicEntrypointFile) {\n issues.push({\n severity: 'warning',\n code: 'public-entrypoint-review',\n message:\n 'Public package entrypoint changed; check exports, generated surfaces, and downstream docs',\n file: publicEntrypointFile,\n packageName: pkg.name,\n });\n }\n\n const agentDocFile = changedPackageFiles.find((file) =>\n isPackageAgentDocFile(pkg, file),\n );\n if (agentDocFile) {\n issues.push({\n severity: 'warning',\n code: 'agent-expertise-review',\n message:\n 'AGENTS.md changed; validate authored expertise against generated objects, relationships, exports, and SDK dependencies',\n file: agentDocFile,\n packageName: pkg.name,\n });\n }\n }\n\n for (const file of changedFiles) {\n if (!file.startsWith('packages/')) continue;\n if (selectPackagesForFiles(index, [file]).length > 0) continue;\n issues.push({\n severity: 'warning',\n code: 'changed-file-without-package-expert',\n message:\n 'Changed file is under packages/ but did not map to a SMRT package',\n file,\n });\n }\n\n return issues;\n}\n\n/**\n * Joins a package-relative path onto a package's workspace-relative directory.\n *\n * The workspace root can itself be an indexed package — including the\n * single-package layout #2143 added — and its `relativeDirectory` is the empty\n * string. Naive interpolation emits `/AGENTS.md`, an absolute filesystem path,\n * instead of the project-relative path callers are told to read.\n */\nfunction packageRelativePath(pkg: KnowledgePackage, path: string): string {\n return pkg.relativeDirectory ? `${pkg.relativeDirectory}/${path}` : path;\n}\n\n/**\n * Workspace-relative paths of a package's authored documentation.\n *\n * Shared with the MCP transport layer so the summary projection and the\n * Markdown bundle can never disagree about where a doc lives.\n */\nexport function packageDocPaths(pkg: KnowledgePackage): string[] {\n return [\n ...(pkg.docSource ? [packageRelativePath(pkg, pkg.docSource)] : []),\n ...pkg.moduleDocs.map((doc) => packageRelativePath(pkg, doc.path)),\n ];\n}\n\n/**\n * True when a workspace-relative changed file belongs to `pkg`.\n *\n * A workspace-root package has an empty `relativeDirectory`, so the nested-path\n * test would compare against a leading `/` and never match — which silently\n * selected no packages for exactly the single-package layout #2143 added. The\n * root instead owns any path no member package owns, mirroring the\n * member-excluded scan in `applyScannerFallbacks`.\n */\nfunction packageOwnsFile(\n pkg: KnowledgePackage,\n file: string,\n siblings: readonly KnowledgePackage[],\n): boolean {\n if (pkg.relativeDirectory) {\n return (\n file === pkg.relativeDirectory ||\n file.startsWith(`${pkg.relativeDirectory}/`)\n );\n }\n return !siblings.some(\n (member) =>\n member !== pkg &&\n member.relativeDirectory &&\n (file === member.relativeDirectory ||\n file.startsWith(`${member.relativeDirectory}/`)),\n );\n}\n\nfunction isPackageManifestFile(pkg: KnowledgePackage, file: string): boolean {\n return file === packageRelativePath(pkg, 'package.json');\n}\n\nfunction isPackageAgentDocFile(pkg: KnowledgePackage, file: string): boolean {\n return (\n file === packageRelativePath(pkg, 'AGENTS.md') ||\n // A linked module doc carries the same authored expertise (#2108).\n pkg.moduleDocs.some((doc) => file === packageRelativePath(pkg, doc.path))\n );\n}\n\nfunction isPublicEntrypointFile(pkg: KnowledgePackage, file: string): boolean {\n const sourcePrefix = packageRelativePath(pkg, 'src/');\n if (!file.startsWith(sourcePrefix)) return false;\n const sourcePath = file.slice(sourcePrefix.length);\n return (\n sourcePath === 'index.ts' ||\n sourcePath === 'index.tsx' ||\n sourcePath === 'index.js' ||\n sourcePath.startsWith('api/') ||\n sourcePath.startsWith('cli/') ||\n sourcePath.startsWith('mcp/') ||\n sourcePath.startsWith('tools/')\n );\n}\n\nfunction buildArchitectureRecommendations(\n context: ArchitectureContextResult,\n ideaText: string,\n): SmrtArchitectureResult['recommendations'] {\n const smrtPackages = context.selectedPackages.map((pkg) => pkg.name);\n const sdkPackages = context.selectedSdkPackages.map((pkg) => pkg.name);\n const objectModelSketch = buildObjectModelSketch(\n context.selectedPackages,\n context.diagnostics,\n );\n const risks = buildArchitectureRisks(context.selectedPackages, ideaText);\n const questions = buildArchitectureQuestions(\n context.selectedPackages,\n ideaText,\n );\n\n return {\n smrtPackages,\n sdkPackages,\n objectModelSketch,\n risks,\n questions,\n notes: [\n 'Use SMRT packages for domain/runtime models and generated REST, CLI, MCP, and AI-operation surfaces.',\n 'Use HappyVertical SDK packages for AI, SQL, files, logging, secrets, and external capability adapters.',\n 'Run smrt dev:knowledge-check after applying model-assisted architecture or review updates.',\n ],\n };\n}\n\nfunction buildObjectModelSketch(\n packages: KnowledgePackage[],\n diagnostics: KnowledgeDiagnostic[] = [],\n): string[] {\n // Never hand back a generic sketch when discovery failed: that is the exact\n // confident-but-empty answer #2143 was filed about.\n const blocking = diagnostics.find(\n (diagnostic) => diagnostic.code === 'no-smrt-objects-discovered',\n );\n if (blocking) {\n return [\n `No object model could be derived: ${blocking.message}`,\n `Remediation: ${blocking.remedy ?? 'verify workspace discovery.'}`,\n ];\n }\n\n const lines = packages.flatMap((pkg) => {\n const objects = pkg.objects\n .filter((object) => object.extends !== 'SmrtCollection')\n .slice(0, 6)\n .map((object) => object.className);\n if (objects.length === 0) {\n return [\n `${pkg.name}: use package services or templates; no manifest objects indexed (${pkg.objectSourceReason ?? pkg.objectSource}).`,\n ];\n }\n return [`${pkg.name}: start from ${objects.join(', ')}.`];\n });\n\n return lines.length > 0\n ? lines\n : [\n 'Define the core domain as SmrtObject classes with explicit relationships and generated surfaces.',\n ];\n}\n\nfunction buildArchitectureRisks(\n packages: KnowledgePackage[],\n ideaText: string,\n): string[] {\n const risks = new Set<string>();\n const names = new Set(packages.map((pkg) => pkg.name));\n const relationshipFeatures = new Set(\n packages.flatMap((pkg) => pkg.relationshipFeatures),\n );\n const lowerText = ideaText.toLowerCase();\n\n if (relationshipFeatures.has('crossPackageRef')) {\n risks.add(\n 'Cross-package references should stay as plain string ids and validate target package ownership at workflow boundaries.',\n );\n }\n if (relationshipFeatures.has('SmrtJunction')) {\n risks.add(\n 'Junction models need explicit conflictColumns so generated upserts stay deterministic.',\n );\n }\n if (relationshipFeatures.has('SmrtHierarchical')) {\n risks.add(\n 'Hierarchical models need cycle prevention and tenant-aware child loading paths.',\n );\n }\n if (\n names.has('@happyvertical/smrt-tenancy') ||\n lowerText.includes('tenant')\n ) {\n risks.add(\n 'Tenant-scoped models need nullable tenantId semantics and tenant-guarded loadRelated usage.',\n );\n }\n if (names.has('@happyvertical/smrt-assets')) {\n risks.add(\n 'Asset ownership should use package-owned join tables; reserve asset_associations for generic/provenance links.',\n );\n }\n if (names.has('@happyvertical/smrt-secrets')) {\n risks.add(\n 'Secrets must use envelope encryption and avoid exposing decrypted values through generated tools.',\n );\n }\n if (names.has('@happyvertical/smrt-jobs') || lowerText.includes('schedule')) {\n risks.add(\n 'Background work should use jobs/schedules rather than request-time side effects.',\n );\n }\n\n risks.add(\n 'Generated architecture should be rechecked with smrt dev:knowledge-check after docs or expertise edits.',\n );\n return [...risks];\n}\n\nfunction buildArchitectureQuestions(\n packages: KnowledgePackage[],\n ideaText: string,\n): string[] {\n const questions = new Set<string>();\n const names = new Set(packages.map((pkg) => pkg.name));\n const lowerText = ideaText.toLowerCase();\n\n questions.add(\n 'Which generated surfaces are required first: REST, CLI, MCP, AI operations, or Svelte UI?',\n );\n if (\n names.has('@happyvertical/smrt-tenancy') ||\n lowerText.includes('tenant')\n ) {\n questions.add(\n 'Which objects are global catalogs and which are tenant-scoped records?',\n );\n }\n if (names.has('@happyvertical/smrt-assets')) {\n questions.add('Which package owns each asset relationship join table?');\n }\n if (names.has('@happyvertical/smrt-profiles')) {\n questions.add('Which identities own or administer the primary records?');\n }\n if (names.has('@happyvertical/smrt-content')) {\n questions.add(\n 'Which content snapshots need citation-time reference pinning?',\n );\n }\n if (names.has('@happyvertical/smrt-social')) {\n questions.add(\n 'Which social providers need OAuth, scheduling, and post-state reconciliation?',\n );\n }\n\n return [...questions];\n}\n\nfunction selectPackagesForFiles(\n index: SmrtKnowledgeIndex,\n changedFiles: string[],\n): KnowledgePackage[] {\n const selected = new Set<KnowledgePackage>();\n const candidates = domainPackages(index);\n for (const file of changedFiles) {\n for (const pkg of candidates) {\n if (packageOwnsFile(pkg, file, index.packages)) {\n selected.add(pkg);\n }\n }\n }\n return [...selected].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction selectPackages(\n index: SmrtKnowledgeIndex,\n options: {\n changedFiles?: string[];\n text?: string;\n scope?: KnowledgeScope;\n packageName?: string;\n },\n): KnowledgePackage[] {\n const selected = new Set<KnowledgePackage>();\n const packageName = options.packageName?.toLowerCase();\n if (packageName) {\n for (const pkg of domainPackages(index)) {\n if (\n scopeAllowsPackage(pkg, options.scope) &&\n packageMatches(pkg, packageName)\n ) {\n selected.add(pkg);\n }\n }\n }\n\n for (const pkg of selectPackagesForFiles(index, options.changedFiles ?? [])) {\n if (scopeAllowsPackage(pkg, options.scope)) selected.add(pkg);\n }\n\n const text = (options.text ?? '').toLowerCase();\n if (text) {\n for (const pkg of domainPackages(index)) {\n if (!scopeAllowsPackage(pkg, options.scope)) continue;\n const packageKey = pkg.name.replace('@happyvertical/smrt-', '');\n if (\n includesToken(text, packageKey) ||\n text.includes(pkg.name.toLowerCase()) ||\n pkg.objects.some((object) =>\n includesToken(text, object.className.toLowerCase()),\n )\n ) {\n selected.add(pkg);\n }\n }\n }\n\n if (selected.size === 0 && options.scope === 'local') {\n for (const pkg of domainPackages(index).filter((item) =>\n scopeAllowsPackage(item, 'local'),\n )) {\n selected.add(pkg);\n }\n }\n\n if (selected.size === 0 && options.scope !== 'sdk') {\n for (const name of [\n '@happyvertical/smrt-core',\n '@happyvertical/smrt-config',\n '@happyvertical/smrt-cli',\n '@happyvertical/smrt-scanner',\n '@happyvertical/smrt-dev-mcp',\n ]) {\n const pkg = index.smrtPackages.find((item) => item.name === name);\n if (pkg && scopeAllowsPackage(pkg, options.scope)) selected.add(pkg);\n }\n\n // A downstream product has none of those framework packages in its\n // workspace, so the list above selected nothing and the tool reported no\n // packages even after discovery found the project's objects (#2143). Fall\n // back to the local packages that actually carry a model, largest first.\n if (selected.size === 0) {\n const contributing = domainPackages(index)\n .filter(\n (pkg) =>\n pkg.objects.length > 0 &&\n scopeAllowsPackage(pkg, options.scope) &&\n !pkg.relativeDirectory.includes('node_modules'),\n )\n .sort((a, b) => b.objects.length - a.objects.length)\n .slice(0, MAX_FALLBACK_PACKAGES);\n for (const pkg of contributing) selected.add(pkg);\n }\n }\n\n return [...selected].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction selectSdkPackages(\n index: SmrtKnowledgeIndex,\n selectedPackages: KnowledgePackage[],\n texts: Array<string | undefined>,\n options: {\n scope?: KnowledgeScope;\n packageName?: string;\n } = {},\n): KnowledgePackage[] {\n const selected = new Set<KnowledgePackage>();\n const sdkNames = new Set(\n selectedPackages.flatMap((pkg) => pkg.sdkDependencies),\n );\n const text = texts.filter(Boolean).join('\\n').toLowerCase();\n const packageName = options.packageName?.toLowerCase();\n\n for (const sdk of index.sdkPackages) {\n const selectedDependency = sdkNames.has(sdk.name);\n if (!scopeAllowsSdkPackage(sdk, options.scope, selectedDependency))\n continue;\n const shortName = sdk.name.replace('@happyvertical/', '');\n if (\n options.scope === 'sdk' ||\n selectedDependency ||\n (packageName && packageMatches(sdk, packageName)) ||\n text.includes(sdk.name.toLowerCase()) ||\n includesToken(text, shortName)\n ) {\n selected.add(sdk);\n }\n }\n\n if (selected.size === 0 && !(packageName && selectedPackages.length === 0)) {\n for (const name of [\n '@happyvertical/ai',\n '@happyvertical/sql',\n '@happyvertical/files',\n '@happyvertical/utils',\n ]) {\n const sdk = index.sdkPackages.find(\n (item) =>\n item.name === name &&\n scopeAllowsSdkPackage(item, options.scope, false),\n );\n if (sdk) selected.add(sdk);\n }\n }\n\n return [...selected].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction scopeAllowsSdkPackage(\n pkg: KnowledgePackage,\n scope: KnowledgeScope | undefined,\n selectedDependency: boolean,\n): boolean {\n switch (scope) {\n case 'installed':\n return pkg.isInstalledDependency;\n case 'local':\n case 'package':\n return !pkg.isInstalledDependency || selectedDependency;\n case 'sdk':\n case 'project':\n case undefined:\n return true;\n }\n}\n\nfunction domainPackages(index: SmrtKnowledgeIndex): KnowledgePackage[] {\n return index.packages.filter((pkg) => pkg.kind !== 'sdk');\n}\n\nfunction scopeAllowsPackage(\n pkg: KnowledgePackage,\n scope: KnowledgeScope | undefined,\n): boolean {\n switch (scope) {\n case 'sdk':\n return false;\n case 'installed':\n return pkg.isInstalledDependency;\n case 'local':\n return (\n !pkg.isInstalledDependency &&\n !pkg.relativeDirectory.includes('node_modules')\n );\n case 'package':\n return !pkg.isInstalledDependency;\n case 'project':\n case undefined:\n return true;\n }\n}\n\nfunction packageMatches(pkg: KnowledgePackage, query: string): boolean {\n const normalized = query.toLowerCase();\n const shortName = pkg.name\n .replace('@happyvertical/smrt-', '')\n .replace('@happyvertical/', '');\n return (\n pkg.name.toLowerCase() === normalized ||\n pkg.name.toLowerCase().includes(normalized) ||\n shortName.toLowerCase() === normalized ||\n pkg.relativeDirectory.toLowerCase().endsWith(`/${normalized}`)\n );\n}\n\nfunction packageSpecialistSourceFiles(\n rootDir: string,\n pkg: KnowledgePackage,\n): string[] {\n const sourceFiles = new Set<string>();\n const addIfExists = (relativePath: string) => {\n if (existsSync(join(rootDir, relativePath))) {\n sourceFiles.add(relativePath);\n }\n };\n\n addIfExists(join(pkg.relativeDirectory, 'package.json'));\n addIfExists(join(pkg.relativeDirectory, 'README.md'));\n addIfExists(join(pkg.relativeDirectory, 'AGENTS.md'));\n addIfExists(join(pkg.relativeDirectory, 'CHANGELOG.md'));\n\n if (pkg.domainKnowledgePath) {\n sourceFiles.add(pkg.domainKnowledgePath);\n }\n if (pkg.manifestPath) {\n sourceFiles.add(pkg.manifestPath);\n }\n\n for (const prompt of pkg.prompts) {\n sourceFiles.add(prompt.filePath);\n }\n\n const packageFiles = existsSync(pkg.directory)\n ? walkFiles(pkg.directory)\n : [];\n for (const filePath of packageFiles) {\n const relativeFilePath = relative(rootDir, filePath);\n if (isPackageSpecialistSource(relativeFilePath)) {\n sourceFiles.add(relativeFilePath);\n }\n }\n\n return [...sourceFiles].sort().slice(0, 120);\n}\n\nfunction isPackageSpecialistSource(relativeFilePath: string): boolean {\n return (\n relativeFilePath.endsWith('/src/workbench.ts') ||\n relativeFilePath.endsWith('/src/playground.ts') ||\n relativeFilePath.endsWith('/src/route-module.ts') ||\n relativeFilePath.includes('/src/svelte/playground') ||\n relativeFilePath.includes('/src/svelte/routes/') ||\n relativeFilePath.includes('/src/routes/') ||\n relativeFilePath.includes('/src/prompts/') ||\n /\\.test\\.[cm]?ts$/.test(relativeFilePath) ||\n /\\.spec\\.[cm]?ts$/.test(relativeFilePath)\n );\n}\n\nfunction buildPromptBundle(options: {\n title: string;\n task: string;\n index: SmrtKnowledgeIndex;\n packages: KnowledgePackage[];\n sdkPackages: KnowledgePackage[];\n sourceFiles: string[];\n extraContext?: string;\n detail?: KnowledgeDetail;\n moduleDocHints?: ModuleDocHints;\n}): KnowledgePromptBundle {\n const detail = options.detail ?? 'summary';\n const render = (pkg: KnowledgePackage) =>\n renderPackageContext(pkg, options.moduleDocHints, detail);\n const contextMarkdown = [\n `# ${options.title}`,\n '',\n `Baseline root: ${options.index.rootDir}`,\n '',\n // A caller must see a discovery failure before any of the context below,\n // because zeroed metrics otherwise read as a real answer (#2143).\n ...renderDiagnosticsSection(options.index.diagnostics),\n '## Task',\n '',\n options.task,\n '',\n '## Relationships-v2 Summary',\n '',\n JSON.stringify(options.index.relationshipsV2, null, 2),\n '',\n '## Selected SMRT Packages',\n '',\n ...options.packages.map(render),\n '',\n '## Selected SDK Packages',\n '',\n ...options.sdkPackages.map(render),\n '',\n options.extraContext ? `## Extra Context\\n\\n${options.extraContext}\\n` : '',\n ];\n\n return {\n title: options.title,\n instructions: [\n 'Use the supplied SMRT knowledge context as source material. Return concrete findings or architecture guidance with package names and source references. Do not assume model-provider access.',\n detail === 'summary'\n ? 'Authored package docs are listed by path rather than embedded; read the ones you need, or re-request with detail: \"full\".'\n : '',\n ]\n .filter(Boolean)\n .join(' '),\n contextMarkdown: contextMarkdown.join('\\n'),\n selectedPackages: options.packages.map((pkg) => pkg.name),\n selectedSdkPackages: options.sdkPackages.map((pkg) => pkg.name),\n sourceFiles: options.sourceFiles,\n };\n}\n\nfunction renderDiagnosticsSection(\n diagnostics: KnowledgeDiagnostic[],\n): string[] {\n if (diagnostics.length === 0) return [];\n const lines = ['## Diagnostics', ''];\n for (const diagnostic of diagnostics) {\n lines.push(\n `- [${diagnostic.severity.toUpperCase()}] ${diagnostic.code}: ${diagnostic.message}`,\n );\n if (diagnostic.checkedPaths && diagnostic.checkedPaths.length > 0) {\n lines.push(` - checked: ${diagnostic.checkedPaths.join(', ')}`);\n }\n if (diagnostic.remedy) lines.push(` - remedy: ${diagnostic.remedy}`);\n }\n lines.push('');\n return lines;\n}\n\n/**\n * Which of a package's module docs to embed for this request (#2108).\n *\n * The moved prose is unregenerable, so the DEFAULT is to embed everything —\n * dropping a doc must never be the silent outcome. Hints only NARROW: when the\n * changed files or the focus/idea text point at specific modules, the rest are\n * still listed by path so an agent can open them on demand. If hints exist but\n * match nothing, fall open and embed all.\n */\nfunction selectModuleDocs(\n pkg: KnowledgePackage,\n hints: ModuleDocHints | undefined,\n): { embedded: KnowledgeModuleDoc[]; scoped: boolean } {\n const all = pkg.moduleDocs;\n if (all.length === 0) return { embedded: [], scoped: false };\n\n // A workspace-root package has no directory prefix, so every changed path is\n // already package-relative (#2143).\n const prefix = pkg.relativeDirectory ? `${pkg.relativeDirectory}/` : '';\n const packageFiles = (hints?.changedFiles ?? []).filter(\n (file) => file === pkg.relativeDirectory || file.startsWith(prefix),\n );\n const text = hints?.text ?? '';\n if (packageFiles.length === 0 && text.trim() === '') {\n return { embedded: all, scoped: false };\n }\n\n const matched = all.filter((doc) => {\n // A doc is relevant when its module name appears as a path segment of a\n // changed file (`src/commissions/...` -> `agents/commissions.md`), when the\n // doc itself changed, or when the request text names the module.\n const segment = new RegExp(`(^|[/.])${escapeRegExp(doc.module)}([/.]|$)`);\n return (\n packageFiles.some(\n (file) =>\n segment.test(file.slice(prefix.length)) ||\n file === packageRelativePath(pkg, doc.path),\n ) || includesToken(text, doc.module)\n );\n });\n\n return matched.length > 0\n ? { embedded: matched, scoped: true }\n : { embedded: all, scoped: false };\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction renderPackageContext(\n pkg: KnowledgePackage,\n hints?: ModuleDocHints,\n detail: KnowledgeDetail = 'full',\n): string {\n const { embedded, scoped } = selectModuleDocs(pkg, hints);\n const lines = [\n `### ${pkg.name}`,\n '',\n `- version: ${pkg.version}`,\n `- kind: ${pkg.kind}`,\n `- directory: ${pkg.relativeDirectory}`,\n `- domain knowledge: ${pkg.domainKnowledgePath ?? '(manifest fallback)'}`,\n `- object source: ${pkg.objectSource}${pkg.objectSourceReason ? ` (${pkg.objectSourceReason})` : ''}`,\n `- docs: ${[pkg.docSource ?? '(none)', ...pkg.moduleDocs.map((doc) => doc.path)].join(', ')}`,\n `- relationship features: ${pkg.relationshipFeatures.join(', ') || '(none)'}`,\n `- SDK deps: ${pkg.sdkDependencies.join(', ') || '(none)'}`,\n `- exports: ${pkg.exportKeys.join(', ') || '(none)'}`,\n `- MCP tools: ${\n pkg.mcpTools\n .slice(0, 20)\n .map((tool) => tool.name)\n .join(', ') || '(none)'\n }`,\n `- objects: ${pkg.objects\n .slice(0, 20)\n .map((object) => object.qualifiedName ?? object.className)\n .join(', ')}`,\n ];\n if (pkg.objects.length > 20) {\n lines.push(`- object count: ${pkg.objects.length}`);\n }\n\n // Summary mode lists authored prose by path instead of embedding it, which is\n // what keeps a large project's bundle inside tool-result budgets (#2143).\n if (detail === 'summary') {\n const docPaths = packageDocPaths(pkg);\n if (docPaths.length > 0) {\n lines.push(\n '',\n `> Authored docs not embedded (read on demand, or re-request with detail: \"full\"): ${docPaths.join(', ')}`,\n );\n }\n lines.push('');\n return lines.join('\\n');\n }\n\n const structuralFacts = renderObjectStructuralFacts(pkg.objects);\n if (structuralFacts.length > 0) {\n lines.push('', '#### Object structural facts', '', ...structuralFacts);\n }\n\n if (pkg.agentDoc) {\n lines.push('', pkg.agentDoc.trim());\n }\n for (const doc of embedded) {\n lines.push('', `#### ${packageRelativePath(pkg, doc.path)}`, '');\n lines.push(doc.content.trim());\n }\n if (scoped) {\n const omitted = pkg.moduleDocs.filter((doc) => !embedded.includes(doc));\n if (omitted.length > 0) {\n lines.push(\n '',\n `> Module docs not loaded for this request (read on demand): ${omitted\n .map((doc) => packageRelativePath(pkg, doc.path))\n .join(', ')}`,\n );\n }\n }\n lines.push('');\n return lines.join('\\n');\n}\n\nfunction renderObjectStructuralFacts(objects: KnowledgeObject[]): string[] {\n const lines: string[] = [];\n for (const object of objects) {\n const objectFacts = [\n object.tenant\n ? object.tenant.scoped\n ? `tenant ${object.tenant.mode ?? 'required'}${object.tenant.field ? ` via ${object.tenant.field}` : ''}`\n : 'tenant unscoped'\n : undefined,\n object.tableStrategy\n ? `table strategy ${object.tableStrategy}`\n : undefined,\n object.conflictColumns && object.conflictColumns.length > 0\n ? `conflict columns ${object.conflictColumns.join(', ')}`\n : undefined,\n ].filter((fact): fact is string => Boolean(fact));\n const structuralFields = object.fields.filter(\n (field) =>\n Object.hasOwn(field, 'default') ||\n field.constraints !== undefined ||\n field.readonly === true ||\n field.transient === true,\n );\n const signatures = object.methodSignatures ?? [];\n if (\n objectFacts.length === 0 &&\n structuralFields.length === 0 &&\n signatures.length === 0\n ) {\n continue;\n }\n\n lines.push(\n `- ${object.qualifiedName ?? object.className}${objectFacts.length > 0 ? ` — ${objectFacts.join('; ')}` : ''}`,\n );\n for (const field of structuralFields) {\n const facts = [\n Object.hasOwn(field, 'default')\n ? `default ${renderKnowledgeValue(field.default)}`\n : undefined,\n field.constraints\n ? `constraints ${Object.entries(field.constraints)\n .map(([key, value]) => `${key}=${renderKnowledgeValue(value)}`)\n .join(', ')}`\n : undefined,\n field.readonly ? 'readonly' : undefined,\n field.transient ? 'transient' : undefined,\n ].filter((fact): fact is string => Boolean(fact));\n lines.push(\n ` - field ${field.name}: ${field.type} (${facts.join('; ')})`,\n );\n }\n for (const signature of signatures) {\n const prefix = [\n signature.static ? 'static' : '',\n signature.async ? 'async' : '',\n ]\n .filter(Boolean)\n .join(' ');\n lines.push(\n ` - method ${prefix ? `${prefix} ` : ''}${signature.name}(${(signature.params ?? []).join(', ')})${signature.returns ? `: ${signature.returns}` : ''}`,\n );\n }\n }\n return lines;\n}\n\nfunction renderKnowledgeValue(value: unknown): string {\n const rendered = JSON.stringify(value);\n if (rendered === undefined) return String(value);\n return rendered.length > 120 ? `${rendered.slice(0, 117)}...` : rendered;\n}\n\nfunction getChangedFiles(rootDir: string, base?: string): string[] {\n if (base) {\n try {\n const output = execFileSync(\n 'git',\n ['diff', '--name-only', `${base}...HEAD`],\n {\n cwd: rootDir,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n },\n );\n const files = output\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean);\n if (files.length > 0) return files;\n } catch {\n // Fall back to working-tree changes below.\n }\n }\n\n try {\n const output = execFileSync('git', ['diff', '--name-only'], {\n cwd: rootDir,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n const cachedOutput = execFileSync(\n 'git',\n ['diff', '--cached', '--name-only'],\n {\n cwd: rootDir,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n },\n );\n return uniqueStrings(\n [output, cachedOutput].flatMap((value) =>\n value\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean),\n ),\n );\n } catch {\n return [];\n }\n}\n\nfunction dedupePackages(packages: KnowledgePackage[]): KnowledgePackage[] {\n const byName = new Map<string, KnowledgePackage>();\n for (const pkg of packages) {\n const current = byName.get(pkg.name);\n if (!current || current.kind === 'sdk') {\n byName.set(pkg.name, pkg);\n }\n }\n return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction includesToken(text: string, token: string): boolean {\n const escaped = token.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`\\\\b${escaped}\\\\b`, 'i').test(text);\n}\n\nfunction readJson(path: string): unknown {\n if (!existsSync(path)) return null;\n try {\n return JSON.parse(readFileSync(path, 'utf8'));\n } catch {\n return null;\n }\n}\n\nfunction hashFile(path: string): string {\n return createHash('sha256').update(readFileSync(path, 'utf8')).digest('hex');\n}\n\nfunction hashJsonFile(path: string): string {\n const content = readJson(path);\n const hashContent = content\n ? stableJson(normalizeJsonForHash(content))\n : readFileSync(path, 'utf8');\n return createHash('sha256').update(hashContent).digest('hex');\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, entry] of Object.entries(objectRecord(value))) {\n if (typeof entry === 'string') result[key] = entry;\n }\n return result;\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === 'string')\n : [];\n}\n\nfunction camelToSnake(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values)].sort();\n}\n\nfunction normalizeJsonForHash(value: unknown): unknown {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return value;\n }\n\n const normalized = { ...(value as Record<string, unknown>) };\n delete normalized.timestamp;\n return normalized;\n}\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(sortJson(value), null, 2);\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson);\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, entry]) => [key, sortJson(entry)]),\n );\n }\n return value;\n}\n"],"mappings":"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"}
package/dist/knowledge.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as checkKnowledgeFreshness, c as packageDocPaths, d as smrtArchitecture, f as smrtReview, i as buildReviewContext, l as renderFreshnessResult, n as buildKnowledgeIndex, o as checkKnowledgeFreshnessFromIndex, r as buildPackageSpecialistContext, s as diffKnowledgeIndex, t as buildArchitectureContext, u as renderKnowledgeIndexMarkdown } from "./knowledge-L22wrifG.js";
1
+ import { a as checkKnowledgeFreshness, c as packageDocPaths, d as smrtArchitecture, f as smrtReview, i as buildReviewContext, l as renderFreshnessResult, n as buildKnowledgeIndex, o as checkKnowledgeFreshnessFromIndex, r as buildPackageSpecialistContext, s as diffKnowledgeIndex, t as buildArchitectureContext, u as renderKnowledgeIndexMarkdown } from "./knowledge-CLGmlHl6.js";
2
2
  export { buildArchitectureContext, buildKnowledgeIndex, buildPackageSpecialistContext, buildReviewContext, checkKnowledgeFreshness, checkKnowledgeFreshnessFromIndex, diffKnowledgeIndex, packageDocPaths, renderFreshnessResult, renderKnowledgeIndexMarkdown, smrtArchitecture, smrtReview };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-dev-mcp",
3
- "version": "0.40.70",
3
+ "version": "0.42.0",
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",
@@ -44,9 +44,9 @@
44
44
  "license": "MIT",
45
45
  "dependencies": {
46
46
  "@modelcontextprotocol/server": "2.0.0",
47
- "@happyvertical/smrt-core": "0.40.70",
48
- "@happyvertical/smrt-scanner": "0.40.70",
49
- "@happyvertical/smrt-types": "0.40.70"
47
+ "@happyvertical/smrt-core": "0.42.0",
48
+ "@happyvertical/smrt-scanner": "0.42.0",
49
+ "@happyvertical/smrt-types": "0.42.0"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@modelcontextprotocol/client": "2.0.0",