@node-boost/node-boost 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/LICENSE.md +21 -0
- package/README.md +196 -0
- package/dist/cli.js +3000 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +380 -0
- package/dist/index.js +2708 -0
- package/dist/index.js.map +1 -0
- package/package.json +82 -0
- package/resources/react/architectures/component-composition/guideline.md +42 -0
- package/resources/react/architectures/component-composition/skill/SKILL.md +19 -0
- package/resources/react/architectures/custom-hooks/guideline.md +38 -0
- package/resources/react/architectures/custom-hooks/skill/SKILL.md +22 -0
- package/resources/react/architectures/data-access-layer/guideline.md +43 -0
- package/resources/react/architectures/data-access-layer/skill/SKILL.md +26 -0
- package/resources/react/architectures/error-loading-boundaries/guideline.md +36 -0
- package/resources/react/architectures/error-loading-boundaries/skill/SKILL.md +18 -0
- package/resources/react/architectures/feature-modules/guideline.md +34 -0
- package/resources/react/architectures/feature-modules/skill/SKILL.md +28 -0
- package/resources/react/architectures/feature-modules/variants/forbid.md +36 -0
- package/resources/react/architectures/feature-modules/variants/public-api.md +37 -0
- package/resources/react/architectures/modern-typescript/guideline.md +47 -0
- package/resources/react/architectures/modern-typescript/skill/SKILL.md +23 -0
- package/resources/react/architectures/secure-by-default/guideline.md +38 -0
- package/resources/react/architectures/secure-by-default/skill/SKILL.md +22 -0
- package/resources/react/architectures/server-first-components/guideline.md +34 -0
- package/resources/react/architectures/server-first-components/skill/SKILL.md +23 -0
- package/resources/react/architectures/state-management/guideline.md +34 -0
- package/resources/react/architectures/state-management/skill/SKILL.md +21 -0
- package/resources/react/architectures/styling-tailwind/guideline.md +33 -0
- package/resources/react/architectures/styling-tailwind/skill/SKILL.md +18 -0
- package/resources/react/architectures/testing-strategy/guideline.md +33 -0
- package/resources/react/architectures/testing-strategy/skill/SKILL.md +19 -0
- package/resources/react/architectures/typed-contracts/guideline.md +31 -0
- package/resources/react/architectures/typed-contracts/skill/SKILL.md +23 -0
- package/resources/react/architectures/ui-states/guideline.md +45 -0
- package/resources/react/architectures/ui-states/skill/SKILL.md +19 -0
- package/resources/react/guidelines/core.md +15 -0
- package/resources/react/guidelines/next/15.md +9 -0
- package/resources/react/guidelines/next/16.md +18 -0
- package/resources/react/guidelines/next/core.md +8 -0
- package/resources/react/guidelines/react/18.md +8 -0
- package/resources/react/guidelines/react/19.md +10 -0
- package/resources/react/guidelines/react/core.md +9 -0
- package/resources/react/guidelines/react-query/core.md +8 -0
- package/resources/react/guidelines/react-router/7.md +9 -0
- package/resources/react/guidelines/react-router/core.md +7 -0
- package/resources/react/guidelines/tailwindcss/3.md +8 -0
- package/resources/react/guidelines/tailwindcss/4.md +9 -0
- package/resources/react/guidelines/tailwindcss/core.md +8 -0
- package/resources/react/guidelines/testing/playwright.md +8 -0
- package/resources/react/guidelines/testing/vitest.md +8 -0
- package/resources/react/guidelines/typescript/core.md +7 -0
- package/resources/react/guidelines/vite/core.md +8 -0
- package/resources/react/guidelines/zod/3.md +8 -0
- package/resources/react/guidelines/zod/4.md +10 -0
- package/resources/react/guidelines/zod/core.md +7 -0
- package/resources/react/guidelines/zustand/core.md +8 -0
- package/resources/react/skills/next-development/SKILL.md +19 -0
- package/resources/react/skills/react-development/SKILL.md +18 -0
- package/resources/react/skills/spa-routing/SKILL.md +18 -0
- package/resources/react/skills/tailwindcss-development/SKILL.md +17 -0
- package/resources/react/skills/testing-frontend/SKILL.md +18 -0
- package/schema.json +216 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/schema.ts","../src/config/json-schema.ts","../src/audit/engine.ts","../src/detect/stack.ts","../src/detect/package-manager.ts","../src/detect/router.ts","../src/audit/rules/helpers.ts","../src/audit/rules/data-access-layer.ts","../src/audit/rules/error-loading-boundaries.ts","../src/audit/rules/feature-modules.ts","../src/audit/rules/modern-typescript.ts","../src/audit/rules/secure-by-default.ts","../src/audit/rules/server-first-components.ts","../src/audit/rules/state-management.ts","../src/audit/rules/typed-contracts.ts","../src/audit/registry.ts","../src/audit/scope.ts","../src/audit/suppression.ts","../src/audit/reporters/agent.ts","../src/audit/reporters/human.ts","../src/compose/guidelines.ts","../src/compose/resources.ts","../src/compose/skills.ts","../src/compose/index-file.ts","../src/compose/overrides.ts","../src/install/orchestrator.ts","../src/agents/agent.ts","../src/agents/merge-hooks.ts","../src/agents/merge-json.ts","../src/agents/managed-block.ts","../src/agents/claude-code.ts","../src/agents/merge-toml.ts","../src/agents/codex.ts","../src/agents/cursor.ts","../src/agents/index.ts","../src/stacks/architectures.ts","../src/stacks/next.ts","../src/stacks/vite-react.ts","../src/stacks/adapter.ts","../src/install/project.ts","../src/mcp/server.ts","../package.json","../src/mcp/errors.ts","../src/mcp/tools/application-info.ts","../src/mcp/project.ts","../src/mcp/tools/audit.ts","../src/mcp/tools/doctor.ts","../src/mcp/tools/explain-finding.ts","../src/mcp/tools/list-routes.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const agentNameSchema = z.enum([\"claude-code\", \"codex\", \"cursor\"]);\n\nexport const stackNameSchema = z.enum([\"next\", \"vite-react\", \"react-generic\", \"unknown\"]);\n\nexport const architectureSlugSchema = z.enum([\n \"feature-modules\",\n \"server-first-components\",\n \"data-access-layer\",\n \"typed-contracts\",\n \"state-management\",\n \"custom-hooks\",\n \"component-composition\",\n \"styling-tailwind\",\n \"testing-strategy\",\n \"error-loading-boundaries\",\n \"secure-by-default\",\n \"modern-typescript\",\n \"ui-states\",\n]);\n\nexport const auditSeveritySchema = z.enum([\"off\", \"warn\", \"err\"]);\n\nexport const featureModulesBoundarySchema = z.enum([\"public-api\", \"forbid\"]);\n\nconst nonFeatureModuleArchitectureSlugSchema = z.enum([\n \"server-first-components\",\n \"data-access-layer\",\n \"typed-contracts\",\n \"state-management\",\n \"custom-hooks\",\n \"component-composition\",\n \"styling-tailwind\",\n \"testing-strategy\",\n \"error-loading-boundaries\",\n \"secure-by-default\",\n \"modern-typescript\",\n \"ui-states\",\n]);\n\nexport const architectureEntrySchema = z.union([\n architectureSlugSchema,\n z.strictObject({\n name: z.literal(\"feature-modules\"),\n boundary: featureModulesBoundarySchema.default(\"public-api\"),\n }),\n z.strictObject({\n name: nonFeatureModuleArchitectureSlugSchema,\n }),\n]);\n\nconst defaultFeatures = {\n guidelines: true,\n skills: true,\n mcp: true,\n architecture: true,\n hooks: false,\n};\n\nconst defaultAudit = {\n exclude: [],\n rules: {},\n ruleOptions: {},\n};\n\nexport const featuresSchema = z.object({\n guidelines: z.boolean().default(true),\n skills: z.boolean().default(true),\n mcp: z.boolean().default(true),\n architecture: z.boolean().default(true),\n hooks: z.boolean().default(false),\n});\n\nexport const auditSchema = z\n .object({\n exclude: z.array(z.string()).default([]),\n rules: z.record(z.string(), auditSeveritySchema).default({}),\n ruleOptions: z.record(z.string(), z.record(z.string(), z.unknown())).default({}),\n })\n .default(defaultAudit);\n\nexport const nodeBoostConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.literal(1),\n generatedWith: z.string().min(1),\n stack: stackNameSchema,\n agents: z.array(agentNameSchema).default([]),\n features: featuresSchema.default(defaultFeatures),\n architectures: z.array(architectureEntrySchema).default([]),\n audit: auditSchema,\n});\n\nexport type NodeBoostConfig = z.infer<typeof nodeBoostConfigSchema>;\nexport type ArchitectureConfigEntry = z.infer<typeof architectureEntrySchema>;\n\nexport interface NormalizedArchitecture {\n name: z.infer<typeof architectureSlugSchema>;\n options: Record<string, unknown>;\n}\n\nexport function parseNodeBoostConfig(input: unknown): NodeBoostConfig {\n return nodeBoostConfigSchema.parse(input);\n}\n\nexport function normalizeArchitectures(config: Pick<NodeBoostConfig, \"architectures\">): NormalizedArchitecture[] {\n return config.architectures.map((architecture) => {\n if (typeof architecture === \"string\") {\n return {\n name: architecture,\n options: architecture === \"feature-modules\" ? { boundary: \"public-api\" } : {},\n };\n }\n\n if (architecture.name === \"feature-modules\") {\n return {\n name: architecture.name,\n options: { boundary: architecture.boundary },\n };\n }\n\n return {\n name: architecture.name,\n options: {},\n };\n });\n}\n","import { z } from \"zod\";\nimport { nodeBoostConfigSchema } from \"./schema.js\";\n\nexport function createNodeBoostJsonSchema(): unknown {\n const schema = z.toJSONSchema(nodeBoostConfigSchema);\n\n return {\n ...schema,\n $id: \"https://node-boost.dev/schema.json\",\n title: \"node-boost configuration\",\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { DiagnosticCategory, Project } from \"ts-morph\";\nimport { normalizeArchitectures, parseNodeBoostConfig, type NodeBoostConfig } from \"../config/schema.js\";\nimport { detectStack } from \"../detect/stack.js\";\nimport { auditRules } from \"./registry.js\";\nimport { resolveAuditScope } from \"./scope.js\";\nimport { buildSuppressionIndex } from \"./suppression.js\";\nimport type { AuditFile, AuditFinding, AuditResult } from \"./rule.js\";\n\nexport interface RunAuditOptions {\n rootDir?: string;\n mode?: \"all\" | \"changed\" | \"base\" | \"paths\";\n base?: string;\n paths?: string[];\n}\n\nexport class NodeBoostConfigMissingError extends Error {\n constructor() {\n super(\"No node-boost.json found — run node-boost install first.\");\n this.name = \"NodeBoostConfigMissingError\";\n }\n}\n\nexport function isNodeBoostConfigMissingError(error: unknown): error is NodeBoostConfigMissingError {\n return error instanceof NodeBoostConfigMissingError;\n}\n\nexport async function runAudit(options: RunAuditOptions = {}): Promise<AuditResult> {\n const started = performance.now();\n const rootDir = options.rootDir ?? process.cwd();\n const config = await readConfig(rootDir);\n const stack = await detectStack(rootDir);\n const scope = await resolveAuditScope({\n rootDir,\n config,\n mode: options.mode ?? \"all\",\n base: options.base,\n paths: options.paths,\n });\n const parseWarnings: AuditFinding[] = [];\n const files = await readAuditFiles(rootDir, scope.files, parseWarnings);\n const suppressionIndex = buildSuppressionIndex(files);\n const enabledArchitectures = new Map(normalizeArchitectures(config).map((architecture) => [architecture.name, architecture.options]));\n const findings: AuditFinding[] = [...scope.warnings, ...parseWarnings, ...suppressionIndex.metaFindings];\n let suppressed = 0;\n\n for (const rule of auditRules) {\n const severity = config.audit.rules[rule.id] ?? rule.defaultSeverity;\n\n if (severity === \"off\" || !enabledArchitectures.has(rule.architecture) || !rule.stacks.includes(stack.name)) {\n continue;\n }\n\n const rawFindings = rule.check({\n rootDir,\n stack,\n config,\n files,\n allPaths: new Set(scope.files),\n rule,\n severity,\n architectureOptions: enabledArchitectures.get(rule.architecture) ?? {},\n ruleOptions: config.audit.ruleOptions[rule.id] ?? {},\n });\n\n for (const finding of rawFindings) {\n const normalized = { ...finding, sev: severity };\n\n if (suppressionIndex.suppresses(normalized.file, normalized.line, normalized.rule)) {\n suppressed += 1;\n } else {\n findings.push(normalized);\n }\n }\n }\n\n const err = findings.filter((finding) => finding.sev === \"err\").length;\n const warn = findings.filter((finding) => finding.sev === \"warn\").length;\n\n return {\n v: 1,\n ok: err === 0,\n cmd: \"audit\",\n scope: scope.mode,\n err,\n warn,\n scanned: files.filter((file) => !file.skipped).length,\n skipped: files.filter((file) => file.skipped).length,\n suppressed,\n elapsedMs: Math.round(performance.now() - started),\n findings: findings.sort(compareFindings),\n };\n}\n\nasync function readConfig(rootDir: string): Promise<NodeBoostConfig> {\n const configPath = join(rootDir, \"node-boost.json\");\n const raw = await readFile(configPath, \"utf8\").catch((error: unknown) => {\n if (isFileNotFoundError(error)) {\n throw new NodeBoostConfigMissingError();\n }\n\n throw error;\n });\n\n return parseNodeBoostConfig(JSON.parse(raw));\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n\nasync function readAuditFiles(rootDir: string, files: string[], parseWarnings: AuditFinding[]): Promise<AuditFile[]> {\n const project = new Project({\n compilerOptions: {\n allowJs: true,\n checkJs: false,\n jsx: 4,\n skipLibCheck: true,\n },\n skipAddingFilesFromTsConfig: true,\n });\n\n return Promise.all(\n files.map(async (file) => {\n const absolutePath = join(rootDir, file);\n const content = await readFile(absolutePath, \"utf8\");\n const started = performance.now();\n const sourceFile = project.addSourceFileAtPath(absolutePath);\n const diagnostics = sourceFile.getPreEmitDiagnostics().filter((diagnostic) => diagnostic.getCategory() === DiagnosticCategory.Error && diagnostic.getCode() < 2000);\n const elapsed = performance.now() - started;\n const skipped = diagnostics.length > 0 || elapsed > 5000;\n\n if (diagnostics.length > 0) {\n parseWarnings.push({\n rule: \"NB-META-002\",\n sev: \"warn\",\n file,\n line: diagnostics[0]?.getLineNumber() ?? 1,\n code: \"parse-error\",\n });\n } else if (elapsed > 5000) {\n parseWarnings.push({\n rule: \"NB-META-003\",\n sev: \"warn\",\n file,\n line: 1,\n code: \"parse-timeout\",\n });\n }\n\n return {\n path: file,\n absolutePath,\n content,\n lines: content.split(/\\r?\\n/),\n sourceFile: skipped ? null : sourceFile,\n skipped,\n };\n }),\n );\n}\n\nfunction compareFindings(a: AuditFinding, b: AuditFinding): number {\n return a.file.localeCompare(b.file) || a.line - b.line || a.rule.localeCompare(b.rule);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { detectPackageManager } from \"./package-manager.js\";\nimport { detectNextRouter } from \"./router.js\";\nimport type { DetectedStack, LintingKind, PackageInfo, StackName } from \"../types.js\";\n\nconst trackedPackages = [\n \"next\",\n \"react\",\n \"vite\",\n \"react-router\",\n \"typescript\",\n \"tailwindcss\",\n \"zod\",\n \"@tanstack/react-query\",\n \"zustand\",\n \"vitest\",\n \"jest\",\n \"playwright\",\n \"eslint\",\n \"prettier\",\n \"@biomejs/biome\",\n] as const;\n\ntype PackageJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n};\n\nexport async function detectStack(rootDir: string): Promise<DetectedStack> {\n const packageJson = await readPackageJson(rootDir);\n const packageManager = await detectPackageManager(rootDir);\n const packages = await detectPackages(rootDir, packageJson);\n const warnings: string[] = [];\n\n const name = detectStackName(packages);\n const nextRouter = name === \"next\" ? await detectNextRouter(rootDir) : null;\n const router = nextRouter?.router ?? (name === \"vite-react\" ? \"react-router\" : \"none\");\n const srcDir = nextRouter?.srcDir ?? false;\n const linting = detectLinting(packages);\n\n if (Object.values(packages).some((pkg) => pkg.source === \"range\")) {\n warnings.push(\"node_modules not available for at least one package; using declared version range fallback.\");\n }\n\n return {\n rootDir,\n name,\n router,\n srcDir,\n linting,\n packageManager,\n packages,\n warnings,\n };\n}\n\nfunction detectLinting(packages: Record<string, PackageInfo>): LintingKind {\n if (packages[\"@biomejs/biome\"]?.version) {\n return \"biome\";\n }\n\n if (packages.eslint?.version && packages.prettier?.version) {\n return \"eslint-prettier\";\n }\n\n if (packages.eslint?.version) {\n return \"eslint\";\n }\n\n return \"none\";\n}\n\nasync function detectPackages(rootDir: string, packageJson: PackageJson): Promise<Record<string, PackageInfo>> {\n const packages: Record<string, PackageInfo> = {};\n\n for (const packageName of trackedPackages) {\n const declaredRange = findDeclaredRange(packageJson, packageName);\n const installedVersion = await readInstalledVersion(rootDir, packageName);\n const version = installedVersion ?? extractVersionFromRange(declaredRange);\n\n packages[packageName] = {\n name: packageName,\n declaredRange,\n version,\n major: version ? parseMajor(version) : null,\n source: installedVersion ? \"node_modules\" : version ? \"range\" : \"missing\",\n };\n }\n\n return packages;\n}\n\nfunction detectStackName(packages: Record<string, PackageInfo>): StackName {\n if (packages.next?.version) {\n return \"next\";\n }\n\n if (packages.react?.version && packages.vite?.version && packages[\"react-router\"]?.version) {\n return \"vite-react\";\n }\n\n if (packages.react?.version) {\n return \"react-generic\";\n }\n\n return \"unknown\";\n}\n\nasync function readPackageJson(rootDir: string): Promise<PackageJson> {\n const raw = await readFile(join(rootDir, \"package.json\"), \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (!isObject(parsed)) {\n throw new Error(\"package.json must contain an object.\");\n }\n\n return parsed;\n}\n\nfunction findDeclaredRange(packageJson: PackageJson, packageName: string): string | null {\n return (\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n packageJson.peerDependencies?.[packageName] ??\n packageJson.optionalDependencies?.[packageName] ??\n null\n );\n}\n\nasync function readInstalledVersion(rootDir: string, packageName: string): Promise<string | null> {\n try {\n const raw = await readFile(join(rootDir, \"node_modules\", packageName, \"package.json\"), \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (isObject(parsed) && typeof parsed.version === \"string\") {\n return parsed.version;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport function extractVersionFromRange(range: string | null): string | null {\n if (!range) {\n return null;\n }\n\n const match = range.match(/\\d+\\.\\d+\\.\\d+|\\d+\\.\\d+|\\d+/);\n\n if (!match) {\n return null;\n }\n\n const [major = \"0\", minor = \"0\", patch = \"0\"] = match[0].split(\".\");\n return `${major}.${minor}.${patch}`;\n}\n\nexport function parseMajor(version: string): number | null {\n const major = Number.parseInt(version.split(\".\")[0] ?? \"\", 10);\n return Number.isFinite(major) ? major : null;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PackageManagerInfo, PackageManagerName } from \"../types.js\";\n\nconst lockfiles: Array<{ name: PackageManagerName; file: string }> = [\n { name: \"pnpm\", file: \"pnpm-lock.yaml\" },\n { name: \"yarn\", file: \"yarn.lock\" },\n { name: \"bun\", file: \"bun.lockb\" },\n { name: \"bun\", file: \"bun.lock\" },\n { name: \"npm\", file: \"package-lock.json\" },\n];\n\nexport async function detectPackageManager(rootDir: string): Promise<PackageManagerInfo> {\n const packageJson = await readJsonObject(join(rootDir, \"package.json\"));\n const declaredPackageManager = parsePackageManager(packageJson);\n\n for (const lockfile of lockfiles) {\n if (await fileExists(join(rootDir, lockfile.file))) {\n return {\n name: lockfile.name,\n lockfile: lockfile.file,\n version: declaredPackageManager?.name === lockfile.name ? declaredPackageManager.version : null,\n source: \"lockfile\",\n };\n }\n }\n\n if (declaredPackageManager) {\n return { name: declaredPackageManager.name, lockfile: null, version: declaredPackageManager.version, source: \"packageManagerField\" };\n }\n\n return { name: \"npm\", lockfile: null, version: null, source: \"default\" };\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJsonObject(path: string): Promise<Record<string, unknown> | null> {\n try {\n const raw = await readFile(path, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return isObject(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction isPackageManagerName(value: string | undefined): value is PackageManagerName {\n return value === \"npm\" || value === \"pnpm\" || value === \"yarn\" || value === \"bun\";\n}\n\nfunction parsePackageManager(packageJson: Record<string, unknown> | null): { name: PackageManagerName; version: string | null } | null {\n const packageManager = typeof packageJson?.packageManager === \"string\" ? packageJson.packageManager : null;\n const [managerName, version = null] = packageManager?.split(\"@\") ?? [];\n\n if (isPackageManagerName(managerName)) {\n return { name: managerName, version };\n }\n\n return null;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { RouterKind } from \"../types.js\";\n\nexport interface NextRouterDetection {\n router: RouterKind;\n srcDir: boolean;\n}\n\nexport async function detectNextRouter(rootDir: string): Promise<NextRouterDetection> {\n const hasRootApp = await directoryExists(join(rootDir, \"app\"));\n const hasSrcApp = await directoryExists(join(rootDir, \"src\", \"app\"));\n const hasRootPages = await directoryExists(join(rootDir, \"pages\"));\n const hasSrcPages = await directoryExists(join(rootDir, \"src\", \"pages\"));\n\n if (hasRootApp || hasSrcApp) {\n return { router: \"app\", srcDir: hasSrcApp };\n }\n\n if (hasRootPages || hasSrcPages) {\n return { router: \"pages\", srcDir: hasSrcPages };\n }\n\n return { router: \"unknown\", srcDir: false };\n}\n\nasync function directoryExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, normalize } from \"node:path\";\nimport picomatch from \"picomatch\";\nimport type { AuditFile, AuditFinding } from \"../rule.js\";\n\nexport function hasUseClientDirective(file: AuditFile): boolean {\n return file.lines.some((line) => {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"//\")) {\n return false;\n }\n\n return trimmed === '\"use client\";' || trimmed === '\"use client\"' || trimmed === \"'use client';\" || trimmed === \"'use client'\";\n });\n}\n\nexport function isClientComponent(file: AuditFile, stackName: string): boolean {\n return stackName === \"vite-react\" || hasUseClientDirective(file);\n}\n\nexport function isDataLayerFile(file: AuditFile, globs: string[]): boolean {\n if (file.path.endsWith(\"/route.ts\") || file.path.endsWith(\"/route.tsx\")) {\n return true;\n }\n\n return picomatch(globs)(file.path);\n}\n\nexport function dataLayerGlobs(options: Record<string, unknown>): string[] {\n const configured = options.dataLayerGlobs;\n return Array.isArray(configured) && configured.every((item) => typeof item === \"string\")\n ? configured\n : [\"**/api/**\", \"**/server/**\", \"lib/api/**\", \"src/lib/api/**\"];\n}\n\nexport function lineOf(content: string, pattern: RegExp): number {\n const lines = content.split(/\\r?\\n/);\n const index = lines.findIndex((line) => pattern.test(line));\n return index >= 0 ? index + 1 : 1;\n}\n\nexport function finding(file: AuditFile, rule: string, code: string, line: number, ref?: string): AuditFinding {\n return {\n rule,\n sev: \"warn\",\n file: file.path,\n line,\n code,\n ref,\n };\n}\n\nexport function importSpecs(file: AuditFile): Array<{ spec: string; line: number }> {\n const specs: Array<{ spec: string; line: number }> = [];\n const patterns = [\n /^\\s*import\\s+(?:type\\s+)?(?:[^'\"]+\\s+from\\s+)?[\"']([^\"']+)[\"']/,\n /^\\s*export\\s+[^'\"]+\\s+from\\s+[\"']([^\"']+)[\"']/,\n ];\n\n file.lines.forEach((line, index) => {\n for (const pattern of patterns) {\n const match = line.match(pattern);\n if (match?.[1]) {\n specs.push({ spec: match[1], line: index + 1 });\n }\n }\n });\n\n return specs;\n}\n\nexport function resolveImportPath(file: AuditFile, spec: string): string {\n if (spec.startsWith(\".\")) {\n return toPosix(normalize(join(dirname(file.path), spec)));\n }\n\n return spec.replace(/^@\\/?/, \"\").replace(/^~\\/?/, \"\");\n}\n\nexport function isConfigFile(path: string): boolean {\n return /(^|\\/)[^/]*\\.config\\.[cm]?[jt]sx?$/.test(path);\n}\n\nexport function firstImportIndex(file: AuditFile): number {\n const index = file.lines.findIndex((line) => line.trim().startsWith(\"import \"));\n return index >= 0 ? index : file.lines.length;\n}\n\nexport function hasGeneratedClientDependency(rootDir: string): boolean {\n try {\n const packageJson = JSON.parse(existsSync(join(rootDir, \"package.json\")) ? readFileSync(join(rootDir, \"package.json\"), \"utf8\") : \"{}\") as {\n devDependencies?: Record<string, string>;\n };\n return Boolean(packageJson.devDependencies?.orval || packageJson.devDependencies?.[\"openapi-typescript\"]);\n } catch {\n return false;\n }\n}\n\nexport function toPosix(path: string): string {\n return path.replaceAll(\"\\\\\", \"/\");\n}\n","import type { AuditRule } from \"../rule.js\";\nimport { dataLayerGlobs, finding, isClientComponent, isDataLayerFile } from \"./helpers.js\";\n\nconst networkPattern = /\\b(fetch\\s*\\(|axios\\.|ky\\s*\\(|ky\\.)/;\n\nexport const dataAccessLayerRules: AuditRule[] = [\n {\n id: \"NB-ARCH-005\",\n code: \"fetch-in-client-component\",\n architecture: \"data-access-layer\",\n defaultSeverity: \"err\",\n stacks: [\"next\", \"vite-react\"],\n kind: \"line\",\n check(context) {\n const globs = dataLayerGlobs(context.ruleOptions);\n return context.files.flatMap((file) => {\n if (!isClientComponent(file, context.stack.name) || isDataLayerFile(file, globs) || isQueryHook(file)) {\n return [];\n }\n\n return networkFindings(file, \"NB-ARCH-005\", \"fetch-in-client-component\");\n });\n },\n },\n {\n id: \"NB-ARCH-006\",\n code: \"raw-fetch-in-rsc\",\n architecture: \"data-access-layer\",\n defaultSeverity: \"warn\",\n stacks: [\"next\"],\n kind: \"line\",\n check(context) {\n const globs = dataLayerGlobs(context.ruleOptions);\n return context.files.flatMap((file) => {\n if (isClientComponent(file, context.stack.name) || isDataLayerFile(file, globs)) {\n return [];\n }\n\n return networkFindings(file, \"NB-ARCH-006\", \"raw-fetch-in-rsc\").filter((item) => item.code === \"raw-fetch-in-rsc\");\n });\n },\n },\n];\n\nfunction networkFindings(file: Parameters<typeof finding>[0], rule: string, code: string) {\n return file.lines.flatMap((line, index) => (networkPattern.test(line) ? [finding(file, rule, code, index + 1)] : []));\n}\n\nfunction isQueryHook(file: Parameters<typeof finding>[0]): boolean {\n return /(^|\\/)use[A-Z][^/]*\\.tsx?$/.test(file.path) && /\\buse(Query|Mutation)\\s*\\(/.test(file.content);\n}\n","import { dirname } from \"node:path\";\nimport type { AuditRule } from \"../rule.js\";\nimport { finding } from \"./helpers.js\";\n\nexport const errorLoadingBoundaryRules: AuditRule[] = [\n {\n id: \"NB-ARCH-010\",\n code: \"segment-without-boundaries\",\n architecture: \"error-loading-boundaries\",\n defaultSeverity: \"warn\",\n stacks: [\"next\"],\n kind: \"project\",\n check(context) {\n return context.files.flatMap((file) => {\n if (!/(^|\\/)app\\/.+\\/page\\.tsx?$/.test(file.path) || !/\\b(async|await)\\b/.test(file.content)) {\n return [];\n }\n\n return hasBoundaryInBranch(file.path, context.allPaths)\n ? []\n : [finding(file, \"NB-ARCH-010\", \"segment-without-boundaries\", 1)];\n });\n },\n },\n];\n\nfunction hasBoundaryInBranch(pagePath: string, allPaths: Set<string>): boolean {\n let current = dirname(pagePath);\n\n while (current.includes(\"/app/\") || current.endsWith(\"/app\") || current === \"app\" || current === \"src/app\") {\n for (const name of [\"loading.tsx\", \"loading.ts\", \"loading.jsx\", \"loading.js\", \"error.tsx\", \"error.ts\", \"error.jsx\", \"error.js\"]) {\n if (allPaths.has(`${current}/${name}`)) {\n return true;\n }\n }\n\n if (current.endsWith(\"/app\") || current === \"app\" || current === \"src/app\") {\n break;\n }\n\n current = dirname(current);\n }\n\n return false;\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AuditRule } from \"../rule.js\";\nimport { finding, importSpecs, resolveImportPath } from \"./helpers.js\";\n\nexport const featureModuleRules: AuditRule[] = [\n {\n id: \"NB-ARCH-001\",\n code: \"cross-feature-deep-import\",\n architecture: \"feature-modules\",\n defaultSeverity: \"err\",\n stacks: [\"next\", \"vite-react\"],\n kind: \"line\",\n check(context) {\n const featuresDir = typeof context.ruleOptions.featuresDir === \"string\" ? context.ruleOptions.featuresDir : \"src/features\";\n const normalizedFeaturesDir = featuresDir.replace(/\\/$/, \"\");\n\n if (!existsSync(join(context.rootDir, normalizedFeaturesDir))) {\n return [];\n }\n\n const boundary = context.architectureOptions.boundary === \"forbid\" ? \"forbid\" : \"public-api\";\n\n return context.files.flatMap((file) => {\n const sourceFeature = featureName(file.path, normalizedFeaturesDir);\n if (!sourceFeature) {\n return [];\n }\n\n return importSpecs(file).flatMap(({ spec, line }) => {\n const targetPath = resolveImportPath(file, spec);\n const targetFeature = featureName(targetPath, normalizedFeaturesDir);\n\n if (!targetFeature || targetFeature === sourceFeature) {\n return [];\n }\n\n const suffix = targetPath.slice(`${normalizedFeaturesDir}/${targetFeature}/`.length);\n const allowedPublicApi = boundary === \"public-api\" && (suffix === \"index\" || suffix === \"index.ts\" || suffix === \"index.tsx\");\n\n return allowedPublicApi ? [] : [finding(file, \"NB-ARCH-001\", \"cross-feature-deep-import\", line, targetPath)];\n });\n });\n },\n },\n {\n id: \"NB-ARCH-002\",\n code: \"feature-imports-app\",\n architecture: \"feature-modules\",\n defaultSeverity: \"err\",\n stacks: [\"next\", \"vite-react\"],\n kind: \"line\",\n check(context) {\n const featuresDir = typeof context.ruleOptions.featuresDir === \"string\" ? context.ruleOptions.featuresDir : \"src/features\";\n return context.files.flatMap((file) => {\n if (!featureName(file.path, featuresDir)) {\n return [];\n }\n\n return importSpecs(file).flatMap(({ spec, line }) => {\n const target = resolveImportPath(file, spec);\n return /^(src\\/)?(app|routes)(\\/|$)/.test(target) ? [finding(file, \"NB-ARCH-002\", \"feature-imports-app\", line, target)] : [];\n });\n });\n },\n },\n];\n\nfunction featureName(path: string, featuresDir: string): string | null {\n const normalized = featuresDir.replace(/\\/$/, \"\");\n const prefix = `${normalized}/`;\n\n if (!path.startsWith(prefix)) {\n return null;\n }\n\n return path.slice(prefix.length).split(\"/\")[0] ?? null;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { AuditRule } from \"../rule.js\";\nimport { finding } from \"./helpers.js\";\n\nexport const modernTypeScriptRules: AuditRule[] = [\n {\n id: \"NB-ARCH-013\",\n code: \"tsconfig-not-strict\",\n architecture: \"modern-typescript\",\n defaultSeverity: \"warn\",\n stacks: [\"next\", \"vite-react\"],\n kind: \"project\",\n check(context) {\n return tsconfigStrict(context.rootDir) ? [] : [{\n rule: \"NB-ARCH-013\",\n sev: \"warn\",\n file: \"tsconfig.json\",\n line: 1,\n code: \"tsconfig-not-strict\",\n }];\n },\n },\n {\n id: \"NB-ARCH-014\",\n code: \"explicit-any\",\n architecture: \"modern-typescript\",\n defaultSeverity: \"warn\",\n stacks: [\"next\", \"vite-react\"],\n kind: \"line\",\n check(context) {\n return context.files.flatMap((file) => {\n if (/(\\.d\\.ts|\\.test\\.[jt]sx?|\\.spec\\.[jt]sx?)$/.test(file.path) || file.path.startsWith(\"tests/\")) {\n return [];\n }\n\n return file.lines.flatMap((line, index) =>\n /(:\\s*any\\b|as\\s+any\\b|<any>)/.test(line) ? [finding(file, \"NB-ARCH-014\", \"explicit-any\", index + 1)] : [],\n );\n });\n },\n },\n];\n\nfunction tsconfigStrict(rootDir: string): boolean {\n const visited = new Set<string>();\n return readStrictFromTsconfig(join(rootDir, \"tsconfig.json\"), visited) === true;\n}\n\nfunction readStrictFromTsconfig(path: string, visited: Set<string>): boolean | null {\n if (visited.has(path) || !existsSync(path)) {\n return null;\n }\n\n visited.add(path);\n\n const parsed = JSON.parse(stripJsonComments(readFileSync(path, \"utf8\"))) as {\n extends?: string;\n compilerOptions?: { strict?: boolean };\n };\n\n if (parsed.compilerOptions?.strict !== undefined) {\n return parsed.compilerOptions.strict;\n }\n\n if (!parsed.extends) {\n return null;\n }\n\n if (parsed.extends.startsWith(\".\")) {\n return readStrictFromTsconfig(resolve(dirname(path), parsed.extends), visited);\n }\n\n return null;\n}\n\nfunction stripJsonComments(value: string): string {\n return value.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\").replace(/^\\s*\\/\\/.*$/gm, \"\");\n}\n","import type { AuditRule } from \"../rule.js\";\nimport { finding } from \"./helpers.js\";\n\nexport const secureByDefaultRules: AuditRule[] = [\n {\n id: \"NB-ARCH-011\",\n code: \"unsanitized-html\",\n architecture: \"secure-by-default\",\n defaultSeverity: \"err\",\n stacks: [\"next\", \"vite-react\"],\n kind: \"line\",\n check(context) {\n return context.files.flatMap((file) =>\n file.lines.flatMap((line, index) => {\n const match = line.match(/dangerouslySetInnerHTML=\\{\\{\\s*__html:\\s*([^}]+)\\s*\\}\\}/);\n if (!match) {\n return [];\n }\n\n const value = match[1]?.trim() ?? \"\";\n const safe = /sanitize\\s*\\(/i.test(value) || /^[\"'`]/.test(value);\n return safe ? [] : [finding(file, \"NB-ARCH-011\", \"unsanitized-html\", index + 1)];\n }),\n );\n },\n },\n {\n id: \"NB-ARCH-012\",\n code: \"public-env-secret-name\",\n architecture: \"secure-by-default\",\n defaultSeverity: \"warn\",\n stacks: [\"next\", \"vite-react\"],\n kind: \"line\",\n check(context) {\n return context.files.flatMap((file) =>\n file.lines.flatMap((line, index) => {\n const names = [...line.matchAll(/\\b((?:NEXT_PUBLIC|VITE)_[A-Z0-9_]+)/g)].map((match) => match[1] ?? \"\");\n return names\n .filter((name) => /(SECRET|TOKEN|PRIVATE|PASSWORD|_KEY$)/.test(name))\n .map((name) => finding(file, \"NB-ARCH-012\", \"public-env-secret-name\", index + 1, name));\n }),\n );\n },\n },\n];\n","import type { AuditRule } from \"../rule.js\";\nimport { finding, hasUseClientDirective, lineOf } from \"./helpers.js\";\n\nexport const serverFirstComponentRules: AuditRule[] = [\n {\n id: \"NB-ARCH-003\",\n code: \"use-client-in-entry\",\n architecture: \"server-first-components\",\n defaultSeverity: \"err\",\n stacks: [\"next\"],\n kind: \"line\",\n check(context) {\n return context.files.flatMap((file) => {\n if (!hasUseClientDirective(file) || !/(^|\\/)(page|layout)\\.tsx?$/.test(file.path)) {\n return [];\n }\n\n return [finding(file, \"NB-ARCH-003\", \"use-client-in-entry\", lineOf(file.content, /['\"]use client['\"]/))];\n });\n },\n },\n {\n id: \"NB-ARCH-004\",\n code: \"needless-use-client\",\n architecture: \"server-first-components\",\n defaultSeverity: \"warn\",\n stacks: [\"next\"],\n kind: \"line\",\n check(context) {\n return context.files.flatMap((file) => {\n if (!hasUseClientDirective(file)) {\n return [];\n }\n\n const withoutDirective = file.lines.filter((line) => !line.includes(\"use client\")).join(\"\\n\");\n const needsClient = /\\buse[A-Z]\\w*\\s*\\(/.test(withoutDirective) || /\\bon[A-Z]\\w*\\s*=/.test(withoutDirective) || /\\b(window|document)\\./.test(withoutDirective);\n return needsClient ? [] : [finding(file, \"NB-ARCH-004\", \"needless-use-client\", lineOf(file.content, /['\"]use client['\"]/))];\n });\n },\n },\n];\n","import type { AuditRule } from \"../rule.js\";\nimport { dataLayerGlobs, finding, isDataLayerFile } from \"./helpers.js\";\n\nexport const stateManagementRules: AuditRule[] = [\n {\n id: \"NB-ARCH-009\",\n code: \"server-state-in-store\",\n architecture: \"state-management\",\n defaultSeverity: \"warn\",\n stacks: [\"next\", \"vite-react\"],\n kind: \"ast\",\n check(context) {\n const globs = dataLayerGlobs(context.ruleOptions);\n return context.files.flatMap((file) => {\n if (isDataLayerFile(file, globs)) {\n return [];\n }\n\n const hasServerRead = /\\bawait\\s+(?:fetch\\s*\\(|\\w+\\.(?:get|post|list|fetch|load)\\s*\\()/.test(file.content);\n if (!hasServerRead) {\n return [];\n }\n\n return file.lines.flatMap((line, index) =>\n /\\b(use[A-Z]\\w*Store\\.setState|dispatch|set)\\s*\\(/.test(line)\n ? [finding(file, \"NB-ARCH-009\", \"server-state-in-store\", index + 1)]\n : [],\n );\n });\n },\n },\n];\n","import type { AuditRule } from \"../rule.js\";\nimport { dataLayerGlobs, finding, hasGeneratedClientDependency, isConfigFile, isDataLayerFile } from \"./helpers.js\";\n\nexport const typedContractRules: AuditRule[] = [\n {\n id: \"NB-ARCH-007\",\n code: \"unvalidated-boundary\",\n architecture: \"typed-contracts\",\n defaultSeverity: \"warn\",\n stacks: [\"next\", \"vite-react\"],\n kind: \"line\",\n check(context) {\n if (hasGeneratedClientDependency(context.rootDir)) {\n return [];\n }\n\n const globs = dataLayerGlobs(context.ruleOptions);\n return context.files.flatMap((file) => {\n if (!isDataLayerFile(file, globs) || /\\.s(afe)?parse\\s*\\(/.test(file.content)) {\n return [];\n }\n\n return file.lines.flatMap((line, index) =>\n /(=\\s*await\\s+\\w+\\.json\\s*\\(|=\\s*JSON\\.parse\\s*\\(|as\\s+\\w+.*await\\s+\\w+\\.json\\s*\\()/.test(line)\n ? [finding(file, \"NB-ARCH-007\", \"unvalidated-boundary\", index + 1)]\n : [],\n );\n });\n },\n },\n {\n id: \"NB-ARCH-008\",\n code: \"env-outside-env-file\",\n architecture: \"typed-contracts\",\n defaultSeverity: \"warn\",\n stacks: [\"next\", \"vite-react\"],\n kind: \"line\",\n check(context) {\n const envFiles = envFileGlobs(context.ruleOptions);\n return context.files.flatMap((file) => {\n if (isConfigFile(file.path) || envFiles.some((envFile) => file.path.endsWith(envFile))) {\n return [];\n }\n\n return file.lines.flatMap((line, index) => {\n const names = [...line.matchAll(/(?:process\\.env|import\\.meta\\.env)\\.([A-Z0-9_]+)/g)].map((match) => match[1] ?? \"\");\n return names.filter((name) => name !== \"NODE_ENV\").map((name) => finding(file, \"NB-ARCH-008\", \"env-outside-env-file\", index + 1, name));\n });\n });\n },\n },\n];\n\nfunction envFileGlobs(options: Record<string, unknown>): string[] {\n const configured = options.envFiles;\n return Array.isArray(configured) && configured.every((item) => typeof item === \"string\") ? configured : [\"env.ts\", \"env.mjs\"];\n}\n","import type { ArchitectureSlug } from \"../types.js\";\nimport type { AuditRule, ExplainEntry } from \"./rule.js\";\nimport { dataAccessLayerRules } from \"./rules/data-access-layer.js\";\nimport { errorLoadingBoundaryRules } from \"./rules/error-loading-boundaries.js\";\nimport { featureModuleRules } from \"./rules/feature-modules.js\";\nimport { modernTypeScriptRules } from \"./rules/modern-typescript.js\";\nimport { secureByDefaultRules } from \"./rules/secure-by-default.js\";\nimport { serverFirstComponentRules } from \"./rules/server-first-components.js\";\nimport { stateManagementRules } from \"./rules/state-management.js\";\nimport { typedContractRules } from \"./rules/typed-contracts.js\";\n\nexport const auditRules: AuditRule[] = [\n ...featureModuleRules,\n ...serverFirstComponentRules,\n ...dataAccessLayerRules,\n ...typedContractRules,\n ...stateManagementRules,\n ...errorLoadingBoundaryRules,\n ...secureByDefaultRules,\n ...modernTypeScriptRules,\n];\n\nconst guidelineByArchitecture: Record<ArchitectureSlug, string> = {\n \"feature-modules\": \".ai/guidelines/architectures/feature-modules.md\",\n \"server-first-components\": \".ai/guidelines/architectures/server-first-components.md\",\n \"data-access-layer\": \".ai/guidelines/architectures/data-access-layer.md\",\n \"typed-contracts\": \".ai/guidelines/architectures/typed-contracts.md\",\n \"state-management\": \".ai/guidelines/architectures/state-management.md\",\n \"custom-hooks\": \".ai/guidelines/architectures/custom-hooks.md\",\n \"component-composition\": \".ai/guidelines/architectures/component-composition.md\",\n \"styling-tailwind\": \".ai/guidelines/architectures/styling-tailwind.md\",\n \"testing-strategy\": \".ai/guidelines/architectures/testing-strategy.md\",\n \"error-loading-boundaries\": \".ai/guidelines/architectures/error-loading-boundaries.md\",\n \"secure-by-default\": \".ai/guidelines/architectures/secure-by-default.md\",\n \"modern-typescript\": \".ai/guidelines/architectures/modern-typescript.md\",\n \"ui-states\": \".ai/guidelines/architectures/ui-states.md\",\n};\n\nexport const explainEntries = new Map<string, ExplainEntry>(\n auditRules.map((rule) => [\n rule.id,\n {\n rule: rule.id,\n code: rule.code,\n severity: rule.defaultSeverity,\n architecture: rule.architecture,\n description: describeRule(rule.id),\n rationale: \"This check enforces the selected node-boost architecture guideline and keeps generated agent feedback actionable.\",\n fix: fixRule(rule.id),\n guideline: guidelineByArchitecture[rule.architecture],\n },\n ]),\n);\n\nexport function explainFinding(ruleId: string): ExplainEntry | null {\n return explainEntries.get(ruleId) ?? null;\n}\n\nfunction describeRule(ruleId: string): string {\n const descriptions: Record<string, string> = {\n \"NB-ARCH-001\": \"Feature modules must not deep-import internals from other features.\",\n \"NB-ARCH-002\": \"Feature modules must not depend on app/router entry layers.\",\n \"NB-ARCH-003\": \"Next page and layout entries should stay server-first.\",\n \"NB-ARCH-004\": \"Client directives should be present only when the file needs client-only behavior.\",\n \"NB-ARCH-005\": \"Client components should call a data layer or query hook instead of raw network clients.\",\n \"NB-ARCH-006\": \"Server Components should keep raw fetch calls in a data layer.\",\n \"NB-ARCH-007\": \"Untrusted JSON at data boundaries should be validated.\",\n \"NB-ARCH-008\": \"Environment access should be centralized in env files.\",\n \"NB-ARCH-009\": \"Server data should not be pushed directly into client stores.\",\n \"NB-ARCH-010\": \"Async Next app segments need loading or error boundaries.\",\n \"NB-ARCH-011\": \"Raw HTML injection must be sanitized or static.\",\n \"NB-ARCH-012\": \"Public env names must not look like secrets.\",\n \"NB-ARCH-013\": \"TypeScript projects should run with strict mode.\",\n \"NB-ARCH-014\": \"Source code should avoid explicit any outside tests and declarations.\",\n };\n\n return descriptions[ruleId] ?? \"Unknown node-boost audit rule.\";\n}\n\nfunction fixRule(ruleId: string): string {\n const fixes: Record<string, string> = {\n \"NB-ARCH-001\": \"Import from the feature public index or move shared code to a shared module.\",\n \"NB-ARCH-002\": \"Invert the dependency: app imports features, features do not import app.\",\n \"NB-ARCH-003\": \"Move interactive code to a child client component.\",\n \"NB-ARCH-004\": \"Remove the directive or add a real client-only boundary around interactive code.\",\n \"NB-ARCH-005\": \"Move the request to an API/data module or wrap it in a query hook.\",\n \"NB-ARCH-006\": \"Move raw fetch usage to the configured data layer.\",\n \"NB-ARCH-007\": \"Parse the response with a schema, or rely on a generated typed client.\",\n \"NB-ARCH-008\": \"Read the env var in env.ts/env.mjs and import the typed value.\",\n \"NB-ARCH-009\": \"Keep server state in a query/cache layer and store only UI state.\",\n \"NB-ARCH-010\": \"Add loading.tsx or error.tsx in the segment branch.\",\n \"NB-ARCH-011\": \"Sanitize the HTML value before passing it to dangerouslySetInnerHTML.\",\n \"NB-ARCH-012\": \"Rename the public env var so it does not imply secret material.\",\n \"NB-ARCH-013\": \"Set compilerOptions.strict to true, directly or through an extends chain.\",\n \"NB-ARCH-014\": \"Replace any with a concrete, unknown, or generic type.\",\n };\n\n return fixes[ruleId] ?? \"Open the linked guideline and apply the recommended architecture boundary.\";\n}\n","import { execFile } from \"node:child_process\";\nimport { realpath, readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport picomatch from \"picomatch\";\nimport type { NodeBoostConfig } from \"../config/schema.js\";\nimport type { AuditFinding, AuditScopeResult } from \"./rule.js\";\n\nconst execFileAsync = promisify(execFile);\nconst sourceFilePattern = /\\.(tsx?|jsx?)$/;\nconst defaultExcludes = [\"node_modules/**\", \"dist/**\", \".next/**\", \"coverage/**\"];\n\nexport interface ResolveScopeOptions {\n rootDir: string;\n config: NodeBoostConfig;\n mode: \"all\" | \"changed\" | \"base\" | \"paths\";\n base?: string;\n paths?: string[];\n}\n\nexport async function resolveAuditScope(options: ResolveScopeOptions): Promise<AuditScopeResult> {\n const warnings: AuditFinding[] = [];\n const rawFiles = await resolveRawFiles(options, warnings);\n const files = filterSourceFiles(rawFiles, options.config.audit.exclude);\n\n return {\n mode: options.mode,\n files,\n warnings,\n };\n}\n\nasync function resolveRawFiles(options: ResolveScopeOptions, warnings: AuditFinding[]): Promise<string[]> {\n if (options.mode === \"paths\") {\n return options.paths ?? [];\n }\n\n if (options.mode === \"all\") {\n return walkFiles(options.rootDir);\n }\n\n if (options.mode === \"base\") {\n try {\n const gitRoot = await findGitRoot(options.rootDir);\n const mergeBase = (await execGit(gitRoot, [\"merge-base\", options.base ?? \"main\", \"HEAD\"])).trim();\n const diff = await execGit(gitRoot, [\"diff\", \"--name-only\", mergeBase, \"HEAD\"]);\n return gitPathsToProjectRelative(gitRoot, options.rootDir, splitLines(diff));\n } catch {\n warnings.push(metaWarning(\"NB-META-004\", \"git-base-fallback-all\"));\n return walkFiles(options.rootDir);\n }\n }\n\n try {\n const gitRoot = await findGitRoot(options.rootDir);\n const tracked = await execGit(gitRoot, [\"diff\", \"--name-only\", \"HEAD\"]);\n const untracked = await execGit(gitRoot, [\"ls-files\", \"--others\", \"--exclude-standard\"]);\n return gitPathsToProjectRelative(gitRoot, options.rootDir, [...splitLines(tracked), ...splitLines(untracked)]);\n } catch {\n warnings.push(metaWarning(\"NB-META-004\", \"git-changed-fallback-all\"));\n return walkFiles(options.rootDir);\n }\n}\n\nfunction filterSourceFiles(files: string[], configuredExcludes: string[]): string[] {\n const excludes = picomatch([...defaultExcludes, ...configuredExcludes]);\n return [...new Set(files.map(toPosix))]\n .filter((file) => sourceFilePattern.test(file))\n .filter((file) => !excludes(file))\n .sort((a, b) => a.localeCompare(b));\n}\n\nasync function walkFiles(rootDir: string, dir = rootDir): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const files = await Promise.all(\n entries.map(async (entry) => {\n const absolutePath = join(dir, entry.name);\n const rel = toPosix(relative(rootDir, absolutePath));\n\n if (entry.isDirectory()) {\n if (defaultExcludes.some((pattern) => picomatch.isMatch(`${rel}/`, pattern))) {\n return [];\n }\n\n return walkFiles(rootDir, absolutePath);\n }\n\n return entry.isFile() ? [rel] : [];\n }),\n );\n\n return files.flat();\n}\n\nasync function execGit(cwd: string, args: string[]): Promise<string> {\n const { stdout } = await execFileAsync(\"git\", args, { cwd });\n return stdout;\n}\n\nasync function findGitRoot(rootDir: string): Promise<string> {\n return realpath((await execGit(rootDir, [\"rev-parse\", \"--show-toplevel\"])).trim());\n}\n\nasync function gitPathsToProjectRelative(gitRootInput: string, rootDir: string, files: string[]): Promise<string[]> {\n const gitRoot = await realpath(gitRootInput);\n const projectRoot = await realpath(rootDir);\n const projectPrefix = toPosix(relative(gitRoot, projectRoot));\n\n if (!projectPrefix) {\n return files;\n }\n\n return files\n .map(toPosix)\n .filter((file) => file === projectPrefix || file.startsWith(`${projectPrefix}/`))\n .map((file) => file.slice(projectPrefix.length).replace(/^\\//, \"\"));\n}\n\nfunction splitLines(value: string): string[] {\n return value.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean);\n}\n\nfunction toPosix(path: string): string {\n return path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction metaWarning(rule: string, code: string): AuditFinding {\n return {\n rule,\n sev: \"warn\",\n file: \"<project>\",\n line: 1,\n code,\n };\n}\n","import type { AuditFile, AuditFinding } from \"./rule.js\";\n\nconst suppressionPattern = /nb-disable\\s+(NB-[A-Z]+-\\d{3})\\s*(?:--\\s*(.+))?/;\n\nexport interface SuppressionIndex {\n suppresses(file: string, line: number, rule: string): boolean;\n metaFindings: AuditFinding[];\n}\n\nexport function buildSuppressionIndex(files: AuditFile[]): SuppressionIndex {\n const lineSuppressions = new Map<string, Set<string>>();\n const fileSuppressions = new Map<string, Set<string>>();\n const metaFindings: AuditFinding[] = [];\n\n for (const file of files) {\n let beforeImports = true;\n\n file.lines.forEach((line, index) => {\n const lineNo = index + 1;\n const trimmed = line.trim();\n const match = trimmed.match(suppressionPattern);\n\n if (match) {\n const [, rule = \"\", reason = \"\"] = match;\n if (!reason.trim()) {\n metaFindings.push({\n rule: \"NB-META-001\",\n sev: \"warn\",\n file: file.path,\n line: lineNo,\n code: \"suppression-without-reason\",\n });\n }\n\n if (beforeImports) {\n addSuppression(fileSuppressions, file.path, rule);\n }\n\n addSuppression(lineSuppressions, lineKey(file.path, lineNo), rule);\n addSuppression(lineSuppressions, lineKey(file.path, lineNo + 1), rule);\n }\n\n if (trimmed && !trimmed.startsWith(\"//\") && !trimmed.startsWith(\"/*\") && !trimmed.startsWith(\"*\")) {\n beforeImports = !trimmed.startsWith(\"import \");\n }\n });\n }\n\n return {\n metaFindings,\n suppresses(file, line, rule) {\n return Boolean(fileSuppressions.get(file)?.has(rule) || lineSuppressions.get(lineKey(file, line))?.has(rule));\n },\n };\n}\n\nfunction addSuppression(map: Map<string, Set<string>>, key: string, rule: string): void {\n const current = map.get(key) ?? new Set<string>();\n current.add(rule);\n map.set(key, current);\n}\n\nfunction lineKey(file: string, line: number): string {\n return `${file}:${line}`;\n}\n","import type { AuditResult } from \"../rule.js\";\n\nexport function renderAgentReport(result: AuditResult): string {\n return `${JSON.stringify({\n v: result.v,\n ok: result.ok,\n cmd: result.cmd,\n scope: result.scope,\n err: result.err,\n warn: result.warn,\n scanned: result.scanned,\n skipped: result.skipped,\n findings: result.findings,\n })}\\n`;\n}\n","import type { AuditResult } from \"../rule.js\";\n\nexport function renderHumanReport(result: AuditResult): string {\n const lines = result.findings.map((finding) => {\n const ref = finding.ref ? ` -> ${finding.ref}` : \"\";\n return `${finding.file}:${finding.line} | ${finding.rule} | ${finding.sev} | ${finding.code}${ref}`;\n });\n\n lines.push(\n `summary | scanned=${result.scanned} skipped=${result.skipped} suppressed=${result.suppressed} err=${result.err} warn=${result.warn} time=${result.elapsedMs}ms`,\n );\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n","import { join } from \"node:path\";\nimport type { DetectedStack, NormalizedArchitecture, ResourceSelection } from \"../types.js\";\nimport { listResourceFiles } from \"./resources.js\";\n\nconst packageResourceMap: Record<string, string> = {\n react: \"react\",\n next: \"next\",\n vite: \"vite\",\n \"react-router\": \"react-router\",\n zod: \"zod\",\n \"@tanstack/react-query\": \"react-query\",\n zustand: \"zustand\",\n typescript: \"typescript\",\n tailwindcss: \"tailwindcss\",\n vitest: \"testing\",\n playwright: \"testing\",\n};\n\nexport async function composeGuidelines(\n rootDir: string,\n stack: DetectedStack,\n architectures: NormalizedArchitecture[] = [],\n): Promise<ResourceSelection[]> {\n const availableFiles = await listResourceFiles(rootDir, \"guidelines\");\n const selected = new Set<string>([\"core.md\"]);\n\n for (const [packageName, resourceName] of Object.entries(packageResourceMap)) {\n const packageInfo = stack.packages[packageName];\n\n if (!packageInfo?.version) {\n continue;\n }\n\n addIfAvailable(selected, availableFiles, `${resourceName}/core.md`);\n\n if (packageInfo.major !== null) {\n addIfAvailable(selected, availableFiles, `${resourceName}/${packageInfo.major}.md`);\n }\n }\n\n if (stack.packages.vitest?.version) {\n addIfAvailable(selected, availableFiles, \"testing/vitest.md\");\n }\n\n if (stack.packages.playwright?.version) {\n addIfAvailable(selected, availableFiles, \"testing/playwright.md\");\n }\n\n const packageGuidelines = [...selected]\n .sort((a, b) => a.localeCompare(b))\n .map((file) => ({\n kind: \"guideline\",\n sourcePath: join(\"resources\", \"react\", \"guidelines\", file),\n outputPath: join(\".ai\", \"guidelines\", file),\n }) satisfies ResourceSelection);\n\n const architectureGuidelines = architectures.map((architecture) => ({\n kind: \"guideline\",\n sourcePath: join(\"resources\", \"react\", \"architectures\", architecture.name, architectureVariantPath(architecture)),\n outputPath: join(\".ai\", \"guidelines\", \"architectures\", `${architecture.name}.md`),\n }) satisfies ResourceSelection);\n\n return [...packageGuidelines, ...architectureGuidelines].sort((a, b) => a.outputPath.localeCompare(b.outputPath));\n}\n\nfunction addIfAvailable(selected: Set<string>, availableFiles: string[], file: string): void {\n if (availableFiles.includes(file)) {\n selected.add(file);\n }\n}\n\nfunction architectureVariantPath(architecture: NormalizedArchitecture): string {\n if (architecture.name === \"feature-modules\" && typeof architecture.options.boundary === \"string\") {\n return join(\"variants\", `${architecture.options.boundary}.md`);\n }\n\n return \"guideline.md\";\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\n\nexport async function listResourceFiles(rootDir: string, kind: \"guidelines\" | \"skills\"): Promise<string[]> {\n const baseDir = join(rootDir, \"resources\", \"react\", kind);\n const files = await walkMarkdownFiles(baseDir);\n return files.map((file) => relative(baseDir, file)).sort((a, b) => a.localeCompare(b));\n}\n\nasync function walkMarkdownFiles(dir: string): Promise<string[]> {\n let entries;\n\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n\n const files = await Promise.all(\n entries.map(async (entry) => {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n return walkMarkdownFiles(fullPath);\n }\n\n if (entry.isFile() && (entry.name.endsWith(\".md\") || entry.name === \"SKILL.md\")) {\n return [fullPath];\n }\n\n return [];\n }),\n );\n\n return files.flat();\n}\n","import { join } from \"node:path\";\nimport type { DetectedStack, NormalizedArchitecture, ResourceSelection } from \"../types.js\";\nimport { listResourceFiles } from \"./resources.js\";\n\nexport async function composeSkills(\n rootDir: string,\n stack: DetectedStack,\n architectures: NormalizedArchitecture[] = [],\n): Promise<ResourceSelection[]> {\n const availableFiles = await listResourceFiles(rootDir, \"skills\");\n const selected = new Set<string>();\n\n if (stack.packages.react?.version) {\n selected.add(\"react-development/SKILL.md\");\n }\n\n if (stack.name === \"next\") {\n selected.add(\"next-development/SKILL.md\");\n }\n\n if (stack.name === \"vite-react\") {\n selected.add(\"spa-routing/SKILL.md\");\n }\n\n if (stack.packages.tailwindcss?.version) {\n selected.add(\"tailwindcss-development/SKILL.md\");\n }\n\n if (stack.packages.vitest?.version || stack.packages.playwright?.version) {\n selected.add(\"testing-frontend/SKILL.md\");\n }\n\n const packageSkills = [...selected]\n .filter((file) => availableFiles.includes(file))\n .sort((a, b) => a.localeCompare(b))\n .map((file) => ({\n kind: \"skill\",\n sourcePath: join(\"resources\", \"react\", \"skills\", file),\n outputPath: join(\".ai\", \"skills\", file),\n }) satisfies ResourceSelection);\n\n const architectureSkills = architectures.map((architecture) => ({\n kind: \"skill\",\n sourcePath: join(\"resources\", \"react\", \"architectures\", architecture.name, \"skill\", \"SKILL.md\"),\n outputPath: join(\".ai\", \"skills\", architecture.name, \"SKILL.md\"),\n }) satisfies ResourceSelection);\n\n return [...packageSkills, ...architectureSkills].sort((a, b) => a.outputPath.localeCompare(b.outputPath));\n}\n","import type { DetectedStack, NormalizedArchitecture, ResourceSelection } from \"../types.js\";\n\nexport function renderGuidelinesIndex(\n stack: DetectedStack,\n architectures: NormalizedArchitecture[],\n guidelines: ResourceSelection[],\n): string {\n const packages = Object.values(stack.packages)\n .filter((pkg) => pkg.version)\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((pkg) => `- ${pkg.name}: ${pkg.version} (${pkg.source})`);\n\n const architectureLines = architectures.map((architecture) => {\n const suffix = architecture.name === \"feature-modules\" ? ` (${featureModulesBoundary(architecture)})` : \"\";\n return `- ${architecture.name}${suffix}`;\n });\n\n const fileLines = guidelines\n .map((guideline) => `- ${guideline.outputPath}: ${sourceLabel(guideline.sourcePath)}`)\n .sort((a, b) => a.localeCompare(b));\n\n return [\n \"# node-boost guidelines\",\n \"\",\n \"## Stack\",\n \"\",\n `- name: ${stack.name}`,\n `- router: ${stack.router}`,\n `- package manager: ${stack.packageManager.name}`,\n `- linting: ${stack.linting}`,\n \"\",\n \"## Packages\",\n \"\",\n ...(packages.length ? packages : [\"- none detected\"]),\n \"\",\n \"## Architectures\",\n \"\",\n ...(architectureLines.length ? architectureLines : [\"- none selected\"]),\n \"\",\n \"## Files\",\n \"\",\n ...fileLines,\n \"\",\n ].join(\"\\n\");\n}\n\nfunction sourceLabel(sourcePath: string): string {\n return sourcePath.includes(\".node-boost\") ? \"project override\" : \"node-boost built-in\";\n}\n\nfunction featureModulesBoundary(architecture: NormalizedArchitecture): string {\n return typeof architecture.options.boundary === \"string\" ? architecture.options.boundary : \"public-api\";\n}\n","import { access } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport type { ResourceSelection } from \"../types.js\";\n\nexport async function applyResourceOverrides(projectRoot: string, resources: ResourceSelection[]): Promise<ResourceSelection[]> {\n return Promise.all(resources.map((resource) => applyResourceOverride(projectRoot, resource)));\n}\n\nasync function applyResourceOverride(projectRoot: string, resource: ResourceSelection): Promise<ResourceSelection> {\n const outputRelative = normalize(relative(join(\".ai\", resource.kind === \"guideline\" ? \"guidelines\" : \"skills\"), resource.outputPath));\n const overridePath = join(projectRoot, \".node-boost\", resource.kind === \"guideline\" ? \"guidelines\" : \"skills\", outputRelative);\n\n try {\n await access(overridePath);\n return {\n ...resource,\n sourcePath: overridePath,\n };\n } catch {\n return resource;\n }\n}\n\nfunction normalize(path: string): string {\n return path.split(\"\\\\\").join(\"/\");\n}\n","import { cancel, confirm, intro, isCancel, multiselect, outro, select } from \"@clack/prompts\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport { ZodError } from \"zod\";\nimport { agentInstallers } from \"../agents/index.js\";\nimport { createHookCommand, createMcpCommand, type FileOperation } from \"../agents/agent.js\";\nimport { applyResourceOverrides } from \"../compose/overrides.js\";\nimport { composeGuidelines } from \"../compose/guidelines.js\";\nimport { composeSkills } from \"../compose/skills.js\";\nimport { renderGuidelinesIndex } from \"../compose/index-file.js\";\nimport {\n nodeBoostConfigSchema,\n normalizeArchitectures,\n parseNodeBoostConfig,\n type NodeBoostConfig,\n} from \"../config/schema.js\";\nimport { detectStack } from \"../detect/stack.js\";\nimport { getStackAdapter } from \"../stacks/adapter.js\";\nimport type { AgentName, ArchitectureConfigEntry, ArchitectureSlug, DetectedStack, FeatureName, ResourceSelection } from \"../types.js\";\nimport { findNearestPackageRoot, isWorkspaceRoot, pathExists, readPackageJson, resolveDefaultPackageRoot } from \"./project.js\";\n\nconst allAgents = [\"claude-code\", \"codex\", \"cursor\"] satisfies AgentName[];\nconst defaultFeatures = {\n guidelines: true,\n skills: true,\n mcp: true,\n architecture: true,\n hooks: false,\n};\n\nexport interface InstallOptions {\n cwd?: string;\n packageRoot?: string;\n noInteraction?: boolean;\n}\n\nexport interface UpdateOptions {\n cwd?: string;\n packageRoot?: string;\n}\n\nexport interface FileOperationResult extends FileOperation {\n status: \"created\" | \"updated\" | \"skipped\";\n}\n\nexport interface InstallResult {\n projectRoot: string;\n stack: DetectedStack;\n config: NodeBoostConfig;\n operations: FileOperationResult[];\n}\n\nexport async function runInstall(options: InstallOptions = {}): Promise<InstallResult> {\n const cwd = options.cwd ?? process.cwd();\n const packageRoot = options.packageRoot ?? (await resolveDefaultPackageRoot(import.meta.url));\n const projectRoot = await resolveProjectRoot(cwd);\n const stack = await detectStack(projectRoot);\n const config = options.noInteraction\n ? await createDefaultConfig(packageRoot, projectRoot, stack)\n : await promptForConfig(packageRoot, projectRoot, stack);\n const operations = await buildInstallOperations({ packageRoot, projectRoot, stack, config });\n const applied = await applyFileOperations(projectRoot, operations);\n\n if (!options.noInteraction) {\n outro(renderSummary(applied));\n }\n\n return {\n projectRoot,\n stack,\n config,\n operations: applied,\n };\n}\n\nexport async function runUpdate(options: UpdateOptions = {}): Promise<InstallResult> {\n const cwd = options.cwd ?? process.cwd();\n const packageRoot = options.packageRoot ?? (await resolveDefaultPackageRoot(import.meta.url));\n const projectRoot = await resolveProjectRoot(cwd);\n const stack = await detectStack(projectRoot);\n const configPath = join(projectRoot, \"node-boost.json\");\n const rawConfig = await readFile(configPath, \"utf8\");\n const config = parseConfigWithReadableErrors(JSON.parse(rawConfig));\n const operations = await buildInstallOperations({ packageRoot, projectRoot, stack, config });\n\n return {\n projectRoot,\n stack,\n config,\n operations: await applyFileOperations(projectRoot, operations),\n };\n}\n\nexport async function buildInstallOperations(input: {\n packageRoot: string;\n projectRoot: string;\n stack: DetectedStack;\n config: NodeBoostConfig;\n}): Promise<FileOperation[]> {\n const architectures = input.config.features.architecture ? normalizeArchitectures(input.config) : [];\n const selectedGuidelines = input.config.features.guidelines\n ? await applyResourceOverrides(input.projectRoot, await composeGuidelines(input.packageRoot, input.stack, architectures))\n : [];\n const selectedSkills = input.config.features.skills\n ? await applyResourceOverrides(input.projectRoot, await composeSkills(input.packageRoot, input.stack, architectures))\n : [];\n\n const guidelineOperations = await readResourceOperations(input.packageRoot, selectedGuidelines);\n const skillOperations = await readResourceOperations(input.packageRoot, selectedSkills);\n const skillContentByOutputPath = new Map(skillOperations.map((operation) => [operation.path, operation.content]));\n const existingContent = await preloadExisting(input.projectRoot, [\n \"CLAUDE.md\",\n \"AGENTS.md\",\n \".mcp.json\",\n \".claude/settings.json\",\n \".codex/hooks.json\",\n \".codex/config.toml\",\n \".cursor/hooks.json\",\n \".cursor/mcp.json\",\n ]);\n\n const mcpCommand = createMcpCommand(input.stack.packageManager.name);\n const hookCommands = {\n \"claude-code\": createHookCommand(input.stack.packageManager.name, \"claude-code\"),\n codex: createHookCommand(input.stack.packageManager.name, \"codex\"),\n cursor: createHookCommand(input.stack.packageManager.name, \"cursor\"),\n };\n const agentOperations = input.config.agents.flatMap((agentName) =>\n agentInstallers[agentName]\n .render({\n guidelinesIndexPath: \".ai/guidelines/node-boost.md\",\n skillsIndexPath: \".ai/skills\",\n selectedSkills,\n existingContent: (path) => existingContent.get(path) ?? null,\n skillContentByOutputPath,\n mcpCommand,\n hookCommands,\n })\n .filter((operation) => keepOperationForFeatures(operation.path, input.config.features)),\n );\n\n return dedupeOperations([\n ...guidelineOperations,\n {\n path: \".ai/guidelines/node-boost.md\",\n content: renderGuidelinesIndex(input.stack, architectures, selectedGuidelines),\n },\n ...skillOperations,\n ...agentOperations,\n {\n path: \"node-boost.json\",\n content: `${JSON.stringify(input.config, null, 2)}\\n`,\n },\n ]);\n}\n\nexport async function applyFileOperations(projectRoot: string, operations: FileOperation[]): Promise<FileOperationResult[]> {\n const results: FileOperationResult[] = [];\n\n for (const operation of operations) {\n const target = join(projectRoot, operation.path);\n const previous = await readOptional(target);\n const status = previous === null ? \"created\" : previous === operation.content ? \"skipped\" : \"updated\";\n\n if (status !== \"skipped\") {\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, operation.content, \"utf8\");\n }\n\n results.push({ ...operation, status });\n }\n\n return results;\n}\n\nasync function resolveProjectRoot(cwd: string): Promise<string> {\n const projectRoot = await findNearestPackageRoot(cwd);\n\n if (!projectRoot) {\n throw new Error(\"No package.json found. Run node-boost inside a Node project.\");\n }\n\n const stack = await detectStack(projectRoot);\n if (stack.name === \"unknown\" && (await isWorkspaceRoot(projectRoot))) {\n throw new Error(\"Workspace root has no detectable React stack. Run node-boost in an app directory, for example apps/web.\");\n }\n\n return projectRoot;\n}\n\nasync function createDefaultConfig(packageRoot: string, projectRoot: string, stack: DetectedStack): Promise<NodeBoostConfig> {\n return nodeBoostConfigSchema.parse({\n $schema: \"./schema.json\",\n version: 1,\n generatedWith: await readPackageVersion(packageRoot),\n stack: stack.name,\n agents: allAgents,\n features: defaultFeatures,\n architectures: await defaultArchitectures(projectRoot, stack),\n audit: {\n exclude: [],\n rules: {},\n ruleOptions: {},\n },\n });\n}\n\nasync function promptForConfig(packageRoot: string, projectRoot: string, stack: DetectedStack): Promise<NodeBoostConfig> {\n intro(`node-boost install: ${stack.name} / ${stack.packageManager.name}`);\n\n const agents = await multiselect<AgentName>({\n message: \"Select agents\",\n options: allAgents.map((agent) => ({ label: agent, value: agent })),\n initialValues: [...allAgents],\n required: true,\n });\n abortIfCancelled(agents);\n\n const features = await multiselect<FeatureName>({\n message: \"Select features\",\n options: [\n { label: \"Guidelines\", value: \"guidelines\" },\n { label: \"Skills\", value: \"skills\" },\n { label: \"MCP config\", value: \"mcp\" },\n { label: \"Architecture guidance\", value: \"architecture\" },\n { label: \"Hooks config flag\", value: \"hooks\" },\n ],\n initialValues: [\"guidelines\", \"skills\", \"mcp\", \"architecture\"],\n required: true,\n });\n abortIfCancelled(features);\n\n const featureConfig = {\n guidelines: features.includes(\"guidelines\"),\n skills: features.includes(\"skills\"),\n mcp: features.includes(\"mcp\"),\n architecture: features.includes(\"architecture\"),\n hooks: features.includes(\"hooks\"),\n };\n\n const architectures = featureConfig.architecture\n ? await promptArchitectures(projectRoot, stack)\n : [];\n\n const confirmed = await confirm({\n message: \"Write node-boost files?\",\n initialValue: true,\n });\n abortIfCancelled(confirmed);\n\n if (!confirmed) {\n cancel(\"Install cancelled.\");\n process.exitCode = 1;\n throw new Error(\"Install cancelled.\");\n }\n\n return nodeBoostConfigSchema.parse({\n $schema: \"./schema.json\",\n version: 1,\n generatedWith: await readPackageVersion(packageRoot),\n stack: stack.name,\n agents,\n features: featureConfig,\n architectures,\n audit: {\n exclude: [],\n rules: {},\n ruleOptions: {},\n },\n });\n}\n\nasync function promptArchitectures(projectRoot: string, stack: DetectedStack): Promise<ArchitectureConfigEntry[]> {\n const adapter = getStackAdapter(stack);\n const recommended = adapter?.recommendedArchitectures(stack) ?? [];\n const selected = await multiselect<ArchitectureSlug>({\n message: \"Select architecture guidance\",\n options: recommended.map((architecture) => ({ label: architecture, value: architecture })),\n initialValues: recommended,\n required: false,\n });\n abortIfCancelled(selected);\n\n if (!selected.includes(\"feature-modules\")) {\n return selected;\n }\n\n const suggestedBoundary = await suggestFeatureModulesBoundary(projectRoot);\n const boundary = await select({\n message: \"Feature modules boundary\",\n options: [\n { label: \"Public API imports\", value: \"public-api\", hint: \"Use when features already import from each other.\" },\n { label: \"Forbid cross-feature imports\", value: \"forbid\", hint: \"Use for greenfield or clean module boundaries.\" },\n ],\n initialValue: suggestedBoundary,\n });\n abortIfCancelled(boundary);\n\n return selected.map((architecture) =>\n architecture === \"feature-modules\" ? { name: \"feature-modules\", boundary } : architecture,\n );\n}\n\nasync function defaultArchitectures(projectRoot: string, stack: DetectedStack): Promise<ArchitectureConfigEntry[]> {\n const adapter = getStackAdapter(stack);\n const architectures = adapter?.recommendedArchitectures(stack) ?? [];\n const featureModulesBoundary = await suggestFeatureModulesBoundary(projectRoot);\n\n return architectures.map((architecture) =>\n architecture === \"feature-modules\" ? { name: \"feature-modules\", boundary: featureModulesBoundary } : architecture,\n );\n}\n\nasync function suggestFeatureModulesBoundary(projectRoot: string): Promise<\"public-api\" | \"forbid\"> {\n return (await pathExists(join(projectRoot, \"features\"))) || (await pathExists(join(projectRoot, \"src\", \"features\")))\n ? \"public-api\"\n : \"forbid\";\n}\n\nasync function readResourceOperations(packageRoot: string, resources: ResourceSelection[]): Promise<FileOperation[]> {\n return Promise.all(\n resources.map(async (resource) => ({\n path: resource.outputPath,\n content: await readSource(packageRoot, resource.sourcePath),\n })),\n );\n}\n\nasync function readSource(packageRoot: string, sourcePath: string): Promise<string> {\n const raw = await readFile(isAbsolute(sourcePath) ? sourcePath : join(packageRoot, sourcePath), \"utf8\");\n return raw.endsWith(\"\\n\") ? raw : `${raw}\\n`;\n}\n\nasync function preloadExisting(projectRoot: string, paths: string[]): Promise<Map<string, string | null>> {\n const entries = await Promise.all(paths.map(async (path) => [path, await readOptional(join(projectRoot, path))] as const));\n return new Map(entries);\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nasync function readPackageVersion(packageRoot: string): Promise<string> {\n const packageJson = await readPackageJson(packageRoot);\n return packageJson.version ?? \"0.0.0\";\n}\n\nfunction keepOperationForFeatures(path: string, features: NodeBoostConfig[\"features\"]): boolean {\n if ((path === \".mcp.json\" || path === \".codex/config.toml\" || path === \".cursor/mcp.json\") && !features.mcp) {\n return false;\n }\n\n if ((path === \".claude/settings.json\" || path === \".codex/hooks.json\" || path === \".cursor/hooks.json\") && !features.hooks) {\n return false;\n }\n\n if ((path.startsWith(\".claude/skills/\") || path.startsWith(\".agents/skills/\")) && !features.skills) {\n return false;\n }\n\n if ((path === \"CLAUDE.md\" || path === \"AGENTS.md\" || path === \".cursor/rules/node-boost.mdc\") && !features.guidelines && !features.skills) {\n return false;\n }\n\n return true;\n}\n\nfunction dedupeOperations(operations: FileOperation[]): FileOperation[] {\n return [...new Map(operations.map((operation) => [operation.path, operation])).values()].sort((a, b) =>\n a.path.localeCompare(b.path),\n );\n}\n\nfunction parseConfigWithReadableErrors(input: unknown): NodeBoostConfig {\n try {\n return parseNodeBoostConfig(input);\n } catch (error) {\n if (error instanceof ZodError) {\n const issues = error.issues.map((issue) => `${issue.path.join(\".\") || \"<root>\"}: ${issue.message}`).join(\"\\n\");\n throw new Error(`Invalid node-boost.json:\\n${issues}`, { cause: error });\n }\n\n throw error;\n }\n}\n\nfunction abortIfCancelled<T>(value: T | symbol): asserts value is T {\n if (isCancel(value)) {\n cancel(\"Install cancelled.\");\n process.exitCode = 1;\n throw new Error(\"Install cancelled.\");\n }\n}\n\nfunction renderSummary(results: FileOperationResult[]): string {\n const counts = results.reduce(\n (summary, result) => {\n summary[result.status] += 1;\n return summary;\n },\n { created: 0, updated: 0, skipped: 0 },\n );\n\n return `created ${counts.created}, updated ${counts.updated}, skipped ${counts.skipped}`;\n}\n","import type { Agent, AgentName, PackageManagerName, ResourceSelection } from \"../types.js\";\n\nexport interface McpCommand {\n command: string;\n args: string[];\n}\n\nexport interface FileOperation {\n path: string;\n content: string;\n}\n\nexport interface AgentRenderContext {\n guidelinesIndexPath: string;\n skillsIndexPath: string;\n selectedSkills: ResourceSelection[];\n existingContent: (path: string) => string | null;\n skillContentByOutputPath: Map<string, string>;\n mcpCommand: McpCommand;\n hookCommands: Record<AgentName, McpCommand>;\n}\n\nexport interface AgentInstaller extends Agent {\n render(context: AgentRenderContext): FileOperation[];\n}\n\nexport function createMcpCommand(packageManager: PackageManagerName): McpCommand {\n return createPackageCommand(packageManager, [\"mcp\"]);\n}\n\nexport function createHookCommand(packageManager: PackageManagerName, agent: AgentName): McpCommand {\n return createPackageCommand(packageManager, [\"guard\", \"--hook\", agent]);\n}\n\nexport function createPackageCommand(packageManager: PackageManagerName, nodeBoostArgs: string[]): McpCommand {\n if (packageManager === \"yarn\") {\n return { command: \"yarn\", args: [\"node-boost\", ...nodeBoostArgs] };\n }\n\n if (packageManager === \"bun\") {\n return { command: \"bunx\", args: [\"node-boost\", ...nodeBoostArgs] };\n }\n\n return { command: packageManager, args: [\"exec\", \"node-boost\", ...nodeBoostArgs] };\n}\n\nexport function formatMcpCommand(command: McpCommand): string {\n return [command.command, ...command.args].join(\" \");\n}\n\nexport type AgentInstallerMap = Record<AgentName, AgentInstaller>;\n","import type { McpCommand } from \"./agent.js\";\n\ntype JsonObject = Record<string, unknown>;\n\nexport function mergeClaudeCodeHooks(existingContent: string | null, command: McpCommand): string {\n const root = parseObject(existingContent);\n const hooks = asObject(root.hooks);\n const stop = asArray(hooks.Stop);\n\n hooks.Stop = appendCommandHook(stop, commandString(command), true);\n root.hooks = hooks;\n\n return `${JSON.stringify(sortJson(root), null, 2)}\\n`;\n}\n\nexport function mergeCodexHooks(existingContent: string | null, command: McpCommand): string {\n const root = parseObject(existingContent);\n const hooks = asObject(root.hooks);\n const stop = asArray(hooks.Stop);\n\n hooks.Stop = appendCommandHook(stop, commandString(command), true);\n root.hooks = hooks;\n\n return `${JSON.stringify(sortJson(root), null, 2)}\\n`;\n}\n\nexport function mergeCursorHooks(existingContent: string | null, command: McpCommand): string {\n const root = parseObject(existingContent);\n const hooks = asObject(root.hooks);\n const stop = asArray(hooks.stop);\n const commandValue = commandString(command);\n\n hooks.stop = stop.some((entry) => isObject(entry) && entry.command === commandValue)\n ? stop\n : [...stop, { command: commandValue }];\n root.version = typeof root.version === \"number\" ? root.version : 1;\n root.hooks = hooks;\n\n return `${JSON.stringify(sortJson(root), null, 2)}\\n`;\n}\n\nfunction appendCommandHook(entries: unknown[], command: string, includeType: boolean): unknown[] {\n if (entries.some((entry) => hookGroupHasCommand(entry, command))) {\n return entries;\n }\n\n const hook = includeType ? { type: \"command\", command, timeout: 30 } : { command };\n return [...entries, { hooks: [hook] }];\n}\n\nfunction hookGroupHasCommand(entry: unknown, command: string): boolean {\n return isObject(entry) && Array.isArray(entry.hooks) && entry.hooks.some((hook) => isObject(hook) && hook.command === command);\n}\n\nfunction commandString(command: McpCommand): string {\n return [command.command, ...command.args].join(\" \");\n}\n\nfunction parseObject(content: string | null): JsonObject {\n const parsed: unknown = content?.trim() ? JSON.parse(content) : {};\n return isObject(parsed) ? parsed : {};\n}\n\nfunction asObject(value: unknown): JsonObject {\n return isObject(value) ? value : {};\n}\n\nfunction asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortJson);\n }\n\n if (!isObject(value)) {\n return value;\n }\n\n return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => [key, sortJson(item)]));\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { McpCommand } from \"./agent.js\";\n\ntype JsonObject = Record<string, unknown>;\n\nexport function mergeMcpJson(existingContent: string | null, command: McpCommand): string {\n const parsed: unknown = existingContent?.trim() ? JSON.parse(existingContent) : {};\n const root = isObject(parsed) ? parsed : {};\n const mcpServers = isObject(root.mcpServers) ? root.mcpServers : {};\n\n root.mcpServers = {\n ...mcpServers,\n \"node-boost\": {\n command: command.command,\n args: command.args,\n },\n };\n\n return `${JSON.stringify(sortJson(root), null, 2)}\\n`;\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortJson);\n }\n\n if (!isObject(value)) {\n return value;\n }\n\n return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => [key, sortJson(item)]));\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","export const managedBlockStart = \"<!-- node-boost:start -->\";\nexport const managedBlockEnd = \"<!-- node-boost:end -->\";\n\nexport function renderManagedBlock(body: string): string {\n return `${managedBlockStart}\\n${body.trim()}\\n${managedBlockEnd}\\n`;\n}\n\nexport function upsertManagedBlock(existingContent: string | null, body: string): string {\n const block = renderManagedBlock(body);\n\n if (!existingContent) {\n return block;\n }\n\n const pattern = new RegExp(`${escapeRegExp(managedBlockStart)}[\\\\s\\\\S]*?${escapeRegExp(managedBlockEnd)}\\\\n?`);\n\n if (pattern.test(existingContent)) {\n return existingContent.replace(pattern, block);\n }\n\n const separator = existingContent.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n return `${existingContent}${separator}${block}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type { AgentInstaller, AgentRenderContext, FileOperation } from \"./agent.js\";\nimport { formatMcpCommand } from \"./agent.js\";\nimport { mergeClaudeCodeHooks } from \"./merge-hooks.js\";\nimport { mergeMcpJson } from \"./merge-json.js\";\nimport { upsertManagedBlock } from \"./managed-block.js\";\n\nexport const claudeCodeAgent: AgentInstaller = {\n name: \"claude-code\",\n capabilities: {\n supportsGuidelines: true,\n supportsSkills: true,\n supportsMcp: true,\n supportsHooks: true,\n },\n render(context: AgentRenderContext): FileOperation[] {\n const body = [\n \"# node-boost\",\n \"\",\n `Use ${context.guidelinesIndexPath} as the generated guidance index.`,\n `Repo skills are available in ${context.skillsIndexPath} and mirrored to .claude/skills.`,\n `MCP command: ${formatMcpCommand(context.mcpCommand)}.`,\n ].join(\"\\n\");\n\n return [\n {\n path: \"CLAUDE.md\",\n content: upsertManagedBlock(context.existingContent(\"CLAUDE.md\"), body),\n },\n {\n path: \".mcp.json\",\n content: mergeMcpJson(context.existingContent(\".mcp.json\"), context.mcpCommand),\n },\n {\n path: \".claude/settings.json\",\n content: mergeClaudeCodeHooks(context.existingContent(\".claude/settings.json\"), context.hookCommands[\"claude-code\"]),\n },\n ...context.selectedSkills.map((skill) => ({\n path: skill.outputPath.replace(/^\\.ai\\/skills\\//, \".claude/skills/\"),\n content: context.skillContentByOutputPath.get(skill.outputPath) ?? \"\",\n })),\n ];\n },\n};\n","import { parse, stringify } from \"smol-toml\";\nimport type { McpCommand } from \"./agent.js\";\n\ntype TomlObject = Record<string, unknown>;\n\nexport function mergeCodexMcpToml(existingContent: string | null, command: McpCommand): string {\n const parsed = existingContent?.trim() ? parse(existingContent) : {};\n const root = isObject(parsed) ? parsed : {};\n const mcpServers = isObject(root.mcp_servers) ? root.mcp_servers : {};\n\n root.mcp_servers = {\n ...mcpServers,\n \"node-boost\": {\n command: command.command,\n args: command.args,\n },\n };\n\n return `${stringify(sortToml(root)).trim()}\\n`;\n}\n\nfunction sortToml(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortToml);\n }\n\n if (!isObject(value)) {\n return value;\n }\n\n return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => [key, sortToml(item)]));\n}\n\nfunction isObject(value: unknown): value is TomlObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { AgentInstaller, AgentRenderContext, FileOperation } from \"./agent.js\";\nimport { formatMcpCommand } from \"./agent.js\";\nimport { mergeCodexHooks } from \"./merge-hooks.js\";\nimport { mergeCodexMcpToml } from \"./merge-toml.js\";\nimport { upsertManagedBlock } from \"./managed-block.js\";\n\nexport const codexAgent: AgentInstaller = {\n name: \"codex\",\n capabilities: {\n supportsGuidelines: true,\n supportsSkills: true,\n supportsMcp: true,\n supportsHooks: true,\n },\n render(context: AgentRenderContext): FileOperation[] {\n const body = [\n \"# node-boost\",\n \"\",\n `Use ${context.guidelinesIndexPath} as the generated guidance index.`,\n `Repo skills are installed in .agents/skills and source skills are indexed in ${context.skillsIndexPath}.`,\n `MCP command: ${formatMcpCommand(context.mcpCommand)}.`,\n ].join(\"\\n\");\n\n return [\n {\n path: \"AGENTS.md\",\n content: upsertManagedBlock(context.existingContent(\"AGENTS.md\"), body),\n },\n {\n path: \".codex/config.toml\",\n content: mergeCodexMcpToml(context.existingContent(\".codex/config.toml\"), context.mcpCommand),\n },\n {\n path: \".codex/hooks.json\",\n content: mergeCodexHooks(context.existingContent(\".codex/hooks.json\"), context.hookCommands.codex),\n },\n ...context.selectedSkills.map((skill) => ({\n path: skill.outputPath.replace(/^\\.ai\\/skills\\//, \".agents/skills/\"),\n content: context.skillContentByOutputPath.get(skill.outputPath) ?? \"\",\n })),\n ];\n },\n};\n","import type { AgentInstaller, AgentRenderContext, FileOperation } from \"./agent.js\";\nimport { formatMcpCommand } from \"./agent.js\";\nimport { mergeCursorHooks } from \"./merge-hooks.js\";\nimport { mergeMcpJson } from \"./merge-json.js\";\n\nexport const cursorAgent: AgentInstaller = {\n name: \"cursor\",\n capabilities: {\n supportsGuidelines: true,\n supportsSkills: true,\n supportsMcp: true,\n supportsHooks: true,\n },\n render(context: AgentRenderContext): FileOperation[] {\n return [\n {\n path: \".cursor/rules/node-boost.mdc\",\n content: [\n \"---\",\n \"alwaysApply: true\",\n \"---\",\n \"\",\n \"# node-boost\",\n \"\",\n `Use ${context.guidelinesIndexPath} as the generated guidance index.`,\n `Skills are indexed in ${context.skillsIndexPath}.`,\n `MCP command: ${formatMcpCommand(context.mcpCommand)}.`,\n \"\",\n ].join(\"\\n\"),\n },\n {\n path: \".cursor/mcp.json\",\n content: mergeMcpJson(context.existingContent(\".cursor/mcp.json\"), context.mcpCommand),\n },\n {\n path: \".cursor/hooks.json\",\n content: mergeCursorHooks(context.existingContent(\".cursor/hooks.json\"), context.hookCommands.cursor),\n },\n ];\n },\n};\n","import type { AgentInstallerMap } from \"./agent.js\";\nimport { claudeCodeAgent } from \"./claude-code.js\";\nimport { codexAgent } from \"./codex.js\";\nimport { cursorAgent } from \"./cursor.js\";\n\nexport const agentInstallers: AgentInstallerMap = {\n \"claude-code\": claudeCodeAgent,\n codex: codexAgent,\n cursor: cursorAgent,\n};\n","import type { ArchitectureSlug } from \"../types.js\";\n\nexport const commonArchitectures = [\n \"feature-modules\",\n \"data-access-layer\",\n \"typed-contracts\",\n \"state-management\",\n \"custom-hooks\",\n \"component-composition\",\n \"testing-strategy\",\n \"secure-by-default\",\n \"modern-typescript\",\n \"ui-states\",\n] satisfies ArchitectureSlug[];\n\nexport const nextOnlyArchitectures = [\n \"server-first-components\",\n \"error-loading-boundaries\",\n] satisfies ArchitectureSlug[];\n\nexport const tailwindArchitecture = \"styling-tailwind\" satisfies ArchitectureSlug;\n\nexport function sortArchitectures(architectures: ArchitectureSlug[]): ArchitectureSlug[] {\n return [...architectures].sort((a, b) => a.localeCompare(b));\n}\n","import type { ArchitectureSlug, DetectedStack, StackAdapter } from \"../types.js\";\nimport { hasPackage } from \"./adapter.js\";\nimport { commonArchitectures, nextOnlyArchitectures, sortArchitectures, tailwindArchitecture } from \"./architectures.js\";\n\nexport const nextStackAdapter: StackAdapter = {\n name: \"next\",\n label: \"Next.js\",\n supports(stack: DetectedStack): boolean {\n return stack.name === \"next\";\n },\n applicableArchitectures(stack: DetectedStack): ArchitectureSlug[] {\n const architectures: ArchitectureSlug[] = [...commonArchitectures, ...nextOnlyArchitectures];\n\n if (hasPackage(stack, \"tailwindcss\")) {\n architectures.push(tailwindArchitecture);\n }\n\n return sortArchitectures(architectures);\n },\n recommendedArchitectures(stack: DetectedStack): ArchitectureSlug[] {\n return this.applicableArchitectures(stack);\n },\n};\n","import type { ArchitectureSlug, DetectedStack, StackAdapter } from \"../types.js\";\nimport { hasPackage } from \"./adapter.js\";\nimport { commonArchitectures, sortArchitectures, tailwindArchitecture } from \"./architectures.js\";\n\nexport const viteReactStackAdapter: StackAdapter = {\n name: \"vite-react\",\n label: \"Vite React\",\n supports(stack: DetectedStack): boolean {\n return stack.name === \"vite-react\";\n },\n applicableArchitectures(stack: DetectedStack): ArchitectureSlug[] {\n const architectures: ArchitectureSlug[] = [...commonArchitectures];\n\n if (hasPackage(stack, \"tailwindcss\")) {\n architectures.push(tailwindArchitecture);\n }\n\n return sortArchitectures(architectures);\n },\n recommendedArchitectures(stack: DetectedStack): ArchitectureSlug[] {\n return this.applicableArchitectures(stack);\n },\n};\n","import type { DetectedStack, StackAdapter } from \"../types.js\";\nimport { nextStackAdapter } from \"./next.js\";\nimport { viteReactStackAdapter } from \"./vite-react.js\";\n\nexport const stackAdapters: StackAdapter[] = [nextStackAdapter, viteReactStackAdapter];\n\nexport function getStackAdapter(stack: DetectedStack): StackAdapter | null {\n return stackAdapters.find((adapter) => adapter.supports(stack)) ?? null;\n}\n\nexport function hasPackage(stack: DetectedStack, packageName: string): boolean {\n return Boolean(stack.packages[packageName]?.version);\n}\n","import { access, readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface PackageJson {\n name?: string;\n version?: string;\n workspaces?: unknown;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n}\n\nexport async function findNearestPackageRoot(cwd: string): Promise<string | null> {\n let current = cwd;\n\n while (true) {\n if (await pathExists(join(current, \"package.json\"))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n\n current = parent;\n }\n}\n\nexport async function readPackageJson(rootDir: string): Promise<PackageJson> {\n const raw = await readFile(join(rootDir, \"package.json\"), \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (!isObject(parsed)) {\n throw new Error(\"package.json must contain an object.\");\n }\n\n return parsed;\n}\n\nexport async function isWorkspaceRoot(rootDir: string): Promise<boolean> {\n const packageJson = await readPackageJson(rootDir);\n return Boolean(packageJson.workspaces) || (await pathExists(join(rootDir, \"pnpm-workspace.yaml\")));\n}\n\nexport async function resolveDefaultPackageRoot(importMetaUrl: string): Promise<string> {\n let current = dirname(fileURLToPath(importMetaUrl));\n\n while (true) {\n if (await pathExists(join(current, \"resources\", \"react\"))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return process.cwd();\n }\n\n current = parent;\n }\n}\n\nexport async function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\nimport { formatMcpError, debugLog } from \"./errors.js\";\nimport { applicationInfoTool } from \"./tools/application-info.js\";\nimport { auditTool } from \"./tools/audit.js\";\nimport { doctorTool } from \"./tools/doctor.js\";\nimport { explainFindingTool } from \"./tools/explain-finding.js\";\nimport { listRoutesTool } from \"./tools/list-routes.js\";\n\ntype ToolOutput = object | unknown[];\n\nexport interface NodeBoostMcpServerOptions {\n rootDir?: string;\n packageVersion?: string;\n includeThrowingTestTool?: boolean;\n}\n\nexport function createNodeBoostMcpServer(options: NodeBoostMcpServerOptions = {}): McpServer {\n const rootDir = options.rootDir ?? process.cwd();\n const packageVersion = options.packageVersion ?? packageJson.version;\n const server = new McpServer({\n name: \"node-boost\",\n version: packageVersion,\n });\n\n registerJsonTool(server, \"application_info\", \"Return detected Node/React project information.\", async () =>\n applicationInfoTool(rootDir, packageVersion),\n );\n registerJsonTool(server, \"list_routes\", \"List detected application routes.\", async () => listRoutesTool(rootDir));\n registerJsonTool(server, \"doctor\", \"Run minimal node-boost project diagnostics.\", async () => doctorTool(rootDir, packageVersion));\n registerJsonTool(server, \"audit\", \"Run node-boost audit on all source files.\", async () => auditTool(rootDir));\n registerJsonTool(\n server,\n \"explain_finding\",\n \"Explain a node-boost audit finding. Pass {\\\"rule\\\":\\\"NB-ARCH-005\\\"}.\",\n (args) => explainFindingTool(readRuleArg(args)),\n { rule: z.string() },\n );\n\n if (options.includeThrowingTestTool) {\n registerJsonTool(server, \"__throw_for_test\", \"Internal test-only failing tool.\", () => {\n throw new Error(\"forced test error\");\n });\n }\n\n return server;\n}\n\nexport async function startNodeBoostMcpServer(options: NodeBoostMcpServerOptions = {}): Promise<void> {\n const server = createNodeBoostMcpServer(options);\n await server.connect(new StdioServerTransport());\n}\n\nfunction registerJsonTool(\n server: McpServer,\n name: string,\n description: string,\n handler: (args: Record<string, unknown>) => ToolOutput | Promise<ToolOutput>,\n inputSchema: Record<string, z.ZodTypeAny> = {},\n): void {\n server.registerTool(\n name,\n {\n title: name,\n description,\n inputSchema,\n },\n async (args: Record<string, unknown>) => {\n const start = performance.now();\n\n try {\n const output = await handler(args);\n debugLog(`[node-boost:mcp] ${name} ok ${Math.round(performance.now() - start)}ms`);\n return {\n content: [{ type: \"text\", text: JSON.stringify(output) }],\n };\n } catch (error) {\n const message = formatMcpError(error);\n debugLog(`[node-boost:mcp] ${name} err ${Math.round(performance.now() - start)}ms ${message}`);\n return {\n content: [{ type: \"text\", text: message }],\n isError: true,\n };\n }\n },\n );\n}\n\nfunction readRuleArg(args: Record<string, unknown>): string {\n return typeof args.rule === \"string\" ? args.rule : \"\";\n}\n","{\n \"name\": \"@node-boost/node-boost\",\n \"version\": \"0.1.0\",\n \"description\": \"CLI and MCP guidance layer for Node/React projects.\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Gracjan Kubicki\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/gracjankubicki/node-boost.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/gracjankubicki/node-boost/issues\"\n },\n \"homepage\": \"https://github.com/gracjankubicki/node-boost#readme\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"keywords\": [\n \"node\",\n \"react\",\n \"nextjs\",\n \"vite\",\n \"codex\",\n \"claude-code\",\n \"cursor\",\n \"mcp\",\n \"architecture\",\n \"audit\",\n \"agent-skills\"\n ],\n \"main\": \"./dist/index.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"bin\": {\n \"node-boost\": \"dist/cli.js\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"resources\",\n \"schema.json\",\n \"CHANGELOG.md\",\n \"LICENSE.md\",\n \"README.md\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"build\": \"npm run build:schema && tsup\",\n \"build:schema\": \"tsx scripts/generate-schema.ts\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint .\",\n \"test\": \"vitest run\",\n \"check\": \"npm run typecheck && npm run lint && npm test && npm run build\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^1.7.0\",\n \"@modelcontextprotocol/sdk\": \"^1.29.0\",\n \"citty\": \"^0.2.2\",\n \"picomatch\": \"^4.0.5\",\n \"smol-toml\": \"^1.7.0\",\n \"ts-morph\": \"^28.0.0\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^10.0.1\",\n \"@types/node\": \"^26.1.1\",\n \"@types/picomatch\": \"^4.0.3\",\n \"eslint\": \"^10.6.0\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.23.0\",\n \"typescript\": \"^6.0.3\",\n \"typescript-eslint\": \"^8.63.0\",\n \"vitest\": \"^4.1.10\"\n }\n}\n","export class NodeBoostMcpError extends Error {\n constructor(\n readonly code: string,\n message: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"NodeBoostMcpError\";\n }\n}\n\nexport function formatMcpError(error: unknown): string {\n if (error instanceof NodeBoostMcpError) {\n return `${error.code}: ${error.message}`;\n }\n\n if (error instanceof Error) {\n return `NB-E500: ${error.message}`;\n }\n\n return \"NB-E500: Unknown MCP tool error.\";\n}\n\nexport function isDebugEnabled(): boolean {\n return process.env.NODE_BOOST_DEBUG === \"1\";\n}\n\nexport function debugLog(message: string): void {\n if (isDebugEnabled()) {\n process.stderr.write(`${message}\\n`);\n }\n}\n","import { version as nodeVersion } from \"node:process\";\nimport { detectStack } from \"../../detect/stack.js\";\nimport type { PackageInfo } from \"../../types.js\";\nimport { readBoostConfig, readTypescriptStrict } from \"../project.js\";\n\nexport interface ApplicationInfo {\n node: string;\n packageManager: string;\n typescript: {\n version: string | null;\n strict: boolean | null;\n };\n stack: {\n name: string;\n version: string | null;\n router: string;\n srcDir: boolean;\n };\n linting: string;\n packages: Record<string, string>;\n boost: {\n version: string;\n generatedWith: string;\n architectures: Array<{ name: string; options: Record<string, unknown> }>;\n } | null;\n hint?: string;\n}\n\nexport async function applicationInfoTool(rootDir: string, boostVersion: string): Promise<ApplicationInfo> {\n const stack = await detectStack(rootDir);\n const boostConfig = await readBoostConfig(rootDir);\n\n return {\n node: nodeVersion.replace(/^v/, \"\"),\n packageManager: `${stack.packageManager.name}${stack.packageManager.version ? `@${stack.packageManager.version}` : \"\"}`,\n typescript: {\n version: stack.packages.typescript?.version ?? null,\n strict: await readTypescriptStrict(rootDir),\n },\n stack: {\n name: stack.name,\n version: stackVersion(stack.packages),\n router: stack.router,\n srcDir: stack.srcDir,\n },\n linting: stack.linting,\n packages: detectedPackages(stack.packages),\n boost: boostConfig.config\n ? {\n version: boostVersion,\n generatedWith: boostConfig.config.generatedWith,\n architectures: boostConfig.architectures.map((architecture) => ({\n name: architecture.name,\n options: architecture.options,\n })),\n }\n : null,\n ...(boostConfig.config ? {} : { hint: \"run node-boost install\" }),\n };\n}\n\nfunction detectedPackages(packages: Record<string, PackageInfo>): Record<string, string> {\n return Object.fromEntries(\n Object.values(packages)\n .filter((pkg) => pkg.source !== \"missing\" && pkg.version)\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((pkg) => [pkg.name, pkg.version as string]),\n );\n}\n\nfunction stackVersion(packages: Record<string, PackageInfo>): string | null {\n return packages.next?.version ?? packages.vite?.version ?? packages.react?.version ?? null;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ZodError } from \"zod\";\nimport { normalizeArchitectures, parseNodeBoostConfig, type NodeBoostConfig } from \"../config/schema.js\";\nimport type { NormalizedArchitecture } from \"../types.js\";\n\nexport interface BoostConfigReadResult {\n config: NodeBoostConfig | null;\n architectures: NormalizedArchitecture[];\n error: Error | null;\n}\n\nexport async function readBoostConfig(rootDir: string): Promise<BoostConfigReadResult> {\n try {\n const raw = await readFile(join(rootDir, \"node-boost.json\"), \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n const config = parseNodeBoostConfig(parsed);\n return {\n config,\n architectures: normalizeArchitectures(config),\n error: null,\n };\n } catch (error) {\n return {\n config: null,\n architectures: [],\n error: normalizeConfigError(error),\n };\n }\n}\n\nexport async function readTypescriptStrict(rootDir: string): Promise<boolean | null> {\n try {\n const raw = await readFile(join(rootDir, \"tsconfig.json\"), \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (isObject(parsed) && isObject(parsed.compilerOptions) && typeof parsed.compilerOptions.strict === \"boolean\") {\n return parsed.compilerOptions.strict;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nfunction normalizeConfigError(error: unknown): Error {\n if (error instanceof SyntaxError) {\n return new Error(`Invalid JSON: ${error.message}`, { cause: error });\n }\n\n if (error instanceof ZodError) {\n const message = error.issues.map((issue) => `${issue.path.join(\".\") || \"<root>\"}: ${issue.message}`).join(\"; \");\n return new Error(message, { cause: error });\n }\n\n if (error instanceof Error) {\n return error;\n }\n\n return new Error(\"Unknown config error.\");\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { runAudit } from \"../../audit/engine.js\";\n\nexport async function auditTool(rootDir: string) {\n return runAudit({ rootDir, mode: \"all\" });\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { buildInstallOperations } from \"../../install/orchestrator.js\";\nimport { resolveDefaultPackageRoot } from \"../../install/project.js\";\nimport { detectStack } from \"../../detect/stack.js\";\nimport { readBoostConfig } from \"../project.js\";\n\nexport type DoctorCheckId =\n | \"config-present\"\n | \"config-valid\"\n | \"generated-with-drift\"\n | \"stack-detected\"\n | \"resources-fresh\"\n | \"agent-files-present\"\n | \"overrides-detected\"\n | \"hooks-wired\"\n | \"lint-strict\";\n\nexport interface DoctorCheck {\n id: DoctorCheckId;\n status: \"pass\" | \"warn\" | \"fail\";\n message: string;\n details?: string[];\n}\n\nexport interface DoctorResult {\n ok: boolean;\n checks: DoctorCheck[];\n}\n\nexport async function doctorTool(rootDir: string, boostVersion: string): Promise<DoctorResult> {\n const checks: DoctorCheck[] = [];\n const configRaw = await readOptional(join(rootDir, \"node-boost.json\"));\n const boostConfig = await readBoostConfig(rootDir);\n const stack = await detectStack(rootDir);\n\n checks.push({\n id: \"config-present\",\n status: configRaw === null ? \"fail\" : \"pass\",\n message: configRaw === null ? \"node-boost.json is missing. Run node-boost install.\" : \"node-boost.json is present.\",\n });\n\n checks.push({\n id: \"config-valid\",\n status: boostConfig.config ? \"pass\" : \"fail\",\n message: boostConfig.config ? \"node-boost.json is valid.\" : `node-boost.json is invalid: ${boostConfig.error?.message ?? \"unknown error\"}`,\n });\n\n checks.push({\n id: \"generated-with-drift\",\n status: !boostConfig.config || boostConfig.config.generatedWith === boostVersion ? \"pass\" : \"warn\",\n message: !boostConfig.config\n ? \"No generatedWith drift can be checked without a valid config.\"\n : boostConfig.config.generatedWith === boostVersion\n ? \"generatedWith matches the installed package version.\"\n : `generatedWith is ${boostConfig.config.generatedWith}, package is ${boostVersion}. Run node-boost update.`,\n });\n\n checks.push({\n id: \"stack-detected\",\n status: stack.name === \"unknown\" ? \"fail\" : \"pass\",\n message: stack.name === \"unknown\" ? \"No supported React stack detected.\" : `Detected ${stack.name}.`,\n });\n\n if (!boostConfig.config) {\n checks.push(skipCheck(\"resources-fresh\", \"Requires a valid node-boost.json.\"));\n checks.push(skipCheck(\"agent-files-present\", \"Requires a valid node-boost.json.\"));\n checks.push(await overridesCheck(rootDir));\n checks.push(skipCheck(\"hooks-wired\", \"Requires a valid node-boost.json.\"));\n checks.push(await lintStrictCheck(rootDir));\n return withOk(checks);\n }\n\n const packageRoot = await resolveDefaultPackageRoot(import.meta.url);\n const expectedOperations = await buildInstallOperations({\n packageRoot,\n projectRoot: rootDir,\n stack,\n config: boostConfig.config,\n });\n\n checks.push(await resourcesFreshCheck(rootDir, expectedOperations));\n checks.push(await agentFilesPresentCheck(rootDir, expectedOperations));\n checks.push(await overridesCheck(rootDir));\n checks.push(await hooksWiredCheck(rootDir, boostConfig.config.features.hooks, expectedOperations));\n checks.push(await lintStrictCheck(rootDir));\n\n return withOk(checks);\n}\n\nasync function resourcesFreshCheck(rootDir: string, expectedOperations: Array<{ path: string; content: string }>): Promise<DoctorCheck> {\n const stale = await changedExpectedFiles(rootDir, expectedOperations.filter((operation) => operation.path.startsWith(\".ai/\")));\n\n return {\n id: \"resources-fresh\",\n status: stale.length === 0 ? \"pass\" : \"warn\",\n message: stale.length === 0 ? \"Generated .ai resources match current node-boost output.\" : `${stale.length} generated .ai resource(s) differ. Run node-boost update.`,\n details: stale,\n };\n}\n\nasync function agentFilesPresentCheck(rootDir: string, expectedOperations: Array<{ path: string }>): Promise<DoctorCheck> {\n const expected = expectedOperations\n .filter((operation) => !operation.path.startsWith(\".ai/\") && operation.path !== \"node-boost.json\")\n .map((operation) => operation.path);\n const missing = await missingFiles(rootDir, expected);\n\n return {\n id: \"agent-files-present\",\n status: missing.length === 0 ? \"pass\" : \"fail\",\n message: missing.length === 0 ? \"Configured agent files are present.\" : `${missing.length} configured agent file(s) missing. Run node-boost update.`,\n details: missing,\n };\n}\n\nasync function hooksWiredCheck(rootDir: string, hooksEnabled: boolean, expectedOperations: Array<{ path: string; content: string }>): Promise<DoctorCheck> {\n if (!hooksEnabled) {\n return {\n id: \"hooks-wired\",\n status: \"pass\",\n message: \"Hooks feature is disabled.\",\n };\n }\n\n const hookOperations = expectedOperations.filter((operation) =>\n operation.path === \".claude/settings.json\" || operation.path === \".codex/hooks.json\" || operation.path === \".cursor/hooks.json\",\n );\n const stale = await changedExpectedFiles(rootDir, hookOperations);\n\n return {\n id: \"hooks-wired\",\n status: stale.length === 0 ? \"pass\" : \"fail\",\n message: stale.length === 0 ? \"Configured hook entries are wired.\" : `${stale.length} hook config file(s) missing or stale. Run node-boost update.`,\n details: stale,\n };\n}\n\nasync function overridesCheck(rootDir: string): Promise<DoctorCheck> {\n const overrides = await listFiles(join(rootDir, \".node-boost\"));\n\n return {\n id: \"overrides-detected\",\n status: \"pass\",\n message: overrides.length === 0 ? \"No .node-boost overrides detected.\" : `${overrides.length} .node-boost override(s) active.`,\n details: overrides.map((file) => relative(join(rootDir, \".node-boost\"), file).replaceAll(\"\\\\\", \"/\")),\n };\n}\n\nasync function lintStrictCheck(rootDir: string): Promise<DoctorCheck> {\n const strict = await tsconfigStrict(rootDir);\n\n return {\n id: \"lint-strict\",\n status: strict === true ? \"pass\" : \"warn\",\n message: strict === true ? \"TypeScript strict mode is enabled.\" : \"TypeScript strict mode is not enabled. Enable compilerOptions.strict.\",\n };\n}\n\nasync function changedExpectedFiles(rootDir: string, expectedOperations: Array<{ path: string; content: string }>): Promise<string[]> {\n const changed = await Promise.all(\n expectedOperations.map(async (operation) => {\n const current = await readOptional(join(rootDir, operation.path));\n return current === operation.content ? null : operation.path;\n }),\n );\n\n return changed.filter((path): path is string => path !== null).sort((a, b) => a.localeCompare(b));\n}\n\nasync function missingFiles(rootDir: string, paths: string[]): Promise<string[]> {\n const missing = await Promise.all(paths.map(async (path) => ((await readOptional(join(rootDir, path))) === null ? path : null)));\n return missing.filter((path): path is string => path !== null).sort((a, b) => a.localeCompare(b));\n}\n\nasync function listFiles(dir: string): Promise<string[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n const nested = await Promise.all(\n entries.map(async (entry) => {\n const path = join(dir, entry.name);\n if (entry.isDirectory()) {\n return listFiles(path);\n }\n\n return entry.isFile() ? [path] : [];\n }),\n );\n return nested.flat().sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n}\n\nasync function tsconfigStrict(rootDir: string): Promise<boolean | null> {\n const visited = new Set<string>();\n return readStrictFromTsconfig(join(rootDir, \"tsconfig.json\"), visited);\n}\n\nasync function readStrictFromTsconfig(path: string, visited: Set<string>): Promise<boolean | null> {\n if (visited.has(path)) {\n return null;\n }\n\n visited.add(path);\n const raw = await readOptional(path);\n if (!raw) {\n return null;\n }\n\n const parsed = JSON.parse(stripJsonComments(raw)) as { extends?: string; compilerOptions?: { strict?: boolean } };\n if (typeof parsed.compilerOptions?.strict === \"boolean\") {\n return parsed.compilerOptions.strict;\n }\n\n if (parsed.extends?.startsWith(\".\")) {\n return readStrictFromTsconfig(join(path, \"..\", parsed.extends), visited);\n }\n\n return null;\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction stripJsonComments(value: string): string {\n return value.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\").replace(/^\\s*\\/\\/.*$/gm, \"\");\n}\n\nfunction skipCheck(id: DoctorCheckId, message: string): DoctorCheck {\n return { id, status: \"warn\", message };\n}\n\nfunction withOk(checks: DoctorCheck[]): DoctorResult {\n return {\n ok: checks.every((check) => check.status !== \"fail\"),\n checks,\n };\n}\n","import { explainFinding } from \"../../audit/registry.js\";\n\nexport function explainFindingTool(rule: string) {\n const finding = explainFinding(rule);\n\n if (!finding) {\n return { ok: false, error: `Unknown node-boost rule \"${rule}\".` };\n }\n\n return { ok: true, finding };\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join, relative, sep } from \"node:path\";\nimport { detectStack } from \"../../detect/stack.js\";\n\nexport type RouteType = \"page\" | \"layout\" | \"route-handler\" | \"error\" | \"loading\" | \"not-found\" | \"middleware\" | \"api-route\";\n\nexport interface RouteEntry {\n path: string;\n type: RouteType;\n file: string;\n dynamic: string[];\n slot?: string;\n}\n\nexport interface UnsupportedRoutes {\n supported: false;\n reason: string;\n}\n\nconst appRouteFiles: Record<string, RouteType> = {\n page: \"page\",\n layout: \"layout\",\n route: \"route-handler\",\n error: \"error\",\n loading: \"loading\",\n \"not-found\": \"not-found\",\n middleware: \"middleware\",\n};\n\nconst supportedExtensions = new Set([\"js\", \"jsx\", \"ts\", \"tsx\", \"mdx\"]);\n\nexport async function listRoutesTool(rootDir: string): Promise<RouteEntry[] | UnsupportedRoutes> {\n const stack = await detectStack(rootDir);\n\n if (stack.name === \"vite-react\") {\n return {\n supported: false,\n reason: \"react-router route map is on the roadmap\",\n };\n }\n\n if (stack.name !== \"next\") {\n return [];\n }\n\n if (stack.router === \"app\") {\n return sortRoutes([\n ...(await scanAppRouter(rootDir, join(rootDir, \"app\"))),\n ...(await scanAppRouter(rootDir, join(rootDir, \"src\", \"app\"))),\n ]);\n }\n\n if (stack.router === \"pages\") {\n return sortRoutes([\n ...(await scanPagesRouter(rootDir, join(rootDir, \"pages\"))),\n ...(await scanPagesRouter(rootDir, join(rootDir, \"src\", \"pages\"))),\n ]);\n }\n\n return [];\n}\n\nasync function scanAppRouter(rootDir: string, dir: string): Promise<RouteEntry[]> {\n const files = await walkFiles(dir);\n\n return files.flatMap((file) => {\n const parsed = parseRouteFile(file);\n if (!parsed || !appRouteFiles[parsed.basename]) {\n return [];\n }\n\n const appRelative = relative(dir, file);\n const routeSegments = appRelative.split(sep).slice(0, -1);\n const slot = routeSegments.find((segment) => segment.startsWith(\"@\"))?.slice(1);\n const path = segmentsToPath(routeSegments);\n\n return [\n {\n path,\n type: appRouteFiles[parsed.basename],\n file: normalizePath(relative(rootDir, file)),\n dynamic: extractDynamicSegments(routeSegments),\n ...(slot ? { slot } : {}),\n },\n ];\n });\n}\n\nasync function scanPagesRouter(rootDir: string, dir: string): Promise<RouteEntry[]> {\n const files = await walkFiles(dir);\n\n return files.flatMap((file) => {\n const parsed = parseRouteFile(file);\n if (!parsed || parsed.basename.startsWith(\"_\") || parsed.basename === \"middleware\") {\n return [];\n }\n\n const pagesRelative = relative(dir, file);\n const pathWithoutExtension = pagesRelative.slice(0, -parsed.extension.length - 1);\n const segments = pathWithoutExtension.split(sep);\n const isApi = segments[0] === \"api\";\n const routeSegments = isApi ? segments.slice(1) : segments;\n\n if (routeSegments[routeSegments.length - 1] === \"index\") {\n routeSegments.pop();\n }\n\n return [\n {\n path: isApi ? `/api${segmentsToPath(routeSegments) === \"/\" ? \"\" : segmentsToPath(routeSegments)}` : segmentsToPath(routeSegments),\n type: isApi ? \"api-route\" : \"page\",\n file: normalizePath(relative(rootDir, file)),\n dynamic: extractDynamicSegments(routeSegments),\n },\n ];\n });\n}\n\nasync function walkFiles(dir: string): Promise<string[]> {\n let entries;\n\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n\n const files = await Promise.all(\n entries.map(async (entry) => {\n const path = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n return walkFiles(path);\n }\n\n return entry.isFile() ? [path] : [];\n }),\n );\n\n return files.flat();\n}\n\nfunction parseRouteFile(file: string): { basename: string; extension: string } | null {\n const filename = file.split(sep).at(-1) ?? \"\";\n const parts = filename.split(\".\");\n\n if (parts.length < 2) {\n return null;\n }\n\n const extension = parts.at(-1) ?? \"\";\n const basename = parts.slice(0, -1).join(\".\");\n\n if (!supportedExtensions.has(extension)) {\n return null;\n }\n\n return { basename, extension };\n}\n\nfunction segmentsToPath(segments: string[]): string {\n const routeSegments = segments.filter((segment) => !segment.startsWith(\"(\") && !segment.startsWith(\"@\"));\n return `/${routeSegments.join(\"/\")}`.replace(/\\/+/g, \"/\");\n}\n\nfunction extractDynamicSegments(segments: string[]): string[] {\n return segments\n .map((segment) => segment.match(/^\\[\\[?\\.{0,3}([^\\]]+)\\]?\\]$/)?.[1] ?? null)\n .filter((segment): segment is string => Boolean(segment));\n}\n\nfunction sortRoutes(routes: RouteEntry[]): RouteEntry[] {\n return routes.sort((a, b) => a.path.localeCompare(b.path) || a.type.localeCompare(b.type) || a.file.localeCompare(b.file));\n}\n\nfunction normalizePath(path: string): string {\n return path.split(sep).join(\"/\");\n}\n"],"mappings":"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","names":["z","z","readFile","join","readFile","join","access","join","readFile","join","isObject","join","join","dirname","dirname","existsSync","join","existsSync","join","existsSync","readFileSync","dirname","join","join","existsSync","readFileSync","dirname","join","picomatch","toPosix","finding","join","readFile","finding","join","readdir","join","relative","join","join","join","access","join","relative","normalize","readFile","dirname","join","isObject","isObject","sortJson","isObject","access","readFile","dirname","join","readPackageJson","isObject","defaultFeatures","join","readFile","dirname","featureModulesBoundary","readPackageJson","z","readFile","join","ZodError","readFile","join","isObject","ZodError","readdir","readFile","join","relative","readOptional","join","relative","tsconfigStrict","readdir","readStrictFromTsconfig","stripJsonComments","readFile","finding","readdir","join","relative","join","walkFiles","relative","readdir","z"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@node-boost/node-boost",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI and MCP guidance layer for Node/React projects.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "Gracjan Kubicki",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/gracjankubicki/node-boost.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/gracjankubicki/node-boost/issues"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/gracjankubicki/node-boost#readme",
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"node",
|
|
21
|
+
"react",
|
|
22
|
+
"nextjs",
|
|
23
|
+
"vite",
|
|
24
|
+
"codex",
|
|
25
|
+
"claude-code",
|
|
26
|
+
"cursor",
|
|
27
|
+
"mcp",
|
|
28
|
+
"architecture",
|
|
29
|
+
"audit",
|
|
30
|
+
"agent-skills"
|
|
31
|
+
],
|
|
32
|
+
"main": "./dist/index.js",
|
|
33
|
+
"exports": {
|
|
34
|
+
".": {
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"import": "./dist/index.js"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"bin": {
|
|
40
|
+
"node-boost": "dist/cli.js"
|
|
41
|
+
},
|
|
42
|
+
"types": "./dist/index.d.ts",
|
|
43
|
+
"files": [
|
|
44
|
+
"dist",
|
|
45
|
+
"resources",
|
|
46
|
+
"schema.json",
|
|
47
|
+
"CHANGELOG.md",
|
|
48
|
+
"LICENSE.md",
|
|
49
|
+
"README.md"
|
|
50
|
+
],
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=20"
|
|
53
|
+
},
|
|
54
|
+
"scripts": {
|
|
55
|
+
"build": "npm run build:schema && tsup",
|
|
56
|
+
"build:schema": "tsx scripts/generate-schema.ts",
|
|
57
|
+
"typecheck": "tsc --noEmit",
|
|
58
|
+
"lint": "eslint .",
|
|
59
|
+
"test": "vitest run",
|
|
60
|
+
"check": "npm run typecheck && npm run lint && npm test && npm run build"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@clack/prompts": "^1.7.0",
|
|
64
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
65
|
+
"citty": "^0.2.2",
|
|
66
|
+
"picomatch": "^4.0.5",
|
|
67
|
+
"smol-toml": "^1.7.0",
|
|
68
|
+
"ts-morph": "^28.0.0",
|
|
69
|
+
"zod": "^4.4.3"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@eslint/js": "^10.0.1",
|
|
73
|
+
"@types/node": "^26.1.1",
|
|
74
|
+
"@types/picomatch": "^4.0.3",
|
|
75
|
+
"eslint": "^10.6.0",
|
|
76
|
+
"tsup": "^8.5.1",
|
|
77
|
+
"tsx": "^4.23.0",
|
|
78
|
+
"typescript": "^6.0.3",
|
|
79
|
+
"typescript-eslint": "^8.63.0",
|
|
80
|
+
"vitest": "^4.1.10"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Component Composition
|
|
2
|
+
|
|
3
|
+
Pass content, not configuration. Prefer children and slots over boolean-prop switchboards.
|
|
4
|
+
|
|
5
|
+
## The ladder
|
|
6
|
+
|
|
7
|
+
1. `children` — the default.
|
|
8
|
+
2. Named slots — JSX passed as props (`header={<... />}`).
|
|
9
|
+
3. Compound components — `Card.Header`, `Card.Footer` sharing the parent's context.
|
|
10
|
+
4. Config props — only for genuine *visual variants* (`variant="danger"`), which belong to cva (see styling guideline), not to boolean if-trees.
|
|
11
|
+
|
|
12
|
+
<code-snippet name="Composition over configuration" lang="tsx">
|
|
13
|
+
// WRONG: configurator — every new need adds a prop and an if
|
|
14
|
+
<Card title="Invoices" showHeader hasIcon icon="invoice" withFooter footerButtons={["save"]} />
|
|
15
|
+
|
|
16
|
+
// RIGHT: frame with slots — new needs compose at the call site
|
|
17
|
+
<Card>
|
|
18
|
+
<Card.Header icon={<InvoiceIcon />}>Invoices</Card.Header>
|
|
19
|
+
<InvoiceTable invoices={invoices} />
|
|
20
|
+
<Card.Footer><SaveButton /></Card.Footer>
|
|
21
|
+
</Card>
|
|
22
|
+
</code-snippet>
|
|
23
|
+
|
|
24
|
+
Heuristic: the **third boolean prop** on a component is a signal it should be two components or slots (`disabled`, `isLoading` are fine).
|
|
25
|
+
|
|
26
|
+
## Boundaries
|
|
27
|
+
|
|
28
|
+
Shared UI (`components/ui/`) knows no domain: no query hooks, no feature imports — data arrives via props. Domain knowledge lives in feature components (this pairs with feature-modules).
|
|
29
|
+
|
|
30
|
+
## Prop drilling
|
|
31
|
+
|
|
32
|
+
Fix by composing higher, not by reaching for Context: assemble the subtree where the data lives and pass the finished fragment down. Context is an escalation (see state-management).
|
|
33
|
+
|
|
34
|
+
## Semantic HTML first
|
|
35
|
+
|
|
36
|
+
Interactive elements are `<button>`/`<a>`/`<label>`, not clickable `<div>`s — generated markup that looks right but breaks keyboard/screen-reader flows is a defect.
|
|
37
|
+
|
|
38
|
+
## Dead idioms — do not generate
|
|
39
|
+
|
|
40
|
+
- `forwardRef` — in React 19 `ref` is a regular prop.
|
|
41
|
+
- Render props for things children/hooks solve.
|
|
42
|
+
- `defaultProps` on function components — use default parameters.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: component-composition
|
|
3
|
+
description: Design component APIs with children, slots and compound components instead of boolean-prop configuration.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Component Composition
|
|
7
|
+
|
|
8
|
+
## When to use this skill
|
|
9
|
+
|
|
10
|
+
Use when creating a reusable component, when a component sprouts its third boolean prop, or when tempted to drill props through several layers.
|
|
11
|
+
|
|
12
|
+
## Procedure
|
|
13
|
+
|
|
14
|
+
1. Start with `children`. Add named slots (`header={<... />}`) when multiple regions are needed.
|
|
15
|
+
2. Related pieces sharing state → compound components (`Card.Header` reading the parent's context).
|
|
16
|
+
3. Visual variants → cva variant prop; structural differences → separate components or slots, not booleans.
|
|
17
|
+
4. Shared UI in `components/ui/` receives everything via props — no domain imports.
|
|
18
|
+
5. Prop drilling → compose the subtree at the level where the data lives; escalate to Context only for genuinely global client state.
|
|
19
|
+
6. Use semantic elements (`button`, `a`, `nav`, `label`); wire `ref` as a plain prop (React 19 — no `forwardRef`).
|