@ngocsangairvds/vsaf 4.0.0 → 4.0.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/package.json +1 -1
- package/packages/cli/dist/commands/install.d.ts.map +1 -1
- package/packages/cli/dist/commands/install.js +13 -0
- package/packages/cli/dist/commands/install.js.map +1 -1
- package/skills/sdlc/discovery/SKILL.md +20 -5
- package/skills/sdlc/implement/SKILL.md +47 -14
- package/skills/sdlc/pack.yaml +1 -1
- package/skills/vds-skill/_shared/credentials.sh +79 -0
- package/skills/vds-skill/create-bitbucket-pr/SKILL.md +47 -0
- package/skills/vds-skill/create-bitbucket-pr/scripts/create-pr.sh +107 -0
- package/skills/vds-skill/create-jira-epic/SKILL.md +46 -0
- package/skills/vds-skill/create-jira-epic/scripts/create-epic.sh +113 -0
- package/skills/vds-skill/pack.yaml +24 -0
- package/skills/vds-skill/pull/SKILL.md +38 -0
- package/skills/vds-skill/pull/scripts/pull.sh +52 -0
- package/skills/vds-skill/push-prd/SKILL.md +218 -0
- package/skills/vds-skill/push-srs/SKILL.md +108 -0
- package/skills/vds-skill/search-confluence/SKILL.md +44 -0
- package/skills/vds-skill/search-confluence/scripts/search.sh +137 -0
- package/skills/vds-skill/vds-scripts-skill/.openskills.json +6 -0
- package/skills/vds-skill/vds-scripts-skill/QUALITY.md +44 -0
- package/skills/vds-skill/vds-scripts-skill/SKILL.md +127 -0
- package/skills/vds-skill/vds-scripts-skill/references/audit-commands.md +171 -0
- package/skills/vds-skill/vds-scripts-skill/references/capability-index.md +34 -0
- package/skills/vds-skill/vds-scripts-skill/references/development-commands.md +12 -0
- package/skills/vds-skill/vds-scripts-skill/references/google-sheets.md +71 -0
- package/skills/vds-skill/vds-scripts-skill/references/integration-commands.md +17 -0
- package/skills/vds-skill/vds-scripts-skill/references/platform-bootstrap.md +31 -0
- package/skills/vds-skill/vds-scripts-skill/references/specialist-routing.md +14 -0
- package/skills/vds-skill/vds-scripts-skill/references/validation-commands.md +15 -0
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAGD,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAOD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/C,YAAY,CA4Bd;AAUD,wBAAgB,aAAa,IAAI,WAAW,EAAE,CAU7C;AAqCD,wBAAgB,eAAe,IAAI,cAAc,CAqDhD;AAmBD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,sBAA2B,GACnC,aAAa,
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAGD,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAOD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/C,YAAY,CA4Bd;AAUD,wBAAgB,aAAa,IAAI,WAAW,EAAE,CAU7C;AAqCD,wBAAgB,eAAe,IAAI,cAAc,CAqDhD;AAmBD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,sBAA2B,GACnC,aAAa,CAiGf"}
|
|
@@ -177,6 +177,19 @@ function execInstall(pack, projectPath, options = {}) {
|
|
|
177
177
|
deploy.deployed.push(...bundled.deployed);
|
|
178
178
|
deploy.skipped.push(...bundled.skipped);
|
|
179
179
|
}
|
|
180
|
+
// Step 1c: Deploy _shared/ folder if pack has it (helper files for skill scripts)
|
|
181
|
+
// Namespace by pack name to avoid collision: <skillsDir>/_shared/<packName>/
|
|
182
|
+
// Always overwrite (no --force needed) — helpers must stay in sync with skills
|
|
183
|
+
const sharedSrc = (0, path_1.join)(packDir, '_shared');
|
|
184
|
+
if ((0, fs_1.existsSync)(sharedSrc)) {
|
|
185
|
+
const sharedTarget = (0, path_1.join)(skillsDir, '_shared', pack);
|
|
186
|
+
if ((0, fs_1.existsSync)(sharedTarget)) {
|
|
187
|
+
(0, fs_1.rmSync)(sharedTarget, { recursive: true, force: true });
|
|
188
|
+
}
|
|
189
|
+
(0, fs_1.mkdirSync)((0, path_1.join)(skillsDir, '_shared'), { recursive: true });
|
|
190
|
+
(0, fs_1.cpSync)(sharedSrc, sharedTarget, { recursive: true });
|
|
191
|
+
deploy.deployed.push(`_shared/${pack}`);
|
|
192
|
+
}
|
|
180
193
|
console.log(`\n[vsaf] Skills deployed to ${skillsDir}`);
|
|
181
194
|
for (const name of deploy.deployed)
|
|
182
195
|
console.log(` ✓ ${name}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":";;AAkDA,oCAkCC;AAUD,sCAUC;AAqCD,0CAqDC;AAmBD,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -85,17 +85,32 @@ Use `/bmad-advanced-elicitation` — grill questions BASED ON system understandi
|
|
|
85
85
|
[DISCOVERY] [3/6] Grill session — asking detailed questions... ✅
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
### Step 4: Brainstorming
|
|
88
|
+
### Step 4: Dual Brainstorming
|
|
89
89
|
|
|
90
90
|
```
|
|
91
|
-
[DISCOVERY] [4/6]
|
|
91
|
+
[DISCOVERY] [4/6] Dual brainstorming based on grill answers... ⏳
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
Two complementary brainstorming approaches:
|
|
95
|
+
|
|
96
|
+
**4a — Structured brainstorm (Superpowers)**
|
|
97
|
+
|
|
98
|
+
Use `/superpowers:brainstorming` for structured exploration:
|
|
99
|
+
- 2-3 viable approaches with trade-offs
|
|
100
|
+
- Risk/constraint evaluation per approach
|
|
101
|
+
- Recommended option with reasoning
|
|
102
|
+
|
|
103
|
+
**4b — Creative brainstorm (BMAD)**
|
|
104
|
+
|
|
105
|
+
Use `/bmad-brainstorming` to explore alternatives and uncover hidden risks:
|
|
106
|
+
- Facilitator-led, diverse creative techniques
|
|
107
|
+
- Goal: ≥20 ideas/alternatives before reorganizing
|
|
108
|
+
- Surfaces edge cases the structured approach may miss
|
|
109
|
+
|
|
110
|
+
Record both results in `01-discovery.md` — §Problem Statement (4a) + §Alternatives (4b).
|
|
96
111
|
|
|
97
112
|
```
|
|
98
|
-
[DISCOVERY] [4/6]
|
|
113
|
+
[DISCOVERY] [4/6] Dual brainstorming based on grill answers... ✅
|
|
99
114
|
```
|
|
100
115
|
|
|
101
116
|
### Step 5: Domain Research + Existing Code Scan
|
|
@@ -20,7 +20,7 @@ You are a Senior Software Engineer. Your mission: implement code following TDD
|
|
|
20
20
|
## Phase Entry Protocol
|
|
21
21
|
|
|
22
22
|
```
|
|
23
|
-
[IMPLEMENT] [1/
|
|
23
|
+
[IMPLEMENT] [1/8] Checking input artifacts... ⏳
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
1. Input:
|
|
@@ -34,7 +34,7 @@ You are a Senior Software Engineer. Your mission: implement code following TDD
|
|
|
34
34
|
5. Query `graph.json` for code structure
|
|
35
35
|
|
|
36
36
|
```
|
|
37
|
-
[IMPLEMENT] [1/
|
|
37
|
+
[IMPLEMENT] [1/8] Checking input artifacts... ✅
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
**Note:** This phase MUST run via `/superpowers:subagent-driven-development` — dispatch parallel subagents for each epic according to the Conflict Map in `04-epics.md`.
|
|
@@ -42,7 +42,7 @@ You are a Senior Software Engineer. Your mission: implement code following TDD
|
|
|
42
42
|
## Subagent-Driven Development Protocol
|
|
43
43
|
|
|
44
44
|
```
|
|
45
|
-
[IMPLEMENT] [2/
|
|
45
|
+
[IMPLEMENT] [2/8] Initializing subagent-driven development... ⏳
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
**MANDATORY** — Check and activate `/superpowers:subagent-driven-development`:
|
|
@@ -52,7 +52,7 @@ You are a Senior Software Engineer. Your mission: implement code following TDD
|
|
|
52
52
|
4. Each subagent follows the Conflict Map — only modify files assigned to its epic
|
|
53
53
|
|
|
54
54
|
```
|
|
55
|
-
[IMPLEMENT] [2/
|
|
55
|
+
[IMPLEMENT] [2/8] Initializing subagent-driven development... ✅
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
## SonarQube Quality Gate — Apply DURING Coding
|
|
@@ -85,7 +85,7 @@ You are a Senior Software Engineer. Your mission: implement code following TDD
|
|
|
85
85
|
### Step 3: Task Planning
|
|
86
86
|
|
|
87
87
|
```
|
|
88
|
-
[IMPLEMENT] [3/
|
|
88
|
+
[IMPLEMENT] [3/8] Task planning from testcases + ADR... ⏳
|
|
89
89
|
```
|
|
90
90
|
|
|
91
91
|
Use `/superpowers:writing-plans` — create granular task plan from testcases + ADR.
|
|
@@ -93,13 +93,34 @@ Each task maps to ≥1 FR/NFR.
|
|
|
93
93
|
Write to `07-impl-plan.md`.
|
|
94
94
|
|
|
95
95
|
```
|
|
96
|
-
[IMPLEMENT] [3/
|
|
96
|
+
[IMPLEMENT] [3/8] Task planning from testcases + ADR... ✅
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Step 3.5: Checkpoint Review (every 3-5 tasks)
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
[IMPLEMENT] [3.5/8] Checkpoint review... ⏳
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
After every 3-5 completed tasks: invoke `/bmad-checkpoint-preview` (human-in-the-loop walkthrough).
|
|
106
|
+
|
|
107
|
+
Purpose: pause and let the user review progress before continuing.
|
|
108
|
+
|
|
109
|
+
The checkpoint will:
|
|
110
|
+
- Summarize: what was done, which files changed, current tests status
|
|
111
|
+
- Highlight: points of concern, potential issues
|
|
112
|
+
- Ask user: continue / adjust / stop?
|
|
113
|
+
|
|
114
|
+
**Skip checkpoint if** the total plan has fewer than 5 tasks — checkpoint only at the end in that case.
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
[IMPLEMENT] [3.5/8] Checkpoint review... ✅
|
|
97
118
|
```
|
|
98
119
|
|
|
99
120
|
### Step 4: TDD Cycle (per subagent)
|
|
100
121
|
|
|
101
122
|
```
|
|
102
|
-
[IMPLEMENT] [4/
|
|
123
|
+
[IMPLEMENT] [4/8] TDD cycle — RED → GREEN → REFACTOR... ⏳
|
|
103
124
|
```
|
|
104
125
|
|
|
105
126
|
Use `/superpowers:test-driven-development`:
|
|
@@ -118,40 +139,52 @@ For each test case in `06-testcases.md`:
|
|
|
118
139
|
Use `/superpowers:executing-plans` — execute plan in order.
|
|
119
140
|
|
|
120
141
|
```
|
|
121
|
-
[IMPLEMENT] [4/
|
|
142
|
+
[IMPLEMENT] [4/8] TDD cycle — RED → GREEN → REFACTOR... ✅
|
|
122
143
|
```
|
|
123
144
|
|
|
124
145
|
### Step 5: Debug (if needed)
|
|
125
146
|
|
|
126
147
|
```
|
|
127
|
-
[IMPLEMENT] [5/
|
|
148
|
+
[IMPLEMENT] [5/8] Debug (if there are test failures)... ⏳
|
|
128
149
|
```
|
|
129
150
|
|
|
130
151
|
Use `/superpowers:systematic-debugging` — when a test does not turn GREEN:
|
|
131
152
|
- Hypothesis → Experiment → Conclusion
|
|
132
153
|
- If it fails 3 times → STOP, escalate
|
|
133
154
|
|
|
155
|
+
**Scope-drift detection:**
|
|
156
|
+
|
|
157
|
+
If during implementation you detect the feature requires CHANGES NOT IN THE SRS:
|
|
158
|
+
1. Invoke `/bmad-correct-course` — assess impact + propose adjustments
|
|
159
|
+
2. If requirements have genuinely changed:
|
|
160
|
+
- STOP implementation
|
|
161
|
+
- Update SRS first via `/sdlc-srs` EDIT mode
|
|
162
|
+
- Re-run `/sdlc-test-design` to generate new test cases
|
|
163
|
+
- Restart Phase 6 from Step 3
|
|
164
|
+
3. If only minor adjustments needed: document the adjustment in `07-impl-plan.md` §Scope Adjustments and continue
|
|
165
|
+
4. If unclear whether scope changed: STOP and present to user — let them decide
|
|
166
|
+
|
|
134
167
|
```
|
|
135
|
-
[IMPLEMENT] [5/
|
|
168
|
+
[IMPLEMENT] [5/8] Debug (if there are test failures)... ✅
|
|
136
169
|
```
|
|
137
170
|
|
|
138
171
|
### Step 6: Impact Verification
|
|
139
172
|
|
|
140
173
|
```
|
|
141
|
-
[IMPLEMENT] [6/
|
|
174
|
+
[IMPLEMENT] [6/8] Impact verification via GitNexus... ⏳
|
|
142
175
|
```
|
|
143
176
|
|
|
144
177
|
Use GitNexus `impact` — verify no other code is broken.
|
|
145
178
|
Use GitNexus `rename` — safe multi-file refactoring if needed.
|
|
146
179
|
|
|
147
180
|
```
|
|
148
|
-
[IMPLEMENT] [6/
|
|
181
|
+
[IMPLEMENT] [6/8] Impact verification via GitNexus... ✅
|
|
149
182
|
```
|
|
150
183
|
|
|
151
184
|
### Step 7: Build & Run Verification
|
|
152
185
|
|
|
153
186
|
```
|
|
154
|
-
[IMPLEMENT] [7/
|
|
187
|
+
[IMPLEMENT] [7/8] Build & run verification... ⏳
|
|
155
188
|
```
|
|
156
189
|
|
|
157
190
|
**MANDATORY** — code MUST compile and run successfully before exiting the phase.
|
|
@@ -183,7 +216,7 @@ Use GitNexus `rename` — safe multi-file refactoring if needed.
|
|
|
183
216
|
⚠️ **DO NOT exit the phase if code does not compile.** This is a hard gate — no exceptions.
|
|
184
217
|
|
|
185
218
|
```
|
|
186
|
-
[IMPLEMENT] [7/
|
|
219
|
+
[IMPLEMENT] [7/8] Build & run verification... ✅
|
|
187
220
|
```
|
|
188
221
|
|
|
189
222
|
## Multi-machine Branching
|
package/skills/sdlc/pack.yaml
CHANGED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Shared credential helper for vds-skill-* skills.
|
|
3
|
+
# Sourced by skill scripts to lazy-prompt + persist credentials.
|
|
4
|
+
# Config file: ~/.vds/sdlc-config.env (chmod 600)
|
|
5
|
+
#
|
|
6
|
+
# Portable across bash and zsh (uses eval for indirect expansion).
|
|
7
|
+
|
|
8
|
+
VSAF_CONFIG_FILE="${VSAF_CONFIG_FILE:-$HOME/.vds/sdlc-config.env}"
|
|
9
|
+
readonly VSAF_CONFIG_FILE
|
|
10
|
+
|
|
11
|
+
# Load existing config if present
|
|
12
|
+
if [[ -f "$VSAF_CONFIG_FILE" ]]; then
|
|
13
|
+
# shellcheck source=/dev/null
|
|
14
|
+
source "$VSAF_CONFIG_FILE"
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# Also load vds-cli's own env if present (for token reuse)
|
|
18
|
+
if [[ -f "$HOME/.vds/.env" ]]; then
|
|
19
|
+
set -a
|
|
20
|
+
# shellcheck source=/dev/null
|
|
21
|
+
source "$HOME/.vds/.env"
|
|
22
|
+
set +a
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# ensure_env VAR_NAME "Prompt message" [is_secret]
|
|
26
|
+
# Prompts user if VAR is empty, persists to config file.
|
|
27
|
+
# Re-persists if VAR is pre-set (supports token rotation).
|
|
28
|
+
ensure_env() {
|
|
29
|
+
local var="$1"
|
|
30
|
+
local prompt="${2:-Enter $var}"
|
|
31
|
+
local is_secret="${3:-true}"
|
|
32
|
+
|
|
33
|
+
# Portable indirect expansion (works in both bash and zsh)
|
|
34
|
+
local value
|
|
35
|
+
eval "value=\${$var:-}"
|
|
36
|
+
|
|
37
|
+
if [[ -z "$value" ]]; then
|
|
38
|
+
# Prompt user
|
|
39
|
+
if [[ "$is_secret" == "true" ]]; then
|
|
40
|
+
read -rsp "$prompt: " value
|
|
41
|
+
echo "" >&2
|
|
42
|
+
else
|
|
43
|
+
read -rp "$prompt: " value
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
if [[ -z "$value" ]]; then
|
|
47
|
+
echo "ERROR: $var is required" >&2
|
|
48
|
+
return 1
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
export "$var=$value"
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# Persist to config file (idempotent — replace existing entry or append)
|
|
55
|
+
mkdir -p "$(dirname "$VSAF_CONFIG_FILE")" || { echo "ERROR: Cannot create config dir $(dirname "$VSAF_CONFIG_FILE")" >&2; return 1; }
|
|
56
|
+
|
|
57
|
+
if grep -q "^${var}=" "$VSAF_CONFIG_FILE" 2>/dev/null; then
|
|
58
|
+
# Update in place (BSD/GNU sed compatible via tmp file)
|
|
59
|
+
local tmp
|
|
60
|
+
tmp=$(mktemp) || { echo "ERROR: mktemp failed" >&2; return 1; }
|
|
61
|
+
trap 'rm -f "$tmp"' EXIT INT TERM
|
|
62
|
+
grep -v "^${var}=" "$VSAF_CONFIG_FILE" > "$tmp"
|
|
63
|
+
printf '%s=%q\n' "$var" "$value" >> "$tmp"
|
|
64
|
+
mv "$tmp" "$VSAF_CONFIG_FILE"
|
|
65
|
+
trap - EXIT INT TERM
|
|
66
|
+
else
|
|
67
|
+
printf '%s=%q\n' "$var" "$value" >> "$VSAF_CONFIG_FILE"
|
|
68
|
+
fi
|
|
69
|
+
chmod 600 "$VSAF_CONFIG_FILE" || echo "WARN: Could not set chmod 600 on $VSAF_CONFIG_FILE" >&2
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
# require_command COMMAND_NAME — exits 127 if missing
|
|
73
|
+
require_command() {
|
|
74
|
+
if ! command -v "$1" >/dev/null 2>&1; then
|
|
75
|
+
echo "ERROR: Required command '$1' not found in PATH" >&2
|
|
76
|
+
echo " Install it before running this skill." >&2
|
|
77
|
+
return 127
|
|
78
|
+
fi
|
|
79
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vds-skill-create-bitbucket-pr
|
|
3
|
+
description: Create a Bitbucket PR via `vds-cli bitbucket pr create`. Auto-extracts PROJECT/REPO from `git remote get-url origin`. Viettel-only — for GitHub use `gh pr create`. Run after /sdlc-ship when remote is bitbucket.digital.vn.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /vds-skill-create-bitbucket-pr
|
|
7
|
+
|
|
8
|
+
Create a Bitbucket PR on Viettel internal Bitbucket via `vds-cli`.
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
|
|
12
|
+
- `vds-cli` installed (for non-dry-run)
|
|
13
|
+
- Inside a git repo with remote pointing to `bitbucket.digital.vn`
|
|
14
|
+
- On a named branch (not detached HEAD)
|
|
15
|
+
- `VDS_BITBUCKET_TOKEN` set OR lazy-prompted
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
/vds-skill-create-bitbucket-pr # interactive, target=master
|
|
21
|
+
/vds-skill-create-bitbucket-pr --target develop # different target
|
|
22
|
+
/vds-skill-create-bitbucket-pr --dry-run # preview without executing
|
|
23
|
+
/vds-skill-create-bitbucket-pr --description-file FILE # custom description
|
|
24
|
+
/vds-skill-create-bitbucket-pr --title "Custom title"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Behavior
|
|
28
|
+
|
|
29
|
+
1. Verify remote URL matches `bitbucket.digital.vn` — abort if not
|
|
30
|
+
2. Extract PROJECT/REPO from remote URL
|
|
31
|
+
3. Determine source branch (current) + target (default `master`)
|
|
32
|
+
4. Auto-detect description from `.vsaf/docs/features/*/09-ship.md` or `.vsaf/docs/hotfixes/*/03-ship.md`
|
|
33
|
+
5. Lazy-prompt `VDS_BITBUCKET_TOKEN` if not set
|
|
34
|
+
6. Confirm with user before executing
|
|
35
|
+
7. Run `vds-cli bitbucket pr create $PROJECT/$REPO --source ... --target ... --title ... --description-file ... --yes --json-only`
|
|
36
|
+
|
|
37
|
+
## Implementation
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
bash ~/.claude/skills/vds-skill-create-bitbucket-pr/scripts/create-pr.sh "$@"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Notes
|
|
44
|
+
|
|
45
|
+
- For GitHub repos: use `gh pr create` instead (already standard in `/sdlc-ship`).
|
|
46
|
+
- PR description defaults to the latest ship report from `.vsaf/docs/`.
|
|
47
|
+
- Dry-run works without `vds-cli` installed (preview mode).
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# vds-skill-create-bitbucket-pr: create Bitbucket PR via vds-cli
|
|
3
|
+
# Usage: create-pr.sh [--dry-run] [--target BRANCH] [--description-file FILE] [--title TITLE]
|
|
4
|
+
# Auto-extracts project/repo from `git remote get-url origin`.
|
|
5
|
+
|
|
6
|
+
# NOTE: No `set -e` — we want full control of the exit-code path.
|
|
7
|
+
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
|
+
# shellcheck source=/dev/null
|
|
10
|
+
source "$SCRIPT_DIR/../../_shared/vds-skill/credentials.sh"
|
|
11
|
+
|
|
12
|
+
require_command git
|
|
13
|
+
# Note: require_command vds-cli moved AFTER dry-run check.
|
|
14
|
+
|
|
15
|
+
DRY_RUN=false
|
|
16
|
+
TARGET_BRANCH="master"
|
|
17
|
+
DESC_FILE=""
|
|
18
|
+
TITLE=""
|
|
19
|
+
|
|
20
|
+
while [[ $# -gt 0 ]]; do
|
|
21
|
+
case "$1" in
|
|
22
|
+
--dry-run) DRY_RUN=true; shift ;;
|
|
23
|
+
--target) TARGET_BRANCH="$2"; shift 2 ;;
|
|
24
|
+
--description-file) DESC_FILE="$2"; shift 2 ;;
|
|
25
|
+
--title) TITLE="$2"; shift 2 ;;
|
|
26
|
+
*) echo "Unknown arg: $1" >&2; exit 2 ;;
|
|
27
|
+
esac
|
|
28
|
+
done
|
|
29
|
+
|
|
30
|
+
REMOTE_URL=$(git remote get-url origin 2>/dev/null || true)
|
|
31
|
+
if [[ -z "$REMOTE_URL" ]]; then
|
|
32
|
+
echo "ERROR: No git remote 'origin' configured" >&2
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
if [[ ! "$REMOTE_URL" =~ bitbucket\.digital\.vn ]]; then
|
|
37
|
+
echo "WARNING: Remote URL does not match bitbucket.digital.vn pattern:" >&2
|
|
38
|
+
echo " $REMOTE_URL" >&2
|
|
39
|
+
echo " This skill is for Viettel Bitbucket. For GitHub, use 'gh pr create'." >&2
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# Extract PROJECT/REPO from URL
|
|
44
|
+
# Handles:
|
|
45
|
+
# ssh://git@bitbucket.digital.vn/PROJECT/repo.git
|
|
46
|
+
# ssh://git@bitbucket.digital.vn:7999/PROJECT/repo.git
|
|
47
|
+
# https://bitbucket.digital.vn/scm/PROJECT/repo.git
|
|
48
|
+
if [[ "$REMOTE_URL" =~ /scm/([^/]+)/([^/]+)\.git$ ]]; then
|
|
49
|
+
PROJECT="${BASH_REMATCH[1]}"
|
|
50
|
+
REPO="${BASH_REMATCH[2]}"
|
|
51
|
+
elif [[ "$REMOTE_URL" =~ /([^/]+)/([^/]+)\.git$ ]]; then
|
|
52
|
+
PROJECT="${BASH_REMATCH[1]}"
|
|
53
|
+
REPO="${BASH_REMATCH[2]}"
|
|
54
|
+
else
|
|
55
|
+
echo "ERROR: Cannot parse PROJECT/REPO from remote URL: $REMOTE_URL" >&2
|
|
56
|
+
exit 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
SOURCE_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
60
|
+
if [[ -z "$SOURCE_BRANCH" ]] || [[ "$SOURCE_BRANCH" == "HEAD" ]]; then
|
|
61
|
+
echo "ERROR: Not on a named branch" >&2
|
|
62
|
+
exit 1
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
if [[ -z "$TITLE" ]]; then
|
|
66
|
+
TITLE=$(git log -1 --pretty=%s)
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
if [[ -z "$DESC_FILE" ]]; then
|
|
70
|
+
DESC_FILE=$(find .vsaf/docs/features -name '09-ship.md' 2>/dev/null | head -1)
|
|
71
|
+
[[ -z "$DESC_FILE" ]] && DESC_FILE=$(find .vsaf/docs/hotfixes -name '03-ship.md' 2>/dev/null | head -1)
|
|
72
|
+
[[ -z "$DESC_FILE" ]] && DESC_FILE=$(find .synapse/docs/features -name '09-ship.md' 2>/dev/null | head -1)
|
|
73
|
+
[[ -z "$DESC_FILE" ]] && DESC_FILE=$(find .synapse/docs/hotfixes -name '03-ship.md' 2>/dev/null | head -1)
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
CMD=(vds-cli bitbucket pr create "$PROJECT/$REPO"
|
|
77
|
+
--source "$SOURCE_BRANCH"
|
|
78
|
+
--target "$TARGET_BRANCH"
|
|
79
|
+
--title "$TITLE")
|
|
80
|
+
[[ -n "$DESC_FILE" ]] && [[ -f "$DESC_FILE" ]] && CMD+=(--description-file "$DESC_FILE")
|
|
81
|
+
|
|
82
|
+
if [[ "$DRY_RUN" == "true" ]]; then
|
|
83
|
+
echo "DRY-RUN — would execute:"
|
|
84
|
+
printf ' %q' "${CMD[@]}"
|
|
85
|
+
echo ""
|
|
86
|
+
echo " + --yes --json-only"
|
|
87
|
+
exit 0
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
require_command vds-cli
|
|
91
|
+
|
|
92
|
+
ensure_env VDS_BITBUCKET_TOKEN "Enter VDS Bitbucket personal access token"
|
|
93
|
+
|
|
94
|
+
echo "About to create PR:"
|
|
95
|
+
echo " Project/Repo: $PROJECT/$REPO"
|
|
96
|
+
echo " Source: $SOURCE_BRANCH"
|
|
97
|
+
echo " Target: $TARGET_BRANCH"
|
|
98
|
+
echo " Title: $TITLE"
|
|
99
|
+
echo " Description: ${DESC_FILE:-<empty>}"
|
|
100
|
+
echo ""
|
|
101
|
+
read -rp "Proceed? [y/N]: " confirm
|
|
102
|
+
if [[ "$confirm" != "y" ]] && [[ "$confirm" != "Y" ]]; then
|
|
103
|
+
echo "Aborted"
|
|
104
|
+
exit 1
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
"${CMD[@]}" --yes --json-only
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vds-skill-create-jira-epic
|
|
3
|
+
description: Create a Jira Epic via `vds-cli jira create --issuetype Epic` from a PRD file. Use after /sdlc-prd has produced 02-prd.md. Auto-detects PRD location, lazy-prompts credentials. Viettel-only (requires vds-cli).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /vds-skill-create-jira-epic
|
|
7
|
+
|
|
8
|
+
Create a Jira Epic on Viettel Jira based on a PRD markdown file.
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
|
|
12
|
+
- `vds-cli` installed (for non-dry-run)
|
|
13
|
+
- `python3` installed
|
|
14
|
+
- A PRD file exists at `.vsaf/docs/features/{feature}/02-prd.md` or `.synapse/docs/features/{feature}/02-prd.md`
|
|
15
|
+
- `VDS_JIRA_TOKEN` + `VDS_JIRA_PROJECT_DEFAULT` set OR lazy-prompted
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
/vds-skill-create-jira-epic # auto-detect latest PRD
|
|
21
|
+
/vds-skill-create-jira-epic --feature user-management # specific feature folder
|
|
22
|
+
/vds-skill-create-jira-epic --project NTTC # override project key
|
|
23
|
+
/vds-skill-create-jira-epic --dry-run # preview
|
|
24
|
+
/vds-skill-create-jira-epic --description-file path/to.md # custom description source
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Behavior
|
|
28
|
+
|
|
29
|
+
1. Locate PRD file (or use `--description-file`)
|
|
30
|
+
2. Extract summary from PRD's first H1 heading
|
|
31
|
+
3. Lazy-prompt `VDS_JIRA_TOKEN` + `VDS_JIRA_PROJECT_DEFAULT` if missing
|
|
32
|
+
4. Confirm with user
|
|
33
|
+
5. Run `vds-cli jira create --project KEY --issuetype Epic --summary ... --description-file ... --yes --json-only`
|
|
34
|
+
6. Save returned epic key to `<feature-dir>/jira-epic-key.txt`
|
|
35
|
+
|
|
36
|
+
## Implementation
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
bash ~/.claude/skills/vds-skill-create-jira-epic/scripts/create-epic.sh "$@"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Notes
|
|
43
|
+
|
|
44
|
+
- Dry-run prints constructed `vds-cli` command without executing
|
|
45
|
+
- Dry-run skips `vds-cli` availability check — works on machines without vds-cli installed
|
|
46
|
+
- Epic key written to `<feature-dir>/jira-epic-key.txt` for later cross-reference
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# vds-skill-create-jira-epic: create a Jira Epic via vds-cli
|
|
3
|
+
# Usage: create-epic.sh [--dry-run] [--project KEY] [--description-file FILE] [--feature NAME]
|
|
4
|
+
|
|
5
|
+
# NOTE: No `set -e` — we want full control of the exit-code path.
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
8
|
+
# shellcheck source=/dev/null
|
|
9
|
+
source "$SCRIPT_DIR/../../_shared/vds-skill/credentials.sh"
|
|
10
|
+
|
|
11
|
+
# Note: require_command vds-cli moved AFTER dry-run check so --dry-run
|
|
12
|
+
# works without vds-cli installed (preview mode).
|
|
13
|
+
|
|
14
|
+
DRY_RUN=false
|
|
15
|
+
PROJECT_KEY=""
|
|
16
|
+
DESC_FILE=""
|
|
17
|
+
FEATURE_NAME=""
|
|
18
|
+
|
|
19
|
+
while [[ $# -gt 0 ]]; do
|
|
20
|
+
case "$1" in
|
|
21
|
+
--dry-run) DRY_RUN=true; shift ;;
|
|
22
|
+
--project) PROJECT_KEY="$2"; shift 2 ;;
|
|
23
|
+
--description-file) DESC_FILE="$2"; shift 2 ;;
|
|
24
|
+
--feature) FEATURE_NAME="$2"; shift 2 ;;
|
|
25
|
+
*) echo "Unknown arg: $1" >&2; exit 2 ;;
|
|
26
|
+
esac
|
|
27
|
+
done
|
|
28
|
+
|
|
29
|
+
# Determine PRD file path
|
|
30
|
+
if [[ -z "$DESC_FILE" ]]; then
|
|
31
|
+
if [[ -n "$FEATURE_NAME" ]]; then
|
|
32
|
+
for path in ".vsaf/docs/features/$FEATURE_NAME/02-prd.md" \
|
|
33
|
+
".synapse/docs/features/$FEATURE_NAME/02-prd.md"; do
|
|
34
|
+
[[ -f "$path" ]] && DESC_FILE="$path" && break
|
|
35
|
+
done
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# Fallback: most recent 02-prd.md
|
|
39
|
+
if [[ -z "$DESC_FILE" ]]; then
|
|
40
|
+
DESC_FILE=$(find .vsaf/docs/features .synapse/docs/features -name '02-prd.md' 2>/dev/null \
|
|
41
|
+
| xargs -I{} ls -t {} 2>/dev/null | head -1)
|
|
42
|
+
fi
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
if [[ -z "$DESC_FILE" ]] || [[ ! -f "$DESC_FILE" ]]; then
|
|
46
|
+
echo "ERROR: PRD file not found. Run /sdlc-prd first or specify --description-file" >&2
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
# Derive feature name from PRD path if not given
|
|
51
|
+
if [[ -z "$FEATURE_NAME" ]]; then
|
|
52
|
+
FEATURE_NAME=$(basename "$(dirname "$DESC_FILE")")
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
# Extract summary from PRD (first H1)
|
|
56
|
+
SUMMARY=$(grep -m1 '^# ' "$DESC_FILE" | sed 's/^# //' || true)
|
|
57
|
+
[[ -z "$SUMMARY" ]] && SUMMARY="$FEATURE_NAME"
|
|
58
|
+
|
|
59
|
+
if [[ "$DRY_RUN" == "true" ]]; then
|
|
60
|
+
DISPLAY_PROJECT="${PROJECT_KEY:-${VDS_JIRA_PROJECT_DEFAULT:-<VDS_JIRA_PROJECT_DEFAULT>}}"
|
|
61
|
+
CMD_DRY=(vds-cli jira create
|
|
62
|
+
--project "$DISPLAY_PROJECT"
|
|
63
|
+
--issuetype Epic
|
|
64
|
+
--summary "$SUMMARY"
|
|
65
|
+
--description-file "$DESC_FILE")
|
|
66
|
+
echo "DRY-RUN — would execute:"
|
|
67
|
+
printf ' %q' "${CMD_DRY[@]}"
|
|
68
|
+
echo ""
|
|
69
|
+
echo " + --yes --json-only"
|
|
70
|
+
exit 0
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
require_command vds-cli
|
|
74
|
+
|
|
75
|
+
# Ensure credentials
|
|
76
|
+
ensure_env VDS_JIRA_TOKEN "Enter VDS Jira personal access token"
|
|
77
|
+
ensure_env VDS_JIRA_PROJECT_DEFAULT "Enter default Jira project key (e.g. NTTC)" false
|
|
78
|
+
|
|
79
|
+
PROJECT_KEY="${PROJECT_KEY:-$VDS_JIRA_PROJECT_DEFAULT}"
|
|
80
|
+
|
|
81
|
+
CMD=(vds-cli jira create
|
|
82
|
+
--project "$PROJECT_KEY"
|
|
83
|
+
--issuetype Epic
|
|
84
|
+
--summary "$SUMMARY"
|
|
85
|
+
--description-file "$DESC_FILE")
|
|
86
|
+
|
|
87
|
+
echo "About to create Jira Epic:"
|
|
88
|
+
echo " Project: $PROJECT_KEY"
|
|
89
|
+
echo " Summary: $SUMMARY"
|
|
90
|
+
echo " Description: $DESC_FILE"
|
|
91
|
+
echo " Feature: $FEATURE_NAME"
|
|
92
|
+
echo ""
|
|
93
|
+
read -rp "Proceed? [y/N]: " confirm
|
|
94
|
+
if [[ "$confirm" != "y" ]] && [[ "$confirm" != "Y" ]]; then
|
|
95
|
+
echo "Aborted"
|
|
96
|
+
exit 1
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
RESULT=$("${CMD[@]}" --yes --json-only)
|
|
100
|
+
EPIC_KEY=$(echo "$RESULT" | python3 -c 'import json,sys; print(json.load(sys.stdin).get("key",""))')
|
|
101
|
+
|
|
102
|
+
if [[ -z "$EPIC_KEY" ]]; then
|
|
103
|
+
echo "ERROR: Failed to extract epic key from vds-cli response" >&2
|
|
104
|
+
echo "Response: $RESULT" >&2
|
|
105
|
+
exit 1
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
EPIC_KEY_FILE="$(dirname "$DESC_FILE")/jira-epic-key.txt"
|
|
109
|
+
echo "$EPIC_KEY" > "$EPIC_KEY_FILE"
|
|
110
|
+
|
|
111
|
+
echo ""
|
|
112
|
+
echo "✓ Created Jira Epic: $EPIC_KEY"
|
|
113
|
+
echo " Saved key to: $EPIC_KEY_FILE"
|