sdd-agent-pack 1.1.1 → 1.2.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 +25 -65
- package/assets/docs/workflow.md +37 -4
- package/assets/scripts/orchestrate.py +206 -0
- package/assets/scripts/orchestrate.sh +133 -0
- package/assets/skills/sdd-epic-workflow/SKILL.md +37 -14
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +1 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/utils/installer.d.ts.map +1 -1
- package/dist/utils/installer.js +21 -3
- package/dist/utils/installer.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# SDD Agent Pack
|
|
2
2
|
|
|
3
|
-
Lightweight installer for SDD (Software Driven Development) workflow assets into application repositories.
|
|
3
|
+
Lightweight installer for SDD (Software Driven Development) workflow assets into application repositories. Works with **OpenHands**, **Copilot**, **Claude Code**, **Codex**, and other AI coding agents.
|
|
4
4
|
|
|
5
5
|
SDD Agent Pack installs the instructions, skills, hooks, prompts, templates, and supporting files that AI coding agents need to follow the SDD workflow in your project.
|
|
6
6
|
|
|
7
7
|
## How It Works
|
|
8
8
|
|
|
9
|
-
1. **Install** — Run `sdd-agent-pack init` in your application repository
|
|
9
|
+
1. **Install** — Run `npx sdd-agent-pack init` in your application repository
|
|
10
10
|
2. **Define** — Create `tasks.md` with your epics and tasks, and design documents in `specs/`
|
|
11
11
|
3. **Implement** — An AI agent reads your SDD documents and implements epics systematically
|
|
12
12
|
|
|
@@ -26,29 +26,39 @@ The AI coding agent itself is the execution engine. SDD Agent Pack provides the
|
|
|
26
26
|
npx sdd-agent-pack init
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
This
|
|
29
|
+
This installs all SDD assets and configures your repo for AI agents.
|
|
30
30
|
|
|
31
31
|
### What gets installed
|
|
32
32
|
|
|
33
33
|
```
|
|
34
|
-
.sdd-agent-pack/
|
|
35
|
-
├── skills/
|
|
36
|
-
├──
|
|
37
|
-
├──
|
|
38
|
-
├──
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
.sdd-agent-pack/ — Core assets (managed by the installer)
|
|
35
|
+
├── skills/ — SDD workflow skills (keyword-triggered)├── scripts/ — Epic orchestration scripts├── prompts/ — Workflow prompts
|
|
36
|
+
├── hooks/ — Quality enforcement hooks
|
|
37
|
+
├── docs/ — Workflow documentation
|
|
38
|
+
├── templates/ — SDD document templates
|
|
39
|
+
└── config/ — Agent configuration
|
|
40
|
+
|
|
41
|
+
.agents/skills/ — OpenHands skill bridge (auto-installed)
|
|
42
|
+
├── sdd-epic-workflow/
|
|
43
|
+
├── sdd-implementation/
|
|
44
|
+
├── sdd-context/
|
|
45
|
+
├── sdd-testing/
|
|
46
|
+
└── sdd-completion/
|
|
47
|
+
|
|
48
|
+
.openhands/ — OpenHands hook bridge (auto-installed)
|
|
49
|
+
├── hooks.json — Registers stop hook for quality gates
|
|
50
|
+
└── setup.sh — Auto-runs on session start
|
|
41
51
|
```
|
|
42
52
|
|
|
43
|
-
AGENTS.md is also updated with a managed SDD Agent Pack section.
|
|
53
|
+
`AGENTS.md` is also updated with a managed SDD Agent Pack section.
|
|
44
54
|
|
|
45
55
|
### Commands
|
|
46
56
|
|
|
47
57
|
| Command | Description |
|
|
48
58
|
|---------|-------------|
|
|
49
59
|
| `init` | Install SDD Agent Pack in the current repository |
|
|
50
|
-
| `update` | Update
|
|
51
|
-
| `uninstall` | Remove SDD Agent Pack assets safely |
|
|
60
|
+
| `update` | Update installed assets to the latest version |
|
|
61
|
+
| `uninstall` | Remove all SDD Agent Pack assets safely |
|
|
52
62
|
| `doctor` | Validate installation and environment |
|
|
53
63
|
| `status` | Show installation status |
|
|
54
64
|
| `help` | Show all commands |
|
|
@@ -70,58 +80,8 @@ SDD Agent Pack replaces the previous `sdd-autopilot` runtime application. Instea
|
|
|
70
80
|
|
|
71
81
|
## Documentation
|
|
72
82
|
|
|
73
|
-
- [
|
|
74
|
-
- [
|
|
75
|
-
|
|
76
|
-
## License
|
|
77
|
-
|
|
78
|
-
MIT
|
|
79
|
-
```
|
|
80
|
-
1. Define epics and tasks in tasks.md
|
|
81
|
-
2. Run /autopilot-prepare in Copilot Chat (first time only)
|
|
82
|
-
3. Run /autopilot-start in Copilot Chat
|
|
83
|
-
4. Copilot implements each epic, runs tests, and advances autonomously
|
|
84
|
-
5. Repeat runs of /autopilot-start continue until all epics are complete
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Frontmatter Schema
|
|
88
|
-
|
|
89
|
-
Tasks and state are tracked in `tasks.md` frontmatter:
|
|
90
|
-
|
|
91
|
-
```yaml
|
|
92
|
-
---
|
|
93
|
-
autopilot:
|
|
94
|
-
initialized: true
|
|
95
|
-
epics:
|
|
96
|
-
- id: EPIC-001
|
|
97
|
-
title: Authentication
|
|
98
|
-
status: pending
|
|
99
|
-
completion_notes:
|
|
100
|
-
implemented: ["OAuth login"]
|
|
101
|
-
files_created: ["src/auth/login.py"]
|
|
102
|
-
tests_added: ["tests/test_auth.py"]
|
|
103
|
-
architectural_decisions: ["Centralized session management"]
|
|
104
|
-
future_context: ["User Management depends on auth state"]
|
|
105
|
-
tasks:
|
|
106
|
-
- title: Implement login
|
|
107
|
-
status: pending
|
|
108
|
-
---
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## Key Principles
|
|
112
|
-
|
|
113
|
-
- **tasks.md frontmatter is the single source of truth** — No separate database or state store
|
|
114
|
-
- **Copilot does implementation** — Autopilot only tracks state and runs tests
|
|
115
|
-
- **Test enforcement gates completion** — Epics cannot be marked complete until all tests pass
|
|
116
|
-
- **Completion notes are project memory** — Every epic must have completion notes
|
|
117
|
-
- **Keep it simple** — No alternate planning artifacts or duplicate SDD documents
|
|
118
|
-
|
|
119
|
-
## Documentation
|
|
120
|
-
|
|
121
|
-
- [Copilot Autopilot](docs/copilot-autopilot.md) — Architecture, workflow, frontmatter schema, epic lifecycle, commands
|
|
122
|
-
- [Copilot Hooks](docs/copilot-hooks.md) — Hook architecture, workflow, capabilities and limitations
|
|
123
|
-
- [Architecture](docs/architecture.md) — System architecture and design
|
|
124
|
-
- [User Guide](docs/user-guide.md) — Complete user documentation
|
|
83
|
+
- [Specification](specs/sdd-agent-pack_spec.md) — Project architecture and design decisions
|
|
84
|
+
- [Workflow](assets/docs/workflow.md) — SDD workflow documentation
|
|
125
85
|
|
|
126
86
|
## License
|
|
127
87
|
|
package/assets/docs/workflow.md
CHANGED
|
@@ -24,15 +24,48 @@ SDD Agent Pack installs the Software Driven Development (SDD) workflow into your
|
|
|
24
24
|
|
|
25
25
|
## Agent Workflow
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
**Important:** AI agents cannot autonomously iterate through many epics — they
|
|
28
|
+
treat a large `tasks.md` as a single massive objective and keep asking for
|
|
29
|
+
permission. This is a known limitation.
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
Instead, feed epics **one at a time** using an external orchestration loop.
|
|
32
|
+
|
|
33
|
+
### Option 1: Orchestration Script (Recommended)
|
|
34
|
+
|
|
35
|
+
Use one of the provided scripts in `.sdd-agent-pack/scripts/`:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Requires OpenHands CLI (https://docs.openhands.dev/openhands/usage/cli/installation)
|
|
39
|
+
bash .sdd-agent-pack/scripts/orchestrate.sh
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Requires OpenHands SDK (pip install openhands-sdk openhands-tools)
|
|
44
|
+
python .sdd-agent-pack/scripts/orchestrate.py
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
These scripts:
|
|
48
|
+
1. Parse `tasks.md` for incomplete epics
|
|
49
|
+
2. Feed each epic to OpenHands one at a time
|
|
50
|
+
3. Wait for each to complete before starting the next
|
|
51
|
+
4. Continue until all epics are done
|
|
52
|
+
|
|
53
|
+
### Option 2: Manual (Agent-by-Agent)
|
|
54
|
+
|
|
55
|
+
Ask the agent to implement a single epic:
|
|
56
|
+
|
|
57
|
+
> "Implement epic XXXXX from tasks.md following the SDD workflow."
|
|
58
|
+
|
|
59
|
+
Let the agent finish, then repeat for the next epic.
|
|
60
|
+
|
|
61
|
+
### What the Agent Does Per Epic
|
|
62
|
+
|
|
63
|
+
1. Reads all SDD documentation
|
|
64
|
+
2. Identifies the current epic's requirements
|
|
31
65
|
3. Reads the relevant specification
|
|
32
66
|
4. Implements the code
|
|
33
67
|
5. Creates and runs tests
|
|
34
68
|
6. Updates tasks.md with completion notes
|
|
35
|
-
7. Moves to the next epic
|
|
36
69
|
|
|
37
70
|
## OpenHands Integration
|
|
38
71
|
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
SDD Agent Pack — Epic Orchestration Script (OpenHands SDK)
|
|
4
|
+
|
|
5
|
+
Reads tasks.md and feeds each incomplete epic to an OpenHands agent
|
|
6
|
+
one at a time. This avoids overwhelming the agent with the full scope.
|
|
7
|
+
|
|
8
|
+
Prerequisites:
|
|
9
|
+
pip install openhands-sdk openhands-tools
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
# Process all incomplete epics
|
|
13
|
+
python .sdd-agent-pack/scripts/orchestrate.py
|
|
14
|
+
|
|
15
|
+
# Process a single epic
|
|
16
|
+
python .sdd-agent-pack/scripts/orchestrate.py --single "EPIC-001"
|
|
17
|
+
|
|
18
|
+
# Dry run — just list what would be done
|
|
19
|
+
python .sdd-agent-pack/scripts/orchestrate.py --dry-run
|
|
20
|
+
|
|
21
|
+
Environment variables:
|
|
22
|
+
LLM_API_KEY — Required. API key for your LLM provider.
|
|
23
|
+
LLM_MODEL — Model name (default: openhands/claude-sonnet-4-5-20250929)
|
|
24
|
+
LLM_BASE_URL — Optional. Custom base URL.
|
|
25
|
+
OPENHANDS_CLOUD — Set to "1" to use OpenHands Cloud remote workspace.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
import os
|
|
29
|
+
import re
|
|
30
|
+
import sys
|
|
31
|
+
import argparse
|
|
32
|
+
|
|
33
|
+
TASKS_FILE = "specs/tasks.md"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def parse_epics(file_path: str) -> list[dict]:
|
|
37
|
+
"""Parse incomplete epics from tasks.md frontmatter."""
|
|
38
|
+
if not os.path.exists(file_path):
|
|
39
|
+
print(f"✗ tasks.md not found at {file_path}")
|
|
40
|
+
print(" Run this from your repository root.")
|
|
41
|
+
sys.exit(1)
|
|
42
|
+
|
|
43
|
+
with open(file_path, "r") as f:
|
|
44
|
+
content = f.read()
|
|
45
|
+
|
|
46
|
+
epics = []
|
|
47
|
+
|
|
48
|
+
# Try YAML frontmatter format first
|
|
49
|
+
# Look for: status: pending or status: in-progress under an epic entry
|
|
50
|
+
frontmatter_match = re.search(
|
|
51
|
+
r"autopilot:\s*\n\s+epics:\s*\n(.+?)(?=\n\S|\Z)",
|
|
52
|
+
content,
|
|
53
|
+
re.DOTALL,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
if frontmatter_match:
|
|
57
|
+
# Parse structured frontmatter
|
|
58
|
+
epic_pattern = re.compile(
|
|
59
|
+
r"- id:\s*(\S+)\s*\n\s+title:\s*(.+?)\s*\n\s+status:\s*(.+?)(?:\n|$)"
|
|
60
|
+
)
|
|
61
|
+
for match in epic_pattern.finditer(frontmatter_match.group(1)):
|
|
62
|
+
epic_id = match.group(1)
|
|
63
|
+
title = match.group(2).strip()
|
|
64
|
+
status = match.group(3).strip()
|
|
65
|
+
if status in ("pending", "in-progress"):
|
|
66
|
+
epics.append({"id": epic_id, "title": title, "status": status})
|
|
67
|
+
else:
|
|
68
|
+
# Fallback: parse markdown headings and status lines
|
|
69
|
+
lines = content.split("\n")
|
|
70
|
+
current_epic = None
|
|
71
|
+
for i, line in enumerate(lines):
|
|
72
|
+
heading_match = re.match(r"^#{2,4}\s+(.+)$", line)
|
|
73
|
+
if heading_match:
|
|
74
|
+
current_epic = heading_match.group(1).strip()
|
|
75
|
+
elif current_epic and re.search(
|
|
76
|
+
r"status:\s*(pending|in-progress)", line
|
|
77
|
+
):
|
|
78
|
+
epics.append(
|
|
79
|
+
{"id": current_epic, "title": current_epic, "status": "pending"}
|
|
80
|
+
)
|
|
81
|
+
current_epic = None
|
|
82
|
+
elif current_epic and re.search(r"status:\s*complete", line):
|
|
83
|
+
current_epic = None
|
|
84
|
+
|
|
85
|
+
return epics
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def build_prompt(epic: dict) -> str:
|
|
89
|
+
"""Build a focused prompt for a single epic."""
|
|
90
|
+
return f"""You are working in a repository with the SDD (Software Driven Development) workflow.
|
|
91
|
+
|
|
92
|
+
Your task is to implement ONLY the following epic and nothing else.
|
|
93
|
+
|
|
94
|
+
Epic: {epic['id']} — {epic['title']}
|
|
95
|
+
|
|
96
|
+
Instructions:
|
|
97
|
+
1. Read AGENTS.md for SDD workflow instructions
|
|
98
|
+
2. Read the relevant spec documents in specs/
|
|
99
|
+
3. Read tasks.md for context on what's already done
|
|
100
|
+
4. Implement the epic completely — all code, all files
|
|
101
|
+
5. Create and run tests
|
|
102
|
+
6. Update tasks.md with completion notes
|
|
103
|
+
7. Mark the epic as complete
|
|
104
|
+
8. Do NOT ask for permission — execute autonomously
|
|
105
|
+
9. Do NOT work on any other epic
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def run_epic(epic: dict, use_cloud: bool) -> bool:
|
|
110
|
+
"""Run a single epic through an OpenHands agent."""
|
|
111
|
+
from openhands.sdk import LLM, Agent, Conversation, Tool
|
|
112
|
+
from openhands.tools.file_editor import FileEditorTool
|
|
113
|
+
from openhands.tools.terminal import TerminalTool
|
|
114
|
+
|
|
115
|
+
model = os.getenv("LLM_MODEL", "openhands/claude-sonnet-4-5-20250929")
|
|
116
|
+
api_key = os.getenv("LLM_API_KEY")
|
|
117
|
+
base_url = os.getenv("LLM_BASE_URL", None)
|
|
118
|
+
|
|
119
|
+
if not api_key:
|
|
120
|
+
print("✗ LLM_API_KEY environment variable is required")
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
llm = LLM(
|
|
124
|
+
model=model,
|
|
125
|
+
api_key=api_key,
|
|
126
|
+
base_url=base_url,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
agent = Agent(
|
|
130
|
+
llm=llm,
|
|
131
|
+
tools=[
|
|
132
|
+
Tool(name=TerminalTool.name),
|
|
133
|
+
Tool(name=FileEditorTool.name),
|
|
134
|
+
],
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
workspace = os.getcwd()
|
|
138
|
+
conversation = Conversation(agent=agent, workspace=workspace)
|
|
139
|
+
|
|
140
|
+
prompt = build_prompt(epic)
|
|
141
|
+
print(f" Prompting agent...")
|
|
142
|
+
conversation.send_message(prompt)
|
|
143
|
+
conversation.run()
|
|
144
|
+
|
|
145
|
+
cost = llm.metrics.accumulated_cost
|
|
146
|
+
print(f" Cost: ${cost:.4f}" if cost else "")
|
|
147
|
+
return True
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def main():
|
|
151
|
+
parser = argparse.ArgumentParser(
|
|
152
|
+
description="SDD Agent Pack — Epic Orchestration Script"
|
|
153
|
+
)
|
|
154
|
+
parser.add_argument(
|
|
155
|
+
"--single",
|
|
156
|
+
metavar="EPIC_ID",
|
|
157
|
+
help="Run only a single epic (e.g., EPIC-001)",
|
|
158
|
+
)
|
|
159
|
+
parser.add_argument(
|
|
160
|
+
"--dry-run",
|
|
161
|
+
action="store_true",
|
|
162
|
+
help="List incomplete epics without running them",
|
|
163
|
+
)
|
|
164
|
+
parser.add_argument(
|
|
165
|
+
"--cloud",
|
|
166
|
+
action="store_true",
|
|
167
|
+
help="Use OpenHands Cloud remote workspace",
|
|
168
|
+
)
|
|
169
|
+
args = parser.parse_args()
|
|
170
|
+
|
|
171
|
+
print("━━━ SDD Agent Pack — Epic Orchestrator (SDK) ━━━\n")
|
|
172
|
+
|
|
173
|
+
epics = parse_epics(TASKS_FILE)
|
|
174
|
+
|
|
175
|
+
if not epics:
|
|
176
|
+
print("✓ All epics are complete! Nothing to do.")
|
|
177
|
+
return
|
|
178
|
+
|
|
179
|
+
# Filter by --single if provided
|
|
180
|
+
if args.single:
|
|
181
|
+
epics = [e for e in epics if args.single.lower() in e["id"].lower()]
|
|
182
|
+
if not epics:
|
|
183
|
+
print(f"✗ No epic matching '{args.single}' found")
|
|
184
|
+
sys.exit(1)
|
|
185
|
+
|
|
186
|
+
print(f"Found {len(epics)} incomplete epic(s):")
|
|
187
|
+
for i, epic in enumerate(epics, 1):
|
|
188
|
+
print(f" {i}. {epic['id']}: {epic['title']} ({epic['status']})")
|
|
189
|
+
|
|
190
|
+
if args.dry_run:
|
|
191
|
+
print("\nDry run — no epics executed.")
|
|
192
|
+
return
|
|
193
|
+
|
|
194
|
+
# Process each epic
|
|
195
|
+
for i, epic in enumerate(epics, 1):
|
|
196
|
+
print(f"\n━━━ [{i}/{len(epics)}] {epic['id']}: {epic['title']} ━━━\n")
|
|
197
|
+
success = run_epic(epic, args.cloud)
|
|
198
|
+
status = "✓" if success else "⚠"
|
|
199
|
+
print(f"\n{status} [{i}/{len(epics)}] {'Completed' if success else 'Failed'}: {epic['id']}")
|
|
200
|
+
|
|
201
|
+
print("\n━━━ All epics processed ━━━")
|
|
202
|
+
print("Run 'git status' to review changes before committing.")
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
if __name__ == "__main__":
|
|
206
|
+
main()
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# SDD Agent Pack — Epic Orchestration Script (Headless CLI)
|
|
3
|
+
#
|
|
4
|
+
# Reads tasks.md and feeds each incomplete epic to OpenHands headless mode
|
|
5
|
+
# one at a time. This avoids overwhelming the agent with the full scope.
|
|
6
|
+
#
|
|
7
|
+
# Prerequisites:
|
|
8
|
+
# - OpenHands CLI installed (https://docs.openhands.dev/openhands/usage/cli/installation)
|
|
9
|
+
# - LLM configured (openhands login or LLM_API_KEY env var)
|
|
10
|
+
# - Run from the repository root (where tasks.md lives)
|
|
11
|
+
#
|
|
12
|
+
# Usage:
|
|
13
|
+
# bash .sdd-agent-pack/scripts/orchestrate.sh
|
|
14
|
+
#
|
|
15
|
+
# To run a single epic by number:
|
|
16
|
+
# bash .sdd-agent-pack/scripts/orchestrate.sh --single EPIC-001
|
|
17
|
+
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
|
|
20
|
+
TASKS_FILE="specs/tasks.md"
|
|
21
|
+
OPENHANDS_CMD="${OPENHANDS_CMD:-openhands}"
|
|
22
|
+
START_EPIC="${1:-}"
|
|
23
|
+
|
|
24
|
+
if [ ! -f "$TASKS_FILE" ]; then
|
|
25
|
+
echo "✗ tasks.md not found at $TASKS_FILE"
|
|
26
|
+
echo " Run this from your repository root."
|
|
27
|
+
exit 1
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# Check OpenHands CLI is available
|
|
31
|
+
if ! command -v "$OPENHANDS_CMD" &>/dev/null; then
|
|
32
|
+
echo "✗ OpenHands CLI not found ($OPENHANDS_CMD)"
|
|
33
|
+
echo " Install: https://docs.openhands.dev/openhands/usage/cli/installation"
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
echo "━━━ SDD Agent Pack — Epic Orchestrator ━━━"
|
|
38
|
+
echo ""
|
|
39
|
+
|
|
40
|
+
# Parse incomplete epics from tasks.md
|
|
41
|
+
# Looks for lines like: "### EPIC-001: Title" followed by "- [ ] ..."
|
|
42
|
+
echo "Scanning $TASKS_FILE for incomplete epics..."
|
|
43
|
+
|
|
44
|
+
epics=()
|
|
45
|
+
current_epic=""
|
|
46
|
+
|
|
47
|
+
while IFS= read -r line; do
|
|
48
|
+
if [[ "$line" =~ ^###[[:space:]]+(EPIC-[^:]+):(.+)$ ]] || [[ "$line" =~ ^###[[:space:]]+(T[^:]+):(.+)$ ]] || [[ "$line" =~ ^###[[:space:]]+([^:]+):(.+)$ ]]; then
|
|
49
|
+
current_epic="${BASH_REMATCH[1]}:${BASH_REMATCH[2]}"
|
|
50
|
+
current_epic="$(echo "$current_epic" | xargs)"
|
|
51
|
+
elif [[ "$line" =~ status:[[:space:]]*(pending|in-progress) ]] && [ -n "$current_epic" ]; then
|
|
52
|
+
epics+=("$current_epic")
|
|
53
|
+
current_epic=""
|
|
54
|
+
elif [[ "$line" =~ status:[[:space:]]*complete ]] || [[ "$line" =~ status:[[:space:]]*completed ]]; then
|
|
55
|
+
current_epic=""
|
|
56
|
+
fi
|
|
57
|
+
done < "$TASKS_FILE"
|
|
58
|
+
|
|
59
|
+
if [ ${#epics[@]} -eq 0 ]; then
|
|
60
|
+
echo "✓ All epics are complete! Nothing to do."
|
|
61
|
+
exit 0
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
echo "Found ${#epics[@]} incomplete epic(s):"
|
|
65
|
+
for i in "${!epics[@]}"; do
|
|
66
|
+
echo " $((i+1)). ${epics[$i]}"
|
|
67
|
+
done
|
|
68
|
+
echo ""
|
|
69
|
+
|
|
70
|
+
# If --single was passed, filter to just that epic
|
|
71
|
+
if [ -n "${1:-}" ] && [ "$1" != "--single" ]; then
|
|
72
|
+
# Interpret as epic number or name
|
|
73
|
+
epic_filter="$1"
|
|
74
|
+
filtered=()
|
|
75
|
+
for epic in "${epics[@]}"; do
|
|
76
|
+
if [[ "$epic" == *"$epic_filter"* ]]; then
|
|
77
|
+
filtered+=("$epic")
|
|
78
|
+
fi
|
|
79
|
+
done
|
|
80
|
+
epics=("${filtered[@]}")
|
|
81
|
+
elif [ "${1:-}" = "--single" ] && [ -n "${2:-}" ]; then
|
|
82
|
+
filtered=()
|
|
83
|
+
for epic in "${epics[@]}"; do
|
|
84
|
+
if [[ "$epic" == *"$2"* ]]; then
|
|
85
|
+
filtered+=("$epic")
|
|
86
|
+
fi
|
|
87
|
+
done
|
|
88
|
+
epics=("${filtered[@]}")
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# Process each epic
|
|
92
|
+
total=${#epics[@]}
|
|
93
|
+
current=1
|
|
94
|
+
|
|
95
|
+
for epic in "${epics[@]}"; do
|
|
96
|
+
echo ""
|
|
97
|
+
echo "━━━ [$current/$total] Implementing: $epic ━━━"
|
|
98
|
+
echo ""
|
|
99
|
+
|
|
100
|
+
# Build the task prompt for this single epic
|
|
101
|
+
prompt="You are working in a repository with the SDD (Software Driven Development) workflow. Your task is to implement ONLY the following epic and nothing else. Follow all instructions in AGENTS.md and the SDD documentation.
|
|
102
|
+
|
|
103
|
+
Epic to implement: $epic
|
|
104
|
+
|
|
105
|
+
Instructions:
|
|
106
|
+
1. Read AGENTS.md for context
|
|
107
|
+
2. Read the relevant spec documents in specs/
|
|
108
|
+
3. Implement the epic completely
|
|
109
|
+
4. Create and run tests
|
|
110
|
+
5. Update tasks.md with completion notes
|
|
111
|
+
6. Mark the epic as complete
|
|
112
|
+
7. Do NOT ask for permission — just do it
|
|
113
|
+
8. Do NOT work on any other epic"
|
|
114
|
+
|
|
115
|
+
echo "Starting OpenHands (headless)..."
|
|
116
|
+
if $OPENHANDS_CMD --headless -t "$prompt" 2>&1; then
|
|
117
|
+
echo ""
|
|
118
|
+
echo "✓ [$current/$total] Epic completed: $epic"
|
|
119
|
+
else
|
|
120
|
+
exit_code=$?
|
|
121
|
+
echo ""
|
|
122
|
+
echo "⚠ [$current/$total] Epic finished with exit code $exit_code: $epic"
|
|
123
|
+
echo " Check the output above for errors."
|
|
124
|
+
echo " To resume, re-run: $0"
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
current=$((current + 1))
|
|
128
|
+
done
|
|
129
|
+
|
|
130
|
+
echo ""
|
|
131
|
+
echo "━━━ All epics processed ━━━"
|
|
132
|
+
echo ""
|
|
133
|
+
echo "Run 'git status' to review changes before committing."
|
|
@@ -1,28 +1,49 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sdd-epic-workflow
|
|
3
|
-
description:
|
|
3
|
+
description: Implement a single SDD epic with full lifecycle
|
|
4
4
|
triggers:
|
|
5
5
|
- sdd
|
|
6
6
|
- epic
|
|
7
7
|
- tasks.md
|
|
8
|
-
-
|
|
8
|
+
- implement
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# SDD Epic Workflow
|
|
12
12
|
|
|
13
|
-
This skill
|
|
13
|
+
This skill implements a **single SDD epic** from end to end.
|
|
14
|
+
|
|
15
|
+
## Important Limitation
|
|
16
|
+
|
|
17
|
+
**OpenHands agents cannot autonomously iterate through multiple epics.** The
|
|
18
|
+
agent will get overwhelmed by the scope and keep asking for permission. This
|
|
19
|
+
is a known limitation of LLM-based agents.
|
|
20
|
+
|
|
21
|
+
Instead, use the orchestration scripts in `.sdd-agent-pack/scripts/` to feed
|
|
22
|
+
epics one at a time:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Bash approach (requires OpenHands CLI)
|
|
26
|
+
bash .sdd-agent-pack/scripts/orchestrate.sh
|
|
27
|
+
|
|
28
|
+
# Python approach (requires OpenHands SDK)
|
|
29
|
+
python .sdd-agent-pack/scripts/orchestrate.py
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Or manually implement one epic at a time by asking the agent:
|
|
33
|
+
|
|
34
|
+
> "Implement epic XXXXX from tasks.md following the SDD workflow."
|
|
14
35
|
|
|
15
36
|
## Instructions
|
|
16
37
|
|
|
17
|
-
When asked
|
|
38
|
+
When asked to implement an epic:
|
|
18
39
|
|
|
19
|
-
1. **Read all SDD documentation** — AGENTS.md, constitution.md, plan.md, tasks.md, specs/.
|
|
40
|
+
1. **Read all SDD documentation** — AGENTS.md, constitution.md (if present), plan.md (if present), tasks.md, specs/.
|
|
20
41
|
|
|
21
|
-
2. **
|
|
42
|
+
2. **Understand the current epic** — Read its description, tasks, and dependencies.
|
|
22
43
|
|
|
23
|
-
3. **Read
|
|
44
|
+
3. **Read referenced specs** — Find and read the relevant design documents in specs/.
|
|
24
45
|
|
|
25
|
-
4. **Implement
|
|
46
|
+
4. **Implement the epic completely** — All code, all files, no shortcuts.
|
|
26
47
|
|
|
27
48
|
5. **Create missing tests** — Every implementation must include tests.
|
|
28
49
|
|
|
@@ -30,10 +51,12 @@ When asked "Implement all remaining epics in tasks.md using the SDD Agent Pack w
|
|
|
30
51
|
|
|
31
52
|
7. **Fix failures** — Iterate until all tests pass.
|
|
32
53
|
|
|
33
|
-
8. **Update tasks.md** — Mark the epic complete with completion notes
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
54
|
+
8. **Update tasks.md** — Mark the epic complete with detailed completion notes:
|
|
55
|
+
- What was implemented
|
|
56
|
+
- Files created
|
|
57
|
+
- Files modified
|
|
58
|
+
- Tests added
|
|
59
|
+
- Key architectural decisions
|
|
60
|
+
- What the next epic needs to know
|
|
38
61
|
|
|
39
|
-
**Do
|
|
62
|
+
9. **Stop** — Do NOT start the next epic. The orchestration loop handles that.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SA+EpB,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -59,6 +59,7 @@ export const initCommand = new Command('init')
|
|
|
59
59
|
term.log('\n━━━ SDD Agent Pack installed successfully! ━━━\n');
|
|
60
60
|
term.log('Installed:');
|
|
61
61
|
term.log(' .sdd-agent-pack/skills/ — SDD workflow skills');
|
|
62
|
+
term.log(' .sdd-agent-pack/scripts/ — Epic orchestration scripts');
|
|
62
63
|
term.log(' .sdd-agent-pack/prompts/ — Workflow prompts');
|
|
63
64
|
term.log(' .sdd-agent-pack/hooks/ — Quality enforcement hooks');
|
|
64
65
|
term.log(' .sdd-agent-pack/docs/ — Workflow documentation');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SAiDtB,CAAC"}
|
package/dist/commands/status.js
CHANGED
|
@@ -42,6 +42,7 @@ export const statusCommand = new Command('status')
|
|
|
42
42
|
term.log(` ${ok ? '✓' : '✗'} ${name}`);
|
|
43
43
|
};
|
|
44
44
|
componentStatus('SDD assets (.sdd-agent-pack/)', valid);
|
|
45
|
+
componentStatus('Scripts (.sdd-agent-pack/scripts/)', existsSync(join(repoRoot, '.sdd-agent-pack', 'scripts', 'orchestrate.sh')));
|
|
45
46
|
componentStatus('AGENTS.md integration', valid);
|
|
46
47
|
componentStatus('OpenHands skills bridge (.agents/skills/)', existsSync(join(repoRoot, '.agents', 'skills', 'sdd-epic-workflow', 'SKILL.md')));
|
|
47
48
|
componentStatus('OpenHands hooks (.openhands/hooks.json)', existsSync(join(repoRoot, '.openhands', 'hooks.json')));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE3C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC;IAErC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC5E,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,EAAW,EAAE,EAAE;QACpD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,eAAe,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;IACxD,eAAe,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAChD,eAAe,CAAC,2CAA2C,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/I,eAAe,CAAC,yCAAyC,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACnH,eAAe,CAAC,uCAAuC,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAE/G,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACf,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiEH,oEAAoE;AACpE,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjE;AAED,4DAA4D;AAC5D,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvE;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE5E;AAED,oEAAoE;AACpE,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiEH,oEAAoE;AACpE,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjE;AAED,4DAA4D;AAC5D,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvE;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE5E;AAED,oEAAoE;AACpE,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BnE;AAED,6DAA6D;AAC7D,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpE;AAED,+CAA+C;AAC/C,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrE;AAED,yDAAyD;AACzD,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgC7E;AAED,wCAAwC;AACxC,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpE;AAED,uCAAuC;AACvC,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE;AAED,uDAAuD;AACvD,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnE;AAED,oDAAoD;AACpD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASpE;AAED,gFAAgF;AAChF,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC3E"}
|
package/dist/utils/installer.js
CHANGED
|
@@ -74,7 +74,7 @@ export async function backupFiles(repoRoot) {
|
|
|
74
74
|
}
|
|
75
75
|
/** Create required subdirectories inside .sdd-agent-pack */
|
|
76
76
|
export async function createDirectories(repoRoot) {
|
|
77
|
-
const dirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config'];
|
|
77
|
+
const dirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config', 'scripts'];
|
|
78
78
|
for (const dir of dirs) {
|
|
79
79
|
await ensureDir(join(repoRoot, '.sdd-agent-pack', dir));
|
|
80
80
|
}
|
|
@@ -162,7 +162,7 @@ fi
|
|
|
162
162
|
export async function installAssets(repoRoot) {
|
|
163
163
|
const assetRoot = assetsDir();
|
|
164
164
|
const packPath = join(repoRoot, '.sdd-agent-pack');
|
|
165
|
-
const assetDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config'];
|
|
165
|
+
const assetDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config', 'scripts'];
|
|
166
166
|
for (const dir of assetDirs) {
|
|
167
167
|
const src = join(assetRoot, dir);
|
|
168
168
|
const dest = join(packPath, dir);
|
|
@@ -170,6 +170,24 @@ export async function installAssets(repoRoot) {
|
|
|
170
170
|
await copy(src, dest, { overwrite: true, errorOnExist: true });
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
+
// Make scripts executable
|
|
174
|
+
const scriptsToChmod = [
|
|
175
|
+
join(packPath, 'scripts', 'orchestrate.sh'),
|
|
176
|
+
join(packPath, 'scripts', 'orchestrate.py'),
|
|
177
|
+
join(packPath, 'hooks', 'stop-hook.sh'),
|
|
178
|
+
join(packPath, 'hooks', 'pre-implementation.sh'),
|
|
179
|
+
];
|
|
180
|
+
for (const scriptPath of scriptsToChmod) {
|
|
181
|
+
if (existsSync(scriptPath)) {
|
|
182
|
+
try {
|
|
183
|
+
const { chmod } = await import('fs/promises');
|
|
184
|
+
await chmod(scriptPath, 0o755);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Non-critical
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
173
191
|
}
|
|
174
192
|
/** Update AGENTS.md with a managed SDD Agent Pack section */
|
|
175
193
|
export async function updateAgentsMd(repoRoot) {
|
|
@@ -218,7 +236,7 @@ export async function updateGitignore(repoRoot) {
|
|
|
218
236
|
/** Validate the installation in the target repository */
|
|
219
237
|
export async function validateInstallation(repoRoot) {
|
|
220
238
|
const packPath = join(repoRoot, '.sdd-agent-pack');
|
|
221
|
-
const requiredDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config'];
|
|
239
|
+
const requiredDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config', 'scripts'];
|
|
222
240
|
// Check all required directories exist
|
|
223
241
|
for (const dir of requiredDirs) {
|
|
224
242
|
if (!existsSync(join(packPath, dir))) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,+EAA+E;AAC/E,SAAS,SAAS;IAChB,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe;IACtB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCR,CAAC;AACF,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAE5D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACzB,MAAM,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"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"}
|