@idia-ui/cli 0.2.0 → 0.2.1
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/dist/cli.js +22 -8
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -34,7 +34,7 @@ var import_node_child_process = require("child_process");
|
|
|
34
34
|
|
|
35
35
|
// src/commands/storybook/constants.ts
|
|
36
36
|
var STORYBOOK_DOCS_VERSION = "0.2.0";
|
|
37
|
-
var STORYBOOK_PRESET_VERSION = "0.2.
|
|
37
|
+
var STORYBOOK_PRESET_VERSION = "0.2.1";
|
|
38
38
|
var STORYBOOK_CLI_VERSION = "8.4.7";
|
|
39
39
|
var STORYBOOK_DEV_DEPS = [
|
|
40
40
|
"storybook@^8.4.7",
|
|
@@ -44,8 +44,7 @@ var STORYBOOK_DEV_DEPS = [
|
|
|
44
44
|
"@storybook/addon-links@^8.4.7",
|
|
45
45
|
`@idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`,
|
|
46
46
|
`@idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`,
|
|
47
|
-
"vite@^5.4.0"
|
|
48
|
-
"vite-tsconfig-paths@^4.3.0"
|
|
47
|
+
"vite@^5.4.0"
|
|
49
48
|
];
|
|
50
49
|
var STORYBOOK_OWNED_FILES = [
|
|
51
50
|
".storybook/main.ts",
|
|
@@ -254,7 +253,7 @@ function grepSrcForPattern(cwd, pattern) {
|
|
|
254
253
|
// src/utils/manifest.ts
|
|
255
254
|
var import_node_fs4 = require("fs");
|
|
256
255
|
var import_node_path4 = require("path");
|
|
257
|
-
var CLI_VERSION = "0.2.
|
|
256
|
+
var CLI_VERSION = "0.2.1";
|
|
258
257
|
function readManifest(cwd) {
|
|
259
258
|
try {
|
|
260
259
|
const raw = (0, import_node_fs4.readFileSync)((0, import_node_path4.join)(cwd, ".idia", "manifest.json"), "utf8");
|
|
@@ -879,8 +878,12 @@ function runStorybookChecks(cwd) {
|
|
|
879
878
|
}
|
|
880
879
|
return results;
|
|
881
880
|
}
|
|
882
|
-
function
|
|
883
|
-
return readInstalledPackManifest(
|
|
881
|
+
function readStorybookDocsSourceHash(cwd) {
|
|
882
|
+
return readInstalledPackManifest(
|
|
883
|
+
cwd,
|
|
884
|
+
"@idia-ui/storybook-docs",
|
|
885
|
+
"fragments/coverage-manifest.json"
|
|
886
|
+
)?.sourceHash ?? readInstalledPackManifest(cwd, "@idia-ui/storybook-docs", "coverage-manifest.json")?.sourceHash ?? readInstalledPackManifest(cwd, "@idia-ui/storybook-docs")?.sourceHash ?? null;
|
|
884
887
|
}
|
|
885
888
|
function runBrainChecks(cwd) {
|
|
886
889
|
const brainPackInstalled = fileExists(
|
|
@@ -954,13 +957,24 @@ function runBrainChecks(cwd) {
|
|
|
954
957
|
fixHint: "idia-ui sync brain"
|
|
955
958
|
});
|
|
956
959
|
}
|
|
957
|
-
const storybookHash =
|
|
958
|
-
|
|
960
|
+
const storybookHash = readStorybookDocsSourceHash(cwd);
|
|
961
|
+
const storybookDocsInstalled = fileExists(
|
|
962
|
+
cwd,
|
|
963
|
+
"node_modules/@idia-ui/storybook-docs/package.json"
|
|
964
|
+
);
|
|
965
|
+
if (!storybookDocsInstalled) {
|
|
959
966
|
results.push({
|
|
960
967
|
id: "B4",
|
|
961
968
|
status: "skip",
|
|
962
969
|
message: "storybook-docs not installed \u2014 B4 hash coupling skipped"
|
|
963
970
|
});
|
|
971
|
+
} else if (!storybookHash) {
|
|
972
|
+
results.push({
|
|
973
|
+
id: "B4",
|
|
974
|
+
status: "warn",
|
|
975
|
+
message: "storybook-docs installed but coverage-manifest sourceHash not readable",
|
|
976
|
+
fixHint: "idia-ui sync storybook"
|
|
977
|
+
});
|
|
964
978
|
} else if (packHash && storybookHash === packHash) {
|
|
965
979
|
results.push({
|
|
966
980
|
id: "B4",
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/commands/storybook/add.ts","../src/commands/storybook/constants.ts","../src/commands/storybook/templates.ts","../src/utils/pm.ts","../src/utils/package-json.ts","../src/utils/fs.ts","../src/utils/manifest.ts","../src/brain/install.ts","../src/brain/agents-patch.ts","../src/brain/constants.ts","../src/brain/pack.ts","../src/utils/exec.ts","../src/commands/add.ts","../src/checks/packs.ts","../src/checks/manifest.ts","../src/checks/navigation.ts","../src/checks/peers.ts","../src/checks/runtime.ts","../src/checks/index.ts","../src/commands/doctor.ts","../src/commands/storybook/sync.ts","../src/commands/sync.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport { resolve } from 'node:path';\r\n\r\nimport { runAddBrain, runAddStorybook, runAddUnknown } from './commands/add.js';\r\nimport {\r\n formatHumanReport,\r\n formatJsonReport,\r\n runDoctor,\r\n} from './commands/doctor.js';\r\nimport { runSync } from './commands/sync.js';\r\nimport { CLI_VERSION } from './utils/manifest.js';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('idia-ui')\r\n .description('idia-ui CLI — doctor and add-on management for consumer apps')\r\n .version(CLI_VERSION);\r\n\r\nprogram\r\n .command('doctor')\r\n .description('Run health checks on an idia consumer app')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .option('--full', 'Include Storybook (S*) and brain (B*) checks')\r\n .option('--fix', 'Limited safe repairs (manifest regenerate)')\r\n .option('--strict', 'Treat warnings as failures')\r\n .option('--json', 'Machine-readable JSON output')\r\n .action((opts: { cwd: string; full?: boolean; fix?: boolean; strict?: boolean; json?: boolean }) => {\r\n const cwd = resolve(opts.cwd);\r\n const report = runDoctor({\r\n cwd,\r\n full: Boolean(opts.full),\r\n fix: Boolean(opts.fix),\r\n strict: Boolean(opts.strict),\r\n json: Boolean(opts.json),\r\n });\r\n\r\n if (opts.json) {\r\n console.log(formatJsonReport(report));\r\n } else {\r\n console.log(formatHumanReport(report, Boolean(opts.full)));\r\n }\r\n\r\n process.exit(report.exitCode);\r\n });\r\n\r\nconst addCmd = program.command('add').description('Install idia add-on packs');\r\n\r\naddCmd\r\n .command('storybook')\r\n .description('Install Storybook docs pack')\r\n .option('--repair', 'Refresh CLI-owned Storybook files')\r\n .option('--force', 'Overwrite conflicts (document risk)')\r\n .option('--skip-install', 'Skip package manager install')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action(\r\n (opts: {\r\n repair?: boolean;\r\n force?: boolean;\r\n skipInstall?: boolean;\r\n pm?: string;\r\n cwd: string;\r\n }) => {\r\n runAddStorybook({\r\n cwd: resolve(opts.cwd),\r\n repair: Boolean(opts.repair),\r\n force: Boolean(opts.force),\r\n skipInstall: Boolean(opts.skipInstall),\r\n pm: parsePm(opts.pm),\r\n });\r\n },\r\n );\r\n\r\naddCmd\r\n .command('brain')\r\n .description('Install brain AI pack (Phase 4 — experimental)')\r\n .option('--repair', 'Re-apply rules, AGENTS block, and .idia/brain/ from pack')\r\n .option('--force', 'Overwrite conflicts (document risk)')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action((opts: { repair?: boolean; force?: boolean; pm?: string; cwd: string }) => {\r\n runAddBrain({\r\n cwd: resolve(opts.cwd),\r\n repair: Boolean(opts.repair),\r\n force: Boolean(opts.force),\r\n pm: parsePm(opts.pm),\r\n });\r\n });\r\n\r\naddCmd\r\n .argument('[target]', 'add-on target')\r\n .action((target: string | undefined) => {\r\n if (!target) {\r\n console.error('Usage: idia-ui add <storybook|brain>');\r\n process.exit(1);\r\n }\r\n runAddUnknown(target);\r\n });\r\n\r\nconst syncCmd = program\r\n .command('sync')\r\n .description('Sync installed pack versions and manifest');\r\n\r\nsyncCmd\r\n .argument('<target>', 'storybook | brain | all')\r\n .option('--force', 'Overwrite pack-owned files')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action((target: string, opts: { force?: boolean; pm?: string; cwd: string }) => {\r\n runSync(target, {\r\n cwd: resolve(opts.cwd),\r\n force: Boolean(opts.force),\r\n pm: parsePm(opts.pm),\r\n });\r\n });\r\n\r\nprogram.parse();\r\n\r\nfunction parsePm(value: string | undefined): 'pnpm' | 'npm' | 'yarn' | undefined {\r\n if (!value) return undefined;\r\n const normalized = value.toLowerCase();\r\n if (normalized === 'pnpm' || normalized === 'npm' || normalized === 'yarn') {\r\n return normalized;\r\n }\r\n console.error(`Invalid --pm value \"${value}\". Use pnpm, npm, or yarn.`);\r\n process.exit(1);\r\n}\r\n","import { mkdirSync, writeFileSync } from 'node:fs'\r\nimport { dirname, join } from 'node:path'\r\nimport { spawnSync } from 'node:child_process'\r\n\r\nimport {\r\n STORYBOOK_CLI_VERSION,\r\n STORYBOOK_DEV_DEPS,\r\n STORYBOOK_DOCS_VERSION,\r\n STORYBOOK_OWNED_FILES,\r\n STORYBOOK_PRESET_VERSION,\r\n} from './constants.js'\r\nimport { buttonStoriesTsx, storybookMainTs, storybookPreviewTsx } from './templates.js'\r\nimport type { PackageManager } from '../../utils/pm.js'\r\nimport { detectPackageManager } from '../../utils/pm.js'\r\nimport { readInstalledVersion, readPackageJson } from '../../utils/package-json.js'\r\nimport { fileExists, readTextFile } from '../../utils/fs.js'\r\nimport {\r\n CLI_VERSION,\r\n readManifest,\r\n writeManifest,\r\n} from '../../utils/manifest.js'\r\nimport type { IdiaManifest } from '../../types.js'\r\n\r\nexport type AddStorybookOptions = {\r\n cwd: string\r\n repair?: boolean\r\n force?: boolean\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n}\r\n\r\nexport type AddStorybookResult = {\r\n installed: boolean\r\n alreadyInstalled: boolean\r\n filesWritten: string[]\r\n warnings: string[]\r\n}\r\n\r\nfunction writeOwnedFile(cwd: string, relativePath: string, content: string, force: boolean): boolean {\r\n const fullPath = join(cwd, relativePath)\r\n if (fileExists(cwd, relativePath) && !force) {\r\n const existing = readTextFile(cwd, relativePath)\r\n if (existing === content) return false\r\n throw new Error(\r\n `Conflict: ${relativePath} exists with different content. Use --repair or --force.`,\r\n )\r\n }\r\n mkdirSync(dirname(fullPath), { recursive: true })\r\n writeFileSync(fullPath, content, 'utf8')\r\n return true\r\n}\r\n\r\nfunction parseDepSpec(spec: string): { name: string; range: string } {\r\n if (spec.startsWith('@')) {\r\n const at = spec.indexOf('@', 1)\r\n return { name: spec.slice(0, at), range: spec.slice(at + 1) }\r\n }\r\n const at = spec.indexOf('@')\r\n return { name: spec.slice(0, at), range: spec.slice(at + 1) }\r\n}\r\n\r\nfunction resolveDepVersion(name: string, range: string): string {\r\n if (name.startsWith('@idia-ui/storybook')) {\r\n return 'workspace:*'\r\n }\r\n return `^${range.replace(/^\\^/, '')}`\r\n}\r\n\r\nfunction addDevDependencies(cwd: string): void {\r\n const pkg = readPackageJson(cwd)\r\n if (!pkg) throw new Error('package.json not found')\r\n\r\n pkg.devDependencies ??= {}\r\n for (const spec of STORYBOOK_DEV_DEPS) {\r\n const { name, range } = parseDepSpec(spec)\r\n pkg.devDependencies[name] = resolveDepVersion(name, range)\r\n }\r\n\r\n pkg.scripts ??= {}\r\n pkg.scripts.storybook = 'storybook dev -p 6006'\r\n pkg.scripts['build-storybook'] = 'storybook build'\r\n\r\n writeFileSync(join(cwd, 'package.json'), `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\r\n}\r\n\r\nfunction runPmInstall(cwd: string, pm: PackageManager): void {\r\n const args =\r\n pm === 'pnpm'\r\n ? ['add', '-D', ...STORYBOOK_DEV_DEPS]\r\n : pm === 'yarn'\r\n ? ['add', '-D', ...STORYBOOK_DEV_DEPS]\r\n : ['install', '-D', ...STORYBOOK_DEV_DEPS]\r\n\r\n const result = spawnSync(pm, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: process.platform === 'win32',\r\n })\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} install failed with exit code ${result.status ?? 'unknown'}`)\r\n }\r\n}\r\n\r\nfunction resolveCoreVersion(cwd: string, pkg: NonNullable<ReturnType<typeof readPackageJson>>): string {\r\n const installed = readInstalledVersion(cwd, '@idia-ui/core')\r\n if (installed) return installed\r\n\r\n const declared = pkg.dependencies?.['@idia-ui/core'] ?? ''\r\n if (declared && !declared.startsWith('workspace')) {\r\n return declared.replace(/^[\\^~]/, '')\r\n }\r\n\r\n return '0.2.0'\r\n}\r\n\r\nfunction updateStorybookManifest(cwd: string, manifest: IdiaManifest, coreVersion: string): void {\r\n manifest.idiaCli = CLI_VERSION\r\n manifest.core = coreVersion\r\n manifest.features ??= {}\r\n manifest.features.storybook = {\r\n installed: new Date().toISOString(),\r\n storybookDocs: STORYBOOK_DOCS_VERSION,\r\n storybook: STORYBOOK_CLI_VERSION,\r\n preset: STORYBOOK_PRESET_VERSION,\r\n }\r\n writeManifest(cwd, manifest)\r\n}\r\n\r\nfunction isStorybookInstalled(cwd: string): boolean {\r\n return (\r\n fileExists(cwd, '.storybook/main.ts') &&\r\n Boolean(readPackageJson(cwd)?.devDependencies?.['@idia-ui/storybook-docs'])\r\n )\r\n}\r\n\r\nexport function runAddStorybook(options: AddStorybookOptions): AddStorybookResult {\r\n const { cwd, repair = false, force = false, skipInstall = false } = options\r\n const pm = options.pm ?? detectPackageManager(cwd)\r\n const warnings: string[] = []\r\n const filesWritten: string[] = []\r\n\r\n const pkg = readPackageJson(cwd)\r\n if (!pkg) {\r\n console.error('package.json not found — run from your app root')\r\n process.exit(1)\r\n }\r\n\r\n let manifest = readManifest(cwd)\r\n const coreVersion = resolveCoreVersion(cwd, pkg)\r\n if (!manifest) {\r\n manifest = { idiaCli: CLI_VERSION, core: coreVersion }\r\n warnings.push('Created .idia/manifest.json stub')\r\n } else {\r\n manifest.core = coreVersion\r\n }\r\n\r\n const alreadyInstalled = isStorybookInstalled(cwd)\r\n if (alreadyInstalled && !repair && !force) {\r\n console.log('Storybook already installed — idempotent skip (use --repair to refresh CLI-owned files)')\r\n updateStorybookManifest(cwd, manifest, coreVersion)\r\n return { installed: true, alreadyInstalled: true, filesWritten, warnings }\r\n }\r\n\r\n const ownedContent: Record<(typeof STORYBOOK_OWNED_FILES)[number], string> = {\r\n '.storybook/main.ts': storybookMainTs(),\r\n '.storybook/preview.tsx': storybookPreviewTsx(),\r\n 'src/stories/Button.stories.tsx': buttonStoriesTsx(),\r\n }\r\n\r\n for (const relativePath of STORYBOOK_OWNED_FILES) {\r\n if (repair || force || !fileExists(cwd, relativePath)) {\r\n const wrote = writeOwnedFile(cwd, relativePath, ownedContent[relativePath], force || repair)\r\n if (wrote) filesWritten.push(relativePath)\r\n }\r\n }\r\n\r\n addDevDependencies(cwd)\r\n\r\n if (!skipInstall) {\r\n console.log(`Installing Storybook devDependencies via ${pm}…`)\r\n runPmInstall(cwd, pm)\r\n } else {\r\n warnings.push('Skipped package manager install (--skip-install)')\r\n }\r\n\r\n updateStorybookManifest(cwd, manifest, coreVersion)\r\n\r\n console.log('\\n✓ Storybook add-on installed')\r\n console.log(` @idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`)\r\n console.log(` @idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`)\r\n console.log(' Run: pnpm storybook (or npm run storybook)')\r\n\r\n return { installed: true, alreadyInstalled, filesWritten, warnings }\r\n}\r\n","/** Version lockstep with @idia-ui/core minor (0.2.x). */\r\nexport const STORYBOOK_DOCS_VERSION = '0.2.0'\r\nexport const STORYBOOK_PRESET_VERSION = '0.2.0'\r\nexport const STORYBOOK_CLI_VERSION = '8.4.7'\r\n\r\nexport const STORYBOOK_DEV_DEPS = [\r\n 'storybook@^8.4.7',\r\n '@storybook/react-vite@^8.4.7',\r\n '@storybook/addon-docs@^8.4.7',\r\n '@storybook/addon-a11y@^8.4.7',\r\n '@storybook/addon-links@^8.4.7',\r\n `@idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`,\r\n `@idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`,\r\n 'vite@^5.4.0',\r\n 'vite-tsconfig-paths@^4.3.0',\r\n] as const\r\n\r\nexport const STORYBOOK_OWNED_FILES = [\r\n '.storybook/main.ts',\r\n '.storybook/preview.tsx',\r\n 'src/stories/Button.stories.tsx',\r\n] as const\r\n","export function storybookMainTs(): string {\r\n return `import type { StorybookConfig } from '@storybook/react-vite';\r\nimport { idiaStorybookMain } from '@idia-ui/storybook-preset-react-native-web';\r\n\r\nconst config: StorybookConfig = idiaStorybookMain({\r\n stories: ['../src/stories/**/*.stories.@(ts|tsx)'],\r\n staticDirs: ['../public'],\r\n});\r\n\r\nexport default config;\r\n`\r\n}\r\n\r\nexport function storybookPreviewTsx(): string {\r\n return `import React from 'react';\r\nimport type { Preview } from '@storybook/react';\r\nimport { AppProviders } from '../src/providers/AppProviders';\r\nimport '../global.css';\r\n\r\nconst preview: Preview = {\r\n decorators: [\r\n (Story) => (\r\n <AppProviders>\r\n <Story />\r\n </AppProviders>\r\n ),\r\n ],\r\n parameters: {\r\n layout: 'centered',\r\n controls: { expanded: true },\r\n },\r\n};\r\n\r\nexport default preview;\r\n`\r\n}\r\n\r\nexport function buttonStoriesTsx(): string {\r\n return `import type { Meta, StoryObj } from '@storybook/react';\r\nimport { Button } from '@idia-ui/core';\r\nimport { BrainDocSections } from '@idia-ui/storybook-docs';\r\n\r\nconst meta = {\r\n title: 'Components/Button',\r\n component: Button,\r\n tags: ['autodocs'],\r\n parameters: {\r\n docs: {\r\n page: () => (\r\n <>\r\n <BrainDocSections\r\n componentId=\"button\"\r\n sectionIds={['intent', 'usage', 'variants', 'accessibility']}\r\n />\r\n </>\r\n ),\r\n },\r\n },\r\n args: {\r\n label: 'Button',\r\n variant: 'primary',\r\n },\r\n} satisfies Meta<typeof Button>;\r\n\r\nexport default meta;\r\n\r\ntype Story = StoryObj<typeof meta>;\r\n\r\nexport const Playground: Story = {};\r\n`\r\n}\r\n","import { existsSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn';\r\n\r\nfunction findLockfileDir(start: string): string {\r\n let dir = start;\r\n while (true) {\r\n if (existsSync(join(dir, 'pnpm-lock.yaml'))) return dir;\r\n if (existsSync(join(dir, 'yarn.lock'))) return dir;\r\n if (existsSync(join(dir, 'package-lock.json'))) return dir;\r\n const parent = dirname(dir);\r\n if (parent === dir) return start;\r\n dir = parent;\r\n }\r\n}\r\n\r\nexport function detectPackageManager(cwd: string): PackageManager {\r\n const root = findLockfileDir(cwd);\r\n if (existsSync(join(root, 'pnpm-lock.yaml'))) return 'pnpm';\r\n if (existsSync(join(root, 'yarn.lock'))) return 'yarn';\r\n return 'npm';\r\n}\r\n\r\nexport function pmAddCommand(pm: PackageManager, packages: string[]): string {\r\n const list = packages.join(' ');\r\n switch (pm) {\r\n case 'pnpm':\r\n return `pnpm add ${list}`;\r\n case 'yarn':\r\n return `yarn add ${list}`;\r\n default:\r\n return `npm install ${list}`;\r\n }\r\n}\r\n\r\nexport function pmUpdateCommand(pm: PackageManager, packages: string[]): string {\r\n const list = packages.join(' ');\r\n switch (pm) {\r\n case 'pnpm':\r\n return `pnpm update ${list}`;\r\n case 'yarn':\r\n return `yarn upgrade ${list}`;\r\n default:\r\n return `npm update ${list}`;\r\n }\r\n}\r\n","import { readFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { PackageJson } from '../types.js';\r\n\r\nexport function readPackageJson(cwd: string): PackageJson | null {\r\n try {\r\n const raw = readFileSync(join(cwd, 'package.json'), 'utf8');\r\n return JSON.parse(raw) as PackageJson;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function getDepVersion(\r\n pkg: PackageJson,\r\n name: string,\r\n): string | undefined {\r\n return pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];\r\n}\r\n\r\nexport function readInstalledVersion(cwd: string, name: string): string | null {\r\n try {\r\n const pkgPath = join(cwd, 'node_modules', name, 'package.json');\r\n const raw = readFileSync(pkgPath, 'utf8');\r\n const parsed = JSON.parse(raw) as { version?: string };\r\n return parsed.version ?? null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readPeerRange(\r\n cwd: string,\r\n packageName: string,\r\n peerName: string,\r\n): string | null {\r\n try {\r\n const pkgPath = join(cwd, 'node_modules', packageName, 'package.json');\r\n const raw = readFileSync(pkgPath, 'utf8');\r\n const parsed = JSON.parse(raw) as {\r\n peerDependencies?: Record<string, string>;\r\n };\r\n return parsed.peerDependencies?.[peerName] ?? null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function listIdiaPackages(pkg: PackageJson): string[] {\r\n const names = new Set<string>();\r\n for (const deps of [pkg.dependencies, pkg.devDependencies]) {\r\n if (!deps) continue;\r\n for (const name of Object.keys(deps)) {\r\n if (name.startsWith('@idia-ui/')) names.add(name);\r\n }\r\n }\r\n return [...names].sort();\r\n}\r\n","import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport semver from 'semver';\r\n\r\nexport function satisfiesRange(version: string, range: string): boolean {\r\n const cleaned = version.replace(/^[\\^~>=<]*/, '').split(' ')[0] ?? version;\r\n if (range === 'workspace:*' || range.startsWith('file:')) return true;\r\n const coerced = semver.coerce(cleaned);\r\n if (!coerced) return false;\r\n return semver.satisfies(coerced, range, { includePrerelease: true });\r\n}\r\n\r\nexport function getMinor(version: string): string | null {\r\n const coerced = semver.coerce(version);\r\n if (!coerced) return null;\r\n return `${coerced.major}.${coerced.minor}`;\r\n}\r\n\r\nexport function readTextFile(cwd: string, relativePath: string): string | null {\r\n try {\r\n return readFileSync(join(cwd, relativePath), 'utf8');\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function fileExists(cwd: string, relativePath: string): boolean {\r\n try {\r\n return existsSync(join(cwd, relativePath));\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function grepSrcForPattern(cwd: string, pattern: RegExp): boolean {\r\n const filesToScan = [\r\n 'App.tsx',\r\n 'src/providers/AppProviders.tsx',\r\n ];\r\n\r\n for (const file of filesToScan) {\r\n const content = readTextFile(cwd, file);\r\n if (content && pattern.test(content)) return true;\r\n }\r\n\r\n const srcRoot = join(cwd, 'src');\r\n try {\r\n const walk = (dir: string): boolean => {\r\n for (const entry of readdirSync(dir)) {\r\n const full = join(dir, entry);\r\n const stat = statSync(full);\r\n if (stat.isDirectory()) {\r\n if (walk(full)) return true;\r\n } else if (/\\.(tsx?|jsx?)$/.test(entry)) {\r\n const content = readFileSync(full, 'utf8');\r\n if (pattern.test(content)) return true;\r\n }\r\n }\r\n return false;\r\n };\r\n if (existsSync(srcRoot)) return walk(srcRoot);\r\n } catch {\r\n // ignore walk errors\r\n }\r\n\r\n return false;\r\n}\r\n","import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport type { IdiaManifest } from '../types.js';\r\nimport { fileExists } from './fs.js';\r\n\r\nconst CLI_VERSION = '0.2.0';\r\n\r\nexport function readManifest(cwd: string): IdiaManifest | null {\r\n try {\r\n const raw = readFileSync(join(cwd, '.idia', 'manifest.json'), 'utf8');\r\n return JSON.parse(raw) as IdiaManifest;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function writeManifest(cwd: string, manifest: IdiaManifest): void {\r\n const manifestPath = join(cwd, '.idia', 'manifest.json');\r\n mkdirSync(dirname(manifestPath), { recursive: true });\r\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\r\n}\r\n\r\nexport function regenerateManifest(\r\n cwd: string,\r\n coreVersion: string,\r\n): { created: boolean; path: string } {\r\n const manifestPath = join(cwd, '.idia', 'manifest.json');\r\n const manifest: IdiaManifest = {\r\n idiaCli: CLI_VERSION,\r\n core: coreVersion,\r\n };\r\n writeManifest(cwd, manifest);\r\n return { created: true, path: manifestPath };\r\n}\r\n\r\nexport function manifestExists(cwd: string): boolean {\r\n return fileExists(cwd, '.idia/manifest.json');\r\n}\r\n\r\nexport function validateManifestShape(manifest: IdiaManifest): boolean {\r\n return (\r\n typeof manifest.idiaCli === 'string' &&\r\n typeof manifest.core === 'string' &&\r\n /^\\d+\\.\\d+\\.\\d+/.test(manifest.idiaCli) &&\r\n /^\\d+\\.\\d+\\.\\d+/.test(manifest.core)\r\n );\r\n}\r\n\r\nexport { CLI_VERSION };\r\n","import { cpSync, existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport { patchRootAgentsMd } from './agents-patch.js';\r\nimport {\r\n BRAIN_PACK_NAME,\r\n BRAIN_PACK_VERSION,\r\n BRAIN_TIER_DISCLAIMER,\r\n} from './constants.js';\r\nimport {\r\n brainPackSpecForApp,\r\n readBrainPackManifest,\r\n resolveBrainPackRoot,\r\n} from './pack.js';\r\nimport { runPmAddDev, runPmInstall } from '../utils/exec.js';\r\nimport { fileExists } from '../utils/fs.js';\r\nimport { readInstalledVersion, readPackageJson } from '../utils/package-json.js';\r\nimport { detectPackageManager } from '../utils/pm.js';\r\nimport { readManifest, writeManifest, CLI_VERSION } from '../utils/manifest.js';\r\nimport type { IdiaManifest } from '../types.js';\r\n\r\nexport type BrainInstallOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n skipInstall?: boolean;\r\n};\r\n\r\nexport type BrainInstallResult = {\r\n alreadyInstalled: boolean;\r\n packRoot: string;\r\n sourceHash: string;\r\n agentsPatch: ReturnType<typeof patchRootAgentsMd>;\r\n};\r\n\r\nfunction copyDirRecursive(src: string, dest: string, force: boolean): void {\r\n mkdirSync(dest, { recursive: true });\r\n for (const entry of readdirSync(src)) {\r\n const srcPath = join(src, entry);\r\n const destPath = join(dest, entry);\r\n const stat = statSync(srcPath);\r\n if (stat.isDirectory()) {\r\n copyDirRecursive(srcPath, destPath, force);\r\n } else {\r\n if (!force && existsSync(destPath)) continue;\r\n cpSync(srcPath, destPath);\r\n }\r\n }\r\n}\r\n\r\nfunction ensureBrainPackDependency(\r\n cwd: string,\r\n pm: 'pnpm' | 'npm' | 'yarn',\r\n skipInstall: boolean,\r\n): void {\r\n const pkg = readPackageJson(cwd);\r\n if (!pkg) throw new Error('package.json not found');\r\n\r\n const spec = brainPackSpecForApp(cwd);\r\n const existing = pkg.devDependencies?.[BRAIN_PACK_NAME];\r\n if (existing === spec || existing === BRAIN_PACK_VERSION) {\r\n if (!skipInstall && !existsSync(join(cwd, 'node_modules', BRAIN_PACK_NAME))) {\r\n runPmInstall(cwd, pm);\r\n }\r\n return;\r\n }\r\n\r\n if (!skipInstall) {\r\n runPmAddDev(cwd, pm, `${BRAIN_PACK_NAME}@${spec}`);\r\n }\r\n}\r\n\r\nfunction isBrainInstalled(cwd: string, manifest: IdiaManifest | null): boolean {\r\n const hasAgents = fileExists(cwd, '.idia/brain/AGENTS.md');\r\n const hasFeature = Boolean(manifest?.features?.brain?.brainPack);\r\n return hasAgents && hasFeature;\r\n}\r\n\r\nexport function installBrainPack(options: BrainInstallOptions): BrainInstallResult {\r\n const { cwd, repair = false, force = false, skipInstall = false } = options;\r\n const pm = options.pm ?? detectPackageManager(cwd);\r\n const manifest = readManifest(cwd);\r\n\r\n if (isBrainInstalled(cwd, manifest) && !repair && !force) {\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n if (packRoot) {\r\n const packManifest = readBrainPackManifest(packRoot);\r\n return {\r\n alreadyInstalled: true,\r\n packRoot,\r\n sourceHash: packManifest?.sourceHash ?? '',\r\n agentsPatch: { status: 'merged' },\r\n };\r\n }\r\n }\r\n\r\n ensureBrainPackDependency(cwd, pm, skipInstall);\r\n\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n if (!packRoot) {\r\n throw new Error(\r\n `${BRAIN_PACK_NAME} not found. Run ${pm} add -D ${BRAIN_PACK_NAME} and retry.`,\r\n );\r\n }\r\n\r\n const packManifest = readBrainPackManifest(packRoot);\r\n if (!packManifest?.sourceHash) {\r\n throw new Error(`${BRAIN_PACK_NAME} pack-manifest.json missing or invalid.`);\r\n }\r\n\r\n const brainSrc = join(packRoot, 'brain');\r\n const rulesSrc = join(packRoot, 'cursor-rules');\r\n const brainDest = join(cwd, '.idia', 'brain');\r\n const rulesDest = join(cwd, '.cursor', 'rules');\r\n\r\n copyDirRecursive(brainSrc, brainDest, force || repair);\r\n mkdirSync(rulesDest, { recursive: true });\r\n copyDirRecursive(rulesSrc, rulesDest, force || repair);\r\n\r\n const agentsPatch = patchRootAgentsMd(cwd, { repair, force });\r\n\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n manifest?.core ??\r\n packManifest.core;\r\n\r\n const nextManifest: IdiaManifest = {\r\n idiaCli: manifest?.idiaCli ?? CLI_VERSION,\r\n core: coreVersion,\r\n features: {\r\n ...manifest?.features,\r\n brain: {\r\n installed: new Date().toISOString(),\r\n brainPack: packManifest.brainPack,\r\n sourceHash: packManifest.sourceHash,\r\n },\r\n },\r\n };\r\n writeManifest(cwd, nextManifest);\r\n\r\n return {\r\n alreadyInstalled: false,\r\n packRoot,\r\n sourceHash: packManifest.sourceHash,\r\n agentsPatch,\r\n };\r\n}\r\n\r\nexport function printBrainInstallSummary(result: BrainInstallResult): void {\r\n if (result.alreadyInstalled) {\r\n console.log('✓ brain pack already installed');\r\n console.log(` .idia/brain/AGENTS.md`);\r\n console.log(` sourceHash: ${result.sourceHash || '(unknown)'}`);\r\n console.log('');\r\n console.log(BRAIN_TIER_DISCLAIMER);\r\n return;\r\n }\r\n\r\n console.log('✓ brain pack installed to .idia/brain/');\r\n console.log('✓ cursor rules copied to .cursor/rules/idia-ui-*.mdc');\r\n\r\n switch (result.agentsPatch.status) {\r\n case 'created':\r\n console.log('✓ AGENTS.md created with idia-ui brain block');\r\n break;\r\n case 'merged':\r\n console.log('✓ AGENTS.md updated with idia-ui brain block');\r\n break;\r\n case 'replaced':\r\n console.log('✓ AGENTS.md brain block repaired');\r\n break;\r\n case 'conflict':\r\n console.warn(\r\n `⚠ AGENTS.md conflict — wrote suggested patch: ${result.agentsPatch.patchPath}`,\r\n );\r\n console.warn(' Run idia-ui add brain --repair --force to overwrite.');\r\n break;\r\n }\r\n\r\n console.log(` sourceHash: ${result.sourceHash}`);\r\n console.log('');\r\n console.log(BRAIN_TIER_DISCLAIMER);\r\n}\r\n","import { mkdirSync, writeFileSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport {\r\n AGENTS_BEGIN,\r\n AGENTS_BRAIN_BLOCK,\r\n AGENTS_END,\r\n} from './constants.js';\r\nimport { readTextFile } from '../utils/fs.js';\r\n\r\nexport type AgentsPatchResult =\r\n | { status: 'created' | 'merged' | 'replaced' }\r\n | { status: 'conflict'; patchPath: string };\r\n\r\nexport function patchRootAgentsMd(\r\n cwd: string,\r\n options: { repair?: boolean; force?: boolean },\r\n): AgentsPatchResult {\r\n const agentsPath = join(cwd, 'AGENTS.md');\r\n const existing = readTextFile(cwd, 'AGENTS.md');\r\n\r\n if (existing === null) {\r\n writeFileSync(agentsPath, `${AGENTS_BRAIN_BLOCK}\\n`, 'utf8');\r\n return { status: 'created' };\r\n }\r\n\r\n const hasBegin = existing.includes(AGENTS_BEGIN);\r\n const hasEnd = existing.includes(AGENTS_END);\r\n\r\n if (hasBegin && hasEnd) {\r\n if (!options.repair && !options.force) {\r\n return { status: 'merged' };\r\n }\r\n const updated = existing.replace(\r\n new RegExp(`${escapeRegExp(AGENTS_BEGIN)}[\\\\s\\\\S]*?${escapeRegExp(AGENTS_END)}`),\r\n AGENTS_BRAIN_BLOCK,\r\n );\r\n if (updated === existing && !options.force) {\r\n return { status: 'merged' };\r\n }\r\n writeFileSync(agentsPath, updated, 'utf8');\r\n return { status: 'replaced' };\r\n }\r\n\r\n if (hasBegin !== hasEnd) {\r\n if (options.force) {\r\n const withoutPartial = existing\r\n .replace(new RegExp(`${escapeRegExp(AGENTS_BEGIN)}[\\\\s\\\\S]*`), '')\r\n .replace(AGENTS_END, '');\r\n writeFileSync(\r\n agentsPath,\r\n `${withoutPartial.trimEnd()}\\n\\n${AGENTS_BRAIN_BLOCK}\\n`,\r\n 'utf8',\r\n );\r\n return { status: 'replaced' };\r\n }\r\n return writeConflictPatch(cwd, existing);\r\n }\r\n\r\n writeFileSync(agentsPath, `${existing.trimEnd()}\\n\\n${AGENTS_BRAIN_BLOCK}\\n`, 'utf8');\r\n return { status: 'merged' };\r\n}\r\n\r\nfunction writeConflictPatch(cwd: string, existing: string): AgentsPatchResult {\r\n const patchDir = join(cwd, '.idia', 'patches');\r\n mkdirSync(patchDir, { recursive: true });\r\n const patchPath = join(patchDir, 'AGENTS.md.patch');\r\n const patchBody = [\r\n '# AGENTS.md brain block patch (idia-ui add brain)',\r\n '# Apply manually or run: idia-ui add brain --repair --force',\r\n '',\r\n AGENTS_BRAIN_BLOCK,\r\n '',\r\n '# --- existing AGENTS.md preserved below ---',\r\n '',\r\n existing,\r\n ].join('\\n');\r\n writeFileSync(patchPath, patchBody, 'utf8');\r\n return { status: 'conflict', patchPath };\r\n}\r\n\r\nfunction escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","export const BRAIN_PACK_NAME = '@idia-ui/brain-pack';\r\nexport const BRAIN_PACK_VERSION = '0.2.0';\r\n\r\nexport const BRAIN_TIER_DISCLAIMER =\r\n '@idia-ui/brain-pack is a generated AI retrieval pack for idia-ui usage guidance. It does not imply Tier 1 passive external-agent graduation, GA readiness, or full-catalog efficacy.';\r\n\r\nexport const BRAIN_DOCTOR_DISCLAIMER =\r\n 'brain pack is experimental retrieval guidance; it does not imply Tier 1P graduation';\r\n\r\nexport const AGENTS_BEGIN = '<!-- idia-ui brain:begin -->';\r\nexport const AGENTS_END = '<!-- idia-ui brain:end -->';\r\n\r\nexport const AGENTS_BRAIN_BLOCK = `${AGENTS_BEGIN}\r\n## idia-ui design-system brain\r\n\r\nFor idia-ui component usage, design-system documentation, Storybook docs, UI generation, or AI-guided UI work, read:\r\n\r\n\\`.idia/brain/AGENTS.md\\`\r\n\r\nbefore using idia-ui components.\r\n\r\nThis installed brain pack is read-only generated guidance. Do not edit files under \\`.idia/brain/\\` directly.\r\n${AGENTS_END}`;\r\n","import { existsSync, readFileSync } from 'node:fs';\r\nimport { createRequire } from 'node:module';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport { BRAIN_PACK_NAME } from './constants.js';\r\n\r\nexport type BrainPackManifest = {\r\n brainPack: string;\r\n core: string;\r\n sourceHash: string;\r\n coverage?: Record<string, unknown>;\r\n tierClaims?: Record<string, string>;\r\n};\r\n\r\nexport function resolveBrainPackRoot(cwd: string): string | null {\r\n const local = join(cwd, 'node_modules', BRAIN_PACK_NAME);\r\n if (existsSync(join(local, 'pack-manifest.json'))) return local;\r\n\r\n try {\r\n const require = createRequire(join(cwd, 'package.json'));\r\n const pkgJson = require.resolve(`${BRAIN_PACK_NAME}/package.json`);\r\n return dirname(pkgJson);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readBrainPackManifest(packRoot: string): BrainPackManifest | null {\r\n try {\r\n const raw = readFileSync(join(packRoot, 'pack-manifest.json'), 'utf8');\r\n return JSON.parse(raw) as BrainPackManifest;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function brainPackSpecForApp(cwd: string): string {\r\n try {\r\n const pkgPath = join(cwd, 'package.json');\r\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\r\n dependencies?: Record<string, string>;\r\n devDependencies?: Record<string, string>;\r\n };\r\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\r\n const usesWorkspace = Object.values(deps).some((v) => v === 'workspace:*');\r\n if (usesWorkspace) return 'workspace:*';\r\n } catch {\r\n // fall through\r\n }\r\n return '^0.2.0';\r\n}\r\n\r\nexport function readInstalledPackManifest(\r\n cwd: string,\r\n packageName: string,\r\n manifestFile = 'pack-manifest.json',\r\n): { sourceHash?: string } | null {\r\n try {\r\n const raw = readFileSync(\r\n join(cwd, 'node_modules', packageName, manifestFile),\r\n 'utf8',\r\n );\r\n return JSON.parse(raw) as { sourceHash?: string };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import { spawnSync } from 'node:child_process';\r\n\r\nimport type { PackageManager } from './pm.js';\r\n\r\nexport function runPmInstall(cwd: string, pm: PackageManager): void {\r\n const result = spawnCommand(pm, installArgs(pm), cwd);\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} install failed (exit ${result.status ?? 1})`);\r\n }\r\n}\r\n\r\nexport function runPmAddDev(\r\n cwd: string,\r\n pm: PackageManager,\r\n packageSpec: string,\r\n): void {\r\n const result = spawnCommand(pm, addDevArgs(pm, packageSpec), cwd);\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} add failed for ${packageSpec} (exit ${result.status ?? 1})`);\r\n }\r\n}\r\n\r\nfunction installArgs(pm: PackageManager): string[] {\r\n switch (pm) {\r\n case 'pnpm':\r\n return ['install'];\r\n case 'yarn':\r\n return ['install'];\r\n default:\r\n return ['install'];\r\n }\r\n}\r\n\r\nfunction addDevArgs(pm: PackageManager, packageSpec: string): string[] {\r\n switch (pm) {\r\n case 'pnpm':\r\n return ['add', '-D', packageSpec];\r\n case 'yarn':\r\n return ['add', '-D', packageSpec];\r\n default:\r\n return ['install', '-D', packageSpec];\r\n }\r\n}\r\n\r\nfunction spawnCommand(\r\n pm: PackageManager,\r\n args: string[],\r\n cwd: string,\r\n): ReturnType<typeof spawnSync> {\r\n const command = pm === 'npm' ? 'npm' : pm;\r\n return spawnSync(command, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });\r\n}\r\n","export { runAddStorybook } from './storybook/add.js';\r\nexport type { AddStorybookOptions } from './storybook/add.js';\r\n\r\nimport { installBrainPack, printBrainInstallSummary } from '../brain/install.js';\r\nimport { BRAIN_TIER_DISCLAIMER } from '../brain/constants.js';\r\n\r\nexport type AddBrainOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n};\r\n\r\nexport function runAddBrain(options: AddBrainOptions): void {\r\n try {\r\n const result = installBrainPack({\r\n cwd: options.cwd,\r\n repair: options.repair,\r\n force: options.force,\r\n pm: options.pm,\r\n });\r\n printBrainInstallSummary(result);\r\n\r\n if (result.agentsPatch.status === 'conflict') {\r\n process.exit(1);\r\n }\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n console.error(BRAIN_TIER_DISCLAIMER);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function runAddUnknown(target: string): never {\r\n console.error(`Unknown add target: ${target}`);\r\n console.error('Available: storybook, brain');\r\n process.exit(1);\r\n}\r\n","import { readFileSync, readdirSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { CheckResult } from '../types.js';\r\nimport { BRAIN_DOCTOR_DISCLAIMER } from '../brain/constants.js';\r\nimport {\r\n readBrainPackManifest,\r\n readInstalledPackManifest,\r\n resolveBrainPackRoot,\r\n} from '../brain/pack.js';\r\nimport { fileExists, getMinor, readTextFile } from '../utils/fs.js';\r\nimport { readInstalledVersion } from '../utils/package-json.js';\r\nimport { readManifest } from '../utils/manifest.js';\r\n\r\nfunction readCoverageManifest(cwd: string): {\r\n components?: Record<string, { coverage?: string }>;\r\n} | null {\r\n try {\r\n const raw = readFileSync(\r\n join(cwd, 'node_modules/@idia-ui/storybook-docs/fragments/coverage-manifest.json'),\r\n 'utf8',\r\n );\r\n return JSON.parse(raw) as { components?: Record<string, { coverage?: string }> };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction listStoryComponentIds(cwd: string): string[] {\r\n const storiesDir = join(cwd, 'src/stories');\r\n const ids = new Set<string>();\r\n\r\n try {\r\n for (const file of readdirSync(storiesDir)) {\r\n const match = file.match(/^([A-Za-z]+)\\.stories\\.(tsx?|jsx?)$/);\r\n if (match) {\r\n ids.add(match[1].toLowerCase());\r\n }\r\n }\r\n } catch {\r\n return [];\r\n }\r\n\r\n return [...ids].sort();\r\n}\r\n\r\nexport function runStorybookChecks(cwd: string): CheckResult[] {\r\n const hasPreview = fileExists(cwd, '.storybook/preview.tsx');\r\n const storybookDocs = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/storybook-docs/package.json',\r\n );\r\n\r\n if (!hasPreview && !storybookDocs) {\r\n return [\r\n {\r\n id: 'S1',\r\n status: 'info',\r\n message: 'Storybook not installed — skipping S* checks',\r\n },\r\n {\r\n id: 'S2',\r\n status: 'skip',\r\n message: '@idia-ui/storybook-docs not installed',\r\n },\r\n {\r\n id: 'S3',\r\n status: 'skip',\r\n message: 'storybook fragment manifest not available',\r\n },\r\n ];\r\n }\r\n\r\n const results: CheckResult[] = [];\r\n\r\n const preview = readTextFile(cwd, '.storybook/preview.tsx');\r\n const importsTamagui =\r\n preview !== null &&\r\n (/tamagui\\.config/.test(preview) || /AppProviders/.test(preview));\r\n\r\n if (importsTamagui) {\r\n results.push({\r\n id: 'S1',\r\n status: 'pass',\r\n message: '.storybook/preview.tsx wires AppProviders (shared token parity)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'S1',\r\n status: 'fail',\r\n message: '.storybook/preview.tsx missing AppProviders / tamagui.config wiring',\r\n fixHint: 'idia-ui add storybook --repair',\r\n });\r\n }\r\n\r\n const docsVersion = readInstalledVersion(cwd, '@idia-ui/storybook-docs');\r\n const coreVersion = readInstalledVersion(cwd, '@idia-ui/core');\r\n const docsMinor = docsVersion ? getMinor(docsVersion) : null;\r\n const coreMinor = coreVersion ? getMinor(coreVersion) : null;\r\n\r\n if (!storybookDocs) {\r\n results.push({\r\n id: 'S2',\r\n status: 'warn',\r\n message: '@idia-ui/storybook-docs not installed',\r\n fixHint: 'idia-ui add storybook',\r\n });\r\n } else if (docsMinor && coreMinor && docsMinor === coreMinor) {\r\n results.push({\r\n id: 'S2',\r\n status: 'pass',\r\n message: `@idia-ui/storybook-docs@${docsVersion} matches @idia-ui/core@${coreVersion} minor`,\r\n });\r\n } else {\r\n results.push({\r\n id: 'S2',\r\n status: 'warn',\r\n message: `storybook-docs minor (${docsMinor ?? 'unknown'}) ≠ core minor (${coreMinor ?? 'unknown'})`,\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n }\r\n\r\n const coverage = readCoverageManifest(cwd);\r\n const coveredIds = coverage?.components ? Object.keys(coverage.components) : [];\r\n const storyIds = listStoryComponentIds(cwd);\r\n const uncovered = storyIds.filter((id) => !coveredIds.includes(id));\r\n\r\n if (!coverage) {\r\n results.push({\r\n id: 'S3',\r\n status: 'warn',\r\n message: 'coverage manifest not readable',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n } else if (uncovered.length === 0) {\r\n results.push({\r\n id: 'S3',\r\n status: 'pass',\r\n message:\r\n coveredIds.length > 0\r\n ? `fragment manifest covers ${coveredIds.length} Wave 1 components; story files aligned`\r\n : 'fragment manifest present; no src/stories/ files to cross-ref',\r\n });\r\n if (coveredIds.length > 0 && coveredIds.length < 10) {\r\n results.push({\r\n id: 'S3-info',\r\n status: 'info',\r\n message: `storybook-docs pack has doc fragments for ${coveredIds.length} components. Other components render without brain prose.`,\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'S3',\r\n status: 'warn',\r\n message: `stories without fragments: ${uncovered.join(', ')}`,\r\n fixHint: 'upgrade @idia-ui/storybook-docs or remove uncovered stories',\r\n });\r\n }\r\n\r\n const manifest = readManifest(cwd);\r\n if (storybookDocs && !manifest?.features?.storybook) {\r\n results.push({\r\n id: 'S-manifest',\r\n status: 'warn',\r\n message: 'manifest features.storybook missing',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction readPackSourceHash(cwd: string, packageName: string): string | null {\r\n return readInstalledPackManifest(cwd, packageName)?.sourceHash ?? null;\r\n}\r\n\r\nexport function runBrainChecks(cwd: string): CheckResult[] {\r\n const brainPackInstalled = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/brain-pack/package.json',\r\n );\r\n const brainAgents = fileExists(cwd, '.idia/brain/AGENTS.md');\r\n const rootAgents = readTextFile(cwd, 'AGENTS.md');\r\n const hasBrainBlock =\r\n rootAgents !== null &&\r\n /idia-ui brain:begin/.test(rootAgents) &&\r\n /idia-ui brain:end/.test(rootAgents);\r\n\r\n if (!brainPackInstalled && !brainAgents) {\r\n return [\r\n {\r\n id: 'B1',\r\n status: 'warn',\r\n message: 'brain pack not installed',\r\n fixHint: 'Run idia-ui add brain',\r\n },\r\n {\r\n id: 'B2',\r\n status: 'skip',\r\n message: 'AGENTS.md brain block not present',\r\n },\r\n {\r\n id: 'B3',\r\n status: 'skip',\r\n message: 'brain sourceHash coupling not checked',\r\n },\r\n {\r\n id: 'B4',\r\n status: 'skip',\r\n message: 'brain/storybook hash coupling not checked',\r\n },\r\n ];\r\n }\r\n\r\n const results: CheckResult[] = [];\r\n const manifest = readManifest(cwd);\r\n const manifestHash = manifest?.features?.brain?.sourceHash as string | undefined;\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n const packManifest = packRoot ? readBrainPackManifest(packRoot) : null;\r\n const packHash = packManifest?.sourceHash;\r\n\r\n results.push({\r\n id: 'B1',\r\n status: brainAgents ? 'pass' : 'warn',\r\n message: brainAgents\r\n ? '✓ brain pack installed'\r\n : '.idia/brain/AGENTS.md missing',\r\n fixHint: brainAgents ? undefined : 'idia-ui add brain',\r\n });\r\n\r\n results.push({\r\n id: 'B2',\r\n status: hasBrainBlock ? 'pass' : 'warn',\r\n message: hasBrainBlock\r\n ? 'root AGENTS.md contains idia-ui brain block'\r\n : 'root AGENTS.md missing idia-ui brain:begin/end block',\r\n fixHint: hasBrainBlock ? undefined : 'idia-ui add brain --repair',\r\n });\r\n\r\n if (manifestHash && packHash && manifestHash === packHash) {\r\n results.push({\r\n id: 'B3',\r\n status: 'pass',\r\n message: 'manifest sourceHash matches installed brain pack',\r\n });\r\n } else if (manifestHash && packHash) {\r\n results.push({\r\n id: 'B3',\r\n status: 'warn',\r\n message: 'manifest sourceHash drifted from brain pack pin',\r\n fixHint: 'idia-ui sync brain',\r\n });\r\n } else {\r\n results.push({\r\n id: 'B3',\r\n status: 'warn',\r\n message: 'manifest sourceHash missing or brain pack not resolved',\r\n fixHint: 'idia-ui sync brain',\r\n });\r\n }\r\n\r\n const storybookHash = readPackSourceHash(cwd, '@idia-ui/storybook-docs');\r\n if (!storybookHash) {\r\n results.push({\r\n id: 'B4',\r\n status: 'skip',\r\n message: 'storybook-docs not installed — B4 hash coupling skipped',\r\n });\r\n } else if (packHash && storybookHash === packHash) {\r\n results.push({\r\n id: 'B4',\r\n status: 'pass',\r\n message: 'brain pack and storybook-docs share sourceHash (same generate run)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'B4',\r\n status: 'warn',\r\n message: 'brain pack and storybook-docs sourceHash skew',\r\n fixHint: 'idia-ui sync all',\r\n });\r\n }\r\n\r\n results.push({\r\n id: 'B-tier',\r\n status: 'info',\r\n message: `⚠ ${BRAIN_DOCTOR_DISCLAIMER}`,\r\n });\r\n\r\n return results;\r\n}\r\n\r\nexport function runCustomCheck(cwd: string): CheckResult[] {\r\n const hasStories = fileExists(cwd, 'src/stories');\r\n if (!hasStories) {\r\n return [\r\n {\r\n id: 'C1',\r\n status: 'skip',\r\n message: 'no src/stories/ directory (Storybook not configured)',\r\n },\r\n ];\r\n }\r\n\r\n return [\r\n {\r\n id: 'C1',\r\n status: 'info',\r\n message: 'wrapper/story coverage check not implemented (stub)',\r\n fixHint: 'Add stories for components in src/components/',\r\n },\r\n ];\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport {\r\n manifestExists,\r\n readManifest,\r\n regenerateManifest,\r\n validateManifestShape,\r\n} from '../utils/manifest.js';\r\nimport { readInstalledVersion, readPackageJson } from '../utils/package-json.js';\r\n\r\nexport function runManifestCheck(\r\n cwd: string,\r\n fix: boolean,\r\n): { results: CheckResult[]; fixed: boolean } {\r\n const results: CheckResult[] = [];\r\n let fixed = false;\r\n\r\n if (!manifestExists(cwd)) {\r\n if (fix) {\r\n const pkg = readPackageJson(cwd);\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n pkg?.dependencies?.['@idia-ui/core']?.replace(/^[\\^~]/, '') ??\r\n '0.2.0';\r\n regenerateManifest(cwd, coreVersion);\r\n fixed = true;\r\n results.push({\r\n id: 'M1',\r\n status: 'pass',\r\n message: '.idia/manifest.json regenerated',\r\n fixHint: 'Created manifest with idiaCli + core versions',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n results.push({\r\n id: 'M1',\r\n status: 'warn',\r\n message: '.idia/manifest.json missing',\r\n fixHint: 'Run idia-ui doctor --fix or idia-ui sync all after first add-on',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n const manifest = readManifest(cwd);\r\n if (!manifest || !validateManifestShape(manifest)) {\r\n results.push({\r\n id: 'M1',\r\n status: 'fail',\r\n message: '.idia/manifest.json invalid or unparseable',\r\n fixHint: 'Run idia-ui doctor --fix to regenerate',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n results.push({\r\n id: 'M1',\r\n status: 'pass',\r\n message: `.idia/manifest.json valid (core ${manifest.core}, cli ${manifest.idiaCli})`,\r\n });\r\n\r\n return { results, fixed };\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport { grepSrcForPattern, readTextFile } from '../utils/fs.js';\r\n\r\nexport function runNavigationChecks(cwd: string): CheckResult[] {\r\n const results: CheckResult[] = [];\r\n const providers =\r\n readTextFile(cwd, 'src/providers/AppProviders.tsx') ??\r\n readTextFile(cwd, 'src/providers/AppProviders.ts');\r\n\r\n // N1\r\n if (providers && /NavigationContainer/.test(providers)) {\r\n results.push({\r\n id: 'N1',\r\n status: 'pass',\r\n message: 'NavigationContainer in provider tree',\r\n });\r\n } else {\r\n results.push({\r\n id: 'N1',\r\n status: 'fail',\r\n message: 'NavigationContainer not found in AppProviders',\r\n fixHint: 'Wrap navigation in NavigationContainer per templates/consumer-app',\r\n });\r\n }\r\n\r\n // N2 — NavigationProvider if idia Link/navigate used\r\n const usesIdiaNav =\r\n grepSrcForPattern(cwd, /\\bLink\\b.*@idia-ui\\/core/) ||\r\n grepSrcForPattern(cwd, /NavigationProvider/) ||\r\n grepSrcForPattern(cwd, /useIdiaNavigation|navigateTo/);\r\n\r\n if (usesIdiaNav) {\r\n const hasNavProvider = providers\r\n ? /NavigationProvider/.test(providers)\r\n : grepSrcForPattern(cwd, /NavigationProvider/);\r\n if (!hasNavProvider) {\r\n results.push({\r\n id: 'N2',\r\n status: 'warn',\r\n message: 'idia Link/navigation helpers used but NavigationProvider missing',\r\n fixHint: 'Wrap navigation ref with NavigationProvider from @idia-ui/core',\r\n });\r\n } else {\r\n results.push({\r\n id: 'N2',\r\n status: 'pass',\r\n message: 'NavigationProvider present',\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'N2',\r\n status: 'pass',\r\n message: 'idia Link/navigation helpers not used (NavigationProvider optional)',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport {\r\n getDepVersion,\r\n readInstalledVersion,\r\n readPeerRange,\r\n readPackageJson,\r\n} from '../utils/package-json.js';\r\nimport { satisfiesRange } from '../utils/fs.js';\r\nimport { detectPackageManager, pmAddCommand } from '../utils/pm.js';\r\n\r\nconst P2_PACKAGES = [\r\n 'react-native-reanimated',\r\n 'react-native-gesture-handler',\r\n 'react-native-screens',\r\n 'react-native-safe-area-context',\r\n] as const;\r\n\r\nconst BARREL_REQUIRED_PEERS = ['zustand', '@tanstack/react-table'] as const;\r\n\r\nconst BARREL_OPTIONAL_PEERS = [\r\n 'react-image-crop',\r\n '@fullcalendar/core',\r\n '@fullcalendar/daygrid',\r\n '@fullcalendar/timegrid',\r\n '@fullcalendar/interaction',\r\n '@fullcalendar/multimonth',\r\n '@fullcalendar/list',\r\n '@fullcalendar/react',\r\n] as const;\r\n\r\nexport function runPeerChecks(cwd: string): CheckResult[] {\r\n const pkg = readPackageJson(cwd);\r\n if (!pkg) {\r\n return [\r\n {\r\n id: 'P0',\r\n status: 'fail',\r\n message: 'package.json not found or unreadable',\r\n fixHint: 'Run idia-ui doctor from your app root',\r\n },\r\n ];\r\n }\r\n\r\n const pm = detectPackageManager(cwd);\r\n const results: CheckResult[] = [];\r\n\r\n // P1 — tamagui peer range\r\n const tamaguiVersion =\r\n readInstalledVersion(cwd, 'tamagui') ??\r\n getDepVersion(pkg, 'tamagui')?.replace(/^[\\^~]/, '') ??\r\n null;\r\n const coreRange =\r\n readPeerRange(cwd, '@idia-ui/core', 'tamagui') ??\r\n readPeerRange(cwd, '@idia-ui/theme', 'tamagui') ??\r\n '^1.70.0';\r\n\r\n if (!tamaguiVersion) {\r\n results.push({\r\n id: 'P1',\r\n status: 'fail',\r\n message: 'tamagui not installed',\r\n fixHint: pmAddCommand(pm, ['tamagui@^1.144.0']),\r\n });\r\n } else if (!satisfiesRange(tamaguiVersion, coreRange)) {\r\n results.push({\r\n id: 'P1',\r\n status: 'fail',\r\n message: `tamagui ${tamaguiVersion} outside peer range ${coreRange}`,\r\n fixHint: pmAddCommand(pm, [`tamagui@${coreRange}`]),\r\n });\r\n } else {\r\n results.push({\r\n id: 'P1',\r\n status: 'pass',\r\n message: `tamagui ${tamaguiVersion} in peer range`,\r\n });\r\n }\r\n\r\n // P2 — navigation/gesture peers\r\n const missingP2 = P2_PACKAGES.filter((name) => {\r\n const installed = readInstalledVersion(cwd, name);\r\n const declared = getDepVersion(pkg, name);\r\n return !installed && !declared;\r\n });\r\n\r\n if (missingP2.length > 0) {\r\n results.push({\r\n id: 'P2',\r\n status: 'fail',\r\n message: `missing navigation/gesture peers: ${missingP2.join(', ')}`,\r\n fixHint: pmAddCommand(pm, [...missingP2]),\r\n });\r\n } else {\r\n results.push({\r\n id: 'P2',\r\n status: 'pass',\r\n message:\r\n 'gesture-handler, reanimated, screens, safe-area-context present',\r\n });\r\n }\r\n\r\n // P3 — @idia-ui/* alignment + barrel peers\r\n const idiaPkgs = Object.keys({\r\n ...pkg.dependencies,\r\n ...pkg.devDependencies,\r\n }).filter((n) => n.startsWith('@idia-ui/'));\r\n\r\n const idiaVersions = idiaPkgs\r\n .map((name) => {\r\n const v =\r\n readInstalledVersion(cwd, name) ??\r\n getDepVersion(pkg, name)?.replace(/^[\\^~]/, '');\r\n return v ? { name, version: v } : null;\r\n })\r\n .filter((x): x is { name: string; version: string } => x !== null);\r\n\r\n const minors = new Set(\r\n idiaVersions\r\n .map((p) => {\r\n const parts = p.version.split('.');\r\n return parts.length >= 2 ? `${parts[0]}.${parts[1]}` : null;\r\n })\r\n .filter((m): m is string => m !== null && !m.includes('workspace')),\r\n );\r\n\r\n if (idiaVersions.length === 0) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: 'no @idia-ui/* packages in dependencies',\r\n fixHint: pmAddCommand(pm, ['@idia-ui/core@latest', '@idia-ui/theme@latest']),\r\n });\r\n } else if (minors.size > 1) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: `@idia-ui/* minor versions misaligned: ${[...minors].join(', ')}`,\r\n fixHint: `${pm === 'pnpm' ? 'pnpm' : pm} update @idia-ui/*`,\r\n });\r\n } else {\r\n results.push({\r\n id: 'P3',\r\n status: 'pass',\r\n message: `@idia-ui/* versions aligned (${idiaVersions.map((p) => `${p.name}@${p.version}`).join(', ')})`,\r\n });\r\n }\r\n\r\n for (const peer of BARREL_REQUIRED_PEERS) {\r\n const installed = readInstalledVersion(cwd, peer);\r\n const declared = getDepVersion(pkg, peer);\r\n if (!installed && !declared) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: `barrel peer ${peer} not installed (required for @idia-ui/core Table graph)`,\r\n fixHint: `${pmAddCommand(pm, [peer])} — see docs/generated/peer-dep-matrix.md`,\r\n });\r\n }\r\n }\r\n\r\n for (const peer of BARREL_OPTIONAL_PEERS) {\r\n const installed = readInstalledVersion(cwd, peer);\r\n const declared = getDepVersion(pkg, peer);\r\n if (!installed && !declared) {\r\n results.push({\r\n id: 'P3',\r\n status: 'warn',\r\n message: `optional peer ${peer} not installed (barrel may require it)`,\r\n fixHint: `Install per peer-dep-matrix.md: ${pmAddCommand(pm, [peer])}`,\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport { fileExists, grepSrcForPattern, readTextFile } from '../utils/fs.js';\r\n\r\nconst OVERLAY_IMPORT =\r\n /from\\s+['\"]@idia-ui\\/core['\"][\\s\\S]*?(Modal|Toast|Dialog|ConfirmationModal)/;\r\n\r\nexport function runRuntimeChecks(cwd: string): CheckResult[] {\r\n const results: CheckResult[] = [];\r\n\r\n // R1\r\n if (fileExists(cwd, 'tamagui.config.ts')) {\r\n results.push({\r\n id: 'R1',\r\n status: 'pass',\r\n message: 'tamagui.config.ts found',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R1',\r\n status: 'fail',\r\n message: 'tamagui.config.ts missing at app root',\r\n fixHint: 'Restore from templates/consumer-app or re-scaffold',\r\n });\r\n }\r\n\r\n // R2\r\n const providers =\r\n readTextFile(cwd, 'src/providers/AppProviders.tsx') ??\r\n readTextFile(cwd, 'src/providers/AppProviders.ts');\r\n\r\n if (!providers) {\r\n results.push({\r\n id: 'R2',\r\n status: 'fail',\r\n message: 'AppProviders not found',\r\n fixHint: 'Add src/providers/AppProviders.tsx per templates/consumer-app',\r\n });\r\n } else {\r\n const hasTamagui = /TamaguiProvider/.test(providers);\r\n const hasTheme = /ThemeProvider/.test(providers) && /@idia-ui\\/theme/.test(providers);\r\n if (hasTamagui && hasTheme) {\r\n results.push({\r\n id: 'R2',\r\n status: 'pass',\r\n message: 'AppProviders: TamaguiProvider + ThemeProvider',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R2',\r\n status: 'fail',\r\n message: 'AppProviders missing TamaguiProvider and/or ThemeProvider (@idia-ui/theme)',\r\n fixHint: 'Compare src/providers/AppProviders.tsx with templates/consumer-app',\r\n });\r\n }\r\n }\r\n\r\n // R3 — overlay providers\r\n const usesOverlays =\r\n grepSrcForPattern(cwd, OVERLAY_IMPORT) ||\r\n grepSrcForPattern(cwd, /\\b(Modal|Toast|Dialog)\\b.*@idia-ui\\/core/);\r\n\r\n if (usesOverlays) {\r\n const hasModal = providers ? /ModalProvider/.test(providers) : false;\r\n const hasToast = providers ? /ToastProvider/.test(providers) : false;\r\n if (!hasModal || !hasToast) {\r\n results.push({\r\n id: 'R3',\r\n status: 'warn',\r\n message: 'overlay components imported but ModalProvider/ToastProvider missing',\r\n fixHint: 'Add ModalProvider and ToastProvider to AppProviders per template',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R3',\r\n status: 'pass',\r\n message: 'overlay providers present',\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'R3',\r\n status: 'pass',\r\n message: 'no overlay imports detected (Modal/Toast providers optional)',\r\n });\r\n }\r\n\r\n // R4 — font gate\r\n const fontGate =\r\n (providers && /waitForWebFonts/.test(providers)) ||\r\n grepSrcForPattern(cwd, /expo-font/) ||\r\n grepSrcForPattern(cwd, /useFonts/);\r\n\r\n if (fontGate) {\r\n results.push({\r\n id: 'R4',\r\n status: 'pass',\r\n message: 'web font gate configured (waitForWebFonts or expo-font)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R4',\r\n status: 'warn',\r\n message: 'no waitForWebFonts or expo-font pattern detected',\r\n fixHint: 'Copy font loading pattern from templates/consumer-app AppProviders',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n","import { runBrainChecks, runCustomCheck, runStorybookChecks } from './packs.js';\r\nimport { runManifestCheck } from './manifest.js';\r\nimport { runNavigationChecks } from './navigation.js';\r\nimport { runPeerChecks } from './peers.js';\r\nimport { runRuntimeChecks } from './runtime.js';\r\nimport type { CheckResult, DoctorOptions } from '../types.js';\r\n\r\nexport function runAllChecks(options: DoctorOptions): CheckResult[] {\r\n const { cwd, full, fix } = options;\r\n const checks: CheckResult[] = [];\r\n\r\n checks.push(...runPeerChecks(cwd));\r\n checks.push(...runRuntimeChecks(cwd));\r\n checks.push(...runNavigationChecks(cwd));\r\n\r\n const { results: manifestResults } = runManifestCheck(cwd, fix);\r\n checks.push(...manifestResults);\r\n\r\n if (full) {\r\n checks.push(...runStorybookChecks(cwd));\r\n checks.push(...runBrainChecks(cwd));\r\n checks.push(...runCustomCheck(cwd));\r\n }\r\n\r\n return checks;\r\n}\r\n\r\nexport function summarizeChecks(\r\n checks: CheckResult[],\r\n strict: boolean,\r\n): { passed: number; warnings: number; failures: number; skipped: number; exitCode: number } {\r\n let passed = 0;\r\n let warnings = 0;\r\n let failures = 0;\r\n let skipped = 0;\r\n\r\n for (const check of checks) {\r\n switch (check.status) {\r\n case 'pass':\r\n passed++;\r\n break;\r\n case 'warn':\r\n warnings++;\r\n break;\r\n case 'fail':\r\n failures++;\r\n break;\r\n case 'skip':\r\n case 'info':\r\n skipped++;\r\n break;\r\n }\r\n }\r\n\r\n let exitCode = 0;\r\n if (failures > 0) exitCode = 1;\r\n else if (strict && warnings > 0) exitCode = 1;\r\n\r\n return { passed, warnings, failures, skipped, exitCode };\r\n}\r\n","import { runAllChecks, summarizeChecks } from '../checks/index.js';\r\nimport type { DoctorOptions, DoctorReport } from '../types.js';\r\n\r\nconst STATUS_ICON: Record<string, string> = {\r\n pass: '✓',\r\n warn: '⚠',\r\n fail: '✗',\r\n info: 'ℹ',\r\n skip: '○',\r\n};\r\n\r\nexport function runDoctor(options: DoctorOptions): DoctorReport {\r\n const checks = runAllChecks(options);\r\n const summary = summarizeChecks(checks, options.strict);\r\n\r\n return {\r\n checks,\r\n summary: {\r\n passed: summary.passed,\r\n warnings: summary.warnings,\r\n failures: summary.failures,\r\n skipped: summary.skipped,\r\n },\r\n exitCode: summary.exitCode,\r\n };\r\n}\r\n\r\nexport function formatHumanReport(report: DoctorReport, full: boolean): string {\r\n const lines: string[] = ['idia-ui doctor', ''];\r\n\r\n for (const check of report.checks) {\r\n const icon = STATUS_ICON[check.status] ?? '·';\r\n lines.push(`${icon} ${check.id} ${check.message}`);\r\n if (check.fixHint && (check.status === 'fail' || check.status === 'warn')) {\r\n lines.push(` → ${check.fixHint}`);\r\n }\r\n }\r\n\r\n lines.push('');\r\n const { passed, warnings, failures } = report.summary;\r\n const mode = full ? 'full' : 'quick';\r\n lines.push(\r\n `${passed} passed, ${warnings} warnings, ${failures} failures (${mode} scan) — exit ${report.exitCode}`,\r\n );\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nexport function formatJsonReport(report: DoctorReport): string {\r\n return JSON.stringify(\r\n {\r\n checks: report.checks.map((c) => ({\r\n id: c.id,\r\n status: c.status,\r\n message: c.message,\r\n ...(c.fixHint ? { fixHint: c.fixHint } : {}),\r\n })),\r\n summary: report.summary,\r\n exitCode: report.exitCode,\r\n },\r\n null,\r\n 2,\r\n );\r\n}\r\n","import { spawnSync } from 'node:child_process'\r\n\r\nimport {\r\n STORYBOOK_CLI_VERSION,\r\n STORYBOOK_DOCS_VERSION,\r\n STORYBOOK_PRESET_VERSION,\r\n} from './constants.js'\r\nimport type { PackageManager } from '../../utils/pm.js'\r\nimport { detectPackageManager } from '../../utils/pm.js'\r\nimport { readInstalledVersion, readPackageJson } from '../../utils/package-json.js'\r\nimport { fileExists } from '../../utils/fs.js'\r\nimport { CLI_VERSION, readManifest, writeManifest } from '../../utils/manifest.js'\r\n\r\nexport type SyncStorybookOptions = {\r\n cwd: string\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n}\r\n\r\nexport type SyncStorybookResult = {\r\n synced: boolean\r\n message: string\r\n}\r\n\r\nfunction isStorybookInstalled(cwd: string): boolean {\r\n return fileExists(cwd, '.storybook/main.ts')\r\n}\r\n\r\nfunction runPmUpdate(cwd: string, pm: PackageManager): void {\r\n const packages = [\r\n `@idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`,\r\n `@idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`,\r\n ]\r\n\r\n const args =\r\n pm === 'pnpm'\r\n ? ['add', '-D', ...packages]\r\n : pm === 'yarn'\r\n ? ['add', '-D', ...packages]\r\n : ['install', '-D', ...packages]\r\n\r\n const result = spawnSync(pm, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: process.platform === 'win32',\r\n })\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} update failed with exit code ${result.status ?? 'unknown'}`)\r\n }\r\n}\r\n\r\nexport function runSyncStorybook(options: SyncStorybookOptions): SyncStorybookResult {\r\n const { cwd, skipInstall = false } = options\r\n const pm = options.pm ?? detectPackageManager(cwd)\r\n\r\n if (!isStorybookInstalled(cwd)) {\r\n console.error('Storybook not installed — run idia-ui add storybook first')\r\n process.exit(1)\r\n }\r\n\r\n const manifest = readManifest(cwd)\r\n if (!manifest) {\r\n console.error('.idia/manifest.json missing — run idia-ui doctor --fix')\r\n process.exit(1)\r\n }\r\n\r\n const corePkg = readPackageJson(cwd)\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n corePkg?.dependencies?.['@idia-ui/core']?.replace(/^[\\^~]/, '') ??\r\n manifest.core\r\n\r\n if (!skipInstall) {\r\n console.log(`Syncing storybook packs via ${pm}…`)\r\n runPmUpdate(cwd, pm)\r\n }\r\n\r\n manifest.idiaCli = CLI_VERSION\r\n manifest.core = coreVersion\r\n manifest.features ??= {}\r\n manifest.features.storybook = {\r\n installed: (manifest.features.storybook as { installed?: string } | undefined)?.installed ??\r\n new Date().toISOString(),\r\n storybookDocs: STORYBOOK_DOCS_VERSION,\r\n storybook: STORYBOOK_CLI_VERSION,\r\n preset: STORYBOOK_PRESET_VERSION,\r\n }\r\n writeManifest(cwd, manifest)\r\n\r\n console.log(`✓ Synced @idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`)\r\n console.log(`✓ Synced @idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`)\r\n\r\n return {\r\n synced: true,\r\n message: `storybook-docs@${STORYBOOK_DOCS_VERSION} aligned with core@${coreVersion}`,\r\n }\r\n}\r\n\r\n","import { installBrainPack, printBrainInstallSummary } from '../brain/install.js';\r\nimport { BRAIN_DOCTOR_DISCLAIMER, BRAIN_TIER_DISCLAIMER } from '../brain/constants.js';\r\nimport { runSyncStorybook as syncStorybookPack } from './storybook/sync.js';\r\nimport { fileExists } from '../utils/fs.js';\r\nimport { readManifest } from '../utils/manifest.js';\r\n\r\nexport type SyncOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n};\r\n\r\nexport function runSyncBrain(options: SyncOptions): void {\r\n try {\r\n const result = installBrainPack({\r\n cwd: options.cwd,\r\n repair: true,\r\n force: options.force,\r\n pm: options.pm,\r\n });\r\n console.log('✓ brain pack synced');\r\n printBrainInstallSummary(result);\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n console.error(BRAIN_TIER_DISCLAIMER);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function runSyncStorybook(options: SyncOptions): void {\r\n syncStorybookPack({\r\n cwd: options.cwd,\r\n pm: options.pm,\r\n });\r\n}\r\n\r\nexport function runSyncAll(options: SyncOptions): void {\r\n const { cwd } = options;\r\n const manifest = readManifest(cwd);\r\n const hasStorybook =\r\n fileExists(cwd, '.storybook/main.ts') || Boolean(manifest?.features?.storybook);\r\n const hasBrain = Boolean(manifest?.features?.brain?.brainPack);\r\n\r\n if (!hasStorybook && !hasBrain) {\r\n console.error('No storybook or brain features installed — run idia-ui add storybook or add brain first');\r\n process.exit(1);\r\n }\r\n\r\n if (hasStorybook) {\r\n syncStorybookPack({ cwd, pm: options.pm });\r\n } else {\r\n console.log('○ storybook not installed — skipping storybook sync');\r\n }\r\n\r\n if (hasBrain) {\r\n runSyncBrain(options);\r\n } else {\r\n console.log('○ brain not installed — skipping brain sync');\r\n console.error(BRAIN_DOCTOR_DISCLAIMER);\r\n }\r\n\r\n console.log('');\r\n console.log('✓ sync all complete');\r\n}\r\n\r\nexport function runSync(target: string, options: SyncOptions): void {\r\n switch (target) {\r\n case 'brain':\r\n runSyncBrain(options);\r\n break;\r\n case 'storybook':\r\n runSyncStorybook(options);\r\n break;\r\n case 'all':\r\n runSyncAll(options);\r\n break;\r\n default:\r\n console.error(`Unknown sync target: ${target}`);\r\n console.error('Available: storybook | brain | all');\r\n process.exit(1);\r\n }\r\n}\r\n"],"mappings":"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","names":["import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","semver","import_node_fs","import_node_path","at","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","require","import_node_child_process","runPmInstall","runPmInstall","packRoot","packManifest","import_node_fs","import_node_path","import_node_child_process","isStorybookInstalled","runSyncStorybook"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/storybook/add.ts","../src/commands/storybook/constants.ts","../src/commands/storybook/templates.ts","../src/utils/pm.ts","../src/utils/package-json.ts","../src/utils/fs.ts","../src/utils/manifest.ts","../src/brain/install.ts","../src/brain/agents-patch.ts","../src/brain/constants.ts","../src/brain/pack.ts","../src/utils/exec.ts","../src/commands/add.ts","../src/checks/packs.ts","../src/checks/manifest.ts","../src/checks/navigation.ts","../src/checks/peers.ts","../src/checks/runtime.ts","../src/checks/index.ts","../src/commands/doctor.ts","../src/commands/storybook/sync.ts","../src/commands/sync.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport { resolve } from 'node:path';\r\n\r\nimport { runAddBrain, runAddStorybook, runAddUnknown } from './commands/add.js';\r\nimport {\r\n formatHumanReport,\r\n formatJsonReport,\r\n runDoctor,\r\n} from './commands/doctor.js';\r\nimport { runSync } from './commands/sync.js';\r\nimport { CLI_VERSION } from './utils/manifest.js';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('idia-ui')\r\n .description('idia-ui CLI — doctor and add-on management for consumer apps')\r\n .version(CLI_VERSION);\r\n\r\nprogram\r\n .command('doctor')\r\n .description('Run health checks on an idia consumer app')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .option('--full', 'Include Storybook (S*) and brain (B*) checks')\r\n .option('--fix', 'Limited safe repairs (manifest regenerate)')\r\n .option('--strict', 'Treat warnings as failures')\r\n .option('--json', 'Machine-readable JSON output')\r\n .action((opts: { cwd: string; full?: boolean; fix?: boolean; strict?: boolean; json?: boolean }) => {\r\n const cwd = resolve(opts.cwd);\r\n const report = runDoctor({\r\n cwd,\r\n full: Boolean(opts.full),\r\n fix: Boolean(opts.fix),\r\n strict: Boolean(opts.strict),\r\n json: Boolean(opts.json),\r\n });\r\n\r\n if (opts.json) {\r\n console.log(formatJsonReport(report));\r\n } else {\r\n console.log(formatHumanReport(report, Boolean(opts.full)));\r\n }\r\n\r\n process.exit(report.exitCode);\r\n });\r\n\r\nconst addCmd = program.command('add').description('Install idia add-on packs');\r\n\r\naddCmd\r\n .command('storybook')\r\n .description('Install Storybook docs pack')\r\n .option('--repair', 'Refresh CLI-owned Storybook files')\r\n .option('--force', 'Overwrite conflicts (document risk)')\r\n .option('--skip-install', 'Skip package manager install')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action(\r\n (opts: {\r\n repair?: boolean;\r\n force?: boolean;\r\n skipInstall?: boolean;\r\n pm?: string;\r\n cwd: string;\r\n }) => {\r\n runAddStorybook({\r\n cwd: resolve(opts.cwd),\r\n repair: Boolean(opts.repair),\r\n force: Boolean(opts.force),\r\n skipInstall: Boolean(opts.skipInstall),\r\n pm: parsePm(opts.pm),\r\n });\r\n },\r\n );\r\n\r\naddCmd\r\n .command('brain')\r\n .description('Install brain AI pack (Phase 4 — experimental)')\r\n .option('--repair', 'Re-apply rules, AGENTS block, and .idia/brain/ from pack')\r\n .option('--force', 'Overwrite conflicts (document risk)')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action((opts: { repair?: boolean; force?: boolean; pm?: string; cwd: string }) => {\r\n runAddBrain({\r\n cwd: resolve(opts.cwd),\r\n repair: Boolean(opts.repair),\r\n force: Boolean(opts.force),\r\n pm: parsePm(opts.pm),\r\n });\r\n });\r\n\r\naddCmd\r\n .argument('[target]', 'add-on target')\r\n .action((target: string | undefined) => {\r\n if (!target) {\r\n console.error('Usage: idia-ui add <storybook|brain>');\r\n process.exit(1);\r\n }\r\n runAddUnknown(target);\r\n });\r\n\r\nconst syncCmd = program\r\n .command('sync')\r\n .description('Sync installed pack versions and manifest');\r\n\r\nsyncCmd\r\n .argument('<target>', 'storybook | brain | all')\r\n .option('--force', 'Overwrite pack-owned files')\r\n .option('--pm <manager>', 'Override package manager (pnpm|npm|yarn)')\r\n .option('--cwd <path>', 'App root directory', process.cwd())\r\n .action((target: string, opts: { force?: boolean; pm?: string; cwd: string }) => {\r\n runSync(target, {\r\n cwd: resolve(opts.cwd),\r\n force: Boolean(opts.force),\r\n pm: parsePm(opts.pm),\r\n });\r\n });\r\n\r\nprogram.parse();\r\n\r\nfunction parsePm(value: string | undefined): 'pnpm' | 'npm' | 'yarn' | undefined {\r\n if (!value) return undefined;\r\n const normalized = value.toLowerCase();\r\n if (normalized === 'pnpm' || normalized === 'npm' || normalized === 'yarn') {\r\n return normalized;\r\n }\r\n console.error(`Invalid --pm value \"${value}\". Use pnpm, npm, or yarn.`);\r\n process.exit(1);\r\n}\r\n","import { mkdirSync, writeFileSync } from 'node:fs'\r\nimport { dirname, join } from 'node:path'\r\nimport { spawnSync } from 'node:child_process'\r\n\r\nimport {\r\n STORYBOOK_CLI_VERSION,\r\n STORYBOOK_DEV_DEPS,\r\n STORYBOOK_DOCS_VERSION,\r\n STORYBOOK_OWNED_FILES,\r\n STORYBOOK_PRESET_VERSION,\r\n} from './constants.js'\r\nimport { buttonStoriesTsx, storybookMainTs, storybookPreviewTsx } from './templates.js'\r\nimport type { PackageManager } from '../../utils/pm.js'\r\nimport { detectPackageManager } from '../../utils/pm.js'\r\nimport { readInstalledVersion, readPackageJson } from '../../utils/package-json.js'\r\nimport { fileExists, readTextFile } from '../../utils/fs.js'\r\nimport {\r\n CLI_VERSION,\r\n readManifest,\r\n writeManifest,\r\n} from '../../utils/manifest.js'\r\nimport type { IdiaManifest } from '../../types.js'\r\n\r\nexport type AddStorybookOptions = {\r\n cwd: string\r\n repair?: boolean\r\n force?: boolean\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n}\r\n\r\nexport type AddStorybookResult = {\r\n installed: boolean\r\n alreadyInstalled: boolean\r\n filesWritten: string[]\r\n warnings: string[]\r\n}\r\n\r\nfunction writeOwnedFile(cwd: string, relativePath: string, content: string, force: boolean): boolean {\r\n const fullPath = join(cwd, relativePath)\r\n if (fileExists(cwd, relativePath) && !force) {\r\n const existing = readTextFile(cwd, relativePath)\r\n if (existing === content) return false\r\n throw new Error(\r\n `Conflict: ${relativePath} exists with different content. Use --repair or --force.`,\r\n )\r\n }\r\n mkdirSync(dirname(fullPath), { recursive: true })\r\n writeFileSync(fullPath, content, 'utf8')\r\n return true\r\n}\r\n\r\nfunction parseDepSpec(spec: string): { name: string; range: string } {\r\n if (spec.startsWith('@')) {\r\n const at = spec.indexOf('@', 1)\r\n return { name: spec.slice(0, at), range: spec.slice(at + 1) }\r\n }\r\n const at = spec.indexOf('@')\r\n return { name: spec.slice(0, at), range: spec.slice(at + 1) }\r\n}\r\n\r\nfunction resolveDepVersion(name: string, range: string): string {\r\n if (name.startsWith('@idia-ui/storybook')) {\r\n return 'workspace:*'\r\n }\r\n return `^${range.replace(/^\\^/, '')}`\r\n}\r\n\r\nfunction addDevDependencies(cwd: string): void {\r\n const pkg = readPackageJson(cwd)\r\n if (!pkg) throw new Error('package.json not found')\r\n\r\n pkg.devDependencies ??= {}\r\n for (const spec of STORYBOOK_DEV_DEPS) {\r\n const { name, range } = parseDepSpec(spec)\r\n pkg.devDependencies[name] = resolveDepVersion(name, range)\r\n }\r\n\r\n pkg.scripts ??= {}\r\n pkg.scripts.storybook = 'storybook dev -p 6006'\r\n pkg.scripts['build-storybook'] = 'storybook build'\r\n\r\n writeFileSync(join(cwd, 'package.json'), `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\r\n}\r\n\r\nfunction runPmInstall(cwd: string, pm: PackageManager): void {\r\n const args =\r\n pm === 'pnpm'\r\n ? ['add', '-D', ...STORYBOOK_DEV_DEPS]\r\n : pm === 'yarn'\r\n ? ['add', '-D', ...STORYBOOK_DEV_DEPS]\r\n : ['install', '-D', ...STORYBOOK_DEV_DEPS]\r\n\r\n const result = spawnSync(pm, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: process.platform === 'win32',\r\n })\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} install failed with exit code ${result.status ?? 'unknown'}`)\r\n }\r\n}\r\n\r\nfunction resolveCoreVersion(cwd: string, pkg: NonNullable<ReturnType<typeof readPackageJson>>): string {\r\n const installed = readInstalledVersion(cwd, '@idia-ui/core')\r\n if (installed) return installed\r\n\r\n const declared = pkg.dependencies?.['@idia-ui/core'] ?? ''\r\n if (declared && !declared.startsWith('workspace')) {\r\n return declared.replace(/^[\\^~]/, '')\r\n }\r\n\r\n return '0.2.0'\r\n}\r\n\r\nfunction updateStorybookManifest(cwd: string, manifest: IdiaManifest, coreVersion: string): void {\r\n manifest.idiaCli = CLI_VERSION\r\n manifest.core = coreVersion\r\n manifest.features ??= {}\r\n manifest.features.storybook = {\r\n installed: new Date().toISOString(),\r\n storybookDocs: STORYBOOK_DOCS_VERSION,\r\n storybook: STORYBOOK_CLI_VERSION,\r\n preset: STORYBOOK_PRESET_VERSION,\r\n }\r\n writeManifest(cwd, manifest)\r\n}\r\n\r\nfunction isStorybookInstalled(cwd: string): boolean {\r\n return (\r\n fileExists(cwd, '.storybook/main.ts') &&\r\n Boolean(readPackageJson(cwd)?.devDependencies?.['@idia-ui/storybook-docs'])\r\n )\r\n}\r\n\r\nexport function runAddStorybook(options: AddStorybookOptions): AddStorybookResult {\r\n const { cwd, repair = false, force = false, skipInstall = false } = options\r\n const pm = options.pm ?? detectPackageManager(cwd)\r\n const warnings: string[] = []\r\n const filesWritten: string[] = []\r\n\r\n const pkg = readPackageJson(cwd)\r\n if (!pkg) {\r\n console.error('package.json not found — run from your app root')\r\n process.exit(1)\r\n }\r\n\r\n let manifest = readManifest(cwd)\r\n const coreVersion = resolveCoreVersion(cwd, pkg)\r\n if (!manifest) {\r\n manifest = { idiaCli: CLI_VERSION, core: coreVersion }\r\n warnings.push('Created .idia/manifest.json stub')\r\n } else {\r\n manifest.core = coreVersion\r\n }\r\n\r\n const alreadyInstalled = isStorybookInstalled(cwd)\r\n if (alreadyInstalled && !repair && !force) {\r\n console.log('Storybook already installed — idempotent skip (use --repair to refresh CLI-owned files)')\r\n updateStorybookManifest(cwd, manifest, coreVersion)\r\n return { installed: true, alreadyInstalled: true, filesWritten, warnings }\r\n }\r\n\r\n const ownedContent: Record<(typeof STORYBOOK_OWNED_FILES)[number], string> = {\r\n '.storybook/main.ts': storybookMainTs(),\r\n '.storybook/preview.tsx': storybookPreviewTsx(),\r\n 'src/stories/Button.stories.tsx': buttonStoriesTsx(),\r\n }\r\n\r\n for (const relativePath of STORYBOOK_OWNED_FILES) {\r\n if (repair || force || !fileExists(cwd, relativePath)) {\r\n const wrote = writeOwnedFile(cwd, relativePath, ownedContent[relativePath], force || repair)\r\n if (wrote) filesWritten.push(relativePath)\r\n }\r\n }\r\n\r\n addDevDependencies(cwd)\r\n\r\n if (!skipInstall) {\r\n console.log(`Installing Storybook devDependencies via ${pm}…`)\r\n runPmInstall(cwd, pm)\r\n } else {\r\n warnings.push('Skipped package manager install (--skip-install)')\r\n }\r\n\r\n updateStorybookManifest(cwd, manifest, coreVersion)\r\n\r\n console.log('\\n✓ Storybook add-on installed')\r\n console.log(` @idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`)\r\n console.log(` @idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`)\r\n console.log(' Run: pnpm storybook (or npm run storybook)')\r\n\r\n return { installed: true, alreadyInstalled, filesWritten, warnings }\r\n}\r\n","/** Version lockstep with @idia-ui/core minor (0.2.x). */\r\nexport const STORYBOOK_DOCS_VERSION = '0.2.0'\r\nexport const STORYBOOK_PRESET_VERSION = '0.2.1'\r\nexport const STORYBOOK_CLI_VERSION = '8.4.7'\r\n\r\nexport const STORYBOOK_DEV_DEPS = [\r\n 'storybook@^8.4.7',\r\n '@storybook/react-vite@^8.4.7',\r\n '@storybook/addon-docs@^8.4.7',\r\n '@storybook/addon-a11y@^8.4.7',\r\n '@storybook/addon-links@^8.4.7',\r\n `@idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`,\r\n `@idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`,\r\n 'vite@^5.4.0',\r\n] as const\r\n\r\nexport const STORYBOOK_OWNED_FILES = [\r\n '.storybook/main.ts',\r\n '.storybook/preview.tsx',\r\n 'src/stories/Button.stories.tsx',\r\n] as const\r\n","export function storybookMainTs(): string {\r\n return `import type { StorybookConfig } from '@storybook/react-vite';\r\nimport { idiaStorybookMain } from '@idia-ui/storybook-preset-react-native-web';\r\n\r\nconst config: StorybookConfig = idiaStorybookMain({\r\n stories: ['../src/stories/**/*.stories.@(ts|tsx)'],\r\n staticDirs: ['../public'],\r\n});\r\n\r\nexport default config;\r\n`\r\n}\r\n\r\nexport function storybookPreviewTsx(): string {\r\n return `import React from 'react';\r\nimport type { Preview } from '@storybook/react';\r\nimport { AppProviders } from '../src/providers/AppProviders';\r\nimport '../global.css';\r\n\r\nconst preview: Preview = {\r\n decorators: [\r\n (Story) => (\r\n <AppProviders>\r\n <Story />\r\n </AppProviders>\r\n ),\r\n ],\r\n parameters: {\r\n layout: 'centered',\r\n controls: { expanded: true },\r\n },\r\n};\r\n\r\nexport default preview;\r\n`\r\n}\r\n\r\nexport function buttonStoriesTsx(): string {\r\n return `import type { Meta, StoryObj } from '@storybook/react';\r\nimport { Button } from '@idia-ui/core';\r\nimport { BrainDocSections } from '@idia-ui/storybook-docs';\r\n\r\nconst meta = {\r\n title: 'Components/Button',\r\n component: Button,\r\n tags: ['autodocs'],\r\n parameters: {\r\n docs: {\r\n page: () => (\r\n <>\r\n <BrainDocSections\r\n componentId=\"button\"\r\n sectionIds={['intent', 'usage', 'variants', 'accessibility']}\r\n />\r\n </>\r\n ),\r\n },\r\n },\r\n args: {\r\n label: 'Button',\r\n variant: 'primary',\r\n },\r\n} satisfies Meta<typeof Button>;\r\n\r\nexport default meta;\r\n\r\ntype Story = StoryObj<typeof meta>;\r\n\r\nexport const Playground: Story = {};\r\n`\r\n}\r\n","import { existsSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn';\r\n\r\nfunction findLockfileDir(start: string): string {\r\n let dir = start;\r\n while (true) {\r\n if (existsSync(join(dir, 'pnpm-lock.yaml'))) return dir;\r\n if (existsSync(join(dir, 'yarn.lock'))) return dir;\r\n if (existsSync(join(dir, 'package-lock.json'))) return dir;\r\n const parent = dirname(dir);\r\n if (parent === dir) return start;\r\n dir = parent;\r\n }\r\n}\r\n\r\nexport function detectPackageManager(cwd: string): PackageManager {\r\n const root = findLockfileDir(cwd);\r\n if (existsSync(join(root, 'pnpm-lock.yaml'))) return 'pnpm';\r\n if (existsSync(join(root, 'yarn.lock'))) return 'yarn';\r\n return 'npm';\r\n}\r\n\r\nexport function pmAddCommand(pm: PackageManager, packages: string[]): string {\r\n const list = packages.join(' ');\r\n switch (pm) {\r\n case 'pnpm':\r\n return `pnpm add ${list}`;\r\n case 'yarn':\r\n return `yarn add ${list}`;\r\n default:\r\n return `npm install ${list}`;\r\n }\r\n}\r\n\r\nexport function pmUpdateCommand(pm: PackageManager, packages: string[]): string {\r\n const list = packages.join(' ');\r\n switch (pm) {\r\n case 'pnpm':\r\n return `pnpm update ${list}`;\r\n case 'yarn':\r\n return `yarn upgrade ${list}`;\r\n default:\r\n return `npm update ${list}`;\r\n }\r\n}\r\n","import { readFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { PackageJson } from '../types.js';\r\n\r\nexport function readPackageJson(cwd: string): PackageJson | null {\r\n try {\r\n const raw = readFileSync(join(cwd, 'package.json'), 'utf8');\r\n return JSON.parse(raw) as PackageJson;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function getDepVersion(\r\n pkg: PackageJson,\r\n name: string,\r\n): string | undefined {\r\n return pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];\r\n}\r\n\r\nexport function readInstalledVersion(cwd: string, name: string): string | null {\r\n try {\r\n const pkgPath = join(cwd, 'node_modules', name, 'package.json');\r\n const raw = readFileSync(pkgPath, 'utf8');\r\n const parsed = JSON.parse(raw) as { version?: string };\r\n return parsed.version ?? null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readPeerRange(\r\n cwd: string,\r\n packageName: string,\r\n peerName: string,\r\n): string | null {\r\n try {\r\n const pkgPath = join(cwd, 'node_modules', packageName, 'package.json');\r\n const raw = readFileSync(pkgPath, 'utf8');\r\n const parsed = JSON.parse(raw) as {\r\n peerDependencies?: Record<string, string>;\r\n };\r\n return parsed.peerDependencies?.[peerName] ?? null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function listIdiaPackages(pkg: PackageJson): string[] {\r\n const names = new Set<string>();\r\n for (const deps of [pkg.dependencies, pkg.devDependencies]) {\r\n if (!deps) continue;\r\n for (const name of Object.keys(deps)) {\r\n if (name.startsWith('@idia-ui/')) names.add(name);\r\n }\r\n }\r\n return [...names].sort();\r\n}\r\n","import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport semver from 'semver';\r\n\r\nexport function satisfiesRange(version: string, range: string): boolean {\r\n const cleaned = version.replace(/^[\\^~>=<]*/, '').split(' ')[0] ?? version;\r\n if (range === 'workspace:*' || range.startsWith('file:')) return true;\r\n const coerced = semver.coerce(cleaned);\r\n if (!coerced) return false;\r\n return semver.satisfies(coerced, range, { includePrerelease: true });\r\n}\r\n\r\nexport function getMinor(version: string): string | null {\r\n const coerced = semver.coerce(version);\r\n if (!coerced) return null;\r\n return `${coerced.major}.${coerced.minor}`;\r\n}\r\n\r\nexport function readTextFile(cwd: string, relativePath: string): string | null {\r\n try {\r\n return readFileSync(join(cwd, relativePath), 'utf8');\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function fileExists(cwd: string, relativePath: string): boolean {\r\n try {\r\n return existsSync(join(cwd, relativePath));\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function grepSrcForPattern(cwd: string, pattern: RegExp): boolean {\r\n const filesToScan = [\r\n 'App.tsx',\r\n 'src/providers/AppProviders.tsx',\r\n ];\r\n\r\n for (const file of filesToScan) {\r\n const content = readTextFile(cwd, file);\r\n if (content && pattern.test(content)) return true;\r\n }\r\n\r\n const srcRoot = join(cwd, 'src');\r\n try {\r\n const walk = (dir: string): boolean => {\r\n for (const entry of readdirSync(dir)) {\r\n const full = join(dir, entry);\r\n const stat = statSync(full);\r\n if (stat.isDirectory()) {\r\n if (walk(full)) return true;\r\n } else if (/\\.(tsx?|jsx?)$/.test(entry)) {\r\n const content = readFileSync(full, 'utf8');\r\n if (pattern.test(content)) return true;\r\n }\r\n }\r\n return false;\r\n };\r\n if (existsSync(srcRoot)) return walk(srcRoot);\r\n } catch {\r\n // ignore walk errors\r\n }\r\n\r\n return false;\r\n}\r\n","import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport type { IdiaManifest } from '../types.js';\r\nimport { fileExists } from './fs.js';\r\n\r\nconst CLI_VERSION = '0.2.1';\r\n\r\nexport function readManifest(cwd: string): IdiaManifest | null {\r\n try {\r\n const raw = readFileSync(join(cwd, '.idia', 'manifest.json'), 'utf8');\r\n return JSON.parse(raw) as IdiaManifest;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function writeManifest(cwd: string, manifest: IdiaManifest): void {\r\n const manifestPath = join(cwd, '.idia', 'manifest.json');\r\n mkdirSync(dirname(manifestPath), { recursive: true });\r\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\r\n}\r\n\r\nexport function regenerateManifest(\r\n cwd: string,\r\n coreVersion: string,\r\n): { created: boolean; path: string } {\r\n const manifestPath = join(cwd, '.idia', 'manifest.json');\r\n const manifest: IdiaManifest = {\r\n idiaCli: CLI_VERSION,\r\n core: coreVersion,\r\n };\r\n writeManifest(cwd, manifest);\r\n return { created: true, path: manifestPath };\r\n}\r\n\r\nexport function manifestExists(cwd: string): boolean {\r\n return fileExists(cwd, '.idia/manifest.json');\r\n}\r\n\r\nexport function validateManifestShape(manifest: IdiaManifest): boolean {\r\n return (\r\n typeof manifest.idiaCli === 'string' &&\r\n typeof manifest.core === 'string' &&\r\n /^\\d+\\.\\d+\\.\\d+/.test(manifest.idiaCli) &&\r\n /^\\d+\\.\\d+\\.\\d+/.test(manifest.core)\r\n );\r\n}\r\n\r\nexport { CLI_VERSION };\r\n","import { cpSync, existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport { patchRootAgentsMd } from './agents-patch.js';\r\nimport {\r\n BRAIN_PACK_NAME,\r\n BRAIN_PACK_VERSION,\r\n BRAIN_TIER_DISCLAIMER,\r\n} from './constants.js';\r\nimport {\r\n brainPackSpecForApp,\r\n readBrainPackManifest,\r\n resolveBrainPackRoot,\r\n} from './pack.js';\r\nimport { runPmAddDev, runPmInstall } from '../utils/exec.js';\r\nimport { fileExists } from '../utils/fs.js';\r\nimport { readInstalledVersion, readPackageJson } from '../utils/package-json.js';\r\nimport { detectPackageManager } from '../utils/pm.js';\r\nimport { readManifest, writeManifest, CLI_VERSION } from '../utils/manifest.js';\r\nimport type { IdiaManifest } from '../types.js';\r\n\r\nexport type BrainInstallOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n skipInstall?: boolean;\r\n};\r\n\r\nexport type BrainInstallResult = {\r\n alreadyInstalled: boolean;\r\n packRoot: string;\r\n sourceHash: string;\r\n agentsPatch: ReturnType<typeof patchRootAgentsMd>;\r\n};\r\n\r\nfunction copyDirRecursive(src: string, dest: string, force: boolean): void {\r\n mkdirSync(dest, { recursive: true });\r\n for (const entry of readdirSync(src)) {\r\n const srcPath = join(src, entry);\r\n const destPath = join(dest, entry);\r\n const stat = statSync(srcPath);\r\n if (stat.isDirectory()) {\r\n copyDirRecursive(srcPath, destPath, force);\r\n } else {\r\n if (!force && existsSync(destPath)) continue;\r\n cpSync(srcPath, destPath);\r\n }\r\n }\r\n}\r\n\r\nfunction ensureBrainPackDependency(\r\n cwd: string,\r\n pm: 'pnpm' | 'npm' | 'yarn',\r\n skipInstall: boolean,\r\n): void {\r\n const pkg = readPackageJson(cwd);\r\n if (!pkg) throw new Error('package.json not found');\r\n\r\n const spec = brainPackSpecForApp(cwd);\r\n const existing = pkg.devDependencies?.[BRAIN_PACK_NAME];\r\n if (existing === spec || existing === BRAIN_PACK_VERSION) {\r\n if (!skipInstall && !existsSync(join(cwd, 'node_modules', BRAIN_PACK_NAME))) {\r\n runPmInstall(cwd, pm);\r\n }\r\n return;\r\n }\r\n\r\n if (!skipInstall) {\r\n runPmAddDev(cwd, pm, `${BRAIN_PACK_NAME}@${spec}`);\r\n }\r\n}\r\n\r\nfunction isBrainInstalled(cwd: string, manifest: IdiaManifest | null): boolean {\r\n const hasAgents = fileExists(cwd, '.idia/brain/AGENTS.md');\r\n const hasFeature = Boolean(manifest?.features?.brain?.brainPack);\r\n return hasAgents && hasFeature;\r\n}\r\n\r\nexport function installBrainPack(options: BrainInstallOptions): BrainInstallResult {\r\n const { cwd, repair = false, force = false, skipInstall = false } = options;\r\n const pm = options.pm ?? detectPackageManager(cwd);\r\n const manifest = readManifest(cwd);\r\n\r\n if (isBrainInstalled(cwd, manifest) && !repair && !force) {\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n if (packRoot) {\r\n const packManifest = readBrainPackManifest(packRoot);\r\n return {\r\n alreadyInstalled: true,\r\n packRoot,\r\n sourceHash: packManifest?.sourceHash ?? '',\r\n agentsPatch: { status: 'merged' },\r\n };\r\n }\r\n }\r\n\r\n ensureBrainPackDependency(cwd, pm, skipInstall);\r\n\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n if (!packRoot) {\r\n throw new Error(\r\n `${BRAIN_PACK_NAME} not found. Run ${pm} add -D ${BRAIN_PACK_NAME} and retry.`,\r\n );\r\n }\r\n\r\n const packManifest = readBrainPackManifest(packRoot);\r\n if (!packManifest?.sourceHash) {\r\n throw new Error(`${BRAIN_PACK_NAME} pack-manifest.json missing or invalid.`);\r\n }\r\n\r\n const brainSrc = join(packRoot, 'brain');\r\n const rulesSrc = join(packRoot, 'cursor-rules');\r\n const brainDest = join(cwd, '.idia', 'brain');\r\n const rulesDest = join(cwd, '.cursor', 'rules');\r\n\r\n copyDirRecursive(brainSrc, brainDest, force || repair);\r\n mkdirSync(rulesDest, { recursive: true });\r\n copyDirRecursive(rulesSrc, rulesDest, force || repair);\r\n\r\n const agentsPatch = patchRootAgentsMd(cwd, { repair, force });\r\n\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n manifest?.core ??\r\n packManifest.core;\r\n\r\n const nextManifest: IdiaManifest = {\r\n idiaCli: manifest?.idiaCli ?? CLI_VERSION,\r\n core: coreVersion,\r\n features: {\r\n ...manifest?.features,\r\n brain: {\r\n installed: new Date().toISOString(),\r\n brainPack: packManifest.brainPack,\r\n sourceHash: packManifest.sourceHash,\r\n },\r\n },\r\n };\r\n writeManifest(cwd, nextManifest);\r\n\r\n return {\r\n alreadyInstalled: false,\r\n packRoot,\r\n sourceHash: packManifest.sourceHash,\r\n agentsPatch,\r\n };\r\n}\r\n\r\nexport function printBrainInstallSummary(result: BrainInstallResult): void {\r\n if (result.alreadyInstalled) {\r\n console.log('✓ brain pack already installed');\r\n console.log(` .idia/brain/AGENTS.md`);\r\n console.log(` sourceHash: ${result.sourceHash || '(unknown)'}`);\r\n console.log('');\r\n console.log(BRAIN_TIER_DISCLAIMER);\r\n return;\r\n }\r\n\r\n console.log('✓ brain pack installed to .idia/brain/');\r\n console.log('✓ cursor rules copied to .cursor/rules/idia-ui-*.mdc');\r\n\r\n switch (result.agentsPatch.status) {\r\n case 'created':\r\n console.log('✓ AGENTS.md created with idia-ui brain block');\r\n break;\r\n case 'merged':\r\n console.log('✓ AGENTS.md updated with idia-ui brain block');\r\n break;\r\n case 'replaced':\r\n console.log('✓ AGENTS.md brain block repaired');\r\n break;\r\n case 'conflict':\r\n console.warn(\r\n `⚠ AGENTS.md conflict — wrote suggested patch: ${result.agentsPatch.patchPath}`,\r\n );\r\n console.warn(' Run idia-ui add brain --repair --force to overwrite.');\r\n break;\r\n }\r\n\r\n console.log(` sourceHash: ${result.sourceHash}`);\r\n console.log('');\r\n console.log(BRAIN_TIER_DISCLAIMER);\r\n}\r\n","import { mkdirSync, writeFileSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport {\r\n AGENTS_BEGIN,\r\n AGENTS_BRAIN_BLOCK,\r\n AGENTS_END,\r\n} from './constants.js';\r\nimport { readTextFile } from '../utils/fs.js';\r\n\r\nexport type AgentsPatchResult =\r\n | { status: 'created' | 'merged' | 'replaced' }\r\n | { status: 'conflict'; patchPath: string };\r\n\r\nexport function patchRootAgentsMd(\r\n cwd: string,\r\n options: { repair?: boolean; force?: boolean },\r\n): AgentsPatchResult {\r\n const agentsPath = join(cwd, 'AGENTS.md');\r\n const existing = readTextFile(cwd, 'AGENTS.md');\r\n\r\n if (existing === null) {\r\n writeFileSync(agentsPath, `${AGENTS_BRAIN_BLOCK}\\n`, 'utf8');\r\n return { status: 'created' };\r\n }\r\n\r\n const hasBegin = existing.includes(AGENTS_BEGIN);\r\n const hasEnd = existing.includes(AGENTS_END);\r\n\r\n if (hasBegin && hasEnd) {\r\n if (!options.repair && !options.force) {\r\n return { status: 'merged' };\r\n }\r\n const updated = existing.replace(\r\n new RegExp(`${escapeRegExp(AGENTS_BEGIN)}[\\\\s\\\\S]*?${escapeRegExp(AGENTS_END)}`),\r\n AGENTS_BRAIN_BLOCK,\r\n );\r\n if (updated === existing && !options.force) {\r\n return { status: 'merged' };\r\n }\r\n writeFileSync(agentsPath, updated, 'utf8');\r\n return { status: 'replaced' };\r\n }\r\n\r\n if (hasBegin !== hasEnd) {\r\n if (options.force) {\r\n const withoutPartial = existing\r\n .replace(new RegExp(`${escapeRegExp(AGENTS_BEGIN)}[\\\\s\\\\S]*`), '')\r\n .replace(AGENTS_END, '');\r\n writeFileSync(\r\n agentsPath,\r\n `${withoutPartial.trimEnd()}\\n\\n${AGENTS_BRAIN_BLOCK}\\n`,\r\n 'utf8',\r\n );\r\n return { status: 'replaced' };\r\n }\r\n return writeConflictPatch(cwd, existing);\r\n }\r\n\r\n writeFileSync(agentsPath, `${existing.trimEnd()}\\n\\n${AGENTS_BRAIN_BLOCK}\\n`, 'utf8');\r\n return { status: 'merged' };\r\n}\r\n\r\nfunction writeConflictPatch(cwd: string, existing: string): AgentsPatchResult {\r\n const patchDir = join(cwd, '.idia', 'patches');\r\n mkdirSync(patchDir, { recursive: true });\r\n const patchPath = join(patchDir, 'AGENTS.md.patch');\r\n const patchBody = [\r\n '# AGENTS.md brain block patch (idia-ui add brain)',\r\n '# Apply manually or run: idia-ui add brain --repair --force',\r\n '',\r\n AGENTS_BRAIN_BLOCK,\r\n '',\r\n '# --- existing AGENTS.md preserved below ---',\r\n '',\r\n existing,\r\n ].join('\\n');\r\n writeFileSync(patchPath, patchBody, 'utf8');\r\n return { status: 'conflict', patchPath };\r\n}\r\n\r\nfunction escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","export const BRAIN_PACK_NAME = '@idia-ui/brain-pack';\r\nexport const BRAIN_PACK_VERSION = '0.2.0';\r\n\r\nexport const BRAIN_TIER_DISCLAIMER =\r\n '@idia-ui/brain-pack is a generated AI retrieval pack for idia-ui usage guidance. It does not imply Tier 1 passive external-agent graduation, GA readiness, or full-catalog efficacy.';\r\n\r\nexport const BRAIN_DOCTOR_DISCLAIMER =\r\n 'brain pack is experimental retrieval guidance; it does not imply Tier 1P graduation';\r\n\r\nexport const AGENTS_BEGIN = '<!-- idia-ui brain:begin -->';\r\nexport const AGENTS_END = '<!-- idia-ui brain:end -->';\r\n\r\nexport const AGENTS_BRAIN_BLOCK = `${AGENTS_BEGIN}\r\n## idia-ui design-system brain\r\n\r\nFor idia-ui component usage, design-system documentation, Storybook docs, UI generation, or AI-guided UI work, read:\r\n\r\n\\`.idia/brain/AGENTS.md\\`\r\n\r\nbefore using idia-ui components.\r\n\r\nThis installed brain pack is read-only generated guidance. Do not edit files under \\`.idia/brain/\\` directly.\r\n${AGENTS_END}`;\r\n","import { existsSync, readFileSync } from 'node:fs';\r\nimport { createRequire } from 'node:module';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport { BRAIN_PACK_NAME } from './constants.js';\r\n\r\nexport type BrainPackManifest = {\r\n brainPack: string;\r\n core: string;\r\n sourceHash: string;\r\n coverage?: Record<string, unknown>;\r\n tierClaims?: Record<string, string>;\r\n};\r\n\r\nexport function resolveBrainPackRoot(cwd: string): string | null {\r\n const local = join(cwd, 'node_modules', BRAIN_PACK_NAME);\r\n if (existsSync(join(local, 'pack-manifest.json'))) return local;\r\n\r\n try {\r\n const require = createRequire(join(cwd, 'package.json'));\r\n const pkgJson = require.resolve(`${BRAIN_PACK_NAME}/package.json`);\r\n return dirname(pkgJson);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readBrainPackManifest(packRoot: string): BrainPackManifest | null {\r\n try {\r\n const raw = readFileSync(join(packRoot, 'pack-manifest.json'), 'utf8');\r\n return JSON.parse(raw) as BrainPackManifest;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function brainPackSpecForApp(cwd: string): string {\r\n try {\r\n const pkgPath = join(cwd, 'package.json');\r\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\r\n dependencies?: Record<string, string>;\r\n devDependencies?: Record<string, string>;\r\n };\r\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\r\n const usesWorkspace = Object.values(deps).some((v) => v === 'workspace:*');\r\n if (usesWorkspace) return 'workspace:*';\r\n } catch {\r\n // fall through\r\n }\r\n return '^0.2.0';\r\n}\r\n\r\nexport function readInstalledPackManifest(\r\n cwd: string,\r\n packageName: string,\r\n manifestFile = 'pack-manifest.json',\r\n): { sourceHash?: string } | null {\r\n try {\r\n const raw = readFileSync(\r\n join(cwd, 'node_modules', packageName, manifestFile),\r\n 'utf8',\r\n );\r\n return JSON.parse(raw) as { sourceHash?: string };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import { spawnSync } from 'node:child_process';\r\n\r\nimport type { PackageManager } from './pm.js';\r\n\r\nexport function runPmInstall(cwd: string, pm: PackageManager): void {\r\n const result = spawnCommand(pm, installArgs(pm), cwd);\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} install failed (exit ${result.status ?? 1})`);\r\n }\r\n}\r\n\r\nexport function runPmAddDev(\r\n cwd: string,\r\n pm: PackageManager,\r\n packageSpec: string,\r\n): void {\r\n const result = spawnCommand(pm, addDevArgs(pm, packageSpec), cwd);\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} add failed for ${packageSpec} (exit ${result.status ?? 1})`);\r\n }\r\n}\r\n\r\nfunction installArgs(pm: PackageManager): string[] {\r\n switch (pm) {\r\n case 'pnpm':\r\n return ['install'];\r\n case 'yarn':\r\n return ['install'];\r\n default:\r\n return ['install'];\r\n }\r\n}\r\n\r\nfunction addDevArgs(pm: PackageManager, packageSpec: string): string[] {\r\n switch (pm) {\r\n case 'pnpm':\r\n return ['add', '-D', packageSpec];\r\n case 'yarn':\r\n return ['add', '-D', packageSpec];\r\n default:\r\n return ['install', '-D', packageSpec];\r\n }\r\n}\r\n\r\nfunction spawnCommand(\r\n pm: PackageManager,\r\n args: string[],\r\n cwd: string,\r\n): ReturnType<typeof spawnSync> {\r\n const command = pm === 'npm' ? 'npm' : pm;\r\n return spawnSync(command, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });\r\n}\r\n","export { runAddStorybook } from './storybook/add.js';\r\nexport type { AddStorybookOptions } from './storybook/add.js';\r\n\r\nimport { installBrainPack, printBrainInstallSummary } from '../brain/install.js';\r\nimport { BRAIN_TIER_DISCLAIMER } from '../brain/constants.js';\r\n\r\nexport type AddBrainOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n};\r\n\r\nexport function runAddBrain(options: AddBrainOptions): void {\r\n try {\r\n const result = installBrainPack({\r\n cwd: options.cwd,\r\n repair: options.repair,\r\n force: options.force,\r\n pm: options.pm,\r\n });\r\n printBrainInstallSummary(result);\r\n\r\n if (result.agentsPatch.status === 'conflict') {\r\n process.exit(1);\r\n }\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n console.error(BRAIN_TIER_DISCLAIMER);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function runAddUnknown(target: string): never {\r\n console.error(`Unknown add target: ${target}`);\r\n console.error('Available: storybook, brain');\r\n process.exit(1);\r\n}\r\n","import { readFileSync, readdirSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { CheckResult } from '../types.js';\r\nimport { BRAIN_DOCTOR_DISCLAIMER } from '../brain/constants.js';\r\nimport {\r\n readBrainPackManifest,\r\n readInstalledPackManifest,\r\n resolveBrainPackRoot,\r\n} from '../brain/pack.js';\r\nimport { fileExists, getMinor, readTextFile } from '../utils/fs.js';\r\nimport { readInstalledVersion } from '../utils/package-json.js';\r\nimport { readManifest } from '../utils/manifest.js';\r\n\r\nfunction readCoverageManifest(cwd: string): {\r\n components?: Record<string, { coverage?: string }>;\r\n} | null {\r\n try {\r\n const raw = readFileSync(\r\n join(cwd, 'node_modules/@idia-ui/storybook-docs/fragments/coverage-manifest.json'),\r\n 'utf8',\r\n );\r\n return JSON.parse(raw) as { components?: Record<string, { coverage?: string }> };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction listStoryComponentIds(cwd: string): string[] {\r\n const storiesDir = join(cwd, 'src/stories');\r\n const ids = new Set<string>();\r\n\r\n try {\r\n for (const file of readdirSync(storiesDir)) {\r\n const match = file.match(/^([A-Za-z]+)\\.stories\\.(tsx?|jsx?)$/);\r\n if (match) {\r\n ids.add(match[1].toLowerCase());\r\n }\r\n }\r\n } catch {\r\n return [];\r\n }\r\n\r\n return [...ids].sort();\r\n}\r\n\r\nexport function runStorybookChecks(cwd: string): CheckResult[] {\r\n const hasPreview = fileExists(cwd, '.storybook/preview.tsx');\r\n const storybookDocs = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/storybook-docs/package.json',\r\n );\r\n\r\n if (!hasPreview && !storybookDocs) {\r\n return [\r\n {\r\n id: 'S1',\r\n status: 'info',\r\n message: 'Storybook not installed — skipping S* checks',\r\n },\r\n {\r\n id: 'S2',\r\n status: 'skip',\r\n message: '@idia-ui/storybook-docs not installed',\r\n },\r\n {\r\n id: 'S3',\r\n status: 'skip',\r\n message: 'storybook fragment manifest not available',\r\n },\r\n ];\r\n }\r\n\r\n const results: CheckResult[] = [];\r\n\r\n const preview = readTextFile(cwd, '.storybook/preview.tsx');\r\n const importsTamagui =\r\n preview !== null &&\r\n (/tamagui\\.config/.test(preview) || /AppProviders/.test(preview));\r\n\r\n if (importsTamagui) {\r\n results.push({\r\n id: 'S1',\r\n status: 'pass',\r\n message: '.storybook/preview.tsx wires AppProviders (shared token parity)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'S1',\r\n status: 'fail',\r\n message: '.storybook/preview.tsx missing AppProviders / tamagui.config wiring',\r\n fixHint: 'idia-ui add storybook --repair',\r\n });\r\n }\r\n\r\n const docsVersion = readInstalledVersion(cwd, '@idia-ui/storybook-docs');\r\n const coreVersion = readInstalledVersion(cwd, '@idia-ui/core');\r\n const docsMinor = docsVersion ? getMinor(docsVersion) : null;\r\n const coreMinor = coreVersion ? getMinor(coreVersion) : null;\r\n\r\n if (!storybookDocs) {\r\n results.push({\r\n id: 'S2',\r\n status: 'warn',\r\n message: '@idia-ui/storybook-docs not installed',\r\n fixHint: 'idia-ui add storybook',\r\n });\r\n } else if (docsMinor && coreMinor && docsMinor === coreMinor) {\r\n results.push({\r\n id: 'S2',\r\n status: 'pass',\r\n message: `@idia-ui/storybook-docs@${docsVersion} matches @idia-ui/core@${coreVersion} minor`,\r\n });\r\n } else {\r\n results.push({\r\n id: 'S2',\r\n status: 'warn',\r\n message: `storybook-docs minor (${docsMinor ?? 'unknown'}) ≠ core minor (${coreMinor ?? 'unknown'})`,\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n }\r\n\r\n const coverage = readCoverageManifest(cwd);\r\n const coveredIds = coverage?.components ? Object.keys(coverage.components) : [];\r\n const storyIds = listStoryComponentIds(cwd);\r\n const uncovered = storyIds.filter((id) => !coveredIds.includes(id));\r\n\r\n if (!coverage) {\r\n results.push({\r\n id: 'S3',\r\n status: 'warn',\r\n message: 'coverage manifest not readable',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n } else if (uncovered.length === 0) {\r\n results.push({\r\n id: 'S3',\r\n status: 'pass',\r\n message:\r\n coveredIds.length > 0\r\n ? `fragment manifest covers ${coveredIds.length} Wave 1 components; story files aligned`\r\n : 'fragment manifest present; no src/stories/ files to cross-ref',\r\n });\r\n if (coveredIds.length > 0 && coveredIds.length < 10) {\r\n results.push({\r\n id: 'S3-info',\r\n status: 'info',\r\n message: `storybook-docs pack has doc fragments for ${coveredIds.length} components. Other components render without brain prose.`,\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'S3',\r\n status: 'warn',\r\n message: `stories without fragments: ${uncovered.join(', ')}`,\r\n fixHint: 'upgrade @idia-ui/storybook-docs or remove uncovered stories',\r\n });\r\n }\r\n\r\n const manifest = readManifest(cwd);\r\n if (storybookDocs && !manifest?.features?.storybook) {\r\n results.push({\r\n id: 'S-manifest',\r\n status: 'warn',\r\n message: 'manifest features.storybook missing',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction readStorybookDocsSourceHash(cwd: string): string | null {\r\n return (\r\n readInstalledPackManifest(\r\n cwd,\r\n '@idia-ui/storybook-docs',\r\n 'fragments/coverage-manifest.json',\r\n )?.sourceHash ??\r\n readInstalledPackManifest(cwd, '@idia-ui/storybook-docs', 'coverage-manifest.json')\r\n ?.sourceHash ??\r\n readInstalledPackManifest(cwd, '@idia-ui/storybook-docs')?.sourceHash ??\r\n null\r\n );\r\n}\r\n\r\nfunction readPackSourceHash(cwd: string, packageName: string): string | null {\r\n if (packageName === '@idia-ui/storybook-docs') {\r\n return readStorybookDocsSourceHash(cwd);\r\n }\r\n return readInstalledPackManifest(cwd, packageName)?.sourceHash ?? null;\r\n}\r\n\r\nexport function runBrainChecks(cwd: string): CheckResult[] {\r\n const brainPackInstalled = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/brain-pack/package.json',\r\n );\r\n const brainAgents = fileExists(cwd, '.idia/brain/AGENTS.md');\r\n const rootAgents = readTextFile(cwd, 'AGENTS.md');\r\n const hasBrainBlock =\r\n rootAgents !== null &&\r\n /idia-ui brain:begin/.test(rootAgents) &&\r\n /idia-ui brain:end/.test(rootAgents);\r\n\r\n if (!brainPackInstalled && !brainAgents) {\r\n return [\r\n {\r\n id: 'B1',\r\n status: 'warn',\r\n message: 'brain pack not installed',\r\n fixHint: 'Run idia-ui add brain',\r\n },\r\n {\r\n id: 'B2',\r\n status: 'skip',\r\n message: 'AGENTS.md brain block not present',\r\n },\r\n {\r\n id: 'B3',\r\n status: 'skip',\r\n message: 'brain sourceHash coupling not checked',\r\n },\r\n {\r\n id: 'B4',\r\n status: 'skip',\r\n message: 'brain/storybook hash coupling not checked',\r\n },\r\n ];\r\n }\r\n\r\n const results: CheckResult[] = [];\r\n const manifest = readManifest(cwd);\r\n const manifestHash = manifest?.features?.brain?.sourceHash as string | undefined;\r\n const packRoot = resolveBrainPackRoot(cwd);\r\n const packManifest = packRoot ? readBrainPackManifest(packRoot) : null;\r\n const packHash = packManifest?.sourceHash;\r\n\r\n results.push({\r\n id: 'B1',\r\n status: brainAgents ? 'pass' : 'warn',\r\n message: brainAgents\r\n ? '✓ brain pack installed'\r\n : '.idia/brain/AGENTS.md missing',\r\n fixHint: brainAgents ? undefined : 'idia-ui add brain',\r\n });\r\n\r\n results.push({\r\n id: 'B2',\r\n status: hasBrainBlock ? 'pass' : 'warn',\r\n message: hasBrainBlock\r\n ? 'root AGENTS.md contains idia-ui brain block'\r\n : 'root AGENTS.md missing idia-ui brain:begin/end block',\r\n fixHint: hasBrainBlock ? undefined : 'idia-ui add brain --repair',\r\n });\r\n\r\n if (manifestHash && packHash && manifestHash === packHash) {\r\n results.push({\r\n id: 'B3',\r\n status: 'pass',\r\n message: 'manifest sourceHash matches installed brain pack',\r\n });\r\n } else if (manifestHash && packHash) {\r\n results.push({\r\n id: 'B3',\r\n status: 'warn',\r\n message: 'manifest sourceHash drifted from brain pack pin',\r\n fixHint: 'idia-ui sync brain',\r\n });\r\n } else {\r\n results.push({\r\n id: 'B3',\r\n status: 'warn',\r\n message: 'manifest sourceHash missing or brain pack not resolved',\r\n fixHint: 'idia-ui sync brain',\r\n });\r\n }\r\n\r\n const storybookHash = readStorybookDocsSourceHash(cwd);\r\n const storybookDocsInstalled = fileExists(\r\n cwd,\r\n 'node_modules/@idia-ui/storybook-docs/package.json',\r\n );\r\n if (!storybookDocsInstalled) {\r\n results.push({\r\n id: 'B4',\r\n status: 'skip',\r\n message: 'storybook-docs not installed — B4 hash coupling skipped',\r\n });\r\n } else if (!storybookHash) {\r\n results.push({\r\n id: 'B4',\r\n status: 'warn',\r\n message: 'storybook-docs installed but coverage-manifest sourceHash not readable',\r\n fixHint: 'idia-ui sync storybook',\r\n });\r\n } else if (packHash && storybookHash === packHash) {\r\n results.push({\r\n id: 'B4',\r\n status: 'pass',\r\n message: 'brain pack and storybook-docs share sourceHash (same generate run)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'B4',\r\n status: 'warn',\r\n message: 'brain pack and storybook-docs sourceHash skew',\r\n fixHint: 'idia-ui sync all',\r\n });\r\n }\r\n\r\n results.push({\r\n id: 'B-tier',\r\n status: 'info',\r\n message: `⚠ ${BRAIN_DOCTOR_DISCLAIMER}`,\r\n });\r\n\r\n return results;\r\n}\r\n\r\nexport function runCustomCheck(cwd: string): CheckResult[] {\r\n const hasStories = fileExists(cwd, 'src/stories');\r\n if (!hasStories) {\r\n return [\r\n {\r\n id: 'C1',\r\n status: 'skip',\r\n message: 'no src/stories/ directory (Storybook not configured)',\r\n },\r\n ];\r\n }\r\n\r\n return [\r\n {\r\n id: 'C1',\r\n status: 'info',\r\n message: 'wrapper/story coverage check not implemented (stub)',\r\n fixHint: 'Add stories for components in src/components/',\r\n },\r\n ];\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport {\r\n manifestExists,\r\n readManifest,\r\n regenerateManifest,\r\n validateManifestShape,\r\n} from '../utils/manifest.js';\r\nimport { readInstalledVersion, readPackageJson } from '../utils/package-json.js';\r\n\r\nexport function runManifestCheck(\r\n cwd: string,\r\n fix: boolean,\r\n): { results: CheckResult[]; fixed: boolean } {\r\n const results: CheckResult[] = [];\r\n let fixed = false;\r\n\r\n if (!manifestExists(cwd)) {\r\n if (fix) {\r\n const pkg = readPackageJson(cwd);\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n pkg?.dependencies?.['@idia-ui/core']?.replace(/^[\\^~]/, '') ??\r\n '0.2.0';\r\n regenerateManifest(cwd, coreVersion);\r\n fixed = true;\r\n results.push({\r\n id: 'M1',\r\n status: 'pass',\r\n message: '.idia/manifest.json regenerated',\r\n fixHint: 'Created manifest with idiaCli + core versions',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n results.push({\r\n id: 'M1',\r\n status: 'warn',\r\n message: '.idia/manifest.json missing',\r\n fixHint: 'Run idia-ui doctor --fix or idia-ui sync all after first add-on',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n const manifest = readManifest(cwd);\r\n if (!manifest || !validateManifestShape(manifest)) {\r\n results.push({\r\n id: 'M1',\r\n status: 'fail',\r\n message: '.idia/manifest.json invalid or unparseable',\r\n fixHint: 'Run idia-ui doctor --fix to regenerate',\r\n });\r\n return { results, fixed };\r\n }\r\n\r\n results.push({\r\n id: 'M1',\r\n status: 'pass',\r\n message: `.idia/manifest.json valid (core ${manifest.core}, cli ${manifest.idiaCli})`,\r\n });\r\n\r\n return { results, fixed };\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport { grepSrcForPattern, readTextFile } from '../utils/fs.js';\r\n\r\nexport function runNavigationChecks(cwd: string): CheckResult[] {\r\n const results: CheckResult[] = [];\r\n const providers =\r\n readTextFile(cwd, 'src/providers/AppProviders.tsx') ??\r\n readTextFile(cwd, 'src/providers/AppProviders.ts');\r\n\r\n // N1\r\n if (providers && /NavigationContainer/.test(providers)) {\r\n results.push({\r\n id: 'N1',\r\n status: 'pass',\r\n message: 'NavigationContainer in provider tree',\r\n });\r\n } else {\r\n results.push({\r\n id: 'N1',\r\n status: 'fail',\r\n message: 'NavigationContainer not found in AppProviders',\r\n fixHint: 'Wrap navigation in NavigationContainer per templates/consumer-app',\r\n });\r\n }\r\n\r\n // N2 — NavigationProvider if idia Link/navigate used\r\n const usesIdiaNav =\r\n grepSrcForPattern(cwd, /\\bLink\\b.*@idia-ui\\/core/) ||\r\n grepSrcForPattern(cwd, /NavigationProvider/) ||\r\n grepSrcForPattern(cwd, /useIdiaNavigation|navigateTo/);\r\n\r\n if (usesIdiaNav) {\r\n const hasNavProvider = providers\r\n ? /NavigationProvider/.test(providers)\r\n : grepSrcForPattern(cwd, /NavigationProvider/);\r\n if (!hasNavProvider) {\r\n results.push({\r\n id: 'N2',\r\n status: 'warn',\r\n message: 'idia Link/navigation helpers used but NavigationProvider missing',\r\n fixHint: 'Wrap navigation ref with NavigationProvider from @idia-ui/core',\r\n });\r\n } else {\r\n results.push({\r\n id: 'N2',\r\n status: 'pass',\r\n message: 'NavigationProvider present',\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'N2',\r\n status: 'pass',\r\n message: 'idia Link/navigation helpers not used (NavigationProvider optional)',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport {\r\n getDepVersion,\r\n readInstalledVersion,\r\n readPeerRange,\r\n readPackageJson,\r\n} from '../utils/package-json.js';\r\nimport { satisfiesRange } from '../utils/fs.js';\r\nimport { detectPackageManager, pmAddCommand } from '../utils/pm.js';\r\n\r\nconst P2_PACKAGES = [\r\n 'react-native-reanimated',\r\n 'react-native-gesture-handler',\r\n 'react-native-screens',\r\n 'react-native-safe-area-context',\r\n] as const;\r\n\r\nconst BARREL_REQUIRED_PEERS = ['zustand', '@tanstack/react-table'] as const;\r\n\r\nconst BARREL_OPTIONAL_PEERS = [\r\n 'react-image-crop',\r\n '@fullcalendar/core',\r\n '@fullcalendar/daygrid',\r\n '@fullcalendar/timegrid',\r\n '@fullcalendar/interaction',\r\n '@fullcalendar/multimonth',\r\n '@fullcalendar/list',\r\n '@fullcalendar/react',\r\n] as const;\r\n\r\nexport function runPeerChecks(cwd: string): CheckResult[] {\r\n const pkg = readPackageJson(cwd);\r\n if (!pkg) {\r\n return [\r\n {\r\n id: 'P0',\r\n status: 'fail',\r\n message: 'package.json not found or unreadable',\r\n fixHint: 'Run idia-ui doctor from your app root',\r\n },\r\n ];\r\n }\r\n\r\n const pm = detectPackageManager(cwd);\r\n const results: CheckResult[] = [];\r\n\r\n // P1 — tamagui peer range\r\n const tamaguiVersion =\r\n readInstalledVersion(cwd, 'tamagui') ??\r\n getDepVersion(pkg, 'tamagui')?.replace(/^[\\^~]/, '') ??\r\n null;\r\n const coreRange =\r\n readPeerRange(cwd, '@idia-ui/core', 'tamagui') ??\r\n readPeerRange(cwd, '@idia-ui/theme', 'tamagui') ??\r\n '^1.70.0';\r\n\r\n if (!tamaguiVersion) {\r\n results.push({\r\n id: 'P1',\r\n status: 'fail',\r\n message: 'tamagui not installed',\r\n fixHint: pmAddCommand(pm, ['tamagui@^1.144.0']),\r\n });\r\n } else if (!satisfiesRange(tamaguiVersion, coreRange)) {\r\n results.push({\r\n id: 'P1',\r\n status: 'fail',\r\n message: `tamagui ${tamaguiVersion} outside peer range ${coreRange}`,\r\n fixHint: pmAddCommand(pm, [`tamagui@${coreRange}`]),\r\n });\r\n } else {\r\n results.push({\r\n id: 'P1',\r\n status: 'pass',\r\n message: `tamagui ${tamaguiVersion} in peer range`,\r\n });\r\n }\r\n\r\n // P2 — navigation/gesture peers\r\n const missingP2 = P2_PACKAGES.filter((name) => {\r\n const installed = readInstalledVersion(cwd, name);\r\n const declared = getDepVersion(pkg, name);\r\n return !installed && !declared;\r\n });\r\n\r\n if (missingP2.length > 0) {\r\n results.push({\r\n id: 'P2',\r\n status: 'fail',\r\n message: `missing navigation/gesture peers: ${missingP2.join(', ')}`,\r\n fixHint: pmAddCommand(pm, [...missingP2]),\r\n });\r\n } else {\r\n results.push({\r\n id: 'P2',\r\n status: 'pass',\r\n message:\r\n 'gesture-handler, reanimated, screens, safe-area-context present',\r\n });\r\n }\r\n\r\n // P3 — @idia-ui/* alignment + barrel peers\r\n const idiaPkgs = Object.keys({\r\n ...pkg.dependencies,\r\n ...pkg.devDependencies,\r\n }).filter((n) => n.startsWith('@idia-ui/'));\r\n\r\n const idiaVersions = idiaPkgs\r\n .map((name) => {\r\n const v =\r\n readInstalledVersion(cwd, name) ??\r\n getDepVersion(pkg, name)?.replace(/^[\\^~]/, '');\r\n return v ? { name, version: v } : null;\r\n })\r\n .filter((x): x is { name: string; version: string } => x !== null);\r\n\r\n const minors = new Set(\r\n idiaVersions\r\n .map((p) => {\r\n const parts = p.version.split('.');\r\n return parts.length >= 2 ? `${parts[0]}.${parts[1]}` : null;\r\n })\r\n .filter((m): m is string => m !== null && !m.includes('workspace')),\r\n );\r\n\r\n if (idiaVersions.length === 0) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: 'no @idia-ui/* packages in dependencies',\r\n fixHint: pmAddCommand(pm, ['@idia-ui/core@latest', '@idia-ui/theme@latest']),\r\n });\r\n } else if (minors.size > 1) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: `@idia-ui/* minor versions misaligned: ${[...minors].join(', ')}`,\r\n fixHint: `${pm === 'pnpm' ? 'pnpm' : pm} update @idia-ui/*`,\r\n });\r\n } else {\r\n results.push({\r\n id: 'P3',\r\n status: 'pass',\r\n message: `@idia-ui/* versions aligned (${idiaVersions.map((p) => `${p.name}@${p.version}`).join(', ')})`,\r\n });\r\n }\r\n\r\n for (const peer of BARREL_REQUIRED_PEERS) {\r\n const installed = readInstalledVersion(cwd, peer);\r\n const declared = getDepVersion(pkg, peer);\r\n if (!installed && !declared) {\r\n results.push({\r\n id: 'P3',\r\n status: 'fail',\r\n message: `barrel peer ${peer} not installed (required for @idia-ui/core Table graph)`,\r\n fixHint: `${pmAddCommand(pm, [peer])} — see docs/generated/peer-dep-matrix.md`,\r\n });\r\n }\r\n }\r\n\r\n for (const peer of BARREL_OPTIONAL_PEERS) {\r\n const installed = readInstalledVersion(cwd, peer);\r\n const declared = getDepVersion(pkg, peer);\r\n if (!installed && !declared) {\r\n results.push({\r\n id: 'P3',\r\n status: 'warn',\r\n message: `optional peer ${peer} not installed (barrel may require it)`,\r\n fixHint: `Install per peer-dep-matrix.md: ${pmAddCommand(pm, [peer])}`,\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n","import type { CheckResult } from '../types.js';\r\nimport { fileExists, grepSrcForPattern, readTextFile } from '../utils/fs.js';\r\n\r\nconst OVERLAY_IMPORT =\r\n /from\\s+['\"]@idia-ui\\/core['\"][\\s\\S]*?(Modal|Toast|Dialog|ConfirmationModal)/;\r\n\r\nexport function runRuntimeChecks(cwd: string): CheckResult[] {\r\n const results: CheckResult[] = [];\r\n\r\n // R1\r\n if (fileExists(cwd, 'tamagui.config.ts')) {\r\n results.push({\r\n id: 'R1',\r\n status: 'pass',\r\n message: 'tamagui.config.ts found',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R1',\r\n status: 'fail',\r\n message: 'tamagui.config.ts missing at app root',\r\n fixHint: 'Restore from templates/consumer-app or re-scaffold',\r\n });\r\n }\r\n\r\n // R2\r\n const providers =\r\n readTextFile(cwd, 'src/providers/AppProviders.tsx') ??\r\n readTextFile(cwd, 'src/providers/AppProviders.ts');\r\n\r\n if (!providers) {\r\n results.push({\r\n id: 'R2',\r\n status: 'fail',\r\n message: 'AppProviders not found',\r\n fixHint: 'Add src/providers/AppProviders.tsx per templates/consumer-app',\r\n });\r\n } else {\r\n const hasTamagui = /TamaguiProvider/.test(providers);\r\n const hasTheme = /ThemeProvider/.test(providers) && /@idia-ui\\/theme/.test(providers);\r\n if (hasTamagui && hasTheme) {\r\n results.push({\r\n id: 'R2',\r\n status: 'pass',\r\n message: 'AppProviders: TamaguiProvider + ThemeProvider',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R2',\r\n status: 'fail',\r\n message: 'AppProviders missing TamaguiProvider and/or ThemeProvider (@idia-ui/theme)',\r\n fixHint: 'Compare src/providers/AppProviders.tsx with templates/consumer-app',\r\n });\r\n }\r\n }\r\n\r\n // R3 — overlay providers\r\n const usesOverlays =\r\n grepSrcForPattern(cwd, OVERLAY_IMPORT) ||\r\n grepSrcForPattern(cwd, /\\b(Modal|Toast|Dialog)\\b.*@idia-ui\\/core/);\r\n\r\n if (usesOverlays) {\r\n const hasModal = providers ? /ModalProvider/.test(providers) : false;\r\n const hasToast = providers ? /ToastProvider/.test(providers) : false;\r\n if (!hasModal || !hasToast) {\r\n results.push({\r\n id: 'R3',\r\n status: 'warn',\r\n message: 'overlay components imported but ModalProvider/ToastProvider missing',\r\n fixHint: 'Add ModalProvider and ToastProvider to AppProviders per template',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R3',\r\n status: 'pass',\r\n message: 'overlay providers present',\r\n });\r\n }\r\n } else {\r\n results.push({\r\n id: 'R3',\r\n status: 'pass',\r\n message: 'no overlay imports detected (Modal/Toast providers optional)',\r\n });\r\n }\r\n\r\n // R4 — font gate\r\n const fontGate =\r\n (providers && /waitForWebFonts/.test(providers)) ||\r\n grepSrcForPattern(cwd, /expo-font/) ||\r\n grepSrcForPattern(cwd, /useFonts/);\r\n\r\n if (fontGate) {\r\n results.push({\r\n id: 'R4',\r\n status: 'pass',\r\n message: 'web font gate configured (waitForWebFonts or expo-font)',\r\n });\r\n } else {\r\n results.push({\r\n id: 'R4',\r\n status: 'warn',\r\n message: 'no waitForWebFonts or expo-font pattern detected',\r\n fixHint: 'Copy font loading pattern from templates/consumer-app AppProviders',\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n","import { runBrainChecks, runCustomCheck, runStorybookChecks } from './packs.js';\r\nimport { runManifestCheck } from './manifest.js';\r\nimport { runNavigationChecks } from './navigation.js';\r\nimport { runPeerChecks } from './peers.js';\r\nimport { runRuntimeChecks } from './runtime.js';\r\nimport type { CheckResult, DoctorOptions } from '../types.js';\r\n\r\nexport function runAllChecks(options: DoctorOptions): CheckResult[] {\r\n const { cwd, full, fix } = options;\r\n const checks: CheckResult[] = [];\r\n\r\n checks.push(...runPeerChecks(cwd));\r\n checks.push(...runRuntimeChecks(cwd));\r\n checks.push(...runNavigationChecks(cwd));\r\n\r\n const { results: manifestResults } = runManifestCheck(cwd, fix);\r\n checks.push(...manifestResults);\r\n\r\n if (full) {\r\n checks.push(...runStorybookChecks(cwd));\r\n checks.push(...runBrainChecks(cwd));\r\n checks.push(...runCustomCheck(cwd));\r\n }\r\n\r\n return checks;\r\n}\r\n\r\nexport function summarizeChecks(\r\n checks: CheckResult[],\r\n strict: boolean,\r\n): { passed: number; warnings: number; failures: number; skipped: number; exitCode: number } {\r\n let passed = 0;\r\n let warnings = 0;\r\n let failures = 0;\r\n let skipped = 0;\r\n\r\n for (const check of checks) {\r\n switch (check.status) {\r\n case 'pass':\r\n passed++;\r\n break;\r\n case 'warn':\r\n warnings++;\r\n break;\r\n case 'fail':\r\n failures++;\r\n break;\r\n case 'skip':\r\n case 'info':\r\n skipped++;\r\n break;\r\n }\r\n }\r\n\r\n let exitCode = 0;\r\n if (failures > 0) exitCode = 1;\r\n else if (strict && warnings > 0) exitCode = 1;\r\n\r\n return { passed, warnings, failures, skipped, exitCode };\r\n}\r\n","import { runAllChecks, summarizeChecks } from '../checks/index.js';\r\nimport type { DoctorOptions, DoctorReport } from '../types.js';\r\n\r\nconst STATUS_ICON: Record<string, string> = {\r\n pass: '✓',\r\n warn: '⚠',\r\n fail: '✗',\r\n info: 'ℹ',\r\n skip: '○',\r\n};\r\n\r\nexport function runDoctor(options: DoctorOptions): DoctorReport {\r\n const checks = runAllChecks(options);\r\n const summary = summarizeChecks(checks, options.strict);\r\n\r\n return {\r\n checks,\r\n summary: {\r\n passed: summary.passed,\r\n warnings: summary.warnings,\r\n failures: summary.failures,\r\n skipped: summary.skipped,\r\n },\r\n exitCode: summary.exitCode,\r\n };\r\n}\r\n\r\nexport function formatHumanReport(report: DoctorReport, full: boolean): string {\r\n const lines: string[] = ['idia-ui doctor', ''];\r\n\r\n for (const check of report.checks) {\r\n const icon = STATUS_ICON[check.status] ?? '·';\r\n lines.push(`${icon} ${check.id} ${check.message}`);\r\n if (check.fixHint && (check.status === 'fail' || check.status === 'warn')) {\r\n lines.push(` → ${check.fixHint}`);\r\n }\r\n }\r\n\r\n lines.push('');\r\n const { passed, warnings, failures } = report.summary;\r\n const mode = full ? 'full' : 'quick';\r\n lines.push(\r\n `${passed} passed, ${warnings} warnings, ${failures} failures (${mode} scan) — exit ${report.exitCode}`,\r\n );\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nexport function formatJsonReport(report: DoctorReport): string {\r\n return JSON.stringify(\r\n {\r\n checks: report.checks.map((c) => ({\r\n id: c.id,\r\n status: c.status,\r\n message: c.message,\r\n ...(c.fixHint ? { fixHint: c.fixHint } : {}),\r\n })),\r\n summary: report.summary,\r\n exitCode: report.exitCode,\r\n },\r\n null,\r\n 2,\r\n );\r\n}\r\n","import { spawnSync } from 'node:child_process'\r\n\r\nimport {\r\n STORYBOOK_CLI_VERSION,\r\n STORYBOOK_DOCS_VERSION,\r\n STORYBOOK_PRESET_VERSION,\r\n} from './constants.js'\r\nimport type { PackageManager } from '../../utils/pm.js'\r\nimport { detectPackageManager } from '../../utils/pm.js'\r\nimport { readInstalledVersion, readPackageJson } from '../../utils/package-json.js'\r\nimport { fileExists } from '../../utils/fs.js'\r\nimport { CLI_VERSION, readManifest, writeManifest } from '../../utils/manifest.js'\r\n\r\nexport type SyncStorybookOptions = {\r\n cwd: string\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n}\r\n\r\nexport type SyncStorybookResult = {\r\n synced: boolean\r\n message: string\r\n}\r\n\r\nfunction isStorybookInstalled(cwd: string): boolean {\r\n return fileExists(cwd, '.storybook/main.ts')\r\n}\r\n\r\nfunction runPmUpdate(cwd: string, pm: PackageManager): void {\r\n const packages = [\r\n `@idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`,\r\n `@idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`,\r\n ]\r\n\r\n const args =\r\n pm === 'pnpm'\r\n ? ['add', '-D', ...packages]\r\n : pm === 'yarn'\r\n ? ['add', '-D', ...packages]\r\n : ['install', '-D', ...packages]\r\n\r\n const result = spawnSync(pm, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: process.platform === 'win32',\r\n })\r\n if (result.status !== 0) {\r\n throw new Error(`${pm} update failed with exit code ${result.status ?? 'unknown'}`)\r\n }\r\n}\r\n\r\nexport function runSyncStorybook(options: SyncStorybookOptions): SyncStorybookResult {\r\n const { cwd, skipInstall = false } = options\r\n const pm = options.pm ?? detectPackageManager(cwd)\r\n\r\n if (!isStorybookInstalled(cwd)) {\r\n console.error('Storybook not installed — run idia-ui add storybook first')\r\n process.exit(1)\r\n }\r\n\r\n const manifest = readManifest(cwd)\r\n if (!manifest) {\r\n console.error('.idia/manifest.json missing — run idia-ui doctor --fix')\r\n process.exit(1)\r\n }\r\n\r\n const corePkg = readPackageJson(cwd)\r\n const coreVersion =\r\n readInstalledVersion(cwd, '@idia-ui/core') ??\r\n corePkg?.dependencies?.['@idia-ui/core']?.replace(/^[\\^~]/, '') ??\r\n manifest.core\r\n\r\n if (!skipInstall) {\r\n console.log(`Syncing storybook packs via ${pm}…`)\r\n runPmUpdate(cwd, pm)\r\n }\r\n\r\n manifest.idiaCli = CLI_VERSION\r\n manifest.core = coreVersion\r\n manifest.features ??= {}\r\n manifest.features.storybook = {\r\n installed: (manifest.features.storybook as { installed?: string } | undefined)?.installed ??\r\n new Date().toISOString(),\r\n storybookDocs: STORYBOOK_DOCS_VERSION,\r\n storybook: STORYBOOK_CLI_VERSION,\r\n preset: STORYBOOK_PRESET_VERSION,\r\n }\r\n writeManifest(cwd, manifest)\r\n\r\n console.log(`✓ Synced @idia-ui/storybook-docs@${STORYBOOK_DOCS_VERSION}`)\r\n console.log(`✓ Synced @idia-ui/storybook-preset-react-native-web@${STORYBOOK_PRESET_VERSION}`)\r\n\r\n return {\r\n synced: true,\r\n message: `storybook-docs@${STORYBOOK_DOCS_VERSION} aligned with core@${coreVersion}`,\r\n }\r\n}\r\n\r\n","import { installBrainPack, printBrainInstallSummary } from '../brain/install.js';\r\nimport { BRAIN_DOCTOR_DISCLAIMER, BRAIN_TIER_DISCLAIMER } from '../brain/constants.js';\r\nimport { runSyncStorybook as syncStorybookPack } from './storybook/sync.js';\r\nimport { fileExists } from '../utils/fs.js';\r\nimport { readManifest } from '../utils/manifest.js';\r\n\r\nexport type SyncOptions = {\r\n cwd: string;\r\n repair?: boolean;\r\n force?: boolean;\r\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n};\r\n\r\nexport function runSyncBrain(options: SyncOptions): void {\r\n try {\r\n const result = installBrainPack({\r\n cwd: options.cwd,\r\n repair: true,\r\n force: options.force,\r\n pm: options.pm,\r\n });\r\n console.log('✓ brain pack synced');\r\n printBrainInstallSummary(result);\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n console.error(BRAIN_TIER_DISCLAIMER);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport function runSyncStorybook(options: SyncOptions): void {\r\n syncStorybookPack({\r\n cwd: options.cwd,\r\n pm: options.pm,\r\n });\r\n}\r\n\r\nexport function runSyncAll(options: SyncOptions): void {\r\n const { cwd } = options;\r\n const manifest = readManifest(cwd);\r\n const hasStorybook =\r\n fileExists(cwd, '.storybook/main.ts') || Boolean(manifest?.features?.storybook);\r\n const hasBrain = Boolean(manifest?.features?.brain?.brainPack);\r\n\r\n if (!hasStorybook && !hasBrain) {\r\n console.error('No storybook or brain features installed — run idia-ui add storybook or add brain first');\r\n process.exit(1);\r\n }\r\n\r\n if (hasStorybook) {\r\n syncStorybookPack({ cwd, pm: options.pm });\r\n } else {\r\n console.log('○ storybook not installed — skipping storybook sync');\r\n }\r\n\r\n if (hasBrain) {\r\n runSyncBrain(options);\r\n } else {\r\n console.log('○ brain not installed — skipping brain sync');\r\n console.error(BRAIN_DOCTOR_DISCLAIMER);\r\n }\r\n\r\n console.log('');\r\n console.log('✓ sync all complete');\r\n}\r\n\r\nexport function runSync(target: string, options: SyncOptions): void {\r\n switch (target) {\r\n case 'brain':\r\n runSyncBrain(options);\r\n break;\r\n case 'storybook':\r\n runSyncStorybook(options);\r\n break;\r\n case 'all':\r\n runSyncAll(options);\r\n break;\r\n default:\r\n console.error(`Unknown sync target: ${target}`);\r\n console.error('Available: storybook | brain | all');\r\n process.exit(1);\r\n }\r\n}\r\n"],"mappings":"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","names":["import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","semver","import_node_fs","import_node_path","at","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","require","import_node_child_process","runPmInstall","runPmInstall","packRoot","packManifest","import_node_fs","import_node_path","import_node_child_process","isStorybookInstalled","runSyncStorybook"]}
|