@flitzrrr/agent-skills 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/.cursorrules +1 -1
- package/.github/copilot-instructions.md +1 -1
- package/.lovable +1 -1
- package/AGENTS.md +1 -1
- package/CHEATSHEET.md +4 -4
- package/CLAUDE.md +1 -1
- package/README.md +52 -7
- package/bin/build-catalog.js +1 -1
- package/bin/rebuild-symlinks.js +161 -0
- package/package.json +2 -2
- package/skills/execute-work-package/SKILL.md +31 -10
- package/skills/execute-work-package/scripts/start-l4l-oci.sh +75 -0
- package/skills/execute-work-package/tpl-implementer-execute-prompt.md +2 -2
- package/skills/execute-work-package/tpl-implementer-preflight-prompt.md +2 -2
package/.cursorrules
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# This file makes skills discoverable in Cursor IDE.
|
|
3
3
|
# For detailed skill usage, see CHEATSHEET.md or individual SKILL.md files.
|
|
4
4
|
|
|
5
|
-
## Available Skills (55 total from
|
|
5
|
+
## Available Skills (55 total from 20 sources)
|
|
6
6
|
|
|
7
7
|
### Security & Code Quality
|
|
8
8
|
- Use `skills/security-review/SKILL.md` for OWASP-based security audits
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Agent Skills Hub — VS Code / GitHub Copilot
|
|
2
2
|
|
|
3
|
-
This repository contains
|
|
3
|
+
This repository contains 480 curated AI agent skills from 19 sources.
|
|
4
4
|
Each skill is a self-contained folder under `skills/` with a `SKILL.md` file.
|
|
5
5
|
|
|
6
6
|
## How to Use Skills
|
package/.lovable
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Agent Skills Hub — Lovable Project Instructions
|
|
2
2
|
# This file makes skills available in Lovable AI.
|
|
3
3
|
|
|
4
|
-
This repository contains
|
|
4
|
+
This repository contains 480 curated AI agent skills for code review, security auditing,
|
|
5
5
|
document generation, frontend development, SEO, and project planning.
|
|
6
6
|
|
|
7
7
|
## How to Use
|
package/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Agent Skills Hub
|
|
2
2
|
|
|
3
|
-
This repository contains 55 curated AI agent skills from
|
|
3
|
+
This repository contains 55 curated AI agent skills from 20 sources.
|
|
4
4
|
Skills are located in the `skills/` directory — each contains a `SKILL.md` with instructions.
|
|
5
5
|
|
|
6
6
|
## Available Skill Categories
|
package/CHEATSHEET.md
CHANGED
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
|
|
54
54
|
## Skills by Source
|
|
55
55
|
|
|
56
|
-
### Sentry (getsentry/skills) —
|
|
56
|
+
### Sentry (getsentry/skills) — 480 skills
|
|
57
57
|
|
|
58
58
|
Security, code quality, and Git workflow. Battle-tested at scale.
|
|
59
59
|
|
|
@@ -123,7 +123,7 @@ Comprehensive SEO auditing toolkit with Playwright integration.
|
|
|
123
123
|
|
|
124
124
|
---
|
|
125
125
|
|
|
126
|
-
### OpenCode Processing (DasDigitaleMomentum) —
|
|
126
|
+
### OpenCode Processing (DasDigitaleMomentum) — 480 skills
|
|
127
127
|
|
|
128
128
|
Multi-session project planning and documentation framework.
|
|
129
129
|
|
|
@@ -141,7 +141,7 @@ Multi-session project planning and documentation framework.
|
|
|
141
141
|
|
|
142
142
|
---
|
|
143
143
|
|
|
144
|
-
### Anthropic (anthropics/skills) —
|
|
144
|
+
### Anthropic (anthropics/skills) — 480 skills
|
|
145
145
|
|
|
146
146
|
Document creation, creative design, developer tools, and enterprise workflows.
|
|
147
147
|
|
|
@@ -184,7 +184,7 @@ Document creation, creative design, developer tools, and enterprise workflows.
|
|
|
184
184
|
|
|
185
185
|
---
|
|
186
186
|
|
|
187
|
-
### Vercel (vercel-labs/agent-skills) —
|
|
187
|
+
### Vercel (vercel-labs/agent-skills) — 480 skills
|
|
188
188
|
|
|
189
189
|
React/Next.js performance, web design, and deployment.
|
|
190
190
|
|
package/CLAUDE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Agent Skills Hub
|
|
2
2
|
|
|
3
|
-
This repository contains 55 curated AI agent skills from
|
|
3
|
+
This repository contains 55 curated AI agent skills from 20 sources.
|
|
4
4
|
Skills are located in the `skills/` directory — each contains a `SKILL.md` with instructions.
|
|
5
5
|
|
|
6
6
|
## Available Skill Categories
|
package/README.md
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@flitzrrr/agent-skills)
|
|
4
4
|
[](https://www.npmjs.com/package/@flitzrrr/agent-skills)
|
|
5
|
-
[](skills/)
|
|
6
|
+
[](vendor/)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
[](.github/workflows/skill-discovery.yml)
|
|
9
9
|
|
|
@@ -130,7 +130,7 @@ New sources are discovered weekly via [GitHub Actions](.github/workflows/skill-d
|
|
|
130
130
|
```
|
|
131
131
|
agent-skills/
|
|
132
132
|
skills/ 504 entries (symlinks to vendor + local forks)
|
|
133
|
-
vendor/
|
|
133
|
+
vendor/ 20 Git submodules (upstream sources)
|
|
134
134
|
bin/ CLI and build scripts
|
|
135
135
|
docs/ GitHub Pages catalog and project documentation
|
|
136
136
|
.github/ CI workflows and copilot-instructions.md
|
|
@@ -153,17 +153,62 @@ Skills are namespaced by source to avoid collisions: `anthropic-pdf`, `tob-stati
|
|
|
153
153
|
|
|
154
154
|
---
|
|
155
155
|
|
|
156
|
-
## MCP Execution Backend (l4l)
|
|
156
|
+
## MCP Execution Backend (l4l-oci)
|
|
157
157
|
|
|
158
158
|
The [execute-work-package](skills/execute-work-package) skill supports three transport modes for delegating implementation to a sub-agent:
|
|
159
159
|
|
|
160
160
|
| Transport | Mechanism | When to use |
|
|
161
161
|
| --- | --- | --- |
|
|
162
|
-
| **MCP via l4l** (default) | [l4l](https://github.com/
|
|
163
|
-
| **Fresh Agent** | IDE spawns a new sub-agent per step (no external server) | Fallback when l4l is not configured |
|
|
162
|
+
| **MCP via l4l-oci** (default) | [l4l-oci](https://github.com/DasDigitaleMomentum/l4l-oci) exposes 10 MCP tools for the gated blueprint-gate-execute lifecycle | Any IDE with MCP support |
|
|
163
|
+
| **Fresh Agent** | IDE spawns a new sub-agent per step (no external server) | Fallback when l4l-oci is not configured |
|
|
164
164
|
| **Stateful Session** | Sub-agent session resumed across steps | OpenCode only |
|
|
165
165
|
|
|
166
|
-
When l4l MCP tools are available (`
|
|
166
|
+
When l4l-oci MCP tools are available (`create_handle`, `generate_blueprint`, `submit_gate`, `execute_handle`, `get_digest`), the skill uses them automatically. The bundled `scripts/start-l4l-oci.sh` auto-starts the server if needed. See the [l4l-oci setup guide](https://github.com/DasDigitaleMomentum/l4l-oci/blob/main/docs/setup.md) for configuration.
|
|
167
|
+
|
|
168
|
+
### Lifecycle
|
|
169
|
+
|
|
170
|
+
```mermaid
|
|
171
|
+
sequenceDiagram
|
|
172
|
+
participant User
|
|
173
|
+
participant Primary as Primary Agent<br/>(IDE)
|
|
174
|
+
participant MCP as l4l-oci MCP Server
|
|
175
|
+
participant Sub as Sub-LLM<br/>(configurable)
|
|
176
|
+
|
|
177
|
+
User->>Primary: Task with scope and DoD
|
|
178
|
+
|
|
179
|
+
rect rgb(240, 245, 250)
|
|
180
|
+
Note over Primary,Sub: Blueprint Phase
|
|
181
|
+
Primary->>MCP: create_handle(project_root)
|
|
182
|
+
MCP-->>Primary: handle_id
|
|
183
|
+
Primary->>MCP: generate_blueprint(handle_id, prompt)
|
|
184
|
+
MCP->>Sub: Generate Execution Blueprint
|
|
185
|
+
Sub-->>MCP: Blueprint (ordered steps)
|
|
186
|
+
Primary->>MCP: get_blueprint(handle_id)
|
|
187
|
+
MCP-->>Primary: Blueprint for review
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
Primary->>User: Present Blueprint for review
|
|
191
|
+
|
|
192
|
+
User->>Primary: Approve
|
|
193
|
+
|
|
194
|
+
rect rgb(240, 250, 240)
|
|
195
|
+
Note over Primary,Sub: Gate
|
|
196
|
+
Primary->>MCP: submit_gate(handle_id, "accept")
|
|
197
|
+
MCP-->>Primary: Gated
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
rect rgb(250, 245, 240)
|
|
201
|
+
Note over Primary,Sub: Execute Phase
|
|
202
|
+
Primary->>MCP: execute_handle(handle_id)
|
|
203
|
+
MCP->>Sub: Implement Blueprint steps
|
|
204
|
+
Sub->>Sub: Edit files, run verification
|
|
205
|
+
Sub-->>MCP: Execution Digest
|
|
206
|
+
Primary->>MCP: get_digest(handle_id)
|
|
207
|
+
MCP-->>Primary: Digest (outcome, files, verify result)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
Primary->>User: Report results
|
|
211
|
+
```
|
|
167
212
|
|
|
168
213
|
---
|
|
169
214
|
|
package/bin/build-catalog.js
CHANGED
|
@@ -155,7 +155,7 @@ function main() {
|
|
|
155
155
|
const stats = fs.lstatSync(entryPath);
|
|
156
156
|
if (stats.isSymbolicLink()) {
|
|
157
157
|
const linkTarget = fs.readlinkSync(entryPath);
|
|
158
|
-
const normalized = linkTarget.replace(
|
|
158
|
+
const normalized = linkTarget.replace(/^(\.\.\/)+/, "");
|
|
159
159
|
realDir = path.join(ROOT, normalized);
|
|
160
160
|
} else if (stats.isDirectory()) {
|
|
161
161
|
realDir = entryPath;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Rebuilds all skill symlinks from vendor/ submodules.
|
|
5
|
+
*
|
|
6
|
+
* Each SKILL.md found in vendor/<source>/ gets a symlink in skills/ with the
|
|
7
|
+
* naming convention: <prefix>-<skill_name>
|
|
8
|
+
*
|
|
9
|
+
* Prefix mapping is defined explicitly for known sources, with a fallback
|
|
10
|
+
* to the first segment of the vendor directory name.
|
|
11
|
+
*
|
|
12
|
+
* Run: node bin/rebuild-symlinks.js
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const fs = require("fs");
|
|
16
|
+
const path = require("path");
|
|
17
|
+
|
|
18
|
+
const ROOT = path.resolve(__dirname, "..");
|
|
19
|
+
const SKILLS_DIR = path.join(ROOT, "skills");
|
|
20
|
+
const VENDOR_DIR = path.join(ROOT, "vendor");
|
|
21
|
+
|
|
22
|
+
// Explicit prefix mapping: vendor directory name → skill prefix
|
|
23
|
+
const PREFIX_MAP = {
|
|
24
|
+
"trailofbits-skills": "tob",
|
|
25
|
+
"anthropic-skills": "anthropic",
|
|
26
|
+
"anthropic-finance": "finance",
|
|
27
|
+
"vercel-agent-skills": "vercel",
|
|
28
|
+
"getsentry-skills": "sentry",
|
|
29
|
+
"google-stitch-skills": "google",
|
|
30
|
+
"cloudflare-skills": "cloudflare",
|
|
31
|
+
"stripe-skills": "stripe",
|
|
32
|
+
"expo-skills": "expo",
|
|
33
|
+
"hashicorp-skills": "hashicorp",
|
|
34
|
+
"supabase-skills": "supabase",
|
|
35
|
+
"callstack-skills": "callstack",
|
|
36
|
+
"scientific-skills": "scientific",
|
|
37
|
+
"opencode-processing-skills": "opencode",
|
|
38
|
+
"agentic-seo-skill": "seo",
|
|
39
|
+
"marketingskills": null, // no prefix, use skill name directly
|
|
40
|
+
"addyosmani-agent-skills": "addyosmani",
|
|
41
|
+
"itsmostafa-aws-agent-skills": "aws",
|
|
42
|
+
"MoizIbnYousaf-Ai-Agent-Skills": "MoizIbnYousaf",
|
|
43
|
+
"JackyST0-awesome-agent-skills": "JackyST0",
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
function getPrefix(vendorName) {
|
|
47
|
+
if (vendorName in PREFIX_MAP) return PREFIX_MAP[vendorName];
|
|
48
|
+
// Fallback: first segment before first hyphen
|
|
49
|
+
return vendorName.split("-")[0];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function findSkillMds(dir, maxDepth, results) {
|
|
53
|
+
if (maxDepth <= 0) return;
|
|
54
|
+
let entries;
|
|
55
|
+
try {
|
|
56
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
57
|
+
} catch {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const e of entries) {
|
|
61
|
+
if (e.name === ".git" || e.name === "node_modules") continue;
|
|
62
|
+
const full = path.join(dir, e.name);
|
|
63
|
+
if (e.isFile() && e.name.toLowerCase() === "skill.md") {
|
|
64
|
+
results.push(path.dirname(full));
|
|
65
|
+
} else if (e.isDirectory()) {
|
|
66
|
+
findSkillMds(full, maxDepth - 1, results);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function main() {
|
|
72
|
+
// Preserve manually-created skill directories (non-symlinks)
|
|
73
|
+
const manualSkills = new Set();
|
|
74
|
+
if (fs.existsSync(SKILLS_DIR)) {
|
|
75
|
+
for (const entry of fs.readdirSync(SKILLS_DIR)) {
|
|
76
|
+
const entryPath = path.join(SKILLS_DIR, entry);
|
|
77
|
+
const stat = fs.lstatSync(entryPath);
|
|
78
|
+
if (stat.isDirectory() && !stat.isSymbolicLink()) {
|
|
79
|
+
manualSkills.add(entry);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Remove all existing symlinks
|
|
85
|
+
if (fs.existsSync(SKILLS_DIR)) {
|
|
86
|
+
for (const entry of fs.readdirSync(SKILLS_DIR)) {
|
|
87
|
+
const entryPath = path.join(SKILLS_DIR, entry);
|
|
88
|
+
if (fs.lstatSync(entryPath).isSymbolicLink()) {
|
|
89
|
+
fs.unlinkSync(entryPath);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
fs.mkdirSync(SKILLS_DIR);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
let created = 0;
|
|
97
|
+
let skipped = 0;
|
|
98
|
+
const vendors = fs.readdirSync(VENDOR_DIR).filter((d) => {
|
|
99
|
+
const p = path.join(VENDOR_DIR, d);
|
|
100
|
+
return !d.startsWith(".") && fs.statSync(p).isDirectory();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
for (const vendor of vendors) {
|
|
104
|
+
const vendorPath = path.join(VENDOR_DIR, vendor);
|
|
105
|
+
const prefix = getPrefix(vendor);
|
|
106
|
+
const skillDirs = [];
|
|
107
|
+
findSkillMds(vendorPath, 5, skillDirs);
|
|
108
|
+
|
|
109
|
+
// Special case: seo skill — single top-level link
|
|
110
|
+
if (vendor === "agentic-seo-skill") {
|
|
111
|
+
const linkName = "seo";
|
|
112
|
+
const target = `../vendor/${vendor}`;
|
|
113
|
+
if (!manualSkills.has(linkName)) {
|
|
114
|
+
fs.symlinkSync(target, path.join(SKILLS_DIR, linkName));
|
|
115
|
+
created++;
|
|
116
|
+
}
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
for (const skillDir of skillDirs) {
|
|
121
|
+
const skillName = path.basename(skillDir);
|
|
122
|
+
const linkName = prefix ? `${prefix}-${skillName}` : skillName;
|
|
123
|
+
|
|
124
|
+
// Don't overwrite manual skills
|
|
125
|
+
if (manualSkills.has(linkName)) {
|
|
126
|
+
skipped++;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Relative path from skills/ to the skill directory
|
|
131
|
+
const relPath = path.relative(SKILLS_DIR, skillDir);
|
|
132
|
+
const target = `../vendor/${path.relative(VENDOR_DIR, skillDir)}`;
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
// Check for name collisions
|
|
136
|
+
const linkPath = path.join(SKILLS_DIR, linkName);
|
|
137
|
+
if (fs.existsSync(linkPath) || fs.lstatSync(linkPath).isSymbolicLink()) {
|
|
138
|
+
// Already exists, skip
|
|
139
|
+
skipped++;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
} catch {
|
|
143
|
+
// lstatSync throws if path doesn't exist — that's what we want
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
try {
|
|
147
|
+
fs.symlinkSync(target, path.join(SKILLS_DIR, linkName));
|
|
148
|
+
created++;
|
|
149
|
+
} catch (err) {
|
|
150
|
+
// Name collision from a different vendor
|
|
151
|
+
skipped++;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
console.log(`Rebuilt symlinks: ${created} created, ${skipped} skipped (manual or collision)`);
|
|
157
|
+
console.log(`Manual skill dirs preserved: ${[...manualSkills].join(", ") || "(none)"}`);
|
|
158
|
+
console.log(`Total skills/ entries: ${fs.readdirSync(SKILLS_DIR).length}`);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flitzrrr/agent-skills",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "480 AI agent skills from 20 sources — multiplatform-ready for VS Code (GitHub Copilot), Claude Code, Codex, Cursor, Antigravity, OpenCode, Lovable, and more.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "node bin/test-cli.js"
|
|
7
7
|
},
|
|
@@ -78,19 +78,40 @@ Do **not** use this skill to:
|
|
|
78
78
|
|
|
79
79
|
### Transport
|
|
80
80
|
|
|
81
|
-
This skill supports three transport mechanisms. **If l4l MCP tools are available** (check: do you have `
|
|
81
|
+
This skill supports three transport mechanisms. **If l4l-oci MCP tools are available** (check: do you have `create_handle`, `generate_blueprint`, `submit_gate`, `execute_handle`, `get_digest` tools?), **always use Option A.** Only fall back to B/C if MCP is not configured.
|
|
82
82
|
|
|
83
|
-
####
|
|
83
|
+
#### Pre-flight: Ensure l4l-oci server is running
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
Before using Option A, run the bundled helper:
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
```bash
|
|
88
|
+
skills/execute-work-package/scripts/start-l4l-oci.sh
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Behavior:
|
|
92
|
+
- Uses `L4L_OCI_ROOT` (default: `$HOME/git/l4l-oci`)
|
|
93
|
+
- Starts `python -m l4l_oci` in background if needed
|
|
94
|
+
- Waits for MCP `health` to return `ok`
|
|
95
|
+
- Exports `L4L_OCI_DEFAULT_MODEL=qwen-openrouter` for startup unless already set
|
|
96
|
+
|
|
97
|
+
Prerequisites:
|
|
98
|
+
- `OPENROUTER_API_KEY` (or `QWEN_API_KEY`) must be available in the environment
|
|
99
|
+
|
|
100
|
+
#### Option A: MCP via l4l-oci (Default)
|
|
101
|
+
|
|
102
|
+
Use the l4l-oci MCP server. The primary calls MCP tools directly — no Agent spawning needed:
|
|
103
|
+
|
|
104
|
+
1. `create_handle(project_root)` → returns `handle_id`
|
|
105
|
+
2. `generate_blueprint(handle_id, prompt)` → async; poll with `get_status(handle_id)` until complete
|
|
106
|
+
3. `get_blueprint(handle_id, format="markdown")` → review the Execution Blueprint
|
|
107
|
+
4. `submit_gate(handle_id, decision="accept"|"reject", notes=...)` → explicit gate
|
|
108
|
+
5. `execute_handle(handle_id)` → async; poll with `get_status(handle_id)` until complete
|
|
109
|
+
6. `get_digest(handle_id, format="markdown")` → returns Execution Digest
|
|
110
|
+
7. `cleanup_handle(handle_id)` → optional cleanup
|
|
90
111
|
|
|
91
112
|
Benefits: state persistence across restarts, model decoupling (cheap Sub-LLM), scope enforcement, iterative blueprint refinement.
|
|
92
113
|
|
|
93
|
-
|
|
114
|
+
Additional tools: `health()` (service health check), `list_handles()` (list all active handles).
|
|
94
115
|
|
|
95
116
|
#### Option B: Stateful Subagent (OpenCode)
|
|
96
117
|
|
|
@@ -147,7 +168,7 @@ Before delegating:
|
|
|
147
168
|
|
|
148
169
|
### 1) MODE: BLUEPRINT (Execution Blueprint)
|
|
149
170
|
|
|
150
|
-
> **Option A (MCP):** Call `
|
|
171
|
+
> **Option A (MCP):** Call `create_handle(project_root)`, then `generate_blueprint(handle_id, prompt)`. Poll `get_status(handle_id)` until complete, then `get_blueprint(handle_id, format="markdown")` to review.
|
|
151
172
|
|
|
152
173
|
Primary delegates to `implementer` with a prompt based on `tpl-implementer-preflight-prompt.md`.
|
|
153
174
|
|
|
@@ -167,7 +188,7 @@ If the user requests changes, the step list must be revised and re-approved with
|
|
|
167
188
|
|
|
168
189
|
### 2) Execute (new Agent)
|
|
169
190
|
|
|
170
|
-
> **Option A (MCP):** Call `
|
|
191
|
+
> **Option A (MCP):** Call `submit_gate(handle_id, decision="accept")` then `execute_handle(handle_id)`. Poll `get_status(handle_id)` until complete, then `get_digest(handle_id, format="markdown")` for the digest.
|
|
171
192
|
|
|
172
193
|
Primary spawns a **new** `implementer` Agent with a prompt based on `tpl-implementer-execute-prompt.md`. The prompt includes the full approved step list, all references, and the verify command. Do NOT use SendMessage to resume the BLUEPRINT agent — spawn a fresh Agent instead.
|
|
173
194
|
|
|
@@ -179,7 +200,7 @@ The execute prompt MUST start with a clear mode indicator:
|
|
|
179
200
|
|
|
180
201
|
and MUST include the approval token.
|
|
181
202
|
|
|
182
|
-
> **Option A (MCP):** Skip
|
|
203
|
+
> **Option A (MCP):** Skip the Agent spawn above. Call `submit_gate` → `execute_handle` → poll `get_status` → `get_digest` directly via MCP tools.
|
|
183
204
|
|
|
184
205
|
### 3) Digest back to Primary
|
|
185
206
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
L4L_OCI_ROOT="${L4L_OCI_ROOT:-$HOME/git/l4l-oci}"
|
|
5
|
+
L4L_OCI_URL="${L4L_OCI_URL:-http://127.0.0.1:8765/mcp}"
|
|
6
|
+
L4L_OCI_DEFAULT_MODEL="${L4L_OCI_DEFAULT_MODEL:-qwen-openrouter}"
|
|
7
|
+
L4L_OCI_LOG_FILE="${L4L_OCI_LOG_FILE:-$L4L_OCI_ROOT/logs/l4l-oci-service.log}"
|
|
8
|
+
L4L_OCI_PID_FILE="${L4L_OCI_PID_FILE:-$L4L_OCI_ROOT/.l4l-oci/l4l-oci.pid}"
|
|
9
|
+
|
|
10
|
+
PY="$L4L_OCI_ROOT/.venv/bin/python"
|
|
11
|
+
if [ ! -x "$PY" ]; then
|
|
12
|
+
echo "ERROR: Python not found at $PY" >&2
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
if [ -z "${OPENROUTER_API_KEY:-}" ] && [ -z "${QWEN_API_KEY:-}" ]; then
|
|
17
|
+
echo "ERROR: Neither OPENROUTER_API_KEY nor QWEN_API_KEY is set." >&2
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
health_ok() {
|
|
22
|
+
"$PY" - <<'PY'
|
|
23
|
+
import asyncio
|
|
24
|
+
import os
|
|
25
|
+
from fastmcp import Client
|
|
26
|
+
|
|
27
|
+
url = os.environ["L4L_OCI_URL"]
|
|
28
|
+
|
|
29
|
+
async def main() -> int:
|
|
30
|
+
try:
|
|
31
|
+
async with Client(url) as client:
|
|
32
|
+
res = await client.call_tool("health", {})
|
|
33
|
+
status = (res.data or {}).get("status")
|
|
34
|
+
return 0 if status == "ok" else 1
|
|
35
|
+
except Exception:
|
|
36
|
+
return 1
|
|
37
|
+
|
|
38
|
+
raise SystemExit(asyncio.run(main()))
|
|
39
|
+
PY
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export L4L_OCI_URL
|
|
43
|
+
|
|
44
|
+
if health_ok; then
|
|
45
|
+
echo "l4l-oci already reachable at $L4L_OCI_URL"
|
|
46
|
+
exit 0
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
if [ -f "$L4L_OCI_PID_FILE" ]; then
|
|
50
|
+
OLD_PID="$(cat "$L4L_OCI_PID_FILE" 2>/dev/null || true)"
|
|
51
|
+
if [ -n "$OLD_PID" ] && ! kill -0 "$OLD_PID" 2>/dev/null; then
|
|
52
|
+
rm -f "$L4L_OCI_PID_FILE"
|
|
53
|
+
fi
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
mkdir -p "$(dirname "$L4L_OCI_LOG_FILE")" "$(dirname "$L4L_OCI_PID_FILE")"
|
|
57
|
+
|
|
58
|
+
(
|
|
59
|
+
cd "$L4L_OCI_ROOT"
|
|
60
|
+
export L4L_OCI_DEFAULT_MODEL
|
|
61
|
+
nohup "$PY" -m l4l_oci >>"$L4L_OCI_LOG_FILE" 2>&1 &
|
|
62
|
+
echo "$!" >"$L4L_OCI_PID_FILE"
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
for _ in $(seq 1 30); do
|
|
66
|
+
if health_ok; then
|
|
67
|
+
echo "l4l-oci started at $L4L_OCI_URL"
|
|
68
|
+
exit 0
|
|
69
|
+
fi
|
|
70
|
+
sleep 0.5
|
|
71
|
+
done
|
|
72
|
+
|
|
73
|
+
echo "ERROR: l4l-oci did not become healthy. Last log lines:" >&2
|
|
74
|
+
tail -n 40 "$L4L_OCI_LOG_FILE" >&2 || true
|
|
75
|
+
exit 1
|
|
@@ -28,7 +28,7 @@ Execution invariants (must):
|
|
|
28
28
|
- Concrete reason
|
|
29
29
|
- What input is missing
|
|
30
30
|
|
|
31
|
-
<!-- IF MCP: This prompt is used for Options B/C (Stateful/Fresh Agent). For Option A (MCP), call
|
|
31
|
+
<!-- IF MCP: This prompt is used for Options B/C (Stateful/Fresh Agent). For Option A (MCP), run `skills/execute-work-package/scripts/start-l4l-oci.sh` first, then call `submit_gate()` and `execute_handle()`. -->
|
|
32
32
|
|
|
33
33
|
## Approved Step List
|
|
34
34
|
{{approved_steps}}
|
|
@@ -43,7 +43,7 @@ Execution invariants (must):
|
|
|
43
43
|
- Modules (optional): {{docs_modules_ref}}
|
|
44
44
|
- Features (optional): {{docs_features_ref}}
|
|
45
45
|
|
|
46
|
-
<!-- IF MCP: When using l4l MCP (Option A),
|
|
46
|
+
<!-- IF MCP: When using l4l-oci MCP (Option A), poll `get_status()` and fetch digest via `get_digest()`. -->
|
|
47
47
|
|
|
48
48
|
## Verify Command
|
|
49
49
|
{{verify_command}}
|
|
@@ -24,7 +24,7 @@ In BLUEPRINT mode:
|
|
|
24
24
|
- Do NOT run commands.
|
|
25
25
|
- Do NOT claim you changed code.
|
|
26
26
|
|
|
27
|
-
<!-- IF MCP: This prompt is used for Options B/C (Stateful/Fresh Agent). For Option A (MCP),
|
|
27
|
+
<!-- IF MCP: This prompt is used for Options B/C (Stateful/Fresh Agent). For Option A (MCP), run `skills/execute-work-package/scripts/start-l4l-oci.sh` first, then call `create_handle()` and `generate_blueprint()`. -->
|
|
28
28
|
|
|
29
29
|
## Work Packet
|
|
30
30
|
|
|
@@ -53,7 +53,7 @@ In BLUEPRINT mode:
|
|
|
53
53
|
|
|
54
54
|
If `{{verify_command}}` is empty/unknown, propose exactly **one** verify command.
|
|
55
55
|
|
|
56
|
-
<!-- IF MCP: When using l4l MCP (Option A),
|
|
56
|
+
<!-- IF MCP: When using l4l-oci MCP (Option A), pass planning/doc refs through the `generate_blueprint` prompt and retrieve results with `get_blueprint()`. -->
|
|
57
57
|
|
|
58
58
|
## Output
|
|
59
59
|
|