agentsys 5.8.0 → 5.8.1

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agentsys",
3
3
  "description": "19 specialized plugins for AI workflow automation - task orchestration, PR workflow, slop detection, code review, drift detection, enhancement analysis, documentation sync, unified static analysis, perf investigations, topic research, agent config linting, cross-tool AI consultation, structured AI debate, workflow pattern learning, codebase onboarding, and contributor guidance",
4
- "version": "5.8.0",
4
+ "version": "5.8.1",
5
5
  "owner": {
6
6
  "name": "Avi Fenesh",
7
7
  "url": "https://github.com/avifenesh"
@@ -128,7 +128,7 @@
128
128
  "url": "https://github.com/agent-sh/repo-intel.git"
129
129
  },
130
130
  "description": "Unified static analysis via agent-analyzer - git history, AST symbols, project metadata, and doc-code sync",
131
- "version": "1.0.0",
131
+ "version": "0.2.0",
132
132
  "category": "development",
133
133
  "homepage": "https://github.com/agent-sh/repo-intel"
134
134
  },
@@ -160,7 +160,7 @@
160
160
  "source": "url",
161
161
  "url": "https://github.com/agent-sh/agnix.git"
162
162
  },
163
- "description": "Lint agent configuration files (SKILL.md, CLAUDE.md, hooks, MCP) against 342 rules across 10+ AI tools",
163
+ "description": "Lint agent configuration files (SKILL.md, CLAUDE.md, hooks, MCP) against 385 rules across 10+ AI tools",
164
164
  "version": "1.0.0",
165
165
  "category": "development",
166
166
  "homepage": "https://github.com/agent-sh/agnix"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentsys",
3
- "version": "5.8.0",
3
+ "version": "5.8.1",
4
4
  "description": "Professional-grade slash commands for Claude Code with cross-platform support",
5
5
  "keywords": [
6
6
  "workflow",
package/README.md CHANGED
@@ -41,7 +41,7 @@
41
41
  AI models can write code. That's not the hard part anymore. The hard part is everything around it — task selection, branch management, code review, artifact cleanup, CI, PR comments, deployment. **AgentSys is the runtime that orchestrates agents to handle all of it** — structured pipelines, gated phases, specialized agents, and persistent state that survives session boundaries.
42
42
 
43
43
  ---
44
- > Building custom skills, agents, hooks, or MCP tools? [agnix](https://github.com/agent-sh/agnix) is the CLI + LSP linter that catches config errors before they fail silently - real-time IDE validation, auto suggestions, auto-fix, and 342 rules for Claude Code, Codex, OpenCode, Cursor, Kiro, Copilot, Gemini CLI, Cline, Windsurf, Roo Code, Amp, and more.
44
+ > Building custom skills, agents, hooks, or MCP tools? [agnix](https://github.com/agent-sh/agnix) is the CLI + LSP linter that catches config errors before they fail silently - real-time IDE validation, auto suggestions, auto-fix, and 385 rules for Claude Code, Codex, OpenCode, Cursor, Kiro, Copilot, Gemini CLI, Cline, Windsurf, Roo Code, Amp, and more.
45
45
 
46
46
  ## What This Is
47
47
 
@@ -118,7 +118,7 @@ The investment shifts from model spend to pipeline design. Better prompts, riche
118
118
  | [`/next-task`](#next-task) | Task workflow: discovery, implementation, PR, merge |
119
119
  | [`/prepare-delivery`](#prepare-delivery) | Pre-ship quality gates: deslop, review, validation, docs sync |
120
120
  | [`/gate-and-ship`](#gate-and-ship) | Quality gates then ship (/prepare-delivery + /ship) |
121
- | [`/agnix`](#agnix) | Lint agent configurations (342 rules) |
121
+ | [`/agnix`](#agnix) | Lint agent configurations (385 rules) |
122
122
  | [`/ship`](#ship) | PR creation, CI monitoring, merge |
123
123
  | [`/deslop`](#deslop) | Clean AI slop patterns |
124
124
  | [`/perf`](#perf) | Performance investigation with baselines and profiling |
@@ -328,7 +328,7 @@ agnix catches these issues before they cause problems.
328
328
  | **Best Practices** | Tool restrictions, model selection, trigger phrase quality |
329
329
  | **Cross-Platform** | Compatibility across Claude Code, Codex, OpenCode, Cursor, Kiro, Copilot, Gemini CLI, Cline, Windsurf, Roo Code, Amp, and more |
330
330
 
331
- **342 validation rules** (102 auto-fixable) derived from:
331
+ **385 validation rules** (102 auto-fixable) derived from:
332
332
  - Official tool specifications (Claude Code, Codex CLI, OpenCode, Cursor, Kiro, GitHub Copilot, Gemini CLI, Cline, Windsurf, Roo Code, Amp, and more)
333
333
  - Research papers on agent reliability and prompt injection
334
334
  - Real-world testing across 500+ repositories
@@ -8,6 +8,7 @@
8
8
  */
9
9
 
10
10
  'use strict';
11
+ const { truncate } = require('../cross-platform');
11
12
 
12
13
  const fs = require('fs');
13
14
  const path = require('path');
@@ -108,7 +109,7 @@ function extractPlans(result, content) {
108
109
  for (const pattern of planPatterns) {
109
110
  let match;
110
111
  while ((match = pattern.exec(content)) !== null && result.plans.length < 15) {
111
- const plan = (match[1] || match[0]).slice(0, 100);
112
+ const plan = truncate(match[1] || match[0], 100);
112
113
  result.plans.push(plan);
113
114
  }
114
115
  }
@@ -9,6 +9,8 @@
9
9
 
10
10
  'use strict';
11
11
 
12
+ const { truncate } = require('../cross-platform');
13
+
12
14
  const { execFileSync } = require('child_process');
13
15
 
14
16
  const DEFAULT_OPTIONS = {
@@ -47,7 +49,7 @@ function execGhWithResult(args, options = {}) {
47
49
  error: {
48
50
  type: 'parse',
49
51
  message: `Failed to parse gh output as JSON: ${error.message}`,
50
- raw: output.slice(0, 500)
52
+ raw: truncate(output, 500)
51
53
  }
52
54
  };
53
55
  }
@@ -94,7 +96,7 @@ function summarizeIssue(item) {
94
96
  milestone: item.milestone?.title || item.milestone || null,
95
97
  createdAt: item.createdAt,
96
98
  updatedAt: item.updatedAt,
97
- snippet: item.body ? item.body.slice(0, 200).replace(/\n/g, ' ').trim() + (item.body.length > 200 ? '...' : '') : ''
99
+ snippet: item.body ? truncate(item.body.replace(/\n/g, ' '), 200) : ''
98
100
  };
99
101
  }
100
102
 
@@ -112,7 +114,7 @@ function summarizePR(item) {
112
114
  createdAt: item.createdAt,
113
115
  updatedAt: item.updatedAt,
114
116
  files: item.files || [],
115
- snippet: item.body ? item.body.slice(0, 150).replace(/\n/g, ' ').trim() + (item.body.length > 150 ? '...' : '') : ''
117
+ snippet: item.body ? truncate(item.body.replace(/\n/g, ' '), 150) : ''
116
118
  };
117
119
  }
118
120
 
@@ -310,8 +310,11 @@ function formatSection(title, content) {
310
310
  * @returns {string} Truncated text
311
311
  */
312
312
  function truncate(text, maxLength) {
313
- if (text.length <= maxLength) return text;
314
- return text.substring(0, maxLength - 3) + '...';
313
+ // Code-point safe: uses spread operator to avoid splitting surrogate pairs (emoji, flags, CJK).
314
+ if (maxLength < 0) return text;
315
+ const chars = [...text];
316
+ if (chars.length <= maxLength) return text;
317
+ return chars.slice(0, maxLength - 3).join('') + '...';
315
318
  }
316
319
 
317
320
  /**
@@ -12,6 +12,7 @@ const fs = require('fs');
12
12
  const path = require('path');
13
13
  const { parseMarkdownFrontmatter } = require('./agent-analyzer');
14
14
  const { crossFilePatterns, loadKnownTools } = require('./cross-file-patterns');
15
+ const { truncate } = require('../cross-platform');
15
16
 
16
17
  // ============================================
17
18
  // CONSTANTS
@@ -650,9 +651,9 @@ function analyzePromptConsistency(agents) {
650
651
  // Extract action keywords
651
652
  let action;
652
653
  if (isAlways) {
653
- action = line.replace(/.*\bALWAYS\b\s*/i, '').substring(0, ACTION_COMPARISON_LENGTH);
654
+ action = truncate(line.replace(/.*\bALWAYS\b\s*/i, ''), ACTION_COMPARISON_LENGTH);
654
655
  } else {
655
- action = line.replace(/.*\b(?:NEVER|DO NOT)\b\s*/i, '').substring(0, ACTION_COMPARISON_LENGTH);
656
+ action = truncate(line.replace(/.*\b(?:NEVER|DO NOT)\b\s*/i, ''), ACTION_COMPARISON_LENGTH);
656
657
  }
657
658
 
658
659
  // Extract significant keywords from action
@@ -11,6 +11,7 @@
11
11
  const fs = require('fs');
12
12
  const path = require('path');
13
13
  const { getStateDir, getPlatformName } = require('../platform/state-dir');
14
+ const { truncate } = require('../cross-platform');
14
15
 
15
16
  /**
16
17
  * Platform-specific default tools
@@ -214,7 +215,7 @@ const crossFilePatterns = {
214
215
  if (!instruction || !files || files.length < 2) return null;
215
216
 
216
217
  return {
217
- issue: `Duplicate instruction found in ${files.length} files: "${instruction.substring(0, 50)}..."`,
218
+ issue: `Duplicate instruction found in ${files.length} files: "${truncate(instruction, 50)}"`,
218
219
  fix: `Extract shared instruction to a common include or ensure intentional duplication`
219
220
  };
220
221
  }
@@ -234,7 +235,7 @@ const crossFilePatterns = {
234
235
  if (!rule1 || !rule2) return null;
235
236
 
236
237
  return {
237
- issue: `Contradictory rules: "${rule1.substring(0, 40)}..." vs "${rule2.substring(0, 40)}..."`,
238
+ issue: `Contradictory rules: "${truncate(rule1, 40)}" vs "${truncate(rule2, 40)}"`,
238
239
  fix: `Resolve conflict between ${file1} and ${file2}`
239
240
  };
240
241
  }
@@ -4,6 +4,8 @@
4
4
  * @license MIT
5
5
  */
6
6
 
7
+ const { truncate } = require('../cross-platform');
8
+
7
9
  function estimateTokens(text) {
8
10
  if (!text || typeof text !== 'string') return 0;
9
11
  return Math.ceil(text.length / 4);
@@ -159,7 +161,7 @@ const docsPatterns = {
159
161
  const tokens = estimateTokens(section);
160
162
  if (tokens > 1000) {
161
163
  // Get section title (first line)
162
- const title = section.split('\n')[0].trim().slice(0, 50);
164
+ const title = truncate(section.split('\n')[0].trim(), 50);
163
165
  longSections.push({ title, tokens });
164
166
  }
165
167
  }
@@ -371,7 +373,7 @@ const docsPatterns = {
371
373
 
372
374
  // Check if starts with dangling reference
373
375
  if (/^(?:It|This|These|Those|They|The above|As mentioned)\s/i.test(firstLine)) {
374
- const title = lines[0].slice(0, 30);
376
+ const title = truncate(lines[0], 30);
375
377
  issues.push(title);
376
378
  }
377
379
  }
@@ -461,7 +463,7 @@ const docsPatterns = {
461
463
  const tokens = estimateTokens(cleanPart);
462
464
 
463
465
  if (tokens > 500) {
464
- const preview = cleanPart.trim().split('\n')[0].slice(0, 50);
466
+ const preview = truncate(cleanPart.trim().split('\n')[0], 50);
465
467
  longBlocks.push({ tokens, preview });
466
468
  }
467
469
  }
@@ -502,7 +504,7 @@ const docsPatterns = {
502
504
  for (let i = lateThreshold; i < totalLines; i++) {
503
505
  for (const pattern of criticalKeywords) {
504
506
  if (pattern.test(lines[i])) {
505
- lateImportantLines.push(lines[i].trim().slice(0, 50));
507
+ lateImportantLines.push(truncate(lines[i].trim(), 50));
506
508
  break;
507
509
  }
508
510
  }
package/lib/package.json CHANGED
@@ -4,6 +4,38 @@
4
4
  "description": "Core library for AgentSys: platform detection, pattern matching, workflow state, and utilities",
5
5
  "main": "index.js",
6
6
  "type": "commonjs",
7
+ "exports": {
8
+ ".": "./index.js",
9
+ "./binary": "./binary/index.js",
10
+ "./collectors": "./collectors/index.js",
11
+ "./config": "./config/index.js",
12
+ "./cross-platform": "./cross-platform/index.js",
13
+ "./discovery": "./discovery/index.js",
14
+ "./enhance": "./enhance/index.js",
15
+ "./perf": "./perf/index.js",
16
+ "./repo-map": "./repo-map/index.js",
17
+ "./collectors/codebase": "./collectors/codebase.js",
18
+ "./collectors/docs-patterns": "./collectors/docs-patterns.js",
19
+ "./collectors/documentation": "./collectors/documentation.js",
20
+ "./collectors/github": "./collectors/github.js",
21
+ "./enhance/agent-analyzer": "./enhance/agent-analyzer.js",
22
+ "./enhance/agent-patterns": "./enhance/agent-patterns.js",
23
+ "./enhance/cross-file-analyzer": "./enhance/cross-file-analyzer.js",
24
+ "./enhance/cross-file-patterns": "./enhance/cross-file-patterns.js",
25
+ "./enhance/fixer": "./enhance/fixer.js",
26
+ "./enhance/plugin-patterns": "./enhance/plugin-patterns.js",
27
+ "./enhance/projectmemory-analyzer": "./enhance/projectmemory-analyzer.js",
28
+ "./enhance/projectmemory-patterns": "./enhance/projectmemory-patterns.js",
29
+ "./enhance/prompt-analyzer": "./enhance/prompt-analyzer.js",
30
+ "./enhance/prompt-patterns": "./enhance/prompt-patterns.js",
31
+ "./enhance/reporter": "./enhance/reporter.js",
32
+ "./enhance/security-patterns": "./enhance/security-patterns.js",
33
+ "./enhance/suppression": "./enhance/suppression.js",
34
+ "./enhance/tool-patterns": "./enhance/tool-patterns.js",
35
+ "./sources/custom-handler": "./sources/custom-handler.js",
36
+ "./sources/policy-questions": "./sources/policy-questions.js",
37
+ "./sources/source-cache": "./sources/source-cache.js"
38
+ },
7
39
  "engines": {
8
40
  "node": ">=18.0.0"
9
41
  },
@@ -6,7 +6,11 @@
6
6
  * Functions gracefully degrade when tools are not available.
7
7
  *
8
8
  * Supported languages: javascript, typescript, python, rust, go
9
- *
9
+ */
10
+
11
+ const { truncate } = require('../cross-platform');
12
+
13
+ /**
10
14
  * @module patterns/cli-enhancers
11
15
  * @author Avi Fenesh
12
16
  * @license MIT
@@ -380,7 +384,7 @@ function runDuplicateDetection(repoPath, options = {}) {
380
384
  secondLine: dup.secondFile?.start || 0,
381
385
  lines: dup.lines || 0,
382
386
  tokens: dup.tokens || 0,
383
- fragment: dup.fragment?.substring(0, 100) || ''
387
+ fragment: truncate(dup.fragment || '', 100)
384
388
  });
385
389
  }
386
390
  }
@@ -7,7 +7,11 @@
7
7
  * - Phase 3 (LLM handoff): certainty-tagged findings for agent review
8
8
  *
9
9
  * Inherits modes from deslop: report (analyze only) vs apply (fix issues)
10
- *
10
+ */
11
+
12
+ const { truncate } = require('../cross-platform');
13
+
14
+ /**
11
15
  * @module patterns/pipeline
12
16
  * @author Avi Fenesh
13
17
  * @license MIT
@@ -356,7 +360,7 @@ function runPhase1(repoPath, targetFiles, language, fileContents) {
356
360
  certainty: CERTAINTY.HIGH,
357
361
  description: pattern.description,
358
362
  autoFix: pattern.autoFix,
359
- content: line.trim().substring(0, 100),
363
+ content: truncate(line.trim(), 100),
360
364
  phase: 1
361
365
  });
362
366
  }
@@ -657,7 +661,7 @@ async function runMultiPassAnalyzers(repoPath, targetFiles, fileContents) {
657
661
  certainty: CERTAINTY.MEDIUM,
658
662
  description: `${shotgunPattern.description}: ${v.files.length} files change together ${v.count} times`,
659
663
  autoFix: shotgunPattern.autoFix,
660
- content: v.files.join(', ').substring(0, 100),
664
+ content: truncate(v.files.join(', '), 100),
661
665
  phase: 1,
662
666
  details: { files: v.files, changeCount: v.count }
663
667
  });
@@ -8,6 +8,8 @@
8
8
  * @license MIT
9
9
  */
10
10
 
11
+ const { truncate } = require('../cross-platform');
12
+
11
13
  /**
12
14
  * Analyze JSDoc-to-function ratio to detect excessive documentation
13
15
  *
@@ -1879,7 +1881,7 @@ function analyzeDeadCode(content, options = {}) {
1879
1881
  line: j + 1, // 1-indexed
1880
1882
  terminationType: terminationType,
1881
1883
  terminationLine: i + 1,
1882
- content: nextTrimmed.substring(0, 50) + (nextTrimmed.length > 50 ? '...' : ''),
1884
+ content: truncate(nextTrimmed, 50),
1883
1885
  severity: 'high'
1884
1886
  });
1885
1887
 
@@ -11,6 +11,7 @@
11
11
  */
12
12
 
13
13
  const fs = require('fs');
14
+ const { truncate } = require('../cross-platform');
14
15
  const path = require('path');
15
16
  const { exec } = require('child_process');
16
17
  const { promisify } = require('util');
@@ -84,7 +85,7 @@ function withTimeout(promise, timeoutMs = DEFAULT_ASYNC_TIMEOUT_MS, operation =
84
85
  * @returns {Promise<{stdout: string, stderr: string}>}
85
86
  */
86
87
  async function execWithTimeout(cmd, options = {}, timeoutMs = DEFAULT_ASYNC_TIMEOUT_MS) {
87
- return withTimeout(execAsync(cmd, options), timeoutMs, `exec: ${cmd.substring(0, 50)}`);
88
+ return withTimeout(execAsync(cmd, options), timeoutMs, `exec: ${truncate(cmd, 50)}`);
88
89
  }
89
90
 
90
91
  // Maximum cached file size constant
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  const sourceCache = require('./source-cache');
9
+ const { truncate } = require('../cross-platform');
9
10
  const customHandler = require('./custom-handler');
10
11
 
11
12
  /**
@@ -42,7 +43,7 @@ function getPolicyQuestions() {
42
43
  // Truncate to fit within 30 chars: "X (last used)" where X can be max 17 chars
43
44
  const maxBaseLen = 30 - ' (last used)'.length; // 18 chars for base
44
45
  const truncatedLabel = cachedLabel.length > maxBaseLen
45
- ? cachedLabel.substring(0, maxBaseLen - 1) + '…'
46
+ ? truncate(cachedLabel, maxBaseLen - 1) + '…'
46
47
  : cachedLabel;
47
48
 
48
49
  sourceOptions.push({
@@ -155,12 +156,12 @@ function parseAndCachePolicy(responses) {
155
156
  // Validate and merge follow-up responses
156
157
  const rawNum = String(responses.project.number).trim();
157
158
  if (!/^[1-9][0-9]*$/.test(rawNum)) {
158
- const safeNum = String(responses.project.number).replace(/[^\x20-\x7E]/g, '?').substring(0, 32);
159
+ const safeNum = truncate(String(responses.project.number).replace(/[^\x20-\x7E]/g, '?'), 32);
159
160
  throw new Error(`Invalid project number: "${safeNum}". Must be a positive integer.`);
160
161
  }
161
162
  const num = Number(rawNum);
162
163
  const owner = String(responses.project.owner || '').trim();
163
- const safeOwner = String(responses.project.owner || '').replace(/[^\x20-\x7E]/g, '?').substring(0, 64);
164
+ const safeOwner = truncate(String(responses.project.owner || '').replace(/[^\x20-\x7E]/g, '?'), 64);
164
165
  if (!owner || !/^(@me|[a-zA-Z0-9][a-zA-Z0-9_-]*)$/.test(owner)) {
165
166
  throw new Error(`Invalid project owner: "${safeOwner}" (use @me or an org/user name)`);
166
167
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentsys",
3
- "version": "5.8.0",
3
+ "version": "5.8.1",
4
4
  "description": "A modular runtime and orchestration system for AI agents - works with Claude Code, OpenCode, and Codex CLI",
5
5
  "main": "lib/platform/detect-platform.js",
6
6
  "type": "commonjs",
@@ -192,7 +192,7 @@ function generateCommandsTable(commands) {
192
192
  'next-task': 'Task workflow: discovery, implementation, PR, merge',
193
193
  'prepare-delivery': 'Pre-ship quality gates: deslop, review, validation, docs sync',
194
194
  'gate-and-ship': 'Quality gates then ship (/prepare-delivery + /ship)',
195
- 'agnix': 'Lint agent configurations (342 rules)',
195
+ 'agnix': 'Lint agent configurations (385 rules)',
196
196
  'ship': 'PR creation, CI monitoring, merge',
197
197
  'deslop': 'Clean AI slop patterns',
198
198
  'perf': 'Performance investigation with baselines and profiling',
@@ -687,33 +687,14 @@
687
687
  * -------------------------------------------------------------------------- */
688
688
  .tabs[role="tablist"] {
689
689
  display: flex;
690
+ flex-wrap: wrap;
690
691
  gap: var(--space-1);
691
- overflow-x: auto;
692
- scrollbar-width: none;
693
- -webkit-overflow-scrolling: touch;
694
692
  padding-bottom: var(--space-4);
695
693
  border-bottom: 1px solid var(--color-border-subtle);
696
694
  margin-bottom: var(--space-6);
697
695
  position: relative;
698
696
  }
699
697
 
700
- .tabs[role="tablist"]::-webkit-scrollbar {
701
- display: none;
702
- }
703
-
704
- /* Right fade for scroll hint */
705
- .tabs[role="tablist"]::after {
706
- content: '';
707
- position: sticky;
708
- right: 0;
709
- top: 0;
710
- bottom: 0;
711
- width: 40px;
712
- flex-shrink: 0;
713
- background: linear-gradient(to right, transparent, var(--color-bg-base));
714
- pointer-events: none;
715
- }
716
-
717
698
  .tabs--small .tabs__tab {
718
699
  font-size: var(--text-sm);
719
700
  }
@@ -903,6 +884,76 @@
903
884
  color: var(--color-text-faint);
904
885
  }
905
886
 
887
+ /* --------------------------------------------------------------------------
888
+ * INLINE PIPELINE (inside command panels)
889
+ * -------------------------------------------------------------------------- */
890
+ .pipeline-inline {
891
+ margin-top: var(--space-6);
892
+ padding-top: var(--space-5);
893
+ border-top: 1px solid var(--color-border-subtle);
894
+ }
895
+
896
+ .pipeline-inline__label {
897
+ font-size: var(--text-xs);
898
+ font-weight: var(--font-semibold);
899
+ color: var(--color-text-muted);
900
+ text-transform: uppercase;
901
+ letter-spacing: var(--tracking-wider);
902
+ margin-bottom: var(--space-3);
903
+ }
904
+
905
+ .pipeline-inline__steps {
906
+ display: flex;
907
+ flex-wrap: wrap;
908
+ align-items: center;
909
+ gap: var(--space-2);
910
+ }
911
+
912
+ .pipeline-inline__step {
913
+ display: flex;
914
+ align-items: center;
915
+ gap: var(--space-2);
916
+ padding: var(--space-1) var(--space-3);
917
+ background: var(--color-bg-surface-2);
918
+ border: 1px solid var(--color-border-subtle);
919
+ border-radius: var(--radius-default);
920
+ cursor: default;
921
+ transition: border-color var(--duration-fast) var(--ease-out),
922
+ background var(--duration-fast) var(--ease-out);
923
+ }
924
+
925
+ .pipeline-inline__step:hover {
926
+ border-color: var(--color-border-default);
927
+ background: var(--color-bg-surface-3);
928
+ }
929
+
930
+ .pipeline-inline__num {
931
+ display: inline-flex;
932
+ align-items: center;
933
+ justify-content: center;
934
+ width: 18px;
935
+ height: 18px;
936
+ font-size: 10px;
937
+ font-weight: var(--font-semibold);
938
+ color: var(--color-accent-purple);
939
+ background: var(--color-accent-muted);
940
+ border-radius: var(--radius-full);
941
+ flex-shrink: 0;
942
+ }
943
+
944
+ .pipeline-inline__title {
945
+ font-size: var(--text-xs);
946
+ font-family: var(--font-mono);
947
+ color: var(--color-text-secondary);
948
+ white-space: nowrap;
949
+ }
950
+
951
+ .pipeline-inline__arrow {
952
+ color: var(--color-text-faint);
953
+ font-size: var(--text-sm);
954
+ flex-shrink: 0;
955
+ }
956
+
906
957
  /* --------------------------------------------------------------------------
907
958
  * SCROLL CUE
908
959
  * -------------------------------------------------------------------------- */
@@ -1025,6 +1076,7 @@
1025
1076
  @media (min-width: 768px) {
1026
1077
  .steps {
1027
1078
  flex-direction: row;
1079
+ flex-wrap: wrap;
1028
1080
  align-items: flex-start;
1029
1081
  justify-content: center;
1030
1082
  gap: var(--space-4);
@@ -580,11 +580,11 @@
580
580
  ]
581
581
  },
582
582
  1: {
583
- subtitle: '155 rules. 10+ AI tools. One command.',
583
+ subtitle: '385 rules. 10+ AI tools. One command.',
584
584
  steps: [
585
585
  { title: 'Discover configs', desc: 'Finds all agent configuration files: Skills, Hooks, MCP, Memory, and Plugins across your project.' },
586
- { title: 'Run 155 rules', desc: 'Validates against 155 rules across 10+ AI tools including Claude Code, Cursor, Copilot, Codex, and more.' },
587
- { title: 'Fix and report', desc: '57 rules are auto-fixable with --fix flag. Outputs SARIF for GitHub Code Scanning integration.' }
586
+ { title: 'Run 385 rules', desc: 'Validates against 385 rules across 10+ AI tools including Claude Code, Cursor, Copilot, Codex, and more.' },
587
+ { title: 'Fix and report', desc: '102 rules are auto-fixable with --fix flag. Outputs SARIF for GitHub Code Scanning integration.' }
588
588
  ]
589
589
  },
590
590
  2: {
@@ -636,11 +636,11 @@
636
636
  ]
637
637
  },
638
638
  8: {
639
- subtitle: 'AST-based. Cached. Always current.',
639
+ subtitle: 'Unified analysis. Cached. 24 query types.',
640
640
  steps: [
641
- { title: 'Parse with AST', desc: 'Uses ast-grep to extract every export, function, class, and import from your codebase.' },
642
- { title: 'Build the map', desc: 'Creates a cached JSON map of symbols and their relationships stored in the platform state directory.' },
643
- { title: 'Validate output', desc: 'The map-validator agent checks for obvious errors, missing data, and structural issues.' }
641
+ { title: 'Analyze repo', desc: 'Rust binary scans git history, file structure, and code patterns. Extracts hotspots, coupling, ownership, and conventions.' },
642
+ { title: 'Build cached map', desc: 'Creates repo-intel.json with symbols, imports, exports, and metadata in the platform state directory.' },
643
+ { title: 'Query on demand', desc: '24 query types: hotspots, bugspots, test-gaps, bus-factor, diff-risk, conventions, stale-docs, and more.' }
644
644
  ]
645
645
  },
646
646
  9: {
@@ -682,6 +682,54 @@
682
682
  { title: 'Authenticate', desc: 'Opens headed Chrome for human login (2FA, CAPTCHAs). Polls for success, then encrypts cookies for reuse.' },
683
683
  { title: 'Run headless', desc: 'Subsequent actions run headless using saved cookies. Snapshot-based element discovery with classified error codes.' }
684
684
  ]
685
+ },
686
+ 14: {
687
+ subtitle: 'Five quality gates. Zero shortcuts.',
688
+ steps: [
689
+ { title: 'Clean and lint', desc: 'Deslop + simplify + test-coverage run in parallel. Then agnix and /enhance lint any changed agent configs.' },
690
+ { title: 'Review and validate', desc: '4 core reviewers iterate until clean (max 5 rounds). Then delivery-validator checks tests, build, and requirements.' },
691
+ { title: 'Sync docs and ship', desc: 'Documentation synced with code changes. Ready for /ship or /gate-and-ship to create the PR.' }
692
+ ]
693
+ },
694
+ 15: {
695
+ subtitle: 'Quality gates then ship. One command.',
696
+ steps: [
697
+ { title: 'Run /prepare-delivery', desc: 'All five quality gates: deslop, config lint, review loop, delivery validation, and docs sync.' },
698
+ { title: 'Run /ship', desc: 'Commit, push, create PR, wait for auto-reviewers, address comments, monitor CI, merge.' },
699
+ { title: 'Done', desc: 'From code-complete to merged PR. If gates fail, ship does not run. Each piece also runs independently.' }
700
+ ]
701
+ },
702
+ 16: {
703
+ subtitle: 'Detect ecosystem. Tag. Publish.',
704
+ steps: [
705
+ { title: 'Discover release method', desc: 'Finds your release tool: semantic-release, release-it, goreleaser, cargo-release, or manual npm/cargo/go publish.' },
706
+ { title: 'Pre-release checks', desc: 'Runs tests, verifies build, checks repo-intel health (bus factor, AI ratio, bugspots). Bumps version.' },
707
+ { title: 'Tag and publish', desc: 'Creates git tag, publishes to registry (npm, crates.io, PyPI, etc.), creates GitHub release with notes.' }
708
+ ]
709
+ },
710
+ 17: {
711
+ subtitle: 'Transcripts in. Automation suggestions out.',
712
+ steps: [
713
+ { title: 'Read transcripts', desc: 'Reads saved sessions from Claude Code, Codex, and OpenCode. No hooks, no per-turn overhead.' },
714
+ { title: 'Cluster patterns', desc: 'Extracts observations, groups by theme, weights by frequency. Identifies repetitive workflows.' },
715
+ { title: 'Suggest automation', desc: 'Recommends skills, hooks, and agents that would automate the patterns found. Checks existing ecosystem first.' }
716
+ ]
717
+ },
718
+ 18: {
719
+ subtitle: 'Automated data collection. Interactive tour.',
720
+ steps: [
721
+ { title: 'Collect project data', desc: 'Scans package.json, git history, directory structure, key files, and conventions automatically.' },
722
+ { title: 'Generate overview', desc: 'Synthesizes a structured project summary: architecture, patterns, key files, and entry points.' },
723
+ { title: 'Interactive Q&A', desc: 'Answers questions about the codebase interactively. Identifies key files, conventions, and gotchas.' }
724
+ ]
725
+ },
726
+ 19: {
727
+ subtitle: 'Match skills to project needs.',
728
+ steps: [
729
+ { title: 'Analyze project', desc: 'Uses repo-intel to find test gaps, stale docs, open issues, bugspots, and areas with low bus factor.' },
730
+ { title: 'Match skills', desc: 'Asks about your experience and interests. Matches your skills to areas where you can make the most impact.' },
731
+ { title: 'Suggest tasks', desc: 'Presents ranked list of good-first tasks, documentation fixes, test gaps, and contribution opportunities.' }
732
+ ]
685
733
  }
686
734
  };
687
735
 
@@ -727,7 +775,8 @@
727
775
  num.textContent = i + 1;
728
776
  card.appendChild(num);
729
777
 
730
- card.appendChild(stepIconTemplates[i].content.cloneNode(true));
778
+ var tpl = stepIconTemplates[i % stepIconTemplates.length];
779
+ if (tpl) card.appendChild(tpl.content.cloneNode(true));
731
780
 
732
781
  var title = document.createElement('h3');
733
782
  title.className = 'steps__card-title';
@@ -788,6 +837,52 @@
788
837
  updateHowItWorks(e.detail.index);
789
838
  });
790
839
  }
840
+
841
+ // Inject inline pipeline steps into each command panel so users see them without scrolling
842
+ var commandPanels = document.querySelectorAll('.commands .tabs__panel');
843
+ commandPanels.forEach(function (panel, idx) {
844
+ var data = howItWorksData[idx];
845
+ if (!data || !data.steps) return;
846
+
847
+ var pipeline = document.createElement('div');
848
+ pipeline.className = 'pipeline-inline';
849
+
850
+ var label = document.createElement('p');
851
+ label.className = 'pipeline-inline__label';
852
+ label.textContent = 'How it works';
853
+ pipeline.appendChild(label);
854
+
855
+ var stepsRow = document.createElement('div');
856
+ stepsRow.className = 'pipeline-inline__steps';
857
+
858
+ data.steps.forEach(function (step, i) {
859
+ if (i > 0) {
860
+ var arrow = document.createElement('span');
861
+ arrow.className = 'pipeline-inline__arrow';
862
+ arrow.setAttribute('aria-hidden', 'true');
863
+ arrow.textContent = '\u2192';
864
+ stepsRow.appendChild(arrow);
865
+ }
866
+ var stepEl = document.createElement('div');
867
+ stepEl.className = 'pipeline-inline__step';
868
+ stepEl.setAttribute('title', step.desc);
869
+
870
+ var num = document.createElement('span');
871
+ num.className = 'pipeline-inline__num';
872
+ num.textContent = i + 1;
873
+ stepEl.appendChild(num);
874
+
875
+ var title = document.createElement('span');
876
+ title.className = 'pipeline-inline__title';
877
+ title.textContent = step.title;
878
+ stepEl.appendChild(title);
879
+
880
+ stepsRow.appendChild(stepEl);
881
+ });
882
+
883
+ pipeline.appendChild(stepsRow);
884
+ panel.appendChild(pipeline);
885
+ });
791
886
  }
792
887
 
793
888
  // ========================================================================
package/site/content.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "url": "https://agent-sh.github.io/agentsys",
6
6
  "repo": "https://github.com/agent-sh/agentsys",
7
7
  "npm": "https://www.npmjs.com/package/agentsys",
8
- "version": "5.8.0",
8
+ "version": "5.8.1",
9
9
  "author": "Avi Fenesh",
10
10
  "author_url": "https://github.com/avifenesh"
11
11
  },
@@ -43,7 +43,7 @@
43
43
  "suffix": ""
44
44
  },
45
45
  {
46
- "value": "3,445",
46
+ "value": "3,750",
47
47
  "label": "Tests",
48
48
  "suffix": ""
49
49
  },
@@ -112,7 +112,7 @@
112
112
  {
113
113
  "name": "/agnix",
114
114
  "tagline": "Lint agent configs before they break",
115
- "description": "342 validation rules (102 auto-fixable) for Skills, Memory, Hooks, MCP, and Plugins across 10+ AI tools including Claude Code, Cursor, GitHub Copilot, Codex CLI, OpenCode, Gemini CLI, Cline, Windsurf, Roo Code, and Amp. SARIF output for GitHub Code Scanning.",
115
+ "description": "385 validation rules (102 auto-fixable) for Skills, Memory, Hooks, MCP, and Plugins across 10+ AI tools including Claude Code, Cursor, GitHub Copilot, Codex CLI, OpenCode, Gemini CLI, Cline, Windsurf, Roo Code, and Amp. SARIF output for GitHub Code Scanning.",
116
116
  "example": "/agnix --fix",
117
117
  "category": "linting"
118
118
  },
@@ -427,7 +427,7 @@
427
427
  "highlights": [
428
428
  "Agent-analyzer Phase 1 - git intelligence with 21 queries",
429
429
  "Repo-intel integration across 11 plugins",
430
- "agnix v0.16.0 - 342 validation rules"
430
+ "agnix v0.16.0 - 385 validation rules"
431
431
  ]
432
432
  },
433
433
  {
@@ -505,7 +505,7 @@
505
505
  ],
506
506
  "research": {
507
507
  "knowledge_base": "8,000 lines of curated documentation from Anthropic, OpenAI, Google, and Microsoft",
508
- "testing": "3,445 tests passing",
508
+ "testing": "3,750 tests passing",
509
509
  "drift_detect_repos": "1,000+ repositories validated",
510
510
  "token_reduction": "77% fewer tokens for drift-detect vs multi-agent approaches"
511
511
  },
package/site/index.html CHANGED
@@ -4,12 +4,12 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>AgentSys - Agent Runtime &amp; Orchestration System</title>
7
- <meta name="description" content="A modular runtime and orchestration system for AI agents. 15 plugins, 35 agents, 32 skills — structured pipelines for Claude Code, OpenCode, Codex CLI, Cursor, and Kiro.">
7
+ <meta name="description" content="A modular runtime and orchestration system for AI agents. 19 plugins, 47 agents, 40 skills — structured pipelines for Claude Code, OpenCode, Codex CLI, Cursor, and Kiro.">
8
8
  <meta name="theme-color" content="#09090b">
9
9
 
10
10
  <!-- Open Graph -->
11
11
  <meta property="og:title" content="AgentSys">
12
- <meta property="og:description" content="A modular runtime and orchestration system for AI agents. 15 plugins, 35 agents, 32 skills.">
12
+ <meta property="og:description" content="A modular runtime and orchestration system for AI agents. 19 plugins, 47 agents, 40 skills.">
13
13
  <meta property="og:image" content="https://agent-sh.github.io/agentsys/assets/logo.png">
14
14
  <meta property="og:url" content="https://agent-sh.github.io/agentsys/">
15
15
  <meta property="og:type" content="website">
@@ -17,7 +17,7 @@
17
17
  <!-- Twitter Card -->
18
18
  <meta name="twitter:card" content="summary_large_image">
19
19
  <meta name="twitter:title" content="AgentSys">
20
- <meta name="twitter:description" content="AI workflow automation. 15 plugins, 35 agents, 32 skills.">
20
+ <meta name="twitter:description" content="AI workflow automation. 19 plugins, 47 agents, 40 skills.">
21
21
  <meta name="twitter:image" content="https://agent-sh.github.io/agentsys/assets/logo.png">
22
22
 
23
23
  <!-- Content Security Policy -->
@@ -72,7 +72,6 @@
72
72
 
73
73
  <div class="nav__links" id="nav-links">
74
74
  <a href="#commands" class="nav__link" data-section="commands">Commands</a>
75
- <a href="#how-it-works" class="nav__link" data-section="how-it-works">How It Works</a>
76
75
  <a href="#agents-skills" class="nav__link" data-section="agents-skills">Agents</a>
77
76
  <a href="#install" class="nav__link" data-section="install">Install</a>
78
77
  </div>
@@ -96,7 +95,6 @@
96
95
  <div class="mobile-menu" id="mobile-menu" role="dialog" aria-label="Navigation menu" aria-hidden="true">
97
96
  <div class="mobile-menu__inner">
98
97
  <a href="#commands" class="mobile-menu__link">Commands</a>
99
- <a href="#how-it-works" class="mobile-menu__link">How It Works</a>
100
98
  <a href="#agents-skills" class="mobile-menu__link">Agents</a>
101
99
  <a href="#install" class="mobile-menu__link">Install</a>
102
100
  <a href="https://github.com/agent-sh/agentsys" class="mobile-menu__link" target="_blank" rel="noopener noreferrer">GitHub</a>
@@ -109,7 +107,7 @@
109
107
  <div class="hero__inner">
110
108
  <div class="hero__content">
111
109
  <div class="hero__badge anim-fade-in" data-delay="100">
112
- 15 plugins &middot; 35 agents &middot; 32 skills
110
+ 19 plugins &middot; 47 agents &middot; 40 skills
113
111
  </div>
114
112
  <h1 class="hero__title anim-fade-up" id="hero-title" data-delay="200">
115
113
  A modular <span class="text-gradient">runtime and orchestration system</span><br>
@@ -158,15 +156,15 @@
158
156
  <section class="stats" id="stats" aria-label="Project statistics">
159
157
  <div class="stats__inner">
160
158
  <div class="stats__item">
161
- <span class="stats__number" aria-live="polite" data-target="14">0</span>
159
+ <span class="stats__number" aria-live="polite" data-target="19">0</span>
162
160
  <span class="stats__label">Plugins</span>
163
161
  </div>
164
162
  <div class="stats__item">
165
- <span class="stats__number" aria-live="polite" data-target="43">0</span>
163
+ <span class="stats__number" aria-live="polite" data-target="47">0</span>
166
164
  <span class="stats__label">Agents</span>
167
165
  </div>
168
166
  <div class="stats__item">
169
- <span class="stats__number" aria-live="polite" data-target="30">0</span>
167
+ <span class="stats__number" aria-live="polite" data-target="40">0</span>
170
168
  <span class="stats__label">Skills</span>
171
169
  </div>
172
170
  <div class="stats__item">
@@ -179,7 +177,7 @@
179
177
  <!-- ===== COMMANDS ===== -->
180
178
  <section class="commands" id="commands" aria-labelledby="commands-title">
181
179
  <div class="commands__inner">
182
- <h2 class="commands__title anim-fade-up" id="commands-title">13 Commands. One Toolkit.</h2>
180
+ <h2 class="commands__title anim-fade-up" id="commands-title">20 Commands. One Toolkit.</h2>
183
181
  <p class="commands__subtitle anim-fade-up" data-delay="100">Each works standalone. Together, they automate everything.</p>
184
182
 
185
183
  <div class="commands__tabs anim-fade-up" data-delay="200">
@@ -198,6 +196,12 @@
198
196
  <button class="tabs__tab" role="tab" aria-selected="false" aria-controls="tab-panel-11" id="tab-11" tabindex="-1" data-index="11">/consult</button>
199
197
  <button class="tabs__tab" role="tab" aria-selected="false" aria-controls="tab-panel-12" id="tab-12" tabindex="-1" data-index="12">/debate</button>
200
198
  <button class="tabs__tab" role="tab" aria-selected="false" aria-controls="tab-panel-13" id="tab-13" tabindex="-1" data-index="13">/web-ctl</button>
199
+ <button class="tabs__tab" role="tab" aria-selected="false" aria-controls="tab-panel-14" id="tab-14" tabindex="-1" data-index="14">/prepare-delivery</button>
200
+ <button class="tabs__tab" role="tab" aria-selected="false" aria-controls="tab-panel-15" id="tab-15" tabindex="-1" data-index="15">/gate-and-ship</button>
201
+ <button class="tabs__tab" role="tab" aria-selected="false" aria-controls="tab-panel-16" id="tab-16" tabindex="-1" data-index="16">/release</button>
202
+ <button class="tabs__tab" role="tab" aria-selected="false" aria-controls="tab-panel-17" id="tab-17" tabindex="-1" data-index="17">/skillers</button>
203
+ <button class="tabs__tab" role="tab" aria-selected="false" aria-controls="tab-panel-18" id="tab-18" tabindex="-1" data-index="18">/onboard</button>
204
+ <button class="tabs__tab" role="tab" aria-selected="false" aria-controls="tab-panel-19" id="tab-19" tabindex="-1" data-index="19">/can-i-help</button>
201
205
  </div>
202
206
 
203
207
  <!-- Tab panels -->
@@ -224,9 +228,9 @@
224
228
  <h3 class="tabs__panel-name">/agnix</h3>
225
229
  <p class="tabs__panel-tagline">Lint agent configs before they break</p>
226
230
  <ul class="tabs__panel-features">
227
- <li>155 validation rules across 28 categories</li>
231
+ <li>385 validation rules across 36 categories</li>
228
232
  <li>10+ AI tools: Claude Code, Cursor, Copilot, Codex, OpenCode, Gemini CLI</li>
229
- <li>57 auto-fixable rules with --fix flag</li>
233
+ <li>102 auto-fixable rules with --fix flag</li>
230
234
  <li>SARIF output for GitHub Code Scanning</li>
231
235
  </ul>
232
236
  <div class="code-block">
@@ -466,52 +470,119 @@
466
470
  <span class="code-prompt">$</span> /web-ctl auth github --url https://github.com/login <span class="code-comment"># Auth handoff</span></code></pre>
467
471
  </div>
468
472
  </div>
469
- </div>
470
- </div>
471
- </section>
472
473
 
473
- <!-- ===== SCROLL CUE ===== -->
474
- <div class="scroll-cue anim-fade-up" data-delay="300">
475
- <a href="#how-it-works" class="scroll-cue__link" aria-label="Scroll to How It Works">
476
- <span class="scroll-cue__text">How It Works</span>
477
- <svg class="scroll-cue__arrow" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14"/><path d="m19 12-7 7-7-7"/></svg>
478
- </a>
479
- </div>
480
-
481
- <!-- ===== HOW IT WORKS ===== -->
482
- <section class="how-it-works" id="how-it-works" aria-labelledby="hiw-title">
483
- <div class="how-it-works__inner">
484
- <h2 class="how-it-works__title anim-fade-up" id="hiw-title">How It Works</h2>
485
- <p class="how-it-works__subtitle anim-fade-up" data-delay="100" id="hiw-subtitle" aria-live="polite" aria-atomic="true">One approval. Fully autonomous execution.</p>
474
+ <div class="tabs__panel" role="tabpanel" id="tab-panel-14" aria-labelledby="tab-14" hidden>
475
+ <h3 class="tabs__panel-name">/prepare-delivery</h3>
476
+ <p class="tabs__panel-tagline">Pre-ship quality gates</p>
477
+ <ul class="tabs__panel-features">
478
+ <li>Deslop, simplify, review loop, delivery validation, docs sync</li>
479
+ <li>Conditional agnix + enhance for config changes</li>
480
+ <li>Works standalone or as part of /next-task</li>
481
+ <li>Does not ship - use /gate-and-ship for full pipeline</li>
482
+ </ul>
483
+ <div class="code-block">
484
+ <button class="code-block__copy" aria-label="Copy code to clipboard" data-code="/prepare-delivery # Run all quality gates
485
+ /prepare-delivery --skip-review # Skip review loop">
486
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"/></svg>
487
+ </button>
488
+ <pre><code><span class="code-prompt">$</span> /prepare-delivery <span class="code-comment"># Run all quality gates</span>
489
+ <span class="code-prompt">$</span> /prepare-delivery --skip-review <span class="code-comment"># Skip review loop</span></code></pre>
490
+ </div>
491
+ </div>
486
492
 
487
- <div class="steps" aria-live="polite" aria-atomic="true">
488
- <div class="steps__card anim-fade-up" data-delay="0">
489
- <span class="steps__number">1</span>
490
- <svg class="steps__icon" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></svg>
491
- <h3 class="steps__card-title">Pick a task</h3>
492
- <p class="steps__card-desc">Select from GitHub Issues, GitLab, or a local task file. The agent explores your codebase and designs a plan.</p>
493
+ <div class="tabs__panel" role="tabpanel" id="tab-panel-15" aria-labelledby="tab-15" hidden>
494
+ <h3 class="tabs__panel-name">/gate-and-ship</h3>
495
+ <p class="tabs__panel-tagline">Quality gates then ship</p>
496
+ <ul class="tabs__panel-features">
497
+ <li>Chains /prepare-delivery then /ship</li>
498
+ <li>One command from code-complete to merged PR</li>
499
+ <li>All flags forwarded to sub-commands</li>
500
+ <li>Each piece runs independently too</li>
501
+ </ul>
502
+ <div class="code-block">
503
+ <button class="code-block__copy" aria-label="Copy code to clipboard" data-code="/gate-and-ship # Full pipeline
504
+ /gate-and-ship --base=develop # Custom base branch">
505
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"/></svg>
506
+ </button>
507
+ <pre><code><span class="code-prompt">$</span> /gate-and-ship <span class="code-comment"># Full pipeline</span>
508
+ <span class="code-prompt">$</span> /gate-and-ship --base=develop <span class="code-comment"># Custom base branch</span></code></pre>
509
+ </div>
493
510
  </div>
494
511
 
495
- <div class="steps__connector" aria-hidden="true">
496
- <svg width="40" height="2" viewBox="0 0 40 2"><line x1="0" y1="1" x2="40" y2="1" stroke="currentColor" stroke-dasharray="4 4"/></svg>
512
+ <div class="tabs__panel" role="tabpanel" id="tab-panel-16" aria-labelledby="tab-16" hidden>
513
+ <h3 class="tabs__panel-name">/release</h3>
514
+ <p class="tabs__panel-tagline">Versioned release with ecosystem detection</p>
515
+ <ul class="tabs__panel-features">
516
+ <li>Auto-detects: npm, cargo, go, python, maven, gradle</li>
517
+ <li>Discovers release tools (semantic-release, goreleaser, etc.)</li>
518
+ <li>Pre-release health check with repo-intel</li>
519
+ <li>Tag, publish, create GitHub release</li>
520
+ </ul>
521
+ <div class="code-block">
522
+ <button class="code-block__copy" aria-label="Copy code to clipboard" data-code="/release # Create release
523
+ /release --dry-run # Preview without publishing">
524
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"/></svg>
525
+ </button>
526
+ <pre><code><span class="code-prompt">$</span> /release <span class="code-comment"># Create release</span>
527
+ <span class="code-prompt">$</span> /release --dry-run <span class="code-comment"># Preview without publishing</span></code></pre>
528
+ </div>
497
529
  </div>
498
530
 
499
- <div class="steps__card anim-fade-up" data-delay="150">
500
- <span class="steps__number">2</span>
501
- <svg class="steps__icon" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
502
- <h3 class="steps__card-title">Approve the plan</h3>
503
- <p class="steps__card-desc">Review the implementation plan. This is the last human interaction. Everything after is automated.</p>
531
+ <div class="tabs__panel" role="tabpanel" id="tab-panel-17" aria-labelledby="tab-17" hidden>
532
+ <h3 class="tabs__panel-name">/skillers</h3>
533
+ <p class="tabs__panel-tagline">Learn from your workflow patterns</p>
534
+ <ul class="tabs__panel-features">
535
+ <li>Reads transcripts from Claude Code, Codex, OpenCode</li>
536
+ <li>Clusters patterns into themed knowledge</li>
537
+ <li>Suggests skills, hooks, and agents to automate repetitive work</li>
538
+ <li>No per-turn overhead - works from saved transcripts</li>
539
+ </ul>
540
+ <div class="code-block">
541
+ <button class="code-block__copy" aria-label="Copy code to clipboard" data-code="/skillers # Analyze workflow patterns
542
+ /skillers compact # Compact transcripts into knowledge">
543
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"/></svg>
544
+ </button>
545
+ <pre><code><span class="code-prompt">$</span> /skillers <span class="code-comment"># Analyze workflow patterns</span>
546
+ <span class="code-prompt">$</span> /skillers compact <span class="code-comment"># Compact transcripts into knowledge</span></code></pre>
547
+ </div>
504
548
  </div>
505
549
 
506
- <div class="steps__connector" aria-hidden="true">
507
- <svg width="40" height="2" viewBox="0 0 40 2"><line x1="0" y1="1" x2="40" y2="1" stroke="currentColor" stroke-dasharray="4 4"/></svg>
550
+ <div class="tabs__panel" role="tabpanel" id="tab-panel-18" aria-labelledby="tab-18" hidden>
551
+ <h3 class="tabs__panel-name">/onboard</h3>
552
+ <p class="tabs__panel-tagline">Codebase orientation for newcomers</p>
553
+ <ul class="tabs__panel-features">
554
+ <li>Automated project data collection</li>
555
+ <li>Interactive guided tour of the codebase</li>
556
+ <li>Identifies key files, patterns, conventions</li>
557
+ <li>Works on any codebase - no setup required</li>
558
+ </ul>
559
+ <div class="code-block">
560
+ <button class="code-block__copy" aria-label="Copy code to clipboard" data-code="/onboard # Full onboarding tour
561
+ /onboard --quick # Quick overview">
562
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"/></svg>
563
+ </button>
564
+ <pre><code><span class="code-prompt">$</span> /onboard <span class="code-comment"># Full onboarding tour</span>
565
+ <span class="code-prompt">$</span> /onboard --quick <span class="code-comment"># Quick overview</span></code></pre>
566
+ </div>
508
567
  </div>
509
568
 
510
- <div class="steps__card anim-fade-up" data-delay="300">
511
- <span class="steps__number">3</span>
512
- <svg class="steps__icon" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"/><path d="m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"/><path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"/><path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"/></svg>
513
- <h3 class="steps__card-title">Watch it ship</h3>
514
- <p class="steps__card-desc">Code, review, cleanup, documentation, PR, CI, merge. All handled. You review the result.</p>
569
+ <div class="tabs__panel" role="tabpanel" id="tab-panel-19" aria-labelledby="tab-19" hidden>
570
+ <h3 class="tabs__panel-name">/can-i-help</h3>
571
+ <p class="tabs__panel-tagline">Find where to contribute</p>
572
+ <ul class="tabs__panel-features">
573
+ <li>Matches developer skills to project needs</li>
574
+ <li>Finds test gaps, stale docs, open issues</li>
575
+ <li>Good-first-task identification</li>
576
+ <li>Uses repo-intel for data-driven suggestions</li>
577
+ </ul>
578
+ <div class="code-block">
579
+ <button class="code-block__copy" aria-label="Copy code to clipboard" data-code="/can-i-help # Find contribution opportunities
580
+ /can-i-help --skills=typescript # Match specific skills">
581
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"/></svg>
582
+ </button>
583
+ <pre><code><span class="code-prompt">$</span> /can-i-help <span class="code-comment"># Find contribution opportunities</span>
584
+ <span class="code-prompt">$</span> /can-i-help --skills=typescript <span class="code-comment"># Match specific skills</span></code></pre>
585
+ </div>
515
586
  </div>
516
587
  </div>
517
588
  </div>
@@ -536,7 +607,7 @@
536
607
  <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="3"/></svg>
537
608
  </div>
538
609
  <h3 class="philosophy__card-title">One agent, one job, done well</h3>
539
- <p class="philosophy__card-desc"><span class="text-accent">43 specialized agents</span>, each with a narrow scope and clear success criteria. No agent tries to do everything.</p>
610
+ <p class="philosophy__card-desc"><span class="text-accent">47 specialized agents</span>, each with a narrow scope and clear success criteria. No agent tries to do everything.</p>
540
611
  </div>
541
612
  <div class="philosophy__card anim-fade-up" data-delay="200">
542
613
  <div class="philosophy__card-icon">
@@ -591,14 +662,14 @@
591
662
  <!-- ===== AGENTS & SKILLS ===== -->
592
663
  <section class="agents-skills" id="agents-skills" aria-labelledby="as-title">
593
664
  <div class="agents-skills__inner">
594
- <h2 class="agents-skills__title anim-fade-up" id="as-title">43 Agents. 30 Skills.</h2>
665
+ <h2 class="agents-skills__title anim-fade-up" id="as-title">47 Agents. 40 Skills.</h2>
595
666
  <p class="agents-skills__subtitle anim-fade-up" data-delay="100">Right model for the task. Opus reasons. Sonnet validates. Haiku executes.</p>
596
667
 
597
668
  <!-- Agent tier tabs -->
598
669
  <div class="agents-skills__tabs anim-fade-up" data-delay="200">
599
670
  <div class="agent-tabs" role="tablist" aria-label="Agent tiers">
600
- <button class="agent-tabs__tab agent-tabs__tab--active" role="tab" aria-selected="true" aria-controls="agent-tier-opus" id="agent-tab-opus" data-index="0">Opus <span class="agent-tabs__count">14</span></button>
601
- <button class="agent-tabs__tab" role="tab" aria-selected="false" aria-controls="agent-tier-sonnet" id="agent-tab-sonnet" tabindex="-1" data-index="1">Sonnet <span class="agent-tabs__count">15</span></button>
671
+ <button class="agent-tabs__tab agent-tabs__tab--active" role="tab" aria-selected="true" aria-controls="agent-tier-opus" id="agent-tab-opus" data-index="0">Opus <span class="agent-tabs__count">15</span></button>
672
+ <button class="agent-tabs__tab" role="tab" aria-selected="false" aria-controls="agent-tier-sonnet" id="agent-tab-sonnet" tabindex="-1" data-index="1">Sonnet <span class="agent-tabs__count">18</span></button>
602
673
  <button class="agent-tabs__tab" role="tab" aria-selected="false" aria-controls="agent-tier-haiku" id="agent-tab-haiku" tabindex="-1" data-index="2">Haiku <span class="agent-tabs__count">4</span></button>
603
674
  <button class="agent-tabs__tab" role="tab" aria-selected="false" aria-controls="agent-tier-specialists" id="agent-tab-specialists" tabindex="-1" data-index="3">Specialists <span class="agent-tabs__count">10</span></button>
604
675
  </div>
@@ -620,6 +691,7 @@
620
691
  <div class="agent-card"><span class="agent-card__name">prompt-enhancer</span><span class="tier-badge tier-badge--opus">opus</span><p class="agent-card__desc">Prompt engineering best practices</p></div>
621
692
  <div class="agent-card"><span class="agent-card__name">skills-enhancer</span><span class="tier-badge tier-badge--opus">opus</span><p class="agent-card__desc">Skill definition quality analysis</p></div>
622
693
  <div class="agent-card"><span class="agent-card__name">debate-orchestrator</span><span class="tier-badge tier-badge--opus">opus</span><p class="agent-card__desc">Structured adversarial debate coordination</p></div>
694
+ <div class="agent-card"><span class="agent-card__name">skillers-recommender</span><span class="tier-badge tier-badge--opus">opus</span><p class="agent-card__desc">Workflow pattern analysis and automation suggestions</p></div>
623
695
  </div>
624
696
  </div>
625
697
 
@@ -641,6 +713,9 @@
641
713
  <div class="agent-card"><span class="agent-card__name">agnix-agent</span><span class="tier-badge tier-badge--sonnet">sonnet</span><p class="agent-card__desc">Agent config linting orchestration</p></div>
642
714
  <div class="agent-card"><span class="agent-card__name">consult-agent</span><span class="tier-badge tier-badge--sonnet">sonnet</span><p class="agent-card__desc">Cross-tool AI consultation orchestration</p></div>
643
715
  <div class="agent-card"><span class="agent-card__name">web-session</span><span class="tier-badge tier-badge--sonnet">sonnet</span><p class="agent-card__desc">Browser automation and session management</p></div>
716
+ <div class="agent-card"><span class="agent-card__name">skillers-compactor</span><span class="tier-badge tier-badge--sonnet">sonnet</span><p class="agent-card__desc">Transcript compaction into knowledge themes</p></div>
717
+ <div class="agent-card"><span class="agent-card__name">release-agent</span><span class="tier-badge tier-badge--sonnet">sonnet</span><p class="agent-card__desc">Versioned release with ecosystem detection</p></div>
718
+ <div class="agent-card"><span class="agent-card__name">onboard-agent</span><span class="tier-badge tier-badge--sonnet">sonnet</span><p class="agent-card__desc">Codebase orientation and guided onboarding</p></div>
644
719
  </div>
645
720
  </div>
646
721
 
@@ -672,19 +747,21 @@
672
747
  </div>
673
748
 
674
749
  <!-- Skills grid -->
675
- <h3 class="agents-skills__skills-title anim-fade-up" data-delay="300">30 Skills across 14 Plugins</h3>
750
+ <h3 class="agents-skills__skills-title anim-fade-up" data-delay="300">40 Skills across 19 Plugins</h3>
676
751
  <div class="skills-grid anim-fade-up" data-delay="350">
677
752
  <div class="skill-group">
678
- <span class="skill-group__label">next-task</span>
753
+ <span class="skill-group__label">prepare-delivery</span>
679
754
  <div class="skill-group__items">
755
+ <span class="skill-card">prepare-delivery</span>
756
+ <span class="skill-card">check-test-coverage</span>
680
757
  <span class="skill-card">orchestrate-review</span>
681
- <span class="skill-card">discover-tasks</span>
682
758
  <span class="skill-card">validate-delivery</span>
683
759
  </div>
684
760
  </div>
685
761
  <div class="skill-group">
686
762
  <span class="skill-group__label">enhance</span>
687
763
  <div class="skill-group__items">
764
+ <span class="skill-card">enhance-orchestrator</span>
688
765
  <span class="skill-card">enhance-agents</span>
689
766
  <span class="skill-card">enhance-claudemd</span>
690
767
  <span class="skill-card">enhance-docs</span>
@@ -702,25 +779,54 @@
702
779
  <span class="skill-card">benchmark</span>
703
780
  <span class="skill-card">profile</span>
704
781
  <span class="skill-card">theory-tester</span>
705
- <span class="skill-card">code-paths</span>
706
782
  <span class="skill-card">theory-gatherer</span>
783
+ <span class="skill-card">code-paths</span>
707
784
  <span class="skill-card">investigation-logger</span>
708
785
  <span class="skill-card">perf-analyzer</span>
709
786
  </div>
710
787
  </div>
711
788
  <div class="skill-group">
712
- <span class="skill-group__label">other plugins</span>
789
+ <span class="skill-group__label">next-task</span>
790
+ <div class="skill-group__items">
791
+ <span class="skill-card">discover-tasks</span>
792
+ </div>
793
+ </div>
794
+ <div class="skill-group">
795
+ <span class="skill-group__label">web-ctl</span>
796
+ <div class="skill-group__items">
797
+ <span class="skill-card">web-auth</span>
798
+ <span class="skill-card">web-browse</span>
799
+ </div>
800
+ </div>
801
+ <div class="skill-group">
802
+ <span class="skill-group__label">skillers</span>
803
+ <div class="skill-group__items">
804
+ <span class="skill-card">recommend</span>
805
+ <span class="skill-card">skillers-compact</span>
806
+ </div>
807
+ </div>
808
+ <div class="skill-group">
809
+ <span class="skill-group__label">single-skill plugins</span>
713
810
  <div class="skill-group__items">
714
811
  <span class="skill-card">deslop</span>
715
812
  <span class="skill-card">drift-analysis</span>
716
813
  <span class="skill-card">repo-intel</span>
717
814
  <span class="skill-card">sync-docs</span>
718
- <span class="skill-card">learn-topic</span>
719
- <span class="skill-card">agnix-lint</span>
815
+ <span class="skill-card">learn</span>
720
816
  <span class="skill-card">consult</span>
721
817
  <span class="skill-card">debate</span>
722
- <span class="skill-card">web-auth</span>
723
- <span class="skill-card">web-browse</span>
818
+ <span class="skill-card">release</span>
819
+ <span class="skill-card">onboard</span>
820
+ <span class="skill-card">can-i-help</span>
821
+ <span class="skill-card">audit-project</span>
822
+ </div>
823
+ </div>
824
+ <div class="skill-group">
825
+ <span class="skill-group__label">glidemq</span>
826
+ <div class="skill-group__items">
827
+ <span class="skill-card">glide-mq</span>
828
+ <span class="skill-card">glide-mq-migrate-bullmq</span>
829
+ <span class="skill-card">glide-mq-migrate-bee</span>
724
830
  </div>
725
831
  </div>
726
832
  </div>