@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17
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/README.md +21 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1462 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +882 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +64 -9
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Laziness Detection Hook
|
|
3
|
+
*
|
|
4
|
+
* Pre-write hook that detects and blocks destructive avoidance patterns
|
|
5
|
+
* including test deletion, feature removal, and coverage regression.
|
|
6
|
+
*
|
|
7
|
+
* @implements @.aiwg/requirements/use-cases/UC-AP-001-detect-test-deletion.md
|
|
8
|
+
* @implements @.aiwg/requirements/use-cases/UC-AP-002-detect-feature-removal.md
|
|
9
|
+
* @implements @.aiwg/requirements/use-cases/UC-AP-003-detect-coverage-regression.md
|
|
10
|
+
* @schema @.aiwg/patterns/laziness-patterns.yaml
|
|
11
|
+
* @agent @agentic/code/frameworks/sdlc-complete/agents/laziness-detector.md
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import * as yaml from 'js-yaml';
|
|
16
|
+
/**
|
|
17
|
+
* Laziness Detection Hook
|
|
18
|
+
*
|
|
19
|
+
* Analyzes pending file changes for avoidance patterns.
|
|
20
|
+
*/
|
|
21
|
+
export class LazinessDetectionHook {
|
|
22
|
+
constructor(patternsPath) {
|
|
23
|
+
const defaultPath = path.join(__dirname, '../../.aiwg/patterns/laziness-patterns.yaml');
|
|
24
|
+
const patternFile = patternsPath || defaultPath;
|
|
25
|
+
try {
|
|
26
|
+
const content = fs.readFileSync(patternFile, 'utf8');
|
|
27
|
+
yaml.load(content); // Validate patterns file loads
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Patterns file is optional — all detection logic is hardcoded.
|
|
31
|
+
// Missing file is expected in CI and fresh project checkouts
|
|
32
|
+
// where .aiwg/ doesn't exist.
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Main entry point - analyze file changes before write
|
|
37
|
+
*/
|
|
38
|
+
async analyze(changes) {
|
|
39
|
+
const detectedPatterns = [];
|
|
40
|
+
// Capture baseline metrics
|
|
41
|
+
await this.captureBaseline();
|
|
42
|
+
// Run pattern detection
|
|
43
|
+
for (const change of changes) {
|
|
44
|
+
const patterns = await this.detectPatternsInChange(change);
|
|
45
|
+
detectedPatterns.push(...patterns);
|
|
46
|
+
}
|
|
47
|
+
// Assess overall severity
|
|
48
|
+
const decision = this.makeBlockDecision(detectedPatterns);
|
|
49
|
+
return decision;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Detect patterns in a single file change
|
|
53
|
+
*/
|
|
54
|
+
async detectPatternsInChange(change) {
|
|
55
|
+
const detected = [];
|
|
56
|
+
// Test deletion patterns
|
|
57
|
+
if (this.isTestFile(change.path)) {
|
|
58
|
+
detected.push(...this.detectTestDeletion(change));
|
|
59
|
+
detected.push(...this.detectTestDisabling(change));
|
|
60
|
+
detected.push(...this.detectAssertionWeakening(change));
|
|
61
|
+
}
|
|
62
|
+
// Feature removal patterns (in source files)
|
|
63
|
+
if (this.isSourceFile(change.path) && !this.isTestFile(change.path)) {
|
|
64
|
+
detected.push(...this.detectFeatureRemoval(change));
|
|
65
|
+
detected.push(...this.detectValidationRemoval(change));
|
|
66
|
+
detected.push(...this.detectErrorHandlerDeletion(change));
|
|
67
|
+
detected.push(...this.detectHardcodedBypass(change));
|
|
68
|
+
detected.push(...this.detectErrorSuppression(change));
|
|
69
|
+
detected.push(...this.detectTodoAccumulation(change));
|
|
70
|
+
}
|
|
71
|
+
// Config changes
|
|
72
|
+
if (this.isConfigFile(change.path)) {
|
|
73
|
+
detected.push(...this.detectFeatureFlagDisabling(change));
|
|
74
|
+
}
|
|
75
|
+
return detected;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Pattern: LP-001 - Complete Test File Deletion
|
|
79
|
+
*/
|
|
80
|
+
detectTestDeletion(change) {
|
|
81
|
+
if (change.type !== 'deleted')
|
|
82
|
+
return [];
|
|
83
|
+
const deletionPercentage = change.linesDeleted / (change.linesAdded + change.linesDeleted);
|
|
84
|
+
if (deletionPercentage > 0.9) {
|
|
85
|
+
return [
|
|
86
|
+
{
|
|
87
|
+
id: 'LP-001',
|
|
88
|
+
name: 'Complete Test File Deletion',
|
|
89
|
+
category: 'test_deletion',
|
|
90
|
+
severity: 'CRITICAL',
|
|
91
|
+
file: change.path,
|
|
92
|
+
match: `Entire test file deleted (${change.linesDeleted} lines)`,
|
|
93
|
+
confidence: 1.0,
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Pattern: LP-002, LP-003 - Test Suite/Individual Test Disabling
|
|
101
|
+
*/
|
|
102
|
+
detectTestDisabling(change) {
|
|
103
|
+
const detected = [];
|
|
104
|
+
const lines = change.diff.split('\n');
|
|
105
|
+
const skipPatterns = [
|
|
106
|
+
/^\+.*describe\.skip\(/,
|
|
107
|
+
/^\+.*it\.skip\(/,
|
|
108
|
+
/^\+.*test\.skip\(/,
|
|
109
|
+
/^\+.*xit\(/,
|
|
110
|
+
/^\+.*xtest\(/,
|
|
111
|
+
/^\+\s*@Ignore/, // Fixed: allows leading whitespace
|
|
112
|
+
/^\+.*@pytest\.mark\.skip/,
|
|
113
|
+
];
|
|
114
|
+
let skipCount = 0;
|
|
115
|
+
let isSuiteSkip = false;
|
|
116
|
+
let isIgnoreAnnotation = false;
|
|
117
|
+
for (let i = 0; i < lines.length; i++) {
|
|
118
|
+
const line = lines[i];
|
|
119
|
+
for (const pattern of skipPatterns) {
|
|
120
|
+
if (pattern.test(line)) {
|
|
121
|
+
skipCount++;
|
|
122
|
+
// Check if it's a suite skip (describe.skip)
|
|
123
|
+
if (/describe\.skip/.test(line)) {
|
|
124
|
+
isSuiteSkip = true;
|
|
125
|
+
}
|
|
126
|
+
// Check if it's @Ignore annotation
|
|
127
|
+
if (/@Ignore/.test(line)) {
|
|
128
|
+
isIgnoreAnnotation = true;
|
|
129
|
+
}
|
|
130
|
+
// Only record individual occurrences if threshold not met
|
|
131
|
+
if (skipCount === 1) {
|
|
132
|
+
detected.push({
|
|
133
|
+
id: isSuiteSkip || isIgnoreAnnotation ? 'LP-002' : 'LP-003',
|
|
134
|
+
name: isSuiteSkip || isIgnoreAnnotation
|
|
135
|
+
? 'Test Suite Disabling'
|
|
136
|
+
: 'Individual Test Disabling',
|
|
137
|
+
category: 'test_deletion',
|
|
138
|
+
severity: isSuiteSkip || isIgnoreAnnotation ? 'HIGH' : 'MEDIUM',
|
|
139
|
+
file: change.path,
|
|
140
|
+
line: i + 1,
|
|
141
|
+
match: line.trim(),
|
|
142
|
+
confidence: 0.9,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// If multiple tests disabled, escalate severity
|
|
149
|
+
if (skipCount > 3) {
|
|
150
|
+
detected[0].severity = 'HIGH';
|
|
151
|
+
detected[0].id = 'LP-003';
|
|
152
|
+
detected[0].name = 'Multiple Individual Test Disabling';
|
|
153
|
+
detected[0].match = `${skipCount} tests disabled across file`;
|
|
154
|
+
}
|
|
155
|
+
return detected;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Pattern: LP-012 - Trivial Assertion Replacement
|
|
159
|
+
*/
|
|
160
|
+
detectAssertionWeakening(change) {
|
|
161
|
+
const detected = [];
|
|
162
|
+
const lines = change.diff.split('\n');
|
|
163
|
+
const trivialPatterns = [
|
|
164
|
+
/expect\(true\)\.toBe\(true\)/,
|
|
165
|
+
/expect\(1\)\.toBe\(1\)/,
|
|
166
|
+
/expect\(false\)\.toBe\(false\)/,
|
|
167
|
+
/assert\(True\)/,
|
|
168
|
+
/assert True/,
|
|
169
|
+
];
|
|
170
|
+
for (let i = 0; i < lines.length; i++) {
|
|
171
|
+
const line = lines[i];
|
|
172
|
+
if (line.startsWith('+')) {
|
|
173
|
+
for (const pattern of trivialPatterns) {
|
|
174
|
+
if (pattern.test(line)) {
|
|
175
|
+
detected.push({
|
|
176
|
+
id: 'LP-012',
|
|
177
|
+
name: 'Trivial Assertion Replacement',
|
|
178
|
+
category: 'assertion_weakening',
|
|
179
|
+
severity: 'CRITICAL',
|
|
180
|
+
file: change.path,
|
|
181
|
+
line: i + 1,
|
|
182
|
+
match: line.trim(),
|
|
183
|
+
confidence: 1.0,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return detected;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Pattern: LP-005 - Feature Code Commenting
|
|
193
|
+
*/
|
|
194
|
+
detectFeatureRemoval(change) {
|
|
195
|
+
const lines = change.diff.split('\n');
|
|
196
|
+
let commentedLineCount = 0;
|
|
197
|
+
const commentedBlocks = [];
|
|
198
|
+
for (let i = 0; i < lines.length; i++) {
|
|
199
|
+
const line = lines[i];
|
|
200
|
+
// Detect lines changed to comments (added lines that start with //)
|
|
201
|
+
if (line.startsWith('+') && /^\+\s*\/\//.test(line)) {
|
|
202
|
+
// Filter out documentation comments (descriptive text, not code)
|
|
203
|
+
const commentContent = line.replace(/^\+\s*\/\/\s*/, '').trim();
|
|
204
|
+
// Skip if it looks like pure documentation (long explanatory sentences)
|
|
205
|
+
// But count TODO/FIXME/code-like comments
|
|
206
|
+
const isDocumentation = /^(This function|This class|This method|Parameters:|Returns:|@param|@returns)/i.test(commentContent);
|
|
207
|
+
if (!isDocumentation) {
|
|
208
|
+
commentedLineCount++;
|
|
209
|
+
commentedBlocks.push(i + 1);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (commentedLineCount > 10) {
|
|
214
|
+
return [
|
|
215
|
+
{
|
|
216
|
+
id: 'LP-005',
|
|
217
|
+
name: 'Feature Code Commenting',
|
|
218
|
+
category: 'feature_removal',
|
|
219
|
+
severity: 'HIGH',
|
|
220
|
+
file: change.path,
|
|
221
|
+
line: commentedBlocks[0],
|
|
222
|
+
match: `${commentedLineCount} lines commented out`,
|
|
223
|
+
confidence: 0.85,
|
|
224
|
+
},
|
|
225
|
+
];
|
|
226
|
+
}
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Pattern: TODO/FIXME Accumulation (MEDIUM severity)
|
|
231
|
+
*/
|
|
232
|
+
detectTodoAccumulation(change) {
|
|
233
|
+
const lines = change.diff.split('\n');
|
|
234
|
+
let todoCount = 0;
|
|
235
|
+
const todoLines = [];
|
|
236
|
+
for (let i = 0; i < lines.length; i++) {
|
|
237
|
+
const line = lines[i];
|
|
238
|
+
if (line.startsWith('+') &&
|
|
239
|
+
/(TODO|FIXME|HACK|XXX|NOTE|WARNING):/i.test(line)) {
|
|
240
|
+
todoCount++;
|
|
241
|
+
todoLines.push(i + 1);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (todoCount > 3) {
|
|
245
|
+
return [
|
|
246
|
+
{
|
|
247
|
+
id: 'LP-TODO',
|
|
248
|
+
name: 'TODO/FIXME Accumulation',
|
|
249
|
+
category: 'incomplete_work',
|
|
250
|
+
severity: 'MEDIUM',
|
|
251
|
+
file: change.path,
|
|
252
|
+
line: todoLines[0],
|
|
253
|
+
match: `${todoCount} TODO/FIXME markers added`,
|
|
254
|
+
confidence: 0.8,
|
|
255
|
+
},
|
|
256
|
+
];
|
|
257
|
+
}
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Pattern: LP-006 - Validation Removal
|
|
262
|
+
*/
|
|
263
|
+
detectValidationRemoval(change) {
|
|
264
|
+
const detected = [];
|
|
265
|
+
const lines = change.diff.split('\n');
|
|
266
|
+
const validationPatterns = [
|
|
267
|
+
/^-\s*if\s*\(!/,
|
|
268
|
+
/^-\s*validate\(/,
|
|
269
|
+
/^-\s*(const|let|var)\s+\w+\s*=\s*sanitize\(/, // Fixed: detect variable assignment
|
|
270
|
+
/^-\s*sanitize\(/, // Also detect direct call
|
|
271
|
+
/^-\s*\.includes\('@'\)/,
|
|
272
|
+
];
|
|
273
|
+
for (let i = 0; i < lines.length; i++) {
|
|
274
|
+
const line = lines[i];
|
|
275
|
+
for (const pattern of validationPatterns) {
|
|
276
|
+
if (pattern.test(line)) {
|
|
277
|
+
detected.push({
|
|
278
|
+
id: 'LP-006',
|
|
279
|
+
name: 'Validation Removal',
|
|
280
|
+
category: 'feature_removal',
|
|
281
|
+
severity: 'CRITICAL',
|
|
282
|
+
file: change.path,
|
|
283
|
+
line: i + 1,
|
|
284
|
+
match: line.trim(),
|
|
285
|
+
confidence: 0.9,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return detected;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Pattern: LP-007 - Error Handler Deletion
|
|
294
|
+
*/
|
|
295
|
+
detectErrorHandlerDeletion(change) {
|
|
296
|
+
const detected = [];
|
|
297
|
+
const lines = change.diff.split('\n');
|
|
298
|
+
const errorPatterns = [
|
|
299
|
+
/^-\s*catch\s*\(/,
|
|
300
|
+
/^-\s*throw new Error/,
|
|
301
|
+
/^-\s*throw\s+/,
|
|
302
|
+
];
|
|
303
|
+
for (let i = 0; i < lines.length; i++) {
|
|
304
|
+
const line = lines[i];
|
|
305
|
+
for (const pattern of errorPatterns) {
|
|
306
|
+
if (pattern.test(line)) {
|
|
307
|
+
detected.push({
|
|
308
|
+
id: 'LP-007',
|
|
309
|
+
name: 'Error Handler Deletion',
|
|
310
|
+
category: 'feature_removal',
|
|
311
|
+
severity: 'HIGH',
|
|
312
|
+
file: change.path,
|
|
313
|
+
line: i + 1,
|
|
314
|
+
match: line.trim(),
|
|
315
|
+
confidence: 0.85,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return detected;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Pattern: LP-015 - Hardcoded Test Bypass
|
|
324
|
+
*/
|
|
325
|
+
detectHardcodedBypass(change) {
|
|
326
|
+
const detected = [];
|
|
327
|
+
const lines = change.diff.split('\n');
|
|
328
|
+
const bypassPatterns = [
|
|
329
|
+
/test@example\.com/,
|
|
330
|
+
/NODE_ENV.*test/,
|
|
331
|
+
/process\.env\.CI/,
|
|
332
|
+
/if.*CI.*true/,
|
|
333
|
+
];
|
|
334
|
+
for (let i = 0; i < lines.length; i++) {
|
|
335
|
+
const line = lines[i];
|
|
336
|
+
if (line.startsWith('+')) {
|
|
337
|
+
for (const pattern of bypassPatterns) {
|
|
338
|
+
if (pattern.test(line)) {
|
|
339
|
+
detected.push({
|
|
340
|
+
id: 'LP-015',
|
|
341
|
+
name: 'Hardcoded Test Bypass',
|
|
342
|
+
category: 'workaround',
|
|
343
|
+
severity: 'CRITICAL',
|
|
344
|
+
file: change.path,
|
|
345
|
+
line: i + 1,
|
|
346
|
+
match: line.trim(),
|
|
347
|
+
confidence: 0.95,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return detected;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Pattern: LP-016 - Error Suppression
|
|
357
|
+
*/
|
|
358
|
+
detectErrorSuppression(change) {
|
|
359
|
+
const detected = [];
|
|
360
|
+
const lines = change.diff.split('\n');
|
|
361
|
+
for (let i = 0; i < lines.length; i++) {
|
|
362
|
+
const line = lines[i];
|
|
363
|
+
// Detect empty catch blocks or catch with ignore comment
|
|
364
|
+
if (line.startsWith('+') &&
|
|
365
|
+
(/catch\s*\([^)]+\)\s*\{\s*\}/.test(line) ||
|
|
366
|
+
/catch.*\/\/\s*ignore/.test(line) ||
|
|
367
|
+
/catch.*\/\*\s*ignore/.test(line))) {
|
|
368
|
+
detected.push({
|
|
369
|
+
id: 'LP-016',
|
|
370
|
+
name: 'Error Suppression',
|
|
371
|
+
category: 'workaround',
|
|
372
|
+
severity: 'HIGH',
|
|
373
|
+
file: change.path,
|
|
374
|
+
line: i + 1,
|
|
375
|
+
match: line.trim(),
|
|
376
|
+
confidence: 0.9,
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return detected;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Pattern: LP-008 - Feature Flag Disabling
|
|
384
|
+
*/
|
|
385
|
+
detectFeatureFlagDisabling(change) {
|
|
386
|
+
const detected = [];
|
|
387
|
+
const lines = change.diff.split('\n');
|
|
388
|
+
for (let i = 0; i < lines.length; i++) {
|
|
389
|
+
const line = lines[i];
|
|
390
|
+
const nextLine = lines[i + 1] || '';
|
|
391
|
+
// Detect true -> false changes in config
|
|
392
|
+
if (line.startsWith('-') &&
|
|
393
|
+
/:\s*true/.test(line) &&
|
|
394
|
+
nextLine.startsWith('+') &&
|
|
395
|
+
/:\s*false/.test(nextLine)) {
|
|
396
|
+
detected.push({
|
|
397
|
+
id: 'LP-008',
|
|
398
|
+
name: 'Feature Flag Disabling',
|
|
399
|
+
category: 'feature_removal',
|
|
400
|
+
severity: 'HIGH',
|
|
401
|
+
file: change.path,
|
|
402
|
+
line: i + 1,
|
|
403
|
+
match: `${line.trim()} -> ${nextLine.trim()}`,
|
|
404
|
+
confidence: 0.9,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return detected;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Make blocking decision based on detected patterns
|
|
412
|
+
*/
|
|
413
|
+
makeBlockDecision(patterns) {
|
|
414
|
+
if (patterns.length === 0) {
|
|
415
|
+
return {
|
|
416
|
+
block: false,
|
|
417
|
+
log: true,
|
|
418
|
+
reason: 'No avoidance patterns detected',
|
|
419
|
+
patterns: [],
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
// Check for CRITICAL patterns
|
|
423
|
+
const criticalPatterns = patterns.filter((p) => p.severity === 'CRITICAL');
|
|
424
|
+
if (criticalPatterns.length > 0) {
|
|
425
|
+
return {
|
|
426
|
+
block: true,
|
|
427
|
+
warn: true, // Also set warn for completeness
|
|
428
|
+
log: true,
|
|
429
|
+
reason: `CRITICAL avoidance patterns detected: ${criticalPatterns.map((p) => p.name).join(', ')}`,
|
|
430
|
+
recovery: 'FIX_ROOT_CAUSE',
|
|
431
|
+
patterns,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
// Check for multiple HIGH patterns (compound avoidance)
|
|
435
|
+
const highPatterns = patterns.filter((p) => p.severity === 'HIGH');
|
|
436
|
+
if (highPatterns.length > 2) {
|
|
437
|
+
return {
|
|
438
|
+
block: true,
|
|
439
|
+
warn: true,
|
|
440
|
+
log: true,
|
|
441
|
+
reason: `Multiple HIGH-severity patterns detected (compound avoidance): ${highPatterns.map((p) => p.name).join(', ')}`,
|
|
442
|
+
recovery: 'FIX_ALL_ISSUES',
|
|
443
|
+
patterns,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
// Check for multiple MEDIUM patterns across files (compound avoidance)
|
|
447
|
+
const mediumPatterns = patterns.filter((p) => p.severity === 'MEDIUM');
|
|
448
|
+
const uniqueFiles = new Set(mediumPatterns.map((p) => p.file));
|
|
449
|
+
if (mediumPatterns.length > 2 && uniqueFiles.size > 1) {
|
|
450
|
+
// Multiple MEDIUM patterns across multiple files = compound avoidance
|
|
451
|
+
return {
|
|
452
|
+
block: true,
|
|
453
|
+
warn: true,
|
|
454
|
+
log: true,
|
|
455
|
+
reason: `Multiple MEDIUM-severity patterns across files (compound avoidance): ${mediumPatterns.map((p) => p.name).join(', ')}`,
|
|
456
|
+
recovery: 'FIX_ALL_ISSUES',
|
|
457
|
+
patterns,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
// Single HIGH pattern - block with warning
|
|
461
|
+
if (highPatterns.length > 0) {
|
|
462
|
+
return {
|
|
463
|
+
block: true,
|
|
464
|
+
warn: true,
|
|
465
|
+
log: true,
|
|
466
|
+
reason: `HIGH-severity pattern detected: ${highPatterns[0].name}`,
|
|
467
|
+
recovery: 'PROVIDE_JUSTIFICATION_OR_FIX',
|
|
468
|
+
patterns,
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
// MEDIUM patterns (not compound) - warn but allow
|
|
472
|
+
if (mediumPatterns.length > 0) {
|
|
473
|
+
return {
|
|
474
|
+
block: false,
|
|
475
|
+
warn: true, // Fixed: explicitly set warn: true
|
|
476
|
+
log: true,
|
|
477
|
+
reason: `MEDIUM-severity patterns detected: ${mediumPatterns.map((p) => p.name).join(', ')}`,
|
|
478
|
+
patterns,
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
// LOW patterns - log only
|
|
482
|
+
return {
|
|
483
|
+
block: false,
|
|
484
|
+
warn: false,
|
|
485
|
+
log: true, // Fixed: explicitly set log: true
|
|
486
|
+
reason: `LOW-severity patterns detected: ${patterns.map((p) => p.name).join(', ')}`,
|
|
487
|
+
patterns,
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Helper: Check if file is a test file
|
|
492
|
+
*/
|
|
493
|
+
isTestFile(filePath) {
|
|
494
|
+
return (/test.*\.(ts|js|py|java)$/.test(filePath) ||
|
|
495
|
+
/\.test\.(ts|js|py|java)$/.test(filePath) ||
|
|
496
|
+
/\.spec\.(ts|js|py|java)$/.test(filePath) ||
|
|
497
|
+
/_test\.py$/.test(filePath) ||
|
|
498
|
+
/Test\.java$/.test(filePath) // Added: Java test files
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Helper: Check if file is source code (not test)
|
|
503
|
+
*/
|
|
504
|
+
isSourceFile(filePath) {
|
|
505
|
+
return (/\.(ts|js|py)$/.test(filePath) &&
|
|
506
|
+
!/node_modules/.test(filePath) &&
|
|
507
|
+
!/\.d\.ts$/.test(filePath));
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Helper: Check if file is config
|
|
511
|
+
*/
|
|
512
|
+
isConfigFile(filePath) {
|
|
513
|
+
return (/config.*\.(json|yaml|yml|ts|js)$/.test(filePath) ||
|
|
514
|
+
/\.env/.test(filePath));
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Capture baseline metrics for comparison
|
|
518
|
+
*/
|
|
519
|
+
async captureBaseline() {
|
|
520
|
+
// Stub - will integrate with actual coverage tooling
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Hook execution function
|
|
525
|
+
*
|
|
526
|
+
* Called by AIWG framework before file write operations.
|
|
527
|
+
*/
|
|
528
|
+
export async function executeLazinessDetectionHook(changes) {
|
|
529
|
+
const hook = new LazinessDetectionHook();
|
|
530
|
+
return await hook.analyze(changes);
|
|
531
|
+
}
|
|
532
|
+
//# sourceMappingURL=laziness-detection.js.map
|