agentsys 5.0.3 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +21 -14
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +18 -0
- package/README.md +7 -6
- package/adapters/codex/skills/agnix/SKILL.md +0 -1
- package/adapters/codex/skills/audit-project/SKILL.md +0 -1
- package/adapters/codex/skills/audit-project-agents/SKILL.md +0 -1
- package/adapters/codex/skills/audit-project-github/SKILL.md +0 -1
- package/adapters/codex/skills/consult/SKILL.md +132 -57
- package/adapters/codex/skills/debate/SKILL.md +214 -0
- package/adapters/codex/skills/delivery-approval/SKILL.md +0 -1
- package/adapters/codex/skills/deslop/SKILL.md +0 -1
- package/adapters/codex/skills/drift-detect/SKILL.md +0 -1
- package/adapters/codex/skills/enhance/SKILL.md +0 -1
- package/adapters/codex/skills/learn/SKILL.md +0 -1
- package/adapters/codex/skills/next-task/SKILL.md +0 -1
- package/adapters/codex/skills/perf/SKILL.md +0 -1
- package/adapters/codex/skills/repo-map/SKILL.md +0 -1
- package/adapters/codex/skills/ship/SKILL.md +0 -1
- package/adapters/codex/skills/ship-ci-review-loop/SKILL.md +0 -1
- package/adapters/codex/skills/ship-deployment/SKILL.md +0 -1
- package/adapters/codex/skills/ship-error-handling/SKILL.md +0 -1
- package/adapters/codex/skills/sync-docs/SKILL.md +0 -1
- package/adapters/opencode/agents/agent-enhancer.md +0 -1
- package/adapters/opencode/agents/agnix-agent.md +0 -1
- package/adapters/opencode/agents/ci-fixer.md +0 -1
- package/adapters/opencode/agents/ci-monitor.md +0 -1
- package/adapters/opencode/agents/claudemd-enhancer.md +0 -1
- package/adapters/opencode/agents/consult-agent.md +122 -30
- package/adapters/opencode/agents/cross-file-enhancer.md +0 -1
- package/adapters/opencode/agents/debate-orchestrator.md +169 -0
- package/adapters/opencode/agents/delivery-validator.md +0 -1
- package/adapters/opencode/agents/deslop-agent.md +0 -1
- package/adapters/opencode/agents/docs-enhancer.md +0 -1
- package/adapters/opencode/agents/exploration-agent.md +0 -1
- package/adapters/opencode/agents/hooks-enhancer.md +0 -1
- package/adapters/opencode/agents/implementation-agent.md +0 -1
- package/adapters/opencode/agents/learn-agent.md +0 -1
- package/adapters/opencode/agents/map-validator.md +0 -1
- package/adapters/opencode/agents/perf-analyzer.md +0 -1
- package/adapters/opencode/agents/perf-code-paths.md +0 -1
- package/adapters/opencode/agents/perf-investigation-logger.md +0 -1
- package/adapters/opencode/agents/perf-orchestrator.md +0 -1
- package/adapters/opencode/agents/perf-theory-gatherer.md +0 -1
- package/adapters/opencode/agents/perf-theory-tester.md +0 -1
- package/adapters/opencode/agents/plan-synthesizer.md +0 -1
- package/adapters/opencode/agents/planning-agent.md +0 -1
- package/adapters/opencode/agents/plugin-enhancer.md +0 -1
- package/adapters/opencode/agents/prompt-enhancer.md +0 -1
- package/adapters/opencode/agents/simple-fixer.md +0 -1
- package/adapters/opencode/agents/skills-enhancer.md +0 -1
- package/adapters/opencode/agents/sync-docs-agent.md +0 -1
- package/adapters/opencode/agents/task-discoverer.md +0 -1
- package/adapters/opencode/agents/test-coverage-checker.md +0 -1
- package/adapters/opencode/agents/worktree-manager.md +0 -1
- package/adapters/opencode/commands/agnix.md +0 -1
- package/adapters/opencode/commands/audit-project-agents.md +0 -1
- package/adapters/opencode/commands/audit-project-github.md +0 -1
- package/adapters/opencode/commands/audit-project.md +0 -1
- package/adapters/opencode/commands/consult.md +133 -57
- package/adapters/opencode/commands/debate.md +224 -0
- package/adapters/opencode/commands/delivery-approval.md +0 -1
- package/adapters/opencode/commands/deslop.md +0 -1
- package/adapters/opencode/commands/drift-detect.md +0 -1
- package/adapters/opencode/commands/enhance.md +0 -1
- package/adapters/opencode/commands/learn.md +0 -1
- package/adapters/opencode/commands/next-task.md +0 -1
- package/adapters/opencode/commands/perf.md +0 -1
- package/adapters/opencode/commands/repo-map.md +0 -1
- package/adapters/opencode/commands/ship-ci-review-loop.md +0 -1
- package/adapters/opencode/commands/ship-deployment.md +0 -1
- package/adapters/opencode/commands/ship-error-handling.md +0 -1
- package/adapters/opencode/commands/ship.md +0 -1
- package/adapters/opencode/commands/sync-docs.md +0 -1
- package/adapters/opencode/skills/agnix/SKILL.md +1 -2
- package/adapters/opencode/skills/consult/SKILL.md +33 -23
- package/adapters/opencode/skills/debate/SKILL.md +245 -0
- package/adapters/opencode/skills/deslop/SKILL.md +1 -2
- package/adapters/opencode/skills/discover-tasks/SKILL.md +1 -2
- package/adapters/opencode/skills/drift-analysis/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-agent-prompts/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-claude-memory/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-cross-file/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-docs/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-hooks/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-orchestrator/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-plugins/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-prompts/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-skills/SKILL.md +1 -2
- package/adapters/opencode/skills/learn/SKILL.md +1 -2
- package/adapters/opencode/skills/orchestrate-review/SKILL.md +0 -1
- package/adapters/opencode/skills/perf-analyzer/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-baseline-manager/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-benchmarker/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-code-paths/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-investigation-logger/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-profiler/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-theory-gatherer/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-theory-tester/SKILL.md +1 -2
- package/adapters/opencode/skills/repo-mapping/SKILL.md +1 -2
- package/adapters/opencode/skills/sync-docs/SKILL.md +1 -2
- package/adapters/opencode/skills/validate-delivery/SKILL.md +1 -2
- package/lib/adapter-transforms.js +24 -4
- package/package.json +1 -1
- package/plugins/agnix/.claude-plugin/plugin.json +1 -1
- package/plugins/agnix/skills/agnix/SKILL.md +1 -1
- package/plugins/audit-project/.claude-plugin/plugin.json +1 -1
- package/plugins/audit-project/lib/adapter-transforms.js +24 -4
- package/plugins/consult/.claude-plugin/plugin.json +1 -1
- package/plugins/consult/agents/consult-agent.md +122 -29
- package/plugins/consult/commands/consult.md +135 -58
- package/plugins/consult/skills/consult/SKILL.md +31 -20
- package/plugins/debate/.claude-plugin/plugin.json +21 -0
- package/plugins/debate/agents/debate-orchestrator.md +175 -0
- package/plugins/debate/commands/debate.md +221 -0
- package/plugins/debate/lib/adapter-transforms.js +298 -0
- package/plugins/debate/lib/collectors/codebase.js +392 -0
- package/plugins/debate/lib/collectors/docs-patterns.js +713 -0
- package/plugins/debate/lib/collectors/documentation.js +219 -0
- package/plugins/debate/lib/collectors/github.js +330 -0
- package/plugins/debate/lib/collectors/index.js +126 -0
- package/plugins/debate/lib/config/index.js +14 -0
- package/plugins/debate/lib/cross-platform/index.js +539 -0
- package/plugins/debate/lib/discovery/index.js +352 -0
- package/plugins/debate/lib/drift-detect/collectors.js +37 -0
- package/plugins/debate/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/debate/lib/enhance/agent-patterns.js +571 -0
- package/plugins/debate/lib/enhance/auto-suppression.js +622 -0
- package/plugins/debate/lib/enhance/benchmark.js +417 -0
- package/plugins/debate/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/debate/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/debate/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/debate/lib/enhance/docs-patterns.js +671 -0
- package/plugins/debate/lib/enhance/fixer.js +721 -0
- package/plugins/debate/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/debate/lib/enhance/hook-patterns.js +40 -0
- package/plugins/debate/lib/enhance/index.js +127 -0
- package/plugins/debate/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/debate/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/debate/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/debate/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/debate/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/debate/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/debate/lib/enhance/reporter.js +1348 -0
- package/plugins/debate/lib/enhance/security-patterns.js +284 -0
- package/plugins/debate/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/debate/lib/enhance/skill-patterns.js +147 -0
- package/plugins/debate/lib/enhance/suppression.js +352 -0
- package/plugins/debate/lib/enhance/tool-patterns.js +373 -0
- package/plugins/debate/lib/index.js +270 -0
- package/plugins/debate/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/debate/lib/patterns/pipeline.js +948 -0
- package/plugins/debate/lib/patterns/review-patterns.js +558 -0
- package/plugins/debate/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/debate/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/debate/lib/perf/analyzer/index.js +22 -0
- package/plugins/debate/lib/perf/argument-parser.js +105 -0
- package/plugins/debate/lib/perf/baseline-comparator.js +50 -0
- package/plugins/debate/lib/perf/baseline-store.js +127 -0
- package/plugins/debate/lib/perf/benchmark-runner.js +404 -0
- package/plugins/debate/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/debate/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/debate/lib/perf/checkpoint.js +123 -0
- package/plugins/debate/lib/perf/code-paths.js +86 -0
- package/plugins/debate/lib/perf/consolidation.js +37 -0
- package/plugins/debate/lib/perf/constraint-runner.js +71 -0
- package/plugins/debate/lib/perf/experiment-runner.js +32 -0
- package/plugins/debate/lib/perf/index.js +41 -0
- package/plugins/debate/lib/perf/investigation-state.js +874 -0
- package/plugins/debate/lib/perf/optimization-runner.js +79 -0
- package/plugins/debate/lib/perf/profilers/go.js +22 -0
- package/plugins/debate/lib/perf/profilers/index.js +46 -0
- package/plugins/debate/lib/perf/profilers/java.js +23 -0
- package/plugins/debate/lib/perf/profilers/node.js +27 -0
- package/plugins/debate/lib/perf/profilers/python.js +23 -0
- package/plugins/debate/lib/perf/profilers/rust.js +23 -0
- package/plugins/debate/lib/perf/profiling-runner.js +75 -0
- package/plugins/debate/lib/perf/schemas.js +140 -0
- package/plugins/debate/lib/platform/detect-platform.js +413 -0
- package/plugins/debate/lib/platform/detection-configs.js +93 -0
- package/plugins/debate/lib/platform/state-dir.js +132 -0
- package/plugins/debate/lib/platform/verify-tools.js +182 -0
- package/plugins/debate/lib/repo-map/cache.js +152 -0
- package/plugins/debate/lib/repo-map/concurrency.js +29 -0
- package/plugins/debate/lib/repo-map/index.js +222 -0
- package/plugins/debate/lib/repo-map/installer.js +212 -0
- package/plugins/debate/lib/repo-map/queries/go.js +27 -0
- package/plugins/debate/lib/repo-map/queries/index.js +100 -0
- package/plugins/debate/lib/repo-map/queries/java.js +38 -0
- package/plugins/debate/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/debate/lib/repo-map/queries/python.js +24 -0
- package/plugins/debate/lib/repo-map/queries/rust.js +73 -0
- package/plugins/debate/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/debate/lib/repo-map/runner.js +1364 -0
- package/plugins/debate/lib/repo-map/updater.js +562 -0
- package/plugins/debate/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/debate/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/debate/lib/schemas/validator.js +247 -0
- package/plugins/debate/lib/sources/custom-handler.js +199 -0
- package/plugins/debate/lib/sources/policy-questions.js +246 -0
- package/plugins/debate/lib/sources/source-cache.js +165 -0
- package/plugins/debate/lib/state/workflow-state.js +576 -0
- package/plugins/debate/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/debate/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/debate/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/debate/lib/types/index.d.ts +84 -0
- package/plugins/debate/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/debate/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/debate/lib/utils/atomic-write.js +94 -0
- package/plugins/debate/lib/utils/cache-manager.js +159 -0
- package/plugins/debate/lib/utils/command-parser.js +0 -0
- package/plugins/debate/lib/utils/context-optimizer.js +300 -0
- package/plugins/debate/lib/utils/deprecation.js +37 -0
- package/plugins/debate/lib/utils/shell-escape.js +88 -0
- package/plugins/debate/lib/utils/state-helpers.js +61 -0
- package/plugins/debate/skills/debate/SKILL.md +264 -0
- package/plugins/deslop/.claude-plugin/plugin.json +1 -1
- package/plugins/deslop/lib/adapter-transforms.js +24 -4
- package/plugins/deslop/skills/deslop/SKILL.md +1 -1
- package/plugins/drift-detect/.claude-plugin/plugin.json +1 -1
- package/plugins/drift-detect/lib/adapter-transforms.js +24 -4
- package/plugins/drift-detect/skills/drift-analysis/SKILL.md +1 -1
- package/plugins/enhance/.claude-plugin/plugin.json +1 -1
- package/plugins/enhance/lib/adapter-transforms.js +24 -4
- package/plugins/enhance/skills/enhance-agent-prompts/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-claude-memory/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-cross-file/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-docs/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-hooks/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-orchestrator/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-plugins/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-prompts/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-skills/SKILL.md +1 -1
- package/plugins/learn/.claude-plugin/plugin.json +1 -1
- package/plugins/learn/agents/learn-agent.md +1 -1
- package/plugins/learn/lib/adapter-transforms.js +24 -4
- package/plugins/learn/skills/learn/SKILL.md +1 -1
- package/plugins/next-task/.claude-plugin/plugin.json +1 -1
- package/plugins/next-task/agents/exploration-agent.md +1 -1
- package/plugins/next-task/lib/adapter-transforms.js +24 -4
- package/plugins/next-task/skills/discover-tasks/SKILL.md +1 -1
- package/plugins/next-task/skills/validate-delivery/SKILL.md +1 -1
- package/plugins/perf/.claude-plugin/plugin.json +1 -1
- package/plugins/perf/lib/adapter-transforms.js +24 -4
- package/plugins/perf/skills/perf-analyzer/SKILL.md +1 -1
- package/plugins/perf/skills/perf-baseline-manager/SKILL.md +1 -1
- package/plugins/perf/skills/perf-benchmarker/SKILL.md +1 -1
- package/plugins/perf/skills/perf-code-paths/SKILL.md +1 -1
- package/plugins/perf/skills/perf-investigation-logger/SKILL.md +1 -1
- package/plugins/perf/skills/perf-profiler/SKILL.md +1 -1
- package/plugins/perf/skills/perf-theory-gatherer/SKILL.md +1 -1
- package/plugins/perf/skills/perf-theory-tester/SKILL.md +1 -1
- package/plugins/repo-map/.claude-plugin/plugin.json +1 -1
- package/plugins/repo-map/lib/adapter-transforms.js +24 -4
- package/plugins/ship/.claude-plugin/plugin.json +1 -1
- package/plugins/ship/lib/adapter-transforms.js +24 -4
- package/plugins/sync-docs/.claude-plugin/plugin.json +1 -1
- package/plugins/sync-docs/lib/adapter-transforms.js +24 -4
- package/plugins/sync-docs/skills/sync-docs/SKILL.md +1 -1
- package/scripts/gen-adapters.js +6 -7
- package/scripts/generate-docs.js +4 -2
- package/scripts/plugins.txt +1 -0
- package/site/content.json +6 -6
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Prompt Patterns
|
|
3
|
+
* Detection patterns for agent prompt engineering best practices
|
|
4
|
+
*
|
|
5
|
+
* @author Avi Fenesh
|
|
6
|
+
* @license MIT
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Agent prompt patterns with certainty levels
|
|
11
|
+
* Following the plugin-patterns model
|
|
12
|
+
*/
|
|
13
|
+
const agentPatterns = {
|
|
14
|
+
/**
|
|
15
|
+
* Missing YAML frontmatter
|
|
16
|
+
* HIGH certainty - always fixable
|
|
17
|
+
*/
|
|
18
|
+
missing_frontmatter: {
|
|
19
|
+
id: 'missing_frontmatter',
|
|
20
|
+
category: 'structure',
|
|
21
|
+
certainty: 'HIGH',
|
|
22
|
+
autoFix: true,
|
|
23
|
+
description: 'Agent prompt missing YAML frontmatter (---...---)',
|
|
24
|
+
check: (content) => {
|
|
25
|
+
if (!content || typeof content !== 'string') return null;
|
|
26
|
+
|
|
27
|
+
// Check if frontmatter exists
|
|
28
|
+
const hasFrontmatter = content.trim().startsWith('---');
|
|
29
|
+
|
|
30
|
+
if (!hasFrontmatter) {
|
|
31
|
+
return {
|
|
32
|
+
issue: 'Missing YAML frontmatter',
|
|
33
|
+
fix: 'Add frontmatter with name, description, tools, model'
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Missing name field in frontmatter
|
|
42
|
+
* HIGH certainty - requires manual fix (name is context-dependent)
|
|
43
|
+
*/
|
|
44
|
+
missing_name: {
|
|
45
|
+
id: 'missing_name',
|
|
46
|
+
category: 'structure',
|
|
47
|
+
certainty: 'HIGH',
|
|
48
|
+
autoFix: false,
|
|
49
|
+
description: 'Frontmatter missing "name" field',
|
|
50
|
+
check: (frontmatter) => {
|
|
51
|
+
if (!frontmatter || typeof frontmatter !== 'object') return null;
|
|
52
|
+
|
|
53
|
+
if (!frontmatter.name || (typeof frontmatter.name === 'string' && frontmatter.name.trim() === '')) {
|
|
54
|
+
return {
|
|
55
|
+
issue: 'Frontmatter missing "name" field',
|
|
56
|
+
fix: 'Add "name" field to frontmatter'
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Missing description field in frontmatter
|
|
65
|
+
* HIGH certainty - requires manual fix (description is context-dependent)
|
|
66
|
+
*/
|
|
67
|
+
missing_description: {
|
|
68
|
+
id: 'missing_description',
|
|
69
|
+
category: 'structure',
|
|
70
|
+
certainty: 'HIGH',
|
|
71
|
+
autoFix: false,
|
|
72
|
+
description: 'Frontmatter missing "description" field',
|
|
73
|
+
check: (frontmatter) => {
|
|
74
|
+
if (!frontmatter || typeof frontmatter !== 'object') return null;
|
|
75
|
+
|
|
76
|
+
if (!frontmatter.description || (typeof frontmatter.description === 'string' && frontmatter.description.trim() === '')) {
|
|
77
|
+
return {
|
|
78
|
+
issue: 'Frontmatter missing "description" field',
|
|
79
|
+
fix: 'Add "description" field to frontmatter'
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Missing role section
|
|
88
|
+
* HIGH certainty - should have clear role definition
|
|
89
|
+
*/
|
|
90
|
+
missing_role: {
|
|
91
|
+
id: 'missing_role',
|
|
92
|
+
category: 'structure',
|
|
93
|
+
certainty: 'HIGH',
|
|
94
|
+
autoFix: true,
|
|
95
|
+
description: 'No role section ("You are..." or "## Role")',
|
|
96
|
+
check: (content) => {
|
|
97
|
+
if (!content || typeof content !== 'string') return null;
|
|
98
|
+
|
|
99
|
+
// Look for role indicators (various forms)
|
|
100
|
+
const hasYouAre = /you are/i.test(content);
|
|
101
|
+
const hasYouPerform = /you (?:perform|handle|execute|do|manage|coordinate|analyze|review|create|design|implement|validate|update|check|monitor)/i.test(content);
|
|
102
|
+
const hasRoleSection = /##\s+(?:your\s+)?role|\*\*(?:your\s+)?role\*\*/i.test(content);
|
|
103
|
+
|
|
104
|
+
if (!hasYouAre && !hasYouPerform && !hasRoleSection) {
|
|
105
|
+
return {
|
|
106
|
+
issue: 'Missing role definition',
|
|
107
|
+
fix: 'Add role section explaining agent purpose'
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Missing output format specification
|
|
116
|
+
* HIGH certainty - agents should specify output format
|
|
117
|
+
*/
|
|
118
|
+
missing_output_format: {
|
|
119
|
+
id: 'missing_output_format',
|
|
120
|
+
category: 'structure',
|
|
121
|
+
certainty: 'HIGH',
|
|
122
|
+
autoFix: false,
|
|
123
|
+
description: 'No output format specification',
|
|
124
|
+
check: (content) => {
|
|
125
|
+
if (!content || typeof content !== 'string') return null;
|
|
126
|
+
|
|
127
|
+
// Look for output format indicators
|
|
128
|
+
const hasOutputFormat = /##\s+output\s+format/i.test(content);
|
|
129
|
+
const hasFormatSection = /##\s+format/i.test(content);
|
|
130
|
+
const hasResponseFormat = /##\s+response/i.test(content);
|
|
131
|
+
|
|
132
|
+
if (!hasOutputFormat && !hasFormatSection && !hasResponseFormat) {
|
|
133
|
+
return {
|
|
134
|
+
issue: 'Missing output format specification',
|
|
135
|
+
fix: 'Add section specifying expected output format'
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Missing constraints section
|
|
144
|
+
* HIGH certainty - agents should have clear constraints
|
|
145
|
+
*/
|
|
146
|
+
missing_constraints: {
|
|
147
|
+
id: 'missing_constraints',
|
|
148
|
+
category: 'structure',
|
|
149
|
+
certainty: 'HIGH',
|
|
150
|
+
autoFix: false,
|
|
151
|
+
description: 'No constraints section',
|
|
152
|
+
check: (content) => {
|
|
153
|
+
if (!content || typeof content !== 'string') return null;
|
|
154
|
+
|
|
155
|
+
// Look for constraints indicators (H2 or H3)
|
|
156
|
+
const hasConstraints = /#{2,3}\s+constraints/i.test(content);
|
|
157
|
+
const hasDontSection = /#{2,3}\s+(?:what\s+)?(?:this\s+agent\s+)?(?:you\s+)?(?:must\s+)?not\s+do/i.test(content);
|
|
158
|
+
const hasRulesSection = /#{2,3}\s+rules/i.test(content);
|
|
159
|
+
const hasWorkflowGates = /#{2,3}\s+workflow\s+gates/i.test(content);
|
|
160
|
+
|
|
161
|
+
if (!hasConstraints && !hasDontSection && !hasRulesSection && !hasWorkflowGates) {
|
|
162
|
+
return {
|
|
163
|
+
issue: 'Missing constraints section',
|
|
164
|
+
fix: 'Add section defining agent limitations and boundaries'
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Unrestricted tools in frontmatter
|
|
173
|
+
* HIGH certainty - no tools field means all tools allowed
|
|
174
|
+
*/
|
|
175
|
+
unrestricted_tools: {
|
|
176
|
+
id: 'unrestricted_tools',
|
|
177
|
+
category: 'tool',
|
|
178
|
+
certainty: 'HIGH',
|
|
179
|
+
autoFix: false,
|
|
180
|
+
description: 'No "tools" field in frontmatter (all tools allowed)',
|
|
181
|
+
check: (frontmatter) => {
|
|
182
|
+
if (!frontmatter || typeof frontmatter !== 'object') return null;
|
|
183
|
+
|
|
184
|
+
if (!frontmatter.tools) {
|
|
185
|
+
return {
|
|
186
|
+
issue: 'No tools restriction - agent has access to all tools',
|
|
187
|
+
fix: 'Add "tools" field to frontmatter with specific tools needed'
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Unrestricted Bash tool
|
|
196
|
+
* HIGH certainty - Bash without restrictions is dangerous
|
|
197
|
+
*/
|
|
198
|
+
unrestricted_bash: {
|
|
199
|
+
id: 'unrestricted_bash',
|
|
200
|
+
category: 'tool',
|
|
201
|
+
certainty: 'HIGH',
|
|
202
|
+
autoFix: true,
|
|
203
|
+
description: 'Has "Bash" without restrictions (should be "Bash(git:*)" etc)',
|
|
204
|
+
check: (frontmatter) => {
|
|
205
|
+
if (!frontmatter || typeof frontmatter !== 'object') return null;
|
|
206
|
+
|
|
207
|
+
if (frontmatter.tools) {
|
|
208
|
+
const toolsArray = Array.isArray(frontmatter.tools)
|
|
209
|
+
? frontmatter.tools
|
|
210
|
+
: frontmatter.tools.split(',').map(t => t.trim());
|
|
211
|
+
|
|
212
|
+
const hasUnrestrictedBash = toolsArray.some(t =>
|
|
213
|
+
t === 'Bash' || t === 'bash'
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
if (hasUnrestrictedBash) {
|
|
217
|
+
return {
|
|
218
|
+
issue: 'Unrestricted Bash access',
|
|
219
|
+
fix: 'Replace "Bash" with "Bash(git:*)" or specific scope'
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Missing XML structure for complex data
|
|
229
|
+
* MEDIUM certainty - beneficial for structured prompts
|
|
230
|
+
*/
|
|
231
|
+
missing_xml_structure: {
|
|
232
|
+
id: 'missing_xml_structure',
|
|
233
|
+
category: 'xml',
|
|
234
|
+
certainty: 'MEDIUM',
|
|
235
|
+
autoFix: false,
|
|
236
|
+
description: 'Could benefit from XML tags for structure',
|
|
237
|
+
check: (content) => {
|
|
238
|
+
if (!content || typeof content !== 'string') return null;
|
|
239
|
+
|
|
240
|
+
// Check if content is complex enough to benefit from XML
|
|
241
|
+
const sectionCount = (content.match(/##\s+/g) || []).length;
|
|
242
|
+
const hasLists = /^\s*[-*]\s+/m.test(content);
|
|
243
|
+
const hasCodeBlocks = /```/g.test(content);
|
|
244
|
+
|
|
245
|
+
// If complex but no XML tags
|
|
246
|
+
if (sectionCount >= 5 || (hasLists && hasCodeBlocks)) {
|
|
247
|
+
const hasXML = /<\w+>/.test(content);
|
|
248
|
+
|
|
249
|
+
if (!hasXML) {
|
|
250
|
+
return {
|
|
251
|
+
issue: 'Complex prompt without XML structure',
|
|
252
|
+
fix: 'Consider using XML tags for key sections (e.g., <rules>, <examples>)'
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Unnecessary step-by-step reasoning
|
|
262
|
+
* MEDIUM certainty - step-by-step on simple tasks
|
|
263
|
+
*/
|
|
264
|
+
unnecessary_cot: {
|
|
265
|
+
id: 'unnecessary_cot',
|
|
266
|
+
category: 'cot',
|
|
267
|
+
certainty: 'MEDIUM',
|
|
268
|
+
autoFix: false,
|
|
269
|
+
description: 'Step-by-step reasoning on simple tasks',
|
|
270
|
+
check: (content) => {
|
|
271
|
+
if (!content || typeof content !== 'string') return null;
|
|
272
|
+
|
|
273
|
+
// Look for step-by-step language
|
|
274
|
+
const hasStepByStep = /step[- ]by[- ]step/i.test(content);
|
|
275
|
+
const hasThinkingTags = /<thinking>/i.test(content);
|
|
276
|
+
|
|
277
|
+
// Check if task is simple (short prompt, few sections)
|
|
278
|
+
const wordCount = content.split(/\s+/).length;
|
|
279
|
+
const sectionCount = (content.match(/##\s+/g) || []).length;
|
|
280
|
+
|
|
281
|
+
if ((hasStepByStep || hasThinkingTags) && wordCount < 500 && sectionCount < 4) {
|
|
282
|
+
return {
|
|
283
|
+
issue: 'Unnecessary chain-of-thought for simple task',
|
|
284
|
+
fix: 'Remove step-by-step instructions for straightforward operations'
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Missing chain-of-thought for complex reasoning
|
|
293
|
+
* MEDIUM certainty - complex tasks benefit from CoT
|
|
294
|
+
*/
|
|
295
|
+
missing_cot: {
|
|
296
|
+
id: 'missing_cot',
|
|
297
|
+
category: 'cot',
|
|
298
|
+
certainty: 'MEDIUM',
|
|
299
|
+
autoFix: false,
|
|
300
|
+
description: 'Complex reasoning without thinking guidance',
|
|
301
|
+
check: (content) => {
|
|
302
|
+
if (!content || typeof content !== 'string') return null;
|
|
303
|
+
|
|
304
|
+
// Check if task is complex
|
|
305
|
+
const wordCount = content.split(/\s+/).length;
|
|
306
|
+
const sectionCount = (content.match(/##\s+/g) || []).length;
|
|
307
|
+
const hasAnalysis = /analy[sz]e|evaluate|assess|review/i.test(content);
|
|
308
|
+
|
|
309
|
+
// Look for CoT indicators
|
|
310
|
+
const hasStepByStep = /step[- ]by[- ]step/i.test(content);
|
|
311
|
+
const hasThinkingTags = /<thinking>/i.test(content);
|
|
312
|
+
const hasReasoningGuidance = /reasoning|think\s+through/i.test(content);
|
|
313
|
+
|
|
314
|
+
if (wordCount > 1000 && sectionCount >= 5 && hasAnalysis) {
|
|
315
|
+
if (!hasStepByStep && !hasThinkingTags && !hasReasoningGuidance) {
|
|
316
|
+
return {
|
|
317
|
+
issue: 'Complex task without reasoning guidance',
|
|
318
|
+
fix: 'Add chain-of-thought instructions or <thinking> tags'
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Suboptimal example count
|
|
328
|
+
* LOW certainty - 2-5 examples is generally optimal
|
|
329
|
+
*/
|
|
330
|
+
example_count_suboptimal: {
|
|
331
|
+
id: 'example_count_suboptimal',
|
|
332
|
+
category: 'example',
|
|
333
|
+
certainty: 'LOW',
|
|
334
|
+
autoFix: false,
|
|
335
|
+
description: 'Not 2-5 examples',
|
|
336
|
+
check: (content) => {
|
|
337
|
+
if (!content || typeof content !== 'string') return null;
|
|
338
|
+
|
|
339
|
+
// Count example sections
|
|
340
|
+
const exampleCount = (content.match(/##\s+example/gi) || []).length;
|
|
341
|
+
const goodExample = (content.match(/<good[- ]?example>/gi) || []).length;
|
|
342
|
+
const badExample = (content.match(/<bad[- ]?example>/gi) || []).length;
|
|
343
|
+
|
|
344
|
+
const totalExamples = exampleCount + goodExample + badExample;
|
|
345
|
+
|
|
346
|
+
if (totalExamples > 0 && (totalExamples < 2 || totalExamples > 5)) {
|
|
347
|
+
return {
|
|
348
|
+
issue: `Found ${totalExamples} examples (optimal: 2-5)`,
|
|
349
|
+
fix: totalExamples < 2
|
|
350
|
+
? 'Consider adding more examples for clarity'
|
|
351
|
+
: 'Consider reducing examples to avoid token bloat'
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Vague instructions
|
|
360
|
+
* MEDIUM certainty - fuzzy language reduces effectiveness
|
|
361
|
+
*/
|
|
362
|
+
vague_instructions: {
|
|
363
|
+
id: 'vague_instructions',
|
|
364
|
+
category: 'anti-pattern',
|
|
365
|
+
certainty: 'MEDIUM',
|
|
366
|
+
autoFix: false,
|
|
367
|
+
description: 'Fuzzy language like "usually", "sometimes"',
|
|
368
|
+
check: (content) => {
|
|
369
|
+
if (!content || typeof content !== 'string') return null;
|
|
370
|
+
|
|
371
|
+
// Look for vague words
|
|
372
|
+
const vagueWords = [
|
|
373
|
+
'usually', 'sometimes', 'often', 'rarely', 'maybe',
|
|
374
|
+
'might', 'could', 'should probably', 'try to',
|
|
375
|
+
'as much as possible', 'if possible'
|
|
376
|
+
];
|
|
377
|
+
|
|
378
|
+
const found = [];
|
|
379
|
+
for (const word of vagueWords) {
|
|
380
|
+
const regex = new RegExp(`\\b${word}\\b`, 'gi');
|
|
381
|
+
if (regex.test(content)) {
|
|
382
|
+
found.push(word);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (found.length > 3) {
|
|
387
|
+
return {
|
|
388
|
+
issue: `Found vague language: ${found.slice(0, 3).join(', ')}...`,
|
|
389
|
+
fix: 'Replace fuzzy language with clear, definitive instructions'
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Prompt bloat
|
|
398
|
+
* LOW certainty - long prompts use more tokens
|
|
399
|
+
*/
|
|
400
|
+
prompt_bloat: {
|
|
401
|
+
id: 'prompt_bloat',
|
|
402
|
+
category: 'anti-pattern',
|
|
403
|
+
certainty: 'LOW',
|
|
404
|
+
autoFix: false,
|
|
405
|
+
description: 'Token count > 2000',
|
|
406
|
+
maxTokens: 2000,
|
|
407
|
+
check: (content) => {
|
|
408
|
+
if (!content || typeof content !== 'string') return null;
|
|
409
|
+
|
|
410
|
+
// Rough token estimate (1 token ≈ 4 characters)
|
|
411
|
+
const estimatedTokens = Math.ceil(content.length / 4);
|
|
412
|
+
|
|
413
|
+
if (estimatedTokens > 2000) {
|
|
414
|
+
return {
|
|
415
|
+
issue: `Prompt ~${estimatedTokens} tokens (max recommended: 2000)`,
|
|
416
|
+
fix: 'Simplify prompt, remove redundant sections, or use XML for compression'
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
|
|
423
|
+
// ============================================
|
|
424
|
+
// CROSS-PLATFORM COMPATIBILITY PATTERNS
|
|
425
|
+
// ============================================
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Hardcoded .claude/ state directory
|
|
429
|
+
* HIGH certainty - breaks OpenCode/Codex
|
|
430
|
+
*/
|
|
431
|
+
hardcoded_claude_dir: {
|
|
432
|
+
id: 'hardcoded_claude_dir',
|
|
433
|
+
category: 'cross-platform',
|
|
434
|
+
certainty: 'HIGH',
|
|
435
|
+
autoFix: false,
|
|
436
|
+
description: 'Hardcoded .claude/ directory (breaks OpenCode/Codex)',
|
|
437
|
+
check: (content) => {
|
|
438
|
+
if (!content || typeof content !== 'string') return null;
|
|
439
|
+
|
|
440
|
+
// Look for hardcoded .claude/ references
|
|
441
|
+
const hasHardcoded = /\.claude\//.test(content);
|
|
442
|
+
// Exclude if using AI_STATE_DIR
|
|
443
|
+
const usesEnvVar = /AI_STATE_DIR|\$\{.*STATE.*\}/i.test(content);
|
|
444
|
+
|
|
445
|
+
if (hasHardcoded && !usesEnvVar) {
|
|
446
|
+
return {
|
|
447
|
+
issue: 'Hardcoded .claude/ directory path',
|
|
448
|
+
fix: 'Use AI_STATE_DIR env var or platform detection for cross-platform support'
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
return null;
|
|
452
|
+
}
|
|
453
|
+
},
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* CLAUDE.md reference without AGENTS.md
|
|
457
|
+
* MEDIUM certainty - OpenCode/Codex use AGENTS.md
|
|
458
|
+
*/
|
|
459
|
+
claude_md_reference: {
|
|
460
|
+
id: 'claude_md_reference',
|
|
461
|
+
category: 'cross-platform',
|
|
462
|
+
certainty: 'MEDIUM',
|
|
463
|
+
autoFix: false,
|
|
464
|
+
description: 'References CLAUDE.md without also checking AGENTS.md',
|
|
465
|
+
check: (content) => {
|
|
466
|
+
if (!content || typeof content !== 'string') return null;
|
|
467
|
+
|
|
468
|
+
const hasClaudeMd = /CLAUDE\.md/i.test(content);
|
|
469
|
+
const hasAgentsMd = /AGENTS\.md/i.test(content);
|
|
470
|
+
|
|
471
|
+
// Only flag if mentions CLAUDE.md but not AGENTS.md
|
|
472
|
+
if (hasClaudeMd && !hasAgentsMd) {
|
|
473
|
+
return {
|
|
474
|
+
issue: 'References CLAUDE.md without AGENTS.md',
|
|
475
|
+
fix: 'Also check for AGENTS.md (used by OpenCode/Codex)'
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
return null;
|
|
479
|
+
}
|
|
480
|
+
},
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Missing XML for cross-model compatibility
|
|
484
|
+
* LOW certainty - XML helps both Claude and GPT-4
|
|
485
|
+
*/
|
|
486
|
+
no_xml_for_data: {
|
|
487
|
+
id: 'no_xml_for_data',
|
|
488
|
+
category: 'cross-platform',
|
|
489
|
+
certainty: 'LOW',
|
|
490
|
+
autoFix: false,
|
|
491
|
+
description: 'Data blocks without XML tags (helps both Claude and GPT-4)',
|
|
492
|
+
check: (content) => {
|
|
493
|
+
if (!content || typeof content !== 'string') return null;
|
|
494
|
+
|
|
495
|
+
// Check if has code blocks or lists but no XML
|
|
496
|
+
const hasCodeBlocks = /```[\s\S]+?```/.test(content);
|
|
497
|
+
const hasLists = /^[-*]\s+.+$/m.test(content);
|
|
498
|
+
const hasXML = /<\w+>[\s\S]*?<\/\w+>/.test(content);
|
|
499
|
+
const sectionCount = (content.match(/^##\s+/gm) || []).length;
|
|
500
|
+
|
|
501
|
+
// Complex content without XML
|
|
502
|
+
if ((hasCodeBlocks || hasLists) && sectionCount >= 4 && !hasXML) {
|
|
503
|
+
return {
|
|
504
|
+
issue: 'Complex content without XML tags',
|
|
505
|
+
fix: 'Wrap data blocks in XML tags (e.g., <context>, <rules>) for cross-model compatibility'
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
return null;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Get all patterns
|
|
515
|
+
* @returns {Object} All agent patterns
|
|
516
|
+
*/
|
|
517
|
+
function getAllPatterns() {
|
|
518
|
+
return agentPatterns;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* Get patterns by certainty level
|
|
523
|
+
* @param {string} certainty - HIGH, MEDIUM, or LOW
|
|
524
|
+
* @returns {Object} Filtered patterns
|
|
525
|
+
*/
|
|
526
|
+
function getPatternsByCertainty(certainty) {
|
|
527
|
+
const result = {};
|
|
528
|
+
for (const [name, pattern] of Object.entries(agentPatterns)) {
|
|
529
|
+
if (pattern.certainty === certainty) {
|
|
530
|
+
result[name] = pattern;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
return result;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* Get patterns by category
|
|
538
|
+
* @param {string} category - structure, tool, xml, cot, example, anti-pattern
|
|
539
|
+
* @returns {Object} Filtered patterns
|
|
540
|
+
*/
|
|
541
|
+
function getPatternsByCategory(category) {
|
|
542
|
+
const result = {};
|
|
543
|
+
for (const [name, pattern] of Object.entries(agentPatterns)) {
|
|
544
|
+
if (pattern.category === category) {
|
|
545
|
+
result[name] = pattern;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return result;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Get auto-fixable patterns
|
|
553
|
+
* @returns {Object} Patterns with autoFix: true
|
|
554
|
+
*/
|
|
555
|
+
function getAutoFixablePatterns() {
|
|
556
|
+
const result = {};
|
|
557
|
+
for (const [name, pattern] of Object.entries(agentPatterns)) {
|
|
558
|
+
if (pattern.autoFix) {
|
|
559
|
+
result[name] = pattern;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
return result;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
module.exports = {
|
|
566
|
+
agentPatterns,
|
|
567
|
+
getAllPatterns,
|
|
568
|
+
getPatternsByCertainty,
|
|
569
|
+
getPatternsByCategory,
|
|
570
|
+
getAutoFixablePatterns
|
|
571
|
+
};
|