create-vasvibe 2.4.0 → 2.5.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 (286) hide show
  1. package/README.md +170 -167
  2. package/bin/cli.mjs +9 -9
  3. package/package.json +45 -45
  4. package/src/git.mjs +47 -47
  5. package/src/index.mjs +228 -228
  6. package/src/prompts.mjs +113 -113
  7. package/src/scaffold.mjs +74 -74
  8. package/src/upgrade.mjs +121 -121
  9. package/src/utils.mjs +91 -91
  10. package/template/.agents/agents/analyst/agent.json +43 -43
  11. package/template/.agents/agents/backend/agent.json +44 -44
  12. package/template/.agents/agents/data-architect/agent.json +43 -43
  13. package/template/.agents/agents/devops/agent.json +44 -44
  14. package/template/.agents/agents/discovery/agent.json +43 -43
  15. package/template/.agents/agents/document/agent.json +43 -43
  16. package/template/.agents/agents/explorer/agent.json +43 -43
  17. package/template/.agents/agents/fixer/agent.json +44 -44
  18. package/template/.agents/agents/frontend/agent.json +44 -44
  19. package/template/.agents/agents/fullstack/agent.json +44 -44
  20. package/template/.agents/agents/initiator/agent.json +41 -41
  21. package/template/.agents/agents/logger/agent.json +43 -43
  22. package/template/.agents/agents/manual-tester/agent.json +44 -0
  23. package/template/.agents/agents/orchestrator/agent.json +44 -44
  24. package/template/.agents/agents/pm/agent.json +42 -42
  25. package/template/.agents/agents/qa/agent.json +44 -44
  26. package/template/.agents/agents/reliability/agent.json +44 -44
  27. package/template/.agents/agents/security/agent.json +44 -44
  28. package/template/.agents/agents/sysarch/agent.json +44 -44
  29. package/template/.agents/agents/tester/agent.json +44 -44
  30. package/template/.agents/agents/toolsmith/agent.json +44 -44
  31. package/template/.agents/agents/ux-designer/agent.json +43 -43
  32. package/template/.agents/skills/find-skills/SKILL.md +142 -142
  33. package/template/.agents/skills/fullstack/SKILL.md +89 -89
  34. package/template/.agents/skills/penetration-testing/SKILL.md +94 -94
  35. package/template/.agents/skills/penetration-testing/references/automated-penetration-testing-framework.md +328 -328
  36. package/template/.agents/skills/penetration-testing/references/burp-suite-automation-script.md +135 -135
  37. package/template/.agents/skills/penetration-testing/scripts/security-checklist.sh +30 -30
  38. package/template/.agents/skills/pm/SKILL.md +170 -170
  39. package/template/.agents/skills/ui-ux-pro-max/SKILL.md +658 -658
  40. package/template/.agents/skills/ui-ux-pro-max/data/_sync_all.py +414 -414
  41. package/template/.agents/skills/ui-ux-pro-max/data/app-interface.csv +30 -30
  42. package/template/.agents/skills/ui-ux-pro-max/data/design.csv +1775 -1775
  43. package/template/.agents/skills/ui-ux-pro-max/data/draft.csv +1778 -1778
  44. package/template/.agents/skills/ui-ux-pro-max/data/icons.csv +105 -105
  45. package/template/.agents/skills/ui-ux-pro-max/data/products.csv +162 -162
  46. package/template/.agents/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  47. package/template/.agents/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -51
  48. package/template/.agents/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  49. package/template/.agents/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  50. package/template/.agents/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  51. package/template/.agents/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  52. package/template/.agents/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -51
  53. package/template/.agents/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  54. package/template/.agents/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  55. package/template/.agents/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  56. package/template/.agents/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  57. package/template/.agents/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  58. package/template/.agents/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  59. package/template/.agents/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  60. package/template/.agents/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -54
  61. package/template/.agents/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  62. package/template/.agents/skills/ui-ux-pro-max/data/typography.csv +74 -74
  63. package/template/.agents/skills/ui-ux-pro-max/scripts/core.py +262 -262
  64. package/template/.agents/skills/ui-ux-pro-max/scripts/design_system.py +1148 -1148
  65. package/template/.agents/workflows/build-feature.md +21 -21
  66. package/template/.agents/workflows/build-prototype.md +32 -32
  67. package/template/.agents/workflows/daily-standup.md +16 -16
  68. package/template/.agents/workflows/deliver-feature.md +16 -16
  69. package/template/.agents/workflows/explorer.md +78 -78
  70. package/template/.agents/workflows/harden-release.md +21 -21
  71. package/template/.agents/workflows/logger.md +117 -117
  72. package/template/.agents/workflows/plan-feature.md +30 -30
  73. package/template/.agents/workflows/plan-project.md +25 -25
  74. package/template/.agents/workflows/release.md +18 -18
  75. package/template/.agents/workflows/security-audit.md +19 -19
  76. package/template/.agents/workflows/setup-workspace.md +21 -21
  77. package/template/.agents/workflows/start-fix.md +18 -18
  78. package/template/.agents/workflows/test-feature.md +17 -17
  79. package/template/.claude/agents/analyst.md +109 -109
  80. package/template/.claude/agents/backend.md +61 -61
  81. package/template/.claude/agents/data-architect.md +43 -43
  82. package/template/.claude/agents/devops.md +44 -43
  83. package/template/.claude/agents/discovery.md +51 -51
  84. package/template/.claude/agents/document.md +51 -51
  85. package/template/.claude/agents/explorer.md +138 -138
  86. package/template/.claude/agents/fixer.md +87 -86
  87. package/template/.claude/agents/frontend.md +65 -65
  88. package/template/.claude/agents/fullstack.md +91 -90
  89. package/template/.claude/agents/initiator.md +74 -74
  90. package/template/.claude/agents/logger.md +143 -143
  91. package/template/.claude/agents/manual-tester.md +108 -0
  92. package/template/.claude/agents/orchestrator.md +138 -137
  93. package/template/.claude/agents/pm.md +199 -199
  94. package/template/.claude/agents/qa.md +66 -65
  95. package/template/.claude/agents/reliability.md +48 -47
  96. package/template/.claude/agents/security.md +107 -106
  97. package/template/.claude/agents/sysarch.md +301 -301
  98. package/template/.claude/agents/tester.md +100 -100
  99. package/template/.claude/agents/toolsmith.md +77 -76
  100. package/template/.claude/agents/ux-designer.md +45 -45
  101. package/template/.claude/commands/build-feature.md +22 -22
  102. package/template/.claude/commands/build-prototype.md +33 -33
  103. package/template/.claude/commands/daily-standup.md +16 -16
  104. package/template/.claude/commands/deliver-feature.md +17 -17
  105. package/template/.claude/commands/harden-release.md +22 -22
  106. package/template/.claude/commands/manual-test.md +19 -0
  107. package/template/.claude/commands/plan-feature.md +31 -31
  108. package/template/.claude/commands/plan-project.md +26 -26
  109. package/template/.claude/commands/release.md +19 -19
  110. package/template/.claude/commands/security-audit.md +20 -20
  111. package/template/.claude/commands/setup-workspace.md +22 -22
  112. package/template/.claude/commands/start-fix.md +19 -19
  113. package/template/.claude/commands/test-feature.md +18 -18
  114. package/template/.claude/skills/find-skills/SKILL.md +142 -142
  115. package/template/.claude/skills/penetration-testing/SKILL.md +94 -94
  116. package/template/.claude/skills/penetration-testing/references/automated-penetration-testing-framework.md +328 -328
  117. package/template/.claude/skills/penetration-testing/references/burp-suite-automation-script.md +135 -135
  118. package/template/.claude/skills/penetration-testing/scripts/security-checklist.sh +30 -30
  119. package/template/.claude/skills/ui-ux-pro-max/SKILL.md +658 -658
  120. package/template/.claude/skills/ui-ux-pro-max/data/_sync_all.py +414 -414
  121. package/template/.claude/skills/ui-ux-pro-max/data/app-interface.csv +30 -30
  122. package/template/.claude/skills/ui-ux-pro-max/data/design.csv +1775 -1775
  123. package/template/.claude/skills/ui-ux-pro-max/data/draft.csv +1778 -1778
  124. package/template/.claude/skills/ui-ux-pro-max/data/icons.csv +105 -105
  125. package/template/.claude/skills/ui-ux-pro-max/data/products.csv +162 -162
  126. package/template/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  127. package/template/.claude/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -51
  128. package/template/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  129. package/template/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  130. package/template/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  131. package/template/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  132. package/template/.claude/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -51
  133. package/template/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  134. package/template/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  135. package/template/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  136. package/template/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  137. package/template/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  138. package/template/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  139. package/template/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  140. package/template/.claude/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -54
  141. package/template/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  142. package/template/.claude/skills/ui-ux-pro-max/data/typography.csv +74 -74
  143. package/template/.claude/skills/ui-ux-pro-max/scripts/core.py +262 -262
  144. package/template/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1148 -1148
  145. package/template/.github/prompts/analyst.prompt.md +104 -104
  146. package/template/.github/prompts/backend.prompt.md +44 -44
  147. package/template/.github/prompts/data-architect.prompt.md +38 -38
  148. package/template/.github/prompts/devops.prompt.md +32 -32
  149. package/template/.github/prompts/discovery.prompt.md +39 -39
  150. package/template/.github/prompts/document.prompt.md +14 -14
  151. package/template/.github/prompts/explorer.prompt.md +133 -133
  152. package/template/.github/prompts/fixer.prompt.md +82 -81
  153. package/template/.github/prompts/frontend.prompt.md +60 -60
  154. package/template/.github/prompts/fullstack.prompt.md +86 -86
  155. package/template/.github/prompts/initiator.prompt.md +55 -55
  156. package/template/.github/prompts/logger.prompt.md +138 -138
  157. package/template/.github/prompts/manual-tester.prompt.md +103 -0
  158. package/template/.github/prompts/orchestrator.prompt.md +133 -133
  159. package/template/.github/prompts/pm.prompt.md +186 -186
  160. package/template/.github/prompts/qa.prompt.md +57 -57
  161. package/template/.github/prompts/reliability.prompt.md +44 -44
  162. package/template/.github/prompts/security.prompt.md +41 -41
  163. package/template/.github/prompts/sysarch.prompt.md +351 -351
  164. package/template/.github/prompts/tester.prompt.md +107 -107
  165. package/template/.github/prompts/toolsmith.prompt.md +46 -46
  166. package/template/.github/prompts/ux-designer.prompt.md +41 -41
  167. package/template/.opencode/agents/analyst.md +108 -108
  168. package/template/.opencode/agents/backend.md +61 -61
  169. package/template/.opencode/agents/data-architect.md +43 -43
  170. package/template/.opencode/agents/devops.md +44 -44
  171. package/template/.opencode/agents/discovery.md +51 -51
  172. package/template/.opencode/agents/document.md +51 -51
  173. package/template/.opencode/agents/explorer.md +137 -137
  174. package/template/.opencode/agents/fixer.md +86 -85
  175. package/template/.opencode/agents/frontend.md +64 -64
  176. package/template/.opencode/agents/fullstack.md +90 -89
  177. package/template/.opencode/agents/initiator.md +74 -74
  178. package/template/.opencode/agents/logger.md +142 -142
  179. package/template/.opencode/agents/manual-tester.md +107 -0
  180. package/template/.opencode/agents/orchestrator.md +137 -133
  181. package/template/.opencode/agents/pm.md +199 -199
  182. package/template/.opencode/agents/qa.md +66 -65
  183. package/template/.opencode/agents/reliability.md +48 -48
  184. package/template/.opencode/agents/security.md +107 -107
  185. package/template/.opencode/agents/sysarch.md +301 -301
  186. package/template/.opencode/agents/tester.md +100 -100
  187. package/template/.opencode/agents/toolsmith.md +77 -77
  188. package/template/.opencode/agents/ux-designer.md +45 -45
  189. package/template/.opencode/commands/build-feature.md +21 -21
  190. package/template/.opencode/commands/build-prototype.md +32 -32
  191. package/template/.opencode/commands/daily-standup.md +16 -16
  192. package/template/.opencode/commands/deliver-feature.md +16 -16
  193. package/template/.opencode/commands/harden-release.md +21 -21
  194. package/template/.opencode/commands/manual-test.md +18 -0
  195. package/template/.opencode/commands/plan-feature.md +30 -30
  196. package/template/.opencode/commands/plan-project.md +25 -25
  197. package/template/.opencode/commands/release.md +18 -18
  198. package/template/.opencode/commands/security-audit.md +19 -19
  199. package/template/.opencode/commands/setup-workspace.md +21 -21
  200. package/template/.opencode/commands/start-fix.md +18 -18
  201. package/template/.opencode/commands/test-feature.md +17 -17
  202. package/template/.opencode/skills/penetration-testing/SKILL.md +94 -94
  203. package/template/.opencode/skills/penetration-testing/references/automated-penetration-testing-framework.md +328 -328
  204. package/template/.opencode/skills/penetration-testing/references/burp-suite-automation-script.md +135 -135
  205. package/template/.opencode/skills/penetration-testing/scripts/security-checklist.sh +30 -30
  206. package/template/.opencode/skills/ui-ux-pro-max/SKILL.md +658 -658
  207. package/template/.opencode/skills/ui-ux-pro-max/data/_sync_all.py +414 -414
  208. package/template/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +30 -30
  209. package/template/.opencode/skills/ui-ux-pro-max/data/design.csv +1775 -1775
  210. package/template/.opencode/skills/ui-ux-pro-max/data/draft.csv +1778 -1778
  211. package/template/.opencode/skills/ui-ux-pro-max/data/icons.csv +105 -105
  212. package/template/.opencode/skills/ui-ux-pro-max/data/products.csv +162 -162
  213. package/template/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  214. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -51
  215. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  216. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  217. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  218. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  219. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -51
  220. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  221. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  222. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  223. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  224. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  225. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  226. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  227. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -54
  228. package/template/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  229. package/template/.opencode/skills/ui-ux-pro-max/data/typography.csv +74 -74
  230. package/template/.opencode/skills/ui-ux-pro-max/scripts/core.py +262 -262
  231. package/template/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +1148 -1148
  232. package/template/AGENT_PERSONAS.md +595 -551
  233. package/template/GIT_STRUCTURE_GUIDE.md +270 -270
  234. package/template/PROJECT_README.example.md +81 -81
  235. package/template/QUICK-START.md +134 -131
  236. package/template/README.md +1942 -1919
  237. package/template/_gitignore +138 -138
  238. package/template/agent/workflows/_shared/change-management.md +70 -70
  239. package/template/agent/workflows/_shared/git-branch-management.md +25 -25
  240. package/template/agent/workflows/_shared/phases.md +88 -88
  241. package/template/agent/workflows/_shared/state-management.md +87 -87
  242. package/template/agent/workflows/_shared/work-depth.md +46 -46
  243. package/template/agent/workflows/analyst.md +104 -104
  244. package/template/agent/workflows/backend.md +61 -61
  245. package/template/agent/workflows/data-architect.md +43 -43
  246. package/template/agent/workflows/devops.md +44 -44
  247. package/template/agent/workflows/discovery.md +51 -51
  248. package/template/agent/workflows/document.md +51 -51
  249. package/template/agent/workflows/explorer.md +133 -133
  250. package/template/agent/workflows/fixer.md +82 -81
  251. package/template/agent/workflows/frontend.md +60 -60
  252. package/template/agent/workflows/fullstack.md +86 -86
  253. package/template/agent/workflows/initiator.md +74 -74
  254. package/template/agent/workflows/logger.md +138 -138
  255. package/template/agent/workflows/manual-tester.md +103 -0
  256. package/template/agent/workflows/orchestrator.md +133 -133
  257. package/template/agent/workflows/pm.md +199 -199
  258. package/template/agent/workflows/qa.md +66 -66
  259. package/template/agent/workflows/reliability.md +48 -48
  260. package/template/agent/workflows/security.md +107 -107
  261. package/template/agent/workflows/sysarch.md +301 -301
  262. package/template/agent/workflows/tester.md +100 -100
  263. package/template/agent/workflows/toolsmith.md +77 -77
  264. package/template/agent/workflows/ux-designer.md +45 -45
  265. package/template/codes/.gitkeep +1 -1
  266. package/template/project_overview_example.md +54 -54
  267. package/template/schemas/adr.template.md +36 -36
  268. package/template/schemas/changelog.template.md +34 -34
  269. package/template/schemas/data-model.template.md +57 -57
  270. package/template/schemas/design-system.template.md +63 -63
  271. package/template/schemas/dev_log.template.md +20 -20
  272. package/template/schemas/product-ci.template.yml +50 -50
  273. package/template/schemas/requirements.template.md +64 -64
  274. package/template/schemas/security-standards.template.md +58 -58
  275. package/template/schemas/security_report.template.md +89 -89
  276. package/template/schemas/specification.template.md +71 -71
  277. package/template/schemas/style_guide.template.md +29 -29
  278. package/template/schemas/task_list.template.md +28 -28
  279. package/template/schemas/workspace-manifest.template.json +24 -24
  280. package/template/schemas/workspace-registry.json +95 -95
  281. package/template/skills-lock.json +11 -11
  282. package/template/specifications/.gitkeep +3 -3
  283. package/template/state/knowledge_base/.gitkeep +1 -1
  284. package/template/state/knowledge_base/requirements/.gitkeep +1 -1
  285. package/template/tests/.gitkeep +1 -1
  286. package/template/.claude/settings.local.json +0 -44
