@howlil/ez-agents 3.4.2 → 4.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/README.md +735 -462
- package/agents/ez-architect-agent.md +267 -0
- package/agents/ez-backend-agent.md +303 -0
- package/agents/ez-chief-strategist.md +271 -0
- package/agents/ez-codebase-mapper.md +770 -770
- package/agents/ez-context-manager.md +319 -0
- package/agents/ez-debugger.md +1255 -1255
- package/agents/ez-design-expert.md +347 -0
- package/agents/ez-devops-agent.md +331 -0
- package/agents/ez-executor.md +487 -487
- package/agents/ez-frontend-agent.md +322 -0
- package/agents/ez-phase-researcher.md +553 -553
- package/agents/ez-planner.md +1307 -1307
- package/agents/ez-product-engineer.md +435 -0
- package/agents/ez-project-researcher.md +629 -629
- package/agents/ez-qa-agent.md +320 -0
- package/agents/ez-release-agent.md +333 -0
- package/agents/ez-requirements-agent.md +377 -0
- package/agents/ez-roadmapper.md +650 -650
- package/agents/ez-technical-writer.md +551 -0
- package/agents/ez-ux-expert.md +393 -0
- package/agents/ez-verifier.md +579 -579
- package/bin/guards/autonomy-guard.cjs +346 -0
- package/bin/guards/context-budget-guard.cjs +278 -0
- package/bin/guards/hallucination-guard.cjs +380 -0
- package/bin/guards/hidden-state-guard.cjs +182 -0
- package/bin/guards/team-overhead-guard.cjs +266 -0
- package/bin/guards/tool-sprawl-guard.cjs +271 -0
- package/bin/install.js +3221 -3272
- package/bin/lib/analytics/analytics-collector.cjs +86 -0
- package/bin/lib/analytics/analytics-reporter.cjs +130 -0
- package/bin/lib/analytics/cohort-analyzer.cjs +138 -0
- package/bin/lib/analytics/funnel-analyzer.cjs +147 -0
- package/bin/lib/analytics/nps-tracker.cjs +147 -0
- package/bin/lib/archetype-detector.cjs +289 -0
- package/bin/lib/assistant-adapter.cjs +361 -0
- package/bin/lib/audit-exec.cjs +175 -0
- package/bin/lib/auth.cjs +176 -0
- package/bin/lib/backup-service.cjs +422 -0
- package/bin/lib/bdd-validator.cjs +622 -0
- package/bin/lib/business-flow-mapper.cjs +429 -0
- package/bin/lib/circuit-breaker.cjs +276 -0
- package/bin/lib/code-complexity-analyzer.cjs +360 -0
- package/bin/lib/codebase-analyzer.cjs +241 -0
- package/bin/lib/commands.cjs +691 -0
- package/bin/lib/config.cjs +236 -0
- package/bin/lib/constraint-extractor.cjs +526 -0
- package/bin/lib/content-scanner.cjs +238 -0
- package/bin/lib/context-cache.cjs +154 -0
- package/bin/lib/context-compressor.cjs +102 -0
- package/bin/lib/context-deduplicator.cjs +105 -0
- package/bin/lib/context-errors.cjs +78 -0
- package/bin/lib/context-manager.cjs +338 -0
- package/bin/lib/context-metadata-tracker.cjs +140 -0
- package/bin/lib/context-relevance-scorer.cjs +99 -0
- package/bin/lib/core.cjs +507 -0
- package/bin/lib/cost-alerts.cjs +174 -0
- package/bin/lib/cost-tracker.cjs +275 -0
- package/bin/lib/crash-recovery.cjs +220 -0
- package/bin/lib/dependency-graph.cjs +319 -0
- package/bin/lib/deploy/deploy-audit-log.cjs +76 -0
- package/bin/lib/deploy/deploy-detector.cjs +69 -0
- package/bin/lib/deploy/deploy-env-manager.cjs +109 -0
- package/bin/lib/deploy/deploy-health-check.cjs +88 -0
- package/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
- package/bin/lib/deploy/deploy-rollback.cjs +72 -0
- package/bin/lib/deploy/deploy-runner.cjs +97 -0
- package/bin/lib/deploy/deploy-status.cjs +74 -0
- package/bin/lib/discussion-synthesizer.cjs +439 -0
- package/bin/lib/error-cache.cjs +114 -0
- package/bin/lib/error-registry.cjs +177 -0
- package/bin/lib/file-access.cjs +207 -0
- package/bin/lib/file-lock.cjs +236 -0
- package/bin/lib/finops/budget-enforcer.cjs +126 -0
- package/bin/lib/finops/cost-reporter.cjs +132 -0
- package/bin/lib/finops/finops-analyzer.cjs +112 -0
- package/bin/lib/finops/spot-manager.cjs +118 -0
- package/bin/lib/framework-detector.cjs +396 -0
- package/bin/lib/frontmatter.cjs +313 -0
- package/bin/lib/fs-utils.cjs +153 -0
- package/bin/lib/gate-executor.cjs +272 -0
- package/bin/lib/gates/README.md +374 -0
- package/bin/lib/gates/gate-01-requirement.cjs +303 -0
- package/bin/lib/gates/gate-02-architecture.cjs +555 -0
- package/bin/lib/gates/gate-03-code.cjs +635 -0
- package/bin/lib/gates/gate-04-security.cjs +829 -0
- package/bin/lib/git-errors.cjs +83 -0
- package/bin/lib/git-utils.cjs +321 -0
- package/bin/lib/git-workflow-engine.cjs +1157 -0
- package/bin/lib/health-check.cjs +227 -0
- package/bin/lib/index.cjs +279 -0
- package/bin/lib/init.cjs +725 -0
- package/bin/lib/lock-logger.cjs +194 -0
- package/bin/lib/lock-state.cjs +263 -0
- package/bin/lib/lockfile-validator.cjs +227 -0
- package/bin/lib/log-rotation.cjs +71 -0
- package/bin/lib/logger.cjs +125 -0
- package/bin/lib/memory-compression.cjs +256 -0
- package/bin/lib/milestone.cjs +247 -0
- package/bin/lib/model-provider.cjs +241 -0
- package/bin/lib/package-manager-detector.cjs +203 -0
- package/bin/lib/package-manager-executor.cjs +385 -0
- package/bin/lib/package-manager-service.cjs +216 -0
- package/bin/lib/perf/api-monitor.cjs +88 -0
- package/bin/lib/perf/db-optimizer.cjs +78 -0
- package/bin/lib/perf/frontend-performance.cjs +56 -0
- package/bin/lib/perf/perf-analyzer.cjs +77 -0
- package/bin/lib/perf/perf-baseline.cjs +102 -0
- package/bin/lib/perf/perf-reporter.cjs +117 -0
- package/bin/lib/perf/regression-detector.cjs +92 -0
- package/bin/lib/phase.cjs +963 -0
- package/bin/lib/planning-write.cjs +123 -0
- package/bin/lib/project-reporter.cjs +565 -0
- package/bin/lib/quality-gate.cjs +332 -0
- package/bin/lib/quality-metrics.cjs +324 -0
- package/bin/lib/recovery-manager.cjs +98 -0
- package/bin/lib/release-validator.cjs +617 -0
- package/bin/lib/retry.cjs +119 -0
- package/bin/lib/roadmap.cjs +309 -0
- package/bin/lib/safe-exec.cjs +173 -0
- package/bin/lib/safe-path.cjs +130 -0
- package/bin/lib/security-errors.cjs +62 -0
- package/bin/lib/session-chain.cjs +304 -0
- package/bin/lib/session-errors.cjs +81 -0
- package/bin/lib/session-export.cjs +251 -0
- package/bin/lib/session-import.cjs +262 -0
- package/bin/lib/session-manager.cjs +280 -0
- package/bin/lib/skill-context.cjs +148 -0
- package/bin/lib/skill-matcher.cjs +236 -0
- package/bin/lib/skill-registry.cjs +360 -0
- package/bin/lib/skill-resolver.cjs +449 -0
- package/bin/lib/skill-triggers.cjs +90 -0
- package/bin/lib/skill-validator.cjs +270 -0
- package/bin/lib/skill-versioning.cjs +355 -0
- package/bin/lib/stack-detector.cjs +399 -0
- package/bin/lib/state.cjs +736 -0
- package/bin/lib/tech-debt-analyzer.cjs +309 -0
- package/bin/lib/temp-file.cjs +239 -0
- package/bin/lib/template.cjs +223 -0
- package/bin/lib/test-file-lock.cjs +112 -0
- package/bin/lib/test-graceful.cjs +93 -0
- package/bin/lib/test-logger.cjs +60 -0
- package/bin/lib/test-safe-exec.cjs +38 -0
- package/bin/lib/test-safe-path.cjs +33 -0
- package/bin/lib/test-temp-file.cjs +125 -0
- package/bin/lib/tier-manager.cjs +428 -0
- package/bin/lib/timeout-exec.cjs +63 -0
- package/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/bin/lib/url-fetch.cjs +170 -0
- package/bin/lib/verify.cjs +863 -0
- package/bin/update.js +217 -214
- package/commands/deploy.cjs +53 -0
- package/commands/ez/add-tests.md +41 -41
- package/commands/ez/audit-milestone.md +36 -36
- package/commands/ez/complete-milestone.md +136 -136
- package/commands/ez/discuss-phase.md +90 -90
- package/commands/ez/execute-phase.md +52 -41
- package/commands/ez/help.md +22 -22
- package/commands/ez/map-codebase.md +71 -71
- package/commands/ez/new-milestone.md +44 -44
- package/commands/ez/new-project.md +51 -42
- package/commands/ez/plan-phase.md +53 -45
- package/commands/ez/progress.md +36 -24
- package/commands/ez/quick.md +45 -45
- package/commands/ez/resume-work.md +40 -40
- package/commands/ez/run-phase.md +580 -0
- package/commands/ez/settings.md +36 -36
- package/commands/ez/update.md +37 -37
- package/commands/ez/verify-work.md +402 -38
- package/commands/health-check.cjs +44 -0
- package/commands/rollback.cjs +47 -0
- package/ez-agents/bin/ez-tools.cjs +1692 -716
- package/ez-agents/bin/guards/autonomy-guard.cjs +346 -0
- package/ez-agents/bin/guards/context-budget-guard.cjs +247 -0
- package/ez-agents/bin/guards/hallucination-guard.cjs +271 -0
- package/ez-agents/bin/guards/hidden-state-guard.cjs +182 -0
- package/ez-agents/bin/guards/team-overhead-guard.cjs +266 -0
- package/ez-agents/bin/guards/tool-sprawl-guard.cjs +271 -0
- package/ez-agents/bin/lib/analytics/analytics-collector.cjs +86 -0
- package/ez-agents/bin/lib/analytics/analytics-reporter.cjs +130 -0
- package/ez-agents/bin/lib/analytics/cohort-analyzer.cjs +138 -0
- package/ez-agents/bin/lib/analytics/funnel-analyzer.cjs +147 -0
- package/ez-agents/bin/lib/analytics/nps-tracker.cjs +147 -0
- package/ez-agents/bin/lib/archetype-detector.cjs +289 -0
- package/ez-agents/bin/lib/audit-exec.cjs +166 -167
- package/ez-agents/bin/lib/auth.cjs +176 -176
- package/ez-agents/bin/lib/backup-service.cjs +422 -0
- package/ez-agents/bin/lib/bdd-validator.cjs +622 -0
- package/ez-agents/bin/lib/business-flow-mapper.cjs +429 -0
- package/ez-agents/bin/lib/code-complexity-analyzer.cjs +360 -0
- package/ez-agents/bin/lib/codebase-analyzer.cjs +241 -0
- package/ez-agents/bin/lib/commands.cjs +685 -685
- package/ez-agents/bin/lib/config.cjs +41 -1
- package/ez-agents/bin/lib/constraint-extractor.cjs +526 -0
- package/ez-agents/bin/lib/content-scanner.cjs +238 -0
- package/ez-agents/bin/lib/context-cache.cjs +154 -0
- package/ez-agents/bin/lib/context-errors.cjs +71 -0
- package/ez-agents/bin/lib/context-manager.cjs +220 -0
- package/ez-agents/bin/lib/core.cjs +507 -512
- package/ez-agents/bin/lib/cost-tracker.cjs +243 -0
- package/ez-agents/bin/lib/crash-recovery.cjs +172 -0
- package/ez-agents/bin/lib/dependency-graph.cjs +319 -0
- package/ez-agents/bin/lib/deploy/deploy-audit-log.cjs +76 -0
- package/ez-agents/bin/lib/deploy/deploy-detector.cjs +69 -0
- package/ez-agents/bin/lib/deploy/deploy-env-manager.cjs +109 -0
- package/ez-agents/bin/lib/deploy/deploy-health-check.cjs +88 -0
- package/ez-agents/bin/lib/deploy/deploy-pre-flight.cjs +57 -0
- package/ez-agents/bin/lib/deploy/deploy-rollback.cjs +72 -0
- package/ez-agents/bin/lib/deploy/deploy-runner.cjs +97 -0
- package/ez-agents/bin/lib/deploy/deploy-status.cjs +74 -0
- package/ez-agents/bin/lib/discussion-synthesizer.cjs +458 -0
- package/ez-agents/bin/lib/file-access.cjs +207 -0
- package/ez-agents/bin/lib/finops/budget-enforcer.cjs +126 -0
- package/ez-agents/bin/lib/finops/cost-reporter.cjs +132 -0
- package/ez-agents/bin/lib/finops/finops-analyzer.cjs +112 -0
- package/ez-agents/bin/lib/finops/spot-manager.cjs +118 -0
- package/ez-agents/bin/lib/framework-detector.cjs +396 -0
- package/ez-agents/bin/lib/frontmatter.cjs +3 -1
- package/ez-agents/bin/lib/gates/README.md +374 -0
- package/ez-agents/bin/lib/gates/gate-01-requirement.cjs +303 -0
- package/ez-agents/bin/lib/gates/gate-02-architecture.cjs +555 -0
- package/ez-agents/bin/lib/gates/gate-03-code.cjs +635 -0
- package/ez-agents/bin/lib/gates/gate-04-security.cjs +829 -0
- package/ez-agents/bin/lib/git-errors.cjs +83 -0
- package/ez-agents/bin/lib/git-utils.cjs +118 -0
- package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -0
- package/ez-agents/bin/lib/health-check.cjs +162 -162
- package/ez-agents/bin/lib/index.cjs +40 -2
- package/ez-agents/bin/lib/init.cjs +0 -2
- package/ez-agents/bin/lib/lockfile-validator.cjs +227 -0
- package/ez-agents/bin/lib/log-rotation.cjs +71 -0
- package/ez-agents/bin/lib/logger.cjs +99 -154
- package/ez-agents/bin/lib/memory-compression.cjs +256 -0
- package/ez-agents/bin/lib/package-manager-detector.cjs +203 -0
- package/ez-agents/bin/lib/package-manager-executor.cjs +385 -0
- package/ez-agents/bin/lib/package-manager-service.cjs +216 -0
- package/ez-agents/bin/lib/perf/api-monitor.cjs +88 -0
- package/ez-agents/bin/lib/perf/db-optimizer.cjs +78 -0
- package/ez-agents/bin/lib/perf/frontend-performance.cjs +56 -0
- package/ez-agents/bin/lib/perf/perf-analyzer.cjs +77 -0
- package/ez-agents/bin/lib/perf/perf-baseline.cjs +102 -0
- package/ez-agents/bin/lib/perf/perf-reporter.cjs +117 -0
- package/ez-agents/bin/lib/perf/regression-detector.cjs +92 -0
- package/ez-agents/bin/lib/project-reporter.cjs +502 -0
- package/ez-agents/bin/lib/quality-gate.cjs +332 -0
- package/ez-agents/bin/lib/recovery-manager.cjs +98 -0
- package/ez-agents/bin/lib/release-validator.cjs +617 -0
- package/ez-agents/bin/lib/safe-exec.cjs +128 -214
- package/ez-agents/bin/lib/security-errors.cjs +62 -0
- package/ez-agents/bin/lib/session-chain.cjs +304 -0
- package/ez-agents/bin/lib/session-errors.cjs +81 -0
- package/ez-agents/bin/lib/session-export.cjs +251 -0
- package/ez-agents/bin/lib/session-import.cjs +262 -0
- package/ez-agents/bin/lib/session-manager.cjs +280 -0
- package/ez-agents/bin/lib/skill-context.cjs +148 -0
- package/ez-agents/bin/lib/skill-matcher.cjs +236 -0
- package/ez-agents/bin/lib/skill-registry.cjs +341 -0
- package/ez-agents/bin/lib/skill-resolver.cjs +449 -0
- package/ez-agents/bin/lib/skill-triggers.cjs +90 -0
- package/ez-agents/bin/lib/skill-validator.cjs +270 -0
- package/ez-agents/bin/lib/skill-versioning.cjs +355 -0
- package/ez-agents/bin/lib/stack-detector.cjs +399 -0
- package/ez-agents/bin/lib/tech-debt-analyzer.cjs +309 -0
- package/ez-agents/bin/lib/tier-manager.cjs +428 -0
- package/ez-agents/bin/lib/tradeoff-analyzer.cjs +284 -0
- package/ez-agents/bin/lib/url-fetch.cjs +170 -0
- package/ez-agents/bin/lib/verify.cjs +863 -863
- package/ez-agents/references/decimal-phase-calculation.md +65 -65
- package/ez-agents/references/git-integration.md +248 -248
- package/ez-agents/references/git-planning-commit.md +38 -38
- package/ez-agents/references/metrics-schema.md +118 -0
- package/ez-agents/references/model-profile-resolution.md +34 -34
- package/ez-agents/references/model-profiles.md +93 -93
- package/ez-agents/references/phase-argument-parsing.md +61 -61
- package/ez-agents/references/planning-config.md +340 -200
- package/ez-agents/references/tier-strategy.md +103 -0
- package/ez-agents/references/ui-brand.md +160 -160
- package/ez-agents/references/verification-patterns.md +612 -612
- package/ez-agents/templates/DEBUG.md +164 -164
- package/ez-agents/templates/UAT.md +247 -247
- package/ez-agents/templates/agent-output-format.md +404 -0
- package/ez-agents/templates/bdd-feature.md +173 -0
- package/ez-agents/templates/codebase/architecture.md +255 -255
- package/ez-agents/templates/codebase/structure.md +285 -285
- package/ez-agents/templates/copilot-instructions.md +7 -7
- package/ez-agents/templates/debug-subagent-prompt.md +91 -91
- package/ez-agents/templates/discovery.md +146 -146
- package/ez-agents/templates/discussion.md +68 -0
- package/ez-agents/templates/handoff-protocol.md +294 -0
- package/ez-agents/templates/incident-runbook.md +205 -0
- package/ez-agents/templates/mode-workflow-templates.md +301 -0
- package/ez-agents/templates/phase-prompt.md +610 -610
- package/ez-agents/templates/planner-subagent-prompt.md +117 -117
- package/ez-agents/templates/project.md +184 -184
- package/ez-agents/templates/release-checklist.md +136 -0
- package/ez-agents/templates/research.md +552 -552
- package/ez-agents/templates/rollback-plan.md +201 -0
- package/ez-agents/templates/security-user-setup.md +244 -0
- package/ez-agents/templates/skill-validation-rules.md +476 -0
- package/ez-agents/templates/state.md +180 -176
- package/ez-agents/templates/summary-complex.md +59 -59
- package/ez-agents/tests/gates/gate-01-02.test.cjs +812 -0
- package/ez-agents/tests/gates/gate-03-04.test.cjs +762 -0
- package/ez-agents/tests/gates/gate-05-validator.test.cjs +145 -0
- package/ez-agents/tests/gates/gate-06-docs-validator.test.cjs +244 -0
- package/ez-agents/tests/gates/gate-07-release-validator.test.cjs +219 -0
- package/ez-agents/tests/guards/context-budget-guard.test.cjs +145 -0
- package/ez-agents/tests/guards/edge-case-guards.test.cjs +238 -0
- package/ez-agents/tests/guards/hallucination-guard.test.cjs +124 -0
- package/ez-agents/workflows/audit-milestone.md +1 -1
- package/ez-agents/workflows/autonomous.md +131 -30
- package/ez-agents/workflows/complete-milestone.md +1 -1
- package/ez-agents/workflows/discuss-phase.md +1 -1
- package/ez-agents/workflows/execute-phase.md +169 -3
- package/ez-agents/workflows/help.md +86 -133
- package/ez-agents/workflows/hotfix.md +291 -0
- package/ez-agents/workflows/new-milestone.md +340 -11
- package/ez-agents/workflows/new-project.md +294 -318
- package/ez-agents/workflows/plan-phase.md +22 -40
- package/ez-agents/workflows/progress.md +15 -25
- package/ez-agents/workflows/release.md +253 -0
- package/ez-agents/workflows/resume-session.md +215 -0
- package/ez-agents/workflows/run-phase.md +531 -0
- package/ez-agents/workflows/settings.md +2 -35
- package/hooks/dist/ez-check-update.js +81 -81
- package/hooks/dist/ez-context-monitor.js +148 -141
- package/hooks/dist/ez-statusline.js +115 -115
- package/package.json +78 -64
- package/scripts/fix-qwen-installation.js +144 -144
- package/agents/ez-integration-checker.md +0 -443
- package/agents/ez-nyquist-auditor.md +0 -176
- package/agents/ez-plan-checker.md +0 -706
- package/agents/ez-research-synthesizer.md +0 -247
- package/agents/ez-ui-auditor.md +0 -439
- package/agents/ez-ui-checker.md +0 -300
- package/agents/ez-ui-researcher.md +0 -353
- package/commands/ez/add-phase.md +0 -43
- package/commands/ez/add-todo.md +0 -47
- package/commands/ez/auth.md +0 -87
- package/commands/ez/autonomous.md +0 -41
- package/commands/ez/check-todos.md +0 -45
- package/commands/ez/cleanup.md +0 -18
- package/commands/ez/debug.md +0 -168
- package/commands/ez/health.md +0 -22
- package/commands/ez/insert-phase.md +0 -32
- package/commands/ez/join-discord.md +0 -18
- package/commands/ez/list-phase-assumptions.md +0 -46
- package/commands/ez/pause-work.md +0 -38
- package/commands/ez/plan-milestone-gaps.md +0 -34
- package/commands/ez/reapply-patches.md +0 -124
- package/commands/ez/remove-phase.md +0 -31
- package/commands/ez/research-phase.md +0 -190
- package/commands/ez/set-profile.md +0 -34
- package/commands/ez/stats.md +0 -18
- package/commands/ez/ui-phase.md +0 -34
- package/commands/ez/ui-review.md +0 -32
- package/commands/ez/validate-phase.md +0 -35
- package/ez-agents/templates/UI-SPEC.md +0 -100
- package/ez-agents/templates/VALIDATION.md +0 -76
- package/ez-agents/templates/context.md +0 -352
- package/ez-agents/templates/verification-report.md +0 -322
- package/ez-agents/workflows/research-phase.md +0 -74
- package/ez-agents/workflows/ui-phase.md +0 -290
- package/ez-agents/workflows/ui-review.md +0 -157
- package/ez-agents/workflows/validate-phase.md +0 -167
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EDGE-01: Hallucination Guard
|
|
3
|
+
*
|
|
4
|
+
* Detects AI hallucinations by requiring citations and flagging uncertainty.
|
|
5
|
+
* Verifies library claims against package.json or Context7.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { execSync } = require('child_process');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Search codebase for claim evidence
|
|
14
|
+
* @param {string} claim - The claim to verify
|
|
15
|
+
* @param {string} searchDir - Directory to search in
|
|
16
|
+
* @returns {object} { cited: boolean, citations: array, uncertainty: boolean }
|
|
17
|
+
*/
|
|
18
|
+
function checkCitation(claim, searchDir = process.cwd()) {
|
|
19
|
+
const citations = [];
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
// Search in codebase using grep
|
|
23
|
+
const grepCmd = process.platform === 'win32'
|
|
24
|
+
? `findstr /s /i /c:"${claim}" * 2>nul`
|
|
25
|
+
: `grep -ri "${claim}" . 2>/dev/null | head -20`;
|
|
26
|
+
|
|
27
|
+
const result = execSync(grepCmd, {
|
|
28
|
+
cwd: searchDir,
|
|
29
|
+
encoding: 'utf8',
|
|
30
|
+
stdio: ['pipe', 'pipe', 'ignore']
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
if (result.trim()) {
|
|
34
|
+
const lines = result.trim().split('\n').slice(0, 5);
|
|
35
|
+
lines.forEach(line => {
|
|
36
|
+
citations.push({
|
|
37
|
+
source: 'codebase',
|
|
38
|
+
evidence: line.trim()
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
} catch (e) {
|
|
43
|
+
// No matches found - not an error, just no citation
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
cited: citations.length > 0,
|
|
48
|
+
citations,
|
|
49
|
+
uncertainty: citations.length === 0
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Verify a library/dependency claim
|
|
55
|
+
* @param {string} claim - Library name or claim
|
|
56
|
+
* @param {string} projectDir - Project directory
|
|
57
|
+
* @returns {object} { verified: boolean, source: string, details: object }
|
|
58
|
+
*/
|
|
59
|
+
function verifyClaim(claim, projectDir = process.cwd()) {
|
|
60
|
+
// Extract library name from claim
|
|
61
|
+
const libMatch = claim.match(/(?:library|package|module|dependency)[:\s]+(['"]?)([^'"\s]+)\1/i);
|
|
62
|
+
const libName = libMatch ? libMatch[2] : claim.split(/\s+/).pop();
|
|
63
|
+
|
|
64
|
+
// Check package.json
|
|
65
|
+
const packageJsonPath = path.join(projectDir, 'package.json');
|
|
66
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
67
|
+
try {
|
|
68
|
+
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
69
|
+
const allDeps = {
|
|
70
|
+
...pkg.dependencies,
|
|
71
|
+
...pkg.devDependencies,
|
|
72
|
+
...pkg.peerDependencies
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Check if library is in dependencies
|
|
76
|
+
for (const [name, version] of Object.entries(allDeps)) {
|
|
77
|
+
if (name.toLowerCase().includes(libName.toLowerCase()) ||
|
|
78
|
+
libName.toLowerCase().includes(name.toLowerCase())) {
|
|
79
|
+
return {
|
|
80
|
+
verified: true,
|
|
81
|
+
source: 'package.json',
|
|
82
|
+
details: { name, version }
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} catch (e) {
|
|
87
|
+
// Invalid package.json
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Check if it's a known library (would verify with Context7 in real implementation)
|
|
92
|
+
const knownLibraries = [
|
|
93
|
+
'vitest', 'jest', 'playwright', 'cypress', 'react', 'vue', 'angular',
|
|
94
|
+
'express', 'fastify', 'nest', 'next', 'nuxt', 'sveltekit',
|
|
95
|
+
'prisma', 'mongoose', 'sequelize', 'typeorm',
|
|
96
|
+
'typescript', 'eslint', 'prettier'
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
if (knownLibraries.some(lib => libName.toLowerCase().includes(lib))) {
|
|
100
|
+
return {
|
|
101
|
+
verified: true,
|
|
102
|
+
source: 'known-library',
|
|
103
|
+
details: { name: libName, note: 'Would verify with Context7' }
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
verified: false,
|
|
109
|
+
source: 'none',
|
|
110
|
+
details: { name: libName, note: 'Library not found in dependencies or known libraries' }
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Flag uncertainty in AI output
|
|
116
|
+
* @param {string} output - AI generated text
|
|
117
|
+
* @returns {object} { flagged: boolean, uncertainPhrases: array, confidence: string }
|
|
118
|
+
*/
|
|
119
|
+
function flagUncertainty(output) {
|
|
120
|
+
const uncertaintyMarkers = [
|
|
121
|
+
'might', 'may', 'could', 'possibly', 'perhaps',
|
|
122
|
+
'i think', 'i believe', 'probably', 'likely',
|
|
123
|
+
'not sure', 'uncertain', 'approximate',
|
|
124
|
+
'should work', 'might work', 'could work',
|
|
125
|
+
'as far as i know', 'to the best of my knowledge',
|
|
126
|
+
'it seems', 'appears to'
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
const lowerOutput = output.toLowerCase();
|
|
130
|
+
const foundMarkers = [];
|
|
131
|
+
|
|
132
|
+
for (const marker of uncertaintyMarkers) {
|
|
133
|
+
if (lowerOutput.includes(marker)) {
|
|
134
|
+
foundMarkers.push(marker);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Check for citation needed patterns
|
|
139
|
+
const citationPatterns = [
|
|
140
|
+
/according to.*documentation/i,
|
|
141
|
+
/the documentation says/i,
|
|
142
|
+
/as documented in/i,
|
|
143
|
+
/the official.*states/i
|
|
144
|
+
];
|
|
145
|
+
|
|
146
|
+
for (const pattern of citationPatterns) {
|
|
147
|
+
if (pattern.test(output)) {
|
|
148
|
+
foundMarkers.push(`citation claim: ${pattern.source}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return {
|
|
153
|
+
flagged: foundMarkers.length > 0,
|
|
154
|
+
uncertainPhrases: foundMarkers,
|
|
155
|
+
confidence: foundMarkers.length === 0 ? 'high' :
|
|
156
|
+
foundMarkers.length <= 2 ? 'medium' : 'low'
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Full hallucination check
|
|
162
|
+
* @param {string} output - AI generated text
|
|
163
|
+
* @param {string} projectDir - Project directory
|
|
164
|
+
* @returns {object} Comprehensive hallucination check result
|
|
165
|
+
*/
|
|
166
|
+
function checkHallucination(output, projectDir = process.cwd()) {
|
|
167
|
+
const uncertaintyResult = flagUncertainty(output);
|
|
168
|
+
|
|
169
|
+
// Extract claims that need verification
|
|
170
|
+
const claimsToVerify = [];
|
|
171
|
+
const claimPatterns = [
|
|
172
|
+
/(?:library|package|module|dependency)[:\s]+['"]?([^'"\s,]+)['"]?/gi,
|
|
173
|
+
/(?:uses?|requires?|needs?|installs?)\s+(?:the\s+)?(['"]?)([^'"\s,]+)\1(?:\s+library)?/gi
|
|
174
|
+
];
|
|
175
|
+
|
|
176
|
+
for (const pattern of claimPatterns) {
|
|
177
|
+
let match;
|
|
178
|
+
while ((match = pattern.exec(output)) !== null) {
|
|
179
|
+
claimsToVerify.push(match[0]);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Verify each claim
|
|
184
|
+
const verifiedClaims = [];
|
|
185
|
+
const unverifiedClaims = [];
|
|
186
|
+
|
|
187
|
+
for (const claim of claimsToVerify) {
|
|
188
|
+
const verification = verifyClaim(claim, projectDir);
|
|
189
|
+
if (verification.verified) {
|
|
190
|
+
verifiedClaims.push({ claim, verification });
|
|
191
|
+
} else {
|
|
192
|
+
unverifiedClaims.push({ claim, verification });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return {
|
|
197
|
+
hallucinationRisk: unverifiedClaims.length > 0 || uncertaintyResult.flagged,
|
|
198
|
+
confidence: uncertaintyResult.confidence,
|
|
199
|
+
uncertainty: uncertaintyResult,
|
|
200
|
+
verifiedClaims,
|
|
201
|
+
unverifiedClaims,
|
|
202
|
+
recommendations: unverifiedClaims.length > 0
|
|
203
|
+
? ['Verify unverified claims against official documentation', 'Add citations for external references']
|
|
204
|
+
: uncertaintyResult.flagged
|
|
205
|
+
? ['Reduce uncertainty language', 'Add specific citations']
|
|
206
|
+
: []
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* CLI entry point
|
|
212
|
+
*/
|
|
213
|
+
if (require.main === module) {
|
|
214
|
+
const args = process.argv.slice(2);
|
|
215
|
+
const command = args[0];
|
|
216
|
+
|
|
217
|
+
if (command === 'check' && args[1]) {
|
|
218
|
+
const claim = args.slice(1).join(' ');
|
|
219
|
+
console.log(`Checking claim: "${claim}"`);
|
|
220
|
+
const result = checkCitation(claim);
|
|
221
|
+
|
|
222
|
+
if (result.cited) {
|
|
223
|
+
console.log('✅ Claim has citations');
|
|
224
|
+
result.citations.forEach(c => console.log(` Source: ${c.source}`));
|
|
225
|
+
console.log(` Evidence: ${c.citations[0]?.evidence?.substring(0, 100)}...`);
|
|
226
|
+
} else {
|
|
227
|
+
console.log('⚠️ Claim has no citations - potential hallucination');
|
|
228
|
+
}
|
|
229
|
+
process.exit(result.cited ? 0 : 1);
|
|
230
|
+
} else if (command === 'verify' && args[1]) {
|
|
231
|
+
const claim = args.slice(1).join(' ');
|
|
232
|
+
console.log(`Verifying: "${claim}"`);
|
|
233
|
+
const result = verifyClaim(claim);
|
|
234
|
+
|
|
235
|
+
if (result.verified) {
|
|
236
|
+
console.log(`✅ Verified via ${result.source}`);
|
|
237
|
+
console.log(` Details: ${JSON.stringify(result.details)}`);
|
|
238
|
+
} else {
|
|
239
|
+
console.log('❌ Could not verify claim');
|
|
240
|
+
console.log(` Details: ${result.details.note}`);
|
|
241
|
+
}
|
|
242
|
+
process.exit(result.verified ? 0 : 1);
|
|
243
|
+
} else if (command === 'uncertainty' && args[1]) {
|
|
244
|
+
const text = args.slice(1).join(' ');
|
|
245
|
+
console.log('Checking for uncertainty markers...');
|
|
246
|
+
const result = flagUncertainty(text);
|
|
247
|
+
|
|
248
|
+
if (result.flagged) {
|
|
249
|
+
console.log(`⚠️ Found ${result.uncertainPhrases.length} uncertainty markers:`);
|
|
250
|
+
result.uncertainPhrases.forEach(p => console.log(` - "${p}"`));
|
|
251
|
+
console.log(`Confidence: ${result.confidence}`);
|
|
252
|
+
} else {
|
|
253
|
+
console.log('✅ No uncertainty markers found');
|
|
254
|
+
}
|
|
255
|
+
process.exit(0);
|
|
256
|
+
} else {
|
|
257
|
+
console.log('Usage: node hallucination-guard.cjs <command> [text]');
|
|
258
|
+
console.log('Commands:');
|
|
259
|
+
console.log(' check <claim> - Check if claim has citations');
|
|
260
|
+
console.log(' verify <claim> - Verify library/dependency claim');
|
|
261
|
+
console.log(' uncertainty <text> - Check for uncertainty markers');
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
module.exports = {
|
|
267
|
+
checkCitation,
|
|
268
|
+
verifyClaim,
|
|
269
|
+
flagUncertainty,
|
|
270
|
+
checkHallucination
|
|
271
|
+
};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EDGE-03: Hidden State Guard
|
|
3
|
+
*
|
|
4
|
+
* Detects state not persisted to .planning/ files.
|
|
5
|
+
* Ensures all state is explicitly persisted for auditability.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* List all state files in .planning/ directory
|
|
13
|
+
* @param {string} phaseDir - Phase directory
|
|
14
|
+
* @returns {string[]} Array of state file paths
|
|
15
|
+
*/
|
|
16
|
+
function listStateFiles(phaseDir) {
|
|
17
|
+
const stateFiles = [];
|
|
18
|
+
const planningDir = path.join(phaseDir, '.planning');
|
|
19
|
+
|
|
20
|
+
if (!fs.existsSync(planningDir)) {
|
|
21
|
+
return stateFiles;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Recursively find all .md files in .planning/
|
|
25
|
+
function scanDir(dir) {
|
|
26
|
+
try {
|
|
27
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
28
|
+
for (const entry of entries) {
|
|
29
|
+
const fullPath = path.join(dir, entry.name);
|
|
30
|
+
if (entry.isDirectory() && !entry.name.startsWith('.')) {
|
|
31
|
+
scanDir(fullPath);
|
|
32
|
+
} else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
33
|
+
stateFiles.push(fullPath);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
} catch (e) {
|
|
37
|
+
// Ignore permission errors
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
scanDir(planningDir);
|
|
42
|
+
return stateFiles;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Extract state references from text
|
|
47
|
+
* @param {string} text - Text to analyze
|
|
48
|
+
* @returns {string[]} Array of state references
|
|
49
|
+
*/
|
|
50
|
+
function extractStateReferences(text) {
|
|
51
|
+
const statePatterns = [
|
|
52
|
+
/(?:state|status|progress|phase|step|current)[\s:]+([A-Z_]+\d*(?:\.\d+)?)/gi,
|
|
53
|
+
/(?:task|plan|gate|edge)[\s:]+(\d+(?:-\d+)?)/gi,
|
|
54
|
+
/(?:completed|finished|done|pending|blocked)[\s:]+([A-Z_]+)/gi
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
const references = new Set();
|
|
58
|
+
|
|
59
|
+
for (const pattern of statePatterns) {
|
|
60
|
+
let match;
|
|
61
|
+
while ((match = pattern.exec(text)) !== null) {
|
|
62
|
+
references.add(match[0].toLowerCase());
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return Array.from(references);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Check for hidden state (state not persisted to files)
|
|
71
|
+
* @param {string} output - AI generated output
|
|
72
|
+
* @param {string} phaseDir - Phase directory
|
|
73
|
+
* @returns {object} { hasHiddenState: boolean, stateFiles: array, missing: array }
|
|
74
|
+
*/
|
|
75
|
+
function checkHiddenState(output, phaseDir) {
|
|
76
|
+
const stateFiles = listStateFiles(phaseDir);
|
|
77
|
+
const stateReferences = extractStateReferences(output);
|
|
78
|
+
|
|
79
|
+
// Read all state file contents
|
|
80
|
+
const stateContents = stateFiles.map(file => {
|
|
81
|
+
try {
|
|
82
|
+
return fs.readFileSync(file, 'utf8').toLowerCase();
|
|
83
|
+
} catch (e) {
|
|
84
|
+
return '';
|
|
85
|
+
}
|
|
86
|
+
}).join(' ');
|
|
87
|
+
|
|
88
|
+
// Check which state references are not in persisted files
|
|
89
|
+
const missing = stateReferences.filter(ref => {
|
|
90
|
+
// Skip common false positives
|
|
91
|
+
if (['state', 'status', 'phase', 'plan'].includes(ref)) return false;
|
|
92
|
+
return !stateContents.includes(ref);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
hasHiddenState: missing.length > 0,
|
|
97
|
+
stateFiles,
|
|
98
|
+
stateReferences,
|
|
99
|
+
missing,
|
|
100
|
+
recommendation: missing.length > 0
|
|
101
|
+
? `Persist the following state to .planning/ files: ${missing.join(', ')}`
|
|
102
|
+
: 'All state appears to be persisted'
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Validate that all state is persisted
|
|
108
|
+
* @param {string} output - AI generated output
|
|
109
|
+
* @param {string} phaseDir - Phase directory
|
|
110
|
+
* @returns {object} Validation result
|
|
111
|
+
*/
|
|
112
|
+
function validatePersistence(output, phaseDir) {
|
|
113
|
+
const result = checkHiddenState(output, phaseDir);
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
valid: !result.hasHiddenState,
|
|
117
|
+
...result
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* CLI entry point
|
|
123
|
+
*/
|
|
124
|
+
if (require.main === module) {
|
|
125
|
+
const args = process.argv.slice(2);
|
|
126
|
+
const command = args[0];
|
|
127
|
+
|
|
128
|
+
if (command === 'check' && args[1]) {
|
|
129
|
+
const phaseDir = args[1];
|
|
130
|
+
console.log(`Checking for hidden state in ${phaseDir}`);
|
|
131
|
+
|
|
132
|
+
const stateFiles = listStateFiles(phaseDir);
|
|
133
|
+
console.log(`Found ${stateFiles.length} state files in .planning/`);
|
|
134
|
+
|
|
135
|
+
if (stateFiles.length > 0) {
|
|
136
|
+
console.log('State files:');
|
|
137
|
+
stateFiles.slice(0, 10).forEach(f => console.log(` - ${path.relative(phaseDir, f)}`));
|
|
138
|
+
if (stateFiles.length > 10) {
|
|
139
|
+
console.log(` ... and ${stateFiles.length - 10} more`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
process.exit(0);
|
|
144
|
+
|
|
145
|
+
} else if (command === 'validate' && args[1]) {
|
|
146
|
+
const phaseDir = args[1];
|
|
147
|
+
const outputFile = args[2];
|
|
148
|
+
|
|
149
|
+
if (!outputFile || !fs.existsSync(outputFile)) {
|
|
150
|
+
console.error('Usage: node hidden-state-guard.cjs validate <phaseDir> <outputFile>');
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const output = fs.readFileSync(outputFile, 'utf8');
|
|
155
|
+
const result = validatePersistence(output, phaseDir);
|
|
156
|
+
|
|
157
|
+
if (result.valid) {
|
|
158
|
+
console.log('✅ All state is persisted');
|
|
159
|
+
console.log(` State files: ${result.stateFiles.length}`);
|
|
160
|
+
process.exit(0);
|
|
161
|
+
} else {
|
|
162
|
+
console.log('⚠️ Hidden state detected');
|
|
163
|
+
console.log(` Missing: ${result.missing.join(', ')}`);
|
|
164
|
+
console.log(` ${result.recommendation}`);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
} else {
|
|
169
|
+
console.log('Usage: node hidden-state-guard.cjs <command> [args]');
|
|
170
|
+
console.log('Commands:');
|
|
171
|
+
console.log(' check <phaseDir> - List state files');
|
|
172
|
+
console.log(' validate <phaseDir> <file> - Validate output persistence');
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
module.exports = {
|
|
178
|
+
listStateFiles,
|
|
179
|
+
extractStateReferences,
|
|
180
|
+
checkHiddenState,
|
|
181
|
+
validatePersistence
|
|
182
|
+
};
|