@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 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 19 sources)
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 504 curated AI agent skills from 19 sources.
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 504 curated AI agent skills for code review, security auditing,
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 19 sources.
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) — 504 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) — 504 skills
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) — 504 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) — 504 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 19 sources.
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
  [![npm version](https://img.shields.io/npm/v/@flitzrrr/agent-skills?style=flat-square&color=cb3837)](https://www.npmjs.com/package/@flitzrrr/agent-skills)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/@flitzrrr/agent-skills?style=flat-square)](https://www.npmjs.com/package/@flitzrrr/agent-skills)
5
- [![Skills](https://img.shields.io/badge/skills-504-blue?style=flat-square)](skills/)
6
- [![Sources](https://img.shields.io/badge/sources-19-green?style=flat-square)](vendor/)
5
+ [![Skills](https://img.shields.io/badge/skills-480-blue?style=flat-square)](skills/)
6
+ [![Sources](https://img.shields.io/badge/sources-20-green?style=flat-square)](vendor/)
7
7
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](LICENSE)
8
8
  [![Weekly Discovery](https://img.shields.io/badge/auto--discovery-weekly-purple?style=flat-square)](.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/ 19 Git submodules (upstream sources)
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/flitzrrr/l4l) exposes 5 MCP tools for the gated precheck-approve-execute lifecycle | Any IDE with MCP support |
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 (`precheck_new`, `precheck_iterate`, `approve_blueprint`, `execute`, `handle_report`), the skill uses them automatically. See the [l4l setup guide](https://github.com/flitzrrr/l4l/blob/main/docs/CLAUDE_CODE_SETUP.md) for configuration.
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
 
@@ -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.1.0",
4
- "description": "504 AI agent skills from 19 sources — multiplatform-ready for VS Code (GitHub Copilot), Claude Code, Codex, Cursor, Antigravity, OpenCode, Lovable, and more.",
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 `precheck_new`, `approve_blueprint`, `execute` tools?), **always use Option A.** Only fall back to B/C if MCP is not configured.
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
- #### Option A: MCP via l4l (Default)
83
+ #### Pre-flight: Ensure l4l-oci server is running
84
84
 
85
- Use the l4l Sub-Agent MCP server. The primary calls MCP tools directly — no Agent spawning needed:
85
+ Before using Option A, run the bundled helper:
86
86
 
87
- 1. `precheck_new(intent, scope_paths, output_format="skill")` → returns Execution Blueprint
88
- 2. `approve_blueprint(handle_id)` → explicit gate
89
- 3. `execute(handle_id, output_format="skill")` → returns Execution Digest
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
- Setup: See l4l's `docs/CLAUDE_CODE_SETUP.md`.
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 `precheck_new(intent=..., scope_paths=..., output_format="skill")`. The blueprint is returned directly no Agent spawn needed.
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 `approve_blueprint(handle_id)` then `execute(handle_id, output_format="skill")`. The digest is returned directly no Agent spawn needed.
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 Steps 2–3 above. The `execute` MCP tool returns the digest directly.
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 approve_blueprint() then execute() — this template is not needed. -->
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), the execute tool runs verification automatically. The output_format="skill" parameter returns a digest matching tpl-execution-digest.md format. -->
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), call precheck_new() directly this template is not needed. -->
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), the precheck_new tool accepts plan_ref, phase_ref, impl_plan_ref, and docs_refs parameters directly no need to embed them in the prompt. -->
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