create-idia-app 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.
Files changed (70) hide show
  1. package/dist/index.js +2 -2
  2. package/dist/index.js.map +1 -1
  3. package/package.json +1 -1
  4. package/template/package.json +1 -11
  5. package/template/.cursor/rules/idia-ui-ds-brain.mdc +0 -32
  6. package/template/.cursor/rules/idia-ui-forms.mdc +0 -34
  7. package/template/.cursor/rules/idia-ui-overlays.mdc +0 -23
  8. package/template/.idia/brain/AGENTS.md +0 -37
  9. package/template/.idia/brain/ai/agents/retrieval-cheatsheet.md +0 -209
  10. package/template/.idia/brain/ai/skills/components/button/SKILL.md +0 -32
  11. package/template/.idia/brain/ai/skills/ds-brain-action-hierarchy/SKILL.md +0 -46
  12. package/template/.idia/brain/ai/skills/ds-brain-forms/SKILL.md +0 -67
  13. package/template/.idia/brain/ai/skills/ds-brain-index/SKILL.md +0 -76
  14. package/template/.idia/brain/ai/skills/ds-brain-overlays/SKILL.md +0 -30
  15. package/template/.idia/brain/ai/skills/ds-brain-retrieval/SKILL.md +0 -54
  16. package/template/.idia/brain/registry/ai-index.generated.json +0 -833
  17. package/template/.idia/brain/registry/component-registry.generated.json +0 -2947
  18. package/template/.idia/manifest.json +0 -17
  19. package/template/.storybook/main.ts +0 -9
  20. package/template/.storybook/preview.tsx +0 -20
  21. package/template/AGENTS.md +0 -11
  22. package/template/src/stories/Button.stories.tsx +0 -31
  23. package/template/storybook-static/assets/Button.stories-CfapbH7U.js +0 -196
  24. package/template/storybook-static/assets/Color-F6OSRLHC-CFwL-RM_.js +0 -1
  25. package/template/storybook-static/assets/DocsRenderer-CFRXHY34-AADCayzw.js +0 -729
  26. package/template/storybook-static/assets/_commonjsHelpers-Cpj98o6Y.js +0 -1
  27. package/template/storybook-static/assets/axe-d-K7rF9D.js +0 -30
  28. package/template/storybook-static/assets/chunk-XP5HYGXS-BHXC9YeQ.js +0 -1
  29. package/template/storybook-static/assets/client-DGEjZp2f.js +0 -25
  30. package/template/storybook-static/assets/entry-preview-Dc5wkB2s.js +0 -2
  31. package/template/storybook-static/assets/entry-preview-docs-BaxqCxyK.js +0 -46
  32. package/template/storybook-static/assets/iframe-Bl15XKnQ.js +0 -211
  33. package/template/storybook-static/assets/index-Bhelpi4i.js +0 -11
  34. package/template/storybook-static/assets/index-C_pJYAGD.js +0 -1
  35. package/template/storybook-static/assets/index-D5Inswos.js +0 -1
  36. package/template/storybook-static/assets/index-NGyRR_en.js +0 -9
  37. package/template/storybook-static/assets/index-zmTGQa7e.js +0 -9
  38. package/template/storybook-static/assets/jsx-runtime-BjG_zV1W.js +0 -9
  39. package/template/storybook-static/assets/preview-BNUqaTig.js +0 -1
  40. package/template/storybook-static/assets/preview-Cfo7ZnTc.js +0 -2
  41. package/template/storybook-static/assets/preview-CrKLV1aL.css +0 -1
  42. package/template/storybook-static/assets/preview-DkVJIpDn.js +0 -2
  43. package/template/storybook-static/assets/preview-DrRsTNnS.js +0 -17
  44. package/template/storybook-static/assets/react-18-Bfhi6ooJ.js +0 -1
  45. package/template/storybook-static/assets/react-FmFgRqLi.js +0 -1
  46. package/template/storybook-static/assets/react-native-gesture-handler-BzS7UzhZ.js +0 -52
  47. package/template/storybook-static/assets/test-utils-X4YdDMST.js +0 -9
  48. package/template/storybook-static/favicon.svg +0 -1
  49. package/template/storybook-static/fonts/Inter.ttf +0 -0
  50. package/template/storybook-static/fonts/NunitoSans.woff2 +0 -0
  51. package/template/storybook-static/iframe.html +0 -668
  52. package/template/storybook-static/index.html +0 -145
  53. package/template/storybook-static/index.json +0 -1
  54. package/template/storybook-static/nunito-sans-bold-italic.woff2 +0 -0
  55. package/template/storybook-static/nunito-sans-bold.woff2 +0 -0
  56. package/template/storybook-static/nunito-sans-italic.woff2 +0 -0
  57. package/template/storybook-static/nunito-sans-regular.woff2 +0 -0
  58. package/template/storybook-static/project.json +0 -1
  59. package/template/storybook-static/sb-addons/a11y-2/manager-bundle.js +0 -3
  60. package/template/storybook-static/sb-addons/links-1/manager-bundle.js +0 -3
  61. package/template/storybook-static/sb-addons/storybook-core-core-server-presets-0/common-manager-bundle.js +0 -3
  62. package/template/storybook-static/sb-common-assets/favicon.svg +0 -1
  63. package/template/storybook-static/sb-common-assets/nunito-sans-bold-italic.woff2 +0 -0
  64. package/template/storybook-static/sb-common-assets/nunito-sans-bold.woff2 +0 -0
  65. package/template/storybook-static/sb-common-assets/nunito-sans-italic.woff2 +0 -0
  66. package/template/storybook-static/sb-common-assets/nunito-sans-regular.woff2 +0 -0
  67. package/template/storybook-static/sb-manager/globals-module-info.js +0 -1052
  68. package/template/storybook-static/sb-manager/globals-runtime.js +0 -41775
  69. package/template/storybook-static/sb-manager/globals.js +0 -48
  70. package/template/storybook-static/sb-manager/runtime.js +0 -12048
package/dist/index.js CHANGED
@@ -12,8 +12,8 @@ var import_node_path = require("path");
12
12
 
13
13
  // src/constants.ts
14
14
  var IDIA_UI_VERSION = "0.2.0";
15
- var CREATE_APP_VERSION = "0.2.0";
16
- var CLI_VERSION = "0.2.0";
15
+ var CREATE_APP_VERSION = "0.2.1";
16
+ var CLI_VERSION = "0.2.1";
17
17
  var TEMPLATE_SLUG = "my-idia-app";
18
18
 
