@happyvertical/smrt-dev-mcp 0.60.10 → 0.60.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -135,7 +135,11 @@ Skill-aware harnesses can parse the frontmatter; other harnesses can ignore it.
135
135
  Agents should fetch it with `get-agent-skill`, then call `build-context` (`task: review`) for
136
136
  deterministic context, inspect the actual diff, and produce a findings-first
137
137
  review.
138
+ - `skills/smrt-catalog/SKILL.md` — catalog router skill (#4708), installed into consumers by `smrt docs:agents`.
139
+ - `skills/smrt-contribute/SKILL.md` — contributor skill (#4709) for forks of this repository; an identical copy is
140
+ checked in at the root `.agents/skills/smrt-contribute/SKILL.md` and a test fails on drift.
138
141
 
142
+ Trigger evals, the registry and install contract, and the drift rule: [agents/agent-skills.md](agents/agent-skills.md).
139
143
 
140
144
  ## Project runtime prerequisite
141
145
 
@@ -196,6 +200,8 @@ when `dist` is missing or older, so rebuild `dist` after server edits. Guarded b
196
200
  - `src/agent-skills.ts` — bundled skill registry and file loader
197
201
  - `plugin.json` / `mcp.json` — Agent Plugins 1.0.0 portable root manifests
198
202
  - `skills/smrt-code-review/SKILL.md` — downstream SMRT review procedure
203
+ - `skills/smrt-contribute/SKILL.md` — contributor skill (copy at repo-root `.agents/skills/smrt-contribute/`)
204
+ - `skills/smrt-catalog/SKILL.md` — catalog router skill; `skills/smrt-catalog/evals.json` — its trigger eval set
199
205
  - `src/tools/generate-smrt-class.ts` — class generation logic and package-ready templates
200
206
  - `src/tools/introspect-project.ts` — manifest-first project scanning, falling back to `@happyvertical/smrt-scanner`
201
207
  - `src/dev-plane.ts` — in-app runtime dev-plane (#2782): `createDevPlane({ token, projectRoot, db })` serves JSON + MCP on one mount with loopback/bearer guards and a positive catalog (`registry-live` + the nine runtime tools); mounted by the generated `_dev/[...tool]` SvelteKit route
@@ -0,0 +1,16 @@
1
+ # Agent skills: catalog and contribute
2
+
3
+ - `skills/smrt-catalog/SKILL.md` — router skill (#4708). Fires before infrastructure, utility, or integration
4
+ code in a project that depends on smrt packages; reads `.agents/smrt-knowledge/intents/index.md`, the intent
5
+ page, then the component page, proposes the smrt package and entry point before code, falls back to
6
+ `build-context` when the bundle is missing or stale, and drafts an upstream issue plus a marked temporary shim
7
+ when the home package lacks the behaviour. The description is the design: `skills/smrt-catalog/evals.json`
8
+ holds the positive/negative trigger prompts and `src/agent-skills.test.ts` asserts every positive signal class
9
+ is named. `smrt docs:agents` installs it into consumers (`./agent-skills` export: `getAgentSkill`,
10
+ `getAgentSkillsPackageVersion`).
11
+ - `skills/smrt-contribute/SKILL.md` — contributor skill (#4709): `CONTRIBUTING.md` as a fork-PR procedure with the
12
+ traps that fail from outside (package-name test filter, format then lint, generated knowledge pages, PR title
13
+ ≤92, no changesets, `.github/` guard, fork CI approval). It deliberately omits the maintainer lifecycle.
14
+ The repository root checks in an identical copy at `.agents/skills/smrt-contribute/SKILL.md` so a harness
15
+ opening a checkout finds it without the MCP server; `src/agent-skills.test.ts` fails when they drift, so edit
16
+ both together. Trigger evals: `skills/smrt-contribute/evals.json`.
@@ -11,6 +11,8 @@ export interface AgentSkillBundle extends AgentSkillSummary {
11
11
  content: string;
12
12
  }>;
13
13
  }
14
+ /** Version of the smrt-dev-mcp package that ships these skills. */
15
+ export declare function getAgentSkillsPackageVersion(): string;
14
16
  export declare function listAgentSkills(): AgentSkillSummary[];
15
17
  export declare function getAgentSkill(options: {
16
18
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-skills.d.ts","sourceRoot":"","sources":["../src/agent-skills.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,KAAK,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAiBD,wBAAgB,eAAe,IAAI,iBAAiB,EAAE,CAErD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,gBAAgB,CAoBnB"}
1
+ {"version":3,"file":"agent-skills.d.ts","sourceRoot":"","sources":["../src/agent-skills.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,KAAK,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAiCD,mEAAmE;AACnE,wBAAgB,4BAA4B,IAAI,MAAM,CAKrD;AAED,wBAAgB,eAAe,IAAI,iBAAiB,EAAE,CAErD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,gBAAgB,CAoBnB"}
@@ -0,0 +1,61 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ //#region src/agent-skills.ts
5
+ var AGENT_SKILLS = [
6
+ {
7
+ name: "smrt-code-review",
8
+ description: "Harness-agnostic downstream SMRT code review workflow using smrt-dev-mcp deterministic context and prompt bundles.",
9
+ path: "skills/smrt-code-review/SKILL.md",
10
+ skillFile: "skills/smrt-code-review/SKILL.md",
11
+ references: ["skills/smrt-code-review/references/review-output.md"]
12
+ },
13
+ {
14
+ name: "smrt-catalog",
15
+ description: "Router skill: before writing infrastructure, utility, or integration code in a project that depends on smrt packages, consult the smrt knowledge catalog and reuse the installed package.",
16
+ path: "skills/smrt-catalog/SKILL.md",
17
+ skillFile: "skills/smrt-catalog/SKILL.md",
18
+ references: []
19
+ },
20
+ {
21
+ name: "smrt-contribute",
22
+ description: "Contributor skill: the fork pull-request procedure for happyvertical/smrt (CONTRIBUTING.md as steps) for agents working in a fork or clone that is not a maintainer session.",
23
+ path: "skills/smrt-contribute/SKILL.md",
24
+ skillFile: "skills/smrt-contribute/SKILL.md",
25
+ references: []
26
+ }
27
+ ];
28
+ /** Version of the smrt-dev-mcp package that ships these skills. */
29
+ function getAgentSkillsPackageVersion() {
30
+ return JSON.parse(readPackageFile("package.json")).version ?? "0.0.0";
31
+ }
32
+ function listAgentSkills() {
33
+ return AGENT_SKILLS.map(({ skillFile: _skillFile, ...skill }) => skill);
34
+ }
35
+ function getAgentSkill(options) {
36
+ const skill = AGENT_SKILLS.find((item) => item.name === options.name);
37
+ if (!skill) throw new Error(`Unknown agent skill: ${options.name}`);
38
+ return {
39
+ name: skill.name,
40
+ description: skill.description,
41
+ path: skill.path,
42
+ references: skill.references,
43
+ skillMarkdown: readPackageFile(skill.skillFile),
44
+ referenceFiles: options.includeReferences === false ? [] : skill.references.map((path) => ({
45
+ path,
46
+ content: readPackageFile(path)
47
+ }))
48
+ };
49
+ }
50
+ function readPackageFile(relativePath) {
51
+ return readFileSync(join(resolvePackageRoot(), relativePath), "utf8");
52
+ }
53
+ function resolvePackageRoot() {
54
+ const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
55
+ if (!existsSync(join(packageRoot, "package.json"))) throw new Error(`Unable to resolve smrt-dev-mcp package root from ${import.meta.url}`);
56
+ return packageRoot;
57
+ }
58
+ //#endregion
59
+ export { getAgentSkill, getAgentSkillsPackageVersion, listAgentSkills };
60
+
61
+ //# sourceMappingURL=agent-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-skills.js","names":[],"sources":["../src/agent-skills.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface AgentSkillSummary {\n name: string;\n description: string;\n path: string;\n references: string[];\n}\n\nexport interface AgentSkillBundle extends AgentSkillSummary {\n skillMarkdown: string;\n referenceFiles: Array<{\n path: string;\n content: string;\n }>;\n}\n\ninterface AgentSkillDefinition extends AgentSkillSummary {\n skillFile: string;\n}\n\nconst AGENT_SKILLS: AgentSkillDefinition[] = [\n {\n name: 'smrt-code-review',\n description:\n 'Harness-agnostic downstream SMRT code review workflow using smrt-dev-mcp deterministic context and prompt bundles.',\n path: 'skills/smrt-code-review/SKILL.md',\n skillFile: 'skills/smrt-code-review/SKILL.md',\n references: ['skills/smrt-code-review/references/review-output.md'],\n },\n {\n name: 'smrt-catalog',\n description:\n 'Router skill: before writing infrastructure, utility, or integration code in a project that depends on smrt packages, consult the smrt knowledge catalog and reuse the installed package.',\n path: 'skills/smrt-catalog/SKILL.md',\n skillFile: 'skills/smrt-catalog/SKILL.md',\n references: [],\n },\n {\n name: 'smrt-contribute',\n description:\n 'Contributor skill: the fork pull-request procedure for happyvertical/smrt (CONTRIBUTING.md as steps) for agents working in a fork or clone that is not a maintainer session.',\n path: 'skills/smrt-contribute/SKILL.md',\n skillFile: 'skills/smrt-contribute/SKILL.md',\n references: [],\n },\n];\n\n/** Version of the smrt-dev-mcp package that ships these skills. */\nexport function getAgentSkillsPackageVersion(): string {\n const manifest = JSON.parse(readPackageFile('package.json')) as {\n version?: string;\n };\n return manifest.version ?? '0.0.0';\n}\n\nexport function listAgentSkills(): AgentSkillSummary[] {\n return AGENT_SKILLS.map(({ skillFile: _skillFile, ...skill }) => skill);\n}\n\nexport function getAgentSkill(options: {\n name: string;\n includeReferences?: boolean;\n}): AgentSkillBundle {\n const skill = AGENT_SKILLS.find((item) => item.name === options.name);\n if (!skill) {\n throw new Error(`Unknown agent skill: ${options.name}`);\n }\n\n return {\n name: skill.name,\n description: skill.description,\n path: skill.path,\n references: skill.references,\n skillMarkdown: readPackageFile(skill.skillFile),\n referenceFiles:\n options.includeReferences === false\n ? []\n : skill.references.map((path) => ({\n path,\n content: readPackageFile(path),\n })),\n };\n}\n\nfunction readPackageFile(relativePath: string): string {\n const packageRoot = resolvePackageRoot();\n return readFileSync(join(packageRoot, relativePath), 'utf8');\n}\n\nfunction resolvePackageRoot(): string {\n // Works in both source tests (`src/agent-skills.ts`) and built packages\n // (`dist/agent-skills.js`); guard it so packaging layout drift fails clearly.\n const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));\n if (!existsSync(join(packageRoot, 'package.json'))) {\n throw new Error(\n `Unable to resolve smrt-dev-mcp package root from ${import.meta.url}`,\n );\n }\n return packageRoot;\n}\n"],"mappings":";;;;AAuBA,IAAM,eAAuC;CAC3C;EACE,MAAM;EACN,aACE;EACF,MAAM;EACN,WAAW;EACX,YAAY,CAAC,qDAAqD;CACpE;CACA;EACE,MAAM;EACN,aACE;EACF,MAAM;EACN,WAAW;EACX,YAAY,CAAC;CACf;CACA;EACE,MAAM;EACN,aACE;EACF,MAAM;EACN,WAAW;EACX,YAAY,CAAC;CACf;AACF;;AAGA,SAAgB,+BAAuC;CAIrD,OAHiB,KAAK,MAAM,gBAAgB,cAAc,CAGnD,CAAA,CAAS,WAAW;AAC7B;AAEA,SAAgB,kBAAuC;CACrD,OAAO,aAAa,KAAK,EAAE,WAAW,YAAY,GAAG,YAAY,KAAK;AACxE;AAEA,SAAgB,cAAc,SAGT;CACnB,MAAM,QAAQ,aAAa,MAAM,SAAS,KAAK,SAAS,QAAQ,IAAI;CACpE,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,wBAAwB,QAAQ,MAAM;CAGxD,OAAO;EACL,MAAM,MAAM;EACZ,aAAa,MAAM;EACnB,MAAM,MAAM;EACZ,YAAY,MAAM;EAClB,eAAe,gBAAgB,MAAM,SAAS;EAC9C,gBACE,QAAQ,sBAAsB,QAC1B,CAAC,IACD,MAAM,WAAW,KAAK,UAAU;GAC9B;GACA,SAAS,gBAAgB,IAAI;EAC/B,EAAE;CACV;AACF;AAEA,SAAS,gBAAgB,cAA8B;CAErD,OAAO,aAAa,KADA,mBACK,GAAa,YAAY,GAAG,MAAM;AAC7D;AAEA,SAAS,qBAA6B;CAGpC,MAAM,cAAc,QAAQ,QAAQ,cAAc,OAAO,KAAK,GAAG,CAAC,CAAC;CACnE,IAAI,CAAC,WAAW,KAAK,aAAa,cAAc,CAAC,GAC/C,MAAM,IAAI,MACR,oDAAoD,OAAO,KAAK,KAClE;CAEF,OAAO;AACT"}
package/dist/index.js CHANGED
@@ -1,49 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { f as redactConnectionString, m as ProjectRuntimeResolutionError } from "./tools-B0uaPTz0.js";
3
+ import { getAgentSkill, listAgentSkills } from "./agent-skills.js";
3
4
  import { i as SERVER_VERSION, n as startRuntimeHttpHost, r as SERVER_NAME } from "./http-BqKiyqgN.js";
4
5
  import { n as TOOLS, t as REVIEW_SKILL_NAME } from "./tool-catalog-BhnSCF8g.js";
5
6
  import { a as buildReviewContext, c as compactContextResult, i as buildPackageSpecialistContext, n as buildContext, o as checkKnowledgeFreshness, r as buildKnowledgeIndex, s as checkKnowledgeFreshnessFromIndex, t as buildArchitectureContext } from "./knowledge-DUiMUjEg.js";
6
7
  import { t as reviewSmrtProject } from "./review-smrt-project-ByEwPcor.js";
7
- import { existsSync, readFileSync, realpathSync } from "node:fs";
8
- import { dirname, join } from "node:path";
8
+ import { realpathSync } from "node:fs";
9
9
  import { fileURLToPath, pathToFileURL } from "node:url";
10
10
  import { ProtocolError, ProtocolErrorCode, Server } from "@modelcontextprotocol/server";
11
11
  import { serveStdio } from "@modelcontextprotocol/server/stdio";
12
- //#region src/agent-skills.ts
13
- var AGENT_SKILLS = [{
14
- name: "smrt-code-review",
15
- description: "Harness-agnostic downstream SMRT code review workflow using smrt-dev-mcp deterministic context and prompt bundles.",
16
- path: "skills/smrt-code-review/SKILL.md",
17
- skillFile: "skills/smrt-code-review/SKILL.md",
18
- references: ["skills/smrt-code-review/references/review-output.md"]
19
- }];
20
- function listAgentSkills() {
21
- return AGENT_SKILLS.map(({ skillFile: _skillFile, ...skill }) => skill);
22
- }
23
- function getAgentSkill(options) {
24
- const skill = AGENT_SKILLS.find((item) => item.name === options.name);
25
- if (!skill) throw new Error(`Unknown agent skill: ${options.name}`);
26
- return {
27
- name: skill.name,
28
- description: skill.description,
29
- path: skill.path,
30
- references: skill.references,
31
- skillMarkdown: readPackageFile(skill.skillFile),
32
- referenceFiles: options.includeReferences === false ? [] : skill.references.map((path) => ({
33
- path,
34
- content: readPackageFile(path)
35
- }))
36
- };
37
- }
38
- function readPackageFile(relativePath) {
39
- return readFileSync(join(resolvePackageRoot(), relativePath), "utf8");
40
- }
41
- function resolvePackageRoot() {
42
- const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
43
- if (!existsSync(join(packageRoot, "package.json"))) throw new Error(`Unable to resolve smrt-dev-mcp package root from ${import.meta.url}`);
44
- return packageRoot;
45
- }
46
- //#endregion
47
12
  //#region src/tools/generate-smrt-class.ts
48
13
  var TYPE_MAPPING = {
49
14
  text: {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/agent-skills.ts","../src/tools/generate-smrt-class.ts","../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface AgentSkillSummary {\n name: string;\n description: string;\n path: string;\n references: string[];\n}\n\nexport interface AgentSkillBundle extends AgentSkillSummary {\n skillMarkdown: string;\n referenceFiles: Array<{\n path: string;\n content: string;\n }>;\n}\n\ninterface AgentSkillDefinition extends AgentSkillSummary {\n skillFile: string;\n}\n\nconst AGENT_SKILLS: AgentSkillDefinition[] = [\n {\n name: 'smrt-code-review',\n description:\n 'Harness-agnostic downstream SMRT code review workflow using smrt-dev-mcp deterministic context and prompt bundles.',\n path: 'skills/smrt-code-review/SKILL.md',\n skillFile: 'skills/smrt-code-review/SKILL.md',\n references: ['skills/smrt-code-review/references/review-output.md'],\n },\n];\n\nexport function listAgentSkills(): AgentSkillSummary[] {\n return AGENT_SKILLS.map(({ skillFile: _skillFile, ...skill }) => skill);\n}\n\nexport function getAgentSkill(options: {\n name: string;\n includeReferences?: boolean;\n}): AgentSkillBundle {\n const skill = AGENT_SKILLS.find((item) => item.name === options.name);\n if (!skill) {\n throw new Error(`Unknown agent skill: ${options.name}`);\n }\n\n return {\n name: skill.name,\n description: skill.description,\n path: skill.path,\n references: skill.references,\n skillMarkdown: readPackageFile(skill.skillFile),\n referenceFiles:\n options.includeReferences === false\n ? []\n : skill.references.map((path) => ({\n path,\n content: readPackageFile(path),\n })),\n };\n}\n\nfunction readPackageFile(relativePath: string): string {\n const packageRoot = resolvePackageRoot();\n return readFileSync(join(packageRoot, relativePath), 'utf8');\n}\n\nfunction resolvePackageRoot(): string {\n // Works in both source tests (`src/agent-skills.ts`) and built packages\n // (`dist/agent-skills.js`); guard it so packaging layout drift fails clearly.\n const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));\n if (!existsSync(join(packageRoot, 'package.json'))) {\n throw new Error(\n `Unable to resolve smrt-dev-mcp package root from ${import.meta.url}`,\n );\n }\n return packageRoot;\n}\n","/**\n * Generate SMRT Class Tool\n * Creates a package-ready SMRT class using current object-package patterns.\n */\n\ntype PropertyType =\n | 'text'\n | 'integer'\n | 'decimal'\n | 'boolean'\n | 'datetime'\n | 'json';\ntype BaseClass = 'SmrtObject' | 'SmrtCollection';\ntype TemplateVariant =\n | 'basic'\n | 'global-catalog'\n | 'optional-catalog'\n | 'tenant-project-object'\n | 'tenant-event-log-object'\n | 'cross-package-reference';\ntype RelationshipType =\n | 'foreignKey'\n | 'crossPackageRef'\n | 'oneToMany'\n | 'manyToMany';\n\ninterface PropertyDefinition {\n name: string;\n type: PropertyType;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n defaultValue?: unknown;\n}\n\ninterface RelationshipDefinition {\n name: string;\n type: RelationshipType;\n related: string;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n validate?: boolean;\n foreignKey?: string;\n through?: string;\n sourceKey?: string;\n targetKey?: string;\n}\n\ninterface TenantScopedDefinition {\n mode?: 'required' | 'optional';\n field?: string;\n autoFilter?: boolean;\n autoPopulate?: boolean;\n allowSuperAdminBypass?: boolean;\n}\n\ninterface GenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass?: BaseClass;\n template?: TemplateVariant;\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: boolean | TenantScopedDefinition;\n includeTenantIdField?: boolean;\n relationships?: RelationshipDefinition[];\n includeApiConfig?: boolean;\n includeMcpConfig?: boolean;\n includeCliConfig?: boolean;\n includeCompanionSnippets?: boolean;\n}\n\ninterface NormalizedGenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass: BaseClass;\n template: TemplateVariant;\n tableName?: string;\n conflictColumns: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField: boolean;\n relationships: RelationshipDefinition[];\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n includeCompanionSnippets: boolean;\n}\n\nconst TYPE_MAPPING: Record<\n PropertyType,\n { tsType: string; defaultValue: string }\n> = {\n text: { tsType: 'string', defaultValue: \"''\" },\n integer: { tsType: 'number', defaultValue: '0' },\n decimal: { tsType: 'number', defaultValue: '0.0' },\n boolean: { tsType: 'boolean', defaultValue: 'false' },\n datetime: { tsType: 'Date', defaultValue: 'new Date()' },\n json: { tsType: 'any', defaultValue: '{}' },\n};\n\nexport async function generateSmrtClass(\n args: GenerateSmrtClassArgs,\n): Promise<string> {\n const normalized = normalizeArgs(args);\n const {\n className,\n properties,\n relationships,\n baseClass,\n tableName,\n conflictColumns,\n tenantScoped,\n includeTenantIdField,\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n includeCompanionSnippets,\n } = normalized;\n\n const coreImports = new Set<string>([baseClass, 'smrt']);\n if (needsFieldDecorator(properties)) coreImports.add('field');\n for (const relationship of relationships) {\n coreImports.add(relationship.type);\n }\n\n const imports = [\n `import { ${Array.from(coreImports).join(', ')} } from '@happyvertical/smrt-core';`,\n ];\n\n if (tenantScoped) {\n const tenancyImports = ['TenantScoped'];\n if (includeTenantIdField) tenancyImports.push('tenantId');\n imports.push(\n `import { ${tenancyImports.join(', ')} } from '@happyvertical/smrt-tenancy';`,\n );\n }\n\n const decoratorLines = [\n ...(tenantScoped\n ? [`@TenantScoped(${renderObjectLiteral({ ...tenantScoped })})`]\n : []),\n renderSmrtDecorator({\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n tableName,\n conflictColumns,\n }),\n ];\n\n const classMembers = [\n ...(includeTenantIdField && tenantScoped\n ? [renderTenantIdField(tenantScoped)]\n : []),\n ...properties.map(renderProperty),\n ...relationships.map(renderRelationship),\n ].filter(Boolean);\n\n const companionSnippets = includeCompanionSnippets\n ? `\\n${renderCompanionSnippets(className, Boolean(tenantScoped))}`\n : '';\n\n return `${imports.join('\\n')}\n\n${decoratorLines.join('\\n')}\nexport class ${className} extends ${baseClass} {\n${classMembers.join('\\n\\n')}\n\n constructor(options: any = {}) {\n super(options);\n Object.assign(this, options);\n }\n}\n${companionSnippets}`;\n}\n\nfunction normalizeArgs(\n args: GenerateSmrtClassArgs,\n): NormalizedGenerateSmrtClassArgs {\n const template = args.template ?? 'basic';\n const templateDefaults = defaultsForTemplate(template);\n const tenantScoped =\n args.tenantScoped === true\n ? (templateDefaults.tenantScoped ?? { mode: 'required' as const })\n : args.tenantScoped === false\n ? undefined\n : (args.tenantScoped ?? templateDefaults.tenantScoped);\n\n return {\n className: args.className,\n properties: args.properties,\n baseClass: args.baseClass ?? 'SmrtObject',\n template,\n tableName: args.tableName ?? templateDefaults.tableName,\n conflictColumns:\n args.conflictColumns ?? templateDefaults.conflictColumns ?? [],\n tenantScoped: normalizeTenantScoped(tenantScoped),\n includeTenantIdField:\n args.includeTenantIdField ??\n templateDefaults.includeTenantIdField ??\n Boolean(tenantScoped),\n relationships: args.relationships ?? [],\n includeApiConfig: args.includeApiConfig ?? true,\n includeMcpConfig: args.includeMcpConfig ?? true,\n includeCliConfig: args.includeCliConfig ?? true,\n includeCompanionSnippets: args.includeCompanionSnippets ?? false,\n };\n}\n\nfunction defaultsForTemplate(template: TemplateVariant): {\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField?: boolean;\n} {\n switch (template) {\n case 'optional-catalog':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n conflictColumns: ['tenant_id', 'slug'],\n };\n case 'tenant-project-object':\n return {\n tenantScoped: { mode: 'required' },\n includeTenantIdField: true,\n };\n case 'tenant-event-log-object':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n };\n case 'global-catalog':\n return { conflictColumns: ['slug'] };\n case 'cross-package-reference':\n case 'basic':\n return {};\n }\n}\n\nfunction normalizeTenantScoped(\n value: boolean | TenantScopedDefinition | undefined,\n): TenantScopedDefinition | undefined {\n if (!value) return undefined;\n return {\n mode: typeof value === 'object' ? (value.mode ?? 'required') : 'required',\n field: typeof value === 'object' ? (value.field ?? 'tenantId') : 'tenantId',\n autoFilter: typeof value === 'object' ? value.autoFilter : undefined,\n autoPopulate: typeof value === 'object' ? value.autoPopulate : undefined,\n allowSuperAdminBypass:\n typeof value === 'object' ? value.allowSuperAdminBypass : undefined,\n };\n}\n\nfunction renderSmrtDecorator(options: {\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n tableName?: string;\n conflictColumns: string[];\n}): string {\n const decoratorConfig: Record<string, unknown> = {};\n\n if (options.tableName) {\n decoratorConfig.tableName = options.tableName;\n }\n\n if (options.conflictColumns.length > 0) {\n decoratorConfig.conflictColumns = options.conflictColumns;\n }\n\n if (options.includeApiConfig) {\n decoratorConfig.api = {\n include: ['list', 'get', 'create', 'update'],\n exclude: ['delete'],\n };\n }\n\n if (options.includeMcpConfig) {\n decoratorConfig.mcp = {\n include: ['list', 'get'],\n };\n }\n\n if (options.includeCliConfig) {\n decoratorConfig.cli = true;\n }\n\n return Object.keys(decoratorConfig).length > 0\n ? `@smrt(${JSON.stringify(decoratorConfig, null, 2)})`\n : '@smrt()';\n}\n\nfunction renderTenantIdField(tenantScoped: TenantScopedDefinition): string {\n const nullable = tenantScoped.mode === 'optional';\n const field = tenantScoped.field ?? 'tenantId';\n return nullable\n ? ` @tenantId({ nullable: true })\\n ${field}: string | null = null;`\n : ` @tenantId()\\n ${field}: string = '';`;\n}\n\nfunction renderProperty(prop: PropertyDefinition): string {\n const mapping = TYPE_MAPPING[prop.type];\n const nullable = prop.nullable === true;\n const tsType = nullable ? `${mapping.tsType} | null` : mapping.tsType;\n const defaultValue =\n prop.defaultValue !== undefined\n ? renderLiteral(prop.defaultValue)\n : nullable\n ? 'null'\n : mapping.defaultValue;\n const fieldOptions = compactObject({\n required: prop.required,\n nullable: prop.nullable,\n description: prop.description,\n });\n const jsdoc = prop.description ? ` /** ${prop.description} */\\n` : '';\n const decorator =\n Object.keys(fieldOptions).length > 0\n ? ` @field(${JSON.stringify(fieldOptions)})\\n`\n : '';\n\n return `${jsdoc}${decorator} ${prop.name}: ${tsType} = ${defaultValue};`;\n}\n\nfunction renderRelationship(relationship: RelationshipDefinition): string {\n const options = compactObject({\n required: relationship.required,\n nullable: relationship.nullable,\n description: relationship.description,\n validate: relationship.validate,\n foreignKey: relationship.foreignKey,\n through: relationship.through,\n sourceKey: relationship.sourceKey,\n targetKey: relationship.targetKey,\n });\n const args = [\n renderLiteral(relationship.related),\n ...(Object.keys(options).length > 0 ? [JSON.stringify(options)] : []),\n ];\n const decorator = `@${relationship.type}(${args.join(', ')})`;\n const fieldType =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? 'unknown[]'\n : relationship.nullable\n ? 'string | null'\n : 'string';\n const defaultValue =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? '[]'\n : relationship.nullable\n ? 'null'\n : \"''\";\n\n return ` ${decorator}\\n ${relationship.name}: ${fieldType} = ${defaultValue};`;\n}\n\nfunction needsFieldDecorator(properties: PropertyDefinition[]): boolean {\n return properties.some(\n (property) =>\n property.required !== undefined ||\n property.nullable !== undefined ||\n property.description !== undefined,\n );\n}\n\nfunction renderCompanionSnippets(\n className: string,\n usesTenantScoped: boolean,\n): string {\n const dependencyNote = usesTenantScoped\n ? `\\n * - Ensure package.json declares \"@happyvertical/smrt-tenancy\".`\n : '';\n return `/*\n * Package wiring:\n * - Export ${className} from the package entrypoint used by consumers.\n * - Import this module from any package registration file that eagerly loads objects.${dependencyNote}\n */`;\n}\n\nfunction renderObjectLiteral(value: Record<string, unknown>): string {\n return JSON.stringify(compactObject(value), null, 2);\n}\n\nfunction renderLiteral(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (value === null) return 'null';\n return JSON.stringify(value, null, 2);\n}\n\nfunction compactObject<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n","import { ProjectRuntimeResolutionError } from './tools/runtime/project-runtime.js';\n/**\n * SMRT Development MCP Server\n * Provides code generation, project introspection, knowledge context,\n * review/architecture prompt bundles, and portable agent skills.\n */\n\nimport { realpathSync } from 'node:fs';\n\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport {\n ProtocolError,\n ProtocolErrorCode,\n Server,\n} from '@modelcontextprotocol/server';\nimport { serveStdio } from '@modelcontextprotocol/server/stdio';\nimport { getAgentSkill, listAgentSkills } from './agent-skills.js';\nimport { startRuntimeHttpHost } from './http.js';\nimport {\n buildArchitectureContext,\n buildContext,\n buildKnowledgeIndex,\n buildPackageSpecialistContext,\n buildReviewContext,\n checkKnowledgeFreshness,\n checkKnowledgeFreshnessFromIndex,\n compactContextResult,\n} from './knowledge/index.js';\nimport { SERVER_NAME, SERVER_VERSION } from './server-info.js';\nimport { REVIEW_SKILL_NAME, TOOLS } from './tool-catalog.js';\nimport { generateSmrtClass } from './tools/generate-smrt-class.js';\nimport { reviewSmrtProject } from './tools/review-smrt-project.js';\nimport { redactConnectionString } from './tools/runtime/connection.js';\n\nexport { SERVER_VERSION } from './server-info.js';\nexport { TOOLS } from './tool-catalog.js';\n\nconst DEBUG = process.env.DEBUG === 'true';\nconst REVIEW_SKILL_URI = `smrt-dev-mcp://agent-skills/${REVIEW_SKILL_NAME}`;\nconst DOMAIN_CODE_REVIEW_PROMPT = 'domain-code-review';\nconst DOMAIN_ARCHITECTURE_PROMPT = 'domain-architecture';\nconst KNOWLEDGE_PROJECT_URI = 'smrt://knowledge/project';\nconst KNOWLEDGE_PACKAGE_PREFIX = 'smrt://knowledge/package/';\nconst DEPLOY_STATIC_CATALOG_CACHE_HINT = {\n ttlMs: 86_400_000,\n cacheScope: 'private' as const,\n};\n// Knowledge resources are rebuilt from the workspace on every request. There\n// is no transport-visible project-graph invalidation signal, so a nonzero TTL\n// would promise stale data could not be served after an edit.\nconst LIVE_KNOWLEDGE_CACHE_HINT = {\n ttlMs: 0,\n cacheScope: 'private' as const,\n};\nconst WORKBENCH_PROJECT_URI = 'smrt://workbench/project';\nconst WORKBENCH_PACKAGE_PREFIX = 'smrt://workbench/package/';\nconst WORKBENCH_SPECIALIST_SUFFIX = '/specialist';\n\ntype KnowledgeIndexResult = Awaited<ReturnType<typeof buildKnowledgeIndex>>;\ntype KnowledgePackageResult = KnowledgeIndexResult['packages'][number];\ntype PackageSpecialistResult = Awaited<\n ReturnType<typeof buildPackageSpecialistContext>\n>;\ntype PromptArguments = Record<string, string> | undefined;\n\nexport function createServer(): Server {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Starting server v${SERVER_VERSION}`);\n }\n\n const server = new Server(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n {\n capabilities: {\n prompts: {},\n resources: {},\n tools: {},\n },\n cacheHints: {\n 'tools/list': DEPLOY_STATIC_CATALOG_CACHE_HINT,\n 'prompts/list': DEPLOY_STATIC_CATALOG_CACHE_HINT,\n 'resources/list': LIVE_KNOWLEDGE_CACHE_HINT,\n 'resources/read': LIVE_KNOWLEDGE_CACHE_HINT,\n },\n },\n );\n\n // List tools handler\n server.setRequestHandler('tools/list', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] ListTools request`);\n }\n return { tools: TOOLS };\n });\n\n server.setRequestHandler('prompts/list', async () => {\n return {\n prompts: [\n {\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review',\n description:\n 'Harness-agnostic downstream SMRT review procedure that uses smrt-dev-mcp deterministic context and prompt bundles.',\n },\n {\n name: DOMAIN_CODE_REVIEW_PROMPT,\n title: 'Domain Code Review',\n description:\n 'Model-ready domain-scoped SMRT code review prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'changedFiles',\n description:\n 'Changed file paths as newline-separated, comma-separated, or JSON array text.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Review focus text.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'scope',\n description:\n 'Knowledge scope: project, local, package, sdk, or installed.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n {\n name: DOMAIN_ARCHITECTURE_PROMPT,\n title: 'Domain Architecture',\n description:\n 'Model-ready domain-scoped SMRT architecture planning prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'idea',\n description: 'Architecture idea or product concept.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Planning focus text.',\n required: false,\n },\n {\n name: 'scope',\n description:\n 'Knowledge scope: project, local, package, sdk, or installed.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n ],\n };\n });\n\n server.setRequestHandler('prompts/get', async (request) => {\n const { name } = request.params;\n if (name === REVIEW_SKILL_NAME) {\n return {\n description:\n 'Use this procedure when reviewing downstream SMRT projects.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_CODE_REVIEW_PROMPT) {\n const context = await buildReviewContext(\n reviewPromptArguments(request.params.arguments),\n );\n return {\n description: 'Review downstream SMRT code with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_ARCHITECTURE_PROMPT) {\n const context = await buildArchitectureContext(\n architecturePromptArguments(request.params.arguments),\n );\n return {\n description: 'Plan a downstream SMRT project with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown prompt: ${name}`,\n );\n });\n\n server.setRequestHandler('resources/list', async () => {\n const index = await buildKnowledgeIndex();\n return {\n resources: [\n {\n uri: REVIEW_SKILL_URI,\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review Skill',\n description:\n 'Bundled Markdown skill for downstream SMRT code reviews.',\n mimeType: 'text/markdown',\n },\n {\n uri: KNOWLEDGE_PROJECT_URI,\n name: 'smrt-domain-knowledge-project',\n title: 'SMRT Domain Knowledge Project Index',\n description:\n 'Composed SMRT, downstream domain, and HappyVertical SDK knowledge index.',\n mimeType: 'application/json',\n },\n {\n uri: WORKBENCH_PROJECT_URI,\n name: 'smrt-workbench-project',\n title: 'SMRT Workbench Project',\n description:\n 'Workbench-facing package and knowledge resource index for the current project.',\n mimeType: 'application/json',\n },\n ...index.packages.map((pkg) => ({\n uri: `${KNOWLEDGE_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n name: `smrt-domain-knowledge-${pkg.name}`,\n title: `SMRT Domain Knowledge: ${pkg.name}`,\n description:\n 'Package-scoped SMRT domain knowledge, generated surfaces, and authored context.',\n mimeType: 'application/json',\n })),\n ...index.packages\n .filter((pkg) => pkg.kind !== 'sdk')\n .flatMap((pkg) => [\n {\n uri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n name: `smrt-workbench-${pkg.name}`,\n title: `SMRT Workbench Package: ${pkg.name}`,\n description:\n 'Workbench package resource with docs, manifest, knowledge, scripts, and surface metadata.',\n mimeType: 'application/json',\n },\n {\n uri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n name: `smrt-workbench-specialist-${pkg.name}`,\n title: `SMRT Package Specialist: ${pkg.name}`,\n description:\n 'Deterministic package specialist prompt bundle and source list.',\n mimeType: 'application/json',\n },\n ]),\n ],\n };\n });\n\n server.setRequestHandler('resources/read', async (request) => {\n const { uri } = request.params;\n if (uri === REVIEW_SKILL_URI) {\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n ],\n };\n }\n\n if (uri === KNOWLEDGE_PROJECT_URI) {\n const index = await buildKnowledgeIndex();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgeIndex(index), null, 2),\n },\n ],\n };\n }\n\n if (uri === WORKBENCH_PROJECT_URI) {\n const index = await buildKnowledgeIndex();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n project: sanitizeKnowledgeIndex(index),\n workbenchResources: index.packages\n .filter((pkg) => pkg.kind !== 'sdk')\n .map((pkg) => ({\n packageName: pkg.name,\n packageUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n specialistUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n })),\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (\n uri.startsWith(WORKBENCH_PACKAGE_PREFIX) &&\n uri.endsWith(WORKBENCH_SPECIALIST_SUFFIX)\n ) {\n const packageName = decodeURIComponent(\n uri.slice(\n WORKBENCH_PACKAGE_PREFIX.length,\n -WORKBENCH_SPECIALIST_SUFFIX.length,\n ),\n );\n const specialist = await buildPackageSpecialistContext({\n package: packageName,\n });\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n sanitizePackageSpecialist(specialist),\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (uri.startsWith(WORKBENCH_PACKAGE_PREFIX)) {\n const packageName = decodeURIComponent(\n uri.slice(WORKBENCH_PACKAGE_PREFIX.length),\n );\n const index = await buildKnowledgeIndex();\n const pkg = index.packages.find((item) => item.name === packageName);\n if (!pkg) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown workbench package: ${packageName}`,\n );\n }\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n package: sanitizeKnowledgePackage(pkg),\n specialistUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (uri.startsWith(KNOWLEDGE_PACKAGE_PREFIX)) {\n const packageName = decodeURIComponent(\n uri.slice(KNOWLEDGE_PACKAGE_PREFIX.length),\n );\n const index = await buildKnowledgeIndex();\n const pkg = index.packages.find((item) => item.name === packageName);\n if (!pkg) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown knowledge package: ${packageName}`,\n );\n }\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgePackage(pkg), null, 2),\n },\n ],\n };\n }\n\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown resource: ${uri}`,\n );\n });\n\n // Call tool handler\n server.setRequestHandler('tools/call', async (request) => {\n const { name, arguments: args } = request.params;\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] CallTool: ${name}`);\n console.error(\n `[${SERVER_NAME}] Arguments:`,\n JSON.stringify(redactDebugArguments(args), null, 2),\n );\n }\n\n try {\n let result: string;\n\n switch (name) {\n case 'generate-smrt-class':\n result = await generateSmrtClass(\n args as unknown as Parameters<typeof generateSmrtClass>[0],\n );\n break;\n\n case 'introspect-project':\n result = await (\n await import('./tools/introspect-project.js')\n ).introspectProject(args as never);\n break;\n\n case 'review-smrt-project':\n result = await reviewSmrtProject(\n args as unknown as Parameters<typeof reviewSmrtProject>[0],\n );\n break;\n\n case 'reflect-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'reflect-domain-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n domainKnowledgePackageCount: index.packages.filter(\n (pkg) => pkg.hasDomainKnowledge,\n ).length,\n missingDomainKnowledgePackages: index.packages\n .filter(\n (pkg) =>\n pkg.exportKeys.includes('./smrt-knowledge.json') &&\n !pkg.hasDomainKnowledge,\n )\n .map((pkg) => pkg.name),\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'check-knowledge-freshness':\n result = JSON.stringify(\n await checkKnowledgeFreshness(\n args as unknown as Parameters<typeof checkKnowledgeFreshness>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'build-context':\n result = JSON.stringify(\n compactContextResult(\n await buildContext(\n args as unknown as Parameters<typeof buildContext>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'smrt-review':\n case 'smrt-architecture': {\n // One-release compatibility names for build-context (#2780).\n const task = name === 'smrt-review' ? 'review' : 'architecture';\n const context = compactContextResult(\n await buildContext({\n ...(args as Record<string, unknown>),\n task,\n } as unknown as Parameters<typeof buildContext>[0]),\n detailArg(args),\n ) as Record<string, unknown> & { diagnostics?: unknown[] };\n context.diagnostics = [\n ...(Array.isArray(context.diagnostics) ? context.diagnostics : []),\n {\n severity: 'info',\n code: 'deprecated_tool_name',\n message: `${name} is a compatibility name; call build-context with task: '${task}'. It will be removed in the next minor release.`,\n },\n ];\n result = JSON.stringify(context, null, 2);\n break;\n }\n\n case 'build-package-specialist-context':\n result = JSON.stringify(\n sanitizePackageSpecialist(\n await buildPackageSpecialistContext(\n args as unknown as Parameters<\n typeof buildPackageSpecialistContext\n >[0],\n ),\n ),\n null,\n 2,\n );\n break;\n\n case 'list-agent-skills':\n result = JSON.stringify({ skills: listAgentSkills() }, null, 2);\n break;\n\n case 'get-agent-skill':\n result = JSON.stringify(\n await getAgentSkill(\n args as unknown as Parameters<typeof getAgentSkill>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'migration-status':\n case 'job-health':\n case 'schedule-health':\n case 'dispatch-health':\n case 'recent-changes':\n case 'registry-drift': {\n const runtime = await import('./tools/runtime/tools.js');\n const handlers = {\n 'migration-status': runtime.runtimeMigrationStatus,\n 'job-health': runtime.runtimeJobHealth,\n 'schedule-health': runtime.runtimeScheduleHealth,\n 'dispatch-health': runtime.runtimeDispatchHealth,\n 'recent-changes': runtime.runtimeRecentChanges,\n 'registry-drift': runtime.runtimeRegistryDrift,\n };\n result = JSON.stringify(await handlers[name](args as never), null, 2);\n break;\n }\n\n case 'runtime-registry':\n case 'runtime-object':\n case 'runtime-schema-diff': {\n const observation = await import('./tools/runtime/observation.js');\n const handlers = {\n 'runtime-registry': observation.runtimeRegistry,\n 'runtime-object': observation.runtimeObject,\n 'runtime-schema-diff': observation.runtimeSchemaDiff,\n };\n result = JSON.stringify(await handlers[name](args as never), null, 2);\n break;\n }\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: result,\n },\n ],\n structuredContent: toDevToolStructuredContent(result),\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n console.error(`[${SERVER_NAME}] Error:`, error);\n\n return {\n content: [\n {\n type: 'text',\n text: `Error executing tool ${name}: ${errorMessage}`,\n },\n ],\n isError: true,\n structuredContent: {\n ok: false,\n coverage: null,\n diagnostics: [\n {\n severity: 'error',\n ...(error instanceof ProjectRuntimeResolutionError\n ? { code: error.code }\n : {}),\n message: errorMessage,\n },\n ],\n data: null,\n },\n };\n }\n });\n\n return server;\n}\n\nasync function main() {\n const handle = serveStdio(() => createServer(), {\n onerror: (error) =>\n console.error(`[${SERVER_NAME}] Protocol error:`, error),\n });\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Server connected via stdio`);\n }\n\n // Graceful shutdown\n process.on('SIGINT', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await handle.close();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await handle.close();\n process.exit(0);\n });\n}\n\nfunction isEntrypoint(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(entry);\n } catch {\n return import.meta.url === pathToFileURL(entry).href;\n }\n}\n\nfunction renderAgentSkillMarkdown(name: string): string {\n const skill = getAgentSkill({ name, includeReferences: true });\n const references = skill.referenceFiles.map(\n (file) => `## Reference: ${file.path}\\n\\n${file.content.trim()}`,\n );\n return [skill.skillMarkdown.trim(), ...references].join('\\n\\n');\n}\n\nfunction reviewPromptArguments(args: PromptArguments): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n changedFiles: parseStringList(args?.changedFiles),\n focus: args?.focus,\n documentation: args?.documentation,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction architecturePromptArguments(\n args: PromptArguments,\n): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n idea: args?.idea,\n documentation: args?.documentation,\n focus: args?.focus,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction parseStringList(value: string | undefined): string[] | undefined {\n if (!value?.trim()) return undefined;\n\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return parsed.filter((item): item is string => typeof item === 'string');\n }\n } catch {\n // Fall through to delimiter parsing.\n }\n\n return value\n .split(/[\\n,]/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction compactRecord(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n );\n}\n\nfunction sanitizeKnowledgeIndex(index: KnowledgeIndexResult) {\n const packages = index.packages.map((pkg) => sanitizeKnowledgePackage(pkg));\n return {\n ...index,\n rootDir: '.',\n packages,\n smrtPackages: packages.filter((pkg) => pkg.kind === 'smrt'),\n sdkPackages: packages.filter((pkg) => pkg.kind === 'sdk'),\n // Rebuilt from the sanitized list rather than carried over by the spread.\n // Installed dependencies live outside the project root, so theirs are the\n // absolute host paths this projection exists to strip (#2275).\n installedPackages: packages.filter((pkg) => pkg.isInstalledDependency),\n };\n}\n\nfunction detailArg(args: unknown): string | undefined {\n const detail = (args as Record<string, unknown> | undefined)?.detail;\n return typeof detail === 'string' ? detail : undefined;\n}\n\n/**\n * Debug logging happens before any tool runs its own redaction, so a\n * credential-bearing `dbUrl` argument must be masked here.\n */\nfunction redactDebugArguments(args: unknown): unknown {\n if (!isRecord(args) || typeof args.dbUrl !== 'string') return args;\n return { ...args, dbUrl: redactConnectionString(args.dbUrl) };\n}\n\nfunction isRuntimeEnvelope(value: unknown): value is {\n ok: boolean;\n coverage: unknown;\n diagnostics: unknown[];\n data: unknown;\n} {\n return (\n isRecord(value) &&\n typeof value.ok === 'boolean' &&\n 'coverage' in value &&\n Array.isArray(value.diagnostics) &&\n 'data' in value\n );\n}\n\nfunction toDevToolStructuredContent(result: string) {\n let data: unknown = result;\n try {\n data = JSON.parse(result);\n } catch {\n // `generate-smrt-class` intentionally returns source text, not JSON.\n }\n\n // Runtime diagnostics tools already return the `{ok, coverage, diagnostics,\n // data}` envelope; re-wrapping would expose `data.data.*` in\n // structuredContent while the text response exposes `data.*`.\n if (isRuntimeEnvelope(data)) {\n return data;\n }\n\n const source = isRecord(data) ? data : undefined;\n const coverage = isRecord(source?.coverage) ? source.coverage : null;\n const diagnostics = Array.isArray(source?.diagnostics)\n ? source.diagnostics.filter(isRecord)\n : [];\n return { ok: true, coverage, diagnostics, data };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction sanitizeKnowledgePackage(pkg: KnowledgePackageResult) {\n const { directory: _directory, objects, checkedObjectPaths, ...rest } = pkg;\n return {\n ...rest,\n // Paths outside the workspace root stay absolute in the index; redact them\n // here the same way object file paths are redacted.\n checkedObjectPaths: checkedObjectPaths.map(\n (path) => sanitizePath(path) ?? path,\n ),\n objects: objects.map((object) => ({\n ...object,\n filePath: sanitizePath(object.filePath),\n })),\n };\n}\n\nfunction sanitizePackageSpecialist(specialist: PackageSpecialistResult) {\n return {\n selectedPackage: sanitizeKnowledgePackage(specialist.selectedPackage),\n selectedSdkPackages: specialist.selectedSdkPackages.map((pkg) =>\n sanitizeKnowledgePackage(pkg),\n ),\n promptBundle: {\n ...specialist.promptBundle,\n contextMarkdown: specialist.promptBundle.contextMarkdown.replace(\n /^Baseline root: .+$/m,\n 'Baseline root: .',\n ),\n sourceFiles: sanitizePaths(specialist.promptBundle.sourceFiles),\n },\n sourceFiles: sanitizePaths(specialist.sourceFiles),\n };\n}\n\nfunction sanitizePaths(paths: string[]): string[] {\n return paths\n .map(sanitizePath)\n .filter((path): path is string => typeof path === 'string');\n}\n\nfunction sanitizePath(path: string | undefined): string | undefined {\n if (!path) return path;\n if (path.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(path)) {\n return '<absolute-path>';\n }\n return path;\n}\n\n/**\n * `smrt-dev-mcp --http [--port N] [--project DIR]` starts the Level 2 runtime\n * dev-plane host (#1831) instead of the stdio server. Loopback-only, bearer\n * protected, positive read-only catalog; see `http.ts`.\n */\nexport function parseHttpCliArgs(argv: readonly string[]): {\n http: boolean;\n port?: number;\n projectRoot?: string;\n} {\n const result: { http: boolean; port?: number; projectRoot?: string } = {\n http: false,\n };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === '--http') result.http = true;\n else if (arg === '--port') {\n const value = Number.parseInt(argv[index + 1] ?? '', 10);\n if (!Number.isInteger(value) || value < 0 || value > 65535) {\n throw new Error('--port requires an integer between 0 and 65535');\n }\n result.port = value;\n index += 1;\n } else if (arg === '--project') {\n const value = argv[index + 1];\n if (!value) throw new Error('--project requires a directory');\n result.projectRoot = value;\n index += 1;\n }\n }\n return result;\n}\n\nasync function mainHttp(cli: ReturnType<typeof parseHttpCliArgs>) {\n const host = await startRuntimeHttpHost({\n port: cli.port,\n projectRoot: cli.projectRoot,\n });\n // The token is printed exactly once, to stderr, only when this process\n // minted it; a token supplied via SMRT_DEV_MCP_TOKEN is never echoed.\n const minted = !process.env.SMRT_DEV_MCP_TOKEN?.trim();\n console.error(\n `[${SERVER_NAME}] runtime dev-plane listening at ${host.url} (${host.boot.objectCount} booted objects, ${host.boot.manifests.length} manifests)`,\n );\n if (minted) {\n console.error(`[${SERVER_NAME}] bearer token: ${host.token}`);\n }\n const shutdown = async () => {\n await host.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\nif (isEntrypoint()) {\n if (process.argv[2] === 'review') {\n // `smrt-dev-mcp review ...`: one-shot advisory review for CI (#4690).\n import('./tools/review-cli.js')\n .then(({ runReviewCli }) => runReviewCli(process.argv.slice(3)))\n .then((code) => {\n process.exitCode = code;\n })\n .catch((error) => {\n console.error(`[${SERVER_NAME}] review failed:`, error);\n process.exit(1);\n });\n } else {\n const cli = parseHttpCliArgs(process.argv.slice(2));\n (cli.http ? mainHttp(cli) : main()).catch((error) => {\n console.error(`[${SERVER_NAME}] Fatal error:`, error);\n process.exit(1);\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/tools/generate-smrt-class.ts","../src/index.ts"],"sourcesContent":["/**\n * Generate SMRT Class Tool\n * Creates a package-ready SMRT class using current object-package patterns.\n */\n\ntype PropertyType =\n | 'text'\n | 'integer'\n | 'decimal'\n | 'boolean'\n | 'datetime'\n | 'json';\ntype BaseClass = 'SmrtObject' | 'SmrtCollection';\ntype TemplateVariant =\n | 'basic'\n | 'global-catalog'\n | 'optional-catalog'\n | 'tenant-project-object'\n | 'tenant-event-log-object'\n | 'cross-package-reference';\ntype RelationshipType =\n | 'foreignKey'\n | 'crossPackageRef'\n | 'oneToMany'\n | 'manyToMany';\n\ninterface PropertyDefinition {\n name: string;\n type: PropertyType;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n defaultValue?: unknown;\n}\n\ninterface RelationshipDefinition {\n name: string;\n type: RelationshipType;\n related: string;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n validate?: boolean;\n foreignKey?: string;\n through?: string;\n sourceKey?: string;\n targetKey?: string;\n}\n\ninterface TenantScopedDefinition {\n mode?: 'required' | 'optional';\n field?: string;\n autoFilter?: boolean;\n autoPopulate?: boolean;\n allowSuperAdminBypass?: boolean;\n}\n\ninterface GenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass?: BaseClass;\n template?: TemplateVariant;\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: boolean | TenantScopedDefinition;\n includeTenantIdField?: boolean;\n relationships?: RelationshipDefinition[];\n includeApiConfig?: boolean;\n includeMcpConfig?: boolean;\n includeCliConfig?: boolean;\n includeCompanionSnippets?: boolean;\n}\n\ninterface NormalizedGenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass: BaseClass;\n template: TemplateVariant;\n tableName?: string;\n conflictColumns: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField: boolean;\n relationships: RelationshipDefinition[];\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n includeCompanionSnippets: boolean;\n}\n\nconst TYPE_MAPPING: Record<\n PropertyType,\n { tsType: string; defaultValue: string }\n> = {\n text: { tsType: 'string', defaultValue: \"''\" },\n integer: { tsType: 'number', defaultValue: '0' },\n decimal: { tsType: 'number', defaultValue: '0.0' },\n boolean: { tsType: 'boolean', defaultValue: 'false' },\n datetime: { tsType: 'Date', defaultValue: 'new Date()' },\n json: { tsType: 'any', defaultValue: '{}' },\n};\n\nexport async function generateSmrtClass(\n args: GenerateSmrtClassArgs,\n): Promise<string> {\n const normalized = normalizeArgs(args);\n const {\n className,\n properties,\n relationships,\n baseClass,\n tableName,\n conflictColumns,\n tenantScoped,\n includeTenantIdField,\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n includeCompanionSnippets,\n } = normalized;\n\n const coreImports = new Set<string>([baseClass, 'smrt']);\n if (needsFieldDecorator(properties)) coreImports.add('field');\n for (const relationship of relationships) {\n coreImports.add(relationship.type);\n }\n\n const imports = [\n `import { ${Array.from(coreImports).join(', ')} } from '@happyvertical/smrt-core';`,\n ];\n\n if (tenantScoped) {\n const tenancyImports = ['TenantScoped'];\n if (includeTenantIdField) tenancyImports.push('tenantId');\n imports.push(\n `import { ${tenancyImports.join(', ')} } from '@happyvertical/smrt-tenancy';`,\n );\n }\n\n const decoratorLines = [\n ...(tenantScoped\n ? [`@TenantScoped(${renderObjectLiteral({ ...tenantScoped })})`]\n : []),\n renderSmrtDecorator({\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n tableName,\n conflictColumns,\n }),\n ];\n\n const classMembers = [\n ...(includeTenantIdField && tenantScoped\n ? [renderTenantIdField(tenantScoped)]\n : []),\n ...properties.map(renderProperty),\n ...relationships.map(renderRelationship),\n ].filter(Boolean);\n\n const companionSnippets = includeCompanionSnippets\n ? `\\n${renderCompanionSnippets(className, Boolean(tenantScoped))}`\n : '';\n\n return `${imports.join('\\n')}\n\n${decoratorLines.join('\\n')}\nexport class ${className} extends ${baseClass} {\n${classMembers.join('\\n\\n')}\n\n constructor(options: any = {}) {\n super(options);\n Object.assign(this, options);\n }\n}\n${companionSnippets}`;\n}\n\nfunction normalizeArgs(\n args: GenerateSmrtClassArgs,\n): NormalizedGenerateSmrtClassArgs {\n const template = args.template ?? 'basic';\n const templateDefaults = defaultsForTemplate(template);\n const tenantScoped =\n args.tenantScoped === true\n ? (templateDefaults.tenantScoped ?? { mode: 'required' as const })\n : args.tenantScoped === false\n ? undefined\n : (args.tenantScoped ?? templateDefaults.tenantScoped);\n\n return {\n className: args.className,\n properties: args.properties,\n baseClass: args.baseClass ?? 'SmrtObject',\n template,\n tableName: args.tableName ?? templateDefaults.tableName,\n conflictColumns:\n args.conflictColumns ?? templateDefaults.conflictColumns ?? [],\n tenantScoped: normalizeTenantScoped(tenantScoped),\n includeTenantIdField:\n args.includeTenantIdField ??\n templateDefaults.includeTenantIdField ??\n Boolean(tenantScoped),\n relationships: args.relationships ?? [],\n includeApiConfig: args.includeApiConfig ?? true,\n includeMcpConfig: args.includeMcpConfig ?? true,\n includeCliConfig: args.includeCliConfig ?? true,\n includeCompanionSnippets: args.includeCompanionSnippets ?? false,\n };\n}\n\nfunction defaultsForTemplate(template: TemplateVariant): {\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField?: boolean;\n} {\n switch (template) {\n case 'optional-catalog':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n conflictColumns: ['tenant_id', 'slug'],\n };\n case 'tenant-project-object':\n return {\n tenantScoped: { mode: 'required' },\n includeTenantIdField: true,\n };\n case 'tenant-event-log-object':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n };\n case 'global-catalog':\n return { conflictColumns: ['slug'] };\n case 'cross-package-reference':\n case 'basic':\n return {};\n }\n}\n\nfunction normalizeTenantScoped(\n value: boolean | TenantScopedDefinition | undefined,\n): TenantScopedDefinition | undefined {\n if (!value) return undefined;\n return {\n mode: typeof value === 'object' ? (value.mode ?? 'required') : 'required',\n field: typeof value === 'object' ? (value.field ?? 'tenantId') : 'tenantId',\n autoFilter: typeof value === 'object' ? value.autoFilter : undefined,\n autoPopulate: typeof value === 'object' ? value.autoPopulate : undefined,\n allowSuperAdminBypass:\n typeof value === 'object' ? value.allowSuperAdminBypass : undefined,\n };\n}\n\nfunction renderSmrtDecorator(options: {\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n tableName?: string;\n conflictColumns: string[];\n}): string {\n const decoratorConfig: Record<string, unknown> = {};\n\n if (options.tableName) {\n decoratorConfig.tableName = options.tableName;\n }\n\n if (options.conflictColumns.length > 0) {\n decoratorConfig.conflictColumns = options.conflictColumns;\n }\n\n if (options.includeApiConfig) {\n decoratorConfig.api = {\n include: ['list', 'get', 'create', 'update'],\n exclude: ['delete'],\n };\n }\n\n if (options.includeMcpConfig) {\n decoratorConfig.mcp = {\n include: ['list', 'get'],\n };\n }\n\n if (options.includeCliConfig) {\n decoratorConfig.cli = true;\n }\n\n return Object.keys(decoratorConfig).length > 0\n ? `@smrt(${JSON.stringify(decoratorConfig, null, 2)})`\n : '@smrt()';\n}\n\nfunction renderTenantIdField(tenantScoped: TenantScopedDefinition): string {\n const nullable = tenantScoped.mode === 'optional';\n const field = tenantScoped.field ?? 'tenantId';\n return nullable\n ? ` @tenantId({ nullable: true })\\n ${field}: string | null = null;`\n : ` @tenantId()\\n ${field}: string = '';`;\n}\n\nfunction renderProperty(prop: PropertyDefinition): string {\n const mapping = TYPE_MAPPING[prop.type];\n const nullable = prop.nullable === true;\n const tsType = nullable ? `${mapping.tsType} | null` : mapping.tsType;\n const defaultValue =\n prop.defaultValue !== undefined\n ? renderLiteral(prop.defaultValue)\n : nullable\n ? 'null'\n : mapping.defaultValue;\n const fieldOptions = compactObject({\n required: prop.required,\n nullable: prop.nullable,\n description: prop.description,\n });\n const jsdoc = prop.description ? ` /** ${prop.description} */\\n` : '';\n const decorator =\n Object.keys(fieldOptions).length > 0\n ? ` @field(${JSON.stringify(fieldOptions)})\\n`\n : '';\n\n return `${jsdoc}${decorator} ${prop.name}: ${tsType} = ${defaultValue};`;\n}\n\nfunction renderRelationship(relationship: RelationshipDefinition): string {\n const options = compactObject({\n required: relationship.required,\n nullable: relationship.nullable,\n description: relationship.description,\n validate: relationship.validate,\n foreignKey: relationship.foreignKey,\n through: relationship.through,\n sourceKey: relationship.sourceKey,\n targetKey: relationship.targetKey,\n });\n const args = [\n renderLiteral(relationship.related),\n ...(Object.keys(options).length > 0 ? [JSON.stringify(options)] : []),\n ];\n const decorator = `@${relationship.type}(${args.join(', ')})`;\n const fieldType =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? 'unknown[]'\n : relationship.nullable\n ? 'string | null'\n : 'string';\n const defaultValue =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? '[]'\n : relationship.nullable\n ? 'null'\n : \"''\";\n\n return ` ${decorator}\\n ${relationship.name}: ${fieldType} = ${defaultValue};`;\n}\n\nfunction needsFieldDecorator(properties: PropertyDefinition[]): boolean {\n return properties.some(\n (property) =>\n property.required !== undefined ||\n property.nullable !== undefined ||\n property.description !== undefined,\n );\n}\n\nfunction renderCompanionSnippets(\n className: string,\n usesTenantScoped: boolean,\n): string {\n const dependencyNote = usesTenantScoped\n ? `\\n * - Ensure package.json declares \"@happyvertical/smrt-tenancy\".`\n : '';\n return `/*\n * Package wiring:\n * - Export ${className} from the package entrypoint used by consumers.\n * - Import this module from any package registration file that eagerly loads objects.${dependencyNote}\n */`;\n}\n\nfunction renderObjectLiteral(value: Record<string, unknown>): string {\n return JSON.stringify(compactObject(value), null, 2);\n}\n\nfunction renderLiteral(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (value === null) return 'null';\n return JSON.stringify(value, null, 2);\n}\n\nfunction compactObject<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n","import { ProjectRuntimeResolutionError } from './tools/runtime/project-runtime.js';\n/**\n * SMRT Development MCP Server\n * Provides code generation, project introspection, knowledge context,\n * review/architecture prompt bundles, and portable agent skills.\n */\n\nimport { realpathSync } from 'node:fs';\n\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport {\n ProtocolError,\n ProtocolErrorCode,\n Server,\n} from '@modelcontextprotocol/server';\nimport { serveStdio } from '@modelcontextprotocol/server/stdio';\nimport { getAgentSkill, listAgentSkills } from './agent-skills.js';\nimport { startRuntimeHttpHost } from './http.js';\nimport {\n buildArchitectureContext,\n buildContext,\n buildKnowledgeIndex,\n buildPackageSpecialistContext,\n buildReviewContext,\n checkKnowledgeFreshness,\n checkKnowledgeFreshnessFromIndex,\n compactContextResult,\n} from './knowledge/index.js';\nimport { SERVER_NAME, SERVER_VERSION } from './server-info.js';\nimport { REVIEW_SKILL_NAME, TOOLS } from './tool-catalog.js';\nimport { generateSmrtClass } from './tools/generate-smrt-class.js';\nimport { reviewSmrtProject } from './tools/review-smrt-project.js';\nimport { redactConnectionString } from './tools/runtime/connection.js';\n\nexport { SERVER_VERSION } from './server-info.js';\nexport { TOOLS } from './tool-catalog.js';\n\nconst DEBUG = process.env.DEBUG === 'true';\nconst REVIEW_SKILL_URI = `smrt-dev-mcp://agent-skills/${REVIEW_SKILL_NAME}`;\nconst DOMAIN_CODE_REVIEW_PROMPT = 'domain-code-review';\nconst DOMAIN_ARCHITECTURE_PROMPT = 'domain-architecture';\nconst KNOWLEDGE_PROJECT_URI = 'smrt://knowledge/project';\nconst KNOWLEDGE_PACKAGE_PREFIX = 'smrt://knowledge/package/';\nconst DEPLOY_STATIC_CATALOG_CACHE_HINT = {\n ttlMs: 86_400_000,\n cacheScope: 'private' as const,\n};\n// Knowledge resources are rebuilt from the workspace on every request. There\n// is no transport-visible project-graph invalidation signal, so a nonzero TTL\n// would promise stale data could not be served after an edit.\nconst LIVE_KNOWLEDGE_CACHE_HINT = {\n ttlMs: 0,\n cacheScope: 'private' as const,\n};\nconst WORKBENCH_PROJECT_URI = 'smrt://workbench/project';\nconst WORKBENCH_PACKAGE_PREFIX = 'smrt://workbench/package/';\nconst WORKBENCH_SPECIALIST_SUFFIX = '/specialist';\n\ntype KnowledgeIndexResult = Awaited<ReturnType<typeof buildKnowledgeIndex>>;\ntype KnowledgePackageResult = KnowledgeIndexResult['packages'][number];\ntype PackageSpecialistResult = Awaited<\n ReturnType<typeof buildPackageSpecialistContext>\n>;\ntype PromptArguments = Record<string, string> | undefined;\n\nexport function createServer(): Server {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Starting server v${SERVER_VERSION}`);\n }\n\n const server = new Server(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n {\n capabilities: {\n prompts: {},\n resources: {},\n tools: {},\n },\n cacheHints: {\n 'tools/list': DEPLOY_STATIC_CATALOG_CACHE_HINT,\n 'prompts/list': DEPLOY_STATIC_CATALOG_CACHE_HINT,\n 'resources/list': LIVE_KNOWLEDGE_CACHE_HINT,\n 'resources/read': LIVE_KNOWLEDGE_CACHE_HINT,\n },\n },\n );\n\n // List tools handler\n server.setRequestHandler('tools/list', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] ListTools request`);\n }\n return { tools: TOOLS };\n });\n\n server.setRequestHandler('prompts/list', async () => {\n return {\n prompts: [\n {\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review',\n description:\n 'Harness-agnostic downstream SMRT review procedure that uses smrt-dev-mcp deterministic context and prompt bundles.',\n },\n {\n name: DOMAIN_CODE_REVIEW_PROMPT,\n title: 'Domain Code Review',\n description:\n 'Model-ready domain-scoped SMRT code review prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'changedFiles',\n description:\n 'Changed file paths as newline-separated, comma-separated, or JSON array text.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Review focus text.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'scope',\n description:\n 'Knowledge scope: project, local, package, sdk, or installed.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n {\n name: DOMAIN_ARCHITECTURE_PROMPT,\n title: 'Domain Architecture',\n description:\n 'Model-ready domain-scoped SMRT architecture planning prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'idea',\n description: 'Architecture idea or product concept.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Planning focus text.',\n required: false,\n },\n {\n name: 'scope',\n description:\n 'Knowledge scope: project, local, package, sdk, or installed.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n ],\n };\n });\n\n server.setRequestHandler('prompts/get', async (request) => {\n const { name } = request.params;\n if (name === REVIEW_SKILL_NAME) {\n return {\n description:\n 'Use this procedure when reviewing downstream SMRT projects.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_CODE_REVIEW_PROMPT) {\n const context = await buildReviewContext(\n reviewPromptArguments(request.params.arguments),\n );\n return {\n description: 'Review downstream SMRT code with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_ARCHITECTURE_PROMPT) {\n const context = await buildArchitectureContext(\n architecturePromptArguments(request.params.arguments),\n );\n return {\n description: 'Plan a downstream SMRT project with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown prompt: ${name}`,\n );\n });\n\n server.setRequestHandler('resources/list', async () => {\n const index = await buildKnowledgeIndex();\n return {\n resources: [\n {\n uri: REVIEW_SKILL_URI,\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review Skill',\n description:\n 'Bundled Markdown skill for downstream SMRT code reviews.',\n mimeType: 'text/markdown',\n },\n {\n uri: KNOWLEDGE_PROJECT_URI,\n name: 'smrt-domain-knowledge-project',\n title: 'SMRT Domain Knowledge Project Index',\n description:\n 'Composed SMRT, downstream domain, and HappyVertical SDK knowledge index.',\n mimeType: 'application/json',\n },\n {\n uri: WORKBENCH_PROJECT_URI,\n name: 'smrt-workbench-project',\n title: 'SMRT Workbench Project',\n description:\n 'Workbench-facing package and knowledge resource index for the current project.',\n mimeType: 'application/json',\n },\n ...index.packages.map((pkg) => ({\n uri: `${KNOWLEDGE_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n name: `smrt-domain-knowledge-${pkg.name}`,\n title: `SMRT Domain Knowledge: ${pkg.name}`,\n description:\n 'Package-scoped SMRT domain knowledge, generated surfaces, and authored context.',\n mimeType: 'application/json',\n })),\n ...index.packages\n .filter((pkg) => pkg.kind !== 'sdk')\n .flatMap((pkg) => [\n {\n uri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n name: `smrt-workbench-${pkg.name}`,\n title: `SMRT Workbench Package: ${pkg.name}`,\n description:\n 'Workbench package resource with docs, manifest, knowledge, scripts, and surface metadata.',\n mimeType: 'application/json',\n },\n {\n uri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n name: `smrt-workbench-specialist-${pkg.name}`,\n title: `SMRT Package Specialist: ${pkg.name}`,\n description:\n 'Deterministic package specialist prompt bundle and source list.',\n mimeType: 'application/json',\n },\n ]),\n ],\n };\n });\n\n server.setRequestHandler('resources/read', async (request) => {\n const { uri } = request.params;\n if (uri === REVIEW_SKILL_URI) {\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n ],\n };\n }\n\n if (uri === KNOWLEDGE_PROJECT_URI) {\n const index = await buildKnowledgeIndex();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgeIndex(index), null, 2),\n },\n ],\n };\n }\n\n if (uri === WORKBENCH_PROJECT_URI) {\n const index = await buildKnowledgeIndex();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n project: sanitizeKnowledgeIndex(index),\n workbenchResources: index.packages\n .filter((pkg) => pkg.kind !== 'sdk')\n .map((pkg) => ({\n packageName: pkg.name,\n packageUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n specialistUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n })),\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (\n uri.startsWith(WORKBENCH_PACKAGE_PREFIX) &&\n uri.endsWith(WORKBENCH_SPECIALIST_SUFFIX)\n ) {\n const packageName = decodeURIComponent(\n uri.slice(\n WORKBENCH_PACKAGE_PREFIX.length,\n -WORKBENCH_SPECIALIST_SUFFIX.length,\n ),\n );\n const specialist = await buildPackageSpecialistContext({\n package: packageName,\n });\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n sanitizePackageSpecialist(specialist),\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (uri.startsWith(WORKBENCH_PACKAGE_PREFIX)) {\n const packageName = decodeURIComponent(\n uri.slice(WORKBENCH_PACKAGE_PREFIX.length),\n );\n const index = await buildKnowledgeIndex();\n const pkg = index.packages.find((item) => item.name === packageName);\n if (!pkg) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown workbench package: ${packageName}`,\n );\n }\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n package: sanitizeKnowledgePackage(pkg),\n specialistUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (uri.startsWith(KNOWLEDGE_PACKAGE_PREFIX)) {\n const packageName = decodeURIComponent(\n uri.slice(KNOWLEDGE_PACKAGE_PREFIX.length),\n );\n const index = await buildKnowledgeIndex();\n const pkg = index.packages.find((item) => item.name === packageName);\n if (!pkg) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown knowledge package: ${packageName}`,\n );\n }\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgePackage(pkg), null, 2),\n },\n ],\n };\n }\n\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown resource: ${uri}`,\n );\n });\n\n // Call tool handler\n server.setRequestHandler('tools/call', async (request) => {\n const { name, arguments: args } = request.params;\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] CallTool: ${name}`);\n console.error(\n `[${SERVER_NAME}] Arguments:`,\n JSON.stringify(redactDebugArguments(args), null, 2),\n );\n }\n\n try {\n let result: string;\n\n switch (name) {\n case 'generate-smrt-class':\n result = await generateSmrtClass(\n args as unknown as Parameters<typeof generateSmrtClass>[0],\n );\n break;\n\n case 'introspect-project':\n result = await (\n await import('./tools/introspect-project.js')\n ).introspectProject(args as never);\n break;\n\n case 'review-smrt-project':\n result = await reviewSmrtProject(\n args as unknown as Parameters<typeof reviewSmrtProject>[0],\n );\n break;\n\n case 'reflect-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'reflect-domain-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n domainKnowledgePackageCount: index.packages.filter(\n (pkg) => pkg.hasDomainKnowledge,\n ).length,\n missingDomainKnowledgePackages: index.packages\n .filter(\n (pkg) =>\n pkg.exportKeys.includes('./smrt-knowledge.json') &&\n !pkg.hasDomainKnowledge,\n )\n .map((pkg) => pkg.name),\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'check-knowledge-freshness':\n result = JSON.stringify(\n await checkKnowledgeFreshness(\n args as unknown as Parameters<typeof checkKnowledgeFreshness>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'build-context':\n result = JSON.stringify(\n compactContextResult(\n await buildContext(\n args as unknown as Parameters<typeof buildContext>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'smrt-review':\n case 'smrt-architecture': {\n // One-release compatibility names for build-context (#2780).\n const task = name === 'smrt-review' ? 'review' : 'architecture';\n const context = compactContextResult(\n await buildContext({\n ...(args as Record<string, unknown>),\n task,\n } as unknown as Parameters<typeof buildContext>[0]),\n detailArg(args),\n ) as Record<string, unknown> & { diagnostics?: unknown[] };\n context.diagnostics = [\n ...(Array.isArray(context.diagnostics) ? context.diagnostics : []),\n {\n severity: 'info',\n code: 'deprecated_tool_name',\n message: `${name} is a compatibility name; call build-context with task: '${task}'. It will be removed in the next minor release.`,\n },\n ];\n result = JSON.stringify(context, null, 2);\n break;\n }\n\n case 'build-package-specialist-context':\n result = JSON.stringify(\n sanitizePackageSpecialist(\n await buildPackageSpecialistContext(\n args as unknown as Parameters<\n typeof buildPackageSpecialistContext\n >[0],\n ),\n ),\n null,\n 2,\n );\n break;\n\n case 'list-agent-skills':\n result = JSON.stringify({ skills: listAgentSkills() }, null, 2);\n break;\n\n case 'get-agent-skill':\n result = JSON.stringify(\n await getAgentSkill(\n args as unknown as Parameters<typeof getAgentSkill>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'migration-status':\n case 'job-health':\n case 'schedule-health':\n case 'dispatch-health':\n case 'recent-changes':\n case 'registry-drift': {\n const runtime = await import('./tools/runtime/tools.js');\n const handlers = {\n 'migration-status': runtime.runtimeMigrationStatus,\n 'job-health': runtime.runtimeJobHealth,\n 'schedule-health': runtime.runtimeScheduleHealth,\n 'dispatch-health': runtime.runtimeDispatchHealth,\n 'recent-changes': runtime.runtimeRecentChanges,\n 'registry-drift': runtime.runtimeRegistryDrift,\n };\n result = JSON.stringify(await handlers[name](args as never), null, 2);\n break;\n }\n\n case 'runtime-registry':\n case 'runtime-object':\n case 'runtime-schema-diff': {\n const observation = await import('./tools/runtime/observation.js');\n const handlers = {\n 'runtime-registry': observation.runtimeRegistry,\n 'runtime-object': observation.runtimeObject,\n 'runtime-schema-diff': observation.runtimeSchemaDiff,\n };\n result = JSON.stringify(await handlers[name](args as never), null, 2);\n break;\n }\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: result,\n },\n ],\n structuredContent: toDevToolStructuredContent(result),\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n console.error(`[${SERVER_NAME}] Error:`, error);\n\n return {\n content: [\n {\n type: 'text',\n text: `Error executing tool ${name}: ${errorMessage}`,\n },\n ],\n isError: true,\n structuredContent: {\n ok: false,\n coverage: null,\n diagnostics: [\n {\n severity: 'error',\n ...(error instanceof ProjectRuntimeResolutionError\n ? { code: error.code }\n : {}),\n message: errorMessage,\n },\n ],\n data: null,\n },\n };\n }\n });\n\n return server;\n}\n\nasync function main() {\n const handle = serveStdio(() => createServer(), {\n onerror: (error) =>\n console.error(`[${SERVER_NAME}] Protocol error:`, error),\n });\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Server connected via stdio`);\n }\n\n // Graceful shutdown\n process.on('SIGINT', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await handle.close();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await handle.close();\n process.exit(0);\n });\n}\n\nfunction isEntrypoint(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(entry);\n } catch {\n return import.meta.url === pathToFileURL(entry).href;\n }\n}\n\nfunction renderAgentSkillMarkdown(name: string): string {\n const skill = getAgentSkill({ name, includeReferences: true });\n const references = skill.referenceFiles.map(\n (file) => `## Reference: ${file.path}\\n\\n${file.content.trim()}`,\n );\n return [skill.skillMarkdown.trim(), ...references].join('\\n\\n');\n}\n\nfunction reviewPromptArguments(args: PromptArguments): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n changedFiles: parseStringList(args?.changedFiles),\n focus: args?.focus,\n documentation: args?.documentation,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction architecturePromptArguments(\n args: PromptArguments,\n): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n idea: args?.idea,\n documentation: args?.documentation,\n focus: args?.focus,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction parseStringList(value: string | undefined): string[] | undefined {\n if (!value?.trim()) return undefined;\n\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return parsed.filter((item): item is string => typeof item === 'string');\n }\n } catch {\n // Fall through to delimiter parsing.\n }\n\n return value\n .split(/[\\n,]/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction compactRecord(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n );\n}\n\nfunction sanitizeKnowledgeIndex(index: KnowledgeIndexResult) {\n const packages = index.packages.map((pkg) => sanitizeKnowledgePackage(pkg));\n return {\n ...index,\n rootDir: '.',\n packages,\n smrtPackages: packages.filter((pkg) => pkg.kind === 'smrt'),\n sdkPackages: packages.filter((pkg) => pkg.kind === 'sdk'),\n // Rebuilt from the sanitized list rather than carried over by the spread.\n // Installed dependencies live outside the project root, so theirs are the\n // absolute host paths this projection exists to strip (#2275).\n installedPackages: packages.filter((pkg) => pkg.isInstalledDependency),\n };\n}\n\nfunction detailArg(args: unknown): string | undefined {\n const detail = (args as Record<string, unknown> | undefined)?.detail;\n return typeof detail === 'string' ? detail : undefined;\n}\n\n/**\n * Debug logging happens before any tool runs its own redaction, so a\n * credential-bearing `dbUrl` argument must be masked here.\n */\nfunction redactDebugArguments(args: unknown): unknown {\n if (!isRecord(args) || typeof args.dbUrl !== 'string') return args;\n return { ...args, dbUrl: redactConnectionString(args.dbUrl) };\n}\n\nfunction isRuntimeEnvelope(value: unknown): value is {\n ok: boolean;\n coverage: unknown;\n diagnostics: unknown[];\n data: unknown;\n} {\n return (\n isRecord(value) &&\n typeof value.ok === 'boolean' &&\n 'coverage' in value &&\n Array.isArray(value.diagnostics) &&\n 'data' in value\n );\n}\n\nfunction toDevToolStructuredContent(result: string) {\n let data: unknown = result;\n try {\n data = JSON.parse(result);\n } catch {\n // `generate-smrt-class` intentionally returns source text, not JSON.\n }\n\n // Runtime diagnostics tools already return the `{ok, coverage, diagnostics,\n // data}` envelope; re-wrapping would expose `data.data.*` in\n // structuredContent while the text response exposes `data.*`.\n if (isRuntimeEnvelope(data)) {\n return data;\n }\n\n const source = isRecord(data) ? data : undefined;\n const coverage = isRecord(source?.coverage) ? source.coverage : null;\n const diagnostics = Array.isArray(source?.diagnostics)\n ? source.diagnostics.filter(isRecord)\n : [];\n return { ok: true, coverage, diagnostics, data };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction sanitizeKnowledgePackage(pkg: KnowledgePackageResult) {\n const { directory: _directory, objects, checkedObjectPaths, ...rest } = pkg;\n return {\n ...rest,\n // Paths outside the workspace root stay absolute in the index; redact them\n // here the same way object file paths are redacted.\n checkedObjectPaths: checkedObjectPaths.map(\n (path) => sanitizePath(path) ?? path,\n ),\n objects: objects.map((object) => ({\n ...object,\n filePath: sanitizePath(object.filePath),\n })),\n };\n}\n\nfunction sanitizePackageSpecialist(specialist: PackageSpecialistResult) {\n return {\n selectedPackage: sanitizeKnowledgePackage(specialist.selectedPackage),\n selectedSdkPackages: specialist.selectedSdkPackages.map((pkg) =>\n sanitizeKnowledgePackage(pkg),\n ),\n promptBundle: {\n ...specialist.promptBundle,\n contextMarkdown: specialist.promptBundle.contextMarkdown.replace(\n /^Baseline root: .+$/m,\n 'Baseline root: .',\n ),\n sourceFiles: sanitizePaths(specialist.promptBundle.sourceFiles),\n },\n sourceFiles: sanitizePaths(specialist.sourceFiles),\n };\n}\n\nfunction sanitizePaths(paths: string[]): string[] {\n return paths\n .map(sanitizePath)\n .filter((path): path is string => typeof path === 'string');\n}\n\nfunction sanitizePath(path: string | undefined): string | undefined {\n if (!path) return path;\n if (path.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(path)) {\n return '<absolute-path>';\n }\n return path;\n}\n\n/**\n * `smrt-dev-mcp --http [--port N] [--project DIR]` starts the Level 2 runtime\n * dev-plane host (#1831) instead of the stdio server. Loopback-only, bearer\n * protected, positive read-only catalog; see `http.ts`.\n */\nexport function parseHttpCliArgs(argv: readonly string[]): {\n http: boolean;\n port?: number;\n projectRoot?: string;\n} {\n const result: { http: boolean; port?: number; projectRoot?: string } = {\n http: false,\n };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === '--http') result.http = true;\n else if (arg === '--port') {\n const value = Number.parseInt(argv[index + 1] ?? '', 10);\n if (!Number.isInteger(value) || value < 0 || value > 65535) {\n throw new Error('--port requires an integer between 0 and 65535');\n }\n result.port = value;\n index += 1;\n } else if (arg === '--project') {\n const value = argv[index + 1];\n if (!value) throw new Error('--project requires a directory');\n result.projectRoot = value;\n index += 1;\n }\n }\n return result;\n}\n\nasync function mainHttp(cli: ReturnType<typeof parseHttpCliArgs>) {\n const host = await startRuntimeHttpHost({\n port: cli.port,\n projectRoot: cli.projectRoot,\n });\n // The token is printed exactly once, to stderr, only when this process\n // minted it; a token supplied via SMRT_DEV_MCP_TOKEN is never echoed.\n const minted = !process.env.SMRT_DEV_MCP_TOKEN?.trim();\n console.error(\n `[${SERVER_NAME}] runtime dev-plane listening at ${host.url} (${host.boot.objectCount} booted objects, ${host.boot.manifests.length} manifests)`,\n );\n if (minted) {\n console.error(`[${SERVER_NAME}] bearer token: ${host.token}`);\n }\n const shutdown = async () => {\n await host.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\nif (isEntrypoint()) {\n if (process.argv[2] === 'review') {\n // `smrt-dev-mcp review ...`: one-shot advisory review for CI (#4690).\n import('./tools/review-cli.js')\n .then(({ runReviewCli }) => runReviewCli(process.argv.slice(3)))\n .then((code) => {\n process.exitCode = code;\n })\n .catch((error) => {\n console.error(`[${SERVER_NAME}] review failed:`, error);\n process.exit(1);\n });\n } else {\n const cli = parseHttpCliArgs(process.argv.slice(2));\n (cli.http ? mainHttp(cli) : main()).catch((error) => {\n console.error(`[${SERVER_NAME}] Fatal error:`, error);\n process.exit(1);\n });\n }\n}\n"],"mappings":"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"}
@@ -5,10 +5,10 @@ description: "Development MCP server for SMRT framework knowledge, review contex
5
5
  status: "stable"
6
6
  generated:
7
7
  by: "smrt/scripts/generate-knowledge-okf.ts"
8
- at: "2026-11-05T15:48:19Z"
8
+ at: "2026-11-05T22:43:52Z"
9
9
  audience: "internal"
10
10
  evidence_level: "manifest-described"
11
- source_revision: "sha256:a01eccec517d6947a1a35bb4e970a7e9696bbfde005f068ea4ea31a431326706"
11
+ source_revision: "sha256:e42997e04807e19683b44eaf325313f6d30e10ef5bb7320bc42e85d1d46b6462"
12
12
  sources:
13
13
  - id: "manifest"
14
14
  resource: "https://github.com/happyvertical/smrt/blob/main/packages/smrt-dev-mcp/package.json"
@@ -17,9 +17,12 @@ sources:
17
17
  resource: "https://github.com/happyvertical/smrt/blob/main/packages/smrt-dev-mcp/AGENTS.md"
18
18
  title: "@happyvertical/smrt-dev-mcp packages/smrt-dev-mcp/AGENTS.md"
19
19
  - id: "agents-2"
20
+ resource: "https://github.com/happyvertical/smrt/blob/main/packages/smrt-dev-mcp/agents/agent-skills.md"
21
+ title: "@happyvertical/smrt-dev-mcp packages/smrt-dev-mcp/agents/agent-skills.md"
22
+ - id: "agents-3"
20
23
  resource: "https://github.com/happyvertical/smrt/blob/main/packages/smrt-dev-mcp/agents/intent-duplicates.md"
21
24
  title: "@happyvertical/smrt-dev-mcp packages/smrt-dev-mcp/agents/intent-duplicates.md"
22
- - id: "agents-3"
25
+ - id: "agents-4"
23
26
  resource: "https://github.com/happyvertical/smrt/blob/main/packages/smrt-dev-mcp/agents/protocol-conformance.md"
24
27
  title: "@happyvertical/smrt-dev-mcp packages/smrt-dev-mcp/agents/protocol-conformance.md"
25
28
  ---
@@ -36,6 +39,7 @@ sources:
36
39
  ## Documentation
37
40
 
38
41
  - `packages/smrt-dev-mcp/AGENTS.md`
42
+ - `packages/smrt-dev-mcp/agents/agent-skills.md`
39
43
  - `packages/smrt-dev-mcp/agents/intent-duplicates.md`
40
44
  - `packages/smrt-dev-mcp/agents/protocol-conformance.md`
41
45
 
@@ -53,6 +57,7 @@ sources:
53
57
  ## Exports
54
58
 
55
59
  - `.`
60
+ - `./agent-skills`
56
61
  - `./dev-plane`
57
62
  - `./knowledge`
58
63
  - `./runtime`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-dev-mcp",
3
- "version": "0.60.10",
3
+ "version": "0.60.12",
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",
@@ -17,6 +17,10 @@
17
17
  "types": "./dist/knowledge.d.ts",
18
18
  "import": "./dist/knowledge.js"
19
19
  },
20
+ "./agent-skills": {
21
+ "types": "./dist/agent-skills.d.ts",
22
+ "import": "./dist/agent-skills.js"
23
+ },
20
24
  "./dev-plane": {
21
25
  "types": "./dist/dev-plane.d.ts",
22
26
  "import": "./dist/dev-plane.js"
@@ -54,14 +58,14 @@
54
58
  "homepage": "https://github.com/happyvertical/smrt/tree/main/packages/smrt-dev-mcp#readme",
55
59
  "license": "MIT",
56
60
  "dependencies": {
57
- "@happyvertical/smrt-scanner": "0.60.10",
61
+ "@happyvertical/smrt-scanner": "0.60.12",
58
62
  "@modelcontextprotocol/node": "2.1.2",
59
63
  "@modelcontextprotocol/server": "2.4.0",
60
- "@happyvertical/smrt-types": "0.60.10"
64
+ "@happyvertical/smrt-types": "0.60.12"
61
65
  },
62
66
  "devDependencies": {
63
- "@happyvertical/smrt-config": "0.60.10",
64
- "@happyvertical/smrt-core": "0.60.10",
67
+ "@happyvertical/smrt-config": "0.60.12",
68
+ "@happyvertical/smrt-core": "0.60.12",
65
69
  "@happyvertical/sql": "^0.111.5",
66
70
  "@modelcontextprotocol/client": "2.4.0",
67
71
  "@modelcontextprotocol/conformance": "0.2.0-alpha.11",
package/plugin.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "smrt-dev-mcp",
4
- "description": "Development MCP server and SMRT code-review skill."
4
+ "description": "Development MCP server and SMRT skills: catalog router, contributor guide, and code review."
5
5
  }
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: smrt-catalog
3
+ description: Use BEFORE writing infrastructure, utility, or integration code in a project that depends on @happyvertical smrt packages. Fires on requests for scheduled or background jobs and retries ("add a nightly cleanup job"), sending email or notifications ("send the customer a receipt email"), file or object storage and uploads ("upload the logo to storage"), tenancy ("make this tenant-aware"), money and price fields ("add a price field"), plus approvals, audit trails, permissions, search, caching, webhooks, and document generation. Routes to the smrt knowledge catalog so an installed package is reused instead of hand-rolled. Stay silent for ordinary feature work inside an existing @smrt() object (editing its fields, methods, validation, UI, or tests) that needs no new plumbing.
4
+ ---
5
+
6
+ # SMRT Catalog
7
+
8
+ Fire before writing infrastructure, utility, or integration code in a project
9
+ that depends on `@happyvertical/smrt-*` packages. The catalog says whether an
10
+ installed package already provides the behaviour.
11
+
12
+ ## Workflow
13
+
14
+ 1. Read `.agents/smrt-knowledge/intents/index.md` (written by `smrt docs:agents`).
15
+ Pick the row whose intent matches the request.
16
+ 2. Read that intent page, then the component page of its home package
17
+ (`.agents/smrt-knowledge/components/<package>.md`).
18
+ 3. Before writing code, tell the user: the smrt package, the entry point, and
19
+ why it fits (or what is missing). Wait for objection only if the proposal
20
+ changes the requested design.
21
+ 4. Implement with that entry point. Do not reimplement what the page names.
22
+ 5. Bundle missing, or no intent row matches: say so, then call `smrt-dev-mcp`
23
+ `build-context` (and `check-knowledge-freshness` when available) and continue
24
+ from its output. If `check-knowledge-freshness` reports the bundle stale,
25
+ say so and suggest rerunning `smrt docs:agents`.
26
+
27
+ ## When the package lacks the behaviour
28
+
29
+ The home package exists but does not do what is needed:
30
+
31
+ 1. Draft an issue for `happyvertical/smrt` that cites the intent page and the
32
+ component page, states the missing behaviour, and the use case. Show the
33
+ draft to the user; file it only with their approval.
34
+ 2. Implement the smallest local shim, marked temporary with a comment that
35
+ links the issue (`// TEMPORARY: replace with <package> once <issue URL> ships`).
36
+ 3. Do not silently reimplement the package.
37
+
38
+ ## Not for
39
+
40
+ - Editing fields, methods, validation, UI, or tests of an existing `@smrt()`
41
+ object when no new infrastructure is involved.
42
+ - Projects that do not depend on smrt packages.
@@ -0,0 +1,28 @@
1
+ {
2
+ "skill": "smrt-catalog",
3
+ "note": "Trigger eval set. A harness (or a reviewer) runs each prompt in a consumer project that depends on smrt packages and checks whether the skill fires. src/agent-skills.test.ts asserts the description covers every positive signal class.",
4
+ "positive": [
5
+ { "prompt": "add a nightly cleanup job", "signal": "jobs" },
6
+ { "prompt": "retry failed webhook deliveries with backoff", "signal": "jobs" },
7
+ { "prompt": "send the customer a receipt email", "signal": "email" },
8
+ { "prompt": "notify the owner when an invoice is overdue", "signal": "email" },
9
+ { "prompt": "upload the logo to storage", "signal": "storage" },
10
+ { "prompt": "let users attach PDFs to a ticket", "signal": "storage" },
11
+ { "prompt": "make this tenant-aware", "signal": "tenancy" },
12
+ { "prompt": "scope these records per organization", "signal": "tenancy" },
13
+ { "prompt": "add a price field", "signal": "money" },
14
+ { "prompt": "store the refund amount and currency", "signal": "money" },
15
+ { "prompt": "require a manager to approve discounts", "signal": "approvals" },
16
+ { "prompt": "record who changed each order and when", "signal": "audit" },
17
+ { "prompt": "generate a PDF invoice", "signal": "documents" }
18
+ ],
19
+ "negative": [
20
+ { "prompt": "rename the Article title label to Headline", "reason": "ordinary change inside an existing @smrt() object" },
21
+ { "prompt": "add a unit test for Order.total()", "reason": "tests of an existing object" },
22
+ { "prompt": "validate that Product.slug is lowercase", "reason": "validation inside an existing object" },
23
+ { "prompt": "fix the off-by-one in the pagination component", "reason": "UI bug, no new plumbing" },
24
+ { "prompt": "add a description text field to Customer", "reason": "plain field on an existing object" },
25
+ { "prompt": "explain what the Invoice class does", "reason": "read-only question" },
26
+ { "prompt": "bump vitest to the latest minor", "reason": "tooling" }
27
+ ]
28
+ }
@@ -0,0 +1,73 @@
1
+ ---
2
+ name: smrt-contribute
3
+ description: Use when working in a fork or clone of the happyvertical/smrt repository as an outside contributor, for example "fix a bug in smrt-jobs and open a PR", "contribute this change upstream", or "add docs to smrt-core". Gives the fork pull-request procedure from CONTRIBUTING.md and the traps that fail from outside (package-name test filters, format then lint, generated knowledge pages, PR title length, no changesets, fork CI approval). Do not use in a project that merely depends on smrt packages (use smrt-catalog), or in a maintainer session where the control-plane skills (implement, claim-issue, review-cycle, ship) are installed.
4
+ ---
5
+
6
+ # SMRT Contribute
7
+
8
+ Procedure for contributing to `happyvertical/smrt` from a fork or clone. It
9
+ is `CONTRIBUTING.md` as steps. The maintainer lifecycle in
10
+ `AGENTS.md` (claim labels, dispatch labels, patch trains, `hv-agent-run`
11
+ blocks, `implement`, `review-cycle`) does not apply to you: you cannot claim
12
+ issues and the skills live in a private repository. Do not try to load them.
13
+
14
+ You submit the PR, so read and understand every line of it before opening it.
15
+
16
+ ## Procedure
17
+
18
+ 1. **Scope.** One concern per PR. For anything bigger than a focused bug fix,
19
+ or for changes to core decorators, the scanner or schema generation,
20
+ dependencies, new packages, or `.github/`, open or comment on an issue first.
21
+ 2. **Orient.** Read `AGENTS.md` and the affected package's `AGENTS.md`
22
+ (non-obvious invariants and extra checks). Use Node and pnpm versions from
23
+ `package.json`.
24
+ 3. **Setup.** `pnpm install` then `pnpm build`; packages consume each other's
25
+ built output, so build once in a fresh clone.
26
+ 4. **Branch** in your fork, off `main`. Target `main` with the PR.
27
+ 5. **Change.** Add a regression test for a bug fix and tests for new behaviour
28
+ (`TESTING_STANDARD.md`). Update the package README for user-facing behaviour.
29
+ 6. **Test by package name:** `pnpm --filter @happyvertical/smrt-jobs test`.
30
+ Directories under `packages/` drop the `smrt-` prefix, and a filter that
31
+ matches no package exits 0 having run nothing. Confirm tests actually ran.
32
+ 7. **Format, then lint:** `pnpm format` then `pnpm lint`.
33
+ 8. **Generated pages.** When a package manifest, an `AGENTS.md`, an intent or a
34
+ playbook changed, run `pnpm knowledge:check --strict --format markdown` and
35
+ `pnpm knowledge:okf`, and commit the regenerated pages (they are checked in).
36
+ Keep root `AGENTS.md` chain under the 32 KB cap: `pnpm check:agents-chain`.
37
+ 9. **Commit** with conventional commits (`fix(core): preserve tenant scope`).
38
+ Never author `.changeset/*.md`; release automation writes them.
39
+ 10. **Open the PR** against `main`. Title: conventional form, at most 92
40
+ characters (the squash appends ` (#N)` and the commit header limit is 100).
41
+
42
+ ## Never
43
+
44
+ - `--no-verify`, skipping a hook, disabling a gate, or pinning around a failure.
45
+ If a documented command cannot run as documented, say so in the PR instead
46
+ of working around it.
47
+ - Touching `.github/`. The **Fork Workflow Change Guard** fails any fork PR
48
+ that changes it; a maintainer re-lands such changes from the main repository.
49
+ - Claiming issues, adding claim or dispatch labels, or adding `hv-agent-run`
50
+ blocks.
51
+
52
+ ## CI on a fork PR
53
+
54
+ - A maintainer must approve the **Fork PR Validation** run before it executes.
55
+ - Until then `Required CI` and `postgres-required` fail with "awaiting
56
+ maintainer approval". That is expected; do not try to fix it.
57
+ - A maintainer applies `ci: fork-approved` after reviewing and approving the
58
+ head commit. A new push removes the label and needs a fresh approval.
59
+ - If a maintainer's approval was refused, they must remove and re-add the
60
+ label; re-adding a label that is already present fires no event.
61
+
62
+ ## PR description
63
+
64
+ Include:
65
+
66
+ - the behaviour change (what and why);
67
+ - how it was validated (commands run, with results);
68
+ - which package `AGENTS.md` invariants it touches, or "none".
69
+
70
+ ## Upstream gaps found from a consumer project
71
+
72
+ If you arrived here because a consumer project needed behaviour an smrt package
73
+ lacks, link the originating issue or use case in the PR description.
@@ -0,0 +1,18 @@
1
+ {
2
+ "skill": "smrt-contribute",
3
+ "note": "Trigger eval set. Positive: an outside contributor in a fork or clone of happyvertical/smrt. Negative: a consumer project, or a maintainer session with the control-plane skills. src/agent-skills.test.ts asserts the description covers the positive and negative contexts.",
4
+ "positive": [
5
+ { "prompt": "fix a bug in smrt-jobs and open a PR", "context": "fork" },
6
+ { "prompt": "I cloned happyvertical/smrt; add docs for smrt-core to the README", "context": "clone" },
7
+ { "prompt": "contribute this change upstream to smrt", "context": "fork" },
8
+ { "prompt": "open a pull request against happyvertical/smrt from my fork", "context": "fork" },
9
+ { "prompt": "what do I need to run before sending a PR to smrt?", "context": "clone" }
10
+ ],
11
+ "negative": [
12
+ { "prompt": "add a nightly cleanup job", "context": "consumer project that depends on smrt packages" },
13
+ { "prompt": "make the Invoice model tenant-aware", "context": "consumer project that depends on smrt packages" },
14
+ { "prompt": "implement issue #4123", "context": "maintainer session with implement and claim-issue skills" },
15
+ { "prompt": "run review-cycle and ship the PR", "context": "maintainer session with control-plane skills" },
16
+ { "prompt": "fix the failing test in my app", "context": "unrelated repository" }
17
+ ]
18
+ }