create-vasvibe 2.3.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +170 -167
- package/bin/cli.mjs +9 -9
- package/package.json +44 -44
- package/src/git.mjs +47 -47
- package/src/index.mjs +228 -228
- package/src/prompts.mjs +113 -113
- package/src/scaffold.mjs +74 -74
- package/src/upgrade.mjs +121 -121
- package/src/utils.mjs +91 -91
- package/template/.agents/agents/analyst/agent.json +43 -43
- package/template/.agents/agents/backend/agent.json +44 -44
- package/template/.agents/agents/data-architect/agent.json +43 -43
- package/template/.agents/agents/devops/agent.json +44 -44
- package/template/.agents/agents/discovery/agent.json +43 -43
- package/template/.agents/agents/document/agent.json +43 -43
- package/template/.agents/agents/fixer/agent.json +44 -44
- package/template/.agents/agents/frontend/agent.json +44 -44
- package/template/.agents/agents/fullstack/agent.json +44 -44
- package/template/.agents/agents/initiator/agent.json +41 -41
- package/template/.agents/agents/manual-tester/agent.json +44 -0
- package/template/.agents/agents/orchestrator/agent.json +44 -44
- package/template/.agents/agents/pm/agent.json +42 -42
- package/template/.agents/agents/qa/agent.json +44 -44
- package/template/.agents/agents/reliability/agent.json +44 -44
- package/template/.agents/agents/security/agent.json +44 -44
- package/template/.agents/agents/sysarch/agent.json +44 -44
- package/template/.agents/agents/tester/agent.json +44 -44
- package/template/.agents/agents/toolsmith/agent.json +44 -44
- package/template/.agents/agents/ux-designer/agent.json +43 -43
- package/template/.agents/skills/find-skills/SKILL.md +142 -142
- package/template/.agents/skills/fullstack/SKILL.md +89 -89
- package/template/.agents/skills/penetration-testing/SKILL.md +94 -94
- package/template/.agents/skills/penetration-testing/references/automated-penetration-testing-framework.md +328 -328
- package/template/.agents/skills/penetration-testing/references/burp-suite-automation-script.md +135 -135
- package/template/.agents/skills/penetration-testing/scripts/security-checklist.sh +30 -30
- package/template/.agents/skills/pm/SKILL.md +170 -170
- package/template/.agents/skills/ui-ux-pro-max/SKILL.md +658 -658
- package/template/.agents/skills/ui-ux-pro-max/data/_sync_all.py +414 -414
- package/template/.agents/skills/ui-ux-pro-max/data/app-interface.csv +30 -30
- package/template/.agents/skills/ui-ux-pro-max/data/design.csv +1775 -1775
- package/template/.agents/skills/ui-ux-pro-max/data/draft.csv +1778 -1778
- package/template/.agents/skills/ui-ux-pro-max/data/icons.csv +105 -105
- package/template/.agents/skills/ui-ux-pro-max/data/products.csv +162 -162
- package/template/.agents/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -51
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -51
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -54
- package/template/.agents/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/template/.agents/skills/ui-ux-pro-max/data/typography.csv +74 -74
- package/template/.agents/skills/ui-ux-pro-max/scripts/core.py +262 -262
- package/template/.agents/skills/ui-ux-pro-max/scripts/design_system.py +1148 -1148
- package/template/.agents/workflows/build-feature.md +21 -21
- package/template/.agents/workflows/daily-standup.md +16 -16
- package/template/.agents/workflows/deliver-feature.md +16 -16
- package/template/.agents/workflows/harden-release.md +21 -21
- package/template/.agents/workflows/plan-project.md +25 -25
- package/template/.agents/workflows/release.md +18 -18
- package/template/.agents/workflows/security-audit.md +19 -19
- package/template/.agents/workflows/setup-workspace.md +21 -21
- package/template/.agents/workflows/start-fix.md +17 -17
- package/template/.agents/workflows/test-feature.md +17 -17
- package/template/.claude/agents/analyst.md +75 -75
- package/template/.claude/agents/backend.md +61 -61
- package/template/.claude/agents/data-architect.md +43 -43
- package/template/.claude/agents/devops.md +44 -43
- package/template/.claude/agents/discovery.md +51 -51
- package/template/.claude/agents/document.md +51 -51
- package/template/.claude/agents/fixer.md +83 -82
- package/template/.claude/agents/frontend.md +58 -58
- package/template/.claude/agents/fullstack.md +84 -83
- package/template/.claude/agents/initiator.md +74 -74
- package/template/.claude/agents/manual-tester.md +108 -0
- package/template/.claude/agents/orchestrator.md +114 -113
- package/template/.claude/agents/pm.md +199 -199
- package/template/.claude/agents/qa.md +66 -65
- package/template/.claude/agents/reliability.md +48 -47
- package/template/.claude/agents/security.md +107 -106
- package/template/.claude/agents/sysarch.md +301 -301
- package/template/.claude/agents/tester.md +100 -100
- package/template/.claude/agents/toolsmith.md +77 -76
- package/template/.claude/agents/ux-designer.md +45 -45
- package/template/.claude/commands/build-feature.md +22 -22
- package/template/.claude/commands/daily-standup.md +16 -16
- package/template/.claude/commands/deliver-feature.md +17 -17
- package/template/.claude/commands/harden-release.md +22 -22
- package/template/.claude/commands/manual-test.md +19 -0
- package/template/.claude/commands/plan-project.md +26 -26
- package/template/.claude/commands/release.md +19 -19
- package/template/.claude/commands/security-audit.md +20 -20
- package/template/.claude/commands/setup-workspace.md +22 -22
- package/template/.claude/commands/start-fix.md +18 -18
- package/template/.claude/commands/test-feature.md +18 -18
- package/template/.claude/skills/find-skills +1 -0
- package/template/.claude/skills/penetration-testing/SKILL.md +94 -94
- package/template/.claude/skills/penetration-testing/references/automated-penetration-testing-framework.md +328 -328
- package/template/.claude/skills/penetration-testing/references/burp-suite-automation-script.md +135 -135
- package/template/.claude/skills/penetration-testing/scripts/security-checklist.sh +30 -30
- package/template/.claude/skills/ui-ux-pro-max/SKILL.md +658 -658
- package/template/.claude/skills/ui-ux-pro-max/data/_sync_all.py +414 -414
- package/template/.claude/skills/ui-ux-pro-max/data/app-interface.csv +30 -30
- package/template/.claude/skills/ui-ux-pro-max/data/design.csv +1775 -1775
- package/template/.claude/skills/ui-ux-pro-max/data/draft.csv +1778 -1778
- package/template/.claude/skills/ui-ux-pro-max/data/icons.csv +105 -105
- package/template/.claude/skills/ui-ux-pro-max/data/products.csv +162 -162
- package/template/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -51
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -51
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -54
- package/template/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/template/.claude/skills/ui-ux-pro-max/data/typography.csv +74 -74
- package/template/.claude/skills/ui-ux-pro-max/scripts/core.py +262 -262
- package/template/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1148 -1148
- package/template/.github/prompts/analyst.prompt.md +57 -57
- package/template/.github/prompts/backend.prompt.md +44 -44
- package/template/.github/prompts/data-architect.prompt.md +38 -38
- package/template/.github/prompts/devops.prompt.md +32 -32
- package/template/.github/prompts/discovery.prompt.md +39 -39
- package/template/.github/prompts/document.prompt.md +14 -14
- package/template/.github/prompts/fixer.prompt.md +90 -89
- package/template/.github/prompts/frontend.prompt.md +43 -43
- package/template/.github/prompts/fullstack.prompt.md +91 -91
- package/template/.github/prompts/initiator.prompt.md +55 -55
- package/template/.github/prompts/manual-tester.prompt.md +103 -0
- package/template/.github/prompts/orchestrator.prompt.md +75 -75
- package/template/.github/prompts/pm.prompt.md +186 -186
- package/template/.github/prompts/qa.prompt.md +57 -57
- package/template/.github/prompts/reliability.prompt.md +44 -44
- package/template/.github/prompts/security.prompt.md +41 -41
- package/template/.github/prompts/sysarch.prompt.md +351 -351
- package/template/.github/prompts/tester.prompt.md +107 -107
- package/template/.github/prompts/toolsmith.prompt.md +46 -46
- package/template/.github/prompts/ux-designer.prompt.md +41 -41
- package/template/.opencode/agents/analyst.md +75 -75
- package/template/.opencode/agents/backend.md +61 -61
- package/template/.opencode/agents/data-architect.md +43 -43
- package/template/.opencode/agents/devops.md +44 -41
- package/template/.opencode/agents/discovery.md +51 -51
- package/template/.opencode/agents/document.md +51 -51
- package/template/.opencode/agents/fixer.md +83 -82
- package/template/.opencode/agents/frontend.md +58 -58
- package/template/.opencode/agents/fullstack.md +84 -83
- package/template/.opencode/agents/initiator.md +74 -74
- package/template/.opencode/agents/manual-tester.md +107 -0
- package/template/.opencode/agents/orchestrator.md +116 -119
- package/template/.opencode/agents/pm.md +199 -199
- package/template/.opencode/agents/qa.md +66 -65
- package/template/.opencode/agents/reliability.md +48 -46
- package/template/.opencode/agents/security.md +107 -105
- package/template/.opencode/agents/sysarch.md +301 -301
- package/template/.opencode/agents/tester.md +100 -100
- package/template/.opencode/agents/toolsmith.md +77 -77
- package/template/.opencode/agents/ux-designer.md +45 -45
- package/template/.opencode/commands/build-feature.md +21 -21
- package/template/.opencode/commands/daily-standup.md +16 -16
- package/template/.opencode/commands/deliver-feature.md +16 -16
- package/template/.opencode/commands/harden-release.md +21 -21
- package/template/.opencode/commands/manual-test.md +18 -0
- package/template/.opencode/commands/plan-project.md +25 -25
- package/template/.opencode/commands/release.md +18 -18
- package/template/.opencode/commands/security-audit.md +19 -19
- package/template/.opencode/commands/setup-workspace.md +21 -21
- package/template/.opencode/commands/start-fix.md +17 -17
- package/template/.opencode/commands/test-feature.md +17 -17
- package/template/.opencode/skills/penetration-testing/SKILL.md +94 -94
- package/template/.opencode/skills/penetration-testing/references/automated-penetration-testing-framework.md +328 -328
- package/template/.opencode/skills/penetration-testing/references/burp-suite-automation-script.md +135 -135
- package/template/.opencode/skills/penetration-testing/scripts/security-checklist.sh +30 -30
- package/template/.opencode/skills/ui-ux-pro-max/SKILL.md +658 -658
- package/template/.opencode/skills/ui-ux-pro-max/data/_sync_all.py +414 -414
- package/template/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +30 -30
- package/template/.opencode/skills/ui-ux-pro-max/data/design.csv +1775 -1775
- package/template/.opencode/skills/ui-ux-pro-max/data/draft.csv +1778 -1778
- package/template/.opencode/skills/ui-ux-pro-max/data/icons.csv +105 -105
- package/template/.opencode/skills/ui-ux-pro-max/data/products.csv +162 -162
- package/template/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -51
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -51
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -54
- package/template/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/template/.opencode/skills/ui-ux-pro-max/data/typography.csv +74 -74
- package/template/.opencode/skills/ui-ux-pro-max/scripts/core.py +262 -262
- package/template/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +1148 -1148
- package/template/AGENT_PERSONAS.md +595 -551
- package/template/GIT_STRUCTURE_GUIDE.md +270 -270
- package/template/PROJECT_README.example.md +81 -81
- package/template/QUICK-START.md +134 -131
- package/template/README.md +1942 -1919
- package/template/_gitignore +141 -141
- package/template/agent/workflows/_shared/change-management.md +70 -70
- package/template/agent/workflows/_shared/git-branch-management.md +25 -25
- package/template/agent/workflows/_shared/phases.md +88 -88
- package/template/agent/workflows/_shared/state-management.md +87 -87
- package/template/agent/workflows/_shared/work-depth.md +46 -46
- package/template/agent/workflows/analyst.md +75 -75
- package/template/agent/workflows/backend.md +61 -61
- package/template/agent/workflows/data-architect.md +43 -43
- package/template/agent/workflows/devops.md +44 -44
- package/template/agent/workflows/discovery.md +51 -51
- package/template/agent/workflows/document.md +51 -51
- package/template/agent/workflows/fixer.md +83 -82
- package/template/agent/workflows/frontend.md +58 -58
- package/template/agent/workflows/fullstack.md +84 -84
- package/template/agent/workflows/initiator.md +74 -74
- package/template/agent/workflows/manual-tester.md +103 -0
- package/template/agent/workflows/orchestrator.md +114 -114
- package/template/agent/workflows/pm.md +199 -199
- package/template/agent/workflows/qa.md +66 -66
- package/template/agent/workflows/reliability.md +48 -48
- package/template/agent/workflows/security.md +107 -107
- package/template/agent/workflows/sysarch.md +301 -301
- package/template/agent/workflows/tester.md +100 -100
- package/template/agent/workflows/toolsmith.md +77 -77
- package/template/agent/workflows/ux-designer.md +45 -45
- package/template/codes/.gitkeep +1 -1
- package/template/project_overview_example.md +54 -54
- package/template/schemas/adr.template.md +36 -36
- package/template/schemas/changelog.template.md +34 -34
- package/template/schemas/data-model.template.md +57 -57
- package/template/schemas/design-system.template.md +63 -63
- package/template/schemas/dev_log.template.md +20 -20
- package/template/schemas/product-ci.template.yml +50 -50
- package/template/schemas/requirements.template.md +64 -64
- package/template/schemas/security-standards.template.md +58 -58
- package/template/schemas/security_report.template.md +89 -89
- package/template/schemas/specification.template.md +57 -57
- package/template/schemas/style_guide.template.md +29 -29
- package/template/schemas/task_list.template.md +28 -28
- package/template/schemas/workspace-manifest.template.json +24 -24
- package/template/schemas/workspace-registry.json +94 -94
- package/template/skills-lock.json +11 -11
- package/template/specifications/.gitkeep +1 -1
- package/template/state/knowledge_base/.gitkeep +1 -1
- package/template/state/knowledge_base/requirements/.gitkeep +1 -1
- package/template/tests/.gitkeep +1 -1
- package/template/.agents/workflows/explorer.md +0 -78
- package/template/.agents/workflows/logger.md +0 -117
- package/template/.claude/settings.local.json +0 -35
- package/template/.claude/skills/find-skills/SKILL.md +0 -142
- package/template/.opencode/agents/explorer.md +0 -138
- package/template/.opencode/agents/logger.md +0 -143
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
|
+
}
|