package/src/index.mjs CHANGED
@@ -1,228 +1,228 @@
1
- // src/index.mjs
2
- // Main orchestrator: parse args, prompt, scaffold, git init, print next steps.
3
-
4
- import path from 'node:path';
5
- import { promises as fs } from 'node:fs';
6
- import { runPrompts } from './prompts.mjs';
7
- import { scaffold } from './scaffold.mjs';
8
- import { initRepo } from './git.mjs';
9
- import { log, pathExists, isDirEmpty, isValidProjectName } from './utils.mjs';
10
- import { isVasvibeProject, runUpgrade } from './upgrade.mjs';
11
- import pc from 'picocolors';
12
-
13
- const HELP = `
14
- ${pc.bold('create-vasvibe')} — scaffold a project with VasVibe agents preconfigured
15
-
16
- ${pc.bold('Usage:')}
17
- npx create-vasvibe <project-name> [options]
18
- npx create-vasvibe upgrade [path] Upgrade agent files in an existing project
19
-
20
- ${pc.bold('Options:')}
21
- -y, --yes Skip prompts and use defaults
22
- --no-git Do not initialize a git repository
23
- --no-opencode Exclude .opencode/ (commands, skills)
24
- --no-claude Exclude .claude/ and .agents/
25
- --no-github Exclude .github/prompts/
26
- --no-workflows Exclude agent/workflows/
27
- --depth=<level> Set default work depth: fast | standard | deep (default: standard)
28
- --dry-run (upgrade only) Show what would change without writing files
29
- -h, --help Show this help
30
- -v, --version Print version
31
-
32
- ${pc.bold('Examples:')}
33
- npx create-vasvibe my-app
34
- npx create-vasvibe my-app --yes --no-claude --no-github
35
- npx create-vasvibe my-app --depth=fast Scaffold with fast work depth (prototype mode)
36
- npx create-vasvibe upgrade Upgrade current directory
37
- npx create-vasvibe upgrade ./my-app Upgrade specific project
38
- npx create-vasvibe upgrade --dry-run Preview upgrade without writing
39
- `;
40
-
41
- function parseArgs(argv) {
42
- const args = argv.slice(2);
43
- const flags = {
44
- yes: false,
45
- git: true,
46
- opencode: true,
47
- claude: true,
48
- github: true,
49
- workflows: true,
50
- help: false,
51
- version: false,
52
- dryRun: false,
53
- depth: null,
54
- };
55
- const positional = [];
56
-
57
- for (const a of args) {
58
- switch (a) {
59
- case '-y':
60
- case '--yes':
61
- flags.yes = true;
62
- break;
63
- case '--dry-run':
64
- flags.dryRun = true;
65
- break;
66
- case '--no-git':
67
- flags.git = false;
68
- break;
69
- case '--no-opencode':
70
- flags.opencode = false;
71
- break;
72
- case '--no-claude':
73
- flags.claude = false;
74
- break;
75
- case '--no-github':
76
- flags.github = false;
77
- break;
78
- case '--no-workflows':
79
- flags.workflows = false;
80
- break;
81
- case '-h':
82
- case '--help':
83
- flags.help = true;
84
- break;
85
- case '-v':
86
- case '--version':
87
- flags.version = true;
88
- break;
89
- default:
90
- if (a.startsWith('--depth=')) {
91
- const val = a.slice('--depth='.length);
92
- if (!['fast', 'standard', 'deep'].includes(val)) {
93
- log.error(`Invalid depth value "${val}". Use: fast | standard | deep`);
94
- process.exit(1);
95
- }
96
- flags.depth = val;
97
- break;
98
- }
99
- if (a.startsWith('-')) {
100
- log.error(`Unknown flag: ${a}`);
101
- console.log(HELP);
102
- process.exit(1);
103
- }
104
- positional.push(a);
105
- }
106
- }
107
-
108
- return { positional, flags };
109
- }
110
-
111
- async function readPkg() {
112
- const url = new URL('../package.json', import.meta.url);
113
- const raw = await fs.readFile(url, 'utf8');
114
- return JSON.parse(raw);
115
- }
116
-
117
- export async function main(argv) {
118
- const { positional, flags } = parseArgs(argv);
119
-
120
- if (flags.help) {
121
- console.log(HELP);
122
- return;
123
- }
124
- if (flags.version) {
125
- const pkg = await readPkg();
126
- console.log(pkg.version);
127
- return;
128
- }
129
-
130
- // --- Upgrade subcommand ---
131
- if (positional[0] === 'upgrade') {
132
- const pkg = await readPkg();
133
- const targetDir = positional[1]
134
- ? path.resolve(process.cwd(), positional[1])
135
- : process.cwd();
136
-
137
- if (!(await isVasvibeProject(targetDir))) {
138
- log.error(`No vasvibe project found at ${targetDir}`);
139
- log.step('Run this command from inside a vasvibe project directory.');
140
- process.exit(1);
141
- }
142
-
143
- log.title('\n create-vasvibe upgrade\n');
144
- try {
145
- await runUpgrade({ targetDir, newVersion: pkg.version, dryRun: flags.dryRun });
146
- } catch (err) {
147
- log.error(`Upgrade failed: ${err.message}`);
148
- process.exit(1);
149
- }
150
- return;
151
- }
152
-
153
- // --- Scaffold subcommand (default) ---
154
- const argInput = positional[0];
155
- // The arg may be a path (e.g. /tmp/foo or ./foo); use its basename as the
156
- // logical project name, and resolve the full path as the target directory.
157
- const argName = argInput ? path.basename(argInput) : undefined;
158
- if (argName && !isValidProjectName(argName)) {
159
- log.error(
160
- `Invalid project name "${argName}". Use letters, numbers, dot, underscore, or dash, and do not start with a dot.`,
161
- );
162
- process.exit(1);
163
- }
164
-
165
- log.title('\n create-vasvibe\n');
166
-
167
- const answers = await runPrompts({ argName, flags });
168
- const projectName = answers.projectName;
169
- const targetDir = argInput
170
- ? path.resolve(process.cwd(), argInput)
171
- : path.resolve(process.cwd(), projectName);
172
-
173
- // Safety: target must not exist or must be empty.
174
- if (await pathExists(targetDir)) {
175
- if (!(await isDirEmpty(targetDir))) {
176
- log.error(`Target directory "${projectName}" already exists and is not empty.`);
177
- log.step(`To update agent files in an existing project, use: ${pc.cyan('npx create-vasvibe upgrade')}`);
178
- process.exit(1);
179
- }
180
- }
181
-
182
- const pkg = await readPkg();
183
-
184
- log.blank();
185
- log.step(`Scaffolding into ${pc.cyan(targetDir)}`);
186
-
187
- try {
188
- await scaffold({
189
- targetDir,
190
- projectName,
191
- version: pkg.version,
192
- workDepth: answers.workDepth,
193
- includeOpencode: answers.includeOpencode,
194
- includeClaude: answers.includeClaude,
195
- includeGithub: answers.includeGithub,
196
- includeWorkflows: answers.includeWorkflows,
197
- });
198
- log.success('Template files copied');
199
- } catch (err) {
200
- log.error(`Scaffold failed: ${err.message}`);
201
- process.exit(1);
202
- }
203
-
204
- if (answers.initGit) {
205
- const r = await initRepo(targetDir);
206
- if (r.ok) {
207
- log.success(r.warning ? `git initialized (${r.warning.trim().split('\n')[0]})` : 'Git repository initialized');
208
- } else {
209
- log.warn(`Skipped git init: ${r.reason}`);
210
- }
211
- }
212
-
213
- printNextSteps({ projectName, includeOpencode: answers.includeOpencode });
214
- }
215
-
216
- function printNextSteps({ projectName, includeOpencode }) {
217
- log.blank();
218
- log.title(' Done! Next steps:\n');
219
- console.log(` ${pc.cyan(`cd ${projectName}`)}`);
220
- if (includeOpencode) {
221
- console.log(` ${pc.dim('# Create opencode.json with your AI provider config')}`);
222
- console.log(` ${pc.dim('# (see https://opencode.ai/docs for details)')}`);
223
- }
224
- console.log(` ${pc.dim('# Add code under codes/, specs under specifications/, tests under tests/')}`);
225
- log.blank();
226
- console.log(pc.dim(' Happy building.'));
227
- log.blank();
228
- }
1
+ // src/index.mjs
2
+ // Main orchestrator: parse args, prompt, scaffold, git init, print next steps.
3
+
4
+ import path from 'node:path';
5
+ import { promises as fs } from 'node:fs';
6
+ import { runPrompts } from './prompts.mjs';
7
+ import { scaffold } from './scaffold.mjs';
8
+ import { initRepo } from './git.mjs';
9
+ import { log, pathExists, isDirEmpty, isValidProjectName } from './utils.mjs';
10
+ import { isVasvibeProject, runUpgrade } from './upgrade.mjs';
11
+ import pc from 'picocolors';
12
+
13
+ const HELP = `
14
+ ${pc.bold('create-vasvibe')} — scaffold a project with VasVibe agents preconfigured
15
+
16
+ ${pc.bold('Usage:')}
17
+ npx create-vasvibe <project-name> [options]
18
+ npx create-vasvibe upgrade [path] Upgrade agent files in an existing project
19
+
20
+ ${pc.bold('Options:')}
21
+ -y, --yes Skip prompts and use defaults
22
+ --no-git Do not initialize a git repository
23
+ --no-opencode Exclude .opencode/ (commands, skills)
24
+ --no-claude Exclude .claude/ and .agents/
25
+ --no-github Exclude .github/prompts/
26
+ --no-workflows Exclude agent/workflows/
27
+ --depth=<level> Set default work depth: fast | standard | deep (default: standard)
28
+ --dry-run (upgrade only) Show what would change without writing files
29
+ -h, --help Show this help
30
+ -v, --version Print version
31
+
32
+ ${pc.bold('Examples:')}
33
+ npx create-vasvibe my-app
34
+ npx create-vasvibe my-app --yes --no-claude --no-github
35
+ npx create-vasvibe my-app --depth=fast Scaffold with fast work depth (prototype mode)
36
+ npx create-vasvibe upgrade Upgrade current directory
37
+ npx create-vasvibe upgrade ./my-app Upgrade specific project
38
+ npx create-vasvibe upgrade --dry-run Preview upgrade without writing
39
+ `;
40
+
41
+ function parseArgs(argv) {
42
+ const args = argv.slice(2);
43
+ const flags = {
44
+ yes: false,
45
+ git: true,
46
+ opencode: true,
47
+ claude: true,
48
+ github: true,
49
+ workflows: true,
50
+ help: false,
51
+ version: false,
52
+ dryRun: false,
53
+ depth: null,
54
+ };
55
+ const positional = [];
56
+
57
+ for (const a of args) {
58
+ switch (a) {
59
+ case '-y':
60
+ case '--yes':
61
+ flags.yes = true;
62
+ break;
63
+ case '--dry-run':
64
+ flags.dryRun = true;
65
+ break;
66
+ case '--no-git':
67
+ flags.git = false;
68
+ break;
69
+ case '--no-opencode':
70
+ flags.opencode = false;
71
+ break;
72
+ case '--no-claude':
73
+ flags.claude = false;
74
+ break;
75
+ case '--no-github':
76
+ flags.github = false;
77
+ break;
78
+ case '--no-workflows':
79
+ flags.workflows = false;
80
+ break;
81
+ case '-h':
82
+ case '--help':
83
+ flags.help = true;
84
+ break;
85
+ case '-v':
86
+ case '--version':
87
+ flags.version = true;
88
+ break;
89
+ default:
90
+ if (a.startsWith('--depth=')) {
91
+ const val = a.slice('--depth='.length);
92
+ if (!['fast', 'standard', 'deep'].includes(val)) {
93
+ log.error(`Invalid depth value "${val}". Use: fast | standard | deep`);
94
+ process.exit(1);
95
+ }
96
+ flags.depth = val;
97
+ break;
98
+ }
99
+ if (a.startsWith('-')) {
100
+ log.error(`Unknown flag: ${a}`);
101
+ console.log(HELP);
102
+ process.exit(1);
103
+ }
104
+ positional.push(a);
105
+ }
106
+ }
107
+
108
+ return { positional, flags };
109
+ }
110
+
111
+ async function readPkg() {
112
+ const url = new URL('../package.json', import.meta.url);
113
+ const raw = await fs.readFile(url, 'utf8');
114
+ return JSON.parse(raw);
115
+ }
116
+
117
+ export async function main(argv) {
118
+ const { positional, flags } = parseArgs(argv);
119
+
120
+ if (flags.help) {
121
+ console.log(HELP);
122
+ return;
123
+ }
124
+ if (flags.version) {
125
+ const pkg = await readPkg();
126
+ console.log(pkg.version);
127
+ return;
128
+ }
129
+
130
+ // --- Upgrade subcommand ---
131
+ if (positional[0] === 'upgrade') {
132
+ const pkg = await readPkg();
133
+ const targetDir = positional[1]
134
+ ? path.resolve(process.cwd(), positional[1])
135
+ : process.cwd();
136
+
137
+ if (!(await isVasvibeProject(targetDir))) {
138
+ log.error(`No vasvibe project found at ${targetDir}`);
139
+ log.step('Run this command from inside a vasvibe project directory.');
140
+ process.exit(1);
141
+ }
142
+
143
+ log.title('\n create-vasvibe upgrade\n');
144
+ try {
145
+ await runUpgrade({ targetDir, newVersion: pkg.version, dryRun: flags.dryRun });
146
+ } catch (err) {
147
+ log.error(`Upgrade failed: ${err.message}`);
148
+ process.exit(1);
149
+ }
150
+ return;
151
+ }
152
+
153
+ // --- Scaffold subcommand (default) ---
154
+ const argInput = positional[0];
155
+ // The arg may be a path (e.g. /tmp/foo or ./foo); use its basename as the
156
+ // logical project name, and resolve the full path as the target directory.
157
+ const argName = argInput ? path.basename(argInput) : undefined;
158
+ if (argName && !isValidProjectName(argName)) {
159
+ log.error(
160
+ `Invalid project name "${argName}". Use letters, numbers, dot, underscore, or dash, and do not start with a dot.`,
161
+ );
162
+ process.exit(1);
163
+ }
164
+
165
+ log.title('\n create-vasvibe\n');
166
+
167
+ const answers = await runPrompts({ argName, flags });
168
+ const projectName = answers.projectName;
169
+ const targetDir = argInput
170
+ ? path.resolve(process.cwd(), argInput)
171
+ : path.resolve(process.cwd(), projectName);
172
+
173
+ // Safety: target must not exist or must be empty.
174
+ if (await pathExists(targetDir)) {
175
+ if (!(await isDirEmpty(targetDir))) {
176
+ log.error(`Target directory "${projectName}" already exists and is not empty.`);
177
+ log.step(`To update agent files in an existing project, use: ${pc.cyan('npx create-vasvibe upgrade')}`);
178
+ process.exit(1);
179
+ }
180
+ }
181
+
182
+ const pkg = await readPkg();
183
+
184
+ log.blank();
185
+ log.step(`Scaffolding into ${pc.cyan(targetDir)}`);
186
+
187
+ try {
188
+ await scaffold({
189
+ targetDir,
190
+ projectName,
191
+ version: pkg.version,
192
+ workDepth: answers.workDepth,
193
+ includeOpencode: answers.includeOpencode,
194
+ includeClaude: answers.includeClaude,
195
+ includeGithub: answers.includeGithub,
196
+ includeWorkflows: answers.includeWorkflows,
197
+ });
198
+ log.success('Template files copied');
199
+ } catch (err) {
200
+ log.error(`Scaffold failed: ${err.message}`);
201
+ process.exit(1);
202
+ }
203
+
204
+ if (answers.initGit) {
205
+ const r = await initRepo(targetDir);
206
+ if (r.ok) {
207
+ log.success(r.warning ? `git initialized (${r.warning.trim().split('\n')[0]})` : 'Git repository initialized');
208
+ } else {
209
+ log.warn(`Skipped git init: ${r.reason}`);
210
+ }
211
+ }
212
+
213
+ printNextSteps({ projectName, includeOpencode: answers.includeOpencode });
214
+ }
215
+
216
+ function printNextSteps({ projectName, includeOpencode }) {
217
+ log.blank();
218
+ log.title(' Done! Next steps:\n');
219
+ console.log(` ${pc.cyan(`cd ${projectName}`)}`);
220
+ if (includeOpencode) {
221
+ console.log(` ${pc.dim('# Create opencode.json with your AI provider config')}`);
222
+ console.log(` ${pc.dim('# (see https://opencode.ai/docs for details)')}`);
223
+ }
224
+ console.log(` ${pc.dim('# Add code under codes/, specs under specifications/, tests under tests/')}`);
225
+ log.blank();
226
+ console.log(pc.dim(' Happy building.'));
227
+ log.blank();
228
+ }