@dommaker/harness 0.19.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -9
- package/bin/harness.js +136 -557
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +2 -13
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/definitions.d.ts +90 -0
- package/dist/cli/commands/definitions.d.ts.map +1 -0
- package/dist/cli/commands/definitions.js +519 -0
- package/dist/cli/commands/definitions.js.map +1 -0
- package/dist/cli/commands/knowledge.js.map +1 -1
- package/dist/cli/commands/sync-docs/agents-syncer.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/agents-syncer.js +25 -4
- package/dist/cli/commands/sync-docs/agents-syncer.js.map +1 -1
- package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts +3 -25
- package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/capabilities-syncer.js +3 -93
- package/dist/cli/commands/sync-docs/capabilities-syncer.js.map +1 -1
- package/dist/cli/commands/sync-docs/index.d.ts +1 -1
- package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/index.js +4 -4
- package/dist/cli/commands/sync-docs/index.js.map +1 -1
- package/dist/completion-checkers/classify.d.ts +23 -0
- package/dist/completion-checkers/classify.d.ts.map +1 -0
- package/dist/completion-checkers/classify.js +37 -0
- package/dist/completion-checkers/classify.js.map +1 -0
- package/dist/completion-checkers/contract-presence.d.ts +12 -0
- package/dist/completion-checkers/contract-presence.d.ts.map +1 -0
- package/dist/completion-checkers/contract-presence.js +36 -0
- package/dist/completion-checkers/contract-presence.js.map +1 -0
- package/dist/completion-checkers/glob-match.d.ts +13 -0
- package/dist/completion-checkers/glob-match.d.ts.map +1 -0
- package/dist/completion-checkers/glob-match.js +58 -0
- package/dist/completion-checkers/glob-match.js.map +1 -0
- package/dist/completion-checkers/index.d.ts +19 -0
- package/dist/completion-checkers/index.d.ts.map +1 -0
- package/dist/completion-checkers/index.js +47 -0
- package/dist/completion-checkers/index.js.map +1 -0
- package/dist/completion-checkers/phase-format.d.ts +15 -0
- package/dist/completion-checkers/phase-format.d.ts.map +1 -0
- package/dist/completion-checkers/phase-format.js +42 -0
- package/dist/completion-checkers/phase-format.js.map +1 -0
- package/dist/completion-checkers/tdd-chain.d.ts +16 -0
- package/dist/completion-checkers/tdd-chain.d.ts.map +1 -0
- package/dist/completion-checkers/tdd-chain.js +57 -0
- package/dist/completion-checkers/tdd-chain.js.map +1 -0
- package/dist/completion-checkers/types.d.ts +77 -0
- package/dist/completion-checkers/types.d.ts.map +1 -0
- package/dist/completion-checkers/types.js +10 -0
- package/dist/completion-checkers/types.js.map +1 -0
- package/dist/context/index.d.ts +1 -5
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +1 -5
- package/dist/context/index.js.map +1 -1
- package/dist/context/knowledge-injector.d.ts +3 -3
- package/dist/context/knowledge-injector.d.ts.map +1 -1
- package/dist/context/knowledge-injector.js +1 -1
- package/dist/context/session-manager.d.ts +1 -12
- package/dist/context/session-manager.d.ts.map +1 -1
- package/dist/context/session-manager.js +0 -63
- package/dist/context/session-manager.js.map +1 -1
- package/dist/context/types.d.ts +1 -39
- package/dist/context/types.d.ts.map +1 -1
- package/dist/context/types.js +2 -15
- package/dist/context/types.js.map +1 -1
- package/dist/core/constraints/agent-prompt-renderer.d.ts +1 -1
- package/dist/core/constraints/agent-prompt-renderer.js +1 -1
- package/dist/core/constraints/capabilities-parser.d.ts +17 -2
- package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
- package/dist/core/constraints/capabilities-parser.js +84 -2
- package/dist/core/constraints/capabilities-parser.js.map +1 -1
- package/dist/core/constraints/checker.d.ts +3 -17
- package/dist/core/constraints/checker.d.ts.map +1 -1
- package/dist/core/constraints/checker.js +7 -47
- package/dist/core/constraints/checker.js.map +1 -1
- package/dist/core/constraints/definitions.d.ts +0 -7
- package/dist/core/constraints/definitions.d.ts.map +1 -1
- package/dist/core/constraints/definitions.js +1 -8
- package/dist/core/constraints/definitions.js.map +1 -1
- package/dist/core/constraints/doc-freshness/runner.d.ts +0 -2
- package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
- package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
- package/dist/core/constraints/index.d.ts +1 -1
- package/dist/core/constraints/index.d.ts.map +1 -1
- package/dist/core/constraints/index.js +2 -3
- package/dist/core/constraints/index.js.map +1 -1
- package/dist/core/constraints/interceptor.d.ts.map +1 -1
- package/dist/core/constraints/interceptor.js +1 -5
- package/dist/core/constraints/interceptor.js.map +1 -1
- package/dist/core/effective-constraints.d.ts.map +1 -1
- package/dist/core/effective-constraints.js +0 -1
- package/dist/core/effective-constraints.js.map +1 -1
- package/dist/core/project-config-loader.d.ts.map +1 -1
- package/dist/core/project-config-loader.js +1 -8
- package/dist/core/project-config-loader.js.map +1 -1
- package/dist/dashboard/stats.d.ts.map +1 -1
- package/dist/dashboard/stats.js.map +1 -1
- package/dist/dashboard/types.d.ts +2 -2
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/failure/constraint-handler.d.ts.map +1 -1
- package/dist/failure/constraint-handler.js +0 -2
- package/dist/failure/constraint-handler.js.map +1 -1
- package/dist/gates/acceptance.d.ts +9 -1
- package/dist/gates/acceptance.d.ts.map +1 -1
- package/dist/gates/acceptance.js +21 -0
- package/dist/gates/acceptance.js.map +1 -1
- package/dist/gates/checker-gate.d.ts +23 -0
- package/dist/gates/checker-gate.d.ts.map +1 -0
- package/dist/gates/checker-gate.js +53 -0
- package/dist/gates/checker-gate.js.map +1 -0
- package/dist/gates/command.d.ts +9 -2
- package/dist/gates/command.d.ts.map +1 -1
- package/dist/gates/command.js +10 -0
- package/dist/gates/command.js.map +1 -1
- package/dist/gates/contract.d.ts +8 -2
- package/dist/gates/contract.d.ts.map +1 -1
- package/dist/gates/contract.js +9 -0
- package/dist/gates/contract.js.map +1 -1
- package/dist/gates/decision.d.ts +17 -0
- package/dist/gates/decision.d.ts.map +1 -0
- package/dist/gates/decision.js +25 -0
- package/dist/gates/decision.js.map +1 -0
- package/dist/gates/definitions.d.ts +63 -0
- package/dist/gates/definitions.d.ts.map +1 -0
- package/dist/gates/definitions.js +160 -0
- package/dist/gates/definitions.js.map +1 -0
- package/dist/gates/effective-gates.d.ts +30 -0
- package/dist/gates/effective-gates.d.ts.map +1 -0
- package/dist/gates/effective-gates.js +85 -0
- package/dist/gates/effective-gates.js.map +1 -0
- package/dist/gates/index.d.ts +25 -1
- package/dist/gates/index.d.ts.map +1 -1
- package/dist/gates/index.js +37 -1
- package/dist/gates/index.js.map +1 -1
- package/dist/gates/performance.d.ts +8 -2
- package/dist/gates/performance.d.ts.map +1 -1
- package/dist/gates/performance.js +9 -0
- package/dist/gates/performance.js.map +1 -1
- package/dist/gates/registry.d.ts +32 -0
- package/dist/gates/registry.d.ts.map +1 -0
- package/dist/gates/registry.js +90 -0
- package/dist/gates/registry.js.map +1 -0
- package/dist/gates/review.d.ts +8 -2
- package/dist/gates/review.d.ts.map +1 -1
- package/dist/gates/review.js +9 -0
- package/dist/gates/review.js.map +1 -1
- package/dist/gates/runner.d.ts +30 -0
- package/dist/gates/runner.d.ts.map +1 -0
- package/dist/gates/runner.js +38 -0
- package/dist/gates/runner.js.map +1 -0
- package/dist/gates/security.d.ts +8 -2
- package/dist/gates/security.d.ts.map +1 -1
- package/dist/gates/security.js +9 -0
- package/dist/gates/security.js.map +1 -1
- package/dist/gates/types.d.ts +41 -1
- package/dist/gates/types.d.ts.map +1 -1
- package/dist/hooks/bootstrap.d.ts.map +1 -1
- package/dist/hooks/bootstrap.js +0 -2
- package/dist/hooks/bootstrap.js.map +1 -1
- package/dist/hooks/config.d.ts +26 -0
- package/dist/hooks/config.d.ts.map +1 -0
- package/dist/hooks/config.js +30 -0
- package/dist/hooks/config.js.map +1 -0
- package/dist/hooks/index.d.ts +2 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +4 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/registry.d.ts +18 -1
- package/dist/hooks/registry.d.ts.map +1 -1
- package/dist/hooks/registry.js +45 -0
- package/dist/hooks/registry.js.map +1 -1
- package/dist/hooks/types.d.ts +20 -0
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/index.d.ts +5 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -20
- package/dist/index.js.map +1 -1
- package/dist/knowledge/import.d.ts +2 -2
- package/dist/knowledge/import.d.ts.map +1 -1
- package/dist/knowledge/ingest.js.map +1 -1
- package/dist/knowledge/lifecycle-hooks.d.ts +2 -2
- package/dist/knowledge/lifecycle-hooks.d.ts.map +1 -1
- package/dist/knowledge/types.d.ts +5 -7
- package/dist/knowledge/types.d.ts.map +1 -1
- package/dist/knowledge/types.js +1 -1
- package/dist/knowledge/types.js.map +1 -1
- package/dist/monitoring/constraint-doctor.d.ts +4 -22
- package/dist/monitoring/constraint-doctor.d.ts.map +1 -1
- package/dist/monitoring/constraint-doctor.js +7 -94
- package/dist/monitoring/constraint-doctor.js.map +1 -1
- package/dist/presets/standard.d.ts +1 -1
- package/dist/presets/standard.d.ts.map +1 -1
- package/dist/presets/standard.js +1 -2
- package/dist/presets/standard.js.map +1 -1
- package/dist/pretool-use-hook.d.ts +16 -0
- package/dist/pretool-use-hook.d.ts.map +1 -0
- package/dist/pretool-use-hook.js +68 -0
- package/dist/pretool-use-hook.js.map +1 -0
- package/dist/spec/annotation-checker.d.ts.map +1 -1
- package/dist/spec/annotation-checker.js +6 -26
- package/dist/spec/annotation-checker.js.map +1 -1
- package/dist/tools/index.d.ts +0 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/types/constraint.d.ts +1 -12
- package/dist/types/constraint.d.ts.map +1 -1
- package/dist/types/constraint.js +0 -3
- package/dist/types/constraint.js.map +1 -1
- package/dist/types/project-config.d.ts +0 -2
- package/dist/types/project-config.d.ts.map +1 -1
- package/dist/utils/file-walk.d.ts +2 -2
- package/dist/utils/file-walk.js +2 -2
- package/package.json +6 -1
- package/src/CONTEXT.md +15 -0
- package/src/__tests__/checker-extra.test.ts +2 -59
- package/src/__tests__/constraint-doctor.test.ts +1 -140
- package/src/__tests__/constraint-handler.test.ts +0 -4
- package/src/__tests__/pretool-use-hook.test.ts +82 -0
- package/src/__tests__/project-config-loader-extra.test.ts +0 -20
- package/src/__tests__/project-config-loader.test.ts +0 -1
- package/src/cli/commands/CONTEXT.md +15 -7
- package/src/cli/commands/__tests__/check-drift.test.ts +0 -3
- package/src/cli/commands/__tests__/check-skip-output.test.ts +0 -5
- package/src/cli/commands/__tests__/check.test.ts +7 -75
- package/src/cli/commands/__tests__/registry.test.ts +201 -0
- package/src/cli/commands/__tests__/sync-docs-agents.test.ts +55 -0
- package/src/cli/commands/check.ts +2 -14
- package/src/cli/commands/definitions.ts +593 -0
- package/src/cli/commands/knowledge.ts +3 -3
- package/src/cli/commands/sync-docs/agents-syncer.ts +26 -6
- package/src/cli/commands/sync-docs/capabilities-syncer.ts +4 -110
- package/src/cli/commands/sync-docs/index.ts +8 -5
- package/src/completion-checkers/CONTEXT.md +25 -0
- package/src/completion-checkers/__tests__/contract-presence.test.ts +44 -0
- package/src/completion-checkers/__tests__/phase-format.test.ts +60 -0
- package/src/completion-checkers/__tests__/tdd-chain.test.ts +99 -0
- package/src/completion-checkers/classify.ts +47 -0
- package/src/completion-checkers/contract-presence.ts +40 -0
- package/src/completion-checkers/glob-match.ts +54 -0
- package/src/completion-checkers/index.ts +19 -0
- package/src/completion-checkers/phase-format.ts +48 -0
- package/src/completion-checkers/tdd-chain.ts +63 -0
- package/src/completion-checkers/types.ts +84 -0
- package/src/context/CONTEXT.md +2 -7
- package/src/context/__tests__/session-manager.test.ts +0 -91
- package/src/context/index.ts +1 -5
- package/src/context/knowledge-injector.ts +3 -3
- package/src/context/session-manager.ts +0 -74
- package/src/context/types.ts +2 -63
- package/src/core/constraints/__tests__/interceptor.test.ts +0 -2
- package/src/core/constraints/agent-prompt-renderer.ts +1 -1
- package/src/core/constraints/capabilities-parser.ts +95 -2
- package/src/core/constraints/checker.ts +8 -53
- package/src/core/constraints/definitions.ts +0 -8
- package/src/core/constraints/doc-freshness/runner.ts +1 -2
- package/src/core/constraints/index.ts +1 -2
- package/src/core/constraints/interceptor.ts +1 -6
- package/src/core/effective-constraints.ts +0 -1
- package/src/core/project-config-loader.ts +1 -7
- package/src/dashboard/stats.ts +2 -2
- package/src/dashboard/types.ts +2 -2
- package/src/failure/constraint-handler.ts +0 -2
- package/src/gates/CONTEXT.md +16 -13
- package/src/gates/__tests__/checker-gate.test.ts +45 -0
- package/src/gates/__tests__/contract.test.ts +73 -0
- package/src/gates/__tests__/effective-gates.test.ts +82 -0
- package/src/gates/__tests__/gate-interface.test.ts +202 -0
- package/src/gates/__tests__/registry.test.ts +87 -0
- package/src/gates/__tests__/runner.test.ts +81 -0
- package/src/gates/acceptance.ts +24 -1
- package/src/gates/checker-gate.ts +54 -0
- package/src/gates/command.ts +13 -2
- package/src/gates/contract.ts +12 -2
- package/src/gates/decision.ts +27 -0
- package/src/gates/definitions.ts +207 -0
- package/src/gates/effective-gates.ts +106 -0
- package/src/gates/index.ts +38 -0
- package/src/gates/performance.ts +12 -2
- package/src/gates/registry.ts +107 -0
- package/src/gates/review.ts +12 -2
- package/src/gates/runner.ts +57 -0
- package/src/gates/security.ts +12 -2
- package/src/gates/types.ts +48 -1
- package/src/hooks/CONTEXT.md +12 -2
- package/src/hooks/__tests__/bootstrap.test.ts +0 -1
- package/src/hooks/__tests__/config.test.ts +19 -0
- package/src/hooks/__tests__/pipeline.test.ts +79 -0
- package/src/hooks/__tests__/registry.test.ts +67 -0
- package/src/hooks/bootstrap.ts +0 -2
- package/src/hooks/config.ts +29 -0
- package/src/hooks/index.ts +2 -1
- package/src/hooks/registry.ts +60 -1
- package/src/hooks/types.ts +21 -0
- package/src/index.ts +11 -21
- package/src/knowledge/import.ts +3 -3
- package/src/knowledge/ingest.ts +4 -4
- package/src/knowledge/lifecycle-hooks.ts +3 -3
- package/src/knowledge/types.ts +5 -8
- package/src/monitoring/constraint-doctor.ts +7 -106
- package/src/presets/__tests__/standard.test.ts +0 -2
- package/src/presets/standard.ts +1 -2
- package/src/pretool-use-hook.ts +68 -0
- package/src/spec/__tests__/annotation-checker.test.ts +9 -3
- package/src/spec/annotation-checker.ts +7 -29
- package/src/tools/CONTEXT.md +7 -14
- package/src/tools/index.ts +0 -4
- package/src/types/constraint.ts +1 -14
- package/src/types/project-config.ts +0 -3
- package/src/utils/file-walk.ts +2 -2
- package/dist/architecture/constraint-engine.d.ts +0 -67
- package/dist/architecture/constraint-engine.d.ts.map +0 -1
- package/dist/architecture/constraint-engine.js +0 -295
- package/dist/architecture/constraint-engine.js.map +0 -1
- package/dist/architecture/cross-project-checker.d.ts +0 -54
- package/dist/architecture/cross-project-checker.d.ts.map +0 -1
- package/dist/architecture/cross-project-checker.js +0 -467
- package/dist/architecture/cross-project-checker.js.map +0 -1
- package/dist/cli/commands/index.d.ts +0 -30
- package/dist/cli/commands/index.d.ts.map +0 -1
- package/dist/cli/commands/index.js +0 -91
- package/dist/cli/commands/index.js.map +0 -1
- package/dist/context/file-budget.d.ts +0 -40
- package/dist/context/file-budget.d.ts.map +0 -1
- package/dist/context/file-budget.js +0 -147
- package/dist/context/file-budget.js.map +0 -1
- package/dist/context/progressive-loader.d.ts +0 -109
- package/dist/context/progressive-loader.d.ts.map +0 -1
- package/dist/context/progressive-loader.js +0 -166
- package/dist/context/progressive-loader.js.map +0 -1
- package/dist/context/token-pipeline.d.ts +0 -55
- package/dist/context/token-pipeline.d.ts.map +0 -1
- package/dist/context/token-pipeline.js +0 -220
- package/dist/context/token-pipeline.js.map +0 -1
- package/dist/context/tool-output-budget.d.ts +0 -59
- package/dist/context/tool-output-budget.d.ts.map +0 -1
- package/dist/context/tool-output-budget.js +0 -177
- package/dist/context/tool-output-budget.js.map +0 -1
- package/dist/core/constraints/default-executors.d.ts +0 -10
- package/dist/core/constraints/default-executors.d.ts.map +0 -1
- package/dist/core/constraints/default-executors.js +0 -120
- package/dist/core/constraints/default-executors.js.map +0 -1
- package/dist/llm/adapter.d.ts +0 -36
- package/dist/llm/adapter.d.ts.map +0 -1
- package/dist/llm/adapter.js +0 -118
- package/dist/llm/adapter.js.map +0 -1
- package/dist/llm/index.d.ts +0 -3
- package/dist/llm/index.d.ts.map +0 -1
- package/dist/llm/index.js +0 -19
- package/dist/llm/index.js.map +0 -1
- package/dist/llm/types.d.ts +0 -62
- package/dist/llm/types.d.ts.map +0 -1
- package/dist/llm/types.js +0 -8
- package/dist/llm/types.js.map +0 -1
- package/dist/tools/core/index.d.ts +0 -13
- package/dist/tools/core/index.d.ts.map +0 -1
- package/dist/tools/core/index.js +0 -198
- package/dist/tools/core/index.js.map +0 -1
- package/dist/tools/loader.d.ts +0 -21
- package/dist/tools/loader.d.ts.map +0 -1
- package/dist/tools/loader.js +0 -199
- package/dist/tools/loader.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -59
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -115
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/types.d.ts +0 -38
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -6
- package/dist/tools/types.js.map +0 -1
- package/src/__tests__/architecture-engine.test.ts +0 -619
- package/src/__tests__/context/progressive-loader.test.ts +0 -131
- package/src/__tests__/cross-project-checker.test.ts +0 -318
- package/src/architecture/CONTEXT.md +0 -22
- package/src/architecture/constraint-engine.ts +0 -351
- package/src/architecture/cross-project-checker.ts +0 -545
- package/src/cli/commands/index.ts +0 -30
- package/src/context/__tests__/file-budget.test.ts +0 -142
- package/src/context/__tests__/progressive-loader.test.ts +0 -264
- package/src/context/__tests__/token-pipeline.test.ts +0 -178
- package/src/context/__tests__/tool-output-budget.test.ts +0 -95
- package/src/context/file-budget.ts +0 -142
- package/src/context/progressive-loader.ts +0 -260
- package/src/context/token-pipeline.ts +0 -265
- package/src/context/tool-output-budget.ts +0 -178
- package/src/core/constraints/__tests__/default-executors.test.ts +0 -57
- package/src/core/constraints/default-executors.ts +0 -92
- package/src/llm/CONTEXT.md +0 -21
- package/src/llm/__tests__/adapter.test.ts +0 -172
- package/src/llm/adapter.ts +0 -149
- package/src/llm/index.ts +0 -2
- package/src/llm/types.ts +0 -81
- package/src/tools/__tests__/loader.test.ts +0 -252
- package/src/tools/__tests__/registry.test.ts +0 -157
- package/src/tools/core/__tests__/core.test.ts +0 -122
- package/src/tools/core/index.ts +0 -201
- package/src/tools/loader.ts +0 -216
- package/src/tools/registry.ts +0 -128
- package/src/tools/types.ts +0 -46
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 约束诊断器
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* 成本控制:
|
|
7
|
-
* - 仅在有异常时触发
|
|
8
|
-
* - 精简 prompt,不喂全部 traces
|
|
9
|
-
* - ~2000 Token/次
|
|
4
|
+
* 当检测到异常时,基于预设规则分析 traces 给出诊断(零 Token,不调用 LLM)。
|
|
10
5
|
*/
|
|
11
6
|
|
|
12
7
|
import type {
|
|
@@ -15,7 +10,6 @@ import type {
|
|
|
15
10
|
TraceSummary,
|
|
16
11
|
} from '../types/trace';
|
|
17
12
|
import type { Diagnosis } from '../types/monitoring-types';
|
|
18
|
-
import type { LLMAdapter } from '../llm/types';
|
|
19
13
|
import { DIAGNOSIS_RULES } from './diagnosis-rules';
|
|
20
14
|
|
|
21
15
|
// 类型定义已归位 types 层(工单 14),此处再导出保持模块公开面不变
|
|
@@ -54,9 +48,8 @@ export interface ConstraintDoctorConfig {
|
|
|
54
48
|
export class ConstraintDoctor {
|
|
55
49
|
private config: ConstraintDoctorConfig;
|
|
56
50
|
private traces: ExecutionTrace[];
|
|
57
|
-
private llm: LLMAdapter | null;
|
|
58
51
|
|
|
59
|
-
constructor(config?: ConstraintDoctorConfig
|
|
52
|
+
constructor(config?: ConstraintDoctorConfig) {
|
|
60
53
|
this.config = {
|
|
61
54
|
enabled: false,
|
|
62
55
|
maxTracesInPrompt: 20,
|
|
@@ -64,7 +57,6 @@ export class ConstraintDoctor {
|
|
|
64
57
|
...config,
|
|
65
58
|
};
|
|
66
59
|
this.traces = [];
|
|
67
|
-
this.llm = llm || null;
|
|
68
60
|
}
|
|
69
61
|
|
|
70
62
|
/**
|
|
@@ -83,20 +75,8 @@ export class ConstraintDoctor {
|
|
|
83
75
|
// 过滤相关 traces
|
|
84
76
|
const relevantTraces = this.filterRelevantTraces(anomaly);
|
|
85
77
|
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// 如果 LLM 可用,进行深度分析
|
|
90
|
-
if (this.config.enabled && this.llm) {
|
|
91
|
-
try {
|
|
92
|
-
return await this.agentDiagnose(anomaly, relevantTraces, ruleBasedDiagnosis);
|
|
93
|
-
} catch {
|
|
94
|
-
// LLM 调用失败,降级到规则诊断
|
|
95
|
-
return ruleBasedDiagnosis;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return ruleBasedDiagnosis;
|
|
78
|
+
// 基于规则的诊断(不消耗 Token)
|
|
79
|
+
return this.ruleBasedDiagnose(anomaly, relevantTraces);
|
|
100
80
|
}
|
|
101
81
|
|
|
102
82
|
/**
|
|
@@ -147,85 +127,6 @@ export class ConstraintDoctor {
|
|
|
147
127
|
return diagnosis;
|
|
148
128
|
}
|
|
149
129
|
|
|
150
|
-
/**
|
|
151
|
-
* LLM 深度诊断
|
|
152
|
-
*
|
|
153
|
-
* 将异常和相关 traces 构造为 prompt,调用 LLM 分析根因
|
|
154
|
-
* 成本:~2000 Token/次
|
|
155
|
-
*/
|
|
156
|
-
private async agentDiagnose(
|
|
157
|
-
anomaly: TraceAnomaly,
|
|
158
|
-
traces: ExecutionTrace[],
|
|
159
|
-
fallback: Diagnosis
|
|
160
|
-
): Promise<Diagnosis> {
|
|
161
|
-
const maxTraces = this.config.maxTracesInPrompt || 20;
|
|
162
|
-
const traceSummary = traces.slice(0, maxTraces).map(t =>
|
|
163
|
-
`[${t.result}] ${t.constraintId} | ${t.operation || 'unknown'} | ${t.timestamp ? new Date(t.timestamp).toISOString() : 'no-ts'}`
|
|
164
|
-
).join('\n');
|
|
165
|
-
|
|
166
|
-
const prompt = `你是约束系统诊断专家。分析以下异常并给出诊断结果。
|
|
167
|
-
|
|
168
|
-
## 异常信息
|
|
169
|
-
- 约束 ID: ${anomaly.constraintId}
|
|
170
|
-
- 异常类型: ${anomaly.type}
|
|
171
|
-
- 约束层级: ${anomaly.level}
|
|
172
|
-
- 当前数据: ${JSON.stringify(anomaly.data)}
|
|
173
|
-
|
|
174
|
-
## 相关 Traces(最近 ${Math.min(traces.length, maxTraces)} 条)
|
|
175
|
-
${traceSummary || '无相关 traces'}
|
|
176
|
-
|
|
177
|
-
## 要求
|
|
178
|
-
以 JSON 格式返回诊断结果,包含以下字段:
|
|
179
|
-
{
|
|
180
|
-
"rootCause": { "primary": "主要原因", "secondary": ["次要原因1", "次要原因2"] },
|
|
181
|
-
"impact": { "severity": "low|medium|high", "scope": "single_project|multiple_projects|team", "userImpact": "用户影响描述" },
|
|
182
|
-
"recommendations": [{ "type": "add_exception|adjust_threshold|modify_constraint|user_training", "content": "建议内容", "expectedOutcome": "预期效果", "implementationCost": "low|medium|high" }],
|
|
183
|
-
"needsChange": true/false,
|
|
184
|
-
"urgency": "low|medium|high"
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
只返回 JSON,不要其他内容。`;
|
|
188
|
-
|
|
189
|
-
const response = await this.llm!.complete(prompt, {
|
|
190
|
-
maxTokens: 1000,
|
|
191
|
-
temperature: 0.3,
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
// 解析 LLM 响应
|
|
195
|
-
const parsed = this.parseAgentResponse(response);
|
|
196
|
-
|
|
197
|
-
return {
|
|
198
|
-
...fallback,
|
|
199
|
-
rootCause: {
|
|
200
|
-
primary: parsed.rootCause?.primary || fallback.rootCause.primary,
|
|
201
|
-
secondary: parsed.rootCause?.secondary || fallback.rootCause.secondary,
|
|
202
|
-
evidence: fallback.rootCause.evidence,
|
|
203
|
-
},
|
|
204
|
-
impact: {
|
|
205
|
-
severity: parsed.impact?.severity || fallback.impact.severity,
|
|
206
|
-
scope: parsed.impact?.scope || fallback.impact.scope,
|
|
207
|
-
userImpact: parsed.impact?.userImpact || fallback.impact.userImpact,
|
|
208
|
-
},
|
|
209
|
-
recommendations: parsed.recommendations?.length ? parsed.recommendations : fallback.recommendations,
|
|
210
|
-
needsChange: parsed.needsChange ?? fallback.needsChange,
|
|
211
|
-
urgency: parsed.urgency || fallback.urgency,
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* 解析 LLM 返回的 JSON 诊断结果
|
|
217
|
-
*/
|
|
218
|
-
private parseAgentResponse(response: string): Partial<Diagnosis> {
|
|
219
|
-
try {
|
|
220
|
-
// 提取 JSON(可能被 markdown 代码块包裹)
|
|
221
|
-
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
222
|
-
if (!jsonMatch) return {};
|
|
223
|
-
return JSON.parse(jsonMatch[0]);
|
|
224
|
-
} catch {
|
|
225
|
-
return {};
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
130
|
/**
|
|
230
131
|
* 过滤相关 traces
|
|
231
132
|
*
|
|
@@ -333,6 +234,6 @@ ${traceSummary || '无相关 traces'}
|
|
|
333
234
|
/**
|
|
334
235
|
* 创建诊断器
|
|
335
236
|
*/
|
|
336
|
-
export function createDoctor(config?: ConstraintDoctorConfig
|
|
337
|
-
return new ConstraintDoctor(config
|
|
237
|
+
export function createDoctor(config?: ConstraintDoctorConfig): ConstraintDoctor {
|
|
238
|
+
return new ConstraintDoctor(config);
|
|
338
239
|
}
|
|
@@ -48,7 +48,6 @@ describe('applyPreset with string preset names', () => {
|
|
|
48
48
|
const config = applyPreset('relaxed');
|
|
49
49
|
expect(config.ironLaws).toBeDefined();
|
|
50
50
|
expect(config.ironLaws.no_completion_without_verification).toBeDefined();
|
|
51
|
-
expect(Object.keys(config.tips).length).toBe(0);
|
|
52
51
|
expect(Object.keys(config.prompts ?? {}).length).toBe(0);
|
|
53
52
|
expect(config.disabled.length).toBeGreaterThan(0);
|
|
54
53
|
});
|
|
@@ -75,7 +74,6 @@ describe('applyPreset with PresetConfig object', () => {
|
|
|
75
74
|
prompts: [],
|
|
76
75
|
});
|
|
77
76
|
expect(Object.keys(config.guidelines).length).toBeGreaterThan(0);
|
|
78
|
-
expect(Object.keys(config.tips).length).toBe(0);
|
|
79
77
|
expect(Object.keys(config.prompts ?? {}).length).toBe(0);
|
|
80
78
|
});
|
|
81
79
|
|
package/src/presets/standard.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 预设定义哪些约束被启用
|
|
5
5
|
*
|
|
6
|
-
* ADR-0001:
|
|
6
|
+
* ADR-0001:kind 二元(check + prompt 纯注入层)。
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type { Constraint } from '../types/constraint';
|
|
@@ -79,7 +79,6 @@ export function applyPreset(
|
|
|
79
79
|
return {
|
|
80
80
|
ironLaws: filterByIds(IRON_LAWS, cfg.ironLaws),
|
|
81
81
|
guidelines: filterByIds(GUIDELINES, cfg.guidelines),
|
|
82
|
-
tips: {},
|
|
83
82
|
prompts: filterByIds(PROMPTS, cfg.prompts),
|
|
84
83
|
disabled,
|
|
85
84
|
custom: [],
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PreToolUse 执法脚本 — command-gate hook 固化版(studio#153)
|
|
3
|
+
*
|
|
4
|
+
* 内容 = studio-agent provider-hooks.buildHookScriptContent 生成脚本(#147)的固化版,
|
|
5
|
+
* 归属归位:谁的东西谁发货——CommandGate 是 harness 的,hook 脚本随 harness 包出厂。
|
|
6
|
+
* 编译产物 = 包内 dist/pretool-use-hook.js,provider hook 配置(codex hooks.json /
|
|
7
|
+
* kimi config.toml)直接指向 require.resolve('@dommaker/harness') 同目录的该文件,
|
|
8
|
+
* 不再由 studio-agent 按 worktree 生成、不再内嵌绝对路径。
|
|
9
|
+
*
|
|
10
|
+
* 语义(与生成版一致):
|
|
11
|
+
* - stdin 收 provider PreToolUse JSON(tool_input.command);
|
|
12
|
+
* - CommandGate.isAllowed 判定 block 级黑名单,命中 → stderr 写原因 + exit 2
|
|
13
|
+
* (codex/kimi 阻断语义:exit 2 + stderr 阻断,其余 exit code fail-open);
|
|
14
|
+
* - fail-open:stdin 非 JSON / 缺字段 / CommandGate 异常一律放行——宁可漏拦
|
|
15
|
+
* 也不全体 Bash 秒断,拦截层只是纵深防御的一道;
|
|
16
|
+
* - warn/audit 级命中同样放行(isAllowed 只看 block 级),与生成版行为一致。
|
|
17
|
+
*/
|
|
18
|
+
import { CommandGate } from './gates/command';
|
|
19
|
+
|
|
20
|
+
/** hook 标识:与 studio-agent 生成版同一 marker(配置幂等检测共用口径) */
|
|
21
|
+
export const HOOK_MARKER = 'harness-command-gate';
|
|
22
|
+
|
|
23
|
+
interface PreToolUseInput {
|
|
24
|
+
tool_input?: { command?: string };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 判定一次 PreToolUse 是否放行。
|
|
29
|
+
* block 级命中 → allowed=false;warn/audit/干净命令/坏输入一律 allowed=true。
|
|
30
|
+
*/
|
|
31
|
+
export function decidePreToolUse(rawStdin: string): { allowed: boolean; command: string } {
|
|
32
|
+
let input: PreToolUseInput = {};
|
|
33
|
+
try {
|
|
34
|
+
input = JSON.parse(rawStdin || '{}') as PreToolUseInput;
|
|
35
|
+
} catch {
|
|
36
|
+
// 非 JSON stdin:放行
|
|
37
|
+
}
|
|
38
|
+
const command = (input.tool_input && input.tool_input.command) || '';
|
|
39
|
+
try {
|
|
40
|
+
const gate = new CommandGate();
|
|
41
|
+
return { allowed: gate.isAllowed(command), command };
|
|
42
|
+
} catch {
|
|
43
|
+
// CommandGate 加载/判定异常:fail-open
|
|
44
|
+
return { allowed: true, command };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 执行一次 hook:返回进程 exit code(2 = 阻断,0 = 放行)。
|
|
50
|
+
* 阻断时原因写 stderr(provider 把 stderr 作为阻断原因回填模型)。
|
|
51
|
+
*/
|
|
52
|
+
export function runPreToolUseHook(rawStdin: string): number {
|
|
53
|
+
const { allowed, command } = decidePreToolUse(rawStdin);
|
|
54
|
+
if (!allowed) {
|
|
55
|
+
console.error(`[${HOOK_MARKER}] blocked: ${command}`);
|
|
56
|
+
return 2;
|
|
57
|
+
}
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* istanbul ignore next -- 进程入口仅做 stdin 收集 + exit,逻辑由 runPreToolUseHook 单测覆盖 */
|
|
62
|
+
if (require.main === module) {
|
|
63
|
+
let raw = '';
|
|
64
|
+
process.stdin.on('data', (c) => { raw += c; });
|
|
65
|
+
process.stdin.on('end', () => {
|
|
66
|
+
process.exit(runPreToolUseHook(raw));
|
|
67
|
+
});
|
|
68
|
+
}
|
|
@@ -163,12 +163,18 @@ export function noSpecFunc() {}
|
|
|
163
163
|
});
|
|
164
164
|
|
|
165
165
|
it('应该跳过 node_modules 和 dist', () => {
|
|
166
|
-
mockFs.
|
|
166
|
+
mockFs.readFileSync.mockReturnValue('');
|
|
167
|
+
mockFs.readdirSync.mockReturnValue([
|
|
168
|
+
{ name: 'node_modules', isDirectory: () => true, isFile: () => false },
|
|
169
|
+
{ name: 'dist', isDirectory: () => true, isFile: () => false },
|
|
170
|
+
{ name: 'file.ts', isDirectory: () => false, isFile: () => true },
|
|
171
|
+
] as any);
|
|
167
172
|
|
|
168
173
|
const results = checkDirectory(tempDir);
|
|
169
174
|
|
|
170
|
-
//
|
|
171
|
-
expect(
|
|
175
|
+
// 只收集 file.ts,跳过 node_modules 与 dist 目录
|
|
176
|
+
expect(results).toHaveLength(1);
|
|
177
|
+
expect(results[0].file).toBe('/test/project/file.ts');
|
|
172
178
|
});
|
|
173
179
|
|
|
174
180
|
it('应该处理空目录', () => {
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* 检查代码中的 @spec 注释是否规范
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { readFileSync
|
|
7
|
+
import { readFileSync } from 'fs';
|
|
8
8
|
import * as path from 'path';
|
|
9
|
+
import { walkFiles } from '../utils/file-walk';
|
|
9
10
|
|
|
10
11
|
export interface AnnotationCheckResult {
|
|
11
12
|
valid: boolean;
|
|
@@ -248,36 +249,13 @@ function checkPublicExports(content: string, result: AnnotationCheckResult): voi
|
|
|
248
249
|
}
|
|
249
250
|
|
|
250
251
|
/**
|
|
251
|
-
*
|
|
252
|
+
* 递归获取目录下所有文件(收敛到 utils/file-walk 的 walkFiles,工单 O3)
|
|
252
253
|
*/
|
|
253
254
|
function getFilesRecursively(dir: string, extensions: string[]): string[] {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
for (const item of items) {
|
|
260
|
-
const fullPath = path.join(dir, item);
|
|
261
|
-
const stat = statSync(fullPath);
|
|
262
|
-
|
|
263
|
-
if (stat.isDirectory()) {
|
|
264
|
-
// 跳过 node_modules 和 dist
|
|
265
|
-
if (item === 'node_modules' || item === 'dist') {
|
|
266
|
-
continue;
|
|
267
|
-
}
|
|
268
|
-
files.push(...getFilesRecursively(fullPath, extensions));
|
|
269
|
-
} else if (stat.isFile()) {
|
|
270
|
-
const ext = path.extname(item);
|
|
271
|
-
if (extensions.includes(ext) && !item.endsWith('.d.ts')) {
|
|
272
|
-
files.push(fullPath);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
} catch {
|
|
277
|
-
// 目录不存在或无法访问
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
return files;
|
|
255
|
+
return walkFiles(dir, {
|
|
256
|
+
skipDirs: ['node_modules', 'dist'],
|
|
257
|
+
filter: (name) => extensions.includes(path.extname(name)) && !name.endsWith('.d.ts'),
|
|
258
|
+
});
|
|
281
259
|
}
|
|
282
260
|
|
|
283
261
|
/**
|
package/src/tools/CONTEXT.md
CHANGED
|
@@ -1,25 +1,18 @@
|
|
|
1
1
|
# tools/
|
|
2
2
|
|
|
3
3
|
## 职责
|
|
4
|
-
|
|
4
|
+
工具定义目录与路径管理:bundled 工具定义目录(`definitions/`,113 个 yml 能力目录)与路径解析。
|
|
5
5
|
|
|
6
6
|
## 核心导出
|
|
7
|
-
- `
|
|
8
|
-
- `registry.ts` — 工具注册表
|
|
9
|
-
- `core.ts` — 核心工具实现
|
|
10
|
-
- `loader.ts` — 工具加载器
|
|
11
|
-
- `paths.ts` — 工具路径管理
|
|
7
|
+
- `paths.ts` — 工具路径管理(`getToolsDir` / `getRegistryPath`)
|
|
12
8
|
|
|
13
9
|
## 依赖关系
|
|
14
|
-
-
|
|
15
|
-
- 被 `
|
|
16
|
-
- 被 Agent 工具调用管线消费
|
|
10
|
+
- 仅依赖 Node 内置 `path`
|
|
11
|
+
- 被 studio 消费(`getRegistryPath` / `getToolsDir`,`capabilities/routes.ts`、`capability.service.ts`)
|
|
17
12
|
|
|
18
13
|
## 约定
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
- loader 支持动态加载外部工具
|
|
14
|
+
- 工具定义目录路径由 paths 模块解析
|
|
15
|
+
- `definitions/` 为静态能力目录,构建时复制到 dist
|
|
22
16
|
|
|
23
17
|
## 注意事项
|
|
24
|
-
-
|
|
25
|
-
- 路径管理支持多项目工具目录
|
|
18
|
+
- 旧工具注册表/核心工具/加载器/类型定义已随 H1(#40)删除,仅保留路径管理与能力目录
|
package/src/tools/index.ts
CHANGED
package/src/types/constraint.ts
CHANGED
|
@@ -6,9 +6,6 @@
|
|
|
6
6
|
* - iron_law:绝对禁止,无例外,违背即阻止执行
|
|
7
7
|
* - guideline:优先建议,有例外,违背发警告但不阻止
|
|
8
8
|
* - prompt:纯文本提示,仅参与 prompt 注入,不占检查位、不产生 trace
|
|
9
|
-
*
|
|
10
|
-
* 'tip' 层级已随 TIPS 退役(ADR-0001),仅保留在类型上以兼容
|
|
11
|
-
* ConstraintCheckResult.tips 等历史结果形态,不再有新定义使用。
|
|
12
9
|
*/
|
|
13
10
|
|
|
14
11
|
/**
|
|
@@ -25,9 +22,8 @@ export type ConstraintKind = 'check' | 'prompt';
|
|
|
25
22
|
* 约束层级
|
|
26
23
|
*
|
|
27
24
|
* check 层只使用 'iron_law' | 'guideline';prompt 类统一为 'prompt'。
|
|
28
|
-
* 'tip' 已退役,仅为历史结果结构兼容保留。
|
|
29
25
|
*/
|
|
30
|
-
export type ConstraintLevel = 'iron_law' | 'guideline' | 'prompt'
|
|
26
|
+
export type ConstraintLevel = 'iron_law' | 'guideline' | 'prompt';
|
|
31
27
|
|
|
32
28
|
/**
|
|
33
29
|
* 约束触发条件(开放扩展)
|
|
@@ -281,9 +277,6 @@ export class ConstraintViolationError extends Error {
|
|
|
281
277
|
|
|
282
278
|
/**
|
|
283
279
|
* 约束检查结果(check 层)
|
|
284
|
-
*
|
|
285
|
-
* tips/tipCount 已随 TIPS 退役(ADR-0001),保留字段以兼容历史调用方,
|
|
286
|
-
* 内置约束下恒为空数组 / 0。
|
|
287
280
|
*/
|
|
288
281
|
export interface ConstraintCheckResult {
|
|
289
282
|
/** 铁律检查结果(必须全部通过) */
|
|
@@ -292,17 +285,11 @@ export interface ConstraintCheckResult {
|
|
|
292
285
|
/** 指导原则检查结果(警告,不阻止) */
|
|
293
286
|
guidelines: ConstraintResult[];
|
|
294
287
|
|
|
295
|
-
/** 提示检查结果(仅提示) */
|
|
296
|
-
tips: ConstraintResult[];
|
|
297
|
-
|
|
298
288
|
/** 是否通过(铁律全部通过) */
|
|
299
289
|
passed: boolean;
|
|
300
290
|
|
|
301
291
|
/** 警告数量 */
|
|
302
292
|
warningCount: number;
|
|
303
|
-
|
|
304
|
-
/** 提示数量 */
|
|
305
|
-
tipCount: number;
|
|
306
293
|
}
|
|
307
294
|
|
|
308
295
|
/**
|
|
@@ -285,9 +285,6 @@ export interface MergedConstraintsConfig {
|
|
|
285
285
|
/** Guidelines(合并后) */
|
|
286
286
|
guidelines: Record<string, Constraint>;
|
|
287
287
|
|
|
288
|
-
/** Tips(合并后)—— 已退役(ADR-0001),内置侧恒为空表,仅兼容历史调用方 */
|
|
289
|
-
tips: Record<string, Constraint>;
|
|
290
|
-
|
|
291
288
|
/** Prompts(合并后,ADR-0001 新增;可选以兼容旧调用方,缺省回落内置 PROMPTS) */
|
|
292
289
|
prompts?: Record<string, Constraint>;
|
|
293
290
|
|
package/src/utils/file-walk.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 文件遍历工具(工单 19)
|
|
3
3
|
*
|
|
4
|
-
* 收敛此前散落在 sync-docs /
|
|
5
|
-
*
|
|
4
|
+
* 收敛此前散落在 sync-docs / checker / spec-baseline-check /
|
|
5
|
+
* doc-freshness-check / spec/annotation-checker 中的递归遍历实现。
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import * as fs from 'fs';
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 架构约束引擎
|
|
3
|
-
*
|
|
4
|
-
* 通用能力:加载规则、执行检查、生成报告
|
|
5
|
-
* 规则定义:由项目提供(.architect/rules.yml)
|
|
6
|
-
*/
|
|
7
|
-
export interface ArchitectureContext {
|
|
8
|
-
files: string[];
|
|
9
|
-
diff: string;
|
|
10
|
-
pr?: {
|
|
11
|
-
number: number;
|
|
12
|
-
changedFiles: number;
|
|
13
|
-
additions: number;
|
|
14
|
-
deletions: number;
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
export interface ArchitectureViolation {
|
|
18
|
-
ruleId: string;
|
|
19
|
-
message: string;
|
|
20
|
-
files?: string[];
|
|
21
|
-
severity: 'error' | 'warning';
|
|
22
|
-
}
|
|
23
|
-
export interface ArchitectureResult {
|
|
24
|
-
passed: boolean;
|
|
25
|
-
violations: ArchitectureViolation[];
|
|
26
|
-
}
|
|
27
|
-
export interface ModuleBoundary {
|
|
28
|
-
/** 源文件 glob 模式 */
|
|
29
|
-
from: string;
|
|
30
|
-
/** 禁止导入的目标 glob 模式 */
|
|
31
|
-
denyImport: string;
|
|
32
|
-
}
|
|
33
|
-
export interface ArchitectureRule {
|
|
34
|
-
id: string;
|
|
35
|
-
type: 'forbidden-pattern' | 'file-count' | 'module-boundary' | 'custom';
|
|
36
|
-
severity?: 'error' | 'warning';
|
|
37
|
-
scope?: string;
|
|
38
|
-
message?: string;
|
|
39
|
-
patterns?: string[];
|
|
40
|
-
threshold?: number;
|
|
41
|
-
boundaries?: ModuleBoundary[];
|
|
42
|
-
script?: string;
|
|
43
|
-
}
|
|
44
|
-
export declare class ArchitectureConstraintEngine {
|
|
45
|
-
private rules;
|
|
46
|
-
constructor(rules: ArchitectureRule[]);
|
|
47
|
-
check(context: ArchitectureContext): Promise<ArchitectureResult>;
|
|
48
|
-
private checkRule;
|
|
49
|
-
private checkForbiddenPattern;
|
|
50
|
-
private checkFileCount;
|
|
51
|
-
private checkModuleBoundary;
|
|
52
|
-
/**
|
|
53
|
-
* 从 diff 中提取每个文件新增的 import 路径
|
|
54
|
-
* 只解析 + 开头的行(新增内容)
|
|
55
|
-
*/
|
|
56
|
-
private extractImportsFromDiff;
|
|
57
|
-
/**
|
|
58
|
-
* 解析 import 路径为相对于项目根的路径
|
|
59
|
-
* 相对路径: ./foo, ../bar → 基于导入文件解析
|
|
60
|
-
* 非相对路径: @scope/foo → 返回 null(外部依赖)
|
|
61
|
-
*/
|
|
62
|
-
private resolveImport;
|
|
63
|
-
private matchGlob;
|
|
64
|
-
}
|
|
65
|
-
export declare function loadArchitectureRules(configPath: string): Promise<ArchitectureRule[]>;
|
|
66
|
-
export declare function runArchitectureCheck(configPath: string, context: ArchitectureContext): Promise<ArchitectureResult>;
|
|
67
|
-
//# sourceMappingURL=constraint-engine.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constraint-engine.d.ts","sourceRoot":"","sources":["../../src/architecture/constraint-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE;QACH,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,qBAAqB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,mBAAmB,GAAG,YAAY,GAAG,iBAAiB,GAAG,QAAQ,CAAC;IACxE,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAE/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAE9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,4BAA4B;IAC3B,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,gBAAgB,EAAE;IAEvC,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAcxD,SAAS;IAgBvB,OAAO,CAAC,qBAAqB;IA6B7B,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,mBAAmB;IAiC3B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,SAAS;CA+BlB;AAGD,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgB3F;AA4DD,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAI7B"}
|