19
19
  // src/replace.ts
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/scaffold.ts","../src/replace.ts","../src/constants.ts","../src/pm.ts","../src/doctor.ts","../src/paths.ts","../src/index.ts"],"sourcesContent":["import { cpSync, existsSync, mkdirSync, rmSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\nimport { spawnSync } from 'node:child_process'\r\n\r\nimport { replacePlaceholders, validateProjectName, writeManifest } from './replace.js'\r\nimport {\r\n detectPackageManager,\r\n devCommand,\r\n installCommand,\r\n type PackageManager,\r\n} from './pm.js'\r\nimport { resolveDoctorInvocation, resolveIdiaUiInvocation } from './doctor.js'\r\nimport { templateDir } from './paths.js'\r\n\r\nexport type ScaffoldOptions = {\r\n projectName: string\r\n targetDir: string\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n force?: boolean\r\n noGit?: boolean\r\n withStorybook?: boolean\r\n withBrain?: boolean\r\n}\r\n\r\nexport type ScaffoldResult = {\r\n projectDir: string\r\n projectName: string\r\n pm: PackageManager\r\n installed: boolean\r\n doctorRan: boolean\r\n doctorExitCode: number | null\r\n doctorVia: 'monorepo' | 'installed' | 'skipped'\r\n}\r\n\r\nfunction resolveTemplateDir(): string {\r\n const bundled = templateDir()\r\n if (existsSync(bundled)) return bundled\r\n throw new Error(\r\n 'Template directory missing. Run `pnpm run build` in packages/create-idia-app first.',\r\n )\r\n}\r\n\r\nfunction runCommand(\r\n command: string,\r\n args: string[],\r\n cwd: string,\r\n): { status: number | null; error?: Error } {\r\n const result = spawnSync(command, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: process.platform === 'win32',\r\n })\r\n if (result.error) {\r\n return { status: result.status, error: result.error }\r\n }\r\n return { status: result.status }\r\n}\r\n\r\nexport function scaffold(options: ScaffoldOptions): ScaffoldResult {\r\n const projectName = validateProjectName(options.projectName)\r\n const projectDir = options.targetDir\r\n ? join(options.targetDir, projectName)\r\n : join(process.cwd(), projectName)\r\n const pm = detectPackageManager(options.pm)\r\n\r\n if (existsSync(projectDir)) {\r\n if (!options.force) {\r\n throw new Error(\r\n `Directory \"${projectDir}\" already exists. Pass --force to overwrite or choose another name.`,\r\n )\r\n }\r\n rmSync(projectDir, { recursive: true, force: true })\r\n }\r\n\r\n mkdirSync(projectDir, { recursive: true })\r\n cpSync(resolveTemplateDir(), projectDir, { recursive: true })\r\n\r\n replacePlaceholders(projectDir, projectName)\r\n writeManifest(projectDir)\r\n\r\n if (!options.noGit) {\r\n const git = runCommand('git', ['init'], projectDir)\r\n if (git.error) {\r\n console.warn('⚠ git init skipped:', git.error.message)\r\n }\r\n }\r\n\r\n let installed = false\r\n let doctorRan = false\r\n let doctorExitCode: number | null = null\r\n let doctorVia: ScaffoldResult['doctorVia'] = 'skipped'\r\n\r\n if (!options.skipInstall) {\r\n console.log(`\\nInstalling dependencies with ${pm}…`)\r\n const install = installCommand(pm)\r\n const installResult = runCommand(install.command, install.args, projectDir)\r\n if (installResult.error) {\r\n throw installResult.error\r\n }\r\n if (installResult.status !== 0) {\r\n throw new Error(`${pm} install failed with exit code ${installResult.status ?? 1}`)\r\n }\r\n installed = true\r\n\r\n console.log('\\nRunning idia-ui doctor (non-strict)…')\r\n const doctor = resolveDoctorInvocation(pm)\r\n doctorVia = doctor.via\r\n const doctorResult = runCommand(doctor.command, doctor.args, projectDir)\r\n doctorRan = true\r\n doctorExitCode = doctorResult.status\r\n if (doctorResult.error) {\r\n console.warn('⚠ idia-ui doctor could not run:', doctorResult.error.message)\r\n doctorRan = false\r\n doctorExitCode = null\r\n } else if (doctorExitCode !== 0) {\r\n console.warn(\r\n `⚠ idia-ui doctor exited with code ${doctorExitCode}. Review warnings above; re-run after fixing peers.`,\r\n )\r\n }\r\n\r\n runPostScaffoldAddons(projectDir, pm, options)\r\n } else {\r\n console.log('\\n--skip-install: skipping dependency install and idia-ui doctor.')\r\n if (options.withStorybook || options.withBrain) {\r\n console.warn(\r\n '⚠ --with-storybook / --with-brain require install. After `pnpm install`, run idia-ui add storybook and/or idia-ui add brain.',\r\n )\r\n }\r\n }\r\n\r\n printNextSteps(projectName, projectDir, pm, options)\r\n\r\n return {\r\n projectDir,\r\n projectName,\r\n pm,\r\n installed,\r\n doctorRan,\r\n doctorExitCode,\r\n doctorVia,\r\n }\r\n}\r\n\r\nfunction runPostScaffoldAddons(\r\n projectDir: string,\r\n pm: PackageManager,\r\n options: Pick<ScaffoldOptions, 'withStorybook' | 'withBrain'>,\r\n): void {\r\n if (options.withStorybook) {\r\n console.log('\\nRunning idia-ui add storybook…')\r\n const add = resolveIdiaUiInvocation(pm, ['add', 'storybook'])\r\n const result = runCommand(add.command, add.args, projectDir)\r\n if (result.error) {\r\n console.warn('⚠ idia-ui add storybook could not run:', result.error.message)\r\n } else if (result.status !== 0) {\r\n console.warn(\r\n `⚠ idia-ui add storybook exited with code ${result.status ?? 1}. Re-run manually after fixing peers.`,\r\n )\r\n }\r\n }\r\n\r\n if (options.withBrain) {\r\n console.log('\\nRunning idia-ui add brain…')\r\n const add = resolveIdiaUiInvocation(pm, ['add', 'brain'])\r\n const result = runCommand(add.command, add.args, projectDir)\r\n if (result.error) {\r\n console.warn('⚠ idia-ui add brain could not run:', result.error.message)\r\n } else if (result.status !== 0) {\r\n console.warn(\r\n `⚠ idia-ui add brain exited with code ${result.status ?? 1}. Re-run manually after fixing peers.`,\r\n )\r\n }\r\n }\r\n}\r\n\r\nfunction printNextSteps(\r\n projectName: string,\r\n projectDir: string,\r\n pm: PackageManager,\r\n options: Pick<ScaffoldOptions, 'withStorybook' | 'withBrain'>,\r\n): void {\r\n const dev = devCommand(pm)\r\n console.log('\\n✓ Project scaffolded successfully\\n')\r\n console.log('Next steps:')\r\n console.log(` cd ${projectDir}`)\r\n if (!existsSync(join(projectDir, 'node_modules'))) {\r\n const install = installCommand(pm)\r\n console.log(` ${install.command} ${install.args.join(' ')}`)\r\n }\r\n console.log(` ${dev}`)\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui doctor' : `${pm} exec idia-ui doctor`}`)\r\n if (!options.withStorybook) {\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui add storybook' : `${pm} exec idia-ui add storybook`}`)\r\n }\r\n if (!options.withBrain) {\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui add brain' : `${pm} exec idia-ui add brain`}`)\r\n }\r\n}\r\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\n\r\nimport { CLI_VERSION, IDIA_UI_VERSION, TEMPLATE_SLUG } from './constants.js'\r\n\r\ntype PackageJson = {\r\n name?: string\r\n dependencies?: Record<string, string>\r\n devDependencies?: Record<string, string>\r\n}\r\n\r\nexport function toKebabCase(name: string): string {\r\n return name\r\n .trim()\r\n .replace(/[\\s_]+/g, '-')\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .toLowerCase()\r\n .replace(/[^a-z0-9-]/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^-|-$/g, '')\r\n}\r\n\r\nexport function validateProjectName(name: string): string {\r\n const slug = toKebabCase(name)\r\n if (!slug) {\r\n throw new Error('Project name is required.')\r\n }\r\n if (!/^[a-z][a-z0-9-]*$/.test(slug)) {\r\n throw new Error(\r\n `Invalid project name \"${name}\". Use lowercase letters, numbers, and hyphens (must start with a letter).`,\r\n )\r\n }\r\n return slug\r\n}\r\n\r\nexport function replacePlaceholders(projectDir: string, projectName: string): void {\r\n const packageJsonPath = join(projectDir, 'package.json')\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as PackageJson\r\n\r\n packageJson.name = projectName\r\n\r\n for (const field of ['dependencies', 'devDependencies'] as const) {\r\n const deps = packageJson[field]\r\n if (!deps) continue\r\n for (const pkg of Object.keys(deps)) {\r\n if (pkg.startsWith('@idia-ui/')) {\r\n deps[pkg] = `^${IDIA_UI_VERSION}`\r\n }\r\n }\r\n }\r\n\r\n packageJson.devDependencies ??= {}\r\n packageJson.devDependencies['@idia-ui/cli'] = `^${CLI_VERSION}`\r\n\r\n writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, 'utf8')\r\n\r\n const appJsonPath = join(projectDir, 'app.json')\r\n const appJson = JSON.parse(readFileSync(appJsonPath, 'utf8')) as {\r\n expo: { name: string; slug: string; scheme: string }\r\n }\r\n appJson.expo.name = projectName\r\n appJson.expo.slug = projectName\r\n appJson.expo.scheme = projectName\r\n writeFileSync(appJsonPath, `${JSON.stringify(appJson, null, 2)}\\n`, 'utf8')\r\n\r\n const linkingPath = join(projectDir, 'src', 'navigation', 'linking.ts')\r\n let linking = readFileSync(linkingPath, 'utf8')\r\n linking = linking.replaceAll(TEMPLATE_SLUG, projectName)\r\n writeFileSync(linkingPath, linking, 'utf8')\r\n}\r\n\r\nexport function writeManifest(projectDir: string): void {\r\n const manifestDir = join(projectDir, '.idia')\r\n mkdirSync(manifestDir, { recursive: true })\r\n const manifestPath = join(manifestDir, 'manifest.json')\r\n const manifest = {\r\n idiaCli: CLI_VERSION,\r\n core: IDIA_UI_VERSION,\r\n }\r\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8')\r\n}\r\n","/** Monorepo-local @idia-ui/* minor — pins generated app deps (RFC §10.4). */\r\nexport const IDIA_UI_VERSION = '0.2.0'\r\n\r\n/** create-idia-app package version — keep in sync with package.json. */\r\nexport const CREATE_APP_VERSION = '0.2.0'\r\n\r\n/** @idia-ui/cli version written to manifest + devDependency. */\r\nexport const CLI_VERSION = '0.2.0'\r\n\r\nexport const TEMPLATE_SLUG = 'my-idia-app'\r\n","export type PackageManager = 'pnpm' | 'npm' | 'yarn'\r\n\r\nconst PM_VALUES = new Set<PackageManager>(['pnpm', 'npm', 'yarn'])\r\n\r\nexport function parsePackageManagerFlag(value: string | undefined): PackageManager | undefined {\r\n if (!value) return undefined\r\n const normalized = value.toLowerCase() as PackageManager\r\n if (!PM_VALUES.has(normalized)) {\r\n throw new Error(`Invalid --pm value \"${value}\". Use pnpm, npm, or yarn.`)\r\n }\r\n return normalized\r\n}\r\n\r\nexport function detectPackageManager(override?: PackageManager): PackageManager {\r\n if (override) return override\r\n\r\n const agent = process.env.npm_config_user_agent ?? ''\r\n if (agent.includes('pnpm')) return 'pnpm'\r\n if (agent.includes('yarn')) return 'yarn'\r\n\r\n const execPath = process.env.npm_execpath ?? ''\r\n if (execPath.includes('pnpm')) return 'pnpm'\r\n if (execPath.includes('yarn')) return 'yarn'\r\n\r\n return 'npm'\r\n}\r\n\r\nexport function installCommand(pm: PackageManager): { command: string; args: string[] } {\r\n switch (pm) {\r\n case 'pnpm':\r\n return { command: 'pnpm', args: ['install'] }\r\n case 'yarn':\r\n return { command: 'yarn', args: ['install'] }\r\n default:\r\n return { command: 'npm', args: ['install'] }\r\n }\r\n}\r\n\r\nexport function devCommand(pm: PackageManager): string {\r\n switch (pm) {\r\n case 'pnpm':\r\n return 'pnpm dev'\r\n case 'yarn':\r\n return 'yarn dev'\r\n default:\r\n return 'npm run dev'\r\n }\r\n}\r\n\r\nexport function doctorCommand(pm: PackageManager): { command: string; args: string[] } {\r\n return idiaUiCommand(pm, ['doctor'])\r\n}\r\n\r\nexport type IdiaUiCommand = { command: string; args: string[] }\r\n\r\nexport function idiaUiCommand(\r\n pm: PackageManager,\r\n subcommand: string[],\r\n): IdiaUiCommand {\r\n switch (pm) {\r\n case 'pnpm':\r\n return { command: 'pnpm', args: ['exec', 'idia-ui', ...subcommand] }\r\n case 'yarn':\r\n return { command: 'yarn', args: ['idia-ui', ...subcommand] }\r\n default:\r\n return { command: 'npx', args: ['idia-ui', ...subcommand] }\r\n }\r\n}\r\n","import { existsSync } from 'node:fs'\r\n\r\nimport { monorepoDoctorCliPath } from './paths.js'\r\nimport { idiaUiCommand, type PackageManager } from './pm.js'\r\n\r\n/** Monorepo sibling @idia-ui/cli when developing create-idia-app locally. */\r\nexport function resolveMonorepoDoctorCli(): string | null {\r\n const candidate = monorepoDoctorCliPath()\r\n return existsSync(candidate) ? candidate : null\r\n}\r\n\r\nexport function resolveIdiaUiInvocation(\r\n pm: PackageManager,\r\n subcommand: string[],\r\n): { command: string; args: string[]; via: 'monorepo' | 'installed' } {\r\n const monorepoCli = resolveMonorepoDoctorCli()\r\n if (monorepoCli) {\r\n return {\r\n command: process.execPath,\r\n args: [monorepoCli, ...subcommand],\r\n via: 'monorepo',\r\n }\r\n }\r\n\r\n const viaPm = idiaUiCommand(pm, subcommand)\r\n return { ...viaPm, via: 'installed' }\r\n}\r\n\r\nexport function resolveDoctorInvocation(\r\n pm: PackageManager,\r\n): { command: string; args: string[]; via: 'monorepo' | 'installed' } {\r\n return resolveIdiaUiInvocation(pm, ['doctor'])\r\n}\r\n","import { dirname, join } from 'node:path'\r\n\r\n/** CLI entry file (dist/index.js) — reliable in CJS bin bundles. */\r\nfunction cliEntryPath(): string {\r\n const entry = process.argv[1]\r\n if (!entry) {\r\n throw new Error('Unable to resolve CLI entry path.')\r\n }\r\n return entry\r\n}\r\n\r\nexport function packageRootDir(): string {\r\n return join(dirname(cliEntryPath()), '..')\r\n}\r\n\r\nexport function templateDir(): string {\r\n return join(packageRootDir(), 'template')\r\n}\r\n\r\nexport function monorepoDoctorCliPath(): string {\r\n return join(packageRootDir(), '..', 'cli', 'dist', 'cli.js')\r\n}\r\n","import { scaffold } from './scaffold.js'\r\nimport { parsePackageManagerFlag } from './pm.js'\r\nimport { CREATE_APP_VERSION } from './constants.js'\r\n\r\nfunction printHelp(): void {\r\n console.log(`create-idia-app v${CREATE_APP_VERSION}\r\n\r\nUsage:\r\n create-idia-app [project-name] [options]\r\n\r\nOptions:\r\n --pm <pnpm|npm|yarn> Override package manager detection\r\n --skip-install Skip install and idia-ui doctor\r\n --force Overwrite target directory if it exists\r\n --no-git Skip git init\r\n --with-storybook Not available (Phase 3) — prints warning\r\n --with-brain Not available (Phase 4) — prints warning\r\n -h, --help Show help\r\n -V, --version Show version\r\n`)\r\n}\r\n\r\nfunction parseArgs(argv: string[]): {\r\n projectName?: string\r\n pm?: ReturnType<typeof parsePackageManagerFlag>\r\n skipInstall: boolean\r\n force: boolean\r\n noGit: boolean\r\n withStorybook: boolean\r\n withBrain: boolean\r\n help: boolean\r\n version: boolean\r\n} {\r\n const result = {\r\n projectName: undefined as string | undefined,\r\n pm: undefined as ReturnType<typeof parsePackageManagerFlag>,\r\n skipInstall: false,\r\n force: false,\r\n noGit: false,\r\n withStorybook: false,\r\n withBrain: false,\r\n help: false,\r\n version: false,\r\n }\r\n\r\n for (let i = 0; i < argv.length; i += 1) {\r\n const arg = argv[i]\r\n switch (arg) {\r\n case '--pm':\r\n result.pm = parsePackageManagerFlag(argv[++i])\r\n break\r\n case '--skip-install':\r\n result.skipInstall = true\r\n break\r\n case '--force':\r\n result.force = true\r\n break\r\n case '--no-git':\r\n result.noGit = true\r\n break\r\n case '--with-storybook':\r\n result.withStorybook = true\r\n break\r\n case '--with-brain':\r\n result.withBrain = true\r\n break\r\n case '-h':\r\n case '--help':\r\n result.help = true\r\n break\r\n case '-V':\r\n case '--version':\r\n result.version = true\r\n break\r\n default:\r\n if (arg.startsWith('-')) {\r\n throw new Error(`Unknown option: ${arg}`)\r\n }\r\n if (!result.projectName) {\r\n result.projectName = arg\r\n } else {\r\n throw new Error(`Unexpected argument: ${arg}`)\r\n }\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nfunction main(): void {\r\n try {\r\n const args = parseArgs(process.argv.slice(2))\r\n\r\n if (args.help) {\r\n printHelp()\r\n return\r\n }\r\n\r\n if (args.version) {\r\n console.log(CREATE_APP_VERSION)\r\n return\r\n }\r\n\r\n if (!args.projectName) {\r\n printHelp()\r\n throw new Error('Project name is required. Example: create-idia-app my-app')\r\n }\r\n\r\n scaffold({\r\n projectName: args.projectName,\r\n targetDir: process.cwd(),\r\n pm: args.pm,\r\n skipInstall: args.skipInstall,\r\n force: args.force,\r\n noGit: args.noGit,\r\n withStorybook: args.withStorybook,\r\n withBrain: args.withBrain,\r\n })\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error)\r\n console.error(`\\nError: ${message}`)\r\n process.exit(1)\r\n }\r\n}\r\n\r\nmain()\r\n"],"mappings":"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","names":["import_node_fs","import_node_path","import_node_fs","import_node_path"]}
1
+ {"version":3,"sources":["../src/scaffold.ts","../src/replace.ts","../src/constants.ts","../src/pm.ts","../src/doctor.ts","../src/paths.ts","../src/index.ts"],"sourcesContent":["import { cpSync, existsSync, mkdirSync, rmSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\nimport { spawnSync } from 'node:child_process'\r\n\r\nimport { replacePlaceholders, validateProjectName, writeManifest } from './replace.js'\r\nimport {\r\n detectPackageManager,\r\n devCommand,\r\n installCommand,\r\n type PackageManager,\r\n} from './pm.js'\r\nimport { resolveDoctorInvocation, resolveIdiaUiInvocation } from './doctor.js'\r\nimport { templateDir } from './paths.js'\r\n\r\nexport type ScaffoldOptions = {\r\n projectName: string\r\n targetDir: string\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n force?: boolean\r\n noGit?: boolean\r\n withStorybook?: boolean\r\n withBrain?: boolean\r\n}\r\n\r\nexport type ScaffoldResult = {\r\n projectDir: string\r\n projectName: string\r\n pm: PackageManager\r\n installed: boolean\r\n doctorRan: boolean\r\n doctorExitCode: number | null\r\n doctorVia: 'monorepo' | 'installed' | 'skipped'\r\n}\r\n\r\nfunction resolveTemplateDir(): string {\r\n const bundled = templateDir()\r\n if (existsSync(bundled)) return bundled\r\n throw new Error(\r\n 'Template directory missing. Run `pnpm run build` in packages/create-idia-app first.',\r\n )\r\n}\r\n\r\nfunction runCommand(\r\n command: string,\r\n args: string[],\r\n cwd: string,\r\n): { status: number | null; error?: Error } {\r\n const result = spawnSync(command, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: process.platform === 'win32',\r\n })\r\n if (result.error) {\r\n return { status: result.status, error: result.error }\r\n }\r\n return { status: result.status }\r\n}\r\n\r\nexport function scaffold(options: ScaffoldOptions): ScaffoldResult {\r\n const projectName = validateProjectName(options.projectName)\r\n const projectDir = options.targetDir\r\n ? join(options.targetDir, projectName)\r\n : join(process.cwd(), projectName)\r\n const pm = detectPackageManager(options.pm)\r\n\r\n if (existsSync(projectDir)) {\r\n if (!options.force) {\r\n throw new Error(\r\n `Directory \"${projectDir}\" already exists. Pass --force to overwrite or choose another name.`,\r\n )\r\n }\r\n rmSync(projectDir, { recursive: true, force: true })\r\n }\r\n\r\n mkdirSync(projectDir, { recursive: true })\r\n cpSync(resolveTemplateDir(), projectDir, { recursive: true })\r\n\r\n replacePlaceholders(projectDir, projectName)\r\n writeManifest(projectDir)\r\n\r\n if (!options.noGit) {\r\n const git = runCommand('git', ['init'], projectDir)\r\n if (git.error) {\r\n console.warn('⚠ git init skipped:', git.error.message)\r\n }\r\n }\r\n\r\n let installed = false\r\n let doctorRan = false\r\n let doctorExitCode: number | null = null\r\n let doctorVia: ScaffoldResult['doctorVia'] = 'skipped'\r\n\r\n if (!options.skipInstall) {\r\n console.log(`\\nInstalling dependencies with ${pm}…`)\r\n const install = installCommand(pm)\r\n const installResult = runCommand(install.command, install.args, projectDir)\r\n if (installResult.error) {\r\n throw installResult.error\r\n }\r\n if (installResult.status !== 0) {\r\n throw new Error(`${pm} install failed with exit code ${installResult.status ?? 1}`)\r\n }\r\n installed = true\r\n\r\n console.log('\\nRunning idia-ui doctor (non-strict)…')\r\n const doctor = resolveDoctorInvocation(pm)\r\n doctorVia = doctor.via\r\n const doctorResult = runCommand(doctor.command, doctor.args, projectDir)\r\n doctorRan = true\r\n doctorExitCode = doctorResult.status\r\n if (doctorResult.error) {\r\n console.warn('⚠ idia-ui doctor could not run:', doctorResult.error.message)\r\n doctorRan = false\r\n doctorExitCode = null\r\n } else if (doctorExitCode !== 0) {\r\n console.warn(\r\n `⚠ idia-ui doctor exited with code ${doctorExitCode}. Review warnings above; re-run after fixing peers.`,\r\n )\r\n }\r\n\r\n runPostScaffoldAddons(projectDir, pm, options)\r\n } else {\r\n console.log('\\n--skip-install: skipping dependency install and idia-ui doctor.')\r\n if (options.withStorybook || options.withBrain) {\r\n console.warn(\r\n '⚠ --with-storybook / --with-brain require install. After `pnpm install`, run idia-ui add storybook and/or idia-ui add brain.',\r\n )\r\n }\r\n }\r\n\r\n printNextSteps(projectName, projectDir, pm, options)\r\n\r\n return {\r\n projectDir,\r\n projectName,\r\n pm,\r\n installed,\r\n doctorRan,\r\n doctorExitCode,\r\n doctorVia,\r\n }\r\n}\r\n\r\nfunction runPostScaffoldAddons(\r\n projectDir: string,\r\n pm: PackageManager,\r\n options: Pick<ScaffoldOptions, 'withStorybook' | 'withBrain'>,\r\n): void {\r\n if (options.withStorybook) {\r\n console.log('\\nRunning idia-ui add storybook…')\r\n const add = resolveIdiaUiInvocation(pm, ['add', 'storybook'])\r\n const result = runCommand(add.command, add.args, projectDir)\r\n if (result.error) {\r\n console.warn('⚠ idia-ui add storybook could not run:', result.error.message)\r\n } else if (result.status !== 0) {\r\n console.warn(\r\n `⚠ idia-ui add storybook exited with code ${result.status ?? 1}. Re-run manually after fixing peers.`,\r\n )\r\n }\r\n }\r\n\r\n if (options.withBrain) {\r\n console.log('\\nRunning idia-ui add brain…')\r\n const add = resolveIdiaUiInvocation(pm, ['add', 'brain'])\r\n const result = runCommand(add.command, add.args, projectDir)\r\n if (result.error) {\r\n console.warn('⚠ idia-ui add brain could not run:', result.error.message)\r\n } else if (result.status !== 0) {\r\n console.warn(\r\n `⚠ idia-ui add brain exited with code ${result.status ?? 1}. Re-run manually after fixing peers.`,\r\n )\r\n }\r\n }\r\n}\r\n\r\nfunction printNextSteps(\r\n projectName: string,\r\n projectDir: string,\r\n pm: PackageManager,\r\n options: Pick<ScaffoldOptions, 'withStorybook' | 'withBrain'>,\r\n): void {\r\n const dev = devCommand(pm)\r\n console.log('\\n✓ Project scaffolded successfully\\n')\r\n console.log('Next steps:')\r\n console.log(` cd ${projectDir}`)\r\n if (!existsSync(join(projectDir, 'node_modules'))) {\r\n const install = installCommand(pm)\r\n console.log(` ${install.command} ${install.args.join(' ')}`)\r\n }\r\n console.log(` ${dev}`)\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui doctor' : `${pm} exec idia-ui doctor`}`)\r\n if (!options.withStorybook) {\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui add storybook' : `${pm} exec idia-ui add storybook`}`)\r\n }\r\n if (!options.withBrain) {\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui add brain' : `${pm} exec idia-ui add brain`}`)\r\n }\r\n}\r\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\n\r\nimport { CLI_VERSION, IDIA_UI_VERSION, TEMPLATE_SLUG } from './constants.js'\r\n\r\ntype PackageJson = {\r\n name?: string\r\n dependencies?: Record<string, string>\r\n devDependencies?: Record<string, string>\r\n}\r\n\r\nexport function toKebabCase(name: string): string {\r\n return name\r\n .trim()\r\n .replace(/[\\s_]+/g, '-')\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .toLowerCase()\r\n .replace(/[^a-z0-9-]/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^-|-$/g, '')\r\n}\r\n\r\nexport function validateProjectName(name: string): string {\r\n const slug = toKebabCase(name)\r\n if (!slug) {\r\n throw new Error('Project name is required.')\r\n }\r\n if (!/^[a-z][a-z0-9-]*$/.test(slug)) {\r\n throw new Error(\r\n `Invalid project name \"${name}\". Use lowercase letters, numbers, and hyphens (must start with a letter).`,\r\n )\r\n }\r\n return slug\r\n}\r\n\r\nexport function replacePlaceholders(projectDir: string, projectName: string): void {\r\n const packageJsonPath = join(projectDir, 'package.json')\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as PackageJson\r\n\r\n packageJson.name = projectName\r\n\r\n for (const field of ['dependencies', 'devDependencies'] as const) {\r\n const deps = packageJson[field]\r\n if (!deps) continue\r\n for (const pkg of Object.keys(deps)) {\r\n if (pkg.startsWith('@idia-ui/')) {\r\n deps[pkg] = `^${IDIA_UI_VERSION}`\r\n }\r\n }\r\n }\r\n\r\n packageJson.devDependencies ??= {}\r\n packageJson.devDependencies['@idia-ui/cli'] = `^${CLI_VERSION}`\r\n\r\n writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, 'utf8')\r\n\r\n const appJsonPath = join(projectDir, 'app.json')\r\n const appJson = JSON.parse(readFileSync(appJsonPath, 'utf8')) as {\r\n expo: { name: string; slug: string; scheme: string }\r\n }\r\n appJson.expo.name = projectName\r\n appJson.expo.slug = projectName\r\n appJson.expo.scheme = projectName\r\n writeFileSync(appJsonPath, `${JSON.stringify(appJson, null, 2)}\\n`, 'utf8')\r\n\r\n const linkingPath = join(projectDir, 'src', 'navigation', 'linking.ts')\r\n let linking = readFileSync(linkingPath, 'utf8')\r\n linking = linking.replaceAll(TEMPLATE_SLUG, projectName)\r\n writeFileSync(linkingPath, linking, 'utf8')\r\n}\r\n\r\nexport function writeManifest(projectDir: string): void {\r\n const manifestDir = join(projectDir, '.idia')\r\n mkdirSync(manifestDir, { recursive: true })\r\n const manifestPath = join(manifestDir, 'manifest.json')\r\n const manifest = {\r\n idiaCli: CLI_VERSION,\r\n core: IDIA_UI_VERSION,\r\n }\r\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8')\r\n}\r\n","/** Monorepo-local @idia-ui/* minor — pins generated app deps (RFC §10.4). */\r\nexport const IDIA_UI_VERSION = '0.2.0'\r\n\r\n/** create-idia-app package version — keep in sync with package.json. */\r\nexport const CREATE_APP_VERSION = '0.2.1'\r\n\r\n/** @idia-ui/cli version written to manifest + devDependency. */\r\nexport const CLI_VERSION = '0.2.1'\r\n\r\nexport const TEMPLATE_SLUG = 'my-idia-app'\r\n","export type PackageManager = 'pnpm' | 'npm' | 'yarn'\r\n\r\nconst PM_VALUES = new Set<PackageManager>(['pnpm', 'npm', 'yarn'])\r\n\r\nexport function parsePackageManagerFlag(value: string | undefined): PackageManager | undefined {\r\n if (!value) return undefined\r\n const normalized = value.toLowerCase() as PackageManager\r\n if (!PM_VALUES.has(normalized)) {\r\n throw new Error(`Invalid --pm value \"${value}\". Use pnpm, npm, or yarn.`)\r\n }\r\n return normalized\r\n}\r\n\r\nexport function detectPackageManager(override?: PackageManager): PackageManager {\r\n if (override) return override\r\n\r\n const agent = process.env.npm_config_user_agent ?? ''\r\n if (agent.includes('pnpm')) return 'pnpm'\r\n if (agent.includes('yarn')) return 'yarn'\r\n\r\n const execPath = process.env.npm_execpath ?? ''\r\n if (execPath.includes('pnpm')) return 'pnpm'\r\n if (execPath.includes('yarn')) return 'yarn'\r\n\r\n return 'npm'\r\n}\r\n\r\nexport function installCommand(pm: PackageManager): { command: string; args: string[] } {\r\n switch (pm) {\r\n case 'pnpm':\r\n return { command: 'pnpm', args: ['install'] }\r\n case 'yarn':\r\n return { command: 'yarn', args: ['install'] }\r\n default:\r\n return { command: 'npm', args: ['install'] }\r\n }\r\n}\r\n\r\nexport function devCommand(pm: PackageManager): string {\r\n switch (pm) {\r\n case 'pnpm':\r\n return 'pnpm dev'\r\n case 'yarn':\r\n return 'yarn dev'\r\n default:\r\n return 'npm run dev'\r\n }\r\n}\r\n\r\nexport function doctorCommand(pm: PackageManager): { command: string; args: string[] } {\r\n return idiaUiCommand(pm, ['doctor'])\r\n}\r\n\r\nexport type IdiaUiCommand = { command: string; args: string[] }\r\n\r\nexport function idiaUiCommand(\r\n pm: PackageManager,\r\n subcommand: string[],\r\n): IdiaUiCommand {\r\n switch (pm) {\r\n case 'pnpm':\r\n return { command: 'pnpm', args: ['exec', 'idia-ui', ...subcommand] }\r\n case 'yarn':\r\n return { command: 'yarn', args: ['idia-ui', ...subcommand] }\r\n default:\r\n return { command: 'npx', args: ['idia-ui', ...subcommand] }\r\n }\r\n}\r\n","import { existsSync } from 'node:fs'\r\n\r\nimport { monorepoDoctorCliPath } from './paths.js'\r\nimport { idiaUiCommand, type PackageManager } from './pm.js'\r\n\r\n/** Monorepo sibling @idia-ui/cli when developing create-idia-app locally. */\r\nexport function resolveMonorepoDoctorCli(): string | null {\r\n const candidate = monorepoDoctorCliPath()\r\n return existsSync(candidate) ? candidate : null\r\n}\r\n\r\nexport function resolveIdiaUiInvocation(\r\n pm: PackageManager,\r\n subcommand: string[],\r\n): { command: string; args: string[]; via: 'monorepo' | 'installed' } {\r\n const monorepoCli = resolveMonorepoDoctorCli()\r\n if (monorepoCli) {\r\n return {\r\n command: process.execPath,\r\n args: [monorepoCli, ...subcommand],\r\n via: 'monorepo',\r\n }\r\n }\r\n\r\n const viaPm = idiaUiCommand(pm, subcommand)\r\n return { ...viaPm, via: 'installed' }\r\n}\r\n\r\nexport function resolveDoctorInvocation(\r\n pm: PackageManager,\r\n): { command: string; args: string[]; via: 'monorepo' | 'installed' } {\r\n return resolveIdiaUiInvocation(pm, ['doctor'])\r\n}\r\n","import { dirname, join } from 'node:path'\r\n\r\n/** CLI entry file (dist/index.js) — reliable in CJS bin bundles. */\r\nfunction cliEntryPath(): string {\r\n const entry = process.argv[1]\r\n if (!entry) {\r\n throw new Error('Unable to resolve CLI entry path.')\r\n }\r\n return entry\r\n}\r\n\r\nexport function packageRootDir(): string {\r\n return join(dirname(cliEntryPath()), '..')\r\n}\r\n\r\nexport function templateDir(): string {\r\n return join(packageRootDir(), 'template')\r\n}\r\n\r\nexport function monorepoDoctorCliPath(): string {\r\n return join(packageRootDir(), '..', 'cli', 'dist', 'cli.js')\r\n}\r\n","import { scaffold } from './scaffold.js'\r\nimport { parsePackageManagerFlag } from './pm.js'\r\nimport { CREATE_APP_VERSION } from './constants.js'\r\n\r\nfunction printHelp(): void {\r\n console.log(`create-idia-app v${CREATE_APP_VERSION}\r\n\r\nUsage:\r\n create-idia-app [project-name] [options]\r\n\r\nOptions:\r\n --pm <pnpm|npm|yarn> Override package manager detection\r\n --skip-install Skip install and idia-ui doctor\r\n --force Overwrite target directory if it exists\r\n --no-git Skip git init\r\n --with-storybook Not available (Phase 3) — prints warning\r\n --with-brain Not available (Phase 4) — prints warning\r\n -h, --help Show help\r\n -V, --version Show version\r\n`)\r\n}\r\n\r\nfunction parseArgs(argv: string[]): {\r\n projectName?: string\r\n pm?: ReturnType<typeof parsePackageManagerFlag>\r\n skipInstall: boolean\r\n force: boolean\r\n noGit: boolean\r\n withStorybook: boolean\r\n withBrain: boolean\r\n help: boolean\r\n version: boolean\r\n} {\r\n const result = {\r\n projectName: undefined as string | undefined,\r\n pm: undefined as ReturnType<typeof parsePackageManagerFlag>,\r\n skipInstall: false,\r\n force: false,\r\n noGit: false,\r\n withStorybook: false,\r\n withBrain: false,\r\n help: false,\r\n version: false,\r\n }\r\n\r\n for (let i = 0; i < argv.length; i += 1) {\r\n const arg = argv[i]\r\n switch (arg) {\r\n case '--pm':\r\n result.pm = parsePackageManagerFlag(argv[++i])\r\n break\r\n case '--skip-install':\r\n result.skipInstall = true\r\n break\r\n case '--force':\r\n result.force = true\r\n break\r\n case '--no-git':\r\n result.noGit = true\r\n break\r\n case '--with-storybook':\r\n result.withStorybook = true\r\n break\r\n case '--with-brain':\r\n result.withBrain = true\r\n break\r\n case '-h':\r\n case '--help':\r\n result.help = true\r\n break\r\n case '-V':\r\n case '--version':\r\n result.version = true\r\n break\r\n default:\r\n if (arg.startsWith('-')) {\r\n throw new Error(`Unknown option: ${arg}`)\r\n }\r\n if (!result.projectName) {\r\n result.projectName = arg\r\n } else {\r\n throw new Error(`Unexpected argument: ${arg}`)\r\n }\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nfunction main(): void {\r\n try {\r\n const args = parseArgs(process.argv.slice(2))\r\n\r\n if (args.help) {\r\n printHelp()\r\n return\r\n }\r\n\r\n if (args.version) {\r\n console.log(CREATE_APP_VERSION)\r\n return\r\n }\r\n\r\n if (!args.projectName) {\r\n printHelp()\r\n throw new Error('Project name is required. Example: create-idia-app my-app')\r\n }\r\n\r\n scaffold({\r\n projectName: args.projectName,\r\n targetDir: process.cwd(),\r\n pm: args.pm,\r\n skipInstall: args.skipInstall,\r\n force: args.force,\r\n noGit: args.noGit,\r\n withStorybook: args.withStorybook,\r\n withBrain: args.withBrain,\r\n })\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error)\r\n console.error(`\\nError: ${message}`)\r\n process.exit(1)\r\n }\r\n}\r\n\r\nmain()\r\n"],"mappings":"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","names":["import_node_fs","import_node_path","import_node_fs","import_node_path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-idia-app",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Scaffold an Expo + idia-ui consumer app from the official template",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -54,13 +54,6 @@
54
54
  },
55
55
  "devDependencies": {
56
56
  "@expo/metro-config": "0.20.18",
57
- "@idia-ui/brain-pack": "workspace:*",
58
- "@idia-ui/storybook-docs": "workspace:*",
59
- "@idia-ui/storybook-preset-react-native-web": "workspace:*",
60
- "@storybook/addon-a11y": "^8.4.7",
61
- "@storybook/addon-docs": "^8.4.7",
62
- "@storybook/addon-links": "^8.4.7",
63
- "@storybook/react-vite": "^8.4.7",
64
57
  "@tamagui/babel-plugin": "^1.144.4",
65
58
  "@types/react": "^19.0.0",
66
59
  "babel-plugin-module-resolver": "^5.0.2",
@@ -77,9 +70,6 @@
77
70
  "metro-transform-plugins": "0.82.5",
78
71
  "metro-transform-worker": "0.82.5",
79
72
  "react-native-svg-transformer": "^1.5.0",
80
- "storybook": "^8.4.7",
81
- "typescript": "^5.9.3",
82
- "vite": "^5.4.0",
83
- "vite-tsconfig-paths": "^4.3.0"
73
+ "typescript": "^5.9.3"
84
74
  }
85
75
  }
@@ -1,32 +0,0 @@
1
- ---
2
- description: "Always-apply ds-brain rules: read AGENTS.md, use generated registry indexes, do not invent components or variants."
3
- globs:
4
- - "**/*"
5
- alwaysApply: true
6
- ---
7
- # Idia UI — ds-brain
8
-
9
- Operational rules for AI coding agents working in this repo.
10
-
11
- - Read `.idia/brain/AGENTS.md` before design-system work.
12
- - If authored docs and generated files conflict, authored docs win.
13
- - `foundations/`
14
- - `components/`
15
- - `patterns/`
16
- - `decisions/`
17
- - Read `AGENTS.md` (repo root) — **session-start**; mandatory first Read for **any** task (see root `AGENTS.md`).
18
- - Read `.idia/brain/AGENTS.md` — **gate step 1**; brain entrypoint (this file).
19
- - Read `.idia/brain/registry/ai-index.generated.json` — **gate step 2**; **STOP** — required before any component or pattern doc.
20
- - Read `.idia/brain/ai/skills/ds-brain-index/SKILL.md` — **gate step 3**; **required** meta router; read before domain skills and component/pattern docs.
21
- - Classify **output mode** and **task intent** from the ai-index before opening authored component docs.
22
- - Read `AGENTS.md` — entry routing and output-mode read lists.
23
- - Read `.idia/brain/registry/ai-index.generated.json` — **required** gate before component/pattern docs.
24
- - Read `ds-brain-index` skill (`.idia/brain/ai/skills/ds-brain-index/SKILL.md`) — **required** meta router before domain skills and authored component docs.
25
- - Classify output mode from the ai-index.
26
- - Prefer `.idia/brain/registry/ai-index.generated.json` when present.
27
- - Use `.idia/brain/registry/component-registry.generated.json` for component metadata — do not invent components, props, variants, tokens, or Figma mappings.
28
- - Do not edit `.idia/brain/` directly.
29
- - Do not invent components, props, variants, tokens, or Figma mappings.
30
- - Do not mark a doc `rich` unless required sections are substantive, especially accessibility for interactive components.
31
- - Do not claim catalog completeness beyond what the pack registries summarize.
32
- - If a gap is found, report it to the idia-ui maintainers rather than inventing API or docs.
@@ -1,34 +0,0 @@
1
- ---
2
- description: "Form composition: action hierarchy, choice controls (radio/select/checkbox), validation patterns."
3
- globs:
4
- - "**/forms/**"
5
- - "**/*Form*"
6
- - "**/*form*"
7
- alwaysApply: false
8
- ---
9
- # Idia UI — Forms
10
-
11
- Apply when editing form flows, field groups, validation, or choice controls.
12
-
13
- - Forms collect, validate, and submit structured user input — multiple related values the user enters or edits before a primary action completes the task.
14
- - Retrieve this pattern plus `patterns/forms.md` and `decisions/action-hierarchy.md`.
15
- - Retrieve `components/form-section.md` and `components/form-element.md` before generating hierarchy.
16
- - Retrieve component brain docs for every field you render.
17
- - Use `FormSection` when there are 2+ logical groups; use built-in `label` on `InputText`/`Select`/`TextArea`/`InputGroup` when possible.
18
- - Reserve `FormElement` for custom/headless controls or `Toggle` group labels.
19
- - Apply `FORM_V_GAP` / `FORM_H_GAP` from `foundations/spacing.md` — do not invent spacing tokens.
20
- - Retrieve this pattern, `patterns/forms.md`, and `patterns/form-composition.md` for layout context.
21
- - Retrieve `components/form-element.md` and every field component you render.
22
- - Import validators from `@idia-ui/validators` — do not duplicate regex in screens.
23
- - Map `formState.errors` to `hasError` + `errorText` on the matching field.
24
- - Use `mode: 'onSubmit'` as default for short forms; gate on-change revalidation with `isSubmitted`.
25
- - Set submit `Button` `loading` during async work.
26
- - Each local action group should have **one primary action** — the control that completes the main task. Secondary actions support cancellation, back navigation, alternative flows, or lower-priority choices. Destructive actions must be visually distinct and must not read as casual alternatives to the primary action.
27
- - **Form footers** — submit, save, continue, cancel, back (`patterns/forms.md`)
28
- - **Dialog or sheet action rows** — confirm, dismiss, delete with confirmation (`patterns/modal-routing.md`, `components/confirmation-modal.md`)
29
- - **Modal `footer` slots** — save/cancel pairs on responsive `Modal` branches (`components/modal.md`)
30
- - **Wizard step footers** — next/continue vs back/submit on first, middle, and last steps (`patterns/wizard-flows.md`)
31
- - Choose the control by **selection model**, **visibility needs**, and **visual density**. All Group A choice controls have brain docs — retrieve the cited component doc before generating props.
32
- - Form task-intent components: avatar-upload, button, checkbox, custom-selection, date-input, date-range-input, form-element, form-section, ….
33
- - Form foundations: color, spacing, tokens, typography.
34
- - Retrieve pattern docs from ds-brain index task intent `form` before generating form UI.
@@ -1,23 +0,0 @@
1
- ---
2
- description: "Overlay and modal work: escalation ladder, z-index layering, confirm/dismiss action rows."
3
- globs:
4
- - "**/*[Mm]odal*"
5
- - "**/*[Oo]verlay*"
6
- - "**/*[Pp]opover*"
7
- - "**/*[Tt]ooltip*"
8
- - "**/*[Tt]oast*"
9
- alwaysApply: false
10
- ---
11
- # Idia UI — Overlays
12
-
13
- Apply when editing modals, popovers, tooltips, sheets, toasts, or z-index layering.
14
-
15
- - Overlay stack is the recipe for **choosing the lightest blocking or floating surface** for a task and **layering overlays predictably** — tooltip hints, popover menus, sheets, dialogs, toasts — without z-index collisions or focus-trap conflicts.
16
- - Escalation ladder: Tooltip → PopoverWrapper → BottomSheet / SideSheet → Dialog (Modal).
17
- - Start with the least disruptive surface; escalate to modal only for blocking work.
18
- - Z-index tokens define semantic stacking layers for controls, dropdowns, sticky chrome, modals, toasts, and full-screen overlays. Two sources exist by design: token `zIndex` feeds Tamagui substrate props; theme `Z_INDEX` is the **canonical layering contract for components and AI guidance**.
19
- - Component layering policy uses `Z_INDEX` from `@idia-ui/theme` — canonical for components and AI guidance.
20
- - Each local action group should have **one primary action** — the control that completes the main task. Secondary actions support cancellation, back navigation, alternative flows, or lower-priority choices. Destructive actions must be visually distinct and must not read as casual alternatives to the primary action.
21
- - Modal confirm/dismiss rows follow action-hierarchy: one primary action per group.
22
- - Overlay task-intent components: confirmation-modal, full-page-loader, modal, overlay, picker-sheet, popover-wrapper, toast, tooltip.
23
- - Overlay foundations: shadows, z-index.
@@ -1,37 +0,0 @@
1
- # idia-ui — Consumer Brain Entry
2
-
3
- @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.
4
-
5
- Read-only AI retrieval pack installed to `.idia/brain/` by `@idia-ui/brain-pack`. Use registry indexes and skills for idia-ui API facts — this pack does **not** ship authored component markdown. Refresh with `idia-ui sync brain`; do not hand-edit `.idia/brain/`.
6
-
7
- ## Conflict policy
8
-
9
- - `@idia-ui/core` source and published Storybook docs are canonical for API behaviour.
10
- - Generated artifacts under `.idia/brain/` are deterministic pack outputs — never edit them by hand.
11
- - When registries and your app code disagree, **source code wins**.
12
-
13
- ## Retrieval order
14
-
15
- 1. Read `.idia/brain/AGENTS.md` — consumer brain entry (this file).
16
- 2. Read `.idia/brain/registry/ai-index.generated.json` — **STOP** — classify output mode and task intent before inventing UI.
17
- 3. Read `.idia/brain/ai/skills/ds-brain-index/SKILL.md` — meta router before domain skills.
18
- 4. Load domain skills as needed (e.g. `ds-brain-forms`, `ds-brain-overlays`, `components/button`).
19
- 5. Use `.idia/brain/registry/component-registry.generated.json` for component API summaries.
20
- 6. Inspect `@idia-ui/core` source only when registries are insufficient.
21
-
22
- Optional shortcut: `.idia/brain/ai/agents/retrieval-cheatsheet.md`.
23
-
24
- ## Pack artifact paths
25
-
26
- - `.idia/brain/registry/ai-index.generated.json` — output-mode and task-intent routing
27
- - `.idia/brain/registry/component-registry.generated.json` — per-component metadata and `brainPath` summaries
28
- - `.idia/brain/ai/skills/**/SKILL.md` — domain and meta skills
29
- - `.idia/brain/ai/agents/retrieval-cheatsheet.md` — tabular retrieval lookup
30
- - `.cursor/rules/idia-ui-*.mdc` — Cursor operational rules (installed separately from pack root `cursor-rules/`)
31
-
32
- ## Prohibitions
33
-
34
- - Do not edit `.idia/brain/` directly.
35
- - Do not invent components, props, variants, tokens, or Figma mappings.
36
- - Do not claim catalog completeness beyond what the pack registries summarize.
37
- - If a gap is found, report it to the idia-ui maintainers rather than inventing API or docs.
@@ -1,209 +0,0 @@
1
- # ds-brain — Retrieval Cheatsheet
2
-
3
- Output mode and task intent are **independent axes** (see `docs/RETRIEVAL-CONTRACT.md`). Classify both, then load mode docs plus intent docs, components, and foundations.
4
-
5
- ## Retrieval recipe
6
-
7
- - Read `AGENTS.md` or `.idia/brain/ai/agents/AGENTS.generated.md`.
8
- - Classify **output mode** (form of work) and **task intent** (UI/domain task) separately.
9
- - Load output-mode docs from the table below.
10
- - Load task-intent docs, then component docs via `component-registry.generated.json` or intent component lists.
11
- - Load listed foundations when visual/token accuracy matters.
12
- - Inspect package source only when API or behaviour must be confirmed.
13
- - Prefer `.idia/brain/registry/ai-index.generated.json` for resolved paths; fall back to `.idia/brain/registry/ai-index.generated.json`.
14
-
15
- ## Output modes (contract — 5 modes)
16
-
17
- ### `component-implementation`
18
-
19
- - **Docs:** `ai/generation-principles.md`
20
- - **Keywords:** component, implementation, tsx, react, api
21
- - **Note:** Contract mode not in seed `outputModes`; combine with task-intent component lists and inspect source when API accuracy matters.
22
-
23
- ### `docs-maintenance`
24
-
25
- - **Docs:** `ai/generation-principles.md`, `ai/review-loop.md`
26
- - **Keywords:** audit, docs, mapping, schema, update
27
-
28
- ### `interactive-prototype`
29
-
30
- - **Docs:** `ai/generation-principles.md`, `ai/interactive-prototypes.md`
31
- - **Keywords:** code, implementation, interactive, prototype, react, tsx
32
-
33
- ### `static-ui-idea`
34
-
35
- - **Docs:** `ai/generation-principles.md`, `ai/static-ui-ideas.md`, `docs/VISUAL-REFERENCES.md`
36
- - **Keywords:** calibration, exploration, idea, image, mockup, static, storybook, visual, visual-reference
37
-
38
- ### `storybook-docs`
39
-
40
- - **Docs:** `ai/generation-principles.md`
41
- - **Keywords:** docs, example, story, storybook
42
-
43
- ## Task intents (seed)
44
-
45
- ### `button-action`
46
-
47
- - **Docs:** `decisions/action-hierarchy.md`, `decisions/button-vs-link.md`
48
- - **Components:** app-pressable, button, button-group, close-button, social-button
49
- - **Foundations:** `foundations/color.md`, `foundations/motion.md`, `foundations/radius.md`, `foundations/shadows.md`, `foundations/spacing.md`
50
-
51
- ### `choice-input`
52
-
53
- - **Docs:** `decisions/radio-vs-select-vs-checkbox.md`, `patterns/forms.md`
54
- - **Components:** checkbox, custom-selection, input, radio, segmented-selector, select, … (+1 more)
55
- - **Foundations:** `foundations/spacing.md`, `foundations/typography.md`
56
-
57
- ### `component-docs`
58
-
59
- - **Docs:** `ai/generation-principles.md`, `ai/review-loop.md`
60
- - **Components:** accordion, app-pressable, avatar, avatar-upload, back-link, badge, … (+70 more)
61
- - **Foundations:** `foundations/border-width.md`, `foundations/shadows.md`, `foundations/tokens.md`, `foundations/z-index.md`
62
-
63
- ### `data-display`
64
-
65
- - **Docs:** `patterns/search-highlight.md`
66
- - **Components:** avatar, badge, calendar, card-list, carousel, catalog-browser, … (+7 more)
67
- - **Foundations:** `foundations/color.md`, `foundations/spacing.md`, `foundations/typography.md`
68
-
69
- ### `data-table`
70
-
71
- - **Docs:** `patterns/search-highlight.md`, `patterns/table-filters.md`
72
- - **Components:** catalog-browser, date-input, empty-state, highlight-text, record-card, search-input, … (+2 more)
73
- - **Foundations:** `foundations/color.md`, `foundations/spacing.md`, `foundations/typography.md`
74
-
75
- ### `feedback-loading`
76
-
77
- - **Docs:** `patterns/empty-status-flow.md`
78
- - **Components:** empty-records-mobile, empty-state, full-page-loader, notification-banner, notification-text, skeleton, … (+3 more)
79
- - **Foundations:** `foundations/color.md`, `foundations/motion.md`
80
-
81
- ### `form`
82
-
83
- - **Docs:** `decisions/action-hierarchy.md`, `decisions/button-vs-link.md`, `decisions/radio-vs-select-vs-checkbox.md`, `patterns/address-capture.md`, `patterns/calendar-scheduling.md`, `patterns/form-composition.md`, `patterns/forms.md`, `patterns/media-upload.md`, `patterns/phone-and-currency.md`, `patterns/validation-forms.md`
84
- - **Components:** avatar-upload, button, checkbox, custom-selection, date-input, date-range-input, … (+20 more)
85
- - **Foundations:** `foundations/color.md`, `foundations/spacing.md`, `foundations/tokens.md`, `foundations/typography.md`
86
-
87
- ### `layout`
88
-
89
- - **Docs:** `patterns/sticky-chrome.md`
90
- - **Components:** accordion, card-container, collapsible, floating-action-bar, layout, list-simple, … (+3 more)
91
- - **Foundations:** `foundations/spacing.md`, `foundations/typography.md`
92
-
93
- ### `list-selection`
94
-
95
- - **Docs:** `patterns/list-selection.md`
96
- - **Components:** catalog-browser, checkbox, custom-selection, list-menu, list-menu-action, radio
97
- - **Foundations:** `foundations/spacing.md`, `foundations/typography.md`
98
-
99
- ### `loading-states`
100
-
101
- - **Docs:** `patterns/loading-skeletons.md`
102
- - **Components:** button, card-list, full-page-loader, skeleton, spinner, table, … (+1 more)
103
- - **Foundations:** `foundations/color.md`, `foundations/motion.md`
104
-
105
- ### `modal-navigation`
106
-
107
- - **Docs:** `decisions/action-hierarchy.md`, `decisions/button-vs-link.md`, `patterns/modal-routing.md`
108
- - **Components:** back-link, button, confirmation-modal, link, modal
109
- - **Foundations:** `foundations/motion.md`, `foundations/spacing.md`, `foundations/z-index.md`
110
-
111
- ### `navigation`
112
-
113
- - **Docs:** `decisions/action-hierarchy.md`, `decisions/button-vs-link.md`, `patterns/navigation-pressable.md`
114
- - **Components:** back-link, link, list-menu, list-menu-action, tabs, tabs-simple, … (+1 more)
115
- - **Foundations:** `foundations/color.md`, `foundations/spacing.md`, `foundations/typography.md`
116
-
117
- ### `overlay-stack`
118
-
119
- - **Docs:** `patterns/overlay-stack.md`
120
- - **Components:** confirmation-modal, full-page-loader, modal, overlay, picker-sheet, popover-wrapper, … (+2 more)
121
- - **Foundations:** `foundations/shadows.md`, `foundations/z-index.md`
122
-
123
- ### `wizard`
124
-
125
- - **Docs:** `patterns/wizard-flows.md`
126
- - **Components:** button, confirmation-modal, form-section, wizard-stepper
127
- - **Foundations:** `foundations/spacing.md`, `foundations/typography.md`
128
-
129
- ## Mode × intent matrix
130
-
131
- Each row is one classified pair. Load **mode docs ∪ intent docs** (dedupe), then intent components and foundations.
132
-
133
- | Output mode | Task intent | Mode docs | Intent docs | Components | Foundations |
134
- |---|---|---|---|---|---|
135
- | `component-implementation` | `button-action` | ai/generation-principles.md | decisions/action-hierarchy.md, decisions/button-vs-link.md | components/app-pressable.md, components/button.md, components/button-group.md, components/close-button.md, … | foundations/color.md, foundations/motion.md, foundations/radius.md, foundations/shadows.md, foundations/spacing.md |
136
- | `component-implementation` | `choice-input` | ai/generation-principles.md | decisions/radio-vs-select-vs-checkbox.md, patterns/forms.md | components/checkbox.md, components/custom-selection.md, components/input.md, components/radio.md, … | foundations/spacing.md, foundations/typography.md |
137
- | `component-implementation` | `component-docs` | ai/generation-principles.md | ai/generation-principles.md, ai/review-loop.md | components/accordion.md, components/app-pressable.md, components/avatar.md, components/avatar-upload.md, … | foundations/border-width.md, foundations/shadows.md, foundations/tokens.md, foundations/z-index.md |
138
- | `component-implementation` | `data-display` | ai/generation-principles.md | patterns/search-highlight.md | components/avatar.md, components/badge.md, components/calendar.md, components/card-list.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
139
- | `component-implementation` | `data-table` | ai/generation-principles.md | patterns/search-highlight.md, patterns/table-filters.md | components/catalog-browser.md, components/date-input.md, components/empty-state.md, components/highlight-text.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
140
- | `component-implementation` | `feedback-loading` | ai/generation-principles.md | patterns/empty-status-flow.md | components/empty-records-mobile.md, components/empty-state.md, components/full-page-loader.md, components/notification-banner.md, … | foundations/color.md, foundations/motion.md |
141
- | `component-implementation` | `form` | ai/generation-principles.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, decisions/radio-vs-select-vs-checkbox.md, patterns/address-capture.md, patterns/calendar-scheduling.md, patterns/form-composition.md, patterns/forms.md, patterns/media-upload.md, patterns/phone-and-currency.md, patterns/validation-forms.md | components/avatar-upload.md, components/button.md, components/checkbox.md, components/custom-selection.md, … | foundations/color.md, foundations/spacing.md, foundations/tokens.md, foundations/typography.md |
142
- | `component-implementation` | `layout` | ai/generation-principles.md | patterns/sticky-chrome.md | components/accordion.md, components/card-container.md, components/collapsible.md, components/floating-action-bar.md, … | foundations/spacing.md, foundations/typography.md |
143
- | `component-implementation` | `list-selection` | ai/generation-principles.md | patterns/list-selection.md | components/catalog-browser.md, components/checkbox.md, components/custom-selection.md, components/list-menu.md, … | foundations/spacing.md, foundations/typography.md |
144
- | `component-implementation` | `loading-states` | ai/generation-principles.md | patterns/loading-skeletons.md | components/button.md, components/card-list.md, components/full-page-loader.md, components/skeleton.md, … | foundations/color.md, foundations/motion.md |
145
- | `component-implementation` | `modal-navigation` | ai/generation-principles.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, patterns/modal-routing.md | components/back-link.md, components/button.md, components/confirmation-modal.md, components/link.md, … | foundations/motion.md, foundations/spacing.md, foundations/z-index.md |
146
- | `component-implementation` | `navigation` | ai/generation-principles.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, patterns/navigation-pressable.md | components/back-link.md, components/link.md, components/list-menu.md, components/list-menu-action.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
147
- | `component-implementation` | `overlay-stack` | ai/generation-principles.md | patterns/overlay-stack.md | components/confirmation-modal.md, components/full-page-loader.md, components/modal.md, components/overlay.md, … | foundations/shadows.md, foundations/z-index.md |
148
- | `component-implementation` | `wizard` | ai/generation-principles.md | patterns/wizard-flows.md | components/button.md, components/confirmation-modal.md, components/form-section.md, components/wizard-stepper.md | foundations/spacing.md, foundations/typography.md |
149
- | `docs-maintenance` | `button-action` | ai/generation-principles.md, ai/review-loop.md | decisions/action-hierarchy.md, decisions/button-vs-link.md | components/app-pressable.md, components/button.md, components/button-group.md, components/close-button.md, … | foundations/color.md, foundations/motion.md, foundations/radius.md, foundations/shadows.md, foundations/spacing.md |
150
- | `docs-maintenance` | `choice-input` | ai/generation-principles.md, ai/review-loop.md | decisions/radio-vs-select-vs-checkbox.md, patterns/forms.md | components/checkbox.md, components/custom-selection.md, components/input.md, components/radio.md, … | foundations/spacing.md, foundations/typography.md |
151
- | `docs-maintenance` | `component-docs` | ai/generation-principles.md, ai/review-loop.md | ai/generation-principles.md, ai/review-loop.md | components/accordion.md, components/app-pressable.md, components/avatar.md, components/avatar-upload.md, … | foundations/border-width.md, foundations/shadows.md, foundations/tokens.md, foundations/z-index.md |
152
- | `docs-maintenance` | `data-display` | ai/generation-principles.md, ai/review-loop.md | patterns/search-highlight.md | components/avatar.md, components/badge.md, components/calendar.md, components/card-list.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
153
- | `docs-maintenance` | `data-table` | ai/generation-principles.md, ai/review-loop.md | patterns/search-highlight.md, patterns/table-filters.md | components/catalog-browser.md, components/date-input.md, components/empty-state.md, components/highlight-text.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
154
- | `docs-maintenance` | `feedback-loading` | ai/generation-principles.md, ai/review-loop.md | patterns/empty-status-flow.md | components/empty-records-mobile.md, components/empty-state.md, components/full-page-loader.md, components/notification-banner.md, … | foundations/color.md, foundations/motion.md |
155
- | `docs-maintenance` | `form` | ai/generation-principles.md, ai/review-loop.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, decisions/radio-vs-select-vs-checkbox.md, patterns/address-capture.md, patterns/calendar-scheduling.md, patterns/form-composition.md, patterns/forms.md, patterns/media-upload.md, patterns/phone-and-currency.md, patterns/validation-forms.md | components/avatar-upload.md, components/button.md, components/checkbox.md, components/custom-selection.md, … | foundations/color.md, foundations/spacing.md, foundations/tokens.md, foundations/typography.md |
156
- | `docs-maintenance` | `layout` | ai/generation-principles.md, ai/review-loop.md | patterns/sticky-chrome.md | components/accordion.md, components/card-container.md, components/collapsible.md, components/floating-action-bar.md, … | foundations/spacing.md, foundations/typography.md |
157
- | `docs-maintenance` | `list-selection` | ai/generation-principles.md, ai/review-loop.md | patterns/list-selection.md | components/catalog-browser.md, components/checkbox.md, components/custom-selection.md, components/list-menu.md, … | foundations/spacing.md, foundations/typography.md |
158
- | `docs-maintenance` | `loading-states` | ai/generation-principles.md, ai/review-loop.md | patterns/loading-skeletons.md | components/button.md, components/card-list.md, components/full-page-loader.md, components/skeleton.md, … | foundations/color.md, foundations/motion.md |
159
- | `docs-maintenance` | `modal-navigation` | ai/generation-principles.md, ai/review-loop.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, patterns/modal-routing.md | components/back-link.md, components/button.md, components/confirmation-modal.md, components/link.md, … | foundations/motion.md, foundations/spacing.md, foundations/z-index.md |
160
- | `docs-maintenance` | `navigation` | ai/generation-principles.md, ai/review-loop.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, patterns/navigation-pressable.md | components/back-link.md, components/link.md, components/list-menu.md, components/list-menu-action.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
161
- | `docs-maintenance` | `overlay-stack` | ai/generation-principles.md, ai/review-loop.md | patterns/overlay-stack.md | components/confirmation-modal.md, components/full-page-loader.md, components/modal.md, components/overlay.md, … | foundations/shadows.md, foundations/z-index.md |
162
- | `docs-maintenance` | `wizard` | ai/generation-principles.md, ai/review-loop.md | patterns/wizard-flows.md | components/button.md, components/confirmation-modal.md, components/form-section.md, components/wizard-stepper.md | foundations/spacing.md, foundations/typography.md |
163
- | `interactive-prototype` | `button-action` | ai/generation-principles.md, ai/interactive-prototypes.md | decisions/action-hierarchy.md, decisions/button-vs-link.md | components/app-pressable.md, components/button.md, components/button-group.md, components/close-button.md, … | foundations/color.md, foundations/motion.md, foundations/radius.md, foundations/shadows.md, foundations/spacing.md |
164
- | `interactive-prototype` | `choice-input` | ai/generation-principles.md, ai/interactive-prototypes.md | decisions/radio-vs-select-vs-checkbox.md, patterns/forms.md | components/checkbox.md, components/custom-selection.md, components/input.md, components/radio.md, … | foundations/spacing.md, foundations/typography.md |
165
- | `interactive-prototype` | `component-docs` | ai/generation-principles.md, ai/interactive-prototypes.md | ai/generation-principles.md, ai/review-loop.md | components/accordion.md, components/app-pressable.md, components/avatar.md, components/avatar-upload.md, … | foundations/border-width.md, foundations/shadows.md, foundations/tokens.md, foundations/z-index.md |
166
- | `interactive-prototype` | `data-display` | ai/generation-principles.md, ai/interactive-prototypes.md | patterns/search-highlight.md | components/avatar.md, components/badge.md, components/calendar.md, components/card-list.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
167
- | `interactive-prototype` | `data-table` | ai/generation-principles.md, ai/interactive-prototypes.md | patterns/search-highlight.md, patterns/table-filters.md | components/catalog-browser.md, components/date-input.md, components/empty-state.md, components/highlight-text.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
168
- | `interactive-prototype` | `feedback-loading` | ai/generation-principles.md, ai/interactive-prototypes.md | patterns/empty-status-flow.md | components/empty-records-mobile.md, components/empty-state.md, components/full-page-loader.md, components/notification-banner.md, … | foundations/color.md, foundations/motion.md |
169
- | `interactive-prototype` | `form` | ai/generation-principles.md, ai/interactive-prototypes.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, decisions/radio-vs-select-vs-checkbox.md, patterns/address-capture.md, patterns/calendar-scheduling.md, patterns/form-composition.md, patterns/forms.md, patterns/media-upload.md, patterns/phone-and-currency.md, patterns/validation-forms.md | components/avatar-upload.md, components/button.md, components/checkbox.md, components/custom-selection.md, … | foundations/color.md, foundations/spacing.md, foundations/tokens.md, foundations/typography.md |
170
- | `interactive-prototype` | `layout` | ai/generation-principles.md, ai/interactive-prototypes.md | patterns/sticky-chrome.md | components/accordion.md, components/card-container.md, components/collapsible.md, components/floating-action-bar.md, … | foundations/spacing.md, foundations/typography.md |
171
- | `interactive-prototype` | `list-selection` | ai/generation-principles.md, ai/interactive-prototypes.md | patterns/list-selection.md | components/catalog-browser.md, components/checkbox.md, components/custom-selection.md, components/list-menu.md, … | foundations/spacing.md, foundations/typography.md |
172
- | `interactive-prototype` | `loading-states` | ai/generation-principles.md, ai/interactive-prototypes.md | patterns/loading-skeletons.md | components/button.md, components/card-list.md, components/full-page-loader.md, components/skeleton.md, … | foundations/color.md, foundations/motion.md |
173
- | `interactive-prototype` | `modal-navigation` | ai/generation-principles.md, ai/interactive-prototypes.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, patterns/modal-routing.md | components/back-link.md, components/button.md, components/confirmation-modal.md, components/link.md, … | foundations/motion.md, foundations/spacing.md, foundations/z-index.md |
174
- | `interactive-prototype` | `navigation` | ai/generation-principles.md, ai/interactive-prototypes.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, patterns/navigation-pressable.md | components/back-link.md, components/link.md, components/list-menu.md, components/list-menu-action.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
175
- | `interactive-prototype` | `overlay-stack` | ai/generation-principles.md, ai/interactive-prototypes.md | patterns/overlay-stack.md | components/confirmation-modal.md, components/full-page-loader.md, components/modal.md, components/overlay.md, … | foundations/shadows.md, foundations/z-index.md |
176
- | `interactive-prototype` | `wizard` | ai/generation-principles.md, ai/interactive-prototypes.md | patterns/wizard-flows.md | components/button.md, components/confirmation-modal.md, components/form-section.md, components/wizard-stepper.md | foundations/spacing.md, foundations/typography.md |
177
- | `static-ui-idea` | `button-action` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | decisions/action-hierarchy.md, decisions/button-vs-link.md | components/app-pressable.md, components/button.md, components/button-group.md, components/close-button.md, … | foundations/color.md, foundations/motion.md, foundations/radius.md, foundations/shadows.md, foundations/spacing.md |
178
- | `static-ui-idea` | `choice-input` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | decisions/radio-vs-select-vs-checkbox.md, patterns/forms.md | components/checkbox.md, components/custom-selection.md, components/input.md, components/radio.md, … | foundations/spacing.md, foundations/typography.md |
179
- | `static-ui-idea` | `component-docs` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | ai/generation-principles.md, ai/review-loop.md | components/accordion.md, components/app-pressable.md, components/avatar.md, components/avatar-upload.md, … | foundations/border-width.md, foundations/shadows.md, foundations/tokens.md, foundations/z-index.md |
180
- | `static-ui-idea` | `data-display` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | patterns/search-highlight.md | components/avatar.md, components/badge.md, components/calendar.md, components/card-list.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
181
- | `static-ui-idea` | `data-table` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | patterns/search-highlight.md, patterns/table-filters.md | components/catalog-browser.md, components/date-input.md, components/empty-state.md, components/highlight-text.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
182
- | `static-ui-idea` | `feedback-loading` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | patterns/empty-status-flow.md | components/empty-records-mobile.md, components/empty-state.md, components/full-page-loader.md, components/notification-banner.md, … | foundations/color.md, foundations/motion.md |
183
- | `static-ui-idea` | `form` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, decisions/radio-vs-select-vs-checkbox.md, patterns/address-capture.md, patterns/calendar-scheduling.md, patterns/form-composition.md, patterns/forms.md, patterns/media-upload.md, patterns/phone-and-currency.md, patterns/validation-forms.md | components/avatar-upload.md, components/button.md, components/checkbox.md, components/custom-selection.md, … | foundations/color.md, foundations/spacing.md, foundations/tokens.md, foundations/typography.md |
184
- | `static-ui-idea` | `layout` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | patterns/sticky-chrome.md | components/accordion.md, components/card-container.md, components/collapsible.md, components/floating-action-bar.md, … | foundations/spacing.md, foundations/typography.md |
185
- | `static-ui-idea` | `list-selection` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | patterns/list-selection.md | components/catalog-browser.md, components/checkbox.md, components/custom-selection.md, components/list-menu.md, … | foundations/spacing.md, foundations/typography.md |
186
- | `static-ui-idea` | `loading-states` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | patterns/loading-skeletons.md | components/button.md, components/card-list.md, components/full-page-loader.md, components/skeleton.md, … | foundations/color.md, foundations/motion.md |
187
- | `static-ui-idea` | `modal-navigation` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, patterns/modal-routing.md | components/back-link.md, components/button.md, components/confirmation-modal.md, components/link.md, … | foundations/motion.md, foundations/spacing.md, foundations/z-index.md |
188
- | `static-ui-idea` | `navigation` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, patterns/navigation-pressable.md | components/back-link.md, components/link.md, components/list-menu.md, components/list-menu-action.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
189
- | `static-ui-idea` | `overlay-stack` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | patterns/overlay-stack.md | components/confirmation-modal.md, components/full-page-loader.md, components/modal.md, components/overlay.md, … | foundations/shadows.md, foundations/z-index.md |
190
- | `static-ui-idea` | `wizard` | ai/generation-principles.md, ai/static-ui-ideas.md, docs/VISUAL-REFERENCES.md | patterns/wizard-flows.md | components/button.md, components/confirmation-modal.md, components/form-section.md, components/wizard-stepper.md | foundations/spacing.md, foundations/typography.md |
191
- | `storybook-docs` | `button-action` | ai/generation-principles.md | decisions/action-hierarchy.md, decisions/button-vs-link.md | components/app-pressable.md, components/button.md, components/button-group.md, components/close-button.md, … | foundations/color.md, foundations/motion.md, foundations/radius.md, foundations/shadows.md, foundations/spacing.md |
192
- | `storybook-docs` | `choice-input` | ai/generation-principles.md | decisions/radio-vs-select-vs-checkbox.md, patterns/forms.md | components/checkbox.md, components/custom-selection.md, components/input.md, components/radio.md, … | foundations/spacing.md, foundations/typography.md |
193
- | `storybook-docs` | `component-docs` | ai/generation-principles.md | ai/generation-principles.md, ai/review-loop.md | components/accordion.md, components/app-pressable.md, components/avatar.md, components/avatar-upload.md, … | foundations/border-width.md, foundations/shadows.md, foundations/tokens.md, foundations/z-index.md |
194
- | `storybook-docs` | `data-display` | ai/generation-principles.md | patterns/search-highlight.md | components/avatar.md, components/badge.md, components/calendar.md, components/card-list.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
195
- | `storybook-docs` | `data-table` | ai/generation-principles.md | patterns/search-highlight.md, patterns/table-filters.md | components/catalog-browser.md, components/date-input.md, components/empty-state.md, components/highlight-text.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
196
- | `storybook-docs` | `feedback-loading` | ai/generation-principles.md | patterns/empty-status-flow.md | components/empty-records-mobile.md, components/empty-state.md, components/full-page-loader.md, components/notification-banner.md, … | foundations/color.md, foundations/motion.md |
197
- | `storybook-docs` | `form` | ai/generation-principles.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, decisions/radio-vs-select-vs-checkbox.md, patterns/address-capture.md, patterns/calendar-scheduling.md, patterns/form-composition.md, patterns/forms.md, patterns/media-upload.md, patterns/phone-and-currency.md, patterns/validation-forms.md | components/avatar-upload.md, components/button.md, components/checkbox.md, components/custom-selection.md, … | foundations/color.md, foundations/spacing.md, foundations/tokens.md, foundations/typography.md |
198
- | `storybook-docs` | `layout` | ai/generation-principles.md | patterns/sticky-chrome.md | components/accordion.md, components/card-container.md, components/collapsible.md, components/floating-action-bar.md, … | foundations/spacing.md, foundations/typography.md |
199
- | `storybook-docs` | `list-selection` | ai/generation-principles.md | patterns/list-selection.md | components/catalog-browser.md, components/checkbox.md, components/custom-selection.md, components/list-menu.md, … | foundations/spacing.md, foundations/typography.md |
200
- | `storybook-docs` | `loading-states` | ai/generation-principles.md | patterns/loading-skeletons.md | components/button.md, components/card-list.md, components/full-page-loader.md, components/skeleton.md, … | foundations/color.md, foundations/motion.md |
201
- | `storybook-docs` | `modal-navigation` | ai/generation-principles.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, patterns/modal-routing.md | components/back-link.md, components/button.md, components/confirmation-modal.md, components/link.md, … | foundations/motion.md, foundations/spacing.md, foundations/z-index.md |
202
- | `storybook-docs` | `navigation` | ai/generation-principles.md | decisions/action-hierarchy.md, decisions/button-vs-link.md, patterns/navigation-pressable.md | components/back-link.md, components/link.md, components/list-menu.md, components/list-menu-action.md, … | foundations/color.md, foundations/spacing.md, foundations/typography.md |
203
- | `storybook-docs` | `overlay-stack` | ai/generation-principles.md | patterns/overlay-stack.md | components/confirmation-modal.md, components/full-page-loader.md, components/modal.md, components/overlay.md, … | foundations/shadows.md, foundations/z-index.md |
204
- | `storybook-docs` | `wizard` | ai/generation-principles.md | patterns/wizard-flows.md | components/button.md, components/confirmation-modal.md, components/form-section.md, components/wizard-stepper.md | foundations/spacing.md, foundations/typography.md |
205
-
206
- ## Source docs
207
-
208
- - `.idia/brain/registry/ai-index.generated.json`
209
- - `docs/RETRIEVAL-CONTRACT.md`
@@ -1,32 +0,0 @@
1
- ---
2
- name: button
3
- description: Worked example per-component skill for Button. Operational API guidance extracted from the brain component doc.
4
- generated: true
5
- sources:
6
- - ds-brain/components/button.md
7
- ---
8
- # Button — Component Skill
9
-
10
- Per-component worked example. Retrieve `components/button.md` for full mappings and behaviour; this skill summarizes AI-safe usage.
11
-
12
- ## Operational guidance
13
-
14
- - Use `Button` for actions, not normal navigation.
15
- - Use one `primary` variant per local action group.
16
- - Use `primary` for the main submit/continue/save action.
17
- - Use `outline-grey` for cancel in form and modal footers; `secondary` for back on wizard steps.
18
- - Use `danger` or `danger-outline` for destructive delete/remove actions.
19
- - Document all eight variants and five sizes — do not invent variants or sizes.
20
- - For icon-only buttons, include `ariaLabel`.
21
- - Mention `aria-busy` and disabled semantics for loading states.
22
- - Reference semantic `colorTheme` tokens (for example `backgroundPrimaryBold200`, `borderNeutralBold100`, `borderDangerBold100`) instead of hardcoded colors.
23
- - If Figma mapping is needed, treat it as incomplete until explicitly mapped.
24
-
25
- ## Related decisions
26
-
27
- - `decisions/action-hierarchy.md`
28
- - `decisions/button-vs-link.md`
29
-
30
- ## Source docs
31
-
32
- - `components/button.md`