sdd-agent-pack 1.1.1 → 1.3.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 +115 -73
- package/assets/docs/workflow.md +37 -4
- package/assets/prompts/epic-prompt.md +4 -2
- 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 +21 -10
- 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/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +6 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/utils/installer.d.ts +16 -0
- package/dist/utils/installer.d.ts.map +1 -1
- package/dist/utils/installer.js +124 -3
- package/dist/utils/installer.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,126 +2,168 @@
|
|
|
2
2
|
|
|
3
3
|
Lightweight installer for SDD (Software Driven Development) workflow assets into application repositories.
|
|
4
4
|
|
|
5
|
-
SDD Agent Pack installs the instructions, skills, hooks,
|
|
5
|
+
SDD Agent Pack installs the instructions, skills, hooks, orchestration scripts, and templates that AI coding agents need to follow the SDD workflow in your project.
|
|
6
6
|
|
|
7
7
|
## How It Works
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
2. **Define** — Create `tasks.md` with your epics and tasks, and design documents in `specs/`
|
|
11
|
-
3. **Implement** — An AI agent reads your SDD documents and implements epics systematically
|
|
9
|
+
SDD Agent Pack is **not** an autonomous runtime — it's an installer that equips your repo with:
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
- **Skills** — Keyword-triggered instructions that guide AI agents through the SDD workflow
|
|
12
|
+
- **Orchestration scripts** — Shell and Python scripts that feed epics one at a time to an agent
|
|
13
|
+
- **Hooks** — Quality gates that prevent agents from finishing with failing tests
|
|
14
|
+
- **Templates** — SDD document templates (tasks.md, constitution.md)
|
|
15
|
+
|
|
16
|
+
The **orchestration script** is the key piece: instead of asking an agent to "implement all epics" (which overwhelms LLM-based agents), it reads `tasks.md` and feeds each incomplete epic to the agent **one at a time**.
|
|
14
17
|
|
|
15
18
|
## Quick Start
|
|
16
19
|
|
|
17
20
|
### Prerequisites
|
|
18
21
|
|
|
19
|
-
- **Node.js 18+** —
|
|
22
|
+
- **Node.js 18+** — Required for the installer
|
|
20
23
|
- **Git** — Your project must be a Git repository
|
|
21
24
|
- **An SDD project** — With `tasks.md` and `specs/` documents
|
|
22
25
|
|
|
23
|
-
### Install
|
|
26
|
+
### 1. Install
|
|
24
27
|
|
|
25
28
|
```bash
|
|
26
29
|
npx sdd-agent-pack init
|
|
27
30
|
```
|
|
28
31
|
|
|
29
|
-
This
|
|
32
|
+
This installs everything shown below and also:
|
|
33
|
+
- Cleans up any old artifacts from previous versions
|
|
34
|
+
- Tries to install the OpenHands CLI and Python dependencies automatically
|
|
35
|
+
- Updates AGENTS.md with SDD workflow instructions
|
|
36
|
+
|
|
37
|
+
### 2. Define your epics
|
|
38
|
+
|
|
39
|
+
Create `tasks.md` and `specs/` with your epics and design documents.
|
|
40
|
+
|
|
41
|
+
### 3. Run the orchestration
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
bash .sdd-agent-pack/scripts/orchestrate.sh
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This loops through all incomplete epics in tasks.md, feeding each one to OpenHands individually.
|
|
30
48
|
|
|
31
49
|
### What gets installed
|
|
32
50
|
|
|
33
51
|
```
|
|
34
|
-
.sdd-agent-pack/
|
|
35
|
-
├── skills/
|
|
36
|
-
├──
|
|
37
|
-
├──
|
|
38
|
-
|
|
39
|
-
├──
|
|
40
|
-
|
|
52
|
+
.sdd-agent-pack/ — Core assets (managed by the installer)
|
|
53
|
+
├── skills/ — SDD workflow skills (keyword-triggered)
|
|
54
|
+
├── scripts/ — Epic orchestration scripts
|
|
55
|
+
│ ├── orchestrate.sh — Bash version (needs OpenHands CLI)
|
|
56
|
+
│ └── orchestrate.py — Python version (needs OpenHands SDK)
|
|
57
|
+
├── prompts/ — Workflow prompts
|
|
58
|
+
├── hooks/ — Quality enforcement hooks
|
|
59
|
+
├── docs/ — Workflow documentation
|
|
60
|
+
├── templates/ — SDD document templates
|
|
61
|
+
└── config/ — Agent configuration
|
|
62
|
+
|
|
63
|
+
.agents/skills/ — OpenHands skill bridge (auto-installed)
|
|
64
|
+
├── sdd-epic-workflow/
|
|
65
|
+
├── sdd-implementation/
|
|
66
|
+
├── sdd-context/
|
|
67
|
+
├── sdd-testing/
|
|
68
|
+
└── sdd-completion/
|
|
69
|
+
|
|
70
|
+
.openhands/ — OpenHands hook bridge (auto-installed)
|
|
71
|
+
├── hooks.json — Registers stop hook for quality gates
|
|
72
|
+
└── setup.sh — Auto-runs on session start
|
|
41
73
|
```
|
|
42
74
|
|
|
43
|
-
AGENTS.md is also updated with a managed SDD Agent Pack section.
|
|
44
|
-
|
|
45
75
|
### Commands
|
|
46
76
|
|
|
47
77
|
| Command | Description |
|
|
48
78
|
|---------|-------------|
|
|
49
79
|
| `init` | Install SDD Agent Pack in the current repository |
|
|
50
|
-
| `update` | Update
|
|
51
|
-
| `uninstall` | Remove SDD Agent Pack assets safely |
|
|
80
|
+
| `update` | Update installed assets to the latest version |
|
|
81
|
+
| `uninstall` | Remove all SDD Agent Pack assets safely |
|
|
52
82
|
| `doctor` | Validate installation and environment |
|
|
53
83
|
| `status` | Show installation status |
|
|
54
84
|
| `help` | Show all commands |
|
|
55
85
|
|
|
56
|
-
##
|
|
86
|
+
## How to Use This
|
|
57
87
|
|
|
58
|
-
|
|
88
|
+
### The Core Problem This Solves
|
|
59
89
|
|
|
60
|
-
|
|
90
|
+
**LLM-based agents cannot autonomously iterate through a multi-epic `tasks.md`.** If you tell an agent to "implement all 31 epics," it treats that as a single massive objective — it gets overwhelmed, keeps asking for permission, and never completes the work. This is a known limitation of all current coding agents (OpenHands, Claude Code, Copilot, etc.).
|
|
61
91
|
|
|
62
|
-
|
|
63
|
-
|---------------------|---------------------|
|
|
64
|
-
| Python/uv runtime | Node.js/TypeScript CLI |
|
|
65
|
-
| Autonomous orchestrator | Repository installer |
|
|
66
|
-
| LLM provider management | Agent instruction files |
|
|
67
|
-
| API key management | Not needed (agent handles this) |
|
|
68
|
-
| Budget tracking | Not needed (agent handles this) |
|
|
69
|
-
| Custom slash commands | Standard agent workflow |
|
|
92
|
+
The solution is an **external orchestration loop**: a script that reads `tasks.md`, extracts one epic, feeds it to the agent, waits for completion, then moves to the next.
|
|
70
93
|
|
|
71
|
-
|
|
94
|
+
### Workflow Options
|
|
72
95
|
|
|
73
|
-
|
|
74
|
-
- [SDD Agent Pack Spec](specs/sdd-agent-pack_spec.md) — Project specification
|
|
96
|
+
#### Option A: VS Code + Terminal (Recommended)
|
|
75
97
|
|
|
76
|
-
|
|
98
|
+
This is the simplest approach. You run the orchestration script directly from **VS Code's integrated terminal**:
|
|
77
99
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
4. Copilot implements each epic, runs tests, and advances autonomously
|
|
84
|
-
5. Repeat runs of /autopilot-start continue until all epics are complete
|
|
100
|
+
```bash
|
|
101
|
+
# 1. Open VS Code in your project folder
|
|
102
|
+
# 2. Open a terminal (Ctrl+\` or Cmd+\`)
|
|
103
|
+
# 3. Run the orchestration script
|
|
104
|
+
bash .sdd-agent-pack/scripts/orchestrate.sh
|
|
85
105
|
```
|
|
86
106
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
---
|
|
107
|
+
The script:
|
|
108
|
+
1. Scans `tasks.md` for incomplete epics
|
|
109
|
+
2. Calls `openhands --headless -t "Implement Epic X"` for each one
|
|
110
|
+
3. Waits for each epic to complete before starting the next
|
|
111
|
+
4. Reports progress as it goes
|
|
112
|
+
|
|
113
|
+
**You can walk away and let it run.** Check back later to see which epics are done.
|
|
114
|
+
|
|
115
|
+
#### Option B: VS Code + Python SDK
|
|
116
|
+
|
|
117
|
+
If you prefer Python over bash:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
pip install openhands-sdk openhands-tools
|
|
121
|
+
python .sdd-agent-pack/scripts/orchestrate.py
|
|
109
122
|
```
|
|
110
123
|
|
|
111
|
-
|
|
124
|
+
#### Option C: OpenHands Cloud Web UI (Manual)
|
|
125
|
+
|
|
126
|
+
If you use OpenHands Cloud, you don't have direct terminal access — only the agent does. In that case, feed epics one at a time manually:
|
|
127
|
+
|
|
128
|
+
> "Implement epic TDS.2.1 from tasks.md following the SDD workflow."
|
|
129
|
+
|
|
130
|
+
Let the agent finish, then ask for the next one. Repeat until done.
|
|
112
131
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
132
|
+
### Can I use GitHub Copilot for orchestration?
|
|
133
|
+
|
|
134
|
+
Yes! You can ask Copilot (in VS Code Chat) to run the orchestration script for you:
|
|
135
|
+
|
|
136
|
+
> "Run the SDD orchestration script to implement the next epic."
|
|
137
|
+
|
|
138
|
+
Or you can run the script directly in the VS Code terminal yourself — it's one command.
|
|
139
|
+
|
|
140
|
+
### Why not just use the agent directly?
|
|
141
|
+
|
|
142
|
+
Because agents can't autonomously loop through 31 epics. The orchestration script is the external loop that:
|
|
143
|
+
- Maintains focus (one epic at a time)
|
|
144
|
+
- Prevents context window overflow
|
|
145
|
+
- Eliminates permission-asking
|
|
146
|
+
- Provides clear progress tracking
|
|
118
147
|
|
|
119
148
|
## Documentation
|
|
120
149
|
|
|
121
|
-
- [
|
|
122
|
-
- [
|
|
123
|
-
|
|
124
|
-
|
|
150
|
+
- [Specification](specs/sdd-agent-pack_spec.md) — Project architecture and design decisions
|
|
151
|
+
- [Workflow](assets/docs/workflow.md) — SDD workflow documentation
|
|
152
|
+
|
|
153
|
+
## Why SDD Agent Pack?
|
|
154
|
+
|
|
155
|
+
SDD Agent Pack replaces the previous `sdd-autopilot` runtime application. Instead of a Python-based autonomous orchestrator that managed LLM calls, providers, and execution loops, this is a **lightweight installer** that equips AI agents with the instructions they need.
|
|
156
|
+
|
|
157
|
+
### What changed
|
|
158
|
+
|
|
159
|
+
| Old (sdd-autopilot) | New (SDD Agent Pack) |
|
|
160
|
+
|---------------------|---------------------|
|
|
161
|
+
| Python/uv runtime | Node.js/TypeScript CLI |
|
|
162
|
+
| Autonomous orchestrator | Repository installer |
|
|
163
|
+
| LLM provider management | Agent instruction files + orchestration scripts |
|
|
164
|
+
| API key management | OpenHands CLI handles this |
|
|
165
|
+
| Budget tracking | Not needed (agent handles this) |
|
|
166
|
+
| Custom slash commands | Standard agent workflow |
|
|
125
167
|
|
|
126
168
|
## License
|
|
127
169
|
|
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
|
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
Implement the next incomplete epic from tasks.md using the SDD workflow.
|
|
2
2
|
|
|
3
|
+
IMPORTANT: Implement ONLY this one epic. Do NOT start the next one.
|
|
4
|
+
|
|
3
5
|
Follow these steps:
|
|
4
6
|
1. Read all SDD documentation (AGENTS.md, constitution.md, plan.md, specs/, tasks.md)
|
|
5
|
-
2. Identify the
|
|
7
|
+
2. Identify the current incomplete epic
|
|
6
8
|
3. Read the epic specification
|
|
7
9
|
4. Implement the code
|
|
8
10
|
5. Create tests
|
|
9
11
|
6. Run tests
|
|
10
12
|
7. Fix any failures
|
|
11
13
|
8. Update tasks.md with completion notes
|
|
12
|
-
9.
|
|
14
|
+
9. Stop — the orchestration loop handles advancing to the next epic
|
|
@@ -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,SA2FpB,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { Command } from 'commander';
|
|
5
5
|
import { detectRepoRoot, isGitRepository, detectExistingInstallation } from '../utils/repo.js';
|
|
6
|
-
import { backupFiles, createDirectories, installAssets, installOpenHandsBridge, updateAgentsMd, updateGitignore, validateInstallation } from '../utils/installer.js';
|
|
6
|
+
import { backupFiles, createDirectories, installAssets, installOpenHandsBridge, cleanOldArtifacts, setupEnvironment, updateAgentsMd, updateGitignore, validateInstallation } from '../utils/installer.js';
|
|
7
7
|
import { term } from '../utils/console.js';
|
|
8
8
|
export const initCommand = new Command('init')
|
|
9
9
|
.description('Initialize SDD Agent Pack in the current repository')
|
|
@@ -30,35 +30,43 @@ export const initCommand = new Command('init')
|
|
|
30
30
|
term.log(' Use --force to reinstall or "sdd-agent-pack update" to update');
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
|
-
// 4.
|
|
33
|
+
// 4. Clean old artifacts from previous versions
|
|
34
|
+
await cleanOldArtifacts(repoRoot);
|
|
35
|
+
term.success('✓ Old artifacts cleaned');
|
|
36
|
+
// 5. Backup
|
|
34
37
|
await backupFiles(repoRoot);
|
|
35
38
|
term.success('✓ Backup created');
|
|
36
|
-
//
|
|
39
|
+
// 6. Create directories
|
|
37
40
|
await createDirectories(repoRoot);
|
|
38
41
|
term.success('✓ Directories created');
|
|
39
|
-
//
|
|
42
|
+
// 7. Install assets
|
|
40
43
|
await installAssets(repoRoot);
|
|
41
44
|
term.success('✓ Assets installed');
|
|
42
|
-
//
|
|
45
|
+
// 8. Install OpenHands bridge (skills + hooks + setup)
|
|
43
46
|
await installOpenHandsBridge(repoRoot);
|
|
44
47
|
term.success('✓ OpenHands bridge installed (.agents/skills/ + .openhands/)');
|
|
45
|
-
//
|
|
48
|
+
// 9. Update AGENTS.md
|
|
46
49
|
await updateAgentsMd(repoRoot);
|
|
47
50
|
term.success('✓ AGENTS.md updated');
|
|
48
|
-
//
|
|
51
|
+
// 10. Update .gitignore
|
|
49
52
|
await updateGitignore(repoRoot);
|
|
50
53
|
term.success('✓ .gitignore updated');
|
|
51
|
-
//
|
|
54
|
+
// 11. Setup environment (Node deps, Python/uv, OpenHands CLI)
|
|
55
|
+
term.info(' Setting up environment (OpenHands CLI, Python deps)...');
|
|
56
|
+
await setupEnvironment(repoRoot);
|
|
57
|
+
term.success('✓ Environment setup complete');
|
|
58
|
+
// 12. Validate
|
|
52
59
|
const valid = await validateInstallation(repoRoot);
|
|
53
60
|
if (!valid) {
|
|
54
61
|
term.error('✗ Installation validation failed');
|
|
55
62
|
process.exit(1);
|
|
56
63
|
}
|
|
57
64
|
term.success('✓ Installation validated');
|
|
58
|
-
//
|
|
65
|
+
// 13. Summary
|
|
59
66
|
term.log('\n━━━ SDD Agent Pack installed successfully! ━━━\n');
|
|
60
67
|
term.log('Installed:');
|
|
61
68
|
term.log(' .sdd-agent-pack/skills/ — SDD workflow skills');
|
|
69
|
+
term.log(' .sdd-agent-pack/scripts/ — Epic orchestration scripts');
|
|
62
70
|
term.log(' .sdd-agent-pack/prompts/ — Workflow prompts');
|
|
63
71
|
term.log(' .sdd-agent-pack/hooks/ — Quality enforcement hooks');
|
|
64
72
|
term.log(' .sdd-agent-pack/docs/ — Workflow documentation');
|
|
@@ -70,7 +78,10 @@ export const initCommand = new Command('init')
|
|
|
70
78
|
term.log('\nNext steps:');
|
|
71
79
|
term.log(' 1. Review .sdd-agent-pack/docs/ for workflow docs');
|
|
72
80
|
term.log(' 2. Create or update tasks.md with your epics');
|
|
73
|
-
term.log(' 3.
|
|
81
|
+
term.log(' 3. Run the orchestration script to implement epics:');
|
|
82
|
+
term.log(' bash .sdd-agent-pack/scripts/orchestrate.sh');
|
|
83
|
+
term.log(' Or for a single epic:');
|
|
84
|
+
term.log(' bash .sdd-agent-pack/scripts/orchestrate.sh "EPIC-001"');
|
|
74
85
|
term.log('');
|
|
75
86
|
});
|
|
76
87
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.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,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,sBAAsB,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;
|
|
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":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SAuDtB,CAAC"}
|
package/dist/commands/update.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { Command } from 'commander';
|
|
5
5
|
import { detectRepoRoot, isGitRepository, detectExistingInstallation } from '../utils/repo.js';
|
|
6
|
-
import { backupFiles, createDirectories, installAssets, installOpenHandsBridge, updateAgentsMd, updateGitignore, validateInstallation } from '../utils/installer.js';
|
|
6
|
+
import { backupFiles, createDirectories, installAssets, installOpenHandsBridge, cleanOldArtifacts, setupEnvironment, updateAgentsMd, updateGitignore, validateInstallation } from '../utils/installer.js';
|
|
7
7
|
import { term } from '../utils/console.js';
|
|
8
8
|
export const updateCommand = new Command('update')
|
|
9
9
|
.description('Update SDD Agent Pack assets in the current repository')
|
|
@@ -26,6 +26,8 @@ export const updateCommand = new Command('update')
|
|
|
26
26
|
term.log(' Run "sdd-agent-pack init" first');
|
|
27
27
|
process.exit(1);
|
|
28
28
|
}
|
|
29
|
+
await cleanOldArtifacts(repoRoot);
|
|
30
|
+
term.success('✓ Old artifacts cleaned');
|
|
29
31
|
await backupFiles(repoRoot);
|
|
30
32
|
term.success('✓ Backup created');
|
|
31
33
|
await createDirectories(repoRoot);
|
|
@@ -37,6 +39,9 @@ export const updateCommand = new Command('update')
|
|
|
37
39
|
term.success('✓ AGENTS.md updated');
|
|
38
40
|
await updateGitignore(repoRoot);
|
|
39
41
|
term.success('✓ .gitignore updated');
|
|
42
|
+
term.info(' Setting up environment (OpenHands CLI, Python deps)...');
|
|
43
|
+
await setupEnvironment(repoRoot);
|
|
44
|
+
term.success('✓ Environment setup complete');
|
|
40
45
|
const valid = await validateInstallation(repoRoot);
|
|
41
46
|
if (!valid) {
|
|
42
47
|
term.error('✗ Validation failed after update');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.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,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,sBAAsB,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.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,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC1M,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE3C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,aAAa,EAAE,0CAA0C,CAAC;KACjE,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,2BAA2B,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,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,QAAQ,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAExC,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEjC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEjC,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAE3C,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEpC,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAErC,IAAI,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IACvE,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAE7C,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC"}
|
|
@@ -8,6 +8,22 @@
|
|
|
8
8
|
export declare function backupFiles(repoRoot: string): Promise<void>;
|
|
9
9
|
/** Create required subdirectories inside .sdd-agent-pack */
|
|
10
10
|
export declare function createDirectories(repoRoot: string): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Clean up old artifacts from previous SDD Agent Pack versions or approaches.
|
|
13
|
+
* Removes files/dirs that are no longer needed by the current architecture.
|
|
14
|
+
*/
|
|
15
|
+
export declare function cleanOldArtifacts(repoRoot: string): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Set up the target repo environment for SDD workflow execution.
|
|
18
|
+
*
|
|
19
|
+
* Installs:
|
|
20
|
+
* 1. Node.js dependencies (if package.json exists)
|
|
21
|
+
* 2. Python environment with OpenHands SDK (via uv, if available)
|
|
22
|
+
* 3. OpenHands CLI (via pip/uv, if available)
|
|
23
|
+
*
|
|
24
|
+
* This is best-effort — failures are non-fatal.
|
|
25
|
+
*/
|
|
26
|
+
export declare function setupEnvironment(repoRoot: string): Promise<void>;
|
|
11
27
|
/**
|
|
12
28
|
* Install OpenHands bridge files so the agent can discover SDD assets.
|
|
13
29
|
*
|
|
@@ -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;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CvE;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CtE;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,11 +74,114 @@ 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
|
}
|
|
81
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Clean up old artifacts from previous SDD Agent Pack versions or approaches.
|
|
84
|
+
* Removes files/dirs that are no longer needed by the current architecture.
|
|
85
|
+
*/
|
|
86
|
+
export async function cleanOldArtifacts(repoRoot) {
|
|
87
|
+
const removals = [
|
|
88
|
+
// Old backup dirs
|
|
89
|
+
join(repoRoot, '.sdd-agent-pack-backup'),
|
|
90
|
+
// Old autopilot state files
|
|
91
|
+
join(repoRoot, '.agents_tmp'),
|
|
92
|
+
join(repoRoot, '.autopilot'),
|
|
93
|
+
join(repoRoot, '.autopilot-state.json'),
|
|
94
|
+
join(repoRoot, '.autopilot-state.md'),
|
|
95
|
+
// Old autopilot docs (if empty after removal)
|
|
96
|
+
];
|
|
97
|
+
for (const path of removals) {
|
|
98
|
+
if (existsSync(path)) {
|
|
99
|
+
try {
|
|
100
|
+
await remove(path);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Non-critical — best-effort cleanup
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Clean empty .agents/skills/ subdirs that don't match current skills
|
|
108
|
+
const currentSkills = ['sdd-epic-workflow', 'sdd-implementation', 'sdd-context', 'sdd-testing', 'sdd-completion'];
|
|
109
|
+
const agentsSkills = join(repoRoot, '.agents', 'skills');
|
|
110
|
+
if (existsSync(agentsSkills)) {
|
|
111
|
+
try {
|
|
112
|
+
const { readdir } = await import('fs/promises');
|
|
113
|
+
const entries = await readdir(agentsSkills, { withFileTypes: true });
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
if (entry.isDirectory() && !currentSkills.includes(entry.name)) {
|
|
116
|
+
const skillPath = join(agentsSkills, entry.name);
|
|
117
|
+
// Only remove if it looks like an SDD skill (has SKILL.md)
|
|
118
|
+
if (existsSync(join(skillPath, 'SKILL.md'))) {
|
|
119
|
+
await remove(skillPath);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Non-critical
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Set up the target repo environment for SDD workflow execution.
|
|
131
|
+
*
|
|
132
|
+
* Installs:
|
|
133
|
+
* 1. Node.js dependencies (if package.json exists)
|
|
134
|
+
* 2. Python environment with OpenHands SDK (via uv, if available)
|
|
135
|
+
* 3. OpenHands CLI (via pip/uv, if available)
|
|
136
|
+
*
|
|
137
|
+
* This is best-effort — failures are non-fatal.
|
|
138
|
+
*/
|
|
139
|
+
export async function setupEnvironment(repoRoot) {
|
|
140
|
+
const { execSync } = await import('child_process');
|
|
141
|
+
// 1. Install Node.js deps
|
|
142
|
+
if (existsSync(join(repoRoot, 'package.json')) && !existsSync(join(repoRoot, 'node_modules'))) {
|
|
143
|
+
try {
|
|
144
|
+
execSync('npm install 2>/dev/null', { cwd: repoRoot, stdio: 'ignore', timeout: 60000 });
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Non-critical
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// 2. Check/install Python + uv + OpenHands SDK + CLI
|
|
151
|
+
// We use uv because it's the recommended OpenHands installer
|
|
152
|
+
const hasUv = existsSync('/usr/local/bin/uv') || existsSync('/opt/homebrew/bin/uv');
|
|
153
|
+
const hasPip = existsSync('/usr/local/bin/pip3') || existsSync('/opt/homebrew/bin/pip3') || existsSync('/usr/bin/pip3');
|
|
154
|
+
// Check if OpenHands CLI is already available
|
|
155
|
+
try {
|
|
156
|
+
execSync('openhands --version 2>/dev/null', { stdio: 'ignore' });
|
|
157
|
+
return; // Already installed
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Not installed — try to set it up
|
|
161
|
+
}
|
|
162
|
+
// Try installing uv if missing (macOS/Linux)
|
|
163
|
+
if (!hasUv) {
|
|
164
|
+
try {
|
|
165
|
+
execSync('curl -LsSf https://astral.sh/uv/install.sh | sh 2>/dev/null', { stdio: 'ignore', timeout: 30000 });
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// uv install failed — move on
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Try installing OpenHands CLI via uv or pip
|
|
172
|
+
const uvPath = '/root/.cargo/bin/uv'; // typical uv install path
|
|
173
|
+
const uvCmd = existsSync(uvPath) ? uvPath : 'uv';
|
|
174
|
+
const pipCmd = hasPip ? 'pip3' : 'pip';
|
|
175
|
+
for (const installer of [uvCmd, pipCmd]) {
|
|
176
|
+
try {
|
|
177
|
+
execSync(`${installer} install openhands 2>/dev/null`, { stdio: 'ignore', timeout: 120000 });
|
|
178
|
+
break; // Success
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
continue; // Try next installer
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
82
185
|
/**
|
|
83
186
|
* Install OpenHands bridge files so the agent can discover SDD assets.
|
|
84
187
|
*
|
|
@@ -162,7 +265,7 @@ fi
|
|
|
162
265
|
export async function installAssets(repoRoot) {
|
|
163
266
|
const assetRoot = assetsDir();
|
|
164
267
|
const packPath = join(repoRoot, '.sdd-agent-pack');
|
|
165
|
-
const assetDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config'];
|
|
268
|
+
const assetDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config', 'scripts'];
|
|
166
269
|
for (const dir of assetDirs) {
|
|
167
270
|
const src = join(assetRoot, dir);
|
|
168
271
|
const dest = join(packPath, dir);
|
|
@@ -170,6 +273,24 @@ export async function installAssets(repoRoot) {
|
|
|
170
273
|
await copy(src, dest, { overwrite: true, errorOnExist: true });
|
|
171
274
|
}
|
|
172
275
|
}
|
|
276
|
+
// Make scripts executable
|
|
277
|
+
const scriptsToChmod = [
|
|
278
|
+
join(packPath, 'scripts', 'orchestrate.sh'),
|
|
279
|
+
join(packPath, 'scripts', 'orchestrate.py'),
|
|
280
|
+
join(packPath, 'hooks', 'stop-hook.sh'),
|
|
281
|
+
join(packPath, 'hooks', 'pre-implementation.sh'),
|
|
282
|
+
];
|
|
283
|
+
for (const scriptPath of scriptsToChmod) {
|
|
284
|
+
if (existsSync(scriptPath)) {
|
|
285
|
+
try {
|
|
286
|
+
const { chmod } = await import('fs/promises');
|
|
287
|
+
await chmod(scriptPath, 0o755);
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// Non-critical
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
173
294
|
}
|
|
174
295
|
/** Update AGENTS.md with a managed SDD Agent Pack section */
|
|
175
296
|
export async function updateAgentsMd(repoRoot) {
|
|
@@ -218,7 +339,7 @@ export async function updateGitignore(repoRoot) {
|
|
|
218
339
|
/** Validate the installation in the target repository */
|
|
219
340
|
export async function validateInstallation(repoRoot) {
|
|
220
341
|
const packPath = join(repoRoot, '.sdd-agent-pack');
|
|
221
|
-
const requiredDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config'];
|
|
342
|
+
const requiredDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config', 'scripts'];
|
|
222
343
|
// Check all required directories exist
|
|
223
344
|
for (const dir of requiredDirs) {
|
|
224
345
|
if (!existsSync(join(packPath, dir))) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"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"}
|