agentsys 5.0.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/.agnix.toml +49 -0
- package/.claude-plugin/marketplace.json +110 -0
- package/.claude-plugin/plugin.json +20 -0
- package/AGENTS.md +260 -0
- package/CHANGELOG.md +190 -0
- package/LICENSE +21 -0
- package/README.md +916 -0
- package/SECURITY.md +45 -0
- package/adapters/README.md +258 -0
- package/adapters/codex/README.md +273 -0
- package/adapters/codex/install.sh +260 -0
- package/adapters/codex/skills/agnix/SKILL.md +138 -0
- package/adapters/codex/skills/audit-project/SKILL.md +334 -0
- package/adapters/codex/skills/audit-project-agents/SKILL.md +459 -0
- package/adapters/codex/skills/audit-project-github/SKILL.md +146 -0
- package/adapters/codex/skills/consult/SKILL.md +245 -0
- package/adapters/codex/skills/delivery-approval/SKILL.md +339 -0
- package/adapters/codex/skills/deslop/SKILL.md +167 -0
- package/adapters/codex/skills/drift-detect/SKILL.md +268 -0
- package/adapters/codex/skills/enhance/SKILL.md +177 -0
- package/adapters/codex/skills/learn/SKILL.md +188 -0
- package/adapters/codex/skills/next-task/SKILL.md +546 -0
- package/adapters/codex/skills/perf/SKILL.md +469 -0
- package/adapters/codex/skills/repo-map/SKILL.md +132 -0
- package/adapters/codex/skills/ship/SKILL.md +491 -0
- package/adapters/codex/skills/ship-ci-review-loop/SKILL.md +473 -0
- package/adapters/codex/skills/ship-deployment/SKILL.md +336 -0
- package/adapters/codex/skills/ship-error-handling/SKILL.md +260 -0
- package/adapters/codex/skills/sync-docs/SKILL.md +186 -0
- package/adapters/opencode/README.md +302 -0
- package/adapters/opencode/agents/agent-enhancer.md +65 -0
- package/adapters/opencode/agents/agnix-agent.md +56 -0
- package/adapters/opencode/agents/ci-fixer.md +104 -0
- package/adapters/opencode/agents/ci-monitor.md +127 -0
- package/adapters/opencode/agents/claudemd-enhancer.md +66 -0
- package/adapters/opencode/agents/consult-agent.md +124 -0
- package/adapters/opencode/agents/cross-file-enhancer.md +54 -0
- package/adapters/opencode/agents/delivery-validator.md +115 -0
- package/adapters/opencode/agents/deslop-agent.md +88 -0
- package/adapters/opencode/agents/docs-enhancer.md +65 -0
- package/adapters/opencode/agents/exploration-agent.md +143 -0
- package/adapters/opencode/agents/hooks-enhancer.md +66 -0
- package/adapters/opencode/agents/implementation-agent.md +206 -0
- package/adapters/opencode/agents/learn-agent.md +279 -0
- package/adapters/opencode/agents/map-validator.md +65 -0
- package/adapters/opencode/agents/perf-analyzer.md +40 -0
- package/adapters/opencode/agents/perf-code-paths.md +12 -0
- package/adapters/opencode/agents/perf-investigation-logger.md +44 -0
- package/adapters/opencode/agents/perf-orchestrator.md +147 -0
- package/adapters/opencode/agents/perf-theory-gatherer.md +18 -0
- package/adapters/opencode/agents/perf-theory-tester.md +43 -0
- package/adapters/opencode/agents/plan-synthesizer.md +229 -0
- package/adapters/opencode/agents/planning-agent.md +235 -0
- package/adapters/opencode/agents/plugin-enhancer.md +64 -0
- package/adapters/opencode/agents/prompt-enhancer.md +58 -0
- package/adapters/opencode/agents/simple-fixer.md +107 -0
- package/adapters/opencode/agents/skills-enhancer.md +66 -0
- package/adapters/opencode/agents/sync-docs-agent.md +153 -0
- package/adapters/opencode/agents/task-discoverer.md +80 -0
- package/adapters/opencode/agents/test-coverage-checker.md +144 -0
- package/adapters/opencode/agents/worktree-manager.md +209 -0
- package/adapters/opencode/commands/agnix.md +106 -0
- package/adapters/opencode/commands/audit-project-agents.md +125 -0
- package/adapters/opencode/commands/audit-project-github.md +145 -0
- package/adapters/opencode/commands/audit-project.md +268 -0
- package/adapters/opencode/commands/consult.md +252 -0
- package/adapters/opencode/commands/delivery-approval.md +212 -0
- package/adapters/opencode/commands/deslop.md +132 -0
- package/adapters/opencode/commands/drift-detect.md +173 -0
- package/adapters/opencode/commands/enhance.md +183 -0
- package/adapters/opencode/commands/learn.md +116 -0
- package/adapters/opencode/commands/next-task.md +393 -0
- package/adapters/opencode/commands/perf.md +49 -0
- package/adapters/opencode/commands/repo-map.md +69 -0
- package/adapters/opencode/commands/ship-ci-review-loop.md +334 -0
- package/adapters/opencode/commands/ship-deployment.md +336 -0
- package/adapters/opencode/commands/ship-error-handling.md +248 -0
- package/adapters/opencode/commands/ship.md +371 -0
- package/adapters/opencode/commands/sync-docs.md +108 -0
- package/adapters/opencode/install.sh +322 -0
- package/adapters/opencode/skills/agnix/SKILL.md +139 -0
- package/adapters/opencode/skills/consult/SKILL.md +292 -0
- package/adapters/opencode/skills/deslop/SKILL.md +169 -0
- package/adapters/opencode/skills/discover-tasks/SKILL.md +102 -0
- package/adapters/opencode/skills/drift-analysis/SKILL.md +279 -0
- package/adapters/opencode/skills/enhance-agent-prompts/SKILL.md +279 -0
- package/adapters/opencode/skills/enhance-claude-memory/SKILL.md +390 -0
- package/adapters/opencode/skills/enhance-cross-file/SKILL.md +112 -0
- package/adapters/opencode/skills/enhance-docs/SKILL.md +288 -0
- package/adapters/opencode/skills/enhance-hooks/SKILL.md +557 -0
- package/adapters/opencode/skills/enhance-orchestrator/SKILL.md +114 -0
- package/adapters/opencode/skills/enhance-plugins/SKILL.md +314 -0
- package/adapters/opencode/skills/enhance-prompts/SKILL.md +341 -0
- package/adapters/opencode/skills/enhance-skills/SKILL.md +443 -0
- package/adapters/opencode/skills/learn/SKILL.md +352 -0
- package/adapters/opencode/skills/orchestrate-review/SKILL.md +95 -0
- package/adapters/opencode/skills/perf-analyzer/SKILL.md +38 -0
- package/adapters/opencode/skills/perf-baseline-manager/SKILL.md +31 -0
- package/adapters/opencode/skills/perf-benchmarker/SKILL.md +49 -0
- package/adapters/opencode/skills/perf-code-paths/SKILL.md +33 -0
- package/adapters/opencode/skills/perf-investigation-logger/SKILL.md +42 -0
- package/adapters/opencode/skills/perf-profiler/SKILL.md +39 -0
- package/adapters/opencode/skills/perf-theory-gatherer/SKILL.md +36 -0
- package/adapters/opencode/skills/perf-theory-tester/SKILL.md +37 -0
- package/adapters/opencode/skills/repo-mapping/SKILL.md +86 -0
- package/adapters/opencode/skills/sync-docs/SKILL.md +246 -0
- package/adapters/opencode/skills/validate-delivery/SKILL.md +112 -0
- package/adapters/opencode-plugin/index.ts +346 -0
- package/adapters/opencode-plugin/package.json +21 -0
- package/agent-knowledge/AGENTS.md +62 -0
- package/agent-knowledge/ai-cli-advanced-integration-patterns.md +670 -0
- package/agent-knowledge/ai-cli-non-interactive-programmatic-usage.md +1394 -0
- package/agent-knowledge/resources/ai-cli-non-interactive-programmatic-usage-sources.json +500 -0
- package/bin/cli.js +719 -0
- package/bin/dev-cli.js +587 -0
- package/lib/adapter-transforms.js +278 -0
- package/lib/collectors/codebase.js +392 -0
- package/lib/collectors/docs-patterns.js +713 -0
- package/lib/collectors/documentation.js +219 -0
- package/lib/collectors/github.js +266 -0
- package/lib/collectors/index.js +126 -0
- package/lib/config/index.js +14 -0
- package/lib/cross-platform/index.js +539 -0
- package/lib/discovery/index.js +352 -0
- package/lib/drift-detect/collectors.js +37 -0
- package/lib/enhance/agent-analyzer.js +421 -0
- package/lib/enhance/agent-patterns.js +571 -0
- package/lib/enhance/auto-suppression.js +622 -0
- package/lib/enhance/benchmark.js +417 -0
- package/lib/enhance/cross-file-analyzer.js +930 -0
- package/lib/enhance/cross-file-patterns.js +370 -0
- package/lib/enhance/docs-analyzer.js +325 -0
- package/lib/enhance/docs-patterns.js +671 -0
- package/lib/enhance/fixer.js +721 -0
- package/lib/enhance/hook-analyzer.js +135 -0
- package/lib/enhance/hook-patterns.js +40 -0
- package/lib/enhance/index.js +127 -0
- package/lib/enhance/plugin-analyzer.js +402 -0
- package/lib/enhance/plugin-patterns.js +326 -0
- package/lib/enhance/projectmemory-analyzer.js +551 -0
- package/lib/enhance/projectmemory-patterns.js +617 -0
- package/lib/enhance/prompt-analyzer.js +457 -0
- package/lib/enhance/prompt-patterns.js +1484 -0
- package/lib/enhance/reporter.js +1348 -0
- package/lib/enhance/security-patterns.js +284 -0
- package/lib/enhance/skill-analyzer.js +182 -0
- package/lib/enhance/skill-patterns.js +147 -0
- package/lib/enhance/suppression.js +352 -0
- package/lib/enhance/tool-patterns.js +373 -0
- package/lib/index.js +270 -0
- package/lib/package.json +25 -0
- package/lib/patterns/cli-enhancers.js +611 -0
- package/lib/patterns/pipeline.js +948 -0
- package/lib/patterns/review-patterns.js +558 -0
- package/lib/patterns/slop-analyzers.js +2305 -0
- package/lib/patterns/slop-patterns.js +1187 -0
- package/lib/perf/analyzer/index.js +22 -0
- package/lib/perf/argument-parser.js +105 -0
- package/lib/perf/baseline-comparator.js +50 -0
- package/lib/perf/baseline-store.js +127 -0
- package/lib/perf/benchmark-runner.js +399 -0
- package/lib/perf/breaking-point-finder.js +52 -0
- package/lib/perf/breaking-point-runner.js +60 -0
- package/lib/perf/checkpoint.js +123 -0
- package/lib/perf/code-paths.js +86 -0
- package/lib/perf/consolidation.js +37 -0
- package/lib/perf/constraint-runner.js +71 -0
- package/lib/perf/experiment-runner.js +32 -0
- package/lib/perf/index.js +41 -0
- package/lib/perf/investigation-state.js +875 -0
- package/lib/perf/optimization-runner.js +79 -0
- package/lib/perf/profilers/go.js +22 -0
- package/lib/perf/profilers/index.js +46 -0
- package/lib/perf/profilers/java.js +23 -0
- package/lib/perf/profilers/node.js +27 -0
- package/lib/perf/profilers/python.js +23 -0
- package/lib/perf/profilers/rust.js +23 -0
- package/lib/perf/profiling-runner.js +56 -0
- package/lib/perf/schemas.js +140 -0
- package/lib/platform/detect-platform.js +413 -0
- package/lib/platform/detection-configs.js +93 -0
- package/lib/platform/state-dir.js +132 -0
- package/lib/platform/verify-tools.js +182 -0
- package/lib/repo-map/cache.js +152 -0
- package/lib/repo-map/index.js +222 -0
- package/lib/repo-map/installer.js +212 -0
- package/lib/repo-map/queries/go.js +27 -0
- package/lib/repo-map/queries/index.js +100 -0
- package/lib/repo-map/queries/java.js +38 -0
- package/lib/repo-map/queries/javascript.js +55 -0
- package/lib/repo-map/queries/python.js +24 -0
- package/lib/repo-map/queries/rust.js +73 -0
- package/lib/repo-map/queries/typescript.js +38 -0
- package/lib/repo-map/runner.js +1165 -0
- package/lib/repo-map/updater.js +474 -0
- package/lib/repo-map/usage-analyzer.js +407 -0
- package/lib/schemas/plugin-manifest.schema.json +57 -0
- package/lib/schemas/validator.js +247 -0
- package/lib/sources/custom-handler.js +199 -0
- package/lib/sources/policy-questions.js +246 -0
- package/lib/sources/source-cache.js +165 -0
- package/lib/state/workflow-state.js +575 -0
- package/lib/types/agent-frontmatter.d.ts +134 -0
- package/lib/types/command-frontmatter.d.ts +107 -0
- package/lib/types/hook-frontmatter.d.ts +115 -0
- package/lib/types/index.d.ts +84 -0
- package/lib/types/plugin-manifest.d.ts +102 -0
- package/lib/types/skill-frontmatter.d.ts +89 -0
- package/lib/utils/atomic-write.js +94 -0
- package/lib/utils/cache-manager.js +159 -0
- package/lib/utils/context-optimizer.js +300 -0
- package/lib/utils/deprecation.js +37 -0
- package/lib/utils/shell-escape.js +88 -0
- package/meta/skills/maintain-cross-platform/SKILL.md +1022 -0
- package/package.json +92 -0
- package/plugins/agnix/.claude-plugin/plugin.json +22 -0
- package/plugins/agnix/agents/agnix-agent.md +56 -0
- package/plugins/agnix/commands/agnix.md +139 -0
- package/plugins/agnix/skills/agnix/SKILL.md +138 -0
- package/plugins/audit-project/.claude-plugin/plugin.json +20 -0
- package/plugins/audit-project/commands/audit-project-agents.md +458 -0
- package/plugins/audit-project/commands/audit-project-github.md +144 -0
- package/plugins/audit-project/commands/audit-project.md +336 -0
- package/plugins/audit-project/lib/adapter-transforms.js +278 -0
- package/plugins/audit-project/lib/collectors/codebase.js +392 -0
- package/plugins/audit-project/lib/collectors/docs-patterns.js +713 -0
- package/plugins/audit-project/lib/collectors/documentation.js +219 -0
- package/plugins/audit-project/lib/collectors/github.js +266 -0
- package/plugins/audit-project/lib/collectors/index.js +126 -0
- package/plugins/audit-project/lib/config/index.js +14 -0
- package/plugins/audit-project/lib/cross-platform/index.js +539 -0
- package/plugins/audit-project/lib/discovery/index.js +352 -0
- package/plugins/audit-project/lib/drift-detect/collectors.js +37 -0
- package/plugins/audit-project/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/audit-project/lib/enhance/agent-patterns.js +571 -0
- package/plugins/audit-project/lib/enhance/auto-suppression.js +622 -0
- package/plugins/audit-project/lib/enhance/benchmark.js +417 -0
- package/plugins/audit-project/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/audit-project/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/audit-project/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/audit-project/lib/enhance/docs-patterns.js +671 -0
- package/plugins/audit-project/lib/enhance/fixer.js +721 -0
- package/plugins/audit-project/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/audit-project/lib/enhance/hook-patterns.js +40 -0
- package/plugins/audit-project/lib/enhance/index.js +127 -0
- package/plugins/audit-project/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/audit-project/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/audit-project/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/audit-project/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/audit-project/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/audit-project/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/audit-project/lib/enhance/reporter.js +1348 -0
- package/plugins/audit-project/lib/enhance/security-patterns.js +284 -0
- package/plugins/audit-project/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/audit-project/lib/enhance/skill-patterns.js +147 -0
- package/plugins/audit-project/lib/enhance/suppression.js +352 -0
- package/plugins/audit-project/lib/enhance/tool-patterns.js +373 -0
- package/plugins/audit-project/lib/index.js +270 -0
- package/plugins/audit-project/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/audit-project/lib/patterns/pipeline.js +948 -0
- package/plugins/audit-project/lib/patterns/review-patterns.js +558 -0
- package/plugins/audit-project/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/audit-project/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/audit-project/lib/perf/analyzer/index.js +22 -0
- package/plugins/audit-project/lib/perf/argument-parser.js +105 -0
- package/plugins/audit-project/lib/perf/baseline-comparator.js +50 -0
- package/plugins/audit-project/lib/perf/baseline-store.js +127 -0
- package/plugins/audit-project/lib/perf/benchmark-runner.js +399 -0
- package/plugins/audit-project/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/audit-project/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/audit-project/lib/perf/checkpoint.js +123 -0
- package/plugins/audit-project/lib/perf/code-paths.js +86 -0
- package/plugins/audit-project/lib/perf/consolidation.js +37 -0
- package/plugins/audit-project/lib/perf/constraint-runner.js +71 -0
- package/plugins/audit-project/lib/perf/experiment-runner.js +32 -0
- package/plugins/audit-project/lib/perf/index.js +41 -0
- package/plugins/audit-project/lib/perf/investigation-state.js +875 -0
- package/plugins/audit-project/lib/perf/optimization-runner.js +79 -0
- package/plugins/audit-project/lib/perf/profilers/go.js +22 -0
- package/plugins/audit-project/lib/perf/profilers/index.js +46 -0
- package/plugins/audit-project/lib/perf/profilers/java.js +23 -0
- package/plugins/audit-project/lib/perf/profilers/node.js +27 -0
- package/plugins/audit-project/lib/perf/profilers/python.js +23 -0
- package/plugins/audit-project/lib/perf/profilers/rust.js +23 -0
- package/plugins/audit-project/lib/perf/profiling-runner.js +56 -0
- package/plugins/audit-project/lib/perf/schemas.js +140 -0
- package/plugins/audit-project/lib/platform/detect-platform.js +413 -0
- package/plugins/audit-project/lib/platform/detection-configs.js +93 -0
- package/plugins/audit-project/lib/platform/state-dir.js +132 -0
- package/plugins/audit-project/lib/platform/verify-tools.js +182 -0
- package/plugins/audit-project/lib/repo-map/cache.js +152 -0
- package/plugins/audit-project/lib/repo-map/index.js +222 -0
- package/plugins/audit-project/lib/repo-map/installer.js +212 -0
- package/plugins/audit-project/lib/repo-map/queries/go.js +27 -0
- package/plugins/audit-project/lib/repo-map/queries/index.js +100 -0
- package/plugins/audit-project/lib/repo-map/queries/java.js +38 -0
- package/plugins/audit-project/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/audit-project/lib/repo-map/queries/python.js +24 -0
- package/plugins/audit-project/lib/repo-map/queries/rust.js +73 -0
- package/plugins/audit-project/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/audit-project/lib/repo-map/runner.js +1165 -0
- package/plugins/audit-project/lib/repo-map/updater.js +474 -0
- package/plugins/audit-project/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/audit-project/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/audit-project/lib/schemas/validator.js +247 -0
- package/plugins/audit-project/lib/sources/custom-handler.js +199 -0
- package/plugins/audit-project/lib/sources/policy-questions.js +246 -0
- package/plugins/audit-project/lib/sources/source-cache.js +165 -0
- package/plugins/audit-project/lib/state/workflow-state.js +575 -0
- package/plugins/audit-project/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/audit-project/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/audit-project/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/audit-project/lib/types/index.d.ts +84 -0
- package/plugins/audit-project/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/audit-project/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/audit-project/lib/utils/atomic-write.js +94 -0
- package/plugins/audit-project/lib/utils/cache-manager.js +159 -0
- package/plugins/audit-project/lib/utils/context-optimizer.js +300 -0
- package/plugins/audit-project/lib/utils/deprecation.js +37 -0
- package/plugins/audit-project/lib/utils/shell-escape.js +88 -0
- package/plugins/consult/.claude-plugin/plugin.json +24 -0
- package/plugins/consult/agents/consult-agent.md +129 -0
- package/plugins/consult/commands/consult.md +248 -0
- package/plugins/consult/skills/consult/SKILL.md +285 -0
- package/plugins/deslop/.claude-plugin/plugin.json +20 -0
- package/plugins/deslop/agents/deslop-agent.md +88 -0
- package/plugins/deslop/commands/deslop.md +168 -0
- package/plugins/deslop/lib/adapter-transforms.js +278 -0
- package/plugins/deslop/lib/collectors/codebase.js +392 -0
- package/plugins/deslop/lib/collectors/docs-patterns.js +713 -0
- package/plugins/deslop/lib/collectors/documentation.js +219 -0
- package/plugins/deslop/lib/collectors/github.js +266 -0
- package/plugins/deslop/lib/collectors/index.js +126 -0
- package/plugins/deslop/lib/config/index.js +14 -0
- package/plugins/deslop/lib/cross-platform/index.js +539 -0
- package/plugins/deslop/lib/discovery/index.js +352 -0
- package/plugins/deslop/lib/drift-detect/collectors.js +37 -0
- package/plugins/deslop/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/deslop/lib/enhance/agent-patterns.js +571 -0
- package/plugins/deslop/lib/enhance/auto-suppression.js +622 -0
- package/plugins/deslop/lib/enhance/benchmark.js +417 -0
- package/plugins/deslop/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/deslop/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/deslop/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/deslop/lib/enhance/docs-patterns.js +671 -0
- package/plugins/deslop/lib/enhance/fixer.js +721 -0
- package/plugins/deslop/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/deslop/lib/enhance/hook-patterns.js +40 -0
- package/plugins/deslop/lib/enhance/index.js +127 -0
- package/plugins/deslop/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/deslop/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/deslop/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/deslop/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/deslop/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/deslop/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/deslop/lib/enhance/reporter.js +1348 -0
- package/plugins/deslop/lib/enhance/security-patterns.js +284 -0
- package/plugins/deslop/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/deslop/lib/enhance/skill-patterns.js +147 -0
- package/plugins/deslop/lib/enhance/suppression.js +352 -0
- package/plugins/deslop/lib/enhance/tool-patterns.js +373 -0
- package/plugins/deslop/lib/index.js +270 -0
- package/plugins/deslop/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/deslop/lib/patterns/pipeline.js +948 -0
- package/plugins/deslop/lib/patterns/review-patterns.js +558 -0
- package/plugins/deslop/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/deslop/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/deslop/lib/perf/analyzer/index.js +22 -0
- package/plugins/deslop/lib/perf/argument-parser.js +105 -0
- package/plugins/deslop/lib/perf/baseline-comparator.js +50 -0
- package/plugins/deslop/lib/perf/baseline-store.js +127 -0
- package/plugins/deslop/lib/perf/benchmark-runner.js +399 -0
- package/plugins/deslop/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/deslop/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/deslop/lib/perf/checkpoint.js +123 -0
- package/plugins/deslop/lib/perf/code-paths.js +86 -0
- package/plugins/deslop/lib/perf/consolidation.js +37 -0
- package/plugins/deslop/lib/perf/constraint-runner.js +71 -0
- package/plugins/deslop/lib/perf/experiment-runner.js +32 -0
- package/plugins/deslop/lib/perf/index.js +41 -0
- package/plugins/deslop/lib/perf/investigation-state.js +875 -0
- package/plugins/deslop/lib/perf/optimization-runner.js +79 -0
- package/plugins/deslop/lib/perf/profilers/go.js +22 -0
- package/plugins/deslop/lib/perf/profilers/index.js +46 -0
- package/plugins/deslop/lib/perf/profilers/java.js +23 -0
- package/plugins/deslop/lib/perf/profilers/node.js +27 -0
- package/plugins/deslop/lib/perf/profilers/python.js +23 -0
- package/plugins/deslop/lib/perf/profilers/rust.js +23 -0
- package/plugins/deslop/lib/perf/profiling-runner.js +56 -0
- package/plugins/deslop/lib/perf/schemas.js +140 -0
- package/plugins/deslop/lib/platform/detect-platform.js +413 -0
- package/plugins/deslop/lib/platform/detection-configs.js +93 -0
- package/plugins/deslop/lib/platform/state-dir.js +132 -0
- package/plugins/deslop/lib/platform/verify-tools.js +182 -0
- package/plugins/deslop/lib/repo-map/cache.js +152 -0
- package/plugins/deslop/lib/repo-map/index.js +222 -0
- package/plugins/deslop/lib/repo-map/installer.js +212 -0
- package/plugins/deslop/lib/repo-map/queries/go.js +27 -0
- package/plugins/deslop/lib/repo-map/queries/index.js +100 -0
- package/plugins/deslop/lib/repo-map/queries/java.js +38 -0
- package/plugins/deslop/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/deslop/lib/repo-map/queries/python.js +24 -0
- package/plugins/deslop/lib/repo-map/queries/rust.js +73 -0
- package/plugins/deslop/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/deslop/lib/repo-map/runner.js +1165 -0
- package/plugins/deslop/lib/repo-map/updater.js +474 -0
- package/plugins/deslop/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/deslop/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/deslop/lib/schemas/validator.js +247 -0
- package/plugins/deslop/lib/sources/custom-handler.js +199 -0
- package/plugins/deslop/lib/sources/policy-questions.js +246 -0
- package/plugins/deslop/lib/sources/source-cache.js +165 -0
- package/plugins/deslop/lib/state/workflow-state.js +575 -0
- package/plugins/deslop/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/deslop/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/deslop/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/deslop/lib/types/index.d.ts +84 -0
- package/plugins/deslop/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/deslop/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/deslop/lib/utils/atomic-write.js +94 -0
- package/plugins/deslop/lib/utils/cache-manager.js +159 -0
- package/plugins/deslop/lib/utils/context-optimizer.js +300 -0
- package/plugins/deslop/lib/utils/deprecation.js +37 -0
- package/plugins/deslop/lib/utils/shell-escape.js +88 -0
- package/plugins/deslop/references/slop-categories.md +122 -0
- package/plugins/deslop/scripts/detect.js +134 -0
- package/plugins/deslop/skills/deslop/SKILL.md +204 -0
- package/plugins/drift-detect/.claude-plugin/plugin.json +23 -0
- package/plugins/drift-detect/agents/plan-synthesizer.md +225 -0
- package/plugins/drift-detect/commands/drift-detect.md +269 -0
- package/plugins/drift-detect/lib/adapter-transforms.js +278 -0
- package/plugins/drift-detect/lib/collectors/codebase.js +392 -0
- package/plugins/drift-detect/lib/collectors/docs-patterns.js +713 -0
- package/plugins/drift-detect/lib/collectors/documentation.js +219 -0
- package/plugins/drift-detect/lib/collectors/github.js +266 -0
- package/plugins/drift-detect/lib/collectors/index.js +126 -0
- package/plugins/drift-detect/lib/config/index.js +14 -0
- package/plugins/drift-detect/lib/cross-platform/index.js +539 -0
- package/plugins/drift-detect/lib/discovery/index.js +352 -0
- package/plugins/drift-detect/lib/drift-detect/collectors.js +37 -0
- package/plugins/drift-detect/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/drift-detect/lib/enhance/agent-patterns.js +571 -0
- package/plugins/drift-detect/lib/enhance/auto-suppression.js +622 -0
- package/plugins/drift-detect/lib/enhance/benchmark.js +417 -0
- package/plugins/drift-detect/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/drift-detect/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/drift-detect/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/drift-detect/lib/enhance/docs-patterns.js +671 -0
- package/plugins/drift-detect/lib/enhance/fixer.js +721 -0
- package/plugins/drift-detect/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/drift-detect/lib/enhance/hook-patterns.js +40 -0
- package/plugins/drift-detect/lib/enhance/index.js +127 -0
- package/plugins/drift-detect/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/drift-detect/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/drift-detect/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/drift-detect/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/drift-detect/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/drift-detect/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/drift-detect/lib/enhance/reporter.js +1348 -0
- package/plugins/drift-detect/lib/enhance/security-patterns.js +284 -0
- package/plugins/drift-detect/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/drift-detect/lib/enhance/skill-patterns.js +147 -0
- package/plugins/drift-detect/lib/enhance/suppression.js +352 -0
- package/plugins/drift-detect/lib/enhance/tool-patterns.js +373 -0
- package/plugins/drift-detect/lib/index.js +270 -0
- package/plugins/drift-detect/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/drift-detect/lib/patterns/pipeline.js +948 -0
- package/plugins/drift-detect/lib/patterns/review-patterns.js +558 -0
- package/plugins/drift-detect/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/drift-detect/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/drift-detect/lib/perf/analyzer/index.js +22 -0
- package/plugins/drift-detect/lib/perf/argument-parser.js +105 -0
- package/plugins/drift-detect/lib/perf/baseline-comparator.js +50 -0
- package/plugins/drift-detect/lib/perf/baseline-store.js +127 -0
- package/plugins/drift-detect/lib/perf/benchmark-runner.js +399 -0
- package/plugins/drift-detect/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/drift-detect/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/drift-detect/lib/perf/checkpoint.js +123 -0
- package/plugins/drift-detect/lib/perf/code-paths.js +86 -0
- package/plugins/drift-detect/lib/perf/consolidation.js +37 -0
- package/plugins/drift-detect/lib/perf/constraint-runner.js +71 -0
- package/plugins/drift-detect/lib/perf/experiment-runner.js +32 -0
- package/plugins/drift-detect/lib/perf/index.js +41 -0
- package/plugins/drift-detect/lib/perf/investigation-state.js +875 -0
- package/plugins/drift-detect/lib/perf/optimization-runner.js +79 -0
- package/plugins/drift-detect/lib/perf/profilers/go.js +22 -0
- package/plugins/drift-detect/lib/perf/profilers/index.js +46 -0
- package/plugins/drift-detect/lib/perf/profilers/java.js +23 -0
- package/plugins/drift-detect/lib/perf/profilers/node.js +27 -0
- package/plugins/drift-detect/lib/perf/profilers/python.js +23 -0
- package/plugins/drift-detect/lib/perf/profilers/rust.js +23 -0
- package/plugins/drift-detect/lib/perf/profiling-runner.js +56 -0
- package/plugins/drift-detect/lib/perf/schemas.js +140 -0
- package/plugins/drift-detect/lib/platform/detect-platform.js +413 -0
- package/plugins/drift-detect/lib/platform/detection-configs.js +93 -0
- package/plugins/drift-detect/lib/platform/state-dir.js +132 -0
- package/plugins/drift-detect/lib/platform/verify-tools.js +182 -0
- package/plugins/drift-detect/lib/repo-map/cache.js +152 -0
- package/plugins/drift-detect/lib/repo-map/index.js +222 -0
- package/plugins/drift-detect/lib/repo-map/installer.js +212 -0
- package/plugins/drift-detect/lib/repo-map/queries/go.js +27 -0
- package/plugins/drift-detect/lib/repo-map/queries/index.js +100 -0
- package/plugins/drift-detect/lib/repo-map/queries/java.js +38 -0
- package/plugins/drift-detect/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/drift-detect/lib/repo-map/queries/python.js +24 -0
- package/plugins/drift-detect/lib/repo-map/queries/rust.js +73 -0
- package/plugins/drift-detect/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/drift-detect/lib/repo-map/runner.js +1165 -0
- package/plugins/drift-detect/lib/repo-map/updater.js +474 -0
- package/plugins/drift-detect/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/drift-detect/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/drift-detect/lib/schemas/validator.js +247 -0
- package/plugins/drift-detect/lib/sources/custom-handler.js +199 -0
- package/plugins/drift-detect/lib/sources/policy-questions.js +246 -0
- package/plugins/drift-detect/lib/sources/source-cache.js +165 -0
- package/plugins/drift-detect/lib/state/workflow-state.js +575 -0
- package/plugins/drift-detect/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/drift-detect/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/drift-detect/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/drift-detect/lib/types/index.d.ts +84 -0
- package/plugins/drift-detect/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/drift-detect/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/drift-detect/lib/utils/atomic-write.js +94 -0
- package/plugins/drift-detect/lib/utils/cache-manager.js +159 -0
- package/plugins/drift-detect/lib/utils/context-optimizer.js +300 -0
- package/plugins/drift-detect/lib/utils/deprecation.js +37 -0
- package/plugins/drift-detect/lib/utils/shell-escape.js +88 -0
- package/plugins/drift-detect/skills/drift-analysis/SKILL.md +324 -0
- package/plugins/enhance/.claude-plugin/plugin.json +20 -0
- package/plugins/enhance/agents/agent-enhancer.md +64 -0
- package/plugins/enhance/agents/claudemd-enhancer.md +65 -0
- package/plugins/enhance/agents/cross-file-enhancer.md +54 -0
- package/plugins/enhance/agents/docs-enhancer.md +64 -0
- package/plugins/enhance/agents/hooks-enhancer.md +64 -0
- package/plugins/enhance/agents/plugin-enhancer.md +63 -0
- package/plugins/enhance/agents/prompt-enhancer.md +58 -0
- package/plugins/enhance/agents/skills-enhancer.md +64 -0
- package/plugins/enhance/commands/enhance.md +178 -0
- package/plugins/enhance/lib/adapter-transforms.js +278 -0
- package/plugins/enhance/lib/collectors/codebase.js +392 -0
- package/plugins/enhance/lib/collectors/docs-patterns.js +713 -0
- package/plugins/enhance/lib/collectors/documentation.js +219 -0
- package/plugins/enhance/lib/collectors/github.js +266 -0
- package/plugins/enhance/lib/collectors/index.js +126 -0
- package/plugins/enhance/lib/config/index.js +14 -0
- package/plugins/enhance/lib/cross-platform/index.js +539 -0
- package/plugins/enhance/lib/discovery/index.js +352 -0
- package/plugins/enhance/lib/drift-detect/collectors.js +37 -0
- package/plugins/enhance/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/enhance/lib/enhance/agent-patterns.js +571 -0
- package/plugins/enhance/lib/enhance/auto-suppression.js +622 -0
- package/plugins/enhance/lib/enhance/benchmark.js +417 -0
- package/plugins/enhance/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/enhance/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/enhance/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/enhance/lib/enhance/docs-patterns.js +671 -0
- package/plugins/enhance/lib/enhance/fixer.js +721 -0
- package/plugins/enhance/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/enhance/lib/enhance/hook-patterns.js +40 -0
- package/plugins/enhance/lib/enhance/index.js +127 -0
- package/plugins/enhance/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/enhance/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/enhance/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/enhance/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/enhance/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/enhance/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/enhance/lib/enhance/reporter.js +1348 -0
- package/plugins/enhance/lib/enhance/security-patterns.js +284 -0
- package/plugins/enhance/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/enhance/lib/enhance/skill-patterns.js +147 -0
- package/plugins/enhance/lib/enhance/suppression.js +352 -0
- package/plugins/enhance/lib/enhance/tool-patterns.js +373 -0
- package/plugins/enhance/lib/index.js +270 -0
- package/plugins/enhance/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/enhance/lib/patterns/pipeline.js +948 -0
- package/plugins/enhance/lib/patterns/review-patterns.js +558 -0
- package/plugins/enhance/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/enhance/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/enhance/lib/perf/analyzer/index.js +22 -0
- package/plugins/enhance/lib/perf/argument-parser.js +105 -0
- package/plugins/enhance/lib/perf/baseline-comparator.js +50 -0
- package/plugins/enhance/lib/perf/baseline-store.js +127 -0
- package/plugins/enhance/lib/perf/benchmark-runner.js +399 -0
- package/plugins/enhance/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/enhance/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/enhance/lib/perf/checkpoint.js +123 -0
- package/plugins/enhance/lib/perf/code-paths.js +86 -0
- package/plugins/enhance/lib/perf/consolidation.js +37 -0
- package/plugins/enhance/lib/perf/constraint-runner.js +71 -0
- package/plugins/enhance/lib/perf/experiment-runner.js +32 -0
- package/plugins/enhance/lib/perf/index.js +41 -0
- package/plugins/enhance/lib/perf/investigation-state.js +875 -0
- package/plugins/enhance/lib/perf/optimization-runner.js +79 -0
- package/plugins/enhance/lib/perf/profilers/go.js +22 -0
- package/plugins/enhance/lib/perf/profilers/index.js +46 -0
- package/plugins/enhance/lib/perf/profilers/java.js +23 -0
- package/plugins/enhance/lib/perf/profilers/node.js +27 -0
- package/plugins/enhance/lib/perf/profilers/python.js +23 -0
- package/plugins/enhance/lib/perf/profilers/rust.js +23 -0
- package/plugins/enhance/lib/perf/profiling-runner.js +56 -0
- package/plugins/enhance/lib/perf/schemas.js +140 -0
- package/plugins/enhance/lib/platform/detect-platform.js +413 -0
- package/plugins/enhance/lib/platform/detection-configs.js +93 -0
- package/plugins/enhance/lib/platform/state-dir.js +132 -0
- package/plugins/enhance/lib/platform/verify-tools.js +182 -0
- package/plugins/enhance/lib/repo-map/cache.js +152 -0
- package/plugins/enhance/lib/repo-map/index.js +222 -0
- package/plugins/enhance/lib/repo-map/installer.js +212 -0
- package/plugins/enhance/lib/repo-map/queries/go.js +27 -0
- package/plugins/enhance/lib/repo-map/queries/index.js +100 -0
- package/plugins/enhance/lib/repo-map/queries/java.js +38 -0
- package/plugins/enhance/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/enhance/lib/repo-map/queries/python.js +24 -0
- package/plugins/enhance/lib/repo-map/queries/rust.js +73 -0
- package/plugins/enhance/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/enhance/lib/repo-map/runner.js +1165 -0
- package/plugins/enhance/lib/repo-map/updater.js +474 -0
- package/plugins/enhance/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/enhance/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/enhance/lib/schemas/validator.js +247 -0
- package/plugins/enhance/lib/sources/custom-handler.js +199 -0
- package/plugins/enhance/lib/sources/policy-questions.js +246 -0
- package/plugins/enhance/lib/sources/source-cache.js +165 -0
- package/plugins/enhance/lib/state/workflow-state.js +575 -0
- package/plugins/enhance/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/enhance/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/enhance/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/enhance/lib/types/index.d.ts +84 -0
- package/plugins/enhance/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/enhance/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/enhance/lib/utils/atomic-write.js +94 -0
- package/plugins/enhance/lib/utils/cache-manager.js +159 -0
- package/plugins/enhance/lib/utils/context-optimizer.js +300 -0
- package/plugins/enhance/lib/utils/deprecation.js +37 -0
- package/plugins/enhance/lib/utils/shell-escape.js +88 -0
- package/plugins/enhance/skills/enhance-agent-prompts/SKILL.md +277 -0
- package/plugins/enhance/skills/enhance-claude-memory/SKILL.md +387 -0
- package/plugins/enhance/skills/enhance-cross-file/SKILL.md +110 -0
- package/plugins/enhance/skills/enhance-docs/SKILL.md +298 -0
- package/plugins/enhance/skills/enhance-hooks/SKILL.md +554 -0
- package/plugins/enhance/skills/enhance-orchestrator/SKILL.md +255 -0
- package/plugins/enhance/skills/enhance-plugins/SKILL.md +319 -0
- package/plugins/enhance/skills/enhance-prompts/SKILL.md +340 -0
- package/plugins/enhance/skills/enhance-skills/SKILL.md +436 -0
- package/plugins/learn/.claude-plugin/plugin.json +21 -0
- package/plugins/learn/agents/learn-agent.md +331 -0
- package/plugins/learn/commands/learn.md +190 -0
- package/plugins/learn/lib/adapter-transforms.js +278 -0
- package/plugins/learn/lib/collectors/codebase.js +392 -0
- package/plugins/learn/lib/collectors/docs-patterns.js +713 -0
- package/plugins/learn/lib/collectors/documentation.js +219 -0
- package/plugins/learn/lib/collectors/github.js +266 -0
- package/plugins/learn/lib/collectors/index.js +126 -0
- package/plugins/learn/lib/config/index.js +14 -0
- package/plugins/learn/lib/cross-platform/index.js +539 -0
- package/plugins/learn/lib/discovery/index.js +352 -0
- package/plugins/learn/lib/drift-detect/collectors.js +37 -0
- package/plugins/learn/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/learn/lib/enhance/agent-patterns.js +571 -0
- package/plugins/learn/lib/enhance/auto-suppression.js +622 -0
- package/plugins/learn/lib/enhance/benchmark.js +417 -0
- package/plugins/learn/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/learn/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/learn/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/learn/lib/enhance/docs-patterns.js +671 -0
- package/plugins/learn/lib/enhance/fixer.js +721 -0
- package/plugins/learn/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/learn/lib/enhance/hook-patterns.js +40 -0
- package/plugins/learn/lib/enhance/index.js +127 -0
- package/plugins/learn/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/learn/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/learn/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/learn/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/learn/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/learn/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/learn/lib/enhance/reporter.js +1348 -0
- package/plugins/learn/lib/enhance/security-patterns.js +284 -0
- package/plugins/learn/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/learn/lib/enhance/skill-patterns.js +147 -0
- package/plugins/learn/lib/enhance/suppression.js +352 -0
- package/plugins/learn/lib/enhance/tool-patterns.js +373 -0
- package/plugins/learn/lib/index.js +270 -0
- package/plugins/learn/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/learn/lib/patterns/pipeline.js +948 -0
- package/plugins/learn/lib/patterns/review-patterns.js +558 -0
- package/plugins/learn/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/learn/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/learn/lib/perf/analyzer/index.js +22 -0
- package/plugins/learn/lib/perf/argument-parser.js +105 -0
- package/plugins/learn/lib/perf/baseline-comparator.js +50 -0
- package/plugins/learn/lib/perf/baseline-store.js +127 -0
- package/plugins/learn/lib/perf/benchmark-runner.js +399 -0
- package/plugins/learn/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/learn/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/learn/lib/perf/checkpoint.js +123 -0
- package/plugins/learn/lib/perf/code-paths.js +86 -0
- package/plugins/learn/lib/perf/consolidation.js +37 -0
- package/plugins/learn/lib/perf/constraint-runner.js +71 -0
- package/plugins/learn/lib/perf/experiment-runner.js +32 -0
- package/plugins/learn/lib/perf/index.js +41 -0
- package/plugins/learn/lib/perf/investigation-state.js +875 -0
- package/plugins/learn/lib/perf/optimization-runner.js +79 -0
- package/plugins/learn/lib/perf/profilers/go.js +22 -0
- package/plugins/learn/lib/perf/profilers/index.js +46 -0
- package/plugins/learn/lib/perf/profilers/java.js +23 -0
- package/plugins/learn/lib/perf/profilers/node.js +27 -0
- package/plugins/learn/lib/perf/profilers/python.js +23 -0
- package/plugins/learn/lib/perf/profilers/rust.js +23 -0
- package/plugins/learn/lib/perf/profiling-runner.js +56 -0
- package/plugins/learn/lib/perf/schemas.js +140 -0
- package/plugins/learn/lib/platform/detect-platform.js +413 -0
- package/plugins/learn/lib/platform/detection-configs.js +93 -0
- package/plugins/learn/lib/platform/state-dir.js +132 -0
- package/plugins/learn/lib/platform/verify-tools.js +182 -0
- package/plugins/learn/lib/repo-map/cache.js +152 -0
- package/plugins/learn/lib/repo-map/index.js +222 -0
- package/plugins/learn/lib/repo-map/installer.js +212 -0
- package/plugins/learn/lib/repo-map/queries/go.js +27 -0
- package/plugins/learn/lib/repo-map/queries/index.js +100 -0
- package/plugins/learn/lib/repo-map/queries/java.js +38 -0
- package/plugins/learn/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/learn/lib/repo-map/queries/python.js +24 -0
- package/plugins/learn/lib/repo-map/queries/rust.js +73 -0
- package/plugins/learn/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/learn/lib/repo-map/runner.js +1165 -0
- package/plugins/learn/lib/repo-map/updater.js +474 -0
- package/plugins/learn/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/learn/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/learn/lib/schemas/validator.js +247 -0
- package/plugins/learn/lib/sources/custom-handler.js +199 -0
- package/plugins/learn/lib/sources/policy-questions.js +246 -0
- package/plugins/learn/lib/sources/source-cache.js +165 -0
- package/plugins/learn/lib/state/workflow-state.js +575 -0
- package/plugins/learn/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/learn/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/learn/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/learn/lib/types/index.d.ts +84 -0
- package/plugins/learn/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/learn/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/learn/lib/utils/atomic-write.js +94 -0
- package/plugins/learn/lib/utils/cache-manager.js +159 -0
- package/plugins/learn/lib/utils/context-optimizer.js +300 -0
- package/plugins/learn/lib/utils/deprecation.js +37 -0
- package/plugins/learn/lib/utils/shell-escape.js +88 -0
- package/plugins/learn/skills/learn/SKILL.md +349 -0
- package/plugins/next-task/.claude-plugin/plugin.json +24 -0
- package/plugins/next-task/agents/ci-fixer.md +259 -0
- package/plugins/next-task/agents/ci-monitor.md +342 -0
- package/plugins/next-task/agents/delivery-validator.md +115 -0
- package/plugins/next-task/agents/exploration-agent.md +316 -0
- package/plugins/next-task/agents/implementation-agent.md +465 -0
- package/plugins/next-task/agents/planning-agent.md +377 -0
- package/plugins/next-task/agents/simple-fixer.md +139 -0
- package/plugins/next-task/agents/task-discoverer.md +89 -0
- package/plugins/next-task/agents/test-coverage-checker.md +451 -0
- package/plugins/next-task/agents/worktree-manager.md +257 -0
- package/plugins/next-task/commands/delivery-approval.md +341 -0
- package/plugins/next-task/commands/next-task.md +547 -0
- package/plugins/next-task/hooks/hooks.json +14 -0
- package/plugins/next-task/lib/adapter-transforms.js +278 -0
- package/plugins/next-task/lib/collectors/codebase.js +392 -0
- package/plugins/next-task/lib/collectors/docs-patterns.js +713 -0
- package/plugins/next-task/lib/collectors/documentation.js +219 -0
- package/plugins/next-task/lib/collectors/github.js +266 -0
- package/plugins/next-task/lib/collectors/index.js +126 -0
- package/plugins/next-task/lib/config/index.js +14 -0
- package/plugins/next-task/lib/cross-platform/index.js +539 -0
- package/plugins/next-task/lib/discovery/index.js +352 -0
- package/plugins/next-task/lib/drift-detect/collectors.js +37 -0
- package/plugins/next-task/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/next-task/lib/enhance/agent-patterns.js +571 -0
- package/plugins/next-task/lib/enhance/auto-suppression.js +622 -0
- package/plugins/next-task/lib/enhance/benchmark.js +417 -0
- package/plugins/next-task/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/next-task/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/next-task/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/next-task/lib/enhance/docs-patterns.js +671 -0
- package/plugins/next-task/lib/enhance/fixer.js +721 -0
- package/plugins/next-task/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/next-task/lib/enhance/hook-patterns.js +40 -0
- package/plugins/next-task/lib/enhance/index.js +127 -0
- package/plugins/next-task/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/next-task/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/next-task/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/next-task/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/next-task/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/next-task/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/next-task/lib/enhance/reporter.js +1348 -0
- package/plugins/next-task/lib/enhance/security-patterns.js +284 -0
- package/plugins/next-task/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/next-task/lib/enhance/skill-patterns.js +147 -0
- package/plugins/next-task/lib/enhance/suppression.js +352 -0
- package/plugins/next-task/lib/enhance/tool-patterns.js +373 -0
- package/plugins/next-task/lib/index.js +270 -0
- package/plugins/next-task/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/next-task/lib/patterns/pipeline.js +948 -0
- package/plugins/next-task/lib/patterns/review-patterns.js +558 -0
- package/plugins/next-task/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/next-task/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/next-task/lib/perf/analyzer/index.js +22 -0
- package/plugins/next-task/lib/perf/argument-parser.js +105 -0
- package/plugins/next-task/lib/perf/baseline-comparator.js +50 -0
- package/plugins/next-task/lib/perf/baseline-store.js +127 -0
- package/plugins/next-task/lib/perf/benchmark-runner.js +399 -0
- package/plugins/next-task/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/next-task/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/next-task/lib/perf/checkpoint.js +123 -0
- package/plugins/next-task/lib/perf/code-paths.js +86 -0
- package/plugins/next-task/lib/perf/consolidation.js +37 -0
- package/plugins/next-task/lib/perf/constraint-runner.js +71 -0
- package/plugins/next-task/lib/perf/experiment-runner.js +32 -0
- package/plugins/next-task/lib/perf/index.js +41 -0
- package/plugins/next-task/lib/perf/investigation-state.js +875 -0
- package/plugins/next-task/lib/perf/optimization-runner.js +79 -0
- package/plugins/next-task/lib/perf/profilers/go.js +22 -0
- package/plugins/next-task/lib/perf/profilers/index.js +46 -0
- package/plugins/next-task/lib/perf/profilers/java.js +23 -0
- package/plugins/next-task/lib/perf/profilers/node.js +27 -0
- package/plugins/next-task/lib/perf/profilers/python.js +23 -0
- package/plugins/next-task/lib/perf/profilers/rust.js +23 -0
- package/plugins/next-task/lib/perf/profiling-runner.js +56 -0
- package/plugins/next-task/lib/perf/schemas.js +140 -0
- package/plugins/next-task/lib/platform/detect-platform.js +413 -0
- package/plugins/next-task/lib/platform/detection-configs.js +93 -0
- package/plugins/next-task/lib/platform/state-dir.js +132 -0
- package/plugins/next-task/lib/platform/verify-tools.js +182 -0
- package/plugins/next-task/lib/repo-map/cache.js +152 -0
- package/plugins/next-task/lib/repo-map/index.js +222 -0
- package/plugins/next-task/lib/repo-map/installer.js +212 -0
- package/plugins/next-task/lib/repo-map/queries/go.js +27 -0
- package/plugins/next-task/lib/repo-map/queries/index.js +100 -0
- package/plugins/next-task/lib/repo-map/queries/java.js +38 -0
- package/plugins/next-task/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/next-task/lib/repo-map/queries/python.js +24 -0
- package/plugins/next-task/lib/repo-map/queries/rust.js +73 -0
- package/plugins/next-task/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/next-task/lib/repo-map/runner.js +1165 -0
- package/plugins/next-task/lib/repo-map/updater.js +474 -0
- package/plugins/next-task/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/next-task/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/next-task/lib/schemas/validator.js +247 -0
- package/plugins/next-task/lib/sources/custom-handler.js +199 -0
- package/plugins/next-task/lib/sources/policy-questions.js +246 -0
- package/plugins/next-task/lib/sources/source-cache.js +165 -0
- package/plugins/next-task/lib/state/workflow-state.js +575 -0
- package/plugins/next-task/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/next-task/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/next-task/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/next-task/lib/types/index.d.ts +84 -0
- package/plugins/next-task/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/next-task/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/next-task/lib/utils/atomic-write.js +94 -0
- package/plugins/next-task/lib/utils/cache-manager.js +159 -0
- package/plugins/next-task/lib/utils/context-optimizer.js +300 -0
- package/plugins/next-task/lib/utils/deprecation.js +37 -0
- package/plugins/next-task/lib/utils/shell-escape.js +88 -0
- package/plugins/next-task/skills/discover-tasks/SKILL.md +191 -0
- package/plugins/next-task/skills/orchestrate-review/SKILL.md +239 -0
- package/plugins/next-task/skills/validate-delivery/SKILL.md +186 -0
- package/plugins/perf/.claude-plugin/plugin.json +20 -0
- package/plugins/perf/agents/perf-analyzer.md +43 -0
- package/plugins/perf/agents/perf-code-paths.md +16 -0
- package/plugins/perf/agents/perf-investigation-logger.md +47 -0
- package/plugins/perf/agents/perf-orchestrator.md +344 -0
- package/plugins/perf/agents/perf-theory-gatherer.md +25 -0
- package/plugins/perf/agents/perf-theory-tester.md +58 -0
- package/plugins/perf/commands/perf.md +470 -0
- package/plugins/perf/hooks/checkpoint.md +35 -0
- package/plugins/perf/hooks/constraint-tester.md +40 -0
- package/plugins/perf/lib/adapter-transforms.js +278 -0
- package/plugins/perf/lib/collectors/codebase.js +392 -0
- package/plugins/perf/lib/collectors/docs-patterns.js +713 -0
- package/plugins/perf/lib/collectors/documentation.js +219 -0
- package/plugins/perf/lib/collectors/github.js +266 -0
- package/plugins/perf/lib/collectors/index.js +126 -0
- package/plugins/perf/lib/config/index.js +14 -0
- package/plugins/perf/lib/cross-platform/index.js +539 -0
- package/plugins/perf/lib/discovery/index.js +352 -0
- package/plugins/perf/lib/drift-detect/collectors.js +37 -0
- package/plugins/perf/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/perf/lib/enhance/agent-patterns.js +571 -0
- package/plugins/perf/lib/enhance/auto-suppression.js +622 -0
- package/plugins/perf/lib/enhance/benchmark.js +417 -0
- package/plugins/perf/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/perf/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/perf/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/perf/lib/enhance/docs-patterns.js +671 -0
- package/plugins/perf/lib/enhance/fixer.js +721 -0
- package/plugins/perf/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/perf/lib/enhance/hook-patterns.js +40 -0
- package/plugins/perf/lib/enhance/index.js +127 -0
- package/plugins/perf/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/perf/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/perf/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/perf/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/perf/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/perf/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/perf/lib/enhance/reporter.js +1348 -0
- package/plugins/perf/lib/enhance/security-patterns.js +284 -0
- package/plugins/perf/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/perf/lib/enhance/skill-patterns.js +147 -0
- package/plugins/perf/lib/enhance/suppression.js +352 -0
- package/plugins/perf/lib/enhance/tool-patterns.js +373 -0
- package/plugins/perf/lib/index.js +270 -0
- package/plugins/perf/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/perf/lib/patterns/pipeline.js +948 -0
- package/plugins/perf/lib/patterns/review-patterns.js +558 -0
- package/plugins/perf/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/perf/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/perf/lib/perf/analyzer/index.js +22 -0
- package/plugins/perf/lib/perf/argument-parser.js +105 -0
- package/plugins/perf/lib/perf/baseline-comparator.js +50 -0
- package/plugins/perf/lib/perf/baseline-store.js +127 -0
- package/plugins/perf/lib/perf/benchmark-runner.js +399 -0
- package/plugins/perf/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/perf/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/perf/lib/perf/checkpoint.js +123 -0
- package/plugins/perf/lib/perf/code-paths.js +86 -0
- package/plugins/perf/lib/perf/consolidation.js +37 -0
- package/plugins/perf/lib/perf/constraint-runner.js +71 -0
- package/plugins/perf/lib/perf/experiment-runner.js +32 -0
- package/plugins/perf/lib/perf/index.js +41 -0
- package/plugins/perf/lib/perf/investigation-state.js +875 -0
- package/plugins/perf/lib/perf/optimization-runner.js +79 -0
- package/plugins/perf/lib/perf/profilers/go.js +22 -0
- package/plugins/perf/lib/perf/profilers/index.js +46 -0
- package/plugins/perf/lib/perf/profilers/java.js +23 -0
- package/plugins/perf/lib/perf/profilers/node.js +27 -0
- package/plugins/perf/lib/perf/profilers/python.js +23 -0
- package/plugins/perf/lib/perf/profilers/rust.js +23 -0
- package/plugins/perf/lib/perf/profiling-runner.js +56 -0
- package/plugins/perf/lib/perf/schemas.js +140 -0
- package/plugins/perf/lib/platform/detect-platform.js +413 -0
- package/plugins/perf/lib/platform/detection-configs.js +93 -0
- package/plugins/perf/lib/platform/state-dir.js +132 -0
- package/plugins/perf/lib/platform/verify-tools.js +182 -0
- package/plugins/perf/lib/repo-map/cache.js +152 -0
- package/plugins/perf/lib/repo-map/index.js +222 -0
- package/plugins/perf/lib/repo-map/installer.js +212 -0
- package/plugins/perf/lib/repo-map/queries/go.js +27 -0
- package/plugins/perf/lib/repo-map/queries/index.js +100 -0
- package/plugins/perf/lib/repo-map/queries/java.js +38 -0
- package/plugins/perf/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/perf/lib/repo-map/queries/python.js +24 -0
- package/plugins/perf/lib/repo-map/queries/rust.js +73 -0
- package/plugins/perf/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/perf/lib/repo-map/runner.js +1165 -0
- package/plugins/perf/lib/repo-map/updater.js +474 -0
- package/plugins/perf/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/perf/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/perf/lib/schemas/validator.js +247 -0
- package/plugins/perf/lib/sources/custom-handler.js +199 -0
- package/plugins/perf/lib/sources/policy-questions.js +246 -0
- package/plugins/perf/lib/sources/source-cache.js +165 -0
- package/plugins/perf/lib/state/workflow-state.js +575 -0
- package/plugins/perf/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/perf/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/perf/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/perf/lib/types/index.d.ts +84 -0
- package/plugins/perf/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/perf/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/perf/lib/utils/atomic-write.js +94 -0
- package/plugins/perf/lib/utils/cache-manager.js +159 -0
- package/plugins/perf/lib/utils/context-optimizer.js +300 -0
- package/plugins/perf/lib/utils/deprecation.js +37 -0
- package/plugins/perf/lib/utils/shell-escape.js +88 -0
- package/plugins/perf/skills/perf-analyzer/SKILL.md +37 -0
- package/plugins/perf/skills/perf-baseline-manager/SKILL.md +30 -0
- package/plugins/perf/skills/perf-benchmarker/SKILL.md +52 -0
- package/plugins/perf/skills/perf-code-paths/SKILL.md +32 -0
- package/plugins/perf/skills/perf-investigation-logger/SKILL.md +41 -0
- package/plugins/perf/skills/perf-profiler/SKILL.md +42 -0
- package/plugins/perf/skills/perf-theory-gatherer/SKILL.md +35 -0
- package/plugins/perf/skills/perf-theory-tester/SKILL.md +36 -0
- package/plugins/repo-map/.claude-plugin/plugin.json +22 -0
- package/plugins/repo-map/agents/map-validator.md +60 -0
- package/plugins/repo-map/commands/repo-map.md +133 -0
- package/plugins/repo-map/lib/adapter-transforms.js +278 -0
- package/plugins/repo-map/lib/collectors/codebase.js +392 -0
- package/plugins/repo-map/lib/collectors/docs-patterns.js +713 -0
- package/plugins/repo-map/lib/collectors/documentation.js +219 -0
- package/plugins/repo-map/lib/collectors/github.js +266 -0
- package/plugins/repo-map/lib/collectors/index.js +126 -0
- package/plugins/repo-map/lib/config/index.js +14 -0
- package/plugins/repo-map/lib/cross-platform/index.js +539 -0
- package/plugins/repo-map/lib/discovery/index.js +352 -0
- package/plugins/repo-map/lib/drift-detect/collectors.js +37 -0
- package/plugins/repo-map/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/repo-map/lib/enhance/agent-patterns.js +571 -0
- package/plugins/repo-map/lib/enhance/auto-suppression.js +622 -0
- package/plugins/repo-map/lib/enhance/benchmark.js +417 -0
- package/plugins/repo-map/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/repo-map/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/repo-map/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/repo-map/lib/enhance/docs-patterns.js +671 -0
- package/plugins/repo-map/lib/enhance/fixer.js +721 -0
- package/plugins/repo-map/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/repo-map/lib/enhance/hook-patterns.js +40 -0
- package/plugins/repo-map/lib/enhance/index.js +127 -0
- package/plugins/repo-map/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/repo-map/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/repo-map/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/repo-map/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/repo-map/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/repo-map/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/repo-map/lib/enhance/reporter.js +1348 -0
- package/plugins/repo-map/lib/enhance/security-patterns.js +284 -0
- package/plugins/repo-map/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/repo-map/lib/enhance/skill-patterns.js +147 -0
- package/plugins/repo-map/lib/enhance/suppression.js +352 -0
- package/plugins/repo-map/lib/enhance/tool-patterns.js +373 -0
- package/plugins/repo-map/lib/index.js +270 -0
- package/plugins/repo-map/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/repo-map/lib/patterns/pipeline.js +948 -0
- package/plugins/repo-map/lib/patterns/review-patterns.js +558 -0
- package/plugins/repo-map/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/repo-map/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/repo-map/lib/perf/analyzer/index.js +22 -0
- package/plugins/repo-map/lib/perf/argument-parser.js +105 -0
- package/plugins/repo-map/lib/perf/baseline-comparator.js +50 -0
- package/plugins/repo-map/lib/perf/baseline-store.js +127 -0
- package/plugins/repo-map/lib/perf/benchmark-runner.js +399 -0
- package/plugins/repo-map/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/repo-map/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/repo-map/lib/perf/checkpoint.js +123 -0
- package/plugins/repo-map/lib/perf/code-paths.js +86 -0
- package/plugins/repo-map/lib/perf/consolidation.js +37 -0
- package/plugins/repo-map/lib/perf/constraint-runner.js +71 -0
- package/plugins/repo-map/lib/perf/experiment-runner.js +32 -0
- package/plugins/repo-map/lib/perf/index.js +41 -0
- package/plugins/repo-map/lib/perf/investigation-state.js +875 -0
- package/plugins/repo-map/lib/perf/optimization-runner.js +79 -0
- package/plugins/repo-map/lib/perf/profilers/go.js +22 -0
- package/plugins/repo-map/lib/perf/profilers/index.js +46 -0
- package/plugins/repo-map/lib/perf/profilers/java.js +23 -0
- package/plugins/repo-map/lib/perf/profilers/node.js +27 -0
- package/plugins/repo-map/lib/perf/profilers/python.js +23 -0
- package/plugins/repo-map/lib/perf/profilers/rust.js +23 -0
- package/plugins/repo-map/lib/perf/profiling-runner.js +56 -0
- package/plugins/repo-map/lib/perf/schemas.js +140 -0
- package/plugins/repo-map/lib/platform/detect-platform.js +413 -0
- package/plugins/repo-map/lib/platform/detection-configs.js +93 -0
- package/plugins/repo-map/lib/platform/state-dir.js +132 -0
- package/plugins/repo-map/lib/platform/verify-tools.js +182 -0
- package/plugins/repo-map/lib/repo-map/cache.js +152 -0
- package/plugins/repo-map/lib/repo-map/index.js +222 -0
- package/plugins/repo-map/lib/repo-map/installer.js +212 -0
- package/plugins/repo-map/lib/repo-map/queries/go.js +27 -0
- package/plugins/repo-map/lib/repo-map/queries/index.js +100 -0
- package/plugins/repo-map/lib/repo-map/queries/java.js +38 -0
- package/plugins/repo-map/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/repo-map/lib/repo-map/queries/python.js +24 -0
- package/plugins/repo-map/lib/repo-map/queries/rust.js +73 -0
- package/plugins/repo-map/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/repo-map/lib/repo-map/runner.js +1165 -0
- package/plugins/repo-map/lib/repo-map/updater.js +474 -0
- package/plugins/repo-map/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/repo-map/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/repo-map/lib/schemas/validator.js +247 -0
- package/plugins/repo-map/lib/sources/custom-handler.js +199 -0
- package/plugins/repo-map/lib/sources/policy-questions.js +246 -0
- package/plugins/repo-map/lib/sources/source-cache.js +165 -0
- package/plugins/repo-map/lib/state/workflow-state.js +575 -0
- package/plugins/repo-map/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/repo-map/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/repo-map/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/repo-map/lib/types/index.d.ts +84 -0
- package/plugins/repo-map/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/repo-map/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/repo-map/lib/utils/atomic-write.js +94 -0
- package/plugins/repo-map/lib/utils/cache-manager.js +159 -0
- package/plugins/repo-map/lib/utils/context-optimizer.js +300 -0
- package/plugins/repo-map/lib/utils/deprecation.js +37 -0
- package/plugins/repo-map/lib/utils/shell-escape.js +88 -0
- package/plugins/repo-map/skills/repo-mapping/SKILL.md +83 -0
- package/plugins/ship/.claude-plugin/plugin.json +21 -0
- package/plugins/ship/commands/ship-ci-review-loop.md +472 -0
- package/plugins/ship/commands/ship-deployment.md +335 -0
- package/plugins/ship/commands/ship-error-handling.md +258 -0
- package/plugins/ship/commands/ship.md +492 -0
- package/plugins/ship/lib/adapter-transforms.js +278 -0
- package/plugins/ship/lib/collectors/codebase.js +392 -0
- package/plugins/ship/lib/collectors/docs-patterns.js +713 -0
- package/plugins/ship/lib/collectors/documentation.js +219 -0
- package/plugins/ship/lib/collectors/github.js +266 -0
- package/plugins/ship/lib/collectors/index.js +126 -0
- package/plugins/ship/lib/config/index.js +14 -0
- package/plugins/ship/lib/cross-platform/index.js +539 -0
- package/plugins/ship/lib/discovery/index.js +352 -0
- package/plugins/ship/lib/drift-detect/collectors.js +37 -0
- package/plugins/ship/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/ship/lib/enhance/agent-patterns.js +571 -0
- package/plugins/ship/lib/enhance/auto-suppression.js +622 -0
- package/plugins/ship/lib/enhance/benchmark.js +417 -0
- package/plugins/ship/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/ship/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/ship/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/ship/lib/enhance/docs-patterns.js +671 -0
- package/plugins/ship/lib/enhance/fixer.js +721 -0
- package/plugins/ship/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/ship/lib/enhance/hook-patterns.js +40 -0
- package/plugins/ship/lib/enhance/index.js +127 -0
- package/plugins/ship/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/ship/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/ship/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/ship/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/ship/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/ship/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/ship/lib/enhance/reporter.js +1348 -0
- package/plugins/ship/lib/enhance/security-patterns.js +284 -0
- package/plugins/ship/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/ship/lib/enhance/skill-patterns.js +147 -0
- package/plugins/ship/lib/enhance/suppression.js +352 -0
- package/plugins/ship/lib/enhance/tool-patterns.js +373 -0
- package/plugins/ship/lib/index.js +270 -0
- package/plugins/ship/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/ship/lib/patterns/pipeline.js +948 -0
- package/plugins/ship/lib/patterns/review-patterns.js +558 -0
- package/plugins/ship/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/ship/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/ship/lib/perf/analyzer/index.js +22 -0
- package/plugins/ship/lib/perf/argument-parser.js +105 -0
- package/plugins/ship/lib/perf/baseline-comparator.js +50 -0
- package/plugins/ship/lib/perf/baseline-store.js +127 -0
- package/plugins/ship/lib/perf/benchmark-runner.js +399 -0
- package/plugins/ship/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/ship/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/ship/lib/perf/checkpoint.js +123 -0
- package/plugins/ship/lib/perf/code-paths.js +86 -0
- package/plugins/ship/lib/perf/consolidation.js +37 -0
- package/plugins/ship/lib/perf/constraint-runner.js +71 -0
- package/plugins/ship/lib/perf/experiment-runner.js +32 -0
- package/plugins/ship/lib/perf/index.js +41 -0
- package/plugins/ship/lib/perf/investigation-state.js +875 -0
- package/plugins/ship/lib/perf/optimization-runner.js +79 -0
- package/plugins/ship/lib/perf/profilers/go.js +22 -0
- package/plugins/ship/lib/perf/profilers/index.js +46 -0
- package/plugins/ship/lib/perf/profilers/java.js +23 -0
- package/plugins/ship/lib/perf/profilers/node.js +27 -0
- package/plugins/ship/lib/perf/profilers/python.js +23 -0
- package/plugins/ship/lib/perf/profilers/rust.js +23 -0
- package/plugins/ship/lib/perf/profiling-runner.js +56 -0
- package/plugins/ship/lib/perf/schemas.js +140 -0
- package/plugins/ship/lib/platform/detect-platform.js +413 -0
- package/plugins/ship/lib/platform/detection-configs.js +93 -0
- package/plugins/ship/lib/platform/state-dir.js +132 -0
- package/plugins/ship/lib/platform/verify-tools.js +182 -0
- package/plugins/ship/lib/repo-map/cache.js +152 -0
- package/plugins/ship/lib/repo-map/index.js +222 -0
- package/plugins/ship/lib/repo-map/installer.js +212 -0
- package/plugins/ship/lib/repo-map/queries/go.js +27 -0
- package/plugins/ship/lib/repo-map/queries/index.js +100 -0
- package/plugins/ship/lib/repo-map/queries/java.js +38 -0
- package/plugins/ship/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/ship/lib/repo-map/queries/python.js +24 -0
- package/plugins/ship/lib/repo-map/queries/rust.js +73 -0
- package/plugins/ship/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/ship/lib/repo-map/runner.js +1165 -0
- package/plugins/ship/lib/repo-map/updater.js +474 -0
- package/plugins/ship/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/ship/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/ship/lib/schemas/validator.js +247 -0
- package/plugins/ship/lib/sources/custom-handler.js +199 -0
- package/plugins/ship/lib/sources/policy-questions.js +246 -0
- package/plugins/ship/lib/sources/source-cache.js +165 -0
- package/plugins/ship/lib/state/workflow-state.js +575 -0
- package/plugins/ship/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/ship/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/ship/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/ship/lib/types/index.d.ts +84 -0
- package/plugins/ship/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/ship/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/ship/lib/utils/atomic-write.js +94 -0
- package/plugins/ship/lib/utils/cache-manager.js +159 -0
- package/plugins/ship/lib/utils/context-optimizer.js +300 -0
- package/plugins/ship/lib/utils/deprecation.js +37 -0
- package/plugins/ship/lib/utils/shell-escape.js +88 -0
- package/plugins/sync-docs/.claude-plugin/plugin.json +20 -0
- package/plugins/sync-docs/agents/sync-docs-agent.md +154 -0
- package/plugins/sync-docs/commands/sync-docs.md +186 -0
- package/plugins/sync-docs/lib/adapter-transforms.js +278 -0
- package/plugins/sync-docs/lib/collectors/codebase.js +392 -0
- package/plugins/sync-docs/lib/collectors/docs-patterns.js +713 -0
- package/plugins/sync-docs/lib/collectors/documentation.js +219 -0
- package/plugins/sync-docs/lib/collectors/github.js +266 -0
- package/plugins/sync-docs/lib/collectors/index.js +126 -0
- package/plugins/sync-docs/lib/config/index.js +14 -0
- package/plugins/sync-docs/lib/cross-platform/index.js +539 -0
- package/plugins/sync-docs/lib/discovery/index.js +352 -0
- package/plugins/sync-docs/lib/drift-detect/collectors.js +37 -0
- package/plugins/sync-docs/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/sync-docs/lib/enhance/agent-patterns.js +571 -0
- package/plugins/sync-docs/lib/enhance/auto-suppression.js +622 -0
- package/plugins/sync-docs/lib/enhance/benchmark.js +417 -0
- package/plugins/sync-docs/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/sync-docs/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/sync-docs/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/sync-docs/lib/enhance/docs-patterns.js +671 -0
- package/plugins/sync-docs/lib/enhance/fixer.js +721 -0
- package/plugins/sync-docs/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/sync-docs/lib/enhance/hook-patterns.js +40 -0
- package/plugins/sync-docs/lib/enhance/index.js +127 -0
- package/plugins/sync-docs/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/sync-docs/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/sync-docs/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/sync-docs/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/sync-docs/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/sync-docs/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/sync-docs/lib/enhance/reporter.js +1348 -0
- package/plugins/sync-docs/lib/enhance/security-patterns.js +284 -0
- package/plugins/sync-docs/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/sync-docs/lib/enhance/skill-patterns.js +147 -0
- package/plugins/sync-docs/lib/enhance/suppression.js +352 -0
- package/plugins/sync-docs/lib/enhance/tool-patterns.js +373 -0
- package/plugins/sync-docs/lib/index.js +270 -0
- package/plugins/sync-docs/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/sync-docs/lib/patterns/pipeline.js +948 -0
- package/plugins/sync-docs/lib/patterns/review-patterns.js +558 -0
- package/plugins/sync-docs/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/sync-docs/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/sync-docs/lib/perf/analyzer/index.js +22 -0
- package/plugins/sync-docs/lib/perf/argument-parser.js +105 -0
- package/plugins/sync-docs/lib/perf/baseline-comparator.js +50 -0
- package/plugins/sync-docs/lib/perf/baseline-store.js +127 -0
- package/plugins/sync-docs/lib/perf/benchmark-runner.js +399 -0
- package/plugins/sync-docs/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/sync-docs/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/sync-docs/lib/perf/checkpoint.js +123 -0
- package/plugins/sync-docs/lib/perf/code-paths.js +86 -0
- package/plugins/sync-docs/lib/perf/consolidation.js +37 -0
- package/plugins/sync-docs/lib/perf/constraint-runner.js +71 -0
- package/plugins/sync-docs/lib/perf/experiment-runner.js +32 -0
- package/plugins/sync-docs/lib/perf/index.js +41 -0
- package/plugins/sync-docs/lib/perf/investigation-state.js +875 -0
- package/plugins/sync-docs/lib/perf/optimization-runner.js +79 -0
- package/plugins/sync-docs/lib/perf/profilers/go.js +22 -0
- package/plugins/sync-docs/lib/perf/profilers/index.js +46 -0
- package/plugins/sync-docs/lib/perf/profilers/java.js +23 -0
- package/plugins/sync-docs/lib/perf/profilers/node.js +27 -0
- package/plugins/sync-docs/lib/perf/profilers/python.js +23 -0
- package/plugins/sync-docs/lib/perf/profilers/rust.js +23 -0
- package/plugins/sync-docs/lib/perf/profiling-runner.js +56 -0
- package/plugins/sync-docs/lib/perf/schemas.js +140 -0
- package/plugins/sync-docs/lib/platform/detect-platform.js +413 -0
- package/plugins/sync-docs/lib/platform/detection-configs.js +93 -0
- package/plugins/sync-docs/lib/platform/state-dir.js +132 -0
- package/plugins/sync-docs/lib/platform/verify-tools.js +182 -0
- package/plugins/sync-docs/lib/repo-map/cache.js +152 -0
- package/plugins/sync-docs/lib/repo-map/index.js +222 -0
- package/plugins/sync-docs/lib/repo-map/installer.js +212 -0
- package/plugins/sync-docs/lib/repo-map/queries/go.js +27 -0
- package/plugins/sync-docs/lib/repo-map/queries/index.js +100 -0
- package/plugins/sync-docs/lib/repo-map/queries/java.js +38 -0
- package/plugins/sync-docs/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/sync-docs/lib/repo-map/queries/python.js +24 -0
- package/plugins/sync-docs/lib/repo-map/queries/rust.js +73 -0
- package/plugins/sync-docs/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/sync-docs/lib/repo-map/runner.js +1165 -0
- package/plugins/sync-docs/lib/repo-map/updater.js +474 -0
- package/plugins/sync-docs/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/sync-docs/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/sync-docs/lib/schemas/validator.js +247 -0
- package/plugins/sync-docs/lib/sources/custom-handler.js +199 -0
- package/plugins/sync-docs/lib/sources/policy-questions.js +246 -0
- package/plugins/sync-docs/lib/sources/source-cache.js +165 -0
- package/plugins/sync-docs/lib/state/workflow-state.js +575 -0
- package/plugins/sync-docs/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/sync-docs/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/sync-docs/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/sync-docs/lib/types/index.d.ts +84 -0
- package/plugins/sync-docs/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/sync-docs/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/sync-docs/lib/utils/atomic-write.js +94 -0
- package/plugins/sync-docs/lib/utils/cache-manager.js +159 -0
- package/plugins/sync-docs/lib/utils/context-optimizer.js +300 -0
- package/plugins/sync-docs/lib/utils/deprecation.js +37 -0
- package/plugins/sync-docs/lib/utils/shell-escape.js +88 -0
- package/plugins/sync-docs/skills/sync-docs/SKILL.md +351 -0
- package/scripts/bump-version.js +92 -0
- package/scripts/check-hardcoded-paths.js +199 -0
- package/scripts/dev-install.js +493 -0
- package/scripts/expand-templates.js +269 -0
- package/scripts/gen-adapters.js +323 -0
- package/scripts/generate-docs.js +558 -0
- package/scripts/generate-plugin-list.js +20 -0
- package/scripts/migrate-opencode.js +307 -0
- package/scripts/perf/repo-map-create.js +46 -0
- package/scripts/plugins.txt +12 -0
- package/scripts/preflight.js +1263 -0
- package/scripts/scaffold.js +490 -0
- package/scripts/setup-hooks.js +169 -0
- package/scripts/stamp-version.js +175 -0
- package/scripts/test-transform.js +85 -0
- package/scripts/validate-agent-skill-compliance.js +284 -0
- package/scripts/validate-counts.js +457 -0
- package/scripts/validate-cross-platform-docs.js +550 -0
- package/scripts/validate-opencode-install.js +182 -0
- package/site/assets/css/main.css +1525 -0
- package/site/assets/css/tokens.css +493 -0
- package/site/assets/favicon.svg +23 -0
- package/site/assets/js/main.js +801 -0
- package/site/assets/logo.png +0 -0
- package/site/assets/og-image.html +163 -0
- package/site/content.json +453 -0
- package/site/index.html +698 -0
- package/site/ux-spec.md +683 -0
- package/site/version.json +5 -0
- package/templates/agent-snippets/enhance-integration-points.md +6 -0
- package/templates/agent-snippets/enhance-skill-delegation.md +18 -0
- package/templates/agent-snippets/model-choice.md +6 -0
|
@@ -0,0 +1,1484 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt Patterns
|
|
3
|
+
* Detection patterns for general prompt engineering best practices
|
|
4
|
+
*
|
|
5
|
+
* @author Avi Fenesh
|
|
6
|
+
* @license MIT
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Estimate tokens from text (1 token ~ 4 characters)
|
|
11
|
+
* @param {string} text - Text to estimate
|
|
12
|
+
* @returns {number} Estimated token count
|
|
13
|
+
*/
|
|
14
|
+
function estimateTokens(text) {
|
|
15
|
+
if (!text || typeof text !== 'string') return 0;
|
|
16
|
+
return Math.ceil(text.length / 4);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Pre-compiled regex patterns for performance (avoid compiling in hot paths)
|
|
20
|
+
const FENCE_START_REGEX = /^(\s*)```(\w*)\s*$/;
|
|
21
|
+
const FENCE_END_REGEX = /^(\s*)```\s*$/;
|
|
22
|
+
// Match both good and bad example tags - skip both for code validation
|
|
23
|
+
// (good examples may have simplified/pseudo-code, bad examples intentionally show errors)
|
|
24
|
+
const EXAMPLE_TAG_REGEX = /<(?:good|bad)[_-]?example>([\s\S]*?)<\/(?:good|bad)[_-]?example>/gi;
|
|
25
|
+
|
|
26
|
+
// Language detection patterns (pre-compiled for code_language_mismatch)
|
|
27
|
+
const LOOKS_LIKE_JSON_START = /^\s*[\[{]/;
|
|
28
|
+
const LOOKS_LIKE_JSON_CONTENT = /[:,]/;
|
|
29
|
+
const NOT_JSON_KEYWORDS = /(function|const|let|var|if|for|while|class)\b/;
|
|
30
|
+
// JS patterns require syntax context (not just keywords that might appear in JSON strings)
|
|
31
|
+
const LOOKS_LIKE_JS = /\b(function\s*\(|const\s+\w+\s*=|let\s+\w+\s*=|var\s+\w+\s*=|=>\s*[{(]|async\s+function|await\s+\w|class\s+\w+\s*{|import\s+\{|export\s+(const|function|class|default)|require\s*\()/;
|
|
32
|
+
const LOOKS_LIKE_PYTHON = /\b(def\s+\w+|import\s+\w+|from\s+\w+\s+import|class\s+\w+:|if\s[^:\n]*:|\s{4}|print\()\b/;
|
|
33
|
+
|
|
34
|
+
// Memoization caches for performance (keyed by content hash)
|
|
35
|
+
let _lastContent = null;
|
|
36
|
+
let _exampleRanges = null;
|
|
37
|
+
let _linePositions = null;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Extract fenced code blocks from markdown content
|
|
41
|
+
* @param {string} content - Markdown content
|
|
42
|
+
* @returns {Array<{language: string, code: string, startLine: number, endLine: number}>} Array of code blocks
|
|
43
|
+
*/
|
|
44
|
+
function extractCodeBlocks(content) {
|
|
45
|
+
if (!content || typeof content !== 'string') return [];
|
|
46
|
+
|
|
47
|
+
const blocks = [];
|
|
48
|
+
const lines = content.split('\n');
|
|
49
|
+
let inCodeBlock = false;
|
|
50
|
+
let currentBlock = null;
|
|
51
|
+
let codeLines = [];
|
|
52
|
+
|
|
53
|
+
for (let i = 0; i < lines.length; i++) {
|
|
54
|
+
const line = lines[i];
|
|
55
|
+
const lineNum = i + 1; // 1-indexed
|
|
56
|
+
|
|
57
|
+
// Check for code fence start (``` with optional language)
|
|
58
|
+
const fenceStartMatch = line.match(FENCE_START_REGEX);
|
|
59
|
+
const fenceEndMatch = line.match(FENCE_END_REGEX);
|
|
60
|
+
|
|
61
|
+
if (!inCodeBlock && fenceStartMatch) {
|
|
62
|
+
// Start of code block
|
|
63
|
+
inCodeBlock = true;
|
|
64
|
+
currentBlock = {
|
|
65
|
+
language: fenceStartMatch[2] || '', // Empty string if no language
|
|
66
|
+
startLine: lineNum,
|
|
67
|
+
indent: fenceStartMatch[1] || ''
|
|
68
|
+
};
|
|
69
|
+
codeLines = [];
|
|
70
|
+
} else if (inCodeBlock && fenceEndMatch) {
|
|
71
|
+
// End of code block
|
|
72
|
+
inCodeBlock = false;
|
|
73
|
+
if (currentBlock) {
|
|
74
|
+
blocks.push({
|
|
75
|
+
language: currentBlock.language,
|
|
76
|
+
code: codeLines.join('\n'),
|
|
77
|
+
startLine: currentBlock.startLine,
|
|
78
|
+
endLine: lineNum
|
|
79
|
+
});
|
|
80
|
+
currentBlock = null;
|
|
81
|
+
}
|
|
82
|
+
codeLines = [];
|
|
83
|
+
} else if (inCodeBlock) {
|
|
84
|
+
// Inside code block - collect the code
|
|
85
|
+
codeLines.push(line);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Handle unclosed code block at end of file
|
|
90
|
+
if (inCodeBlock && currentBlock) {
|
|
91
|
+
blocks.push({
|
|
92
|
+
language: currentBlock.language,
|
|
93
|
+
code: codeLines.join('\n'),
|
|
94
|
+
startLine: currentBlock.startLine,
|
|
95
|
+
endLine: lines.length
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return blocks;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Build example ranges cache for a content string (both good and bad examples)
|
|
104
|
+
* @param {string} content - Content to analyze
|
|
105
|
+
* @returns {Array<{start: number, end: number}>} Array of example tag ranges
|
|
106
|
+
*/
|
|
107
|
+
function buildExampleRanges(content) {
|
|
108
|
+
const ranges = [];
|
|
109
|
+
const regex = new RegExp(EXAMPLE_TAG_REGEX.source, EXAMPLE_TAG_REGEX.flags);
|
|
110
|
+
let match;
|
|
111
|
+
|
|
112
|
+
while ((match = regex.exec(content)) !== null) {
|
|
113
|
+
ranges.push({
|
|
114
|
+
start: match.index,
|
|
115
|
+
end: match.index + match[0].length
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return ranges;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Build line position cache for a content string
|
|
123
|
+
* @param {string} content - Content to analyze
|
|
124
|
+
* @returns {Array<number>} Array of character positions for each line start
|
|
125
|
+
*/
|
|
126
|
+
function buildLinePositions(content) {
|
|
127
|
+
const positions = [0]; // Line 1 starts at position 0
|
|
128
|
+
let pos = 0;
|
|
129
|
+
for (let i = 0; i < content.length; i++) {
|
|
130
|
+
if (content[i] === '\n') {
|
|
131
|
+
positions.push(i + 1);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return positions;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Invalidate cache if content changed
|
|
139
|
+
* @param {string} content - Current content
|
|
140
|
+
*/
|
|
141
|
+
function ensureCache(content) {
|
|
142
|
+
if (content !== _lastContent) {
|
|
143
|
+
_lastContent = content;
|
|
144
|
+
_exampleRanges = buildExampleRanges(content);
|
|
145
|
+
_linePositions = buildLinePositions(content);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Check if a position is inside an example tag (good or bad) (memoized)
|
|
151
|
+
* @param {string} content - Full content
|
|
152
|
+
* @param {number} position - Character position to check
|
|
153
|
+
* @returns {boolean} True if inside example tags
|
|
154
|
+
*/
|
|
155
|
+
function isInsideExampleTag(content, position) {
|
|
156
|
+
if (!content || position < 0) return false;
|
|
157
|
+
|
|
158
|
+
ensureCache(content);
|
|
159
|
+
|
|
160
|
+
for (const range of _exampleRanges) {
|
|
161
|
+
if (position >= range.start && position <= range.end) {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Get character position for a line number (memoized)
|
|
171
|
+
* @param {string} content - Content
|
|
172
|
+
* @param {number} lineNumber - 1-indexed line number
|
|
173
|
+
* @returns {number} Character position at start of line
|
|
174
|
+
*/
|
|
175
|
+
function getPositionForLine(content, lineNumber) {
|
|
176
|
+
if (!content || lineNumber < 1) return 0;
|
|
177
|
+
|
|
178
|
+
ensureCache(content);
|
|
179
|
+
|
|
180
|
+
const idx = lineNumber - 1;
|
|
181
|
+
if (idx < _linePositions.length) {
|
|
182
|
+
return _linePositions[idx];
|
|
183
|
+
}
|
|
184
|
+
return _linePositions[_linePositions.length - 1] || 0;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Prompt patterns with certainty levels
|
|
189
|
+
* Focuses on prompt quality (not agent-specific frontmatter/config)
|
|
190
|
+
*
|
|
191
|
+
* Categories:
|
|
192
|
+
* - clarity: Clear, specific instructions
|
|
193
|
+
* - structure: XML tags, sections, organization
|
|
194
|
+
* - examples: Few-shot examples
|
|
195
|
+
* - context: Context and motivation
|
|
196
|
+
* - output: Output format specification
|
|
197
|
+
* - anti-pattern: Common mistakes
|
|
198
|
+
*/
|
|
199
|
+
const promptPatterns = {
|
|
200
|
+
// ============================================
|
|
201
|
+
// CLARITY PATTERNS (HIGH certainty)
|
|
202
|
+
// ============================================
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Vague instructions without specifics
|
|
206
|
+
* HIGH certainty - fuzzy language reduces effectiveness
|
|
207
|
+
*/
|
|
208
|
+
vague_instructions: {
|
|
209
|
+
id: 'vague_instructions',
|
|
210
|
+
category: 'clarity',
|
|
211
|
+
certainty: 'HIGH',
|
|
212
|
+
autoFix: false,
|
|
213
|
+
description: 'Instructions use vague language like "usually", "sometimes", "try to"',
|
|
214
|
+
check: (content) => {
|
|
215
|
+
if (!content || typeof content !== 'string') return null;
|
|
216
|
+
|
|
217
|
+
// Strip lines documenting vague patterns (not actual vague instructions)
|
|
218
|
+
const lines = content.split('\n').filter(line => {
|
|
219
|
+
const trimmed = line.trim().toLowerCase();
|
|
220
|
+
// Skip lines listing vague terms as documentation
|
|
221
|
+
if (/vague\s*(instructions?|terms?|language|patterns?)\s*[:"]/.test(trimmed)) return false;
|
|
222
|
+
// Skip lines with quoted lists of vague words
|
|
223
|
+
if (trimmed.includes('usually') && trimmed.includes('sometimes') && /["']/.test(trimmed)) return false;
|
|
224
|
+
return true;
|
|
225
|
+
});
|
|
226
|
+
const filteredContent = lines.join('\n');
|
|
227
|
+
|
|
228
|
+
const vaguePatterns = [
|
|
229
|
+
{ pattern: /\busually\b/gi, word: 'usually' },
|
|
230
|
+
{ pattern: /\bsometimes\b/gi, word: 'sometimes' },
|
|
231
|
+
{ pattern: /\boften\b/gi, word: 'often' },
|
|
232
|
+
{ pattern: /\brarely\b/gi, word: 'rarely' },
|
|
233
|
+
{ pattern: /\bmaybe\b/gi, word: 'maybe' },
|
|
234
|
+
{ pattern: /\bmight\b/gi, word: 'might' },
|
|
235
|
+
{ pattern: /\bshould probably\b/gi, word: 'should probably' },
|
|
236
|
+
{ pattern: /\btry to\b/gi, word: 'try to' },
|
|
237
|
+
{ pattern: /\bas much as possible\b/gi, word: 'as much as possible' },
|
|
238
|
+
{ pattern: /\bif possible\b/gi, word: 'if possible' },
|
|
239
|
+
{ pattern: /\bwhen appropriate\b/gi, word: 'when appropriate' },
|
|
240
|
+
{ pattern: /\bas needed\b/gi, word: 'as needed' }
|
|
241
|
+
];
|
|
242
|
+
|
|
243
|
+
const found = [];
|
|
244
|
+
for (const { pattern, word } of vaguePatterns) {
|
|
245
|
+
const matches = filteredContent.match(pattern);
|
|
246
|
+
if (matches) {
|
|
247
|
+
found.push({ word, count: matches.length });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const totalCount = found.reduce((sum, f) => sum + f.count, 0);
|
|
252
|
+
|
|
253
|
+
if (totalCount >= 4) {
|
|
254
|
+
const examples = found.slice(0, 3).map(f => `"${f.word}" (${f.count}x)`);
|
|
255
|
+
return {
|
|
256
|
+
issue: `Found ${totalCount} vague terms: ${examples.join(', ')}`,
|
|
257
|
+
fix: 'Replace vague language with specific, deterministic instructions'
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Negative-only constraints without alternatives
|
|
266
|
+
* HIGH certainty - "don't X" less effective than "do Y instead"
|
|
267
|
+
*/
|
|
268
|
+
negative_only_constraints: {
|
|
269
|
+
id: 'negative_only_constraints',
|
|
270
|
+
category: 'clarity',
|
|
271
|
+
certainty: 'HIGH',
|
|
272
|
+
autoFix: false,
|
|
273
|
+
description: 'Uses "don\'t", "never", "do not" without stating what TO do',
|
|
274
|
+
check: (content) => {
|
|
275
|
+
if (!content || typeof content !== 'string') return null;
|
|
276
|
+
|
|
277
|
+
// Strip lines documenting bad patterns (not actual constraints)
|
|
278
|
+
const lines = content.split('\n').filter(line => {
|
|
279
|
+
const trimmed = line.trim().toLowerCase();
|
|
280
|
+
// Skip lines that document anti-patterns
|
|
281
|
+
if (/^-?\s*bad:|^\*\*bad\*\*:|^bad:/.test(trimmed)) return false;
|
|
282
|
+
// Skip lines in "Bad/Good" comparison format
|
|
283
|
+
if (/^-\s*"don't|^-\s*"never/.test(trimmed)) return false;
|
|
284
|
+
return true;
|
|
285
|
+
});
|
|
286
|
+
const filteredContent = lines.join('\n');
|
|
287
|
+
|
|
288
|
+
// Find negative constraints
|
|
289
|
+
const negativePatterns = [
|
|
290
|
+
/\bdon['']t\s+\w+/gi,
|
|
291
|
+
/\bnever\s+\w+/gi,
|
|
292
|
+
/\bdo not\s+\w+/gi,
|
|
293
|
+
/\bavoid\s+\w+ing\b/gi,
|
|
294
|
+
/\brefrain from\b/gi
|
|
295
|
+
];
|
|
296
|
+
|
|
297
|
+
const negatives = [];
|
|
298
|
+
for (const pattern of negativePatterns) {
|
|
299
|
+
const matches = filteredContent.match(pattern);
|
|
300
|
+
if (matches) {
|
|
301
|
+
negatives.push(...matches.slice(0, 2));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Check if there are positive alternatives nearby
|
|
306
|
+
const positiveIndicators = /\binstead\b|\brather\b|\buse\b.*\binstead\b|\bonly\s+\w+/gi;
|
|
307
|
+
const hasAlternatives = positiveIndicators.test(filteredContent);
|
|
308
|
+
|
|
309
|
+
if (negatives.length >= 5 && !hasAlternatives) {
|
|
310
|
+
return {
|
|
311
|
+
issue: `${negatives.length} negative constraints without positive alternatives`,
|
|
312
|
+
fix: 'For each "don\'t X", also state what TO do instead',
|
|
313
|
+
details: negatives.slice(0, 5)
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Missing explicit output format
|
|
322
|
+
* HIGH certainty - prompts should specify expected output
|
|
323
|
+
*/
|
|
324
|
+
missing_output_format: {
|
|
325
|
+
id: 'missing_output_format',
|
|
326
|
+
category: 'output',
|
|
327
|
+
certainty: 'HIGH',
|
|
328
|
+
autoFix: true,
|
|
329
|
+
description: 'No clear output format specification',
|
|
330
|
+
check: (content, filePath) => {
|
|
331
|
+
if (!content || typeof content !== 'string') return null;
|
|
332
|
+
|
|
333
|
+
// Skip workflow orchestrators that spawn agents/skills rather than produce output directly
|
|
334
|
+
const lc = content.toLowerCase();
|
|
335
|
+
const isOrchestrator = /##\s*Phase\s+\d+/i.test(content) || content.includes('Task({') ||
|
|
336
|
+
(lc.includes('spawn') && lc.includes('agent')) || content.includes('subagent_type') ||
|
|
337
|
+
content.includes('await Task(') || (lc.includes('invoke') && lc.includes('skill')) ||
|
|
338
|
+
(/\bSkill\b/.test(content) && lc.includes('tool'));
|
|
339
|
+
if (isOrchestrator) return null;
|
|
340
|
+
|
|
341
|
+
// Skip reference docs and hooks (not prompts that produce conversational output)
|
|
342
|
+
const isReferenceOrHook = /[/\\](?:references?|hooks?)[/\\]/i.test(filePath || '') ||
|
|
343
|
+
/^##?\s*(?:reference|knowledge|background)/im.test(content);
|
|
344
|
+
if (isReferenceOrHook) return null;
|
|
345
|
+
|
|
346
|
+
// Check for output format indicators
|
|
347
|
+
const outputIndicators = [
|
|
348
|
+
/##\s*output\s*(?:format|templates?|expectations?)/i,
|
|
349
|
+
/##\s*response\s*format/i,
|
|
350
|
+
/##\s*(?:issue|report)\s*format/i,
|
|
351
|
+
/##\s*format/i,
|
|
352
|
+
/##\s*example\s*(?:input\/)?output/i,
|
|
353
|
+
/\brespond\s+(?:with|in)\s+(?:JSON|XML|markdown|YAML)/i,
|
|
354
|
+
/\boutput\s+a\s+(?:comprehensive|detailed|structured)/i,
|
|
355
|
+
/\boutput\s*:\s*```/i,
|
|
356
|
+
/<output_format>/i,
|
|
357
|
+
/<response_format>/i,
|
|
358
|
+
/your\s+(?:response|output)\s+should\s+(?:be|follow)/i,
|
|
359
|
+
/\breturn(?:s|ing)?\s+(?:JSON|structured|formatted)/i
|
|
360
|
+
];
|
|
361
|
+
|
|
362
|
+
for (const pattern of outputIndicators) {
|
|
363
|
+
if (pattern.test(content)) {
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Only flag if prompt is substantial enough to warrant format spec
|
|
369
|
+
const tokens = estimateTokens(content);
|
|
370
|
+
if (tokens > 200) {
|
|
371
|
+
return {
|
|
372
|
+
issue: 'No output format specification found',
|
|
373
|
+
fix: 'Add "## Output Format" section or <output_format> tags specifying expected response structure'
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Aggressive emphasis (CAPS, excessive emphasis)
|
|
382
|
+
* HIGH certainty - overuse triggers over-indexing
|
|
383
|
+
*/
|
|
384
|
+
aggressive_emphasis: {
|
|
385
|
+
id: 'aggressive_emphasis',
|
|
386
|
+
category: 'clarity',
|
|
387
|
+
certainty: 'HIGH',
|
|
388
|
+
autoFix: true,
|
|
389
|
+
description: 'Excessive aggressive emphasis that may cause over-indexing',
|
|
390
|
+
check: (content) => {
|
|
391
|
+
if (!content || typeof content !== 'string') return null;
|
|
392
|
+
|
|
393
|
+
// Detect specific aggressive patterns (CAPS only, not lowercase)
|
|
394
|
+
const aggressivePatterns = [
|
|
395
|
+
// Intensifiers that add no value (CAPS only)
|
|
396
|
+
{ pattern: /\bABSOLUTELY\b/g, word: 'ABSOLUTELY' },
|
|
397
|
+
{ pattern: /\bTOTALLY\b/g, word: 'TOTALLY' },
|
|
398
|
+
{ pattern: /\bCOMPLETELY\b/g, word: 'COMPLETELY' },
|
|
399
|
+
{ pattern: /\bENTIRELY\b/g, word: 'ENTIRELY' },
|
|
400
|
+
{ pattern: /\bDEFINITELY\b/g, word: 'DEFINITELY' },
|
|
401
|
+
{ pattern: /\bEXTREMELY\b/g, word: 'EXTREMELY' },
|
|
402
|
+
// Aggressive phrases (CAPS only)
|
|
403
|
+
{ pattern: /\bEXTREMELY\s+IMPORTANT\b/g, word: 'EXTREMELY IMPORTANT' },
|
|
404
|
+
{ pattern: /\bSUPER\s+IMPORTANT\b/g, word: 'SUPER IMPORTANT' },
|
|
405
|
+
{ pattern: /\bVERY\s+VERY\b/g, word: 'VERY VERY' },
|
|
406
|
+
// Excessive punctuation
|
|
407
|
+
{ pattern: /!{3,}/g, word: '!!!' },
|
|
408
|
+
{ pattern: /\?{3,}/g, word: '???' }
|
|
409
|
+
];
|
|
410
|
+
|
|
411
|
+
const found = [];
|
|
412
|
+
for (const { pattern, word } of aggressivePatterns) {
|
|
413
|
+
const matches = content.match(pattern);
|
|
414
|
+
if (matches) {
|
|
415
|
+
found.push({ word, count: matches.length });
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const totalCount = found.reduce((sum, f) => sum + f.count, 0);
|
|
420
|
+
|
|
421
|
+
// Only flag if multiple instances (threshold: 3+)
|
|
422
|
+
if (totalCount >= 3) {
|
|
423
|
+
const examples = found.slice(0, 3).map(f => `"${f.word}" (${f.count}x)`);
|
|
424
|
+
return {
|
|
425
|
+
issue: `${totalCount} instances of aggressive emphasis: ${examples.join(', ')}`,
|
|
426
|
+
fix: 'Use normal language - models respond well to clear instructions without shouting',
|
|
427
|
+
details: found.map(f => f.word)
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
return null;
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
|
|
434
|
+
// ============================================
|
|
435
|
+
// STRUCTURE PATTERNS (HIGH/MEDIUM certainty)
|
|
436
|
+
// ============================================
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Missing XML structure for complex prompts
|
|
440
|
+
* HIGH certainty - XML helps structure for Claude/GPT
|
|
441
|
+
*/
|
|
442
|
+
missing_xml_structure: {
|
|
443
|
+
id: 'missing_xml_structure',
|
|
444
|
+
category: 'structure',
|
|
445
|
+
certainty: 'LOW', // Very advisory - XML is optional enhancement
|
|
446
|
+
autoFix: true,
|
|
447
|
+
description: 'Complex prompt without XML tags for structure',
|
|
448
|
+
check: (content) => {
|
|
449
|
+
if (!content || typeof content !== 'string') return null;
|
|
450
|
+
|
|
451
|
+
const tokens = estimateTokens(content);
|
|
452
|
+
const sectionCount = (content.match(/^#{1,6}\s+/gm) || []).length;
|
|
453
|
+
const hasCodeBlocks = /```/.test(content);
|
|
454
|
+
|
|
455
|
+
// Complex prompt indicators
|
|
456
|
+
const isComplex = tokens > 800 || (sectionCount >= 6 && hasCodeBlocks);
|
|
457
|
+
|
|
458
|
+
// Check for XML tags
|
|
459
|
+
const hasXML = /<[a-z_][a-z0-9_-]*>/i.test(content);
|
|
460
|
+
|
|
461
|
+
if (isComplex && !hasXML) {
|
|
462
|
+
return {
|
|
463
|
+
issue: 'Complex prompt without XML structure tags',
|
|
464
|
+
fix: 'Use XML tags like <role>, <constraints>, <examples>, <output_format> for key sections'
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
return null;
|
|
468
|
+
}
|
|
469
|
+
},
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* Inconsistent section formatting
|
|
473
|
+
* MEDIUM certainty - consistency aids parsing
|
|
474
|
+
*/
|
|
475
|
+
inconsistent_sections: {
|
|
476
|
+
id: 'inconsistent_sections',
|
|
477
|
+
category: 'structure',
|
|
478
|
+
certainty: 'LOW', // Style preference, not a real issue
|
|
479
|
+
autoFix: false,
|
|
480
|
+
description: 'Mixed heading styles or inconsistent section patterns',
|
|
481
|
+
check: (content) => {
|
|
482
|
+
if (!content || typeof content !== 'string') return null;
|
|
483
|
+
|
|
484
|
+
// Check for mixed heading styles
|
|
485
|
+
const h2Count = (content.match(/^##\s+/gm) || []).length;
|
|
486
|
+
const boldHeadingCount = (content.match(/^\*\*[^*]+\*\*\s*$/gm) || []).length;
|
|
487
|
+
|
|
488
|
+
if (h2Count >= 2 && boldHeadingCount >= 2) {
|
|
489
|
+
return {
|
|
490
|
+
issue: 'Mixed heading styles (## and **bold**)',
|
|
491
|
+
fix: 'Use consistent heading format throughout the prompt'
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// Note: Heading hierarchy check moved to heading_hierarchy_gaps pattern
|
|
496
|
+
|
|
497
|
+
return null;
|
|
498
|
+
}
|
|
499
|
+
},
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Critical info buried in middle
|
|
503
|
+
* MEDIUM certainty - lost-in-the-middle effect
|
|
504
|
+
*/
|
|
505
|
+
critical_info_buried: {
|
|
506
|
+
id: 'critical_info_buried',
|
|
507
|
+
category: 'structure',
|
|
508
|
+
certainty: 'MEDIUM',
|
|
509
|
+
autoFix: false,
|
|
510
|
+
description: 'Important instructions buried in middle of prompt',
|
|
511
|
+
check: (content, filePath) => {
|
|
512
|
+
if (!content || typeof content !== 'string') return null;
|
|
513
|
+
|
|
514
|
+
const lines = content.split('\n').filter(l => l.trim());
|
|
515
|
+
if (lines.length < 20) return null;
|
|
516
|
+
|
|
517
|
+
// Skip skill files with workflow phases (natural structure)
|
|
518
|
+
if (/SKILL\.md$/i.test(filePath || '') &&
|
|
519
|
+
/##?\s*(?:workflow|phase\s*\d)/i.test(content)) {
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// Check if file has a dedicated Critical Rules section at the start
|
|
524
|
+
const first30Percent = lines.slice(0, Math.floor(lines.length * 0.3)).join('\n');
|
|
525
|
+
if (/##?\s*(?:critical|important)\s*rules?\b/i.test(first30Percent)) {
|
|
526
|
+
return null; // Has critical rules section at start, structure is intentional
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
const middleStart = Math.floor(lines.length * 0.3);
|
|
530
|
+
const middleEnd = Math.floor(lines.length * 0.7);
|
|
531
|
+
const middleSection = lines.slice(middleStart, middleEnd).join('\n');
|
|
532
|
+
|
|
533
|
+
// Check for critical keywords in middle (outside code blocks)
|
|
534
|
+
// Code blocks are excluded since they contain example code, not actual instructions
|
|
535
|
+
const middleWithoutCode = middleSection.replace(/```[\s\S]*?```/g, '');
|
|
536
|
+
|
|
537
|
+
// Design decision: Removed 'must' and 'required' from detection patterns
|
|
538
|
+
// These words are too common in imperative documentation and cause false positives
|
|
539
|
+
// Keeping 'important', 'critical', 'essential', 'mandatory' as stronger indicators
|
|
540
|
+
const criticalPatterns = [
|
|
541
|
+
/\b(?:important|critical|essential|mandatory)\b/gi,
|
|
542
|
+
/\b(?:always|never)\s+\w+/gi,
|
|
543
|
+
/\b(?:warning|caution)\s*:/gi
|
|
544
|
+
];
|
|
545
|
+
|
|
546
|
+
let criticalInMiddle = 0;
|
|
547
|
+
for (const pattern of criticalPatterns) {
|
|
548
|
+
const matches = middleWithoutCode.match(pattern);
|
|
549
|
+
if (matches) criticalInMiddle += matches.length;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// Design decision: Threshold of 8 chosen based on analysis
|
|
553
|
+
// Original threshold of 5 flagged too many workflow files with legitimate
|
|
554
|
+
// middle content (phase descriptions, step details). 8 catches files with
|
|
555
|
+
// genuinely dense critical instructions in the middle.
|
|
556
|
+
if (criticalInMiddle >= 8) {
|
|
557
|
+
return {
|
|
558
|
+
issue: `${criticalInMiddle} critical instructions in the middle 40% of prompt`,
|
|
559
|
+
fix: 'Move critical instructions to the beginning or end (lost-in-the-middle effect)'
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
return null;
|
|
563
|
+
}
|
|
564
|
+
},
|
|
565
|
+
|
|
566
|
+
// ============================================
|
|
567
|
+
// EXAMPLE PATTERNS (HIGH/MEDIUM certainty)
|
|
568
|
+
// ============================================
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* No examples in complex prompt
|
|
572
|
+
* HIGH certainty - few-shot improves accuracy
|
|
573
|
+
*/
|
|
574
|
+
missing_examples: {
|
|
575
|
+
id: 'missing_examples',
|
|
576
|
+
category: 'examples',
|
|
577
|
+
certainty: 'MEDIUM', // Context-dependent - not all prompts need examples
|
|
578
|
+
autoFix: true,
|
|
579
|
+
description: 'Complex prompt without examples (few-shot)',
|
|
580
|
+
check: (content, filePath) => {
|
|
581
|
+
if (!content || typeof content !== 'string') return null;
|
|
582
|
+
|
|
583
|
+
const tokens = estimateTokens(content);
|
|
584
|
+
|
|
585
|
+
// Skip if prompt is simple
|
|
586
|
+
if (tokens < 300) return null;
|
|
587
|
+
|
|
588
|
+
// Skip reference docs, research files, agents, skills, and non-prompt content
|
|
589
|
+
const isNonPrompt = /[/\\](?:references?|docs?|agents?)[/\\]/i.test(filePath || '') ||
|
|
590
|
+
/(?:RESEARCH|SKILL)\.md$/i.test(filePath || '') ||
|
|
591
|
+
/^---\s*\nname:/m.test(content) || // Agent frontmatter
|
|
592
|
+
/\*\*Parent document\*\*:/i.test(content) || // Sub-reference file
|
|
593
|
+
/^##?\s*(?:reference|research|background|knowledge)/im.test(content);
|
|
594
|
+
if (isNonPrompt) return null;
|
|
595
|
+
|
|
596
|
+
// Skip workflow orchestrators and command files
|
|
597
|
+
const lc2 = content.toLowerCase();
|
|
598
|
+
const isOrchestrator = /##\s*Phase\s+\d+/i.test(content) || content.includes('Task({') ||
|
|
599
|
+
(lc2.includes('spawn') && lc2.includes('agent')) || content.includes('subagent_type');
|
|
600
|
+
if (isOrchestrator) return null;
|
|
601
|
+
|
|
602
|
+
// Check for example indicators
|
|
603
|
+
const exampleIndicators = [
|
|
604
|
+
/##\s*example/i,
|
|
605
|
+
/<example>/i,
|
|
606
|
+
/<good[_-]?example>/i,
|
|
607
|
+
/<bad[_-]?example>/i,
|
|
608
|
+
/\bfor example\b/i,
|
|
609
|
+
/\be\.g\.\b/i,
|
|
610
|
+
/\bsample\s+(?:input|output|response)/i,
|
|
611
|
+
/input:\s*\n.{1,500}\noutput:/is
|
|
612
|
+
];
|
|
613
|
+
|
|
614
|
+
for (const pattern of exampleIndicators) {
|
|
615
|
+
if (pattern.test(content)) {
|
|
616
|
+
return null;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
// Check if it's asking for specific format
|
|
621
|
+
const needsExamples = /\bformat\b|\bjson\b|\bxml\b|\bstructured\b/i.test(content);
|
|
622
|
+
|
|
623
|
+
if (needsExamples) {
|
|
624
|
+
return {
|
|
625
|
+
issue: 'Complex prompt with format requirements but no examples',
|
|
626
|
+
fix: 'Add 2-5 few-shot examples showing expected input/output format'
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
return null;
|
|
630
|
+
}
|
|
631
|
+
},
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* Example count not optimal (2-5 is ideal)
|
|
635
|
+
* MEDIUM certainty - too few or too many examples
|
|
636
|
+
*/
|
|
637
|
+
suboptimal_example_count: {
|
|
638
|
+
id: 'suboptimal_example_count',
|
|
639
|
+
category: 'examples',
|
|
640
|
+
certainty: 'LOW', // Advisory - example count is flexible
|
|
641
|
+
autoFix: false,
|
|
642
|
+
description: 'Example count outside optimal 2-5 range',
|
|
643
|
+
check: (content) => {
|
|
644
|
+
if (!content || typeof content !== 'string') return null;
|
|
645
|
+
|
|
646
|
+
// Count examples
|
|
647
|
+
const exampleSections = (content.match(/##\s*example/gi) || []).length;
|
|
648
|
+
const goodExamples = (content.match(/<good[_-]?example>/gi) || []).length;
|
|
649
|
+
const badExamples = (content.match(/<bad[_-]?example>/gi) || []).length;
|
|
650
|
+
const exampleTags = (content.match(/<example>/gi) || []).length;
|
|
651
|
+
|
|
652
|
+
const totalExamples = exampleSections + goodExamples + badExamples + exampleTags;
|
|
653
|
+
|
|
654
|
+
if (totalExamples === 0) return null; // Handled by missing_examples
|
|
655
|
+
|
|
656
|
+
if (totalExamples === 1) {
|
|
657
|
+
return {
|
|
658
|
+
issue: 'Only 1 example (optimal: 2-5)',
|
|
659
|
+
fix: 'Add at least one more example - single examples may not demonstrate patterns effectively'
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
if (totalExamples > 7) {
|
|
664
|
+
return {
|
|
665
|
+
issue: `${totalExamples} examples (optimal: 2-5)`,
|
|
666
|
+
fix: 'Consider reducing examples to avoid token bloat - keep the most representative ones'
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
return null;
|
|
671
|
+
}
|
|
672
|
+
},
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* Examples without clear good/bad distinction
|
|
676
|
+
* MEDIUM certainty - showing both patterns helps
|
|
677
|
+
*/
|
|
678
|
+
examples_without_contrast: {
|
|
679
|
+
id: 'examples_without_contrast',
|
|
680
|
+
category: 'examples',
|
|
681
|
+
certainty: 'MEDIUM',
|
|
682
|
+
autoFix: false,
|
|
683
|
+
description: 'Examples lack good/bad contrast for pattern learning',
|
|
684
|
+
check: (content) => {
|
|
685
|
+
if (!content || typeof content !== 'string') return null;
|
|
686
|
+
|
|
687
|
+
// Check if has examples
|
|
688
|
+
const hasExamples = /<example>|##\s*example/i.test(content);
|
|
689
|
+
if (!hasExamples) return null;
|
|
690
|
+
|
|
691
|
+
// Check for contrast indicators
|
|
692
|
+
const hasGood = /<good[_-]?example>|\bgood example\b|\bcorrect\b/i.test(content);
|
|
693
|
+
const hasBad = /<bad[_-]?example>|\bbad example\b|\bincorrect\b|\bwrong\b/i.test(content);
|
|
694
|
+
|
|
695
|
+
// Count total examples
|
|
696
|
+
const exampleCount = (content.match(/<example>|##\s*example/gi) || []).length;
|
|
697
|
+
|
|
698
|
+
if (exampleCount >= 3 && !hasGood && !hasBad) {
|
|
699
|
+
return {
|
|
700
|
+
issue: 'Multiple examples without good/bad distinction',
|
|
701
|
+
fix: 'Label examples as good/bad or correct/incorrect to clarify expected patterns'
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
return null;
|
|
705
|
+
}
|
|
706
|
+
},
|
|
707
|
+
|
|
708
|
+
// ============================================
|
|
709
|
+
// CONTEXT PATTERNS (MEDIUM certainty)
|
|
710
|
+
// ============================================
|
|
711
|
+
|
|
712
|
+
/**
|
|
713
|
+
* Missing context/motivation for instructions
|
|
714
|
+
* MEDIUM certainty - "why" improves compliance
|
|
715
|
+
*/
|
|
716
|
+
missing_context_why: {
|
|
717
|
+
id: 'missing_context_why',
|
|
718
|
+
category: 'context',
|
|
719
|
+
certainty: 'MEDIUM',
|
|
720
|
+
autoFix: false,
|
|
721
|
+
description: 'Instructions without explanation of why they matter',
|
|
722
|
+
check: (content) => {
|
|
723
|
+
if (!content || typeof content !== 'string') return null;
|
|
724
|
+
|
|
725
|
+
const tokens = estimateTokens(content);
|
|
726
|
+
if (tokens < 400) return null;
|
|
727
|
+
|
|
728
|
+
// Count imperatives/rules
|
|
729
|
+
const rulePatterns = [
|
|
730
|
+
/\b(?:must|should|always|never)\s+\w+/gi,
|
|
731
|
+
/\bdo not\b/gi,
|
|
732
|
+
/\b(?:required|mandatory)\b/gi
|
|
733
|
+
];
|
|
734
|
+
|
|
735
|
+
let ruleCount = 0;
|
|
736
|
+
for (const pattern of rulePatterns) {
|
|
737
|
+
const matches = content.match(pattern);
|
|
738
|
+
if (matches) ruleCount += matches.length;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
// Check for "why" explanations
|
|
742
|
+
const whyPatterns = [
|
|
743
|
+
/\bbecause\b/gi,
|
|
744
|
+
/\bsince\b/gi,
|
|
745
|
+
/\bthis (?:is|ensures?|prevents?|helps?)/gi,
|
|
746
|
+
/\bto (?:ensure|prevent|avoid|maintain)/gi,
|
|
747
|
+
/\bwhy:\s/gi,
|
|
748
|
+
/\*why\*/i,
|
|
749
|
+
// Inline explanations after dashes: "Rule - Explanation with verb"
|
|
750
|
+
// Requires verb-like word (ending in s/es/ed/ing) to distinguish from bullet points
|
|
751
|
+
/[-–]\s+[A-Z][a-z]+(?:s|es|ed|ing)\s+\w+/g,
|
|
752
|
+
// Inline explanations in parens with prose (8+ chars, no code-like content)
|
|
753
|
+
/\([^)(){}\[\]]{8,}\)/g,
|
|
754
|
+
// Explicit WHY/rationale sections
|
|
755
|
+
/##?\s*(?:why|rationale|reason)/gi,
|
|
756
|
+
// "for X" explanations: "for efficiency", "for safety"
|
|
757
|
+
/\bfor\s+(?:efficiency|safety|performance|security|clarity|consistency|reliability|maintainability)/gi
|
|
758
|
+
];
|
|
759
|
+
|
|
760
|
+
let whyCount = 0;
|
|
761
|
+
for (const pattern of whyPatterns) {
|
|
762
|
+
const matches = content.match(pattern);
|
|
763
|
+
if (matches) whyCount += matches.length;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
// Ratio check: should have some explanation for rules
|
|
767
|
+
if (ruleCount >= 8 && whyCount < ruleCount * 0.3) {
|
|
768
|
+
return {
|
|
769
|
+
issue: `${ruleCount} rules but few explanations (${whyCount} "why" phrases)`,
|
|
770
|
+
fix: 'Add context explaining WHY instructions matter (improves compliance)'
|
|
771
|
+
};
|
|
772
|
+
}
|
|
773
|
+
return null;
|
|
774
|
+
}
|
|
775
|
+
},
|
|
776
|
+
|
|
777
|
+
/**
|
|
778
|
+
* Missing instruction hierarchy/priority
|
|
779
|
+
* MEDIUM certainty - helps with conflicting instructions
|
|
780
|
+
*/
|
|
781
|
+
missing_instruction_priority: {
|
|
782
|
+
id: 'missing_instruction_priority',
|
|
783
|
+
category: 'context',
|
|
784
|
+
certainty: 'MEDIUM',
|
|
785
|
+
autoFix: false,
|
|
786
|
+
description: 'No clear priority order for instructions',
|
|
787
|
+
check: (content) => {
|
|
788
|
+
if (!content || typeof content !== 'string') return null;
|
|
789
|
+
|
|
790
|
+
const tokens = estimateTokens(content);
|
|
791
|
+
if (tokens < 600) return null;
|
|
792
|
+
|
|
793
|
+
// Check for instruction priority indicators
|
|
794
|
+
const priorityIndicators = [
|
|
795
|
+
/##\s*(?:priority|priorities)/i,
|
|
796
|
+
/<instruction[_-]?priority>/i,
|
|
797
|
+
/\bin case of conflict/i,
|
|
798
|
+
/\bpriority\s*(?:order|:\s*\d)/i,
|
|
799
|
+
/\b(?:highest|lowest)\s+priority\b/i,
|
|
800
|
+
/\b(?:first|second|third)\s+priority\b/i,
|
|
801
|
+
// Numbered rules section (implicit priority order)
|
|
802
|
+
/##[ \t]*(?:critical|important)[ \t]*rules?[ \t]*\n[ \t]*1\.\s/i,
|
|
803
|
+
// Precedence language
|
|
804
|
+
/\btakes?\s+precedence\b/i,
|
|
805
|
+
/\boverride[sd]?\b/i,
|
|
806
|
+
// Ordered constraint list
|
|
807
|
+
/##[ \t]*constraints?[ \t]*\n[ \t]*1\.\s/i
|
|
808
|
+
];
|
|
809
|
+
|
|
810
|
+
for (const pattern of priorityIndicators) {
|
|
811
|
+
if (pattern.test(content)) {
|
|
812
|
+
return null;
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
// Only flag if there are multiple top-level constraint sections (H2 only, not H3+)
|
|
817
|
+
// Design decision: H3+ subsections are typically nested within a larger rules block
|
|
818
|
+
// and don't indicate separate conflicting constraint sets
|
|
819
|
+
const constraintSections = (content.match(/^##\s+(?:constraints?|rules?|requirements?)\b/gim) || []).length;
|
|
820
|
+
|
|
821
|
+
// Design decision: Case-sensitive MUST to detect intentional emphasis only
|
|
822
|
+
// Lowercase 'must' is common in prose and doesn't indicate constraint emphasis
|
|
823
|
+
// Threshold of 10 chosen to avoid flagging files with few emphatic rules
|
|
824
|
+
const mustClauses = (content.match(/\bMUST\b/g) || []).length;
|
|
825
|
+
|
|
826
|
+
if (constraintSections >= 2 || mustClauses >= 10) {
|
|
827
|
+
return {
|
|
828
|
+
issue: 'Multiple constraint sections but no instruction priority order',
|
|
829
|
+
fix: 'Add priority order: "In case of conflict: 1) Safety rules, 2) System instructions, 3) User requests"'
|
|
830
|
+
};
|
|
831
|
+
}
|
|
832
|
+
return null;
|
|
833
|
+
}
|
|
834
|
+
},
|
|
835
|
+
|
|
836
|
+
// ============================================
|
|
837
|
+
// ANTI-PATTERN PATTERNS (HIGH/MEDIUM certainty)
|
|
838
|
+
// ============================================
|
|
839
|
+
|
|
840
|
+
/**
|
|
841
|
+
* Redundant CoT for thinking models
|
|
842
|
+
* HIGH certainty - wastes tokens with extended thinking models
|
|
843
|
+
*/
|
|
844
|
+
redundant_cot: {
|
|
845
|
+
id: 'redundant_cot',
|
|
846
|
+
category: 'anti-pattern',
|
|
847
|
+
certainty: 'HIGH',
|
|
848
|
+
autoFix: false,
|
|
849
|
+
description: '"Think step by step" redundant for models with extended thinking',
|
|
850
|
+
check: (content) => {
|
|
851
|
+
if (!content || typeof content !== 'string') return null;
|
|
852
|
+
|
|
853
|
+
// Skip if this is documentation ABOUT CoT (describes the anti-pattern)
|
|
854
|
+
// These files explain why step-by-step is redundant, not actually use it
|
|
855
|
+
const lcContent = content.toLowerCase();
|
|
856
|
+
if (/step[- ]by[- ]step/i.test(content) && lcContent.includes('redundant')) {
|
|
857
|
+
return null;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
// Check for explicit CoT instructions
|
|
861
|
+
const cotPatterns = [
|
|
862
|
+
/\bthink\s+step[- ]by[- ]step\b/gi,
|
|
863
|
+
/\bstep[- ]by[- ]step\s+(?:reasoning|thinking|approach)\b/gi,
|
|
864
|
+
/\blet['']s\s+think\s+(?:through|about)\s+this\b/gi,
|
|
865
|
+
/\breason\s+through\s+each\s+step\b/gi
|
|
866
|
+
];
|
|
867
|
+
|
|
868
|
+
const cotMatches = [];
|
|
869
|
+
for (const pattern of cotPatterns) {
|
|
870
|
+
const matches = content.match(pattern);
|
|
871
|
+
if (matches) cotMatches.push(...matches);
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
if (cotMatches.length >= 2) {
|
|
875
|
+
return {
|
|
876
|
+
issue: `${cotMatches.length} explicit "step-by-step" instructions`,
|
|
877
|
+
fix: 'Remove redundant CoT prompting - Claude 4.x and GPT-4 models reason by default',
|
|
878
|
+
details: cotMatches.slice(0, 3)
|
|
879
|
+
};
|
|
880
|
+
}
|
|
881
|
+
return null;
|
|
882
|
+
}
|
|
883
|
+
},
|
|
884
|
+
|
|
885
|
+
/**
|
|
886
|
+
* Overly prescriptive process
|
|
887
|
+
* MEDIUM certainty - micro-managing reasoning can limit creativity
|
|
888
|
+
*/
|
|
889
|
+
overly_prescriptive: {
|
|
890
|
+
id: 'overly_prescriptive',
|
|
891
|
+
category: 'anti-pattern',
|
|
892
|
+
certainty: 'LOW', // Some workflows need detailed steps
|
|
893
|
+
autoFix: false,
|
|
894
|
+
description: 'Overly prescriptive step-by-step process that may limit model reasoning',
|
|
895
|
+
check: (content) => {
|
|
896
|
+
if (!content || typeof content !== 'string') return null;
|
|
897
|
+
|
|
898
|
+
// Count numbered steps
|
|
899
|
+
const numberedSteps = content.match(/^\s*\d+\.\s+\w+/gm) || [];
|
|
900
|
+
|
|
901
|
+
// Check for micro-management indicators
|
|
902
|
+
const microManagePatterns = [
|
|
903
|
+
/\bfirst,?\s+(?:you\s+)?(?:must|should|need to)\b/gi,
|
|
904
|
+
/\bthen,?\s+(?:you\s+)?(?:must|should|need to)\b/gi,
|
|
905
|
+
/\bnext,?\s+(?:you\s+)?(?:must|should|need to)\b/gi,
|
|
906
|
+
/\bfinally,?\s+(?:you\s+)?(?:must|should|need to)\b/gi
|
|
907
|
+
];
|
|
908
|
+
|
|
909
|
+
let microManageCount = 0;
|
|
910
|
+
for (const pattern of microManagePatterns) {
|
|
911
|
+
const matches = content.match(pattern);
|
|
912
|
+
if (matches) microManageCount += matches.length;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
if (numberedSteps.length >= 10 || microManageCount >= 6) {
|
|
916
|
+
return {
|
|
917
|
+
issue: `${numberedSteps.length} numbered steps, ${microManageCount} sequential directives`,
|
|
918
|
+
fix: 'Consider high-level goals over step-by-step processes - model creativity may exceed prescribed approach'
|
|
919
|
+
};
|
|
920
|
+
}
|
|
921
|
+
return null;
|
|
922
|
+
}
|
|
923
|
+
},
|
|
924
|
+
|
|
925
|
+
/**
|
|
926
|
+
* Prompt bloat (excessive tokens)
|
|
927
|
+
* LOW certainty - long prompts cost more
|
|
928
|
+
*/
|
|
929
|
+
prompt_bloat: {
|
|
930
|
+
id: 'prompt_bloat',
|
|
931
|
+
category: 'anti-pattern',
|
|
932
|
+
certainty: 'LOW',
|
|
933
|
+
autoFix: false,
|
|
934
|
+
description: 'Prompt exceeds recommended token count',
|
|
935
|
+
maxTokens: 2500,
|
|
936
|
+
check: (content) => {
|
|
937
|
+
if (!content || typeof content !== 'string') return null;
|
|
938
|
+
|
|
939
|
+
const tokens = estimateTokens(content);
|
|
940
|
+
|
|
941
|
+
if (tokens > 2500) {
|
|
942
|
+
return {
|
|
943
|
+
issue: `Prompt ~${tokens} tokens (recommended max: 2500)`,
|
|
944
|
+
fix: 'Consider splitting into smaller prompts or using XML compression'
|
|
945
|
+
};
|
|
946
|
+
}
|
|
947
|
+
return null;
|
|
948
|
+
}
|
|
949
|
+
},
|
|
950
|
+
|
|
951
|
+
// ============================================
|
|
952
|
+
// OUTPUT FORMAT PATTERNS (MEDIUM certainty)
|
|
953
|
+
// ============================================
|
|
954
|
+
|
|
955
|
+
/**
|
|
956
|
+
* JSON request without schema
|
|
957
|
+
* MEDIUM certainty - schema improves consistency
|
|
958
|
+
*/
|
|
959
|
+
json_without_schema: {
|
|
960
|
+
id: 'json_without_schema',
|
|
961
|
+
category: 'output',
|
|
962
|
+
certainty: 'MEDIUM',
|
|
963
|
+
autoFix: false,
|
|
964
|
+
description: 'Requests JSON output without providing schema/example',
|
|
965
|
+
check: (content) => {
|
|
966
|
+
if (!content || typeof content !== 'string') return null;
|
|
967
|
+
|
|
968
|
+
// Check if requests JSON (exclude CLI flags and function descriptions)
|
|
969
|
+
// Exclude: "--output json", "analyzer returns JSON", "function returns JSON"
|
|
970
|
+
const requestsJson = (
|
|
971
|
+
(/\b(?:respond|output|return)[ \t]+(?:(?:with|in|as)[ \t]+)?JSON\b/i.test(content) &&
|
|
972
|
+
!/--output\s+json/i.test(content) &&
|
|
973
|
+
!/(?:analyzer|function|method)\s+returns?\s+JSON/i.test(content))
|
|
974
|
+
) ||
|
|
975
|
+
/\bJSON\s+(?:object|response|format)\b/i.test(content);
|
|
976
|
+
|
|
977
|
+
if (!requestsJson) return null;
|
|
978
|
+
|
|
979
|
+
// Check if provides schema or example
|
|
980
|
+
const hasSchema = /\bproperties\b.{1,200}\btype\b/is.test(content) ||
|
|
981
|
+
(content.includes('```json') && content.includes('{')) ||
|
|
982
|
+
/<json[_-]?schema>/i.test(content) ||
|
|
983
|
+
// JSON in JavaScript/TypeScript code blocks (quoted keys)
|
|
984
|
+
(/```(?:javascript|js|typescript|ts)\b/.test(content) && /\{\s*"[a-zA-Z]+"/i.test(content)) ||
|
|
985
|
+
// JavaScript object literal assignment (const x = { prop: ... })
|
|
986
|
+
(/\b(?:const|let|var)\b/.test(content) && /=\s*\{/.test(content)) ||
|
|
987
|
+
// JSON example with quoted property names in prose
|
|
988
|
+
/\{"[a-zA-Z_]+"[ \t]*:/i.test(content) || /\{\n[ \t]*"[a-zA-Z_]+"[ \t]*:/i.test(content) ||
|
|
989
|
+
// Inline schema description: { prop, prop, prop } or { prop: type, ... }
|
|
990
|
+
/\{[ \t]*[a-zA-Z_]+[ \t]*,[ \t]*[a-zA-Z_]+[ \t]*,[ \t]*[a-zA-Z_]+/i.test(content) ||
|
|
991
|
+
// Interface-style: { prop: value } patterns with multiple lines
|
|
992
|
+
/\{\n[ \t]+[a-zA-Z_]+[ \t]*:[ \t]*[\[\{"']/i.test(content);
|
|
993
|
+
|
|
994
|
+
if (!hasSchema) {
|
|
995
|
+
return {
|
|
996
|
+
issue: 'Requests JSON output but no schema or example provided',
|
|
997
|
+
fix: 'Add JSON schema or example structure to ensure consistent output format'
|
|
998
|
+
};
|
|
999
|
+
}
|
|
1000
|
+
return null;
|
|
1001
|
+
}
|
|
1002
|
+
},
|
|
1003
|
+
|
|
1004
|
+
// ============================================
|
|
1005
|
+
// VERIFICATION PATTERNS (from Claude Code Best Practices)
|
|
1006
|
+
// Source: https://code.claude.com/docs/en/best-practices
|
|
1007
|
+
// ============================================
|
|
1008
|
+
|
|
1009
|
+
/**
|
|
1010
|
+
* Missing verification criteria
|
|
1011
|
+
* HIGH certainty - single highest-leverage improvement
|
|
1012
|
+
* "Give Claude a way to verify its work"
|
|
1013
|
+
*/
|
|
1014
|
+
missing_verification_criteria: {
|
|
1015
|
+
id: 'missing_verification_criteria',
|
|
1016
|
+
category: 'clarity',
|
|
1017
|
+
certainty: 'MEDIUM', // Context-dependent - not all prompts are task-oriented
|
|
1018
|
+
autoFix: true,
|
|
1019
|
+
description: 'Task lacks verification criteria (tests, screenshots, expected output)',
|
|
1020
|
+
check: (content, filePath) => {
|
|
1021
|
+
if (!content || typeof content !== 'string') return null;
|
|
1022
|
+
|
|
1023
|
+
const tokens = estimateTokens(content);
|
|
1024
|
+
if (tokens < 150) return null; // Too short to need verification
|
|
1025
|
+
|
|
1026
|
+
// Skip SKILL.md files (implementation definitions, not tasks)
|
|
1027
|
+
// Skip agent files (they define behavior, verification is in workflow)
|
|
1028
|
+
// Skip command files that delegate to agents (verification in agent)
|
|
1029
|
+
const isSkillOrAgent = /SKILL\.md$/i.test(filePath || '') ||
|
|
1030
|
+
/[/\\]agents?[/\\]/i.test(filePath || '') ||
|
|
1031
|
+
/^---\s*\nname:/m.test(content); // Agent frontmatter
|
|
1032
|
+
if (isSkillOrAgent) return null;
|
|
1033
|
+
|
|
1034
|
+
// Design decision: Skip commands that delegate to agents
|
|
1035
|
+
// When a command uses Task({ subagent_type: ... }), verification responsibility
|
|
1036
|
+
// belongs to the spawned agent, not the orchestrating command.
|
|
1037
|
+
// This is project-specific syntax for AgentSys plugin system.
|
|
1038
|
+
if (/Task\s*\(/i.test(content) && /subagent_type/i.test(content)) return null;
|
|
1039
|
+
|
|
1040
|
+
// Check for implementation/action indicators
|
|
1041
|
+
const isActionTask = /\b(?:implement|create|build|write|add|fix|update|refactor|modify)\b/i.test(content);
|
|
1042
|
+
if (!isActionTask) return null;
|
|
1043
|
+
|
|
1044
|
+
// Check for verification indicators
|
|
1045
|
+
const verificationPatterns = [
|
|
1046
|
+
/\btest(?:s|ing)?\b/i,
|
|
1047
|
+
/\bverify\b/i,
|
|
1048
|
+
/\bvalidate\b/i,
|
|
1049
|
+
/\bscreenshot\b/i,
|
|
1050
|
+
/\bexpected\s+(?:output|result|behavior)\b/i,
|
|
1051
|
+
/\bshould\s+(?:return|output|produce)\b/i,
|
|
1052
|
+
/\bexample\s+(?:input|output)\b/i,
|
|
1053
|
+
/\bcheck\s+(?:that|if)\b/i,
|
|
1054
|
+
/\brun\s+(?:the\s+)?tests?\b/i,
|
|
1055
|
+
/\bcompare\s+(?:to|with)\b/i,
|
|
1056
|
+
/\bassert\b/i,
|
|
1057
|
+
// Performance verification
|
|
1058
|
+
/\bbaseline\b/i,
|
|
1059
|
+
/\bbenchmark\b/i,
|
|
1060
|
+
/\bprofil(?:e|ing)\b/i
|
|
1061
|
+
];
|
|
1062
|
+
|
|
1063
|
+
for (const pattern of verificationPatterns) {
|
|
1064
|
+
if (pattern.test(content)) {
|
|
1065
|
+
return null;
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
return {
|
|
1070
|
+
issue: 'Task lacks verification criteria - no tests, expected output, or validation steps',
|
|
1071
|
+
fix: 'Add verification: "run tests after implementing" or "expected output: X" or "take screenshot and compare"'
|
|
1072
|
+
};
|
|
1073
|
+
}
|
|
1074
|
+
},
|
|
1075
|
+
|
|
1076
|
+
/**
|
|
1077
|
+
* Unscoped task description
|
|
1078
|
+
* HIGH certainty - vague scope leads to wrong solutions
|
|
1079
|
+
*/
|
|
1080
|
+
unscoped_task: {
|
|
1081
|
+
id: 'unscoped_task',
|
|
1082
|
+
category: 'clarity',
|
|
1083
|
+
certainty: 'HIGH',
|
|
1084
|
+
autoFix: false,
|
|
1085
|
+
description: 'Task description lacks specific scope (file, scenario, constraints)',
|
|
1086
|
+
check: (content) => {
|
|
1087
|
+
if (!content || typeof content !== 'string') return null;
|
|
1088
|
+
|
|
1089
|
+
const tokens = estimateTokens(content);
|
|
1090
|
+
if (tokens < 50) return null;
|
|
1091
|
+
|
|
1092
|
+
// Check for action without scope
|
|
1093
|
+
const vagueActions = [
|
|
1094
|
+
/^(?:fix|add|implement|update|change)\s+(?:the|a|some)?\s*\w+$/im,
|
|
1095
|
+
/\bfix\s+(?:the\s+)?bug\b/i,
|
|
1096
|
+
/\badd\s+(?:a\s+)?(?:feature|function|test)\b/i,
|
|
1097
|
+
/\bupdate\s+(?:the\s+)?(?:code|logic)\b/i
|
|
1098
|
+
];
|
|
1099
|
+
|
|
1100
|
+
const hasVagueAction = vagueActions.some(p => p.test(content));
|
|
1101
|
+
|
|
1102
|
+
// Check for scope indicators
|
|
1103
|
+
const scopePatterns = [
|
|
1104
|
+
/\bin\s+(?:file|folder|directory|module)\s+\S+/i,
|
|
1105
|
+
/\b(?:src|lib|test)\/\S+/,
|
|
1106
|
+
/\.(?:js|ts|py|rs|go|java|rb)\b/,
|
|
1107
|
+
/\bwhen\s+(?:the|a)\s+\w+/i,
|
|
1108
|
+
/\bfor\s+(?:the|a)\s+(?:case|scenario)\b/i,
|
|
1109
|
+
/\bspecifically\b/i,
|
|
1110
|
+
/\bedge\s+case/i
|
|
1111
|
+
];
|
|
1112
|
+
|
|
1113
|
+
const hasScope = scopePatterns.some(p => p.test(content));
|
|
1114
|
+
|
|
1115
|
+
if (hasVagueAction && !hasScope && tokens < 200) {
|
|
1116
|
+
return {
|
|
1117
|
+
issue: 'Task lacks specific scope (which file, what scenario, what constraints)',
|
|
1118
|
+
fix: 'Specify: "in src/auth/login.js" or "for the edge case where user is logged out" or "without using library X"'
|
|
1119
|
+
};
|
|
1120
|
+
}
|
|
1121
|
+
return null;
|
|
1122
|
+
}
|
|
1123
|
+
},
|
|
1124
|
+
|
|
1125
|
+
/**
|
|
1126
|
+
* Missing pattern reference
|
|
1127
|
+
* MEDIUM certainty - pointing to existing patterns improves consistency
|
|
1128
|
+
*/
|
|
1129
|
+
missing_pattern_reference: {
|
|
1130
|
+
id: 'missing_pattern_reference',
|
|
1131
|
+
category: 'context',
|
|
1132
|
+
certainty: 'MEDIUM',
|
|
1133
|
+
autoFix: false,
|
|
1134
|
+
description: 'Task could benefit from referencing existing patterns in codebase',
|
|
1135
|
+
check: (content) => {
|
|
1136
|
+
if (!content || typeof content !== 'string') return null;
|
|
1137
|
+
|
|
1138
|
+
// Only for tasks that involve creating new things
|
|
1139
|
+
const creationTasks = /\b(?:create|add|implement|build)\s+(?:a\s+)?(?:new\s+)?(?:component|widget|endpoint|handler|service|module)\b/i;
|
|
1140
|
+
if (!creationTasks.test(content)) return null;
|
|
1141
|
+
|
|
1142
|
+
// Check for pattern reference indicators
|
|
1143
|
+
// Use string-based checks to avoid ReDoS from overlapping optional groups
|
|
1144
|
+
const lcRef = content.toLowerCase();
|
|
1145
|
+
if (/\blike\s+\S+\b/i.test(content) ||
|
|
1146
|
+
lcRef.includes('similar to') ||
|
|
1147
|
+
(lcRef.includes('follow') && lcRef.includes('pattern')) ||
|
|
1148
|
+
(lcRef.includes('see ') && lcRef.includes('example')) ||
|
|
1149
|
+
(lcRef.includes('look at')) ||
|
|
1150
|
+
(/\.(?:js|ts|py)\b/.test(content) && lcRef.includes('example'))) {
|
|
1151
|
+
return null;
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
return {
|
|
1155
|
+
issue: 'Creating new code without referencing existing patterns in codebase',
|
|
1156
|
+
fix: 'Add: "look at how widgets are implemented in HomePage.tsx" or "follow the pattern in existing handlers"'
|
|
1157
|
+
};
|
|
1158
|
+
}
|
|
1159
|
+
},
|
|
1160
|
+
|
|
1161
|
+
/**
|
|
1162
|
+
* Missing source direction
|
|
1163
|
+
* MEDIUM certainty - directing to sources saves exploration time
|
|
1164
|
+
*/
|
|
1165
|
+
missing_source_direction: {
|
|
1166
|
+
id: 'missing_source_direction',
|
|
1167
|
+
category: 'context',
|
|
1168
|
+
certainty: 'MEDIUM',
|
|
1169
|
+
autoFix: false,
|
|
1170
|
+
description: 'Question/investigation without directing to likely sources',
|
|
1171
|
+
check: (content) => {
|
|
1172
|
+
if (!content || typeof content !== 'string') return null;
|
|
1173
|
+
|
|
1174
|
+
// Only for investigation/question tasks
|
|
1175
|
+
const investigationPatterns = [
|
|
1176
|
+
/\bwhy\s+does\b/i,
|
|
1177
|
+
/\bhow\s+does\b/i,
|
|
1178
|
+
/\bwhere\s+is\b/i,
|
|
1179
|
+
/\bwhat\s+(?:is|are|does)\b/i,
|
|
1180
|
+
/\bfind\s+(?:out|the)\b/i,
|
|
1181
|
+
/\binvestigate\b/i,
|
|
1182
|
+
/\bunderstand\b/i
|
|
1183
|
+
];
|
|
1184
|
+
|
|
1185
|
+
const isInvestigation = investigationPatterns.some(p => p.test(content));
|
|
1186
|
+
if (!isInvestigation) return null;
|
|
1187
|
+
|
|
1188
|
+
// Check for source directions
|
|
1189
|
+
const sourceDirections = [
|
|
1190
|
+
/\blook\s+(?:at|in|through)\b/i,
|
|
1191
|
+
/\bcheck\s+(?:the|in)\b/i,
|
|
1192
|
+
/\bstart\s+(?:with|from|in)\b/i,
|
|
1193
|
+
/\bsee\s+\S+\b/i,
|
|
1194
|
+
/\bin\s+(?:the\s+)?\S+\s+(?:file|folder|directory)\b/i,
|
|
1195
|
+
/\bgit\s+(?:log|history|blame)\b/i
|
|
1196
|
+
];
|
|
1197
|
+
|
|
1198
|
+
for (const pattern of sourceDirections) {
|
|
1199
|
+
if (pattern.test(content)) {
|
|
1200
|
+
return null;
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
const tokens = estimateTokens(content);
|
|
1205
|
+
if (tokens < 100) {
|
|
1206
|
+
return {
|
|
1207
|
+
issue: 'Investigation task without directing to likely sources',
|
|
1208
|
+
fix: 'Add: "look through git history" or "check the auth flow in src/auth/" or "start in the config files"'
|
|
1209
|
+
};
|
|
1210
|
+
}
|
|
1211
|
+
return null;
|
|
1212
|
+
}
|
|
1213
|
+
},
|
|
1214
|
+
|
|
1215
|
+
// ============================================
|
|
1216
|
+
// CODE VALIDATION PATTERNS (HIGH/MEDIUM certainty)
|
|
1217
|
+
// ============================================
|
|
1218
|
+
|
|
1219
|
+
/**
|
|
1220
|
+
* Invalid JSON in code blocks
|
|
1221
|
+
* HIGH certainty - JSON syntax errors are unambiguous
|
|
1222
|
+
*/
|
|
1223
|
+
invalid_json_in_code_block: {
|
|
1224
|
+
id: 'invalid_json_in_code_block',
|
|
1225
|
+
category: 'code-validation',
|
|
1226
|
+
certainty: 'HIGH',
|
|
1227
|
+
autoFix: false,
|
|
1228
|
+
description: 'JSON code block contains invalid JSON syntax',
|
|
1229
|
+
check: (content) => {
|
|
1230
|
+
if (!content || typeof content !== 'string') return null;
|
|
1231
|
+
|
|
1232
|
+
const blocks = extractCodeBlocks(content);
|
|
1233
|
+
const jsonBlocks = blocks.filter(b =>
|
|
1234
|
+
b.language.toLowerCase() === 'json'
|
|
1235
|
+
);
|
|
1236
|
+
|
|
1237
|
+
for (const block of jsonBlocks) {
|
|
1238
|
+
// Skip if inside bad-example tags
|
|
1239
|
+
const position = getPositionForLine(content, block.startLine);
|
|
1240
|
+
if (isInsideExampleTag(content, position)) {
|
|
1241
|
+
continue;
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
// Skip empty blocks
|
|
1245
|
+
if (!block.code.trim()) continue;
|
|
1246
|
+
|
|
1247
|
+
// Skip very large blocks (>50KB) for performance
|
|
1248
|
+
if (block.code.length > 50000) continue;
|
|
1249
|
+
|
|
1250
|
+
// Skip blocks with placeholder syntax (common in documentation)
|
|
1251
|
+
// e.g., [...], {...}, <...>, "...", etc.
|
|
1252
|
+
if (/\[\.\.\.\]|\{\.\.\.\}|<\.\.\.>|"\.\.\."|\.\.\./g.test(block.code)) continue;
|
|
1253
|
+
|
|
1254
|
+
// Skip blocks with comments (// or /* */) - not valid JSON but common in docs
|
|
1255
|
+
if (/\/\/|\/\*/.test(block.code)) continue;
|
|
1256
|
+
|
|
1257
|
+
// Skip blocks with template variables (${...}) - pseudo-code, not actual JSON
|
|
1258
|
+
if (/\$\{/.test(block.code)) continue;
|
|
1259
|
+
|
|
1260
|
+
// Skip blocks with type union syntax (|) - schema docs, not actual JSON
|
|
1261
|
+
if (/\|/.test(block.code)) continue;
|
|
1262
|
+
|
|
1263
|
+
try {
|
|
1264
|
+
JSON.parse(block.code);
|
|
1265
|
+
} catch (err) {
|
|
1266
|
+
return {
|
|
1267
|
+
issue: `Invalid JSON at line ${block.startLine}: ${err.message}`,
|
|
1268
|
+
fix: 'Fix JSON syntax error in the code block'
|
|
1269
|
+
};
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
return null;
|
|
1274
|
+
}
|
|
1275
|
+
},
|
|
1276
|
+
|
|
1277
|
+
// NOTE: JavaScript syntax validation removed - too many false positives
|
|
1278
|
+
// (modules, async/await, JSX, TypeScript not supported by Function constructor)
|
|
1279
|
+
// We can only reliably validate static formats: YAML frontmatter, JSON
|
|
1280
|
+
|
|
1281
|
+
/**
|
|
1282
|
+
* Code language tag mismatch
|
|
1283
|
+
* MEDIUM certainty - heuristic detection may have false positives
|
|
1284
|
+
*/
|
|
1285
|
+
code_language_mismatch: {
|
|
1286
|
+
id: 'code_language_mismatch',
|
|
1287
|
+
category: 'code-validation',
|
|
1288
|
+
certainty: 'MEDIUM',
|
|
1289
|
+
autoFix: false,
|
|
1290
|
+
description: 'Code block language tag may not match actual content',
|
|
1291
|
+
check: (content) => {
|
|
1292
|
+
if (!content || typeof content !== 'string') return null;
|
|
1293
|
+
|
|
1294
|
+
const blocks = extractCodeBlocks(content);
|
|
1295
|
+
|
|
1296
|
+
for (const block of blocks) {
|
|
1297
|
+
// Skip blocks without language tag or inside bad-example
|
|
1298
|
+
if (!block.language) continue;
|
|
1299
|
+
const position = getPositionForLine(content, block.startLine);
|
|
1300
|
+
if (isInsideExampleTag(content, position)) continue;
|
|
1301
|
+
|
|
1302
|
+
// Skip empty blocks
|
|
1303
|
+
const code = block.code.trim();
|
|
1304
|
+
if (!code) continue;
|
|
1305
|
+
|
|
1306
|
+
const lang = block.language.toLowerCase();
|
|
1307
|
+
|
|
1308
|
+
// JSON detection: starts with { or [ and contains : or ,
|
|
1309
|
+
const looksLikeJson = LOOKS_LIKE_JSON_START.test(code) &&
|
|
1310
|
+
LOOKS_LIKE_JSON_CONTENT.test(code) &&
|
|
1311
|
+
!NOT_JSON_KEYWORDS.test(code);
|
|
1312
|
+
|
|
1313
|
+
// JavaScript detection: has JS keywords
|
|
1314
|
+
const looksLikeJs = LOOKS_LIKE_JS.test(code);
|
|
1315
|
+
|
|
1316
|
+
// Python detection: has Python keywords
|
|
1317
|
+
const looksLikePython = LOOKS_LIKE_PYTHON.test(code);
|
|
1318
|
+
|
|
1319
|
+
// Check for clear mismatches
|
|
1320
|
+
if (lang === 'json' && looksLikeJs && !looksLikeJson) {
|
|
1321
|
+
return {
|
|
1322
|
+
issue: `Line ${block.startLine}: Code tagged as JSON but appears to be JavaScript`,
|
|
1323
|
+
fix: 'Change language tag from "json" to "javascript" or "js"'
|
|
1324
|
+
};
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
if (lang === 'json' && looksLikePython && !looksLikeJson) {
|
|
1328
|
+
return {
|
|
1329
|
+
issue: `Line ${block.startLine}: Code tagged as JSON but appears to be Python`,
|
|
1330
|
+
fix: 'Change language tag from "json" to "python"'
|
|
1331
|
+
};
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
if ((lang === 'js' || lang === 'javascript') && looksLikeJson && !looksLikeJs) {
|
|
1335
|
+
return {
|
|
1336
|
+
issue: `Line ${block.startLine}: Code tagged as JavaScript but appears to be JSON`,
|
|
1337
|
+
fix: 'Change language tag to "json"'
|
|
1338
|
+
};
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
if ((lang === 'js' || lang === 'javascript') && looksLikePython && !looksLikeJs) {
|
|
1342
|
+
return {
|
|
1343
|
+
issue: `Line ${block.startLine}: Code tagged as JavaScript but appears to be Python`,
|
|
1344
|
+
fix: 'Change language tag to "python"'
|
|
1345
|
+
};
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
if ((lang === 'python' || lang === 'py') && looksLikeJs && !looksLikePython) {
|
|
1349
|
+
return {
|
|
1350
|
+
issue: `Line ${block.startLine}: Code tagged as Python but appears to be JavaScript`,
|
|
1351
|
+
fix: 'Change language tag to "javascript" or "js"'
|
|
1352
|
+
};
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
return null;
|
|
1357
|
+
}
|
|
1358
|
+
},
|
|
1359
|
+
|
|
1360
|
+
/**
|
|
1361
|
+
* Heading hierarchy gaps
|
|
1362
|
+
* HIGH certainty - heading levels should not skip
|
|
1363
|
+
*/
|
|
1364
|
+
heading_hierarchy_gaps: {
|
|
1365
|
+
id: 'heading_hierarchy_gaps',
|
|
1366
|
+
category: 'structure',
|
|
1367
|
+
certainty: 'HIGH',
|
|
1368
|
+
autoFix: false,
|
|
1369
|
+
description: 'Heading hierarchy skips levels (e.g., H1 to H3 without H2)',
|
|
1370
|
+
check: (content) => {
|
|
1371
|
+
if (!content || typeof content !== 'string') return null;
|
|
1372
|
+
|
|
1373
|
+
// Get code block ranges to exclude headings inside them
|
|
1374
|
+
const codeBlocks = extractCodeBlocks(content);
|
|
1375
|
+
const codeBlockLines = new Set();
|
|
1376
|
+
for (const block of codeBlocks) {
|
|
1377
|
+
for (let line = block.startLine; line <= block.endLine; line++) {
|
|
1378
|
+
codeBlockLines.add(line);
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
// Extract headings with their levels and line numbers (excluding code blocks)
|
|
1383
|
+
const lines = content.split('\n');
|
|
1384
|
+
const headings = [];
|
|
1385
|
+
|
|
1386
|
+
for (let i = 0; i < lines.length; i++) {
|
|
1387
|
+
const lineNum = i + 1;
|
|
1388
|
+
// Skip lines inside code blocks
|
|
1389
|
+
if (codeBlockLines.has(lineNum)) continue;
|
|
1390
|
+
|
|
1391
|
+
const line = lines[i];
|
|
1392
|
+
const match = line.match(/^(#{1,6})[ \t]+(\S.*)$/);
|
|
1393
|
+
if (match) {
|
|
1394
|
+
headings.push({
|
|
1395
|
+
level: match[1].length,
|
|
1396
|
+
text: match[2].trim(),
|
|
1397
|
+
line: lineNum
|
|
1398
|
+
});
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1402
|
+
// Need at least 2 headings to check hierarchy
|
|
1403
|
+
if (headings.length < 2) return null;
|
|
1404
|
+
|
|
1405
|
+
// Check for gaps in hierarchy
|
|
1406
|
+
for (let i = 1; i < headings.length; i++) {
|
|
1407
|
+
const current = headings[i];
|
|
1408
|
+
const prev = headings[i - 1];
|
|
1409
|
+
|
|
1410
|
+
// Only check if going to a more nested level
|
|
1411
|
+
if (current.level > prev.level && current.level - prev.level > 1) {
|
|
1412
|
+
return {
|
|
1413
|
+
issue: `Line ${current.line}: Heading jumps from H${prev.level} to H${current.level} (skipped H${prev.level + 1})`,
|
|
1414
|
+
fix: `Add intermediate H${prev.level + 1} heading or adjust heading levels to maintain hierarchy`
|
|
1415
|
+
};
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1419
|
+
return null;
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
};
|
|
1423
|
+
|
|
1424
|
+
/**
|
|
1425
|
+
* Get all patterns
|
|
1426
|
+
* @returns {Object} All prompt patterns
|
|
1427
|
+
*/
|
|
1428
|
+
function getAllPatterns() {
|
|
1429
|
+
return promptPatterns;
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
/**
|
|
1433
|
+
* Get patterns by certainty level
|
|
1434
|
+
* @param {string} certainty - HIGH, MEDIUM, or LOW
|
|
1435
|
+
* @returns {Object} Filtered patterns
|
|
1436
|
+
*/
|
|
1437
|
+
function getPatternsByCertainty(certainty) {
|
|
1438
|
+
const result = {};
|
|
1439
|
+
for (const [name, pattern] of Object.entries(promptPatterns)) {
|
|
1440
|
+
if (pattern.certainty === certainty) {
|
|
1441
|
+
result[name] = pattern;
|
|
1442
|
+
}
|
|
1443
|
+
}
|
|
1444
|
+
return result;
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1447
|
+
/**
|
|
1448
|
+
* Get patterns by category
|
|
1449
|
+
* @param {string} category - clarity, structure, examples, context, output, anti-pattern
|
|
1450
|
+
* @returns {Object} Filtered patterns
|
|
1451
|
+
*/
|
|
1452
|
+
function getPatternsByCategory(category) {
|
|
1453
|
+
const result = {};
|
|
1454
|
+
for (const [name, pattern] of Object.entries(promptPatterns)) {
|
|
1455
|
+
if (pattern.category === category) {
|
|
1456
|
+
result[name] = pattern;
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
return result;
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
/**
|
|
1463
|
+
* Get auto-fixable patterns
|
|
1464
|
+
* @returns {Object} Patterns with autoFix: true
|
|
1465
|
+
*/
|
|
1466
|
+
function getAutoFixablePatterns() {
|
|
1467
|
+
const result = {};
|
|
1468
|
+
for (const [name, pattern] of Object.entries(promptPatterns)) {
|
|
1469
|
+
if (pattern.autoFix) {
|
|
1470
|
+
result[name] = pattern;
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
return result;
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
module.exports = {
|
|
1477
|
+
promptPatterns,
|
|
1478
|
+
estimateTokens,
|
|
1479
|
+
extractCodeBlocks,
|
|
1480
|
+
getAllPatterns,
|
|
1481
|
+
getPatternsByCertainty,
|
|
1482
|
+
getPatternsByCategory,
|
|
1483
|
+
getAutoFixablePatterns
|
|
1484
|
+
};
|