create-vasvibe 1.1.0 → 2.0.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/package.json +1 -1
- package/src/index.mjs +53 -9
- package/src/prompts.mjs +26 -0
- package/src/scaffold.mjs +10 -2
- package/src/upgrade.mjs +121 -0
- package/template/.agents/agents/backend/agent.json +44 -0
- package/template/.agents/agents/data-architect/agent.json +43 -0
- package/template/.agents/agents/discovery/agent.json +43 -0
- package/template/.agents/agents/frontend/agent.json +44 -0
- package/template/.agents/agents/reliability/agent.json +44 -0
- package/template/.agents/agents/security/agent.json +44 -0
- package/template/.agents/agents/ux-designer/agent.json +43 -0
- package/template/.agents/workflows/build-feature.md +21 -0
- package/template/.agents/workflows/daily-standup.md +16 -0
- package/template/.agents/workflows/deliver-feature.md +16 -0
- package/template/.agents/workflows/harden-release.md +21 -0
- package/template/.agents/workflows/plan-project.md +25 -0
- package/template/.agents/workflows/release.md +18 -0
- package/template/.agents/workflows/security-audit.md +19 -0
- package/template/.agents/workflows/start-fix.md +17 -0
- package/template/.agents/workflows/test-feature.md +17 -0
- package/template/.claude/agents/analyst.md +22 -2
- package/template/.claude/agents/backend.md +66 -0
- package/template/.claude/agents/data-architect.md +48 -0
- package/template/.claude/agents/developer.md +19 -2
- package/template/.claude/agents/devops.md +22 -3
- package/template/.claude/agents/discovery.md +56 -0
- package/template/.claude/agents/document.md +17 -0
- package/template/.claude/agents/fixer.md +18 -1
- package/template/.claude/agents/frontend.md +63 -0
- package/template/.claude/agents/initiator.md +29 -7
- package/template/.claude/agents/orchestrator.md +100 -27
- package/template/.claude/agents/pm.md +17 -2
- package/template/.claude/agents/qa.md +19 -2
- package/template/.claude/agents/reliability.md +52 -0
- package/template/.claude/agents/security.md +111 -0
- package/template/.claude/agents/sysarch.md +45 -93
- package/template/.claude/agents/tester.md +19 -2
- package/template/.claude/agents/ux-designer.md +50 -0
- package/template/.claude/commands/build-feature.md +22 -0
- package/template/.claude/commands/daily-standup.md +16 -0
- package/template/.claude/commands/deliver-feature.md +17 -0
- package/template/.claude/commands/harden-release.md +22 -0
- package/template/.claude/commands/plan-project.md +26 -0
- package/template/.claude/commands/release.md +19 -0
- package/template/.claude/commands/security-audit.md +20 -0
- package/template/.claude/commands/start-fix.md +18 -0
- package/template/.claude/commands/test-feature.md +18 -0
- package/template/.claude/settings.local.json +26 -0
- package/template/.github/prompts/backend.prompt.md +44 -0
- package/template/.github/prompts/data-architect.prompt.md +38 -0
- package/template/.github/prompts/devops.prompt.md +32 -0
- package/template/.github/prompts/discovery.prompt.md +39 -0
- package/template/.github/prompts/frontend.prompt.md +43 -0
- package/template/.github/prompts/initiator.prompt.md +8 -7
- package/template/.github/prompts/orchestrator.prompt.md +75 -0
- package/template/.github/prompts/qa.prompt.md +57 -0
- package/template/.github/prompts/reliability.prompt.md +44 -0
- package/template/.github/prompts/security.prompt.md +41 -0
- package/template/.github/prompts/ux-designer.prompt.md +41 -0
- package/template/.opencode/agents/analyst.md +21 -2
- package/template/.opencode/agents/backend.md +65 -0
- package/template/.opencode/agents/data-architect.md +47 -0
- package/template/.opencode/agents/developer.md +18 -2
- package/template/.opencode/agents/devops.md +16 -0
- package/template/.opencode/agents/discovery.md +55 -0
- package/template/.opencode/agents/document.md +16 -0
- package/template/.opencode/agents/fixer.md +17 -1
- package/template/.opencode/agents/frontend.md +62 -0
- package/template/.opencode/agents/initiator.md +28 -7
- package/template/.opencode/agents/orchestrator.md +99 -27
- package/template/.opencode/agents/pm.md +16 -2
- package/template/.opencode/agents/qa.md +18 -2
- package/template/.opencode/agents/reliability.md +50 -0
- package/template/.opencode/agents/security.md +109 -0
- package/template/.opencode/agents/sysarch.md +44 -93
- package/template/.opencode/agents/tester.md +18 -2
- package/template/.opencode/agents/ux-designer.md +49 -0
- package/template/.opencode/commands/build-feature.md +21 -0
- package/template/.opencode/commands/daily-standup.md +16 -0
- package/template/.opencode/commands/deliver-feature.md +16 -0
- package/template/.opencode/commands/harden-release.md +21 -0
- package/template/.opencode/commands/plan-project.md +25 -0
- package/template/.opencode/commands/release.md +18 -0
- package/template/.opencode/commands/security-audit.md +19 -0
- package/template/.opencode/commands/start-fix.md +17 -0
- package/template/.opencode/commands/test-feature.md +17 -0
- package/template/AGENT_PERSONAS.md +143 -11
- package/template/QUICK-START.md +121 -0
- package/template/agent/workflows/_shared/change-management.md +70 -0
- package/template/agent/workflows/_shared/phases.md +86 -0
- package/template/agent/workflows/_shared/state-management.md +85 -3
- package/template/agent/workflows/_shared/work-depth.md +46 -0
- package/template/agent/workflows/analyst.md +17 -2
- package/template/agent/workflows/backend.md +61 -0
- package/template/agent/workflows/data-architect.md +43 -0
- package/template/agent/workflows/developer.md +14 -2
- package/template/agent/workflows/devops.md +18 -3
- package/template/agent/workflows/discovery.md +51 -0
- package/template/agent/workflows/document.md +12 -0
- package/template/agent/workflows/fixer.md +13 -1
- package/template/agent/workflows/frontend.md +58 -0
- package/template/agent/workflows/initiator.md +24 -7
- package/template/agent/workflows/orchestrator.md +95 -27
- package/template/agent/workflows/pm.md +12 -2
- package/template/agent/workflows/qa.md +15 -2
- package/template/agent/workflows/reliability.md +48 -0
- package/template/agent/workflows/security.md +107 -0
- package/template/agent/workflows/sysarch.md +40 -93
- package/template/agent/workflows/tester.md +14 -2
- package/template/agent/workflows/ux-designer.md +45 -0
- package/template/project_overview_example.md +15 -1
- package/template/schemas/adr.template.md +36 -0
- package/template/schemas/changelog.template.md +34 -0
- package/template/schemas/data-model.template.md +57 -0
- package/template/schemas/design-system.template.md +63 -0
- package/template/schemas/dev_log.template.md +15 -21
- package/template/schemas/requirements.template.md +64 -0
- package/template/schemas/security-standards.template.md +58 -0
- package/template/schemas/security_report.template.md +89 -0
- package/template/schemas/specification.template.md +35 -5
- package/template/state/knowledge_base/architecture/.gitkeep +0 -0
- package/template/state/knowledge_base/data-model/.gitkeep +0 -0
- package/template/state/knowledge_base/decisions/.gitkeep +0 -0
- package/template/state/knowledge_base/design-system/.gitkeep +0 -0
- package/template/state/knowledge_base/requirements/.gitkeep +1 -0
- package/template/state/knowledge_base/security/.gitkeep +0 -0
package/package.json
CHANGED
package/src/index.mjs
CHANGED
|
@@ -7,6 +7,7 @@ import { runPrompts } from './prompts.mjs';
|
|
|
7
7
|
import { scaffold } from './scaffold.mjs';
|
|
8
8
|
import { initRepo } from './git.mjs';
|
|
9
9
|
import { log, pathExists, isDirEmpty, isValidProjectName } from './utils.mjs';
|
|
10
|
+
import { isVasvibeProject, runUpgrade } from './upgrade.mjs';
|
|
10
11
|
import pc from 'picocolors';
|
|
11
12
|
|
|
12
13
|
const HELP = `
|
|
@@ -14,29 +15,33 @@ ${pc.bold('create-vasvibe')} — scaffold a project with VasVibe agents preconfi
|
|
|
14
15
|
|
|
15
16
|
${pc.bold('Usage:')}
|
|
16
17
|
npx create-vasvibe <project-name> [options]
|
|
18
|
+
npx create-vasvibe upgrade [path] Upgrade agent files in an existing project
|
|
17
19
|
|
|
18
20
|
${pc.bold('Options:')}
|
|
19
21
|
-y, --yes Skip prompts and use defaults
|
|
20
|
-
-u, --update Update an existing project (overwrites template files, keeps user files)
|
|
21
22
|
--no-git Do not initialize a git repository
|
|
22
23
|
--no-opencode Exclude .opencode/ (commands, skills)
|
|
23
24
|
--no-claude Exclude .claude/ and .agents/
|
|
24
25
|
--no-github Exclude .github/prompts/
|
|
25
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
|
|
26
29
|
-h, --help Show this help
|
|
27
30
|
-v, --version Print version
|
|
28
31
|
|
|
29
32
|
${pc.bold('Examples:')}
|
|
30
33
|
npx create-vasvibe my-app
|
|
31
|
-
npx create-vasvibe my-app --yes
|
|
32
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
|
|
33
39
|
`;
|
|
34
40
|
|
|
35
41
|
function parseArgs(argv) {
|
|
36
42
|
const args = argv.slice(2);
|
|
37
43
|
const flags = {
|
|
38
44
|
yes: false,
|
|
39
|
-
update: false,
|
|
40
45
|
git: true,
|
|
41
46
|
opencode: true,
|
|
42
47
|
claude: true,
|
|
@@ -44,6 +49,8 @@ function parseArgs(argv) {
|
|
|
44
49
|
workflows: true,
|
|
45
50
|
help: false,
|
|
46
51
|
version: false,
|
|
52
|
+
dryRun: false,
|
|
53
|
+
depth: null,
|
|
47
54
|
};
|
|
48
55
|
const positional = [];
|
|
49
56
|
|
|
@@ -53,9 +60,8 @@ function parseArgs(argv) {
|
|
|
53
60
|
case '--yes':
|
|
54
61
|
flags.yes = true;
|
|
55
62
|
break;
|
|
56
|
-
case '-
|
|
57
|
-
|
|
58
|
-
flags.update = true;
|
|
63
|
+
case '--dry-run':
|
|
64
|
+
flags.dryRun = true;
|
|
59
65
|
break;
|
|
60
66
|
case '--no-git':
|
|
61
67
|
flags.git = false;
|
|
@@ -81,6 +87,15 @@ function parseArgs(argv) {
|
|
|
81
87
|
flags.version = true;
|
|
82
88
|
break;
|
|
83
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
|
+
}
|
|
84
99
|
if (a.startsWith('-')) {
|
|
85
100
|
log.error(`Unknown flag: ${a}`);
|
|
86
101
|
console.log(HELP);
|
|
@@ -112,6 +127,30 @@ export async function main(argv) {
|
|
|
112
127
|
return;
|
|
113
128
|
}
|
|
114
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) ---
|
|
115
154
|
const argInput = positional[0];
|
|
116
155
|
// The arg may be a path (e.g. /tmp/foo or ./foo); use its basename as the
|
|
117
156
|
// logical project name, and resolve the full path as the target directory.
|
|
@@ -131,14 +170,17 @@ export async function main(argv) {
|
|
|
131
170
|
? path.resolve(process.cwd(), argInput)
|
|
132
171
|
: path.resolve(process.cwd(), projectName);
|
|
133
172
|
|
|
134
|
-
// Safety: target must not exist or must be empty
|
|
135
|
-
if (
|
|
173
|
+
// Safety: target must not exist or must be empty.
|
|
174
|
+
if (await pathExists(targetDir)) {
|
|
136
175
|
if (!(await isDirEmpty(targetDir))) {
|
|
137
|
-
log.error(`Target directory "${projectName}" already exists and is not empty
|
|
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')}`);
|
|
138
178
|
process.exit(1);
|
|
139
179
|
}
|
|
140
180
|
}
|
|
141
181
|
|
|
182
|
+
const pkg = await readPkg();
|
|
183
|
+
|
|
142
184
|
log.blank();
|
|
143
185
|
log.step(`Scaffolding into ${pc.cyan(targetDir)}`);
|
|
144
186
|
|
|
@@ -146,6 +188,8 @@ export async function main(argv) {
|
|
|
146
188
|
await scaffold({
|
|
147
189
|
targetDir,
|
|
148
190
|
projectName,
|
|
191
|
+
version: pkg.version,
|
|
192
|
+
workDepth: answers.workDepth,
|
|
149
193
|
includeOpencode: answers.includeOpencode,
|
|
150
194
|
includeClaude: answers.includeClaude,
|
|
151
195
|
includeGithub: answers.includeGithub,
|
package/src/prompts.mjs
CHANGED
|
@@ -13,6 +13,7 @@ export async function runPrompts({ argName, flags }) {
|
|
|
13
13
|
includeGithub: flags.github !== false,
|
|
14
14
|
includeWorkflows: flags.workflows !== false,
|
|
15
15
|
initGit: flags.git !== false,
|
|
16
|
+
workDepth: flags.depth || 'standard',
|
|
16
17
|
};
|
|
17
18
|
}
|
|
18
19
|
|
|
@@ -72,6 +73,30 @@ export async function runPrompts({ argName, flags }) {
|
|
|
72
73
|
active: 'yes',
|
|
73
74
|
inactive: 'no',
|
|
74
75
|
},
|
|
76
|
+
{
|
|
77
|
+
type: flags.depth ? null : 'select',
|
|
78
|
+
name: 'workDepth',
|
|
79
|
+
message: 'Default work depth for all agents?',
|
|
80
|
+
hint: 'Can be changed anytime in project_overview.md → ## 7. Project Settings',
|
|
81
|
+
choices: [
|
|
82
|
+
{
|
|
83
|
+
title: 'standard (recommended)',
|
|
84
|
+
description: 'Full spec, unit tests, code review — the default for everyday production development.',
|
|
85
|
+
value: 'standard',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
title: 'fast',
|
|
89
|
+
description: 'Core feature only, skip optional steps (unit tests, full docs, edge cases) — good for prototypes and MVPs.',
|
|
90
|
+
value: 'fast',
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
title: 'deep',
|
|
94
|
+
description: 'Maximum thoroughness — full security review, all edge cases, strict validation — for critical systems.',
|
|
95
|
+
value: 'deep',
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
initial: 0,
|
|
99
|
+
},
|
|
75
100
|
],
|
|
76
101
|
{ onCancel },
|
|
77
102
|
);
|
|
@@ -83,5 +108,6 @@ export async function runPrompts({ argName, flags }) {
|
|
|
83
108
|
includeGithub: flags.github === false ? false : answers.includeGithub ?? true,
|
|
84
109
|
includeWorkflows: flags.workflows === false ? false : answers.includeWorkflows ?? true,
|
|
85
110
|
initGit: flags.git === false ? false : answers.initGit ?? true,
|
|
111
|
+
workDepth: flags.depth || answers.workDepth || 'standard',
|
|
86
112
|
};
|
|
87
113
|
}
|
package/src/scaffold.mjs
CHANGED
|
@@ -6,6 +6,7 @@ import { promises as fs } from 'node:fs';
|
|
|
6
6
|
import path from 'node:path';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
8
|
import { copyDir, removePath, replaceInFile, pathExists } from './utils.mjs';
|
|
9
|
+
import { writeVersionFile } from './upgrade.mjs';
|
|
9
10
|
|
|
10
11
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
12
|
// packages/create-vasvibe/src → packages/create-vasvibe/template
|
|
@@ -21,6 +22,8 @@ const TOOLCHAIN_PATHS = {
|
|
|
21
22
|
export async function scaffold({
|
|
22
23
|
targetDir,
|
|
23
24
|
projectName,
|
|
25
|
+
version,
|
|
26
|
+
workDepth = 'standard',
|
|
24
27
|
includeOpencode,
|
|
25
28
|
includeClaude,
|
|
26
29
|
includeGithub,
|
|
@@ -52,11 +55,16 @@ export async function scaffold({
|
|
|
52
55
|
|
|
53
56
|
// 4. Replace placeholders in well-known files.
|
|
54
57
|
const year = String(new Date().getFullYear());
|
|
55
|
-
const replacements = { projectName, year };
|
|
56
|
-
for (const rel of ['README.md', 'PROJECT_README.example.md', '.gitignore', 'AGENT_PERSONAS.md', 'GIT_STRUCTURE_GUIDE.md']) {
|
|
58
|
+
const replacements = { projectName, year, workDepth };
|
|
59
|
+
for (const rel of ['README.md', 'PROJECT_README.example.md', '.gitignore', 'AGENT_PERSONAS.md', 'GIT_STRUCTURE_GUIDE.md', 'project_overview_example.md']) {
|
|
57
60
|
const f = path.join(targetDir, rel);
|
|
58
61
|
if (await pathExists(f)) await replaceInFile(f, replacements);
|
|
59
62
|
}
|
|
63
|
+
|
|
64
|
+
// 5. Write version tracking file.
|
|
65
|
+
if (version) {
|
|
66
|
+
await writeVersionFile(targetDir, version);
|
|
67
|
+
}
|
|
60
68
|
}
|
|
61
69
|
|
|
62
70
|
async function removeAll(targetDir, relPaths) {
|
package/src/upgrade.mjs
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// src/upgrade.mjs
|
|
2
|
+
// Upgrade an existing vasvibe project: re-copy framework files (agents, schemas,
|
|
3
|
+
// workflows) without touching user-generated content (codes/, specifications/,
|
|
4
|
+
// task/, state/, project_overview.md, etc.).
|
|
5
|
+
|
|
6
|
+
import { promises as fs } from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import { copyDir, pathExists, log } from './utils.mjs';
|
|
10
|
+
import pc from 'picocolors';
|
|
11
|
+
|
|
12
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
const TEMPLATE_DIR = path.resolve(__dirname, '..', 'template');
|
|
14
|
+
const VERSION_FILE = '.vasvibe-version';
|
|
15
|
+
|
|
16
|
+
// Only these paths are safe to overwrite on upgrade.
|
|
17
|
+
// User content (codes/, specifications/, task/, state/, project_overview.md) is never touched.
|
|
18
|
+
const FRAMEWORK_PATHS = [
|
|
19
|
+
{ src: '.opencode', dest: '.opencode' },
|
|
20
|
+
{ src: '.claude', dest: '.claude' },
|
|
21
|
+
{ src: '.agents', dest: '.agents' },
|
|
22
|
+
{ src: '.github/prompts', dest: '.github/prompts' },
|
|
23
|
+
{ src: 'agent', dest: 'agent' },
|
|
24
|
+
{ src: 'schemas', dest: 'schemas' },
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
export async function readVersionFile(projectDir) {
|
|
28
|
+
const versionPath = path.join(projectDir, VERSION_FILE);
|
|
29
|
+
try {
|
|
30
|
+
const content = await fs.readFile(versionPath, 'utf8');
|
|
31
|
+
return content.trim();
|
|
32
|
+
} catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function writeVersionFile(projectDir, version) {
|
|
38
|
+
await fs.writeFile(path.join(projectDir, VERSION_FILE), version + '\n', 'utf8');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function isVasvibeProject(projectDir) {
|
|
42
|
+
// A vasvibe project has either .vasvibe-version or at least one agent directory.
|
|
43
|
+
if (await pathExists(path.join(projectDir, VERSION_FILE))) return true;
|
|
44
|
+
if (await pathExists(path.join(projectDir, 'agent/workflows'))) return true;
|
|
45
|
+
if (await pathExists(path.join(projectDir, '.opencode/agents'))) return true;
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export async function upgrade({ targetDir, currentVersion, newVersion, dryRun = false }) {
|
|
50
|
+
if (!(await pathExists(TEMPLATE_DIR))) {
|
|
51
|
+
throw new Error(`Template directory not found at ${TEMPLATE_DIR}.`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const updated = [];
|
|
55
|
+
const skipped = [];
|
|
56
|
+
|
|
57
|
+
for (const { src, dest } of FRAMEWORK_PATHS) {
|
|
58
|
+
const srcPath = path.join(TEMPLATE_DIR, src);
|
|
59
|
+
const destPath = path.join(targetDir, dest);
|
|
60
|
+
|
|
61
|
+
if (!(await pathExists(srcPath))) {
|
|
62
|
+
skipped.push(src);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
// Only update if the destination already exists in the project
|
|
66
|
+
// (respect the user's original toolchain choices).
|
|
67
|
+
if (!(await pathExists(destPath))) {
|
|
68
|
+
skipped.push(dest + ' (not in project)');
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!dryRun) {
|
|
73
|
+
await copyDir(srcPath, destPath);
|
|
74
|
+
}
|
|
75
|
+
updated.push(dest);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (!dryRun) {
|
|
79
|
+
await writeVersionFile(targetDir, newVersion);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return { updated, skipped };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export async function runUpgrade({ targetDir, newVersion, dryRun }) {
|
|
86
|
+
const currentVersion = await readVersionFile(targetDir);
|
|
87
|
+
|
|
88
|
+
log.blank();
|
|
89
|
+
if (currentVersion) {
|
|
90
|
+
log.info(`Current version: ${pc.yellow(currentVersion)}`);
|
|
91
|
+
} else {
|
|
92
|
+
log.warn('No .vasvibe-version file found — project may have been created before version tracking was added.');
|
|
93
|
+
}
|
|
94
|
+
log.info(`Upgrading to: ${pc.green(newVersion)}`);
|
|
95
|
+
log.blank();
|
|
96
|
+
|
|
97
|
+
if (dryRun) {
|
|
98
|
+
log.step('Dry run — no files will be changed.');
|
|
99
|
+
log.blank();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const { updated, skipped } = await upgrade({ targetDir, currentVersion, newVersion, dryRun });
|
|
103
|
+
|
|
104
|
+
for (const p of updated) {
|
|
105
|
+
log.success(`Updated: ${pc.cyan(p)}`);
|
|
106
|
+
}
|
|
107
|
+
for (const p of skipped) {
|
|
108
|
+
log.step(`Skipped: ${pc.dim(p)}`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
log.blank();
|
|
112
|
+
if (dryRun) {
|
|
113
|
+
log.info('Run without --dry-run to apply the upgrade.');
|
|
114
|
+
} else {
|
|
115
|
+
log.success(`Upgraded to ${pc.green(newVersion)}`);
|
|
116
|
+
log.blank();
|
|
117
|
+
log.step('Review the changes with ' + pc.cyan('git diff') + ' before committing.');
|
|
118
|
+
log.step('Your codes/, specifications/, task/, and state/ directories were not touched.');
|
|
119
|
+
}
|
|
120
|
+
log.blank();
|
|
121
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "backend",
|
|
3
|
+
"description": "Senior Backend Engineer \u2014 implements API, business logic & DB access per the API Contract (depth=standard|deep).",
|
|
4
|
+
"hidden": true,
|
|
5
|
+
"config": {
|
|
6
|
+
"customAgent": {
|
|
7
|
+
"systemPromptSections": [
|
|
8
|
+
{
|
|
9
|
+
"title": "Agent System Instructions",
|
|
10
|
+
"content": "You are the backend Agent. Read and follow ALL instructions in agent/workflows/backend.md as your complete system prompt. That file is your source of truth."
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"toolNames": [
|
|
14
|
+
"send_message",
|
|
15
|
+
"find_by_name",
|
|
16
|
+
"grep_search",
|
|
17
|
+
"view_file",
|
|
18
|
+
"list_dir",
|
|
19
|
+
"read_url_content",
|
|
20
|
+
"search_web",
|
|
21
|
+
"schedule",
|
|
22
|
+
"multi_replace_file_content",
|
|
23
|
+
"replace_file_content",
|
|
24
|
+
"write_to_file",
|
|
25
|
+
"run_command",
|
|
26
|
+
"manage_task",
|
|
27
|
+
"define_subagent",
|
|
28
|
+
"invoke_subagent",
|
|
29
|
+
"manage_subagents"
|
|
30
|
+
],
|
|
31
|
+
"systemPromptConfig": {
|
|
32
|
+
"includeSections": [
|
|
33
|
+
"user_information",
|
|
34
|
+
"mcp_servers",
|
|
35
|
+
"skills",
|
|
36
|
+
"subagent_reminder",
|
|
37
|
+
"messaging",
|
|
38
|
+
"artifacts",
|
|
39
|
+
"user_rules"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "data-architect",
|
|
3
|
+
"description": "Data Architect \u2014 designs data model, ERD, schema, indexing & data governance during planning.",
|
|
4
|
+
"hidden": true,
|
|
5
|
+
"config": {
|
|
6
|
+
"customAgent": {
|
|
7
|
+
"systemPromptSections": [
|
|
8
|
+
{
|
|
9
|
+
"title": "Agent System Instructions",
|
|
10
|
+
"content": "You are the data-architect Agent. Read and follow ALL instructions in agent/workflows/data-architect.md as your complete system prompt. That file is your source of truth."
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"toolNames": [
|
|
14
|
+
"send_message",
|
|
15
|
+
"find_by_name",
|
|
16
|
+
"grep_search",
|
|
17
|
+
"view_file",
|
|
18
|
+
"list_dir",
|
|
19
|
+
"read_url_content",
|
|
20
|
+
"search_web",
|
|
21
|
+
"schedule",
|
|
22
|
+
"multi_replace_file_content",
|
|
23
|
+
"replace_file_content",
|
|
24
|
+
"write_to_file",
|
|
25
|
+
"manage_task",
|
|
26
|
+
"define_subagent",
|
|
27
|
+
"invoke_subagent",
|
|
28
|
+
"manage_subagents"
|
|
29
|
+
],
|
|
30
|
+
"systemPromptConfig": {
|
|
31
|
+
"includeSections": [
|
|
32
|
+
"user_information",
|
|
33
|
+
"mcp_servers",
|
|
34
|
+
"skills",
|
|
35
|
+
"subagent_reminder",
|
|
36
|
+
"messaging",
|
|
37
|
+
"artifacts",
|
|
38
|
+
"user_rules"
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "discovery",
|
|
3
|
+
"description": "Product Discovery Lead & Business Analyst \u2014 gathers requirements interactively from the human before any document is created.",
|
|
4
|
+
"hidden": false,
|
|
5
|
+
"config": {
|
|
6
|
+
"customAgent": {
|
|
7
|
+
"systemPromptSections": [
|
|
8
|
+
{
|
|
9
|
+
"title": "Agent System Instructions",
|
|
10
|
+
"content": "You are the discovery Agent. Read and follow ALL instructions in agent/workflows/discovery.md as your complete system prompt. That file is your source of truth."
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"toolNames": [
|
|
14
|
+
"send_message",
|
|
15
|
+
"find_by_name",
|
|
16
|
+
"grep_search",
|
|
17
|
+
"view_file",
|
|
18
|
+
"list_dir",
|
|
19
|
+
"read_url_content",
|
|
20
|
+
"search_web",
|
|
21
|
+
"schedule",
|
|
22
|
+
"multi_replace_file_content",
|
|
23
|
+
"replace_file_content",
|
|
24
|
+
"write_to_file",
|
|
25
|
+
"manage_task",
|
|
26
|
+
"define_subagent",
|
|
27
|
+
"invoke_subagent",
|
|
28
|
+
"manage_subagents"
|
|
29
|
+
],
|
|
30
|
+
"systemPromptConfig": {
|
|
31
|
+
"includeSections": [
|
|
32
|
+
"user_information",
|
|
33
|
+
"mcp_servers",
|
|
34
|
+
"skills",
|
|
35
|
+
"subagent_reminder",
|
|
36
|
+
"messaging",
|
|
37
|
+
"artifacts",
|
|
38
|
+
"user_rules"
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "frontend",
|
|
3
|
+
"description": "Senior Frontend Engineer & UI Specialist \u2014 implements UI & API integration per the design system (depth=standard|deep).",
|
|
4
|
+
"hidden": true,
|
|
5
|
+
"config": {
|
|
6
|
+
"customAgent": {
|
|
7
|
+
"systemPromptSections": [
|
|
8
|
+
{
|
|
9
|
+
"title": "Agent System Instructions",
|
|
10
|
+
"content": "You are the frontend Agent. Read and follow ALL instructions in agent/workflows/frontend.md as your complete system prompt. That file is your source of truth."
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"toolNames": [
|
|
14
|
+
"send_message",
|
|
15
|
+
"find_by_name",
|
|
16
|
+
"grep_search",
|
|
17
|
+
"view_file",
|
|
18
|
+
"list_dir",
|
|
19
|
+
"read_url_content",
|
|
20
|
+
"search_web",
|
|
21
|
+
"schedule",
|
|
22
|
+
"multi_replace_file_content",
|
|
23
|
+
"replace_file_content",
|
|
24
|
+
"write_to_file",
|
|
25
|
+
"run_command",
|
|
26
|
+
"manage_task",
|
|
27
|
+
"define_subagent",
|
|
28
|
+
"invoke_subagent",
|
|
29
|
+
"manage_subagents"
|
|
30
|
+
],
|
|
31
|
+
"systemPromptConfig": {
|
|
32
|
+
"includeSections": [
|
|
33
|
+
"user_information",
|
|
34
|
+
"mcp_servers",
|
|
35
|
+
"skills",
|
|
36
|
+
"subagent_reminder",
|
|
37
|
+
"messaging",
|
|
38
|
+
"artifacts",
|
|
39
|
+
"user_rules"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "reliability",
|
|
3
|
+
"description": "Reliability & Performance Engineer \u2014 performance, resilience & load testing during per-release hardening.",
|
|
4
|
+
"hidden": true,
|
|
5
|
+
"config": {
|
|
6
|
+
"customAgent": {
|
|
7
|
+
"systemPromptSections": [
|
|
8
|
+
{
|
|
9
|
+
"title": "Agent System Instructions",
|
|
10
|
+
"content": "You are the reliability Agent. Read and follow ALL instructions in agent/workflows/reliability.md as your complete system prompt. That file is your source of truth."
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"toolNames": [
|
|
14
|
+
"send_message",
|
|
15
|
+
"find_by_name",
|
|
16
|
+
"grep_search",
|
|
17
|
+
"view_file",
|
|
18
|
+
"list_dir",
|
|
19
|
+
"read_url_content",
|
|
20
|
+
"search_web",
|
|
21
|
+
"schedule",
|
|
22
|
+
"multi_replace_file_content",
|
|
23
|
+
"replace_file_content",
|
|
24
|
+
"write_to_file",
|
|
25
|
+
"run_command",
|
|
26
|
+
"manage_task",
|
|
27
|
+
"define_subagent",
|
|
28
|
+
"invoke_subagent",
|
|
29
|
+
"manage_subagents"
|
|
30
|
+
],
|
|
31
|
+
"systemPromptConfig": {
|
|
32
|
+
"includeSections": [
|
|
33
|
+
"user_information",
|
|
34
|
+
"mcp_servers",
|
|
35
|
+
"skills",
|
|
36
|
+
"subagent_reminder",
|
|
37
|
+
"messaging",
|
|
38
|
+
"artifacts",
|
|
39
|
+
"user_rules"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "security",
|
|
3
|
+
"description": "Application Security Expert \u2014 security standards (planning) + threat modeling, OWASP audit & fixes (hardening).",
|
|
4
|
+
"hidden": false,
|
|
5
|
+
"config": {
|
|
6
|
+
"customAgent": {
|
|
7
|
+
"systemPromptSections": [
|
|
8
|
+
{
|
|
9
|
+
"title": "Agent System Instructions",
|
|
10
|
+
"content": "You are the security Agent. Read and follow ALL instructions in agent/workflows/security.md as your complete system prompt. That file is your source of truth."
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"toolNames": [
|
|
14
|
+
"send_message",
|
|
15
|
+
"find_by_name",
|
|
16
|
+
"grep_search",
|
|
17
|
+
"view_file",
|
|
18
|
+
"list_dir",
|
|
19
|
+
"read_url_content",
|
|
20
|
+
"search_web",
|
|
21
|
+
"schedule",
|
|
22
|
+
"multi_replace_file_content",
|
|
23
|
+
"replace_file_content",
|
|
24
|
+
"write_to_file",
|
|
25
|
+
"run_command",
|
|
26
|
+
"manage_task",
|
|
27
|
+
"define_subagent",
|
|
28
|
+
"invoke_subagent",
|
|
29
|
+
"manage_subagents"
|
|
30
|
+
],
|
|
31
|
+
"systemPromptConfig": {
|
|
32
|
+
"includeSections": [
|
|
33
|
+
"user_information",
|
|
34
|
+
"mcp_servers",
|
|
35
|
+
"skills",
|
|
36
|
+
"subagent_reminder",
|
|
37
|
+
"messaging",
|
|
38
|
+
"artifacts",
|
|
39
|
+
"user_rules"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ux-designer",
|
|
3
|
+
"description": "UX/UI Designer \u2014 designs the design system (colors, typography, components, motion, a11y) during planning.",
|
|
4
|
+
"hidden": true,
|
|
5
|
+
"config": {
|
|
6
|
+
"customAgent": {
|
|
7
|
+
"systemPromptSections": [
|
|
8
|
+
{
|
|
9
|
+
"title": "Agent System Instructions",
|
|
10
|
+
"content": "You are the ux-designer Agent. Read and follow ALL instructions in agent/workflows/ux-designer.md as your complete system prompt. That file is your source of truth."
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"toolNames": [
|
|
14
|
+
"send_message",
|
|
15
|
+
"find_by_name",
|
|
16
|
+
"grep_search",
|
|
17
|
+
"view_file",
|
|
18
|
+
"list_dir",
|
|
19
|
+
"read_url_content",
|
|
20
|
+
"search_web",
|
|
21
|
+
"schedule",
|
|
22
|
+
"multi_replace_file_content",
|
|
23
|
+
"replace_file_content",
|
|
24
|
+
"write_to_file",
|
|
25
|
+
"manage_task",
|
|
26
|
+
"define_subagent",
|
|
27
|
+
"invoke_subagent",
|
|
28
|
+
"manage_subagents"
|
|
29
|
+
],
|
|
30
|
+
"systemPromptConfig": {
|
|
31
|
+
"includeSections": [
|
|
32
|
+
"user_information",
|
|
33
|
+
"mcp_servers",
|
|
34
|
+
"skills",
|
|
35
|
+
"subagent_reminder",
|
|
36
|
+
"messaging",
|
|
37
|
+
"artifacts",
|
|
38
|
+
"user_rules"
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Jalankan Fase 2 (Pengerjaan) — implementasi satu fitur dari spec yang sudah ada.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Jalankan **Fase 2 — Pengerjaan** untuk fitur: **$ARGUMENTS**
|
|
6
|
+
|
|
7
|
+
Langkah:
|
|
8
|
+
1. **PM** → buat task & detail file dari spec
|
|
9
|
+
2. **Analyst (spec-lock)** → matangkan AC detail untuk fitur ini
|
|
10
|
+
3. **Implementasi sesuai depth:**
|
|
11
|
+
- `depth=fast` → **Developer** (fullstack tunggal)
|
|
12
|
+
- `depth=standard|deep` → **Backend Engineer** ∥ **Frontend Engineer** (paralel, honor API Contract)
|
|
13
|
+
4. **QA** → static review + unit test
|
|
14
|
+
5. **GATE — Code review lulus:** Human review pakai QA report.
|
|
15
|
+
|
|
16
|
+
**Aturan orkestrasi (WAJIB):**
|
|
17
|
+
- Kamu adalah **Orchestrator** di thread utama. Delegasikan tiap langkah ke subagent yang disebut menggunakan Task tool (Claude Code) / agent invocation (OpenCode).
|
|
18
|
+
- **BERHENTI di setiap GATE / CHECKPOINT** dan minta persetujuan human secara eksplisit sebelum lanjut.
|
|
19
|
+
- Definisi kanonik pipeline: baca `agent/workflows/orchestrator.md`. Model fase & kepemilikan dokumen: `agent/workflows/_shared/phases.md`.
|
|
20
|
+
- Hormati `WORK_DEPTH` dari `project_overview.md` (override dengan `depth=` di argumen jika ada).
|
|
21
|
+
- Jika muncul perubahan di tengah pipeline, ikuti `agent/workflows/_shared/change-management.md` (No Silent Changes).
|