@ngocsangairvds/vsaf 3.1.0 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/graphify/SKILL.md +1 -1
- package/.claude/skills/vsaf-build/SKILL.md +94 -64
- package/.claude/skills/vsaf-discover/SKILL.md +56 -56
- package/.claude/skills/vsaf-doc/SKILL.md +9 -9
- package/.claude/skills/vsaf-doc-prd/SKILL.md +32 -32
- package/.claude/skills/vsaf-doc-srs/SKILL.md +88 -88
- package/.claude/skills/vsaf-docs/SKILL.md +50 -50
- package/.claude/skills/vsaf-onboard/SKILL.md +60 -25
- package/.claude/skills/vsaf-plan/SKILL.md +76 -54
- package/.claude/skills/vsaf-retro/SKILL.md +94 -0
- package/.claude/skills/vsaf-ship/SKILL.md +83 -50
- package/.claude/skills/vsaf-sprint/SKILL.md +42 -42
- package/.claude/skills/vsaf-test/SKILL.md +159 -41
- package/README.md +300 -153
- package/bin/vsaf.js +8 -9
- package/package.json +3 -3
- package/src/global.js +0 -15
- package/src/project.js +0 -9
- package/src/status.js +0 -3
- package/src/workflow.js +15 -16
- package/.claude/skills/vsaf-memory-protocol.md +0 -51
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngocsangairvds/vsaf",
|
|
3
|
-
"version": "3.1.
|
|
4
|
-
"description": "VSAF — Agentic AI SDLC Framework.
|
|
5
|
-
"keywords": ["claude", "claude-code", "ai", "sdlc", "framework", "bmad", "gitnexus", "
|
|
3
|
+
"version": "3.1.2",
|
|
4
|
+
"description": "VSAF — Agentic AI SDLC Framework. 3 integrated tools: BMAD, GitNexus, Superpowers. 2-layer review.",
|
|
5
|
+
"keywords": ["claude", "claude-code", "ai", "sdlc", "framework", "bmad", "gitnexus", "superpowers"],
|
|
6
6
|
"bin": {
|
|
7
7
|
"vsaf": "./bin/vsaf.js"
|
|
8
8
|
},
|
package/src/global.js
CHANGED
|
@@ -14,8 +14,6 @@ async function installGlobal() {
|
|
|
14
14
|
|
|
15
15
|
installSkills();
|
|
16
16
|
installBinary('gitnexus', () => exec('npm install -g gitnexus'));
|
|
17
|
-
installPipx('mempalace', 'mempalace');
|
|
18
|
-
installPipx('graphify', 'graphifyy');
|
|
19
17
|
|
|
20
18
|
console.log('\n\x1b[32m\x1b[1m✓ Global infra ready.\x1b[0m\n');
|
|
21
19
|
}
|
|
@@ -62,17 +60,4 @@ function installBinary(name, installFn) {
|
|
|
62
60
|
: warn(`${name} install failed — run manually`);
|
|
63
61
|
}
|
|
64
62
|
|
|
65
|
-
function installPipx(cmd, pkg) {
|
|
66
|
-
step(cmd);
|
|
67
|
-
if (hasCommand(cmd)) { ok(`${cmd} already installed`); return; }
|
|
68
|
-
if (!hasCommand('pipx')) {
|
|
69
|
-
warn(`pipx not found — install pipx first, then run: pipx install ${pkg}`);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
info(`Installing ${pkg} via pipx...`);
|
|
73
|
-
exec(`pipx install ${pkg}`)
|
|
74
|
-
? ok(`${cmd} installed`)
|
|
75
|
-
: warn(`${cmd} install failed — run: pipx install ${pkg}`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
63
|
module.exports = { installGlobal };
|
package/src/project.js
CHANGED
|
@@ -18,7 +18,6 @@ async function installProject() {
|
|
|
18
18
|
scaffoldBmadWorkspace();
|
|
19
19
|
syncLocalBmadSkills();
|
|
20
20
|
initGitNexus();
|
|
21
|
-
initMemPalace();
|
|
22
21
|
|
|
23
22
|
console.log('\n\x1b[32m\x1b[1m✓ Project ready.\x1b[0m');
|
|
24
23
|
console.log('\n Next steps:');
|
|
@@ -146,12 +145,4 @@ function initGitNexus() {
|
|
|
146
145
|
exec('gitnexus analyze', { cwd: CWD }) ? ok('Repository indexed') : warn('gitnexus analyze failed — run manually');
|
|
147
146
|
}
|
|
148
147
|
|
|
149
|
-
function initMemPalace() {
|
|
150
|
-
step('MemPalace');
|
|
151
|
-
if (!hasCommand('mempalace')) { warn('mempalace not found — run: vsaf global'); return; }
|
|
152
|
-
if (fs.existsSync(path.join(CWD, 'mempalace.yaml'))) { ok('MemPalace already initialised'); return; }
|
|
153
|
-
info('Initialising mempalace...');
|
|
154
|
-
exec(`mempalace init --yes "${CWD}"`, { cwd: CWD }) ? ok('MemPalace initialised') : warn('mempalace init failed — run manually');
|
|
155
|
-
}
|
|
156
|
-
|
|
157
148
|
module.exports = { installProject };
|
package/src/status.js
CHANGED
|
@@ -10,8 +10,6 @@ async function showStatus() {
|
|
|
10
10
|
console.log('\x1b[1mGlobal (machine-wide → ~/.claude/)\x1b[0m');
|
|
11
11
|
checkSkills();
|
|
12
12
|
checkCmd('gitnexus', 'GitNexus');
|
|
13
|
-
checkCmd('mempalace', 'MemPalace');
|
|
14
|
-
checkCmd('graphify', 'Graphify');
|
|
15
13
|
|
|
16
14
|
// ── Project ────────────────────────────────────────────────────────────────
|
|
17
15
|
console.log('\n\x1b[1mProject (current repo)\x1b[0m');
|
|
@@ -22,7 +20,6 @@ async function showStatus() {
|
|
|
22
20
|
checkProjectSkillDir('.claude/skills', 'Project BMAD skills (.claude)');
|
|
23
21
|
checkProjectSkillDir('.codex/skills', 'Project BMAD skills (.codex)');
|
|
24
22
|
checkPath('.gitnexus', 'GitNexus index');
|
|
25
|
-
checkPath('mempalace.yaml', 'MemPalace');
|
|
26
23
|
console.log('');
|
|
27
24
|
}
|
|
28
25
|
|
package/src/workflow.js
CHANGED
|
@@ -38,21 +38,6 @@ function runReview() {
|
|
|
38
38
|
return false;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
function runMine() {
|
|
42
|
-
step('Mine');
|
|
43
|
-
if (!hasCommand('mempalace')) {
|
|
44
|
-
warn('mempalace not found — run: vsaf global');
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
info('Running mempalace mine ~/chats/ --mode convos --extract general...');
|
|
49
|
-
const mineOk = exec('mempalace mine ~/chats/ --mode convos --extract general');
|
|
50
|
-
mineOk
|
|
51
|
-
? ok('MemPalace mine completed')
|
|
52
|
-
: warn('mempalace mine failed — run manually');
|
|
53
|
-
return mineOk;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
41
|
function runClean() {
|
|
57
42
|
step('Clean');
|
|
58
43
|
if (!hasCommand('gitnexus')) {
|
|
@@ -66,4 +51,18 @@ function runClean() {
|
|
|
66
51
|
return cleanOk;
|
|
67
52
|
}
|
|
68
53
|
|
|
69
|
-
|
|
54
|
+
function runServe() {
|
|
55
|
+
step('Serve');
|
|
56
|
+
|
|
57
|
+
if (!hasCommand('gitnexus')) {
|
|
58
|
+
warn('gitnexus not found — run: vsaf global');
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
info('Starting GitNexus web server on port 4747...');
|
|
63
|
+
info('Open https://gitnexus.vercel.app to browse your project graph');
|
|
64
|
+
info('Press Ctrl+C to stop');
|
|
65
|
+
return exec('gitnexus serve');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
module.exports = { runIndex, runReview, runClean, runServe };
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# VSAF Memory Protocol
|
|
2
|
-
|
|
3
|
-
Đây là protocol chung được tất cả vsaf skills sử dụng.
|
|
4
|
-
Thực hiện tự động — không cần user nhắc.
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## AUTO-READ (thực hiện ở đầu mỗi skill)
|
|
9
|
-
|
|
10
|
-
Thực hiện tuần tự, không bỏ qua:
|
|
11
|
-
|
|
12
|
-
1. **claude-mem** — kiểm tra session context đã sẵn sàng:
|
|
13
|
-
- Nếu có `$ARGUMENTS`: search claude-mem với keyword từ arguments
|
|
14
|
-
- Dùng `mcp__plugin_claude-mem_mcp-search__search` nếu có thể
|
|
15
|
-
|
|
16
|
-
2. **MemPalace — search theo topic**:
|
|
17
|
-
- Gọi `mcp__mempalace__mempalace_search` với keyword chính từ task/feature
|
|
18
|
-
- Gọi `mcp__mempalace__mempalace_search` với tên module/domain liên quan
|
|
19
|
-
- Gọi `mcp__mempalace__mempalace_search` với "pattern" hoặc "decision" nếu cần context rộng hơn
|
|
20
|
-
|
|
21
|
-
3. **Áp dụng kết quả**:
|
|
22
|
-
- Nếu tìm thấy relevant memories: tóm tắt ngắn gọn trước khi bắt đầu ("Từ memory: team đã dùng pattern X, tránh Y")
|
|
23
|
-
- Nếu không tìm thấy: tiếp tục bình thường, không báo lỗi
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## AUTO-WRITE (thực hiện ở cuối vsaf-ship và vsaf-doc)
|
|
28
|
-
|
|
29
|
-
Thực hiện tuần tự sau khi task hoàn tất:
|
|
30
|
-
|
|
31
|
-
1. **Diary** — ghi tóm tắt session:
|
|
32
|
-
- Gọi `mcp__mempalace__mempalace_diary_write`
|
|
33
|
-
- Nội dung: feature gì, approach nào, kết quả ra sao
|
|
34
|
-
|
|
35
|
-
2. **Decisions** — lưu từng quyết định quan trọng:
|
|
36
|
-
- Với mỗi decision không hiển nhiên (pattern mới, workaround, trade-off):
|
|
37
|
-
- Gọi `mcp__mempalace__mempalace_add_drawer`
|
|
38
|
-
- Format: "Quyết định: [X]. Lý do: [Y]. Alternatives bỏ qua: [Z]"
|
|
39
|
-
|
|
40
|
-
3. **Reasoning chain** — capture knowledge graph:
|
|
41
|
-
- Gọi `mcp__mempalace__mempalace_kg_add` để lưu relationships giữa các concepts
|
|
42
|
-
- Ưu tiên: gotchas phát hiện khi implement, dependencies ẩn, edge cases thực tế
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Nguyên tắc
|
|
47
|
-
|
|
48
|
-
- **Đọc trước, không đoán** — dù đã biết domain, vẫn phải check memory trước
|
|
49
|
-
- **Ghi decisions, không ghi code** — code ở trong repo, memory lưu lý do và context
|
|
50
|
-
- **Không báo user** khi memory trống — tiếp tục bình thường
|
|
51
|
-
- **Không chờ user confirm** để đọc/ghi memory — làm tự động
|