create-idia-app 0.2.0 → 0.2.2

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 (72) hide show
  1. package/README.md +47 -53
  2. package/dist/index.js +6 -4
  3. package/dist/index.js.map +1 -1
  4. package/package.json +1 -1
  5. package/template/package.json +2 -11
  6. package/template/src/providers/AppProviders.tsx +33 -3
  7. package/template/.cursor/rules/idia-ui-ds-brain.mdc +0 -32
  8. package/template/.cursor/rules/idia-ui-forms.mdc +0 -34
  9. package/template/.cursor/rules/idia-ui-overlays.mdc +0 -23
  10. package/template/.idia/brain/AGENTS.md +0 -37
  11. package/template/.idia/brain/ai/agents/retrieval-cheatsheet.md +0 -209
  12. package/template/.idia/brain/ai/skills/components/button/SKILL.md +0 -32
  13. package/template/.idia/brain/ai/skills/ds-brain-action-hierarchy/SKILL.md +0 -46
  14. package/template/.idia/brain/ai/skills/ds-brain-forms/SKILL.md +0 -67
  15. package/template/.idia/brain/ai/skills/ds-brain-index/SKILL.md +0 -76
  16. package/template/.idia/brain/ai/skills/ds-brain-overlays/SKILL.md +0 -30
  17. package/template/.idia/brain/ai/skills/ds-brain-retrieval/SKILL.md +0 -54
  18. package/template/.idia/brain/registry/ai-index.generated.json +0 -833
  19. package/template/.idia/brain/registry/component-registry.generated.json +0 -2947
  20. package/template/.idia/manifest.json +0 -17
  21. package/template/.storybook/main.ts +0 -9
  22. package/template/.storybook/preview.tsx +0 -20
  23. package/template/AGENTS.md +0 -11
  24. package/template/src/stories/Button.stories.tsx +0 -31
  25. package/template/storybook-static/assets/Button.stories-CfapbH7U.js +0 -196
  26. package/template/storybook-static/assets/Color-F6OSRLHC-CFwL-RM_.js +0 -1
  27. package/template/storybook-static/assets/DocsRenderer-CFRXHY34-AADCayzw.js +0 -729
  28. package/template/storybook-static/assets/_commonjsHelpers-Cpj98o6Y.js +0 -1
  29. package/template/storybook-static/assets/axe-d-K7rF9D.js +0 -30
  30. package/template/storybook-static/assets/chunk-XP5HYGXS-BHXC9YeQ.js +0 -1
  31. package/template/storybook-static/assets/client-DGEjZp2f.js +0 -25
  32. package/template/storybook-static/assets/entry-preview-Dc5wkB2s.js +0 -2
  33. package/template/storybook-static/assets/entry-preview-docs-BaxqCxyK.js +0 -46
  34. package/template/storybook-static/assets/iframe-Bl15XKnQ.js +0 -211
  35. package/template/storybook-static/assets/index-Bhelpi4i.js +0 -11
  36. package/template/storybook-static/assets/index-C_pJYAGD.js +0 -1
  37. package/template/storybook-static/assets/index-D5Inswos.js +0 -1
  38. package/template/storybook-static/assets/index-NGyRR_en.js +0 -9
  39. package/template/storybook-static/assets/index-zmTGQa7e.js +0 -9
  40. package/template/storybook-static/assets/jsx-runtime-BjG_zV1W.js +0 -9
  41. package/template/storybook-static/assets/preview-BNUqaTig.js +0 -1
  42. package/template/storybook-static/assets/preview-Cfo7ZnTc.js +0 -2
  43. package/template/storybook-static/assets/preview-CrKLV1aL.css +0 -1
  44. package/template/storybook-static/assets/preview-DkVJIpDn.js +0 -2
  45. package/template/storybook-static/assets/preview-DrRsTNnS.js +0 -17
  46. package/template/storybook-static/assets/react-18-Bfhi6ooJ.js +0 -1
  47. package/template/storybook-static/assets/react-FmFgRqLi.js +0 -1
  48. package/template/storybook-static/assets/react-native-gesture-handler-BzS7UzhZ.js +0 -52
  49. package/template/storybook-static/assets/test-utils-X4YdDMST.js +0 -9
  50. package/template/storybook-static/favicon.svg +0 -1
  51. package/template/storybook-static/fonts/Inter.ttf +0 -0
  52. package/template/storybook-static/fonts/NunitoSans.woff2 +0 -0
  53. package/template/storybook-static/iframe.html +0 -668
  54. package/template/storybook-static/index.html +0 -145
  55. package/template/storybook-static/index.json +0 -1
  56. package/template/storybook-static/nunito-sans-bold-italic.woff2 +0 -0
  57. package/template/storybook-static/nunito-sans-bold.woff2 +0 -0
  58. package/template/storybook-static/nunito-sans-italic.woff2 +0 -0
  59. package/template/storybook-static/nunito-sans-regular.woff2 +0 -0
  60. package/template/storybook-static/project.json +0 -1
  61. package/template/storybook-static/sb-addons/a11y-2/manager-bundle.js +0 -3
  62. package/template/storybook-static/sb-addons/links-1/manager-bundle.js +0 -3
  63. package/template/storybook-static/sb-addons/storybook-core-core-server-presets-0/common-manager-bundle.js +0 -3
  64. package/template/storybook-static/sb-common-assets/favicon.svg +0 -1
  65. package/template/storybook-static/sb-common-assets/nunito-sans-bold-italic.woff2 +0 -0
  66. package/template/storybook-static/sb-common-assets/nunito-sans-bold.woff2 +0 -0
  67. package/template/storybook-static/sb-common-assets/nunito-sans-italic.woff2 +0 -0
  68. package/template/storybook-static/sb-common-assets/nunito-sans-regular.woff2 +0 -0
  69. package/template/storybook-static/sb-manager/globals-module-info.js +0 -1052
  70. package/template/storybook-static/sb-manager/globals-runtime.js +0 -41775
  71. package/template/storybook-static/sb-manager/globals.js +0 -48
  72. package/template/storybook-static/sb-manager/runtime.js +0 -12048
