aiwg 2026.2.7 → 2026.2.8

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/CLAUDE.md CHANGED
@@ -23,7 +23,9 @@ aiwg use sdlc
23
23
  agentic/code/
24
24
  ├── frameworks/
25
25
  │ ├── sdlc-complete/ # Complete SDLC coverage
26
- └── media-marketing-kit/ # Full marketing operations
26
+ ├── media-marketing-kit/ # Full marketing operations
27
+ │ ├── media-curator/ # Media archive management
28
+ │ └── research-complete/ # Research workflow automation
27
29
  ├── addons/
28
30
  │ └── voice-framework/ # Voice profiles
29
31
  └── agents/ # Writing quality agents
@@ -260,6 +262,8 @@ aiwg reproducibility-validate # Validate workflow reproducibility
260
262
  | **Creating Extensions** | `@docs/extensions/creating-extensions.md` |
261
263
  | **Extension Types** | `@docs/extensions/extension-types.md` |
262
264
  | **SDLC Framework** | `@agentic/code/frameworks/sdlc-complete/README.md` |
265
+ | **Media Curator** | `@agentic/code/frameworks/media-curator/README.md` |
266
+ | **Research Complete** | `@agentic/code/frameworks/research-complete/README.md` |
263
267
  | **RLM Addon** | `@agentic/code/addons/rlm/README.md` |
264
268
  | **Daemon Mode** | `@docs/daemon-guide.md` |
265
269
  | **Messaging Integration** | `@docs/messaging-guide.md` |
package/README.md CHANGED
@@ -95,6 +95,7 @@ npm install -g aiwg
95
95
  cd your-project
96
96
  aiwg use sdlc # Full SDLC framework
97
97
  aiwg use marketing # Marketing framework
98
+ aiwg use media-curator # Media archive management
98
99
  aiwg use rlm # RLM addon (recursive context decomposition)
99
100
  aiwg use all # All frameworks
100
101
 
@@ -119,8 +120,10 @@ aiwg new my-project
119
120
 
120
121
  | Framework | What it does |
121
122
  |-----------|--------------|
122
- | **[SDLC Complete](agentic/code/frameworks/sdlc-complete/)** | Full software development lifecycle with agents, commands, templates, and multi-agent orchestration |
123
+ | **[SDLC Complete](agentic/code/frameworks/sdlc-complete/)** | Full software development lifecycle with 70+ agents, commands, templates, and multi-agent orchestration |
123
124
  | **[Media/Marketing Kit](agentic/code/frameworks/media-marketing-kit/)** | Complete marketing campaign management from strategy to analytics |
125
+ | **[Media Curator](agentic/code/frameworks/media-curator/)** | Intelligent media archive management — discography analysis, acquisition, quality filtering, metadata curation, and multi-platform export |
126
+ | **[Research Complete](agentic/code/frameworks/research-complete/)** | Academic research workflow — discovery, acquisition, RAG-based documentation, and citation management |
124
127
 
125
128
  ### Addons
126
129
 
@@ -228,6 +231,8 @@ See [Platform Integration Guides](docs/integrations/) for setup instructions.
228
231
 
229
232
  - **[SDLC Framework](agentic/code/frameworks/sdlc-complete/README.md)** — Agents, commands, templates, flows
230
233
  - **[Marketing Kit](agentic/code/frameworks/media-marketing-kit/README.md)** — Campaign lifecycle guide
234
+ - **[Media Curator](agentic/code/frameworks/media-curator/README.md)** — Media archive management
235
+ - **[Research Complete](agentic/code/frameworks/research-complete/README.md)** — Research workflows
231
236
  - **[Voice Framework](agentic/code/addons/voice-framework/)** — Voice profiles and skills
232
237
 
233
238
  ### Extension System
@@ -239,7 +244,7 @@ AIWG's unified extension system enables dynamic discovery, semantic search, and
239
244
  - **[Extension Types Reference](docs/extensions/extension-types.md)** — Complete type definitions
240
245
 
241
246
  **Extension types:**
242
- - **Agents** (35+): Specialized AI personas (API Designer, Test Engineer, Security Auditor)
247
+ - **Agents** (70+): Specialized AI personas (API Designer, Test Engineer, Security Auditor)
243
248
  - **Commands** (31): CLI and slash commands (`aiwg use sdlc`, `/mention-wire`)
244
249
  - **Skills**: Natural language workflows (project awareness, voice application)
245
250
  - **Hooks**: Lifecycle event handlers (pre-session, post-write)
package/USAGE_GUIDE.md CHANGED
@@ -11,7 +11,7 @@ Native Claude Code integration via the plugin marketplace:
11
11
  /plugin marketplace add jmagly/ai-writing-guide
12
12
 
13
13
  # Install plugins
14
- /plugin install sdlc@aiwg # 58 SDLC agents
14
+ /plugin install sdlc@aiwg # 70+ SDLC agents
15
15
  /plugin install marketing@aiwg # 37 marketing agents
16
16
  /plugin install utils@aiwg # Core utilities
17
17
  /plugin install voice@aiwg # Voice profiles
@@ -359,11 +359,11 @@ For complex writing tasks, leverage specialized agents:
359
359
  **Quick Start**:
360
360
 
361
361
  ```bash
362
- # Deploy general-purpose writing agents to your project
363
- aiwg -deploy-agents --mode general
362
+ # Deploy SDLC framework to your project
363
+ aiwg use sdlc
364
364
 
365
- # Or deploy all agents (general + SDLC)
366
- aiwg -deploy-agents --mode both
365
+ # Or deploy all frameworks
366
+ aiwg use all
367
367
  ```
368
368
 
369
369
  **Agent Invocation**:
