@dommaker/harness 0.16.4 → 0.16.5
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
CHANGED
|
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
6
6
|
|
|
7
|
+
## [0.16.5] - 2026-07-27
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- **init 不再覆盖已有运行时配置**:重跑 `harness init` 时,`.harness/checkpoints.yml` 与 `.harness/resolutions.json` 已存在则跳过(打印灰色提示),不再被静默重置为内置默认——与 custom-constraints.yml 的既有存在检查行为对齐。两个文件均不入 git,此前被覆盖无版本兜底
|
|
11
|
+
|
|
7
12
|
## [0.16.4] - 2026-07-24
|
|
8
13
|
|
|
9
14
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,wBAAwB,CAAC;AAG5E,MAAM,WAAW,eAAe;IAC9B,cAAc;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAqBD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DtE;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAAU,EAwC3C,CAAC;AAEF;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,wBAAwB,CAAC;AAG5E,MAAM,WAAW,eAAe;IAC9B,cAAc;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAqBD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DtE;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAAU,EAwC3C,CAAC;AAEF;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuChF;AAwBD;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBjF"}
|
|
@@ -173,6 +173,15 @@ exports.DEFAULT_CHECKPOINTS = [
|
|
|
173
173
|
async function createExampleCheckpoint(projectPath) {
|
|
174
174
|
const filePath = path.join(projectPath, DEFAULT_CHECKPOINT_FILE);
|
|
175
175
|
const dir = path.dirname(filePath);
|
|
176
|
+
// 如果已存在,不覆盖
|
|
177
|
+
try {
|
|
178
|
+
await fs.access(filePath);
|
|
179
|
+
console.log(chalk_1.default.gray(`checkpoints.yml 已存在,跳过`));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// 文件不存在,创建
|
|
184
|
+
}
|
|
176
185
|
await fs.mkdir(dir, { recursive: true });
|
|
177
186
|
// 动态替换 no-console 检查点的源目录
|
|
178
187
|
const roots = (0, detect_source_roots_1.detectSourceRoots)(projectPath);
|
|
@@ -224,6 +233,15 @@ const DEFAULT_RESOLUTIONS = {
|
|
|
224
233
|
async function createExampleResolutions(projectPath) {
|
|
225
234
|
const harnessDir = path.join(projectPath, '.harness');
|
|
226
235
|
const filePath = path.join(harnessDir, 'resolutions.json');
|
|
236
|
+
// 如果已存在,不覆盖
|
|
237
|
+
try {
|
|
238
|
+
await fs.access(filePath);
|
|
239
|
+
console.log(chalk_1.default.gray(`resolutions.json 已存在,跳过`));
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// 文件不存在,创建
|
|
244
|
+
}
|
|
227
245
|
await fs.mkdir(harnessDir, { recursive: true });
|
|
228
246
|
const content = JSON.stringify(DEFAULT_RESOLUTIONS, null, 2);
|
|
229
247
|
await fs.writeFile(filePath, content, 'utf-8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCH,4BA2DC;AAkDD,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
* validate 命令测试
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { validate, createExampleCheckpoint } from '../validate';
|
|
5
|
+
import { validate, createExampleCheckpoint, createExampleResolutions } from '../validate';
|
|
6
6
|
import * as fs from 'fs/promises';
|
|
7
7
|
import { CheckpointValidator } from '../../../core/validators/checkpoint';
|
|
8
8
|
import * as yaml from 'js-yaml';
|
|
9
9
|
|
|
10
10
|
// Mock fs/promises
|
|
11
11
|
jest.mock('fs/promises', () => ({
|
|
12
|
+
access: jest.fn(),
|
|
12
13
|
readFile: jest.fn(),
|
|
13
14
|
writeFile: jest.fn(),
|
|
14
15
|
mkdir: jest.fn(),
|
|
@@ -125,6 +126,7 @@ describe('validate command', () => {
|
|
|
125
126
|
|
|
126
127
|
describe('createExampleCheckpoint', () => {
|
|
127
128
|
it('应该创建示例检查点文件', async () => {
|
|
129
|
+
mockFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
128
130
|
mockFs.mkdir.mockResolvedValue(undefined);
|
|
129
131
|
mockFs.writeFile.mockResolvedValue(undefined);
|
|
130
132
|
mockYaml.dump.mockReturnValue('yaml content');
|
|
@@ -135,5 +137,37 @@ describe('validate command', () => {
|
|
|
135
137
|
expect(mockFs.writeFile).toHaveBeenCalled();
|
|
136
138
|
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('已创建示例检查点'));
|
|
137
139
|
});
|
|
140
|
+
|
|
141
|
+
it('已存在时不覆盖', async () => {
|
|
142
|
+
mockFs.access.mockResolvedValue(undefined);
|
|
143
|
+
|
|
144
|
+
await createExampleCheckpoint('/project');
|
|
145
|
+
|
|
146
|
+
expect(mockFs.writeFile).not.toHaveBeenCalled();
|
|
147
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('checkpoints.yml 已存在,跳过'));
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
describe('createExampleResolutions', () => {
|
|
152
|
+
it('应该创建 Resolutions 文件', async () => {
|
|
153
|
+
mockFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
154
|
+
mockFs.mkdir.mockResolvedValue(undefined);
|
|
155
|
+
mockFs.writeFile.mockResolvedValue(undefined);
|
|
156
|
+
|
|
157
|
+
await createExampleResolutions('/project');
|
|
158
|
+
|
|
159
|
+
expect(mockFs.mkdir).toHaveBeenCalled();
|
|
160
|
+
expect(mockFs.writeFile).toHaveBeenCalled();
|
|
161
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('已创建 Resolutions 文件'));
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('已存在时不覆盖', async () => {
|
|
165
|
+
mockFs.access.mockResolvedValue(undefined);
|
|
166
|
+
|
|
167
|
+
await createExampleResolutions('/project');
|
|
168
|
+
|
|
169
|
+
expect(mockFs.writeFile).not.toHaveBeenCalled();
|
|
170
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('resolutions.json 已存在,跳过'));
|
|
171
|
+
});
|
|
138
172
|
});
|
|
139
173
|
});
|
|
@@ -156,6 +156,15 @@ export async function createExampleCheckpoint(projectPath: string): Promise<void
|
|
|
156
156
|
const filePath = path.join(projectPath, DEFAULT_CHECKPOINT_FILE);
|
|
157
157
|
const dir = path.dirname(filePath);
|
|
158
158
|
|
|
159
|
+
// 如果已存在,不覆盖
|
|
160
|
+
try {
|
|
161
|
+
await fs.access(filePath);
|
|
162
|
+
console.log(chalk.gray(`checkpoints.yml 已存在,跳过`));
|
|
163
|
+
return;
|
|
164
|
+
} catch {
|
|
165
|
+
// 文件不存在,创建
|
|
166
|
+
}
|
|
167
|
+
|
|
159
168
|
await fs.mkdir(dir, { recursive: true });
|
|
160
169
|
|
|
161
170
|
// 动态替换 no-console 检查点的源目录
|
|
@@ -213,6 +222,15 @@ export async function createExampleResolutions(projectPath: string): Promise<voi
|
|
|
213
222
|
const harnessDir = path.join(projectPath, '.harness');
|
|
214
223
|
const filePath = path.join(harnessDir, 'resolutions.json');
|
|
215
224
|
|
|
225
|
+
// 如果已存在,不覆盖
|
|
226
|
+
try {
|
|
227
|
+
await fs.access(filePath);
|
|
228
|
+
console.log(chalk.gray(`resolutions.json 已存在,跳过`));
|
|
229
|
+
return;
|
|
230
|
+
} catch {
|
|
231
|
+
// 文件不存在,创建
|
|
232
|
+
}
|
|
233
|
+
|
|
216
234
|
await fs.mkdir(harnessDir, { recursive: true });
|
|
217
235
|
|
|
218
236
|
const content = JSON.stringify(DEFAULT_RESOLUTIONS, null, 2);
|