package/README.md CHANGED
@@ -2,32 +2,31 @@
2
2
 
3
3
  Scaffold an Expo + React Navigation consumer app with `@idia-ui/core` and `@idia-ui/theme`.
4
4
 
5
- **Track C Phase 2a** local monorepo build only; not published to npm until Phase 5.
5
+ Published on npm as **`create-idia-app`** (Track C Phase 5).
6
6
 
7
- ## Build
8
-
9
- From repo root:
7
+ ## Quick start (npm)
10
8
 
11
9
  ```bash
12
- pnpm --filter create-idia-app build
10
+ npx create-idia-app@latest my-app
11
+ cd my-app
12
+ pnpm dev
13
+ pnpm exec idia-ui doctor
14
+ pnpm exec idia-ui add storybook
15
+ pnpm run build-storybook
13
16
  ```
14
17
 
15
- `prebuild` copies `templates/consumer-app/` into `packages/create-idia-app/template/`. Refresh the source template first when the sandbox changes:
18
+ ## Build (monorepo)
19
+
20
+ From repo root:
16
21
 
17
22
  ```bash
18
23
  node scripts/sync-consumer-template.mjs
19
24
  pnpm --filter create-idia-app build
20
25
  ```
21
26
 
22
- ## Local usage
27
+ `prebuild` copies `templates/consumer-app/` into `packages/create-idia-app/template/`.
23
28
 
24
- ```bash
25
- node packages/create-idia-app/dist/index.js my-app
26
- # or
27
- pnpm --filter create-idia-app exec create-idia-app my-app
28
- ```
29
-
30
- ### Flags
29
+ ## Flags
31
30
 
32
31
  | Flag | Behavior |
33
32
  |------|----------|
@@ -35,70 +34,65 @@ pnpm --filter create-idia-app exec create-idia-app my-app
35
34
  | `--skip-install` | Skip install + doctor |
36
35
  | `--force` | Overwrite existing directory |
37
36
  | `--no-git` | Skip `git init` |
38
- | `--with-storybook` | Warn only Phase 3 |
39
- | `--with-brain` | Warn only Phase 4 |
40
-
41
- ## E2E outside monorepo (pre–Phase 5)
37
+ | `--with-storybook` | Run `idia-ui add storybook` after install |
38
+ | `--with-brain` | Run `idia-ui add brain` after install (Tier 1G experimental) |
42
39
 
43
- `@idia-ui/*` is **not** on public npm at `0.2.0` yet. External e2e uses packed tarballs + `file:` overrides (same procedure as Phase 0.5 / 1a).
40
+ ## Pure npm e2e (post–Phase 5)
44
41
 
45
- ### 1. Build runtime packages + CLI
42
+ No tarball overrides uses public registry only.
46
43
 
