@caddis/cli 0.4.9 → 0.4.11

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.
Files changed (74) hide show
  1. package/bundles/antigravity-plugin/agents/code-reviewer.md +2 -2
  2. package/bundles/antigravity-plugin/plugin.json +1 -1
  3. package/bundles/antigravity-plugin/scripts/enforcement_inventory.py +1 -1
  4. package/bundles/antigravity-plugin/scripts/oss_review.py +10 -2
  5. package/bundles/antigravity-plugin/skills/_registry.md +0 -1
  6. package/bundles/antigravity-plugin/skills/brainstorming/SKILL.md +2 -2
  7. package/bundles/antigravity-plugin/skills/cross-review/SKILL.md +5 -2
  8. package/bundles/antigravity-plugin/skills/explainer-doc/SKILL.md +1 -1
  9. package/bundles/antigravity-plugin/skills/ship-pr/SKILL.md +1 -1
  10. package/bundles/antigravity-plugin/skills/spawn-session/SKILL.md +2 -2
  11. package/bundles/antigravity-plugin-extras/plugin.json +1 -1
  12. package/bundles/antigravity-plugin-extras/skills/_registry.md +1 -19
  13. package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +1 -1
  14. package/bundles/codex/.codex/skills/workflow/brainstorming/SKILL.md +2 -2
  15. package/bundles/manifest.json +3 -3
  16. package/package.json +1 -1
  17. package/bundles/antigravity-plugin-extras/skills/competitive-ads-extractor/SKILL.md +0 -294
  18. package/bundles/antigravity-plugin-extras/skills/content-research-writer/SKILL.md +0 -539
  19. package/bundles/antigravity-plugin-extras/skills/domain-name-brainstormer/SKILL.md +0 -213
  20. package/bundles/antigravity-plugin-extras/skills/humanizer/SKILL.md +0 -194
  21. package/bundles/antigravity-plugin-extras/skills/image-enhancer/SKILL.md +0 -100
  22. package/bundles/antigravity-plugin-extras/skills/invoice-organizer/SKILL.md +0 -447
  23. package/bundles/antigravity-plugin-extras/skills/job-application/SKILL.md +0 -188
  24. package/bundles/antigravity-plugin-extras/skills/lead-research-assistant/SKILL.md +0 -200
  25. package/bundles/antigravity-plugin-extras/skills/meeting-insights-analyzer/SKILL.md +0 -328
  26. package/bundles/antigravity-plugin-extras/skills/notebooklm/AUTHENTICATION.md +0 -154
  27. package/bundles/antigravity-plugin-extras/skills/notebooklm/SKILL.md +0 -270
  28. package/bundles/antigravity-plugin-extras/skills/notebooklm/references/api_reference.md +0 -309
  29. package/bundles/antigravity-plugin-extras/skills/notebooklm/references/troubleshooting.md +0 -376
  30. package/bundles/antigravity-plugin-extras/skills/notebooklm/references/usage_patterns.md +0 -338
  31. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/__init__.py +0 -81
  32. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/ask_question.py +0 -256
  33. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/auth_manager.py +0 -358
  34. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/browser_session.py +0 -255
  35. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/browser_utils.py +0 -107
  36. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/cleanup_manager.py +0 -302
  37. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/config.py +0 -44
  38. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/notebook_manager.py +0 -410
  39. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/run.py +0 -102
  40. package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/setup_environment.py +0 -204
  41. package/bundles/antigravity-plugin-extras/skills/onboard-project/SKILL.md +0 -192
  42. package/bundles/antigravity-plugin-extras/skills/pipeline-state/SKILL.md +0 -208
  43. package/bundles/antigravity-plugin-extras/skills/raffle-winner-picker/SKILL.md +0 -159
  44. package/bundles/antigravity-plugin-extras/skills/relay/SKILL.md +0 -246
  45. package/bundles/antigravity-plugin-extras/skills/requesting-code-review/SKILL.md +0 -105
  46. package/bundles/antigravity-plugin-extras/skills/requesting-code-review/code-reviewer.md +0 -146
  47. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/LICENSE.txt +0 -202
  48. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/SKILL.md +0 -646
  49. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/color_palettes.py +0 -302
  50. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/easing.py +0 -230
  51. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/frame_composer.py +0 -469
  52. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/gif_builder.py +0 -246
  53. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/typography.py +0 -357
  54. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/validators.py +0 -264
  55. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/visual_effects.py +0 -494
  56. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/requirements.txt +0 -4
  57. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/bounce.py +0 -106
  58. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/explode.py +0 -331
  59. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/fade.py +0 -329
  60. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/flip.py +0 -291
  61. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/kaleidoscope.py +0 -211
  62. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/morph.py +0 -329
  63. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/move.py +0 -293
  64. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/pulse.py +0 -268
  65. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/shake.py +0 -127
  66. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/slide.py +0 -291
  67. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/spin.py +0 -269
  68. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/wiggle.py +0 -300
  69. package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/zoom.py +0 -312
  70. package/bundles/antigravity-plugin-extras/skills/state-tracking/SKILL.md +0 -131
  71. package/bundles/antigravity-plugin-extras/skills/video-downloader/SKILL.md +0 -107
  72. package/bundles/antigravity-plugin-extras/skills/youtube-transcript/SKILL.md +0 -416
  73. package/bundles/codex/.codex/skills/workflow/golden-plan/SKILL.md +0 -586
  74. /package/bundles/{antigravity-plugin → antigravity-plugin-extras}/skills/golden-plan/SKILL.md +0 -0
@@ -1,204 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Environment Setup for NotebookLM Skill
4
- Manages virtual environment and dependencies automatically
5
- """
6
-
7
- import os
8
- import sys
9
- import subprocess
10
- import venv
11
- from pathlib import Path
12
-
13
-
14
- class SkillEnvironment:
15
- """Manages skill-specific virtual environment"""
16
-
17
- def __init__(self):
18
- # Skill directory paths
19
- self.skill_dir = Path(__file__).parent.parent
20
- self.venv_dir = self.skill_dir / ".venv"
21
- self.requirements_file = self.skill_dir / "requirements.txt"
22
-
23
- # Python executable in venv
24
- if os.name == 'nt': # Windows
25
- self.venv_python = self.venv_dir / "Scripts" / "python.exe"
26
- self.venv_pip = self.venv_dir / "Scripts" / "pip.exe"
27
- else: # Unix/Linux/Mac
28
- self.venv_python = self.venv_dir / "bin" / "python"
29
- self.venv_pip = self.venv_dir / "bin" / "pip"
30
-
31
- def ensure_venv(self) -> bool:
32
- """Ensure virtual environment exists and is set up"""
33
-
34
- # Check if we're already in the correct venv
35
- if self.is_in_skill_venv():
36
- print("✅ Already running in skill virtual environment")
37
- return True
38
-
39
- # Create venv if it doesn't exist
40
- if not self.venv_dir.exists():
41
- print(f"🔧 Creating virtual environment in {self.venv_dir.name}/")
42
- try:
43
- venv.create(self.venv_dir, with_pip=True)
44
- print("✅ Virtual environment created")
45
- except Exception as e:
46
- print(f"❌ Failed to create venv: {e}")
47
- return False
48
-
49
- # Install/update dependencies
50
- if self.requirements_file.exists():
51
- print("📦 Installing dependencies...")
52
- try:
53
- # Upgrade pip first
54
- subprocess.run(
55
- [str(self.venv_pip), "install", "--upgrade", "pip"],
56
- check=True,
57
- capture_output=True,
58
- text=True
59
- )
60
-
61
- # Install requirements
62
- result = subprocess.run(
63
- [str(self.venv_pip), "install", "-r", str(self.requirements_file)],
64
- check=True,
65
- capture_output=True,
66
- text=True
67
- )
68
- print("✅ Dependencies installed")
69
-
70
- # Install Chrome for Patchright (not Chromium!)
71
- # Using real Chrome ensures cross-platform reliability and consistent browser fingerprinting
72
- # See: https://github.com/Kaliiiiiiiiii-Vinyzu/patchright-python#anti-detection
73
- print("🌐 Installing Google Chrome for Patchright...")
74
- try:
75
- subprocess.run(
76
- [str(self.venv_python), "-m", "patchright", "install", "chrome"],
77
- check=True,
78
- capture_output=True,
79
- text=True
80
- )
81
- print("✅ Chrome installed")
82
- except subprocess.CalledProcessError as e:
83
- print(f"⚠️ Warning: Failed to install Chrome: {e}")
84
- print(" You may need to run manually: python -m patchright install chrome")
85
- print(" Chrome is required (not Chromium) for reliability!")
86
-
87
- return True
88
- except subprocess.CalledProcessError as e:
89
- print(f"❌ Failed to install dependencies: {e}")
90
- print(f" Output: {e.output if hasattr(e, 'output') else 'No output'}")
91
- return False
92
- else:
93
- print("⚠️ No requirements.txt found, skipping dependency installation")
94
- return True
95
-
96
- def is_in_skill_venv(self) -> bool:
97
- """Check if we're already running in the skill's venv"""
98
- if hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix):
99
- # We're in a venv, check if it's ours
100
- venv_path = Path(sys.prefix)
101
- return venv_path == self.venv_dir
102
- return False
103
-
104
- def get_python_executable(self) -> str:
105
- """Get the correct Python executable to use"""
106
- if self.venv_python.exists():
107
- return str(self.venv_python)
108
- return sys.executable
109
-
110
- def run_script(self, script_name: str, args: list = None) -> int:
111
- """Run a script with the virtual environment"""
112
- script_path = self.skill_dir / "scripts" / script_name
113
-
114
- if not script_path.exists():
115
- print(f"❌ Script not found: {script_path}")
116
- return 1
117
-
118
- # Ensure venv is set up
119
- if not self.ensure_venv():
120
- print("❌ Failed to set up environment")
121
- return 1
122
-
123
- # Build command
124
- cmd = [str(self.venv_python), str(script_path)]
125
- if args:
126
- cmd.extend(args)
127
-
128
- print(f"🚀 Running: {script_name} with venv Python")
129
-
130
- try:
131
- # Run the script with venv Python
132
- result = subprocess.run(cmd)
133
- return result.returncode
134
- except Exception as e:
135
- print(f"❌ Failed to run script: {e}")
136
- return 1
137
-
138
- def activate_instructions(self) -> str:
139
- """Get instructions for manual activation"""
140
- if os.name == 'nt':
141
- activate = self.venv_dir / "Scripts" / "activate.bat"
142
- return f"Run: {activate}"
143
- else:
144
- activate = self.venv_dir / "bin" / "activate"
145
- return f"Run: source {activate}"
146
-
147
-
148
- def main():
149
- """Main entry point for environment setup"""
150
- import argparse
151
-
152
- parser = argparse.ArgumentParser(
153
- description='Setup NotebookLM skill environment'
154
- )
155
-
156
- parser.add_argument(
157
- '--check',
158
- action='store_true',
159
- help='Check if environment is set up'
160
- )
161
-
162
- parser.add_argument(
163
- '--run',
164
- help='Run a script with the venv (e.g., --run ask_question.py)'
165
- )
166
-
167
- parser.add_argument(
168
- 'args',
169
- nargs='*',
170
- help='Arguments to pass to the script'
171
- )
172
-
173
- args = parser.parse_args()
174
-
175
- env = SkillEnvironment()
176
-
177
- if args.check:
178
- if env.venv_dir.exists():
179
- print(f"✅ Virtual environment exists: {env.venv_dir}")
180
- print(f" Python: {env.get_python_executable()}")
181
- print(f" To activate manually: {env.activate_instructions()}")
182
- else:
183
- print(f"❌ No virtual environment found")
184
- print(f" Run setup_environment.py to create it")
185
- return
186
-
187
- if args.run:
188
- # Run a script with venv
189
- return env.run_script(args.run, args.args)
190
-
191
- # Default: ensure environment is set up
192
- if env.ensure_venv():
193
- print("\n✅ Environment ready!")
194
- print(f" Virtual env: {env.venv_dir}")
195
- print(f" Python: {env.get_python_executable()}")
196
- print(f"\nTo activate manually: {env.activate_instructions()}")
197
- print(f"Or run scripts directly: python setup_environment.py --run script_name.py")
198
- else:
199
- print("\n❌ Environment setup failed")
200
- return 1
201
-
202
-
203
- if __name__ == "__main__":
204
- sys.exit(main() or 0)
@@ -1,192 +0,0 @@
1
- ---
2
- name: onboard-project
3
- context: fork
4
- description: Bootstrap a new project's AI configuration by generating copilot-instructions.md and populating project-config.md. Idempotent — safe to re-run on existing projects.
5
- ---
6
-
7
- # Onboard Project Skill
8
-
9
- ## Purpose
10
-
11
- Entry point for the portable AI resources pool. When copied to a new project, this skill bootstraps the project-specific configuration that agents need to function correctly.
12
-
13
- **What it produces:**
14
- 1. `copilot-instructions.md` — project-specific context for the AI assistant
15
- 2. `project-config.md` — populated with project values (profile + placeholders)
16
- 3. `agent-docs/ARTIFACTS.md` — artifact manifest (if missing)
17
-
18
- ---
19
-
20
- ## When to Use
21
-
22
- - Setting up AI resources on a **new project** for the first time
23
- - After copying the `.github/` (or `.cursor/`) portable pool to a new repo
24
- - When `project-config.md` has a blank profile and empty placeholder values
25
- - To add missing sections to an existing `copilot-instructions.md`
26
-
27
- ---
28
-
29
- ## Behavior: Idempotent & Non-Destructive
30
-
31
- > **CRITICAL**: This skill NEVER overwrites or degrades existing content.
32
-
33
- | Scenario | Behavior |
34
- |----------|----------|
35
- | `copilot-instructions.md` does not exist | Create from template, populate from user Q&A |
36
- | `copilot-instructions.md` exists | Read it, compare sections vs. template, append ONLY missing sections with `<!-- Added by onboard-project -->` marker |
37
- | `project-config.md` has blank profile | Ask user for values, populate |
38
- | `project-config.md` has profile set | Skip — already configured |
39
- | `agent-docs/ARTIFACTS.md` missing | Create from template |
40
- | `agent-docs/ARTIFACTS.md` exists | Skip — already configured |
41
-
42
- **Conflict resolution**: If existing content contradicts template defaults, **keep the user's version**. It's more battle-tested.
43
-
44
- ---
45
-
46
- ## Steps
47
-
48
- ### Step 1: Check Current State
49
-
50
- Read the following files (if they exist):
51
- 1. `project-config.md` — check if profile is set, if placeholders are filled
52
- 2. `copilot-instructions.md` — check which sections already exist
53
- 3. `agent-docs/ARTIFACTS.md` — check if manifest exists
54
-
55
- Report what exists and what's missing before proceeding.
56
-
57
- ### Step 2: Gather Project Information
58
-
59
- Ask the user for information needed to populate the configuration. Skip questions where answers can be inferred from existing files.
60
-
61
- **Required information:**
62
-
63
- | Category | Questions |
64
- |----------|-----------|
65
- | **Identity** | Project name? Organization name? One-line description? |
66
- | **Tech Stack** | Language(s)? Frontend framework? Backend framework? Database type? |
67
- | **Branding** | Primary brand color (hex)? Dark color? Light color? Additional brand colors? |
68
- | **Infrastructure** | Deployment environment (cloud/on-premise/hybrid)? Air-gapped? Authentication method? |
69
- | **Logging** | Logging library? (loguru, logging, structlog, etc.) |
70
- | **Shared Libraries** | Any shared/internal libraries? Paths? |
71
- | **Project Structure** | Entry point file? Source root? Key directories? |
72
- | **Data Sources** | Database name(s)? Connection method? Key tables? |
73
- | **Key Conventions** | Query externalization? Path resolution patterns? CSS scoping method? Component reuse patterns? |
74
- | **Commands** | How to run the app? Run tests? Lint? Build? |
75
- | **Recipe** | Delivery workflow pattern? (`enterprise-dashboard` for data-to-UI dashboards, or blank for generic projects) |
76
-
77
- ### Step 3: Populate project-config.md
78
-
79
- 1. Set the `profile` field (use org name slug, e.g., `acme`, `myorg`, or leave blank if no profile needed)
80
- 2. If using a profile, create a Profile Definition section with:
81
- - Core Placeholders table (`<ORG_NAME>`, `<BRAND_PRIMARY>`, `<BRAND_DARK>`, `<BRAND_LIGHT>`, `<DB_TYPE>`, `<DEPLOY_ENV>`, `<LOGGING_LIB>`, `<SHARED_LIBS>`)
82
- - Brand Color Palette table (if provided)
83
- - Tech Stack table
84
- - Data Sources table
85
- - Project Structure block
86
- - Key Conventions list
87
- 3. If not using a profile, fill in the "Step 2: Project Values" table directly
88
- 4. If user specified a recipe:
89
- - Verify `.github/recipes/{recipe}.recipe.md` exists in the pool
90
- - Set the `recipe` field in the Step 1 table: `| **recipe** | {recipe} |`
91
- - If recipe file is missing, warn but continue — recipe is optional
92
-
93
- ### Step 4: Create or Update copilot-instructions.md
94
-
95
- **Template sections** (check each — add only what's missing):
96
-
97
- ```markdown
98
- # {Project Name} — AI Assistant Context
99
-
100
- ## Project Overview
101
- {One paragraph: what the project does, who it's for, key goals}
102
-
103
- ## Architecture
104
- {High-level architecture: components, data flow, key patterns}
105
-
106
- ## Tech Stack
107
- {Table: Layer → Technology}
108
-
109
- ## Data Sources
110
- {Table: Source → Table/Collection → Description}
111
-
112
- ## Key Patterns & Conventions
113
- {Bullet list of project-specific patterns the AI must follow}
114
-
115
- ## Database Access
116
- {Connection method, query patterns, ORM/raw SQL, caching}
117
-
118
- ## Project Structure
119
- {Directory tree of key folders}
120
-
121
- ## Deployment
122
- {How the app is deployed, environment specifics}
123
-
124
- ## Key Commands
125
- {Run, test, lint, build commands}
126
- ```
127
-
128
- **Merge logic for existing files:**
129
- 1. Parse existing `copilot-instructions.md` into sections (by `##` headings)
130
- 2. If the file contains `<!-- junai:start -->` … `<!-- junai:end -->` sentinel markers, leave that block untouched — it is managed by the junai extension
131
- 3. For each template section, check if an equivalent heading exists outside the managed block (fuzzy match — "Tech Stack" matches "Technology Stack", "Stack", etc.)
132
- 4. If section exists → **skip it** (preserve user's content entirely)
133
- 5. If section is missing → **append it** before the managed section (or at the end if no managed section) with marker:
134
- ```markdown
135
- <!-- Added by onboard-project — review and customize -->
136
- ## {Section Title}
137
- {Template content populated with project values}
138
- ```
139
- 5. Never reorder, rewrite, or delete existing sections
140
-
141
- ### Step 5: Create agent-docs/ARTIFACTS.md (if missing)
142
-
143
- If `agent-docs/ARTIFACTS.md` does not exist, create it using the standard template:
144
-
145
- ```markdown
146
- # Agent Artifacts
147
-
148
- > **For agents**: Only read artifacts with status `current`. Ignore `superseded` and `archived`.
149
- > **For humans**: This is a working directory for inter-agent communication. Do not include in project documentation.
150
-
151
- ## How to Read This Manifest
152
-
153
- - **chain_id**: Links all artifacts in a feature chain (format: `FEAT-YYYY-MMDD-{slug}`)
154
- - **status**: `current` (active) | `superseded` (replaced) | `archived` (historical) | `completed` (done)
155
- - **approval**: `pending` (awaiting review) | `approved` (proceed) | `revision-requested` (needs changes)
156
-
157
- ## Artifacts
158
-
159
- | Date | Agent | Type | Description | Path | Status | Approval | Chain ID |
160
- |------|-------|------|-------------|------|--------|----------|----------|
161
- | | | | | | | | |
162
- ```
163
-
164
- Also create the subfolder structure if missing:
165
- - `agent-docs/intents/`
166
- - `agent-docs/escalations/`
167
- - `agent-docs/prd/`
168
- - `agent-docs/architecture/`
169
- - `agent-docs/ux/mockups/`
170
- - `agent-docs/ux/reviews/`
171
- - `agent-docs/security/`
172
- - `agent-docs/reviews/`
173
- - `agent-docs/debug/`
174
- - `agent-docs/testing/`
175
- - `agent-docs/.archive/`
176
-
177
- ### Step 6: Summary
178
-
179
- Report what was done:
180
- - Files created vs. updated
181
- - Sections added to existing `copilot-instructions.md` (if any)
182
- - Profile set in `project-config.md`
183
- - Next steps (e.g., "Review the added sections and customize them")
184
-
185
- ---
186
-
187
- ## Important Notes
188
-
189
- - All paths in this skill are relative. The skill works regardless of whether the AI resources folder is at `.github/`, `.cursor/`, or any other location.
190
- - The `copilot-instructions.md` file is project-specific and should NOT be committed to the portable pool. It stays in the project repo. The junai extension manages only a sentinel-delimited `<!-- junai:start -->` … `<!-- junai:end -->` section — never edit content inside those markers (it will be refreshed on the next Update). Add your project content outside the markers.
191
- - `project-config.md` IS part of the portable pool as a template. When the profile section is filled in, it becomes project-specific.
192
- - The `recipe` field in `project-config.md` is optional. Projects without a recipe work exactly as before — agents use their built-in expertise and plan-embedded skills. Recipes add automatic cross-project baseline loading for repeatable delivery patterns.
@@ -1,208 +0,0 @@
1
- ---
2
- name: pipeline-state
3
- description: Read and write `.github/pipeline-state.json` to track stage progress, artefacts, supervision gates, and handoff payloads in the agent pipeline.
4
- ---
5
-
6
- # Pipeline State Skill
7
-
8
- **Skill ID:** `workflow/pipeline-state`
9
- **Used by:** Orchestrator, Plan, Implement, Tester, Code Reviewer
10
- **Purpose:** Read and write `.github/pipeline-state.json` to track pipeline position, stage status, and supervision gates.
11
-
12
- ---
13
-
14
- ## When to Use This Skill
15
-
16
- Load this skill when:
17
- - Starting the Orchestrator agent on a new or resuming pipeline
18
- - An agent completes its stage and needs to mark it done
19
- - Checking if upstream gates are approved before proceeding
20
- - Setting `blocked_by` when a validation failure is detected
21
-
22
- ---
23
-
24
- ## Pipeline State File Location
25
-
26
- ```
27
- .github/pipeline-state.json
28
- ```
29
-
30
- This file is **project-specific** — it lives in the project repo, NOT in junai. Use `.github/pipeline-state.template.json` from junai as the blank starting template.
31
-
32
- ---
33
-
34
- ## Schema Reference
35
-
36
- ```json
37
- {
38
- "project": "<project-name>",
39
- "feature": "<feature-slug>",
40
- "pipeline_version": "1.0",
41
- "current_stage": "<stage-name>",
42
- "stages": {
43
- "intent": { "status": "not_started | in_progress | complete | blocked", "artefact": "<path-or-null>", "completed_at": "<ISO-timestamp-or-null>" },
44
- "prd": { "status": "...", "artefact": "...", "completed_at": "..." },
45
- "architect": { "status": "...", "artefact": "...", "completed_at": "..." },
46
- "plan": { "status": "...", "artefact": "...", "completed_at": "..." },
47
- "implement": { "status": "...", "artefact": "...", "completed_at": "..." },
48
- "tester": { "status": "...", "artefact": "...", "completed_at": "..." },
49
- "review": { "status": "...", "artefact": "...", "completed_at": "..." }
50
- },
51
- "supervision_gates": {
52
- "intent_approved": false,
53
- "adr_approved": false,
54
- "plan_approved": false,
55
- "review_approved": false
56
- },
57
- "blocked_by": null,
58
- "last_updated": "<ISO-timestamp>"
59
- }
60
- ```
61
-
62
- ### Stage Status Values
63
- | Value | Meaning |
64
- |-------|---------|
65
- | `not_started` | Stage not yet begun |
66
- | `in_progress` | Agent is actively working on this stage |
67
- | `complete` | Artefact produced and `approval: approved` confirmed |
68
- | `blocked` | Cannot proceed — see `blocked_by` field |
69
-
70
- ---
71
-
72
- ## Read Operations
73
-
74
- ### Check current stage
75
- ```
76
- Read: .github/pipeline-state.json → .current_stage
77
- ```
78
-
79
- ### Check if a gate is approved
80
- ```
81
- Read: .github/pipeline-state.json → .supervision_gates.<gate_name>
82
- Returns: true | false
83
- ```
84
-
85
- ### Check upstream artefact approval
86
- ```
87
- Read: <artefact_path from previous stage> → YAML header → approval field
88
- Expected value: "approved"
89
- ```
90
-
91
- ### Check for blocking escalations
92
- ```
93
- List files in: agent-docs/escalations/
94
- If any file contains severity: "blocking" → surface to user, do NOT proceed
95
- ```
96
-
97
- ---
98
-
99
- ## Write Operations
100
-
101
- ### Mark stage as in_progress
102
- ```json
103
- {
104
- "current_stage": "<new-stage>",
105
- "stages": {
106
- "<new-stage>": { "status": "in_progress" }
107
- },
108
- "last_updated": "<current-ISO-timestamp>"
109
- }
110
- ```
111
-
112
- ### Mark stage as complete
113
- ```json
114
- {
115
- "stages": {
116
- "<completed-stage>": {
117
- "status": "complete",
118
- "artefact": "<path-to-artefact>",
119
- "completed_at": "<current-ISO-timestamp>"
120
- }
121
- },
122
- "last_updated": "<current-ISO-timestamp>"
123
- }
124
- ```
125
-
126
- ### Set blocked state
127
- ```json
128
- {
129
- "stages": {
130
- "<stage>": { "status": "blocked" }
131
- },
132
- "blocked_by": "<reason: e.g., 'artefact missing approval field'>",
133
- "last_updated": "<current-ISO-timestamp>"
134
- }
135
- ```
136
-
137
- ### Approve a supervision gate
138
- ```json
139
- {
140
- "supervision_gates": {
141
- "<gate_name>": true
142
- },
143
- "last_updated": "<current-ISO-timestamp>"
144
- }
145
- ```
146
-
147
- ### Clear a blocked state
148
- ```json
149
- {
150
- "blocked_by": null,
151
- "stages": {
152
- "<stage>": { "status": "in_progress" }
153
- },
154
- "last_updated": "<current-ISO-timestamp>"
155
- }
156
- ```
157
-
158
- ### Write handoff payload before routing (GAP-H6 + GAP-I1)
159
-
160
- Before routing to `plan`, `implement`, `tester`, or `code-reviewer`, the Orchestrator writes to `_notes.handoff_payload`:
161
-
162
- ```json
163
- {
164
- "_notes": {
165
- "handoff_payload": {
166
- "target_agent": "<implement|tester|code-reviewer|plan>",
167
- "scope": "<one-line description of what the agent must do>",
168
- "summary": "<brief context from upstream stage>",
169
- "required_tests": ["<test 1>", "<test 2>"],
170
- "exit_criteria": "<what done looks like>",
171
- "upstream_artefact": "<path to artefact produced by the current/previous stage>",
172
- "coverage_requirements": [
173
- "<component or requirement the receiving agent MUST cover>",
174
- "<e.g.: component: Search API integration>",
175
- "<e.g.: NFR: WCAG 2.1 AA compliance>"
176
- ]
177
- }
178
- }
179
- }
180
- ```
181
-
182
- > **`coverage_requirements[]` rule (GAP-I1):** Must be non-empty whenever an upstream artefact exists (architecture doc → plan, plan → implement, implement → tester, etc.). The receiving agent maps every item to its output and flags `COVERAGE_GAP: <item>` for any item not covered before starting work.
183
- >
184
- > **`pipeline_mode` field:** Set `"pipeline_mode": "supervised"` (default) or `"auto"` in the root of `pipeline-state.json`. Orchestrator §1 reads this to determine whether to HARD STOP after presenting the handoff button (`supervised`) or call `notify_orchestrator()` MCP tool and continue (`auto`). Always default to `supervised` on new pipelines — `auto` is an explicit opt-in.
185
-
186
- ---
187
-
188
- ## Initialisation
189
-
190
- When `.github/pipeline-state.json` does not exist:
191
- 1. Copy from `.github/pipeline-state.template.json` (available in the junai pool)
192
- 2. Replace `<project-name>` with the value from `project-config.md → profile → project_name`
193
- 3. Replace `<feature-slug>` with the kebab-case feature name from the Intent Document or user input
194
- 4. Set `current_stage` to `"intent"` or the appropriate starting stage
195
- 5. Set `last_updated` to current ISO timestamp
196
-
197
- ---
198
-
199
- ## Validation Rules
200
-
201
- Before routing to any agent, the Orchestrator MUST verify:
202
-
203
- 1. **Artefact exists** — the file at `stages[previous_stage].artefact` exists on disk
204
- 2. **Artefact approved** — the YAML header of that artefact contains `approval: approved`
205
- 3. **No blocking escalations** — `agent-docs/escalations/` has no files with `severity: blocking`
206
- 4. **Gate check** — if the transition requires a supervision gate, that gate is `true` in `supervision_gates`
207
-
208
- If ANY check fails → set `blocked_by`, report to user, do NOT proceed.