sdd-agent-pack 1.1.0 → 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/hooks/README.md +2 -2
- package/assets/hooks/hooks.json +0 -8
- package/assets/hooks/pre-implementation.sh +11 -9
- 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 +38 -13
- 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
|
|
package/assets/hooks/README.md
CHANGED
|
@@ -34,8 +34,8 @@ If manually setting up:
|
|
|
34
34
|
|
|
35
35
|
| File | Type | Purpose |
|
|
36
36
|
|------|------|---------|
|
|
37
|
-
| `stop-hook.sh` | Stop | Prevents completion if tests fail or SDD criteria not met |
|
|
38
|
-
| `pre-implementation.sh` |
|
|
37
|
+
| `stop-hook.sh` | Stop (auto-activated) | Prevents completion if tests fail or SDD criteria not met |
|
|
38
|
+
| `pre-implementation.sh` | Reference only (not auto-activated) | Example quality gate — see header for manual setup |
|
|
39
39
|
|
|
40
40
|
## How Stop Hook Works
|
|
41
41
|
|
package/assets/hooks/hooks.json
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
#
|
|
2
|
+
# SDD Quality Gate — Reference script (not auto-activated)
|
|
3
3
|
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
4
|
+
# This script is a reference for creating quality gates. It is NOT
|
|
5
|
+
# registered in the default hooks.json because running test checks
|
|
6
|
+
# before every tool call would block all agent operations.
|
|
6
7
|
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
8
|
+
# The primary quality gate is stop-hook.sh, which runs when the
|
|
9
|
+
# agent tries to finish a task.
|
|
9
10
|
#
|
|
10
|
-
#
|
|
11
|
+
# If you want to use this as a PreToolUse hook, add an entry to
|
|
12
|
+
# .openhands/hooks.json and match a specific tool (not "*"):
|
|
11
13
|
# ```json
|
|
12
14
|
# {
|
|
13
|
-
# "
|
|
15
|
+
# "pre_tool_use": [
|
|
14
16
|
# {
|
|
15
|
-
# "matcher": "
|
|
17
|
+
# "matcher": "terminal",
|
|
16
18
|
# "hooks": [
|
|
17
|
-
# { "command": ".sdd-agent-pack/hooks/
|
|
19
|
+
# { "command": ".sdd-agent-pack/hooks/pre-implementation.sh", "timeout": 10 }
|
|
18
20
|
# ]
|
|
19
21
|
# }
|
|
20
22
|
# ]
|
|
@@ -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,
|
|
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
|
}
|
|
@@ -93,6 +93,7 @@ export async function installOpenHandsBridge(repoRoot) {
|
|
|
93
93
|
const packSkills = join(repoRoot, '.sdd-agent-pack', 'skills');
|
|
94
94
|
const agentsSkills = join(repoRoot, '.agents', 'skills');
|
|
95
95
|
const openhandsDir = join(repoRoot, '.openhands');
|
|
96
|
+
const packHooks = join(repoRoot, '.sdd-agent-pack', 'hooks');
|
|
96
97
|
// 1. Copy skills into .agents/skills/ (OpenHands native location)
|
|
97
98
|
if (existsSync(packSkills)) {
|
|
98
99
|
await ensureDir(agentsSkills);
|
|
@@ -105,7 +106,21 @@ export async function installOpenHandsBridge(repoRoot) {
|
|
|
105
106
|
}
|
|
106
107
|
}
|
|
107
108
|
}
|
|
108
|
-
// 2.
|
|
109
|
+
// 2. Make hook scripts executable (fixes "Permission denied" exit 126)
|
|
110
|
+
const hookScripts = ['stop-hook.sh', 'pre-implementation.sh'];
|
|
111
|
+
for (const script of hookScripts) {
|
|
112
|
+
const scriptPath = join(packHooks, script);
|
|
113
|
+
if (existsSync(scriptPath)) {
|
|
114
|
+
try {
|
|
115
|
+
const { chmod } = await import('fs/promises');
|
|
116
|
+
await chmod(scriptPath, 0o755);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Non-critical
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// 3. Create .openhands/hooks.json pointing to scripts in .sdd-agent-pack/
|
|
109
124
|
await ensureDir(openhandsDir);
|
|
110
125
|
const hooksJsonPath = join(openhandsDir, 'hooks.json');
|
|
111
126
|
const hooksConfig = {
|
|
@@ -116,18 +131,10 @@ export async function installOpenHandsBridge(repoRoot) {
|
|
|
116
131
|
{ command: '.sdd-agent-pack/hooks/stop-hook.sh', timeout: 120 }
|
|
117
132
|
]
|
|
118
133
|
}
|
|
119
|
-
],
|
|
120
|
-
pre_tool_use: [
|
|
121
|
-
{
|
|
122
|
-
matcher: '*',
|
|
123
|
-
hooks: [
|
|
124
|
-
{ command: '.sdd-agent-pack/hooks/pre-implementation.sh', timeout: 10 }
|
|
125
|
-
]
|
|
126
|
-
}
|
|
127
134
|
]
|
|
128
135
|
};
|
|
129
136
|
await writeFile(hooksJsonPath, JSON.stringify(hooksConfig, null, 2) + '\n', 'utf8');
|
|
130
|
-
//
|
|
137
|
+
// 4. Create .openhands/setup.sh to install dependencies if needed
|
|
131
138
|
const setupShPath = join(openhandsDir, 'setup.sh');
|
|
132
139
|
const setupContent = `#!/bin/bash
|
|
133
140
|
# SDD Agent Pack — OpenHands setup script
|
|
@@ -155,7 +162,7 @@ fi
|
|
|
155
162
|
export async function installAssets(repoRoot) {
|
|
156
163
|
const assetRoot = assetsDir();
|
|
157
164
|
const packPath = join(repoRoot, '.sdd-agent-pack');
|
|
158
|
-
const assetDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config'];
|
|
165
|
+
const assetDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config', 'scripts'];
|
|
159
166
|
for (const dir of assetDirs) {
|
|
160
167
|
const src = join(assetRoot, dir);
|
|
161
168
|
const dest = join(packPath, dir);
|
|
@@ -163,6 +170,24 @@ export async function installAssets(repoRoot) {
|
|
|
163
170
|
await copy(src, dest, { overwrite: true, errorOnExist: true });
|
|
164
171
|
}
|
|
165
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
|
+
}
|
|
166
191
|
}
|
|
167
192
|
/** Update AGENTS.md with a managed SDD Agent Pack section */
|
|
168
193
|
export async function updateAgentsMd(repoRoot) {
|
|
@@ -211,7 +236,7 @@ export async function updateGitignore(repoRoot) {
|
|
|
211
236
|
/** Validate the installation in the target repository */
|
|
212
237
|
export async function validateInstallation(repoRoot) {
|
|
213
238
|
const packPath = join(repoRoot, '.sdd-agent-pack');
|
|
214
|
-
const requiredDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config'];
|
|
239
|
+
const requiredDirs = ['skills', 'prompts', 'hooks', 'docs', 'templates', 'config', 'scripts'];
|
|
215
240
|
// Check all required directories exist
|
|
216
241
|
for (const dir of requiredDirs) {
|
|
217
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":"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,EAAE,SAAS,CAAC,CAAC;IACtF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAgB;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAE7D,kEAAkE;IAClE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAC9G,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YAC1C,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,MAAM,WAAW,GAAG,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;IAC9D,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC9C,MAAM,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;IAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE;YACJ;gBACE,OAAO,EAAE,GAAG;gBACZ,KAAK,EAAE;oBACL,EAAE,OAAO,EAAE,oCAAoC,EAAE,OAAO,EAAE,GAAG,EAAE;iBAChE;aACF;SACF;KACF,CAAC;IACF,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAEpF,kEAAkE;IAClE,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG;;;;;;;;;;;CAWtB,CAAC;IACA,MAAM,SAAS,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAEnD,2BAA2B;IAC3B,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;IAC3D,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAEnD,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3F,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,cAAc,GAAG;QACrB,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC;QACvC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,uBAAuB,CAAC;KACjD,CAAC;IACF,KAAK,MAAM,UAAU,IAAI,cAAc,EAAE,CAAC;QACxC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC9C,MAAM,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACjD,2BAA2B;QAC3B,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,mEAAmE,EACnE,EAAE,CACH,CAAC,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;QACnC,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAwB,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,sCAAsC;YACtC,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,yBAAyB,CAAC;IAE7C,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvB,MAAM,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAwB,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,SAAS,CAAC,aAAa,EAAE,UAAU,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE9F,uCAAuC;IACvC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;YAC3G,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,MAAM,YAAY,GAAG;QACnB,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,UAAU,CAAC;QACpE,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC;KAC3C,CAAC;IACF,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAE1D,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEzB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAC7B,mEAAmE,EACnE,EAAE,CACH,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,yBAAyB,CAAC,CAAC;QAChG,MAAM,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IAC1D,iEAAiE;IACjE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAC9G,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACtD,qDAAqD;YACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBAC/C,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAC7D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACpD,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACvC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC"}
|