47
- ```bash
48
- # repo root
49
- pnpm --filter @idia-ui/tokens build
50
- pnpm --filter @idia-ui/theme build
51
- pnpm --filter @idia-ui/core build
52
- pnpm --filter @idia-ui/hooks build
53
- pnpm --filter @idia-ui/motion build
54
- pnpm --filter @idia-ui/utils build
55
- pnpm --filter @idia-ui/validators build
56
- pnpm --filter @idia-ui/cli build
57
- pnpm --filter create-idia-app build
44
+ ```powershell
45
+ cd $env:TEMP
46
+ npx create-idia-app@latest my-e2e-app --pm pnpm
47
+ cd my-e2e-app
48
+ pnpm install
49
+ pnpm exec idia-ui doctor
50
+ pnpm exec idia-ui add storybook
51
+ pnpm run build-storybook
52
+ # Verify button docs fragment in static output:
53
+ Select-String -Path storybook-static\**\*.js -Pattern "triggers an action" -List
58
54
  ```
59
55
 
60
- ### 2. Pack tarballs
56
+ Expected: doctor exit 0; `add storybook` exit 0; `build-storybook` exit 0; grep finds Button story prose.
61
57
 
62
- ```bash
63
- OUT_DIR=C:\Users\Ojanti\Desktop\Projects_\idia-ui-pack-tarballs
64
- mkdir %OUT_DIR%
65
- cd packages/tokens && pnpm pack --pack-destination %OUT_DIR%
66
- # repeat for theme, core, hooks, motion, utils, validators, cli
67
- ```
58
+ ## Late-install fixture (RFC §26.3 row 4)
68
59
 
69
- ### 3. Scaffold outside monorepo
60
+ Proves Storybook add-on on an **aged** scaffold (not `--with-storybook` at create time).
70
61
 
71
62
  ```powershell
72
63
  cd $env:TEMP
73
- node C:\Users\Ojanti\Desktop\Projects_\idia-ui\packages\create-idia-app\dist\index.js my-cli-test --skip-install
74
- cd my-cli-test
64
+ npx create-idia-app@latest my-late-storybook --pm pnpm
65
+ cd my-late-storybook
66
+ pnpm install
67
+ pnpm exec idia-ui doctor
68
+ # Do NOT add storybook yet — simulate aged project (optional: wait or pin older @idia-ui/core patch)
69
+ pnpm exec idia-ui add storybook
70
+ pnpm run build-storybook
71
+ Select-String -Path storybook-static\**\*.js -Pattern "triggers an action" -List
75
72
  ```
76
73
 
77
- ### 4. Apply `file:` overrides
74
+ Use a **runtime-only** scaffold (`create-idia-app@0.2.1+` without pre-polluted `.storybook/`). If the template already contains Storybook artifacts, `add storybook` idempotently skips — use a fresh scaffold or remove `.storybook/` and storybook devDeps first.
78
75
 
79
- In generated `package.json`, replace semver `@idia-ui/*` and `@idia-ui/cli` with `file:<tarball>` paths. Add matching `pnpm.overrides` for all `@idia-ui/*` packages (transitive graph).
76
+ ## Maintainer e2e (pre-publish tarballs)
80
77
 
81
- ### 5. Install, doctor, dev
78
+ When testing unpublished CLI changes inside the monorepo:
82
79
 
83
80
  ```bash
84
- pnpm install
85
- pnpm exec idia-ui doctor
86
- pnpm dev
87
- # or non-interactive smoke:
88
- npx expo export --platform web
81
+ pnpm --filter @idia-ui/cli build
82
+ pnpm --filter create-idia-app build
83
+ node packages/create-idia-app/dist/index.js my-cli-test --skip-install
89
84
  ```
90
85
 
91
- When developing **inside** the monorepo, `create-idia-app` auto-detects `packages/cli/dist/cli.js` and runs doctor via the sibling CLI build (no npm install of `@idia-ui/cli` required for doctor during maintainer smoke).
86
+ `create-idia-app` auto-detects `packages/cli/dist/cli.js` for doctor during monorepo smoke (no npm install of `@idia-ui/cli` required).
92
87
 
93
88
  ## Generated app contract
94
89
 
95
90
  - `package.json` name + `@idia-ui/*` pinned to `^0.2.0`
91
+ - `@idia-ui/cli` in `devDependencies` at `^0.2.2`
96
92
  - `app.json` name / slug / scheme renamed from `my-idia-app`
97
- - `src/navigation/linking.ts` URL prefixes updated
98
93
  - `.idia/manifest.json` stub with `idiaCli` + `core` versions
99
- - `@idia-ui/cli` added to `devDependencies`
100
94
  - Post-install: `idia-ui doctor` (non-strict) unless `--skip-install`
101
95
 
102
96
  ## Version coupling
103
97
 
104
- `create-idia-app@0.2.x` generates apps targeting `@idia-ui/core@0.2.x` and `@idia-ui/cli@0.2.x`.
98
+ `create-idia-app@0.2.x` generates apps targeting `@idia-ui/core@0.2.x` and `@idia-ui/cli@^0.2.2`.
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.2";
16
+ var CLI_VERSION = "0.2.3";
17
17
  var TEMPLATE_SLUG = "my-idia-app";
18
18
 
19
19
  // src/replace.ts
@@ -176,15 +176,17 @@ function resolveTemplateDir() {
176
176
  );
177
177
  }
178
178
  function runCommand(command, args, cwd) {
179
+ const isWin = process.platform === "win32";
179
180
  const result = (0, import_node_child_process.spawnSync)(command, args, {
180
181
  cwd,
181
182
  stdio: "inherit",
182
- shell: process.platform === "win32"
183
+ shell: isWin,
184
+ windowsHide: isWin
183
185
  });
184
186
  if (result.error) {
185
187
  return { status: result.status, error: result.error };
186
188
  }
187
- return { status: result.status };
189
+ return { status: result.status ?? 0 };
188
190
  }
189
191
  function scaffold(options) {
190
192
  const projectName = validateProjectName(options.projectName);
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 isWin = process.platform === 'win32'\r\n const result = spawnSync(command, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: isWin,\r\n windowsHide: isWin,\r\n })\r\n if (result.error) {\r\n return { status: result.status, error: result.error }\r\n }\r\n return { status: result.status ?? 0 }\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.2'\r\n\r\n/** @idia-ui/cli version written to manifest + devDependency. */\r\nexport const CLI_VERSION = '0.2.3'\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.2",
4
4
  "description": "Scaffold an Expo + idia-ui consumer app from the official template",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -54,13 +54,7 @@
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",
57
+ "@storybook/react": "^8.4.7",
64
58
  "@tamagui/babel-plugin": "^1.144.4",
