@dommaker/harness 0.16.8 → 0.16.9
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 +7 -0
- package/bin/harness.js +1 -0
- package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts +14 -1
- package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/capabilities-syncer.js +77 -9
- package/dist/cli/commands/sync-docs/capabilities-syncer.js.map +1 -1
- package/dist/cli/commands/sync-docs/index.d.ts +2 -0
- package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/index.js +83 -20
- package/dist/cli/commands/sync-docs/index.js.map +1 -1
- package/dist/core/constraints/capabilities-parser.d.ts +7 -0
- package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
- package/dist/core/constraints/capabilities-parser.js +17 -0
- package/dist/core/constraints/capabilities-parser.js.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.d.ts +3 -0
- package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.js +30 -1
- package/dist/core/constraints/checkers/capability-sync.js.map +1 -1
- package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
- package/dist/core/constraints/definitions/guidelines.js +4 -2
- package/dist/core/constraints/definitions/guidelines.js.map +1 -1
- package/dist/core/project-config-loader.d.ts +11 -1
- package/dist/core/project-config-loader.d.ts.map +1 -1
- package/dist/core/project-config-loader.js +20 -0
- package/dist/core/project-config-loader.js.map +1 -1
- package/dist/types/project-config.d.ts +14 -0
- package/dist/types/project-config.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/checker-extra.test.ts +130 -0
- package/src/__tests__/project-config-loader.test.ts +40 -1
- package/src/cli/commands/__tests__/sync-docs.test.ts +163 -0
- package/src/cli/commands/sync-docs/capabilities-syncer.ts +85 -8
- package/src/cli/commands/sync-docs/index.ts +87 -24
- package/src/core/constraints/capabilities-parser.ts +15 -0
- package/src/core/constraints/checkers/capability-sync.ts +30 -2
- package/src/core/constraints/definitions/guidelines.ts +4 -2
- package/src/core/project-config-loader.ts +24 -0
- package/src/types/project-config.ts +16 -0
|
@@ -190,7 +190,7 @@ exports.GUIDELINES = {
|
|
|
190
190
|
capability_sync: {
|
|
191
191
|
id: 'capability_sync',
|
|
192
192
|
rule: 'CODE CHANGES MUST UPDATE CAPABILITIES.MD',
|
|
193
|
-
message: '
|
|
193
|
+
message: '核心模块变更必须同步功能清单(支持模块级目录条目登记)',
|
|
194
194
|
level: 'guideline',
|
|
195
195
|
trigger: ['module_creation', 'module_modification', 'module_deletion', 'module_extension'],
|
|
196
196
|
enforcement: 'update-capabilities',
|
|
@@ -205,7 +205,9 @@ exports.GUIDELINES = {
|
|
|
205
205
|
[不强制更新]
|
|
206
206
|
- 内部重构不影响对外接口
|
|
207
207
|
- bug fix 不改变功能
|
|
208
|
-
-
|
|
208
|
+
- 性能优化不改变接口
|
|
209
|
+
|
|
210
|
+
支持模块级目录条目登记:governance.capabilities.mode=module 时按目录覆盖判定(如 src/core/ 一条目录条目覆盖该目录下所有源文件)。`,
|
|
209
211
|
exceptions: ['internal_refactor', 'bug_fix_only', 'performance_optimization'],
|
|
210
212
|
},
|
|
211
213
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guidelines.js","sourceRoot":"","sources":["../../../../src/core/constraints/definitions/guidelines.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,2CAA2C;AAC3C,mBAAmB;AACnB,GAAG;AACH,wBAAwB;AACxB,2CAA2C;AAE9B,QAAA,UAAU,GAA+B;IACpD;;;;OAIG;IACH,eAAe,EAAE;QACf,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,oCAAoC;QAC1C,OAAO,EAAE,sBAAsB;QAC/B,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,CAAC,qBAAqB,CAAC;QAChC,WAAW,EAAE,gBAAgB;QAC7B,WAAW,EAAE;;;;;;;;;;;;;;;+BAec;QAC3B,eAAe,EAAE,wDAAwD;KAC1E;IAED;;;OAGG;IACH,yBAAyB,EAAE;QACzB,EAAE,EAAE,2BAA2B;QAC/B,IAAI,EAAE,iDAAiD;QACvD,OAAO,EAAE,kBAAkB;QAC3B,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE;;;;;;;;;;;;;;;4BAeW;QACxB,UAAU,EAAE,CAAC,aAAa,EAAE,oBAAoB,EAAE,gBAAgB,CAAC;QACnE,eAAe,EAAE,uDAAuD;KACzE;IAED;;;OAGG;IACH,oBAAoB,EAAE;QACpB,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,6CAA6C;QACnD,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE;;;;;;;;;;;;mBAYE;QACf,UAAU,EAAE,CAAC,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,wBAAwB,CAAC;QAC3F,eAAe,EAAE,+DAA+D;KACjF;IAED;;;OAGG;IACH,WAAW,EAAE;QACX,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,+CAA+C;QACrD,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE;;;;;;;;;;aAUJ;QACT,UAAU,EAAE,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,kBAAkB,CAAC;QAC7E,eAAe,EAAE,iEAAiE;KACnF;IAED;;;OAGG;IACH,uBAAuB,EAAE;QACvB,EAAE,EAAE,yBAAyB;QAC7B,IAAI,EAAE,kDAAkD;QACxD,OAAO,EAAE,YAAY;QACrB,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;QACpD,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE;;;;;;;;;kCASiB;QAC9B,UAAU,EAAE,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,sBAAsB,CAAC;QACzG,eAAe,EAAE,8EAA8E;QAC/F,YAAY,EAAE,IAAI;KACnB;IAED;;;OAGG;IACH,+BAA+B,EAAE;QAC/B,EAAE,EAAE,iCAAiC;QACrC,IAAI,EAAE,+CAA+C;QACrD,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE;YACP,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,iBAAiB;YACjB,kBAAkB;YAClB,qBAAqB;SACtB;QACD,WAAW,EAAE,aAAa;QAC1B,WAAW,EAAE;;;;;;;;;;;;;oBAaG;QAChB,UAAU,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,gBAAgB,CAAC;QACzD,eAAe,EAAE,oDAAoD;KACtE;IAED;;;OAGG;IACH,eAAe,EAAE;QACf,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,0CAA0C;QAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"guidelines.js","sourceRoot":"","sources":["../../../../src/core/constraints/definitions/guidelines.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,23 @@
|
|
|
4
4
|
* 加载 .harness/config.yml 和 .harness/custom-constraints.yml
|
|
5
5
|
* 合并内置约束和项目自定义约束
|
|
6
6
|
*/
|
|
7
|
-
import type { ProjectConfig, CustomConstraintDefinition, MergedConstraintsConfig } from '../types/project-config';
|
|
7
|
+
import type { ProjectConfig, CustomConstraintDefinition, MergedConstraintsConfig, CapabilitiesConfig } from '../types/project-config';
|
|
8
8
|
/**
|
|
9
9
|
* 读取并解析 .harness/config.yml(进程级 memoize)
|
|
10
10
|
*
|
|
11
11
|
* 文件不存在时返回 undefined;解析失败向上抛出(由各调用方自行兜底)。
|
|
12
12
|
*/
|
|
13
13
|
export declare function loadRawProjectConfig(projectPath: string): Record<string, unknown> | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* CAPABILITIES.md 登记模式(governance.capabilities.mode)
|
|
16
|
+
*/
|
|
17
|
+
export type CapabilitiesMode = NonNullable<CapabilitiesConfig['mode']>;
|
|
18
|
+
/**
|
|
19
|
+
* 读取 governance.capabilities.mode(缺省 'file',向后兼容)
|
|
20
|
+
*
|
|
21
|
+
* 配置缺失/解析失败/取值非法时一律回落 'file'。
|
|
22
|
+
*/
|
|
23
|
+
export declare function getCapabilitiesMode(projectPath: string): CapabilitiesMode;
|
|
14
24
|
/**
|
|
15
25
|
* 项目配置加载器
|
|
16
26
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-config-loader.d.ts","sourceRoot":"","sources":["../../src/core/project-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,aAAa,EACb,0BAA0B,EAC1B,uBAAuB,
|
|
1
|
+
{"version":3,"file":"project-config-loader.d.ts","sourceRoot":"","sources":["../../src/core/project-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,aAAa,EACb,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAmBjC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CA8B7F;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AAEvE;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAWzE;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,iBAAiB,CAA6C;gBAE1D,WAAW,CAAC,EAAE,MAAM;IAMhC;;OAEG;IACH,IAAI,IAAI,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,gBAAgB,IAAI,uBAAuB;IA2E3C;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,SAAS,IAAI,aAAa;IAI1B;;OAEG;IACH,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAIlE;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAclD;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU;IAU7E;;OAEG;IACH,eAAe,IAAI,OAAO;CAM3B"}
|
|
@@ -41,6 +41,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
42
|
exports.ProjectConfigLoader = void 0;
|
|
43
43
|
exports.loadRawProjectConfig = loadRawProjectConfig;
|
|
44
|
+
exports.getCapabilitiesMode = getCapabilitiesMode;
|
|
44
45
|
const fs = __importStar(require("fs"));
|
|
45
46
|
const path = __importStar(require("path"));
|
|
46
47
|
const yaml = __importStar(require("js-yaml"));
|
|
@@ -93,6 +94,25 @@ function loadRawProjectConfig(projectPath) {
|
|
|
93
94
|
}
|
|
94
95
|
return raw;
|
|
95
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* 读取 governance.capabilities.mode(缺省 'file',向后兼容)
|
|
99
|
+
*
|
|
100
|
+
* 配置缺失/解析失败/取值非法时一律回落 'file'。
|
|
101
|
+
*/
|
|
102
|
+
function getCapabilitiesMode(projectPath) {
|
|
103
|
+
try {
|
|
104
|
+
const raw = loadRawProjectConfig(projectPath);
|
|
105
|
+
const governance = raw?.governance;
|
|
106
|
+
const capabilities = governance?.capabilities;
|
|
107
|
+
const mode = capabilities?.mode;
|
|
108
|
+
if (mode === 'file' || mode === 'module' || mode === 'listing')
|
|
109
|
+
return mode;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// 配置缺失或解析失败,按默认 file 处理
|
|
113
|
+
}
|
|
114
|
+
return 'file';
|
|
115
|
+
}
|
|
96
116
|
/**
|
|
97
117
|
* 项目配置加载器
|
|
98
118
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-config-loader.js","sourceRoot":"","sources":["../../src/core/project-config-loader.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"project-config-loader.js","sourceRoot":"","sources":["../../src/core/project-config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,6 +47,18 @@ export interface ContextFilesConfig {
|
|
|
47
47
|
/** 必须包含 CONTEXT.md 的目录列表 */
|
|
48
48
|
required_dirs?: string[];
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* CAPABILITIES.md 登记模式配置
|
|
52
|
+
*/
|
|
53
|
+
export interface CapabilitiesConfig {
|
|
54
|
+
/**
|
|
55
|
+
* 登记模式:
|
|
56
|
+
* - file:逐文件登记(默认,历史行为)
|
|
57
|
+
* - module:模块级目录条目登记,按目录前缀覆盖判定
|
|
58
|
+
* - listing:能力清单格式(计数行)的显式声明
|
|
59
|
+
*/
|
|
60
|
+
mode?: 'file' | 'module' | 'listing';
|
|
61
|
+
}
|
|
50
62
|
/**
|
|
51
63
|
* CHANGELOG 配置
|
|
52
64
|
*/
|
|
@@ -152,6 +164,8 @@ export interface GovernanceConfig {
|
|
|
152
164
|
docs?: DocsSyncConfig;
|
|
153
165
|
/** CONTEXT.md 配置 */
|
|
154
166
|
context_files?: ContextFilesConfig;
|
|
167
|
+
/** CAPABILITIES.md 登记模式配置 */
|
|
168
|
+
capabilities?: CapabilitiesConfig;
|
|
155
169
|
/** CHANGELOG 配置 */
|
|
156
170
|
changelog?: ChangelogConfig;
|
|
157
171
|
/** 文档新鲜度检查配置 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/types/project-config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/types/project-config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -364,6 +364,136 @@ describe('ConstraintChecker - 补充覆盖', () => {
|
|
|
364
364
|
});
|
|
365
365
|
});
|
|
366
366
|
|
|
367
|
+
describe('checkCapabilitySync module 模式(governance.capabilities.mode)', () => {
|
|
368
|
+
/** 建一个带 .harness/config.yml + CAPABILITIES.md + 源文件的临时项目 */
|
|
369
|
+
const setupCapProject = (
|
|
370
|
+
name: string,
|
|
371
|
+
mode: 'file' | 'module' | undefined,
|
|
372
|
+
capContent: string,
|
|
373
|
+
files: string[]
|
|
374
|
+
): string => {
|
|
375
|
+
const dir = path.join(tempDir, name);
|
|
376
|
+
fs.mkdirSync(path.join(dir, '.harness'), { recursive: true });
|
|
377
|
+
const yaml = require('js-yaml');
|
|
378
|
+
const config = mode ? { governance: { capabilities: { mode } } } : {};
|
|
379
|
+
fs.writeFileSync(path.join(dir, '.harness', 'config.yml'), yaml.dump(config));
|
|
380
|
+
fs.writeFileSync(path.join(dir, 'CAPABILITIES.md'), capContent);
|
|
381
|
+
for (const f of files) {
|
|
382
|
+
const fp = path.join(dir, f);
|
|
383
|
+
fs.mkdirSync(path.dirname(fp), { recursive: true });
|
|
384
|
+
fs.writeFileSync(fp, 'export const x = 1;');
|
|
385
|
+
}
|
|
386
|
+
return dir;
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
const runCapCheck = (projectPath: string) =>
|
|
390
|
+
checker.check(
|
|
391
|
+
{
|
|
392
|
+
id: 'capability_sync',
|
|
393
|
+
level: 'guideline',
|
|
394
|
+
rule: 'CAPABILITY SYNC',
|
|
395
|
+
message: 'test',
|
|
396
|
+
trigger: 'commit',
|
|
397
|
+
enforcement: 'test',
|
|
398
|
+
},
|
|
399
|
+
{ operation: 'commit', projectPath }
|
|
400
|
+
);
|
|
401
|
+
|
|
402
|
+
beforeAll(() => {
|
|
403
|
+
// 清理 staged 状态,隔离 step 1(git diff 增量)对本组用例的干扰
|
|
404
|
+
try {
|
|
405
|
+
execSync('git reset HEAD', { cwd: tempDir, stdio: 'pipe' });
|
|
406
|
+
} catch {
|
|
407
|
+
// ignore
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
it('module 模式:目录条目覆盖源文件应该通过', async () => {
|
|
412
|
+
const dir = setupCapProject(
|
|
413
|
+
'capmod-covered',
|
|
414
|
+
'module',
|
|
415
|
+
'# Capabilities\n\n| 模块 | 文件 | 说明 |\n|------|------|------|\n| 核心 | src/core/ | 核心模块 |',
|
|
416
|
+
['src/core/foo.ts', 'src/core/bar.ts']
|
|
417
|
+
);
|
|
418
|
+
|
|
419
|
+
const result = await runCapCheck(dir);
|
|
420
|
+
expect(result.satisfied).toBe(true);
|
|
421
|
+
|
|
422
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
it('module 模式:文件条目精确匹配也算覆盖', async () => {
|
|
426
|
+
const dir = setupCapProject(
|
|
427
|
+
'capmod-file-entry',
|
|
428
|
+
'module',
|
|
429
|
+
'# Capabilities\n\n| 模块 | 文件 | 说明 |\n|------|------|------|\n| foo | src/core/foo.ts | foo |',
|
|
430
|
+
['src/core/foo.ts']
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
const result = await runCapCheck(dir);
|
|
434
|
+
expect(result.satisfied).toBe(true);
|
|
435
|
+
|
|
436
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
it('module 模式:新目录未登记应该失败', async () => {
|
|
440
|
+
const dir = setupCapProject(
|
|
441
|
+
'capmod-uncovered',
|
|
442
|
+
'module',
|
|
443
|
+
'# Capabilities\n\n| 模块 | 文件 | 说明 |\n|------|------|------|\n| 核心 | src/core/ | 核心模块 |',
|
|
444
|
+
['src/core/foo.ts', 'src/newdir/bar.ts']
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
const result = await runCapCheck(dir);
|
|
448
|
+
expect(result.satisfied).toBe(false);
|
|
449
|
+
|
|
450
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
it('file 模式原行为不变:目录条目不参与覆盖判定', async () => {
|
|
454
|
+
// file 模式下 step2 要求逐文件精确匹配,src/core/ 目录条目不能 rescue bar.ts
|
|
455
|
+
const dir = setupCapProject(
|
|
456
|
+
'capfile-dir-no-rescue',
|
|
457
|
+
'file',
|
|
458
|
+
'# Capabilities\n\n| 模块 | 文件 | 说明 |\n|------|------|------|\n| foo | src/core/foo.ts | foo |\n| 目录 | src/core/ | 目录条目 |',
|
|
459
|
+
['src/core/foo.ts', 'src/core/bar.ts']
|
|
460
|
+
);
|
|
461
|
+
|
|
462
|
+
const result = await runCapCheck(dir);
|
|
463
|
+
expect(result.satisfied).toBe(false);
|
|
464
|
+
|
|
465
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
it('step2 全量扫描(file 模式):全部源文件已登记应该通过', async () => {
|
|
469
|
+
const dir = setupCapProject(
|
|
470
|
+
'capfile-step2-ok',
|
|
471
|
+
undefined,
|
|
472
|
+
'# Capabilities\n\n| 模块 | 文件 | 说明 |\n|------|------|------|\n| foo | src/foo.ts | foo |',
|
|
473
|
+
['src/foo.ts']
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
const result = await runCapCheck(dir);
|
|
477
|
+
expect(result.satisfied).toBe(true);
|
|
478
|
+
|
|
479
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
it('step2 全量扫描(file 模式):有未登记源文件应该失败', async () => {
|
|
483
|
+
const dir = setupCapProject(
|
|
484
|
+
'capfile-step2-missing',
|
|
485
|
+
undefined,
|
|
486
|
+
'# Capabilities\n\n| 模块 | 文件 | 说明 |\n|------|------|------|\n| foo | src/foo.ts | foo |',
|
|
487
|
+
['src/foo.ts', 'src/unlisted.ts']
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
const result = await runCapCheck(dir);
|
|
491
|
+
expect(result.satisfied).toBe(false);
|
|
492
|
+
|
|
493
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
|
|
367
497
|
describe('findApplicableConstraints', () => {
|
|
368
498
|
it('应该过滤出匹配 trigger 的约束', () => {
|
|
369
499
|
const context: ConstraintContext = {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { describe, it, expect, beforeAll, afterAll } from '@jest/globals';
|
|
6
|
-
import { ProjectConfigLoader } from '../core/project-config-loader';
|
|
6
|
+
import { ProjectConfigLoader, getCapabilitiesMode } from '../core/project-config-loader';
|
|
7
7
|
import * as fs from 'fs';
|
|
8
8
|
import * as path from 'path';
|
|
9
9
|
|
|
@@ -124,4 +124,43 @@ custom_rules:
|
|
|
124
124
|
expect(merged).toBeDefined();
|
|
125
125
|
});
|
|
126
126
|
});
|
|
127
|
+
|
|
128
|
+
describe('getCapabilitiesMode', () => {
|
|
129
|
+
/** 建一个带独立 .harness/config.yml 的临时项目目录(避免进程级缓存串扰) */
|
|
130
|
+
const setupConfigDir = (name: string, configYaml: string): string => {
|
|
131
|
+
const dir = path.join(tempDir, name);
|
|
132
|
+
fs.mkdirSync(path.join(dir, '.harness'), { recursive: true });
|
|
133
|
+
fs.writeFileSync(path.join(dir, '.harness', 'config.yml'), configYaml);
|
|
134
|
+
return dir;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
it('未配置时缺省返回 file', () => {
|
|
138
|
+
const dir = setupConfigDir('caps-default', `preset: standard`);
|
|
139
|
+
expect(getCapabilitiesMode(dir)).toBe('file');
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('mode: module 应该返回 module', () => {
|
|
143
|
+
const dir = setupConfigDir(
|
|
144
|
+
'caps-module',
|
|
145
|
+
`governance:\n capabilities:\n mode: module`
|
|
146
|
+
);
|
|
147
|
+
expect(getCapabilitiesMode(dir)).toBe('module');
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('mode: listing 应该返回 listing', () => {
|
|
151
|
+
const dir = setupConfigDir(
|
|
152
|
+
'caps-listing',
|
|
153
|
+
`governance:\n capabilities:\n mode: listing`
|
|
154
|
+
);
|
|
155
|
+
expect(getCapabilitiesMode(dir)).toBe('listing');
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('非法取值应该回落 file', () => {
|
|
159
|
+
const dir = setupConfigDir(
|
|
160
|
+
'caps-invalid',
|
|
161
|
+
`governance:\n capabilities:\n mode: bogus`
|
|
162
|
+
);
|
|
163
|
+
expect(getCapabilitiesMode(dir)).toBe('file');
|
|
164
|
+
});
|
|
165
|
+
});
|
|
127
166
|
});
|
|
@@ -436,4 +436,167 @@ describe('sync-docs command', () => {
|
|
|
436
436
|
fs.rmSync(testDir, { recursive: true, force: true });
|
|
437
437
|
});
|
|
438
438
|
});
|
|
439
|
+
|
|
440
|
+
describe('module 模式(governance.capabilities.mode=module)', () => {
|
|
441
|
+
/** 写入 module 模式配置 */
|
|
442
|
+
const writeModuleConfig = (testDir: string) => {
|
|
443
|
+
const yaml = require('js-yaml');
|
|
444
|
+
fs.mkdirSync(path.join(testDir, '.harness'), { recursive: true });
|
|
445
|
+
fs.writeFileSync(
|
|
446
|
+
path.join(testDir, '.harness', 'config.yml'),
|
|
447
|
+
yaml.dump({ governance: { capabilities: { mode: 'module' } } })
|
|
448
|
+
);
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
it('写入模式不自动加文件行', async () => {
|
|
452
|
+
const testDir = path.join(tempDir, 'module-no-autorow');
|
|
453
|
+
writeModuleConfig(testDir);
|
|
454
|
+
fs.mkdirSync(path.join(testDir, 'src', 'core'), { recursive: true });
|
|
455
|
+
fs.mkdirSync(path.join(testDir, 'src', 'newdir'), { recursive: true });
|
|
456
|
+
fs.writeFileSync(path.join(testDir, 'src', 'core', 'a.ts'), 'export const a = 1;');
|
|
457
|
+
fs.writeFileSync(path.join(testDir, 'src', 'newdir', 'b.ts'), 'export const b = 1;');
|
|
458
|
+
|
|
459
|
+
fs.writeFileSync(
|
|
460
|
+
path.join(testDir, 'CAPABILITIES.md'),
|
|
461
|
+
'# Capabilities\n\n| 模块 | 文件 | 说明 |\n|------|------|------|\n| 核心 | src/core/ | 核心模块 |'
|
|
462
|
+
);
|
|
463
|
+
|
|
464
|
+
const result = await syncDocs({ projectPath: testDir });
|
|
465
|
+
// 有未覆盖目录,仍报不同步
|
|
466
|
+
expect(result).toBe(false);
|
|
467
|
+
// 但不自动给 b.ts 加表格行
|
|
468
|
+
const content = fs.readFileSync(path.join(testDir, 'CAPABILITIES.md'), 'utf-8');
|
|
469
|
+
expect(content).not.toContain('b.ts');
|
|
470
|
+
expect(content).toContain('src/core/');
|
|
471
|
+
|
|
472
|
+
fs.rmSync(testDir, { recursive: true, force: true });
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it('--check 模式 added 聚合为未覆盖目录', async () => {
|
|
476
|
+
const testDir = path.join(tempDir, 'module-check-dirs');
|
|
477
|
+
writeModuleConfig(testDir);
|
|
478
|
+
fs.mkdirSync(path.join(testDir, 'src', 'core'), { recursive: true });
|
|
479
|
+
fs.mkdirSync(path.join(testDir, 'src', 'newdir'), { recursive: true });
|
|
480
|
+
fs.writeFileSync(path.join(testDir, 'src', 'core', 'a.ts'), 'export const a = 1;');
|
|
481
|
+
fs.writeFileSync(path.join(testDir, 'src', 'newdir', 'b.ts'), 'export const b = 1;');
|
|
482
|
+
|
|
483
|
+
fs.writeFileSync(
|
|
484
|
+
path.join(testDir, 'CAPABILITIES.md'),
|
|
485
|
+
'# Capabilities\n\n| 模块 | 文件 | 说明 |\n|------|------|------|\n| 核心 | src/core/ | 核心模块 |'
|
|
486
|
+
);
|
|
487
|
+
|
|
488
|
+
const result = await syncDocs({ projectPath: testDir, check: true });
|
|
489
|
+
expect(result).toBe(false);
|
|
490
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('未登记以下模块(目录)'));
|
|
491
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('src/newdir/'));
|
|
492
|
+
|
|
493
|
+
fs.rmSync(testDir, { recursive: true, force: true });
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
it('--json 模式 added 输出聚合目录', async () => {
|
|
497
|
+
const testDir = path.join(tempDir, 'module-json-dirs');
|
|
498
|
+
writeModuleConfig(testDir);
|
|
499
|
+
fs.mkdirSync(path.join(testDir, 'src', 'core'), { recursive: true });
|
|
500
|
+
fs.mkdirSync(path.join(testDir, 'src', 'newdir'), { recursive: true });
|
|
501
|
+
fs.writeFileSync(path.join(testDir, 'src', 'core', 'a.ts'), 'export const a = 1;');
|
|
502
|
+
fs.writeFileSync(path.join(testDir, 'src', 'newdir', 'b.ts'), 'export const b = 1;');
|
|
503
|
+
|
|
504
|
+
fs.writeFileSync(
|
|
505
|
+
path.join(testDir, 'CAPABILITIES.md'),
|
|
506
|
+
'# Capabilities\n\n| 模块 | 文件 | 说明 |\n|------|------|------|\n| 核心 | src/core/ | 核心模块 |'
|
|
507
|
+
);
|
|
508
|
+
|
|
509
|
+
const result = await syncDocs({ projectPath: testDir, check: true, json: true });
|
|
510
|
+
expect(result).toBe(false);
|
|
511
|
+
|
|
512
|
+
const jsonCall = consoleSpy.mock.calls.find(
|
|
513
|
+
(call: unknown[]) => typeof call[0] === 'string' && call[0].startsWith('{')
|
|
514
|
+
);
|
|
515
|
+
expect(jsonCall).toBeDefined();
|
|
516
|
+
const parsed = JSON.parse(jsonCall![0]);
|
|
517
|
+
expect(parsed.added).toEqual([{ dir: 'src/newdir/' }]);
|
|
518
|
+
expect(parsed.resolution.some((r: any) => r.action === 'register-capability-dirs')).toBe(true);
|
|
519
|
+
|
|
520
|
+
fs.rmSync(testDir, { recursive: true, force: true });
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
it('幽灵行仍剔除', async () => {
|
|
524
|
+
const testDir = path.join(tempDir, 'module-ghost');
|
|
525
|
+
writeModuleConfig(testDir);
|
|
526
|
+
fs.mkdirSync(path.join(testDir, 'src', 'a'), { recursive: true });
|
|
527
|
+
fs.writeFileSync(path.join(testDir, 'src', 'a', 'kept.ts'), 'export const kept = 1;');
|
|
528
|
+
|
|
529
|
+
fs.writeFileSync(
|
|
530
|
+
path.join(testDir, 'CAPABILITIES.md'),
|
|
531
|
+
[
|
|
532
|
+
'# CAPABILITIES.md', '',
|
|
533
|
+
'> 最后更新: 2026-01-01', '',
|
|
534
|
+
'| 模块 | 文件 | 说明 |', '|------|------|------|',
|
|
535
|
+
'| kept | src/a/kept.ts | 真实文件 |',
|
|
536
|
+
'| ghost | src/a/ghost.ts | 幽灵条目 |',
|
|
537
|
+
'',
|
|
538
|
+
].join('\n')
|
|
539
|
+
);
|
|
540
|
+
|
|
541
|
+
await syncDocs({ projectPath: testDir });
|
|
542
|
+
const content = fs.readFileSync(path.join(testDir, 'CAPABILITIES.md'), 'utf-8');
|
|
543
|
+
expect(content).toContain('src/a/kept.ts');
|
|
544
|
+
expect(content).not.toContain('ghost.ts');
|
|
545
|
+
|
|
546
|
+
fs.rmSync(testDir, { recursive: true, force: true });
|
|
547
|
+
});
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
describe('--compact 迁移', () => {
|
|
551
|
+
it('同目录 ≥2 个文件条目折叠为目录条目,且幂等', async () => {
|
|
552
|
+
const testDir = path.join(tempDir, 'compact-basic');
|
|
553
|
+
fs.mkdirSync(testDir, { recursive: true });
|
|
554
|
+
|
|
555
|
+
fs.writeFileSync(
|
|
556
|
+
path.join(testDir, 'CAPABILITIES.md'),
|
|
557
|
+
[
|
|
558
|
+
'# CAPABILITIES.md', '',
|
|
559
|
+
'> 最后更新: 2026-01-01', '',
|
|
560
|
+
'<!-- PRESERVE:说明 -->',
|
|
561
|
+
'手工说明',
|
|
562
|
+
'<!-- /PRESERVE:说明 -->', '',
|
|
563
|
+
'| 模块 | 文件 | 说明 |', '|------|------|------|',
|
|
564
|
+
'| foo | src/core/foo.ts | Foo 模块 |',
|
|
565
|
+
'| bar | src/core/bar.ts | Bar 模块 |',
|
|
566
|
+
'| solo | src/utils/solo.ts | 单独文件 |',
|
|
567
|
+
'',
|
|
568
|
+
].join('\n')
|
|
569
|
+
);
|
|
570
|
+
|
|
571
|
+
const result = await syncDocs({ projectPath: testDir, compact: true });
|
|
572
|
+
expect(result).toBe(true);
|
|
573
|
+
|
|
574
|
+
const content = fs.readFileSync(path.join(testDir, 'CAPABILITIES.md'), 'utf-8');
|
|
575
|
+
// 折叠为目录条目(说明取组内第一行)
|
|
576
|
+
expect(content).toContain('| core | src/core/ | Foo 模块 |');
|
|
577
|
+
expect(content).not.toContain('src/core/bar.ts');
|
|
578
|
+
// 单独成组的文件行保留
|
|
579
|
+
expect(content).toContain('src/utils/solo.ts');
|
|
580
|
+
// 非表格内容原样保留
|
|
581
|
+
expect(content).toContain('<!-- PRESERVE:说明 -->');
|
|
582
|
+
expect(content).toContain('手工说明');
|
|
583
|
+
|
|
584
|
+
// 幂等:再跑一遍内容不变
|
|
585
|
+
await syncDocs({ projectPath: testDir, compact: true });
|
|
586
|
+
const content2 = fs.readFileSync(path.join(testDir, 'CAPABILITIES.md'), 'utf-8');
|
|
587
|
+
expect(content2).toBe(content);
|
|
588
|
+
|
|
589
|
+
fs.rmSync(testDir, { recursive: true, force: true });
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
it('CAPABILITIES.md 不存在时返回 false', async () => {
|
|
593
|
+
const testDir = path.join(tempDir, 'compact-missing');
|
|
594
|
+
fs.mkdirSync(testDir, { recursive: true });
|
|
595
|
+
|
|
596
|
+
const result = await syncDocs({ projectPath: testDir, compact: true });
|
|
597
|
+
expect(result).toBe(false);
|
|
598
|
+
|
|
599
|
+
fs.rmSync(testDir, { recursive: true, force: true });
|
|
600
|
+
});
|
|
601
|
+
});
|
|
439
602
|
});
|