@@ -389,7 +389,7 @@ aiwg -deploy-agents --mode both
389
389
 
390
390
  #### SDLC Framework Agents (`/agentic/code/frameworks/sdlc-complete/agents/`)
391
391
 
392
- 51 specialized agents covering all development lifecycle phases:
392
+ 70+ specialized agents covering all development lifecycle phases:
393
393
 
394
394
  - **Development**: code-reviewer, test-engineer, architecture-designer, debugger, performance-engineer
395
395
  - **Requirements**: requirements-analyst, requirements-reviewer, business-process-analyst
@@ -4,13 +4,13 @@
4
4
 
5
5
  The SDLC Complete framework provides a comprehensive Plan → Act lifecycle for software delivery using AI agents. This specialized framework includes agents, commands, templates, and flows for managing the entire software development lifecycle.
6
6
 
7
- **Supported Platforms:** Claude Code, Warp Terminal, Factory AI, OpenAI/Codex (experimental)
7
+ **Supported Platforms:** Claude Code, Warp Terminal, Factory AI, GitHub Copilot, Cursor, OpenCode, OpenAI/Codex, Windsurf
8
8
 
9
9
  ## Framework Structure
10
10
 
11
11
  ### Content
12
12
 
13
- - `agents/` — 50+ specialized SDLC role agents (architecture-designer, requirements-analyst, security-gatekeeper, etc.)
13
+ - `agents/` — 70+ specialized SDLC role agents (architecture-designer, requirements-analyst, security-gatekeeper, etc.)
14
14
  - `commands/` — SDLC-specific slash commands (intake-start, orchestrate-project, security-gate, etc.)
15
15
  - `templates/` — Markdown templates for all SDLC artifacts
16
16
  - `flows/` — Phase-based workflows (Inception → Elaboration → Construction → Transition)
@@ -55,15 +55,20 @@ Use the AIWG CLI to deploy this framework:
55
55
 
56
56
  ```bash
57
57
  # Install CLI
58
- curl -fsSL https://raw.githubusercontent.com/jmagly/ai-writing-guide/refs/heads/main/tools/install/install.sh | bash
59
-
60
- # Deploy agents to project (choose your platform)
61
- aiwg -deploy-agents --mode sdlc # Claude Code
62
- aiwg -deploy-agents --platform warp --mode sdlc # Warp Terminal
63
- aiwg -deploy-agents --provider factory --mode sdlc --deploy-commands # Factory AI
58
+ npm install -g aiwg
59
+
60
+ # Deploy to project (choose your platform)
61
+ aiwg use sdlc # Claude Code (default)
62
+ aiwg use sdlc --provider warp # Warp Terminal
63
+ aiwg use sdlc --provider factory # Factory AI
64
+ aiwg use sdlc --provider copilot # GitHub Copilot
65
+ aiwg use sdlc --provider cursor # Cursor
66
+ aiwg use sdlc --provider codex # OpenAI/Codex
67
+ aiwg use sdlc --provider opencode # OpenCode
68
+ aiwg use sdlc --provider windsurf # Windsurf
64
69
 
65
70
  # Scaffold new project with SDLC templates
66
- aiwg -new
71
+ aiwg new my-project
67
72
  ```
68
73
 
69
74
  ## Usage
@@ -21,7 +21,7 @@ If you create a schema file but no agent references it, it does nothing. If you
21
21
 
22
22
  | Tier | Scale | Standalone | Source Location | Example |
23
23
  |------|-------|------------|-----------------|---------|
24
- | **Framework** | Large (50+ agents) | Yes | `agentic/code/frameworks/` | sdlc-complete, media-marketing-kit |
24
+ | **Framework** | Large (50+ agents) | Yes | `agentic/code/frameworks/` | sdlc-complete, media-marketing-kit, media-curator, research-complete |
25
25
  | **Extension** | Medium (5-20 agents) | No (requires parent framework) | `frameworks/{id}/extensions/` | gdpr, hipaa, sox |
26
26
  | **Addon** | Small (1-10 agents) | Yes | `agentic/code/addons/` | aiwg-utils, voice-framework |
27
27
 
@@ -21,7 +21,7 @@ Extensions are the building blocks of AIWG frameworks and addons. They include:
21
21
  | **hook** | Lifecycle event handlers | Pre-session setup, post-write validation |
22
22
  | **tool** | External utilities | git, jq, npm |
23
23
  | **mcp-server** | MCP protocol servers | AIWG MCP server |
24
- | **framework** | Complete workflows | SDLC Complete, Marketing Kit |
24
+ | **framework** | Complete workflows | SDLC Complete, Marketing Kit, Media Curator, Research Complete |
25
25
  | **addon** | Feature bundles | Voice Framework, Testing Quality |
26
26
  | **template** | Document templates | Use case template, ADR template |
27
27
  | **prompt** | Reusable prompts | Code review, security audit |
@@ -0,0 +1,82 @@
1
+ # AIWG v2026.2.8 — "Full Catalog" Release
2
+
3
+ **Released**: 2026-02-14
4
+
5
+ This release makes all four AIWG frameworks individually deployable via the CLI and completes a comprehensive documentation audit to ensure everything reflects the current project state.
6
+
7
+ ## Highlights
8
+
9
+ | What changed | Why you care |
10
+ |--------------|--------------|
11
+ | `aiwg use media-curator` | Deploy the Media Curator framework standalone — no need for `aiwg use all` |
12
+ | `aiwg use research` | Deploy the Research Complete framework standalone |
13
+ | Complete provider help | All 8 providers visible in `aiwg help` output |
14
+ | Documentation audit | Stale counts, deprecated syntax, and missing references cleaned up |
15
+
16
+ ## New Framework Deployment Targets
17
+
18
+ Previously, the Media Curator and Research Complete frameworks could only be deployed via `aiwg use all`. Now they're first-class CLI targets:
19
+
20
+ ```bash
21
+ # Deploy individually
22
+ aiwg use media-curator # 6 agents, 9 commands, 9 skills
23
+ aiwg use research # 8 agents, 10 commands
24
+
25
+ # Deploy to any provider
26
+ aiwg use media-curator --provider cursor
27
+ aiwg use research --provider copilot
28
+
29
+ # Still works — deploys everything
30
+ aiwg use all
31
+ ```
32
+
33
+ ### All Four Frameworks
34
+
35
+ | Framework | Command | Agents | Commands | Skills |
36
+ |-----------|---------|--------|----------|--------|
37
+ | SDLC Complete | `aiwg use sdlc` | 70+ | 50+ | 10+ |
38
+ | Media Marketing Kit | `aiwg use marketing` | 37 | 20+ | 8 |
39
+ | Media Curator | `aiwg use media-curator` | 6 | 9 | 9 |
40
+ | Research Complete | `aiwg use research` | 8 | 10 | — |
41
+
42
+ ## Complete Provider Support
43
+
44
+ The help text now shows all 8 supported providers:
45
+
46
+ ```
47
+ Platform Options (--provider):
48
+ claude Claude Code (default)
49
+ copilot GitHub Copilot
50
+ factory Factory AI
51
+ codex / openai OpenAI Codex
52
+ cursor Cursor IDE
53
+ opencode OpenCode
54
+ warp Warp Terminal
55
+ windsurf Windsurf
56
+ ```
57
+
58
+ All 8 providers received deployment blocks for the new frameworks — 32 provider-framework combinations now supported.
59
+
60
+ ## Documentation Audit
61
+
62
+ A comprehensive audit of ~384 documentation files identified and fixed:
63
+
64
+ - **Agent counts**: "50+" and "58" → "70+" across README, USAGE_GUIDE, sdlc-complete/README
65
+ - **Deprecated CLI syntax**: `aiwg -deploy-agents --mode sdlc` → `aiwg use sdlc`
66
+ - **Missing frameworks**: media-curator and research-complete added to CLAUDE.md, README, development guide, extension overview
67
+ - **Platform count**: 4 → 8 in sdlc-complete/README
68
+ - **CalVer violation**: Renamed `v2026.01.3-announcement.md` to `v2026.1.3-announcement.md`
69
+ - **Planning archive**: 20 completed planning documents moved to `.aiwg/planning/archive/`
70
+
71
+ ## Install / Update
72
+
73
+ ```bash
74
+ npm install -g aiwg@2026.2.8
75
+
76
+ # Or update existing installation
77
+ aiwg update
78
+ ```
79
+
80
+ ## Full Changelog
81
+
82
+ See [CHANGELOG.md](../../CHANGELOG.md) for complete details.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiwg",
3
- "version": "2026.2.7",
3
+ "version": "2026.2.8",
4
4
  "description": "Cognitive architecture for AI-augmented software development with structured memory, ensemble validation, and closed-loop correction. FAIR-aligned artifacts, 84% cost reduction via human-in-the-loop, standards adopted by 100+ organizations.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -36,8 +36,9 @@ AIWG CLI
36
36
  Usage: aiwg <command> [options]
37
37
 
38
38
  Framework Management:
39
- use <framework> Install and deploy framework (sdlc, marketing, writing, all)
40
- Options: --no-utils, --provider <claude|copilot|factory|openai|windsurf>, --force
39
+ use <framework> Install and deploy framework
40
+ Frameworks: sdlc, marketing, media-curator, research, writing, all
41
+ Options: --no-utils, --provider <provider>, --force
41
42
  list List installed frameworks and addons
42
43
  remove <id> Remove a framework or addon
43
44
 
@@ -97,11 +98,15 @@ Maintenance:
97
98
  -update Check for and apply updates
98
99
  -help Show this help message
99
100
 
100
- Platform Options:
101
- --provider copilot Deploy for GitHub Copilot
102
- --provider factory Deploy for Factory AI
103
- --provider openai Deploy for OpenAI/Codex
104
- --provider windsurf Deploy for Windsurf (EXPERIMENTAL)
101
+ Platform Options (--provider):
102
+ claude Claude Code (default)
103
+ copilot GitHub Copilot
104
+ factory Factory AI
105
+ codex / openai OpenAI Codex
106
+ cursor Cursor IDE
107
+ opencode OpenCode
108
+ warp Warp Terminal
109
+ windsurf Windsurf
105
110
 
106
111
  Model Selection (for 'use' command):
107
112
  --reasoning-model <name> Override model for reasoning tier (opus-level agents)
@@ -122,6 +127,8 @@ Ralph Loop (Iterative Execution):
122
127
 
123
128
  Examples:
124
129
  aiwg use sdlc Install SDLC framework
130
+ aiwg use media-curator Install Media Curator framework
131
+ aiwg use research Install Research framework
125
132
  aiwg use all --provider factory Install all frameworks for Factory AI
126
133
  aiwg use sdlc --reasoning-model opus-4-2 Deploy with custom reasoning model
127
134
  aiwg use sdlc --coding-model sonnet-5 --save Deploy with custom model and save
@@ -20,7 +20,7 @@ import { registerDeployedExtensions } from '../../extensions/deployment-registra
20
20
  /**
21
21
  * Valid framework identifiers
22
22
  */
23
- const VALID_FRAMEWORKS = ['sdlc', 'marketing', 'writing', 'general', 'all'] as const;
23
+ const VALID_FRAMEWORKS = ['sdlc', 'marketing', 'media-curator', 'research', 'writing', 'general', 'all'] as const;
24
24
  type Framework = typeof VALID_FRAMEWORKS[number];
25
25
 
26
26
  /**
@@ -29,6 +29,8 @@ type Framework = typeof VALID_FRAMEWORKS[number];
29
29
  const MODE_MAP: Record<Framework, string> = {
30
30
  sdlc: 'sdlc',
31
31
  marketing: 'marketing',
32
+ 'media-curator': 'media-curator',
33
+ research: 'research',
32
34
  writing: 'general',
33
35
  general: 'general',
34
36
  all: 'all',
@@ -122,7 +124,7 @@ export class UseHandler implements CommandHandler {
122
124
  if (!framework) {
123
125
  return {
124
126
  exitCode: 1,
125
- message: 'Error: Framework or addon name required\nFrameworks: sdlc, marketing, writing, all\nAddons: rlm',
127
+ message: 'Error: Framework or addon name required\nFrameworks: sdlc, marketing, media-curator, research, writing, all\nAddons: rlm',
126
128
  };
127
129
  }
128
130
 
@@ -85,11 +85,15 @@ export function generateHelp(registry: ExtensionRegistry): string {
85
85
  }
86
86
 
87
87
  // Platform options
88
- lines.push('Platform Options:');
89
- lines.push(' --provider copilot Deploy for GitHub Copilot');
90
- lines.push(' --provider factory Deploy for Factory AI');
91
- lines.push(' --provider openai Deploy for OpenAI/Codex');
92
- lines.push(' --provider windsurf Deploy for Windsurf (EXPERIMENTAL)');
88
+ lines.push('Platform Options (--provider):');
89
+ lines.push(' claude Claude Code (default)');
90
+ lines.push(' copilot GitHub Copilot');
91
+ lines.push(' factory Factory AI');
92
+ lines.push(' codex / openai OpenAI Codex');
93
+ lines.push(' cursor Cursor IDE');
94
+ lines.push(' opencode OpenCode');
95
+ lines.push(' warp Warp Terminal');
96
+ lines.push(' windsurf Windsurf');
93
97
  lines.push('');
94
98
 
95
99
  // Examples
@@ -11,7 +11,7 @@
11
11
  * Options:
12
12
  * --source <path> Source directory (defaults to repo root)
13
13
  * --target <path> Target directory (defaults to cwd)
14
- * --mode <type> Deployment mode: general, sdlc, marketing, both, or all (default)
14
+ * --mode <type> Deployment mode: general, sdlc, marketing, media-curator, research, both, or all (default)
15
15
  * --deploy-commands Deploy commands in addition to agents
16
16
  * --deploy-skills Deploy skills in addition to agents
17
17
  * --deploy-rules Deploy rules in addition to agents
@@ -28,12 +28,14 @@
28
28
  * --create-agents-md Create/update AGENTS.md template (Factory/Codex/OpenCode/Cursor)
29
29
  *
30
30
  * Modes:
31
- * general - Deploy only writing-quality addon agents and commands (alias: writing)
32
- * writing - Deploy only writing-quality addon agents (alias for general)
33
- * sdlc - Deploy only SDLC Complete framework agents and commands
34
- * marketing - Deploy only Media/Marketing Kit framework agents and commands
35
- * both - Deploy writing + SDLC (legacy compatibility)
36
- * all - Deploy all frameworks + addons (default)
31
+ * general - Deploy only writing-quality addon agents and commands (alias: writing)
32
+ * writing - Deploy only writing-quality addon agents (alias for general)
33
+ * sdlc - Deploy only SDLC Complete framework agents and commands
34
+ * marketing - Deploy only Media/Marketing Kit framework agents and commands
35
+ * media-curator - Deploy only Media Curator framework agents and commands
36
+ * research - Deploy only Research Complete framework agents and commands
37
+ * both - Deploy writing + SDLC (legacy compatibility)
38
+ * all - Deploy all frameworks + addons (default)
37
39
  *
38
40
  * Providers:
39
41
  * claude - Claude Code (default) - .claude/agents/, .claude/commands/, .claude/skills/, .claude/rules/
@@ -76,7 +78,7 @@ function parseArgs() {
76
78
  const cfg = {
77
79
  source: null,
78
80
  target: process.cwd(),
79
- mode: 'all', // 'general', 'sdlc', 'marketing', 'both' (legacy), or 'all'
81
+ mode: 'all', // 'general', 'sdlc', 'marketing', 'media-curator', 'research', 'both' (legacy), or 'all'
80
82
  dryRun: false,
81
83
  force: false,
82
84
  provider: 'claude',
@@ -138,7 +140,7 @@ Usage:
138
140
  Options:
139
141
  --source <path> Source directory (defaults to repo root)
140
142
  --target <path> Target directory (defaults to cwd)
141
- --mode <type> Deployment mode: general, sdlc, marketing, both, or all (default)
143
+ --mode <type> Deployment mode: general, sdlc, marketing, media-curator, research, both, or all (default)
142
144
  --deploy-commands Deploy commands in addition to agents
143
145
  --deploy-skills Deploy skills in addition to agents
144
146
  --deploy-rules Deploy rules in addition to agents
@@ -177,11 +179,13 @@ Providers (all deploy agents, commands, skills, and rules):
177
179
  Paths: .windsurf/agents/, .windsurf/workflows/, .windsurf/skills/, .windsurf/rules/
178
180
 
179
181
  Modes:
180
- general - Writing-quality addon agents and commands (alias: writing)
181
- sdlc - SDLC Complete framework agents and commands
182
- marketing - Media/Marketing Kit framework agents and commands
183
- both - writing + SDLC (legacy compatibility)
184
- all - All frameworks + addons (default)
182
+ general - Writing-quality addon agents and commands (alias: writing)
183
+ sdlc - SDLC Complete framework agents and commands
184
+ marketing - Media/Marketing Kit framework agents and commands
185
+ media-curator - Media Curator framework agents and commands
186
+ research - Research Complete framework agents and commands
187
+ both - writing + SDLC (legacy compatibility)
188
+ all - All frameworks + addons (default)
185
189
 
186
190
  Examples:
187
191
  # Deploy SDLC framework to Claude Code
@@ -392,6 +392,20 @@ export function initializeFrameworkWorkspace(target, mode, dryRun) {
392
392
  });
393
393
  }
394
394
 
395
+ if (mode === 'media-curator' || mode === 'all') {
396
+ frameworkDirs.push({
397
+ id: 'media-curator',
398
+ subdirs: ['repo', 'library', 'working', 'archive']
399
+ });
400
+ }
401
+
402
+ if (mode === 'research' || mode === 'all') {
403
+ frameworkDirs.push({
404
+ id: 'research-complete',
405
+ subdirs: ['repo', 'corpus', 'working', 'archive']
406
+ });
407
+ }
408
+
395
409
  if (frameworkDirs.length === 0) return;
396
410
 
397
411
  if (dryRun) {
@@ -379,6 +379,64 @@ export async function deploy(opts) {
379
379
  }
380
380
  }
381
381
 
382
+ // Media Curator framework
383
+ if (mode === 'media-curator' || mode === 'all') {
384
+ const curatorAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'agents');
385
+ if (fs.existsSync(curatorAgentsDir)) {
386
+ agentFiles.push(...listMdFiles(curatorAgentsDir));
387
+ }
388
+
389
+ if (shouldDeployCommands || commandsOnly) {
390
+ const curatorCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'commands');
391
+ if (fs.existsSync(curatorCommandsDir)) {
392
+ commandFiles.push(...listMdFilesRecursive(curatorCommandsDir));
393
+ }
394
+ }
395
+
396
+ if (shouldDeploySkills || skillsOnly) {
397
+ const curatorSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'skills');
398
+ if (fs.existsSync(curatorSkillsDir)) {
399
+ skillDirs.push(...listSkillDirs(curatorSkillsDir));
400
+ }
401
+ }
402
+
403
+ if (shouldDeployRules || rulesOnly) {
404
+ const curatorRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'rules');
405
+ if (fs.existsSync(curatorRulesDir)) {
406
+ ruleFiles.push(...listMdFiles(curatorRulesDir));
407
+ }
408
+ }
409
+ }
410
+
411
+ // Research framework
412
+ if (mode === 'research' || mode === 'all') {
413
+ const researchAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'agents');
414
+ if (fs.existsSync(researchAgentsDir)) {
415
+ agentFiles.push(...listMdFiles(researchAgentsDir));
416
+ }
417
+
418
+ if (shouldDeployCommands || commandsOnly) {
419
+ const researchCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'commands');
420
+ if (fs.existsSync(researchCommandsDir)) {
421
+ commandFiles.push(...listMdFilesRecursive(researchCommandsDir));
422
+ }
423
+ }
424
+
425
+ if (shouldDeploySkills || skillsOnly) {
426
+ const researchSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'skills');
427
+ if (fs.existsSync(researchSkillsDir)) {
428
+ skillDirs.push(...listSkillDirs(researchSkillsDir));
429
+ }
430
+ }
431
+
432
+ if (shouldDeployRules || rulesOnly) {
433
+ const researchRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'rules');
434
+ if (fs.existsSync(researchRulesDir)) {
435
+ ruleFiles.push(...listMdFiles(researchRulesDir));
436
+ }
437
+ }
438
+ }
439
+
382
440
  // Deploy based on flags
383
441
  if (!commandsOnly && !skillsOnly) {
384
442
  // Apply filters if specified
@@ -355,6 +355,32 @@ export async function deploy(opts) {
355
355
  }
356
356
  }
357
357
 
358
+ // Media Curator framework
359
+ if (mode === 'media-curator' || mode === 'all') {
360
+ const curatorAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'agents');
361
+ if (fs.existsSync(curatorAgentsDir)) {
362
+ agentFiles.push(...listMdFiles(curatorAgentsDir));
363
+ }
364
+
365
+ const curatorRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'rules');
366
+ if (fs.existsSync(curatorRulesDir)) {
367
+ ruleFiles.push(...listMdFiles(curatorRulesDir));
368
+ }
369
+ }
370
+
371
+ // Research framework
372
+ if (mode === 'research' || mode === 'all') {
373
+ const researchAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'agents');
374
+ if (fs.existsSync(researchAgentsDir)) {
375
+ agentFiles.push(...listMdFiles(researchAgentsDir));
376
+ }
377
+
378
+ const researchRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'rules');
379
+ if (fs.existsSync(researchRulesDir)) {
380
+ ruleFiles.push(...listMdFiles(researchRulesDir));
381
+ }
382
+ }
383
+
358
384
  // All addons (dynamically discovered)
359
385
  if (mode === 'general' || mode === 'writing' || mode === 'sdlc' || mode === 'both' || mode === 'all') {
360
386
  agentFiles.push(...getAddonAgentFiles(srcRoot));
@@ -457,6 +457,64 @@ export async function deploy(opts) {
457
457
  }
458
458
  }
459
459
 
460
+ // Media Curator framework
461
+ if (mode === 'media-curator' || mode === 'all') {
462
+ const curatorAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'agents');
463
+ if (fs.existsSync(curatorAgentsDir)) {
464
+ agentFiles.push(...listMdFiles(curatorAgentsDir));
465
+ }
466
+
467
+ if (shouldDeployCommands || commandsOnly) {
468
+ const curatorCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'commands');
469
+ if (fs.existsSync(curatorCommandsDir)) {
470
+ commandFiles.push(...listMdFilesRecursive(curatorCommandsDir));
471
+ }
472
+ }
473
+
474
+ if (shouldDeploySkills || skillsOnly) {
475
+ const curatorSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'skills');
476
+ if (fs.existsSync(curatorSkillsDir)) {
477
+ skillDirs.push(...listSkillDirs(curatorSkillsDir));
478
+ }
479
+ }
480
+
481
+ if (shouldDeployRules || rulesOnly) {
482
+ const curatorRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'rules');
483
+ if (fs.existsSync(curatorRulesDir)) {
484
+ ruleFiles.push(...listMdFiles(curatorRulesDir));
485
+ }
486
+ }
487
+ }
488
+
489
+ // Research framework
490
+ if (mode === 'research' || mode === 'all') {
491
+ const researchAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'agents');
492
+ if (fs.existsSync(researchAgentsDir)) {
493
+ agentFiles.push(...listMdFiles(researchAgentsDir));
494
+ }
495
+
496
+ if (shouldDeployCommands || commandsOnly) {
497
+ const researchCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'commands');
498
+ if (fs.existsSync(researchCommandsDir)) {
499
+ commandFiles.push(...listMdFilesRecursive(researchCommandsDir));
500
+ }
501
+ }
502
+
503
+ if (shouldDeploySkills || skillsOnly) {
504
+ const researchSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'skills');
505
+ if (fs.existsSync(researchSkillsDir)) {
506
+ skillDirs.push(...listSkillDirs(researchSkillsDir));
507
+ }
508
+ }
509
+
510
+ if (shouldDeployRules || rulesOnly) {
511
+ const researchRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'rules');
512
+ if (fs.existsSync(researchRulesDir)) {
513
+ ruleFiles.push(...listMdFiles(researchRulesDir));
514
+ }
515
+ }
516
+ }
517
+
460
518
  // Deploy
461
519
  if (!commandsOnly && !skillsOnly && !rulesOnly) {
462
520
  console.log(`\nDeploying ${agentFiles.length} agents (YAML format)...`);
@@ -390,6 +390,64 @@ export async function deploy(opts) {
390
390
  }
391
391
  }
392
392
 
393
+ // Media Curator framework
394
+ if (mode === 'media-curator' || mode === 'all') {
395
+ const curatorAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'agents');
396
+ if (fs.existsSync(curatorAgentsDir)) {
397
+ agentFiles.push(...listMdFiles(curatorAgentsDir));
398
+ }
399
+
400
+ if (shouldDeployCommands || commandsOnly) {
401
+ const curatorCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'commands');
402
+ if (fs.existsSync(curatorCommandsDir)) {
403
+ commandFiles.push(...listMdFilesRecursive(curatorCommandsDir));
404
+ }
405
+ }
406
+
407
+ if (shouldDeploySkills || skillsOnly) {
408
+ const curatorSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'skills');
409
+ if (fs.existsSync(curatorSkillsDir)) {
410
+ skillDirs.push(...listSkillDirs(curatorSkillsDir));
411
+ }
412
+ }
413
+
414
+ if (shouldDeployRules || rulesOnly) {
415
+ const curatorRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'rules');
416
+ if (fs.existsSync(curatorRulesDir)) {
417
+ ruleFiles.push(...listMdFiles(curatorRulesDir));
418
+ }
419
+ }
420
+ }
421
+
422
+ // Research framework
423
+ if (mode === 'research' || mode === 'all') {
424
+ const researchAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'agents');
425
+ if (fs.existsSync(researchAgentsDir)) {
426
+ agentFiles.push(...listMdFiles(researchAgentsDir));
427
+ }
428
+
429
+ if (shouldDeployCommands || commandsOnly) {
430
+ const researchCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'commands');
431
+ if (fs.existsSync(researchCommandsDir)) {
432
+ commandFiles.push(...listMdFilesRecursive(researchCommandsDir));
433
+ }
434
+ }
435
+
436
+ if (shouldDeploySkills || skillsOnly) {
437
+ const researchSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'skills');
438
+ if (fs.existsSync(researchSkillsDir)) {
439
+ skillDirs.push(...listSkillDirs(researchSkillsDir));
440
+ }
441
+ }
442
+
443
+ if (shouldDeployRules || rulesOnly) {
444
+ const researchRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'rules');
445
+ if (fs.existsSync(researchRulesDir)) {
446
+ ruleFiles.push(...listMdFiles(researchRulesDir));
447
+ }
448
+ }
449
+ }
450
+
393
451
  // Deploy based on flags
394
452
  if (!commandsOnly && !skillsOnly && !rulesOnly) {
395
453
  // Apply filters if specified
@@ -567,6 +567,64 @@ export async function deploy(opts) {
567
567
  }
568
568
  }
569
569
 
570
+ // Media Curator framework
571
+ if (mode === 'media-curator' || mode === 'all') {
572
+ const curatorAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'agents');
573
+ if (fs.existsSync(curatorAgentsDir)) {
574
+ agentFiles.push(...listMdFiles(curatorAgentsDir));
575
+ }
576
+
577
+ if (shouldDeployCommands || commandsOnly) {
578
+ const curatorCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'commands');
579
+ if (fs.existsSync(curatorCommandsDir)) {
580
+ commandFiles.push(...listMdFilesRecursive(curatorCommandsDir));
581
+ }
582
+ }
583
+
584
+ if (shouldDeployRules || rulesOnly) {
585
+ const curatorRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'rules');
586
+ if (fs.existsSync(curatorRulesDir)) {
587
+ ruleFiles.push(...listMdFiles(curatorRulesDir));
588
+ }
589
+ }
590
+
591
+ if (shouldDeploySkills || skillsOnly) {
592
+ const curatorSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'skills');
593
+ if (fs.existsSync(curatorSkillsDir)) {
594
+ skillDirs.push(...listSkillDirs(curatorSkillsDir));
595
+ }
596
+ }
597
+ }
598
+
599
+ // Research framework
600
+ if (mode === 'research' || mode === 'all') {
601
+ const researchAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'agents');
602
+ if (fs.existsSync(researchAgentsDir)) {
603
+ agentFiles.push(...listMdFiles(researchAgentsDir));
604
+ }
605
+
606
+ if (shouldDeployCommands || commandsOnly) {
607
+ const researchCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'commands');
608
+ if (fs.existsSync(researchCommandsDir)) {
609
+ commandFiles.push(...listMdFilesRecursive(researchCommandsDir));
610
+ }
611
+ }
612
+
613
+ if (shouldDeployRules || rulesOnly) {
614
+ const researchRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'rules');
615
+ if (fs.existsSync(researchRulesDir)) {
616
+ ruleFiles.push(...listMdFiles(researchRulesDir));
617
+ }
618
+ }
619
+
620
+ if (shouldDeploySkills || skillsOnly) {
621
+ const researchSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'skills');
622
+ if (fs.existsSync(researchSkillsDir)) {
623
+ skillDirs.push(...listSkillDirs(researchSkillsDir));
624
+ }
625
+ }
626
+ }
627
+
570
628
  // Deploy based on flags
571
629
  if (!commandsOnly && !skillsOnly && !rulesOnly) {
572
630
  console.log(`\nDeploying ${agentFiles.length} agents as droids...`);
@@ -428,6 +428,64 @@ export async function deploy(opts) {
428
428
  }
429
429
  }
430
430
 
431
+ // Media Curator framework
432
+ if (mode === 'media-curator' || mode === 'all') {
433
+ const curatorAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'agents');
434
+ if (fs.existsSync(curatorAgentsDir)) {
435
+ agentFiles.push(...listMdFiles(curatorAgentsDir));
436
+ }
437
+
438
+ if (shouldDeployCommands || commandsOnly) {
439
+ const curatorCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'commands');
440
+ if (fs.existsSync(curatorCommandsDir)) {
441
+ commandFiles.push(...listMdFilesRecursive(curatorCommandsDir));
442
+ }
443
+ }
444
+
445
+ if (shouldDeploySkills || skillsOnly) {
446
+ const curatorSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'skills');
447
+ if (fs.existsSync(curatorSkillsDir)) {
448
+ skillDirs.push(...listSkillDirs(curatorSkillsDir));
449
+ }
450
+ }
451
+
452
+ if (shouldDeployRules || rulesOnly) {
453
+ const curatorRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'rules');
454
+ if (fs.existsSync(curatorRulesDir)) {
455
+ ruleFiles.push(...listMdFiles(curatorRulesDir));
456
+ }
457
+ }
458
+ }
459
+
460
+ // Research framework
461
+ if (mode === 'research' || mode === 'all') {
462
+ const researchAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'agents');
463
+ if (fs.existsSync(researchAgentsDir)) {
464
+ agentFiles.push(...listMdFiles(researchAgentsDir));
465
+ }
466
+
467
+ if (shouldDeployCommands || commandsOnly) {
468
+ const researchCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'commands');
469
+ if (fs.existsSync(researchCommandsDir)) {
470
+ commandFiles.push(...listMdFilesRecursive(researchCommandsDir));
471
+ }
472
+ }
473
+
474
+ if (shouldDeploySkills || skillsOnly) {
475
+ const researchSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'skills');
476
+ if (fs.existsSync(researchSkillsDir)) {
477
+ skillDirs.push(...listSkillDirs(researchSkillsDir));
478
+ }
479
+ }
480
+
481
+ if (shouldDeployRules || rulesOnly) {
482
+ const researchRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'rules');
483
+ if (fs.existsSync(researchRulesDir)) {
484
+ ruleFiles.push(...listMdFiles(researchRulesDir));
485
+ }
486
+ }
487
+ }
488
+
431
489
  // Deploy
432
490
  if (!commandsOnly && !skillsOnly && !rulesOnly) {
433
491
  console.log(`\nDeploying ${agentFiles.length} agents...`);
@@ -389,6 +389,64 @@ export async function deploy(opts) {
389
389
  }
390
390
  }
391
391
 
392
+ // Media Curator framework
393
+ if (mode === 'media-curator' || mode === 'all') {
394
+ const curatorAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'agents');
395
+ if (fs.existsSync(curatorAgentsDir)) {
396
+ agentFiles.push(...listMdFiles(curatorAgentsDir));
397
+ }
398
+
399
+ if (shouldDeployCommands || commandsOnly) {
400
+ const curatorCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'commands');
401
+ if (fs.existsSync(curatorCommandsDir)) {
402
+ commandFiles.push(...listMdFilesRecursive(curatorCommandsDir));
403
+ }
404
+ }
405
+
406
+ if (shouldDeploySkills || skillsOnly) {
407
+ const curatorSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'skills');
408
+ if (fs.existsSync(curatorSkillsDir)) {
409
+ skillDirs.push(...listSkillDirs(curatorSkillsDir));
410
+ }
411
+ }
412
+
413
+ if (shouldDeployRules || rulesOnly) {
414
+ const curatorRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'rules');
415
+ if (fs.existsSync(curatorRulesDir)) {
416
+ ruleFiles.push(...listMdFiles(curatorRulesDir));
417
+ }
418
+ }
419
+ }
420
+
421
+ // Research framework
422
+ if (mode === 'research' || mode === 'all') {
423
+ const researchAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'agents');
424
+ if (fs.existsSync(researchAgentsDir)) {
425
+ agentFiles.push(...listMdFiles(researchAgentsDir));
426
+ }
427
+
428
+ if (shouldDeployCommands || commandsOnly) {
429
+ const researchCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'commands');
430
+ if (fs.existsSync(researchCommandsDir)) {
431
+ commandFiles.push(...listMdFilesRecursive(researchCommandsDir));
432
+ }
433
+ }
434
+
435
+ if (shouldDeploySkills || skillsOnly) {
436
+ const researchSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'skills');
437
+ if (fs.existsSync(researchSkillsDir)) {
438
+ skillDirs.push(...listSkillDirs(researchSkillsDir));
439
+ }
440
+ }
441
+
442
+ if (shouldDeployRules || rulesOnly) {
443
+ const researchRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'rules');
444
+ if (fs.existsSync(researchRulesDir)) {
445
+ ruleFiles.push(...listMdFiles(researchRulesDir));
446
+ }
447
+ }
448
+ }
449
+
392
450
  // Deploy discrete files for all artifact types
393
451
  console.log('\n--- Deploying discrete files ---');
394
452
 
@@ -466,6 +466,22 @@ export async function deploy(opts) {
466
466
  allAgentFiles.push(...listMdFiles(marketingAgentsDir));
467
467
  }
468
468
 
469
+ // Media Curator framework
470
+ if (mode === 'media-curator' || mode === 'all') {
471
+ const curatorAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'agents');
472
+ if (fs.existsSync(curatorAgentsDir)) {
473
+ allAgentFiles.push(...listMdFiles(curatorAgentsDir));
474
+ }
475
+ }
476
+
477
+ // Research framework
478
+ if (mode === 'research' || mode === 'all') {
479
+ const researchAgentsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'agents');
480
+ if (fs.existsSync(researchAgentsDir)) {
481
+ allAgentFiles.push(...listMdFiles(researchAgentsDir));
482
+ }
483
+ }
484
+
469
485
  // Generate aggregated AGENTS.md
470
486
  if (allAgentFiles.length > 0 && !commandsOnly && !skillsOnly && !rulesOnly) {
471
487
  const agentsMdPath = path.join(target, 'AGENTS.md');
@@ -500,6 +516,22 @@ export async function deploy(opts) {
500
516
  commandFiles.push(...listMdFilesRecursive(marketingCommandsDir));
501
517
  }
502
518
 
519
+ // Media Curator framework
520
+ if (mode === 'media-curator' || mode === 'all') {
521
+ const curatorCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'commands');
522
+ if (fs.existsSync(curatorCommandsDir)) {
523
+ commandFiles.push(...listMdFilesRecursive(curatorCommandsDir));
524
+ }
525
+ }
526
+
527
+ // Research framework
528
+ if (mode === 'research' || mode === 'all') {
529
+ const researchCommandsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'commands');
530
+ if (fs.existsSync(researchCommandsDir)) {
531
+ commandFiles.push(...listMdFilesRecursive(researchCommandsDir));
532
+ }
533
+ }
534
+
503
535
  if (commandFiles.length > 0) {
504
536
  deployWorkflows(commandFiles, target, opts);
505
537
  }
@@ -526,6 +558,22 @@ export async function deploy(opts) {
526
558
  skillDirs.push(...listSkillDirs(marketingSkillsDir));
527
559
  }
528
560
 
561
+ // Media Curator framework
562
+ if (mode === 'media-curator' || mode === 'all') {
563
+ const curatorSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'skills');
564
+ if (fs.existsSync(curatorSkillsDir)) {
565
+ skillDirs.push(...listSkillDirs(curatorSkillsDir));
566
+ }
567
+ }
568
+
569
+ // Research framework
570
+ if (mode === 'research' || mode === 'all') {
571
+ const researchSkillsDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'skills');
572
+ if (fs.existsSync(researchSkillsDir)) {
573
+ skillDirs.push(...listSkillDirs(researchSkillsDir));
574
+ }
575
+ }
576
+
529
577
  if (skillDirs.length > 0) {
530
578
  console.log(`\nDeploying ${skillDirs.length} skills...`);
531
579
  deploySkills(skillDirs, target, opts);
@@ -560,6 +608,22 @@ export async function deploy(opts) {
560
608
  ruleFiles.push(...listMdFiles(marketingRulesDir));
561
609
  }
562
610
 
611
+ // Media Curator framework
612
+ if (mode === 'media-curator' || mode === 'all') {
613
+ const curatorRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'media-curator', 'rules');
614
+ if (fs.existsSync(curatorRulesDir)) {
615
+ ruleFiles.push(...listMdFiles(curatorRulesDir));
616
+ }
617
+ }
618
+
619
+ // Research framework
620
+ if (mode === 'research' || mode === 'all') {
621
+ const researchRulesDir = path.join(srcRoot, 'agentic', 'code', 'frameworks', 'research-complete', 'rules');
622
+ if (fs.existsSync(researchRulesDir)) {
623
+ ruleFiles.push(...listMdFiles(researchRulesDir));
624
+ }
625
+ }
626
+
563
627
  if (ruleFiles.length > 0) {
564
628
  console.log(`\nDeploying ${ruleFiles.length} rules...`);
565
629
  deployRules(ruleFiles, target, opts);