65
59
  "@types/react": "^19.0.0",
66
60
  "babel-plugin-module-resolver": "^5.0.2",
@@ -77,9 +71,6 @@
77
71
  "metro-transform-plugins": "0.82.5",
78
72
  "metro-transform-worker": "0.82.5",
79
73
  "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"
74
+ "typescript": "^5.9.3"
84
75
  }
85
76
  }
@@ -1,19 +1,47 @@
1
+ import { NavigationProvider, type RouteTarget } from '@idia-ui/core'
1
2
  import { ThemeProvider, useColorMode, waitForWebFonts } from '@idia-ui/theme'
2
- import { NavigationContainer } from '@react-navigation/native'
3
- import React, { useEffect, useState } from 'react'
3
+ import {
4
+ createNavigationContainerRef,
5
+ NavigationContainer,
6
+ } from '@react-navigation/native'
7
+ import React, { useCallback, useEffect, useState } from 'react'
4
8
  import { StyleSheet } from 'react-native'
5
9
  import { GestureHandlerRootView } from 'react-native-gesture-handler'
6
10
  import { SafeAreaProvider } from 'react-native-safe-area-context'
7
11
  import { TamaguiProvider, Theme } from 'tamagui'
8
12
 
9
13
  import { linking } from '@/navigation/linking'
14
+ import type { RootStackParamList } from '@/navigation/types'
10
15
  import tamaguiConfig from '../../tamagui.config'
11
16
 
17
+ const navigationRef = createNavigationContainerRef<RootStackParamList>()
18
+
12
19
  function TamaguiThemeSync({ children }: { children: React.ReactNode }) {
13
20
  const { colorMode } = useColorMode()
14
21
  return <Theme name={colorMode}>{children}</Theme>
15
22
  }
16
23
 
24
+ function navigateFromTarget(target: string | RouteTarget): void {
25
+ if (!navigationRef.isReady()) return
26
+ const nav = navigationRef.navigate as unknown as (
27
+ name: string,
28
+ params?: Record<string, unknown>,
29
+ ) => void
30
+ if (typeof target === 'string') {
31
+ nav(target)
32
+ return
33
+ }
34
+ nav(target.pathname, target.params)
35
+ }
36
+
37
+ function IdiaNavigationBridge({ children }: { children: React.ReactNode }) {
38
+ const navigate = useCallback((target: string | RouteTarget) => {
39
+ navigateFromTarget(target)
40
+ }, [])
41
+
42
+ return <NavigationProvider navigate={navigate}>{children}</NavigationProvider>
43
+ }
44
+
17
45
  export function AppProviders({ children }: { children: React.ReactNode }) {
18
46
  const [fontsReady, setFontsReady] = useState(false)
19
47
 
@@ -31,7 +59,9 @@ export function AppProviders({ children }: { children: React.ReactNode }) {
31
59
  <ThemeProvider defaultColorMode="system">
32
60
  <TamaguiThemeSync>
33
61
  <SafeAreaProvider>
34
- <NavigationContainer linking={linking}>{children}</NavigationContainer>
62
+ <NavigationContainer ref={navigationRef} linking={linking}>
63
+ <IdiaNavigationBridge>{children}</IdiaNavigationBridge>
64
+ </NavigationContainer>
35
65
  </SafeAreaProvider>
36
66
  </TamaguiThemeSync>
37
67
  </ThemeProvider>
@@ -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.