@caddis/cli 0.4.10 → 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.
- package/bundles/antigravity-plugin/plugin.json +1 -1
- package/bundles/antigravity-plugin/skills/_registry.md +0 -1
- package/bundles/antigravity-plugin/skills/brainstorming/SKILL.md +2 -2
- package/bundles/antigravity-plugin/skills/explainer-doc/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/ship-pr/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/plugin.json +1 -1
- package/bundles/antigravity-plugin-extras/skills/_registry.md +1 -19
- package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +1 -1
- package/bundles/codex/.codex/skills/workflow/brainstorming/SKILL.md +2 -2
- package/bundles/manifest.json +3 -3
- package/package.json +1 -1
- package/bundles/antigravity-plugin-extras/skills/competitive-ads-extractor/SKILL.md +0 -294
- package/bundles/antigravity-plugin-extras/skills/content-research-writer/SKILL.md +0 -539
- package/bundles/antigravity-plugin-extras/skills/domain-name-brainstormer/SKILL.md +0 -213
- package/bundles/antigravity-plugin-extras/skills/humanizer/SKILL.md +0 -194
- package/bundles/antigravity-plugin-extras/skills/image-enhancer/SKILL.md +0 -100
- package/bundles/antigravity-plugin-extras/skills/invoice-organizer/SKILL.md +0 -447
- package/bundles/antigravity-plugin-extras/skills/job-application/SKILL.md +0 -188
- package/bundles/antigravity-plugin-extras/skills/lead-research-assistant/SKILL.md +0 -200
- package/bundles/antigravity-plugin-extras/skills/meeting-insights-analyzer/SKILL.md +0 -328
- package/bundles/antigravity-plugin-extras/skills/notebooklm/AUTHENTICATION.md +0 -154
- package/bundles/antigravity-plugin-extras/skills/notebooklm/SKILL.md +0 -270
- package/bundles/antigravity-plugin-extras/skills/notebooklm/references/api_reference.md +0 -309
- package/bundles/antigravity-plugin-extras/skills/notebooklm/references/troubleshooting.md +0 -376
- package/bundles/antigravity-plugin-extras/skills/notebooklm/references/usage_patterns.md +0 -338
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/__init__.py +0 -81
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/ask_question.py +0 -256
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/auth_manager.py +0 -358
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/browser_session.py +0 -255
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/browser_utils.py +0 -107
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/cleanup_manager.py +0 -302
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/config.py +0 -44
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/notebook_manager.py +0 -410
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/run.py +0 -102
- package/bundles/antigravity-plugin-extras/skills/notebooklm/scripts/setup_environment.py +0 -204
- package/bundles/antigravity-plugin-extras/skills/onboard-project/SKILL.md +0 -192
- package/bundles/antigravity-plugin-extras/skills/pipeline-state/SKILL.md +0 -208
- package/bundles/antigravity-plugin-extras/skills/raffle-winner-picker/SKILL.md +0 -159
- package/bundles/antigravity-plugin-extras/skills/relay/SKILL.md +0 -246
- package/bundles/antigravity-plugin-extras/skills/requesting-code-review/SKILL.md +0 -105
- package/bundles/antigravity-plugin-extras/skills/requesting-code-review/code-reviewer.md +0 -146
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/LICENSE.txt +0 -202
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/SKILL.md +0 -646
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/color_palettes.py +0 -302
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/easing.py +0 -230
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/frame_composer.py +0 -469
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/gif_builder.py +0 -246
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/typography.py +0 -357
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/validators.py +0 -264
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/core/visual_effects.py +0 -494
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/requirements.txt +0 -4
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/bounce.py +0 -106
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/explode.py +0 -331
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/fade.py +0 -329
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/flip.py +0 -291
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/kaleidoscope.py +0 -211
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/morph.py +0 -329
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/move.py +0 -293
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/pulse.py +0 -268
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/shake.py +0 -127
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/slide.py +0 -291
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/spin.py +0 -269
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/wiggle.py +0 -300
- package/bundles/antigravity-plugin-extras/skills/slack-gif-creator/templates/zoom.py +0 -312
- package/bundles/antigravity-plugin-extras/skills/state-tracking/SKILL.md +0 -131
- package/bundles/antigravity-plugin-extras/skills/video-downloader/SKILL.md +0 -107
- package/bundles/antigravity-plugin-extras/skills/youtube-transcript/SKILL.md +0 -416
- package/bundles/codex/.codex/skills/workflow/golden-plan/SKILL.md +0 -586
- /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.
|