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,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Structure Patterns
|
|
3
|
+
* Detection patterns for plugin.json and structure issues
|
|
4
|
+
*
|
|
5
|
+
* @author Avi Fenesh
|
|
6
|
+
* @license MIT
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Plugin structure patterns with certainty levels
|
|
11
|
+
* Following the slop-patterns model
|
|
12
|
+
*/
|
|
13
|
+
const pluginPatterns = {
|
|
14
|
+
/**
|
|
15
|
+
* Missing additionalProperties in schema
|
|
16
|
+
* HIGH certainty - always fixable
|
|
17
|
+
*/
|
|
18
|
+
missing_additional_properties: {
|
|
19
|
+
id: 'missing_additional_properties',
|
|
20
|
+
category: 'tool',
|
|
21
|
+
certainty: 'HIGH',
|
|
22
|
+
autoFix: true,
|
|
23
|
+
description: 'Schema missing additionalProperties: false',
|
|
24
|
+
check: (schema) => {
|
|
25
|
+
if (!schema || typeof schema !== 'object') return null;
|
|
26
|
+
if (schema.type === 'object' && schema.properties) {
|
|
27
|
+
if (schema.additionalProperties !== false) {
|
|
28
|
+
return {
|
|
29
|
+
issue: 'Missing additionalProperties: false',
|
|
30
|
+
fix: 'Add "additionalProperties": false to schema',
|
|
31
|
+
autoFixFn: (s) => ({ ...s, additionalProperties: false })
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Missing required array in schema
|
|
41
|
+
* HIGH certainty - fixable by adding all properties
|
|
42
|
+
*/
|
|
43
|
+
missing_required_fields: {
|
|
44
|
+
id: 'missing_required_fields',
|
|
45
|
+
category: 'tool',
|
|
46
|
+
certainty: 'HIGH',
|
|
47
|
+
autoFix: true,
|
|
48
|
+
description: 'Schema missing required field declarations',
|
|
49
|
+
check: (schema) => {
|
|
50
|
+
if (!schema || typeof schema !== 'object') return null;
|
|
51
|
+
if (schema.type === 'object' && schema.properties) {
|
|
52
|
+
const propKeys = Object.keys(schema.properties);
|
|
53
|
+
if (propKeys.length > 0 && (!schema.required || schema.required.length === 0)) {
|
|
54
|
+
return {
|
|
55
|
+
issue: 'No required fields declared',
|
|
56
|
+
fix: 'Add required array with all mandatory fields'
|
|
57
|
+
// autoFixFn is provided by plugin-analyzer which uses fixer.fixRequiredFields
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Version mismatch between plugin.json and package.json
|
|
67
|
+
* HIGH certainty - fixable by syncing
|
|
68
|
+
*/
|
|
69
|
+
version_mismatch: {
|
|
70
|
+
id: 'version_mismatch',
|
|
71
|
+
category: 'structure',
|
|
72
|
+
certainty: 'HIGH',
|
|
73
|
+
autoFix: true,
|
|
74
|
+
description: 'Version mismatch between plugin.json and package.json',
|
|
75
|
+
check: (pluginJson, packageJson) => {
|
|
76
|
+
if (!pluginJson || !packageJson) return null;
|
|
77
|
+
if (pluginJson.version !== packageJson.version) {
|
|
78
|
+
return {
|
|
79
|
+
issue: `Version mismatch: plugin.json (${pluginJson.version}) vs package.json (${packageJson.version})`,
|
|
80
|
+
fix: 'Sync versions',
|
|
81
|
+
autoFixFn: (pj) => ({ ...pj, version: packageJson.version })
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Missing tool description
|
|
90
|
+
* HIGH certainty - must have description
|
|
91
|
+
*/
|
|
92
|
+
missing_tool_description: {
|
|
93
|
+
id: 'missing_tool_description',
|
|
94
|
+
category: 'tool',
|
|
95
|
+
certainty: 'HIGH',
|
|
96
|
+
autoFix: false,
|
|
97
|
+
description: 'Tool definition missing description',
|
|
98
|
+
check: (tool) => {
|
|
99
|
+
if (!tool || typeof tool !== 'object') return null;
|
|
100
|
+
if (!tool.description || tool.description.trim() === '') {
|
|
101
|
+
return {
|
|
102
|
+
issue: 'Missing tool description',
|
|
103
|
+
fix: 'Add descriptive description field'
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Deeply nested parameter structure
|
|
112
|
+
* MEDIUM certainty - may be intentional
|
|
113
|
+
*/
|
|
114
|
+
deep_nesting: {
|
|
115
|
+
id: 'deep_nesting',
|
|
116
|
+
category: 'tool',
|
|
117
|
+
certainty: 'MEDIUM',
|
|
118
|
+
autoFix: false,
|
|
119
|
+
description: 'Parameter schema too deeply nested (>2 levels)',
|
|
120
|
+
maxDepth: 2,
|
|
121
|
+
check: (schema, depth = 0) => {
|
|
122
|
+
if (!schema || typeof schema !== 'object') return null;
|
|
123
|
+
if (depth > 2) {
|
|
124
|
+
return {
|
|
125
|
+
issue: `Schema nested ${depth} levels deep (max: 2)`,
|
|
126
|
+
fix: 'Flatten parameter structure'
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Check nested properties
|
|
130
|
+
if (schema.properties) {
|
|
131
|
+
for (const prop of Object.values(schema.properties)) {
|
|
132
|
+
const nested = pluginPatterns.deep_nesting.check(prop, depth + 1);
|
|
133
|
+
if (nested) return nested;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Tool description too long
|
|
142
|
+
* MEDIUM certainty - affects token efficiency
|
|
143
|
+
*/
|
|
144
|
+
long_description: {
|
|
145
|
+
id: 'long_description',
|
|
146
|
+
category: 'tool',
|
|
147
|
+
certainty: 'MEDIUM',
|
|
148
|
+
autoFix: false,
|
|
149
|
+
description: 'Tool description exceeds 500 characters',
|
|
150
|
+
maxLength: 500,
|
|
151
|
+
check: (tool) => {
|
|
152
|
+
if (!tool || typeof tool !== 'object') return null;
|
|
153
|
+
if (tool.description && tool.description.length > 500) {
|
|
154
|
+
return {
|
|
155
|
+
issue: `Description too long (${tool.description.length} chars, max: 500)`,
|
|
156
|
+
fix: 'Shorten description for token efficiency'
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Missing parameter descriptions
|
|
165
|
+
* MEDIUM certainty - improves clarity
|
|
166
|
+
*/
|
|
167
|
+
missing_param_description: {
|
|
168
|
+
id: 'missing_param_description',
|
|
169
|
+
category: 'tool',
|
|
170
|
+
certainty: 'MEDIUM',
|
|
171
|
+
autoFix: false,
|
|
172
|
+
description: 'Parameter missing description',
|
|
173
|
+
check: (schema) => {
|
|
174
|
+
if (!schema || !schema.properties) return null;
|
|
175
|
+
const missing = [];
|
|
176
|
+
for (const [name, prop] of Object.entries(schema.properties)) {
|
|
177
|
+
if (!prop.description || prop.description.trim() === '') {
|
|
178
|
+
missing.push(name);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (missing.length > 0) {
|
|
182
|
+
return {
|
|
183
|
+
issue: `Parameters missing descriptions: ${missing.join(', ')}`,
|
|
184
|
+
fix: 'Add descriptions to all parameters'
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Too many tools in plugin
|
|
193
|
+
* LOW certainty - advisory
|
|
194
|
+
*/
|
|
195
|
+
tool_overexposure: {
|
|
196
|
+
id: 'tool_overexposure',
|
|
197
|
+
category: 'structure',
|
|
198
|
+
certainty: 'LOW',
|
|
199
|
+
autoFix: false,
|
|
200
|
+
description: 'Plugin exposes many tools (consider splitting)',
|
|
201
|
+
maxTools: 10,
|
|
202
|
+
check: (pluginJson) => {
|
|
203
|
+
if (!pluginJson) return null;
|
|
204
|
+
const toolCount = (pluginJson.commands?.length || 0) + (pluginJson.agents?.length || 0);
|
|
205
|
+
if (toolCount > 10) {
|
|
206
|
+
return {
|
|
207
|
+
issue: `Plugin has ${toolCount} tools/commands (consider splitting)`,
|
|
208
|
+
fix: 'Consider splitting into multiple focused plugins'
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Missing required plugin.json fields
|
|
217
|
+
* HIGH certainty
|
|
218
|
+
*/
|
|
219
|
+
missing_required_plugin_fields: {
|
|
220
|
+
id: 'missing_required_plugin_fields',
|
|
221
|
+
category: 'structure',
|
|
222
|
+
certainty: 'HIGH',
|
|
223
|
+
autoFix: false,
|
|
224
|
+
description: 'Plugin.json missing required fields',
|
|
225
|
+
requiredFields: ['name', 'version', 'description'],
|
|
226
|
+
check: (pluginJson) => {
|
|
227
|
+
if (!pluginJson) return null;
|
|
228
|
+
const missing = [];
|
|
229
|
+
for (const field of pluginPatterns.missing_required_plugin_fields.requiredFields) {
|
|
230
|
+
if (!pluginJson[field]) {
|
|
231
|
+
missing.push(field);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (missing.length > 0) {
|
|
235
|
+
return {
|
|
236
|
+
issue: `Missing required fields: ${missing.join(', ')}`,
|
|
237
|
+
fix: 'Add required fields to plugin.json'
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Invalid version format
|
|
246
|
+
* HIGH certainty
|
|
247
|
+
*/
|
|
248
|
+
invalid_version_format: {
|
|
249
|
+
id: 'invalid_version_format',
|
|
250
|
+
category: 'structure',
|
|
251
|
+
certainty: 'HIGH',
|
|
252
|
+
autoFix: false,
|
|
253
|
+
description: 'Version does not follow semver format',
|
|
254
|
+
check: (pluginJson) => {
|
|
255
|
+
if (!pluginJson || !pluginJson.version) return null;
|
|
256
|
+
const semverRegex = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?(\+[a-zA-Z0-9.]+)?$/;
|
|
257
|
+
if (!semverRegex.test(pluginJson.version)) {
|
|
258
|
+
return {
|
|
259
|
+
issue: `Invalid version format: ${pluginJson.version}`,
|
|
260
|
+
fix: 'Use semver format (e.g., 1.0.0)'
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Get all patterns
|
|
270
|
+
* @returns {Object} All plugin patterns
|
|
271
|
+
*/
|
|
272
|
+
function getAllPatterns() {
|
|
273
|
+
return pluginPatterns;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Get patterns by certainty level
|
|
278
|
+
* @param {string} certainty - HIGH, MEDIUM, or LOW
|
|
279
|
+
* @returns {Object} Filtered patterns
|
|
280
|
+
*/
|
|
281
|
+
function getPatternsByCertainty(certainty) {
|
|
282
|
+
const result = {};
|
|
283
|
+
for (const [name, pattern] of Object.entries(pluginPatterns)) {
|
|
284
|
+
if (pattern.certainty === certainty) {
|
|
285
|
+
result[name] = pattern;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Get patterns by category
|
|
293
|
+
* @param {string} category - tool, structure, security
|
|
294
|
+
* @returns {Object} Filtered patterns
|
|
295
|
+
*/
|
|
296
|
+
function getPatternsByCategory(category) {
|
|
297
|
+
const result = {};
|
|
298
|
+
for (const [name, pattern] of Object.entries(pluginPatterns)) {
|
|
299
|
+
if (pattern.category === category) {
|
|
300
|
+
result[name] = pattern;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return result;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Get auto-fixable patterns
|
|
308
|
+
* @returns {Object} Patterns with autoFix: true
|
|
309
|
+
*/
|
|
310
|
+
function getAutoFixablePatterns() {
|
|
311
|
+
const result = {};
|
|
312
|
+
for (const [name, pattern] of Object.entries(pluginPatterns)) {
|
|
313
|
+
if (pattern.autoFix) {
|
|
314
|
+
result[name] = pattern;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return result;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
module.exports = {
|
|
321
|
+
pluginPatterns,
|
|
322
|
+
getAllPatterns,
|
|
323
|
+
getPatternsByCertainty,
|
|
324
|
+
getPatternsByCategory,
|
|
325
|
+
getAutoFixablePatterns
|
|
326
|
+
};
|