harness-engineering-agent 0.2.3 → 0.3.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.
@@ -1,7 +1,8 @@
1
1
  import type { HarnessConfig, HarnessConfigInput } from "./config-schema.js";
2
2
  import type { MergedHarnessConfig } from "./config-types.js";
3
- export declare const mergeHarnessConfig: ({ defaults, projectConfig, runOverride, }: {
3
+ export declare const mergeHarnessConfig: ({ defaults, globalConfig, projectConfig, runOverride, }: {
4
4
  readonly defaults: HarnessConfig;
5
+ readonly globalConfig: HarnessConfigInput | undefined;
5
6
  readonly projectConfig: HarnessConfigInput | undefined;
6
7
  readonly runOverride: HarnessConfigInput | undefined;
7
8
  }) => MergedHarnessConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config-merge.d.ts","sourceRoot":"","sources":["../../src/config/config-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,aAAa,EACb,kBAAkB,EAEnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAwB,MAAM,mBAAmB,CAAA;AAElF,eAAO,MAAM,kBAAkB,GAAI,2CAIhC;IACD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,GAAG,SAAS,CAAA;IACtD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,GAAG,SAAS,CAAA;CACrD,KAAG,mBA4DH,CAAA"}
1
+ {"version":3,"file":"config-merge.d.ts","sourceRoot":"","sources":["../../src/config/config-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,aAAa,EACb,kBAAkB,EAEnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAwB,MAAM,mBAAmB,CAAA;AAElF,eAAO,MAAM,kBAAkB,GAAI,yDAKhC;IACD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;IAChC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,GAAG,SAAS,CAAA;IACrD,QAAQ,CAAC,aAAa,EAAE,kBAAkB,GAAG,SAAS,CAAA;IACtD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,GAAG,SAAS,CAAA;CACrD,KAAG,mBA+EH,CAAA"}
@@ -1,86 +1,113 @@
1
- export const mergeHarnessConfig = ({ defaults, projectConfig, runOverride, }) => {
1
+ export const mergeHarnessConfig = ({ defaults, globalConfig, projectConfig, runOverride, }) => {
2
+ const globalValue = globalConfig ?? {};
2
3
  const projectValue = projectConfig ?? {};
3
4
  const overrideValue = runOverride ?? {};
4
5
  return {
5
- schemaVersion: projectValue.schemaVersion ?? defaults.schemaVersion,
6
- enabled: overrideValue.enabled ?? projectValue.enabled ?? defaults.enabled,
6
+ schemaVersion: projectValue.schemaVersion ?? globalValue.schemaVersion ?? defaults.schemaVersion,
7
+ enabled: overrideValue.enabled ?? projectValue.enabled ?? globalValue.enabled ?? defaults.enabled,
7
8
  harness: mergeHarnessProfile({
8
9
  defaults: defaults.harness,
10
+ globalProfile: globalValue.harness,
9
11
  projectProfile: projectValue.harness,
10
12
  runOverride: overrideValue.harness,
11
13
  }),
12
14
  planner: mergeHarnessProfile({
13
15
  defaults: defaults.planner,
16
+ globalProfile: globalValue.planner,
14
17
  projectProfile: projectValue.planner,
15
18
  runOverride: overrideValue.planner,
16
19
  }),
17
20
  worker: mergeHarnessProfile({
18
21
  defaults: defaults.worker,
22
+ globalProfile: globalValue.worker,
19
23
  projectProfile: projectValue.worker,
20
24
  runOverride: overrideValue.worker,
21
25
  }),
22
26
  verifier: mergeHarnessProfile({
23
27
  defaults: defaults.verifier,
28
+ globalProfile: globalValue.verifier,
24
29
  projectProfile: projectValue.verifier,
25
30
  runOverride: overrideValue.verifier,
26
31
  }),
27
32
  acceptance: mergeHarnessProfile({
28
33
  defaults: defaults.acceptance,
34
+ globalProfile: globalValue.acceptance ?? globalValue.verifier,
29
35
  projectProfile: projectValue.acceptance ?? projectValue.verifier,
30
36
  runOverride: overrideValue.acceptance,
31
37
  }),
32
38
  failureAnalyzer: mergeHarnessProfile({
33
39
  defaults: defaults.failureAnalyzer,
40
+ globalProfile: globalValue.failureAnalyzer ?? globalValue.planner,
34
41
  projectProfile: projectValue.failureAnalyzer ?? projectValue.planner,
35
42
  runOverride: overrideValue.failureAnalyzer,
36
43
  }),
37
44
  executionCategories: mergeExecutionCategoryProfiles({
38
45
  defaults: defaults.executionCategories,
46
+ globalProfiles: globalValue.executionCategories,
39
47
  projectProfiles: projectValue.executionCategories,
40
48
  runOverride: overrideValue.executionCategories,
41
49
  }),
42
50
  complexityTiers: mergeComplexityTierProfiles({
43
51
  defaults: defaults.complexityTiers,
52
+ globalProfiles: globalValue.complexityTiers,
44
53
  projectProfiles: projectValue.complexityTiers,
45
54
  runOverride: overrideValue.complexityTiers,
46
55
  }),
47
56
  verificationCommands: overrideValue.verificationCommands ??
48
57
  projectValue.verificationCommands ??
58
+ globalValue.verificationCommands ??
49
59
  defaults.verificationCommands,
50
- maxRunAttempts: overrideValue.maxRunAttempts ?? projectValue.maxRunAttempts ?? defaults.maxRunAttempts,
51
- stateDirectory: overrideValue.stateDirectory ?? projectValue.stateDirectory ?? defaults.stateDirectory,
60
+ maxRunAttempts: overrideValue.maxRunAttempts ??
61
+ projectValue.maxRunAttempts ??
62
+ globalValue.maxRunAttempts ??
63
+ defaults.maxRunAttempts,
64
+ stateDirectory: overrideValue.stateDirectory ??
65
+ projectValue.stateDirectory ??
66
+ globalValue.stateDirectory ??
67
+ defaults.stateDirectory,
52
68
  allowNonGitWorkspace: overrideValue.allowNonGitWorkspace ??
53
69
  projectValue.allowNonGitWorkspace ??
70
+ globalValue.allowNonGitWorkspace ??
54
71
  defaults.allowNonGitWorkspace,
55
72
  };
56
73
  };
57
- const mergeHarnessProfile = ({ defaults, projectProfile, runOverride, }) => {
74
+ const mergeHarnessProfile = ({ defaults, globalProfile, projectProfile, runOverride, }) => {
58
75
  return {
59
- provider: runOverride?.provider ?? projectProfile?.provider ?? defaults.provider,
60
- model: runOverride?.model ?? projectProfile?.model ?? defaults.model,
61
- ...((runOverride?.skill ?? projectProfile?.skill ?? defaults.skill) === undefined
76
+ provider: runOverride?.provider ??
77
+ projectProfile?.provider ??
78
+ globalProfile?.provider ??
79
+ defaults.provider,
80
+ model: runOverride?.model ?? projectProfile?.model ?? globalProfile?.model ?? defaults.model,
81
+ ...((runOverride?.skill ?? projectProfile?.skill ?? globalProfile?.skill ?? defaults.skill) ===
82
+ undefined
62
83
  ? {}
63
- : { skill: runOverride?.skill ?? projectProfile?.skill ?? defaults.skill }),
84
+ : {
85
+ skill: runOverride?.skill ?? projectProfile?.skill ?? globalProfile?.skill ?? defaults.skill,
86
+ }),
64
87
  };
65
88
  };
66
89
  const mergeExecutionCategoryProfiles = (input) => ({
67
90
  quick: mergeHarnessProfile({
68
91
  defaults: input.defaults.quick,
92
+ globalProfile: input.globalProfiles?.quick,
69
93
  projectProfile: input.projectProfiles?.quick,
70
94
  runOverride: input.runOverride?.quick,
71
95
  }),
72
96
  deep: mergeHarnessProfile({
73
97
  defaults: input.defaults.deep,
98
+ globalProfile: input.globalProfiles?.deep,
74
99
  projectProfile: input.projectProfiles?.deep,
75
100
  runOverride: input.runOverride?.deep,
76
101
  }),
77
102
  "visual-engineering": mergeHarnessProfile({
78
103
  defaults: input.defaults["visual-engineering"],
104
+ globalProfile: input.globalProfiles?.["visual-engineering"],
79
105
  projectProfile: input.projectProfiles?.["visual-engineering"],
80
106
  runOverride: input.runOverride?.["visual-engineering"],
81
107
  }),
82
108
  ultrabrain: mergeHarnessProfile({
83
109
  defaults: input.defaults.ultrabrain,
110
+ globalProfile: input.globalProfiles?.ultrabrain,
84
111
  projectProfile: input.projectProfiles?.ultrabrain,
85
112
  runOverride: input.runOverride?.ultrabrain,
86
113
  }),
@@ -88,16 +115,19 @@ const mergeExecutionCategoryProfiles = (input) => ({
88
115
  const mergeComplexityTierProfiles = (input) => ({
89
116
  trivial: mergeHarnessProfile({
90
117
  defaults: input.defaults.trivial,
118
+ globalProfile: input.globalProfiles?.trivial,
91
119
  projectProfile: input.projectProfiles?.trivial,
92
120
  runOverride: input.runOverride?.trivial,
93
121
  }),
94
122
  standard: mergeHarnessProfile({
95
123
  defaults: input.defaults.standard,
124
+ globalProfile: input.globalProfiles?.standard,
96
125
  projectProfile: input.projectProfiles?.standard,
97
126
  runOverride: input.runOverride?.standard,
98
127
  }),
99
128
  complex: mergeHarnessProfile({
100
129
  defaults: input.defaults.complex,
130
+ globalProfile: input.globalProfiles?.complex,
101
131
  projectProfile: input.projectProfiles?.complex,
102
132
  runOverride: input.runOverride?.complex,
103
133
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"config-merge.js","sourceRoot":"","sources":["../../src/config/config-merge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-merge.js","sourceRoot":"","sources":["../../src/config/config-merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const ensureGlobalHarnessConfig: () => Promise<string>;
2
+ //# sourceMappingURL=global-config-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config-init.d.ts","sourceRoot":"","sources":["../../src/config/global-config-init.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,yBAAyB,QAAa,OAAO,CAAC,MAAM,CA0BhE,CAAA"}
@@ -0,0 +1,85 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { stringify as stringifyYaml } from "yaml";
4
+ import { HARNESS_CONFIG_DEFAULTS } from "./config-defaults.js";
5
+ import { resolveGlobalHarnessConfigPath } from "./global-config-path.js";
6
+ export const ensureGlobalHarnessConfig = async () => {
7
+ const configPath = resolveGlobalHarnessConfigPath();
8
+ try {
9
+ const { access } = await import("node:fs/promises");
10
+ await access(configPath);
11
+ return configPath;
12
+ }
13
+ catch {
14
+ // 文件不存在,需要创建
15
+ }
16
+ try {
17
+ const configDir = dirname(configPath);
18
+ await mkdir(configDir, { recursive: true });
19
+ const defaultYaml = serializeDefaultConfig(HARNESS_CONFIG_DEFAULTS);
20
+ await writeFile(configPath, defaultYaml, "utf8");
21
+ }
22
+ catch (error) {
23
+ // 初始化失败不阻塞启动,仅记录警告
24
+ console.warn(`[harness] Failed to initialize global config at ${configPath}:`, error instanceof Error ? error.message : error);
25
+ }
26
+ return configPath;
27
+ };
28
+ const serializeDefaultConfig = (defaults) => {
29
+ const header = `# Harness Engineering Agent - 全局配置
30
+ # 此文件由系统自动生成,用于管理所有项目的 harness 默认配置。
31
+ #
32
+ # 配置优先级(从低到高):
33
+ # 1. 此文件(全局默认)
34
+ # 2. .harness/config.yaml(项目级配置)
35
+ # 3. runOverride(运行时覆盖)
36
+ #
37
+ # 修改此文件后,重启 opencode 生效。
38
+
39
+ `;
40
+ const configObject = {
41
+ schemaVersion: defaults.schemaVersion,
42
+ enabled: defaults.enabled,
43
+ harness: {
44
+ provider: defaults.harness.provider,
45
+ model: defaults.harness.model,
46
+ },
47
+ planner: {
48
+ provider: defaults.planner.provider,
49
+ model: defaults.planner.model,
50
+ },
51
+ worker: {
52
+ provider: defaults.worker.provider,
53
+ model: defaults.worker.model,
54
+ },
55
+ verifier: {
56
+ provider: defaults.verifier.provider,
57
+ model: defaults.verifier.model,
58
+ },
59
+ acceptance: {
60
+ provider: defaults.acceptance.provider,
61
+ model: defaults.acceptance.model,
62
+ },
63
+ failureAnalyzer: {
64
+ provider: defaults.failureAnalyzer.provider,
65
+ model: defaults.failureAnalyzer.model,
66
+ },
67
+ executionCategories: {
68
+ quick: defaults.executionCategories.quick,
69
+ deep: defaults.executionCategories.deep,
70
+ "visual-engineering": defaults.executionCategories["visual-engineering"],
71
+ ultrabrain: defaults.executionCategories.ultrabrain,
72
+ },
73
+ complexityTiers: {
74
+ trivial: defaults.complexityTiers.trivial,
75
+ standard: defaults.complexityTiers.standard,
76
+ complex: defaults.complexityTiers.complex,
77
+ },
78
+ verificationCommands: defaults.verificationCommands,
79
+ maxRunAttempts: defaults.maxRunAttempts,
80
+ stateDirectory: defaults.stateDirectory,
81
+ allowNonGitWorkspace: defaults.allowNonGitWorkspace,
82
+ };
83
+ return header + stringifyYaml(configObject, { indent: 2 });
84
+ };
85
+ //# sourceMappingURL=global-config-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config-init.js","sourceRoot":"","sources":["../../src/config/global-config-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const GLOBAL_HARNESS_CONFIG_FILENAME = "harness-config.yaml";
2
+ export declare const resolveGlobalHarnessConfigPath: () => string;
3
+ //# sourceMappingURL=global-config-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config-path.d.ts","sourceRoot":"","sources":["../../src/config/global-config-path.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,8BAA8B,wBAAwB,CAAA;AAEnE,eAAO,MAAM,8BAA8B,QAAO,MAKjD,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ export const GLOBAL_HARNESS_CONFIG_FILENAME = "harness-config.yaml";
4
+ export const resolveGlobalHarnessConfigPath = () => {
5
+ // biome-ignore lint/complexity/useLiteralKeys: TypeScript requires index signature for process.env
6
+ const xdgConfigHome = process.env["XDG_CONFIG_HOME"];
7
+ const configBase = xdgConfigHome ? xdgConfigHome : join(homedir(), ".config");
8
+ return join(configBase, "opencode", GLOBAL_HARNESS_CONFIG_FILENAME);
9
+ };
10
+ //# sourceMappingURL=global-config-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config-path.js","sourceRoot":"","sources":["../../src/config/global-config-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,CAAC,MAAM,8BAA8B,GAAG,qBAAqB,CAAA;AAEnE,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAW,EAAE;IACzD,mGAAmG;IACnG,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IACpD,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;IAC7E,OAAO,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,8BAA8B,CAAC,CAAA;AACrE,CAAC,CAAA"}
@@ -2,6 +2,8 @@ export { HARNESS_CONFIG_DEFAULTS } from "./config-defaults.js";
2
2
  export { ConfigLoadError } from "./config-errors.js";
3
3
  export type { ComplexityTierProfile, ComplexityTierProfiles, ExecutionCategoryProfiles, HarnessAgentProfile, HarnessConfig, HarnessConfigInput, HarnessProfileInput, } from "./config-schema.js";
4
4
  export type { AvailableModelRegistry } from "./config-types.js";
5
+ export { ensureGlobalHarnessConfig } from "./global-config-init.js";
6
+ export { GLOBAL_HARNESS_CONFIG_FILENAME, resolveGlobalHarnessConfigPath, } from "./global-config-path.js";
5
7
  export { type LoadHarnessConfigOptions, loadHarnessConfig, } from "./load-harness-config.js";
6
8
  export { assessHarnessVersionCompatibility, HARNESS_COMPATIBILITY, type HarnessCompatibilityAssessment, type VersionCompatibilityIssue, type VersionCompatibilityStatus, } from "./opencode-compatibility.js";
7
9
  //# sourceMappingURL=harness-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"harness-config.d.ts","sourceRoot":"","sources":["../../src/config/harness-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EACL,KAAK,wBAAwB,EAC7B,iBAAiB,GAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,iCAAiC,EACjC,qBAAqB,EACrB,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,6BAA6B,CAAA"}
1
+ {"version":3,"file":"harness-config.d.ts","sourceRoot":"","sources":["../../src/config/harness-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,KAAK,wBAAwB,EAC7B,iBAAiB,GAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,iCAAiC,EACjC,qBAAqB,EACrB,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,6BAA6B,CAAA"}
@@ -1,5 +1,7 @@
1
1
  export { HARNESS_CONFIG_DEFAULTS } from "./config-defaults.js";
2
2
  export { ConfigLoadError } from "./config-errors.js";
3
+ export { ensureGlobalHarnessConfig } from "./global-config-init.js";
4
+ export { GLOBAL_HARNESS_CONFIG_FILENAME, resolveGlobalHarnessConfigPath, } from "./global-config-path.js";
3
5
  export { loadHarnessConfig, } from "./load-harness-config.js";
4
6
  export { assessHarnessVersionCompatibility, HARNESS_COMPATIBILITY, } from "./opencode-compatibility.js";
5
7
  //# sourceMappingURL=harness-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"harness-config.js","sourceRoot":"","sources":["../../src/config/harness-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAWpD,OAAO,EAEL,iBAAiB,GAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,iCAAiC,EACjC,qBAAqB,GAItB,MAAM,6BAA6B,CAAA"}
1
+ {"version":3,"file":"harness-config.js","sourceRoot":"","sources":["../../src/config/harness-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAWpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAEL,iBAAiB,GAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,iCAAiC,EACjC,qBAAqB,GAItB,MAAM,6BAA6B,CAAA"}
@@ -1,2 +1,2 @@
1
- export { type AvailableModelRegistry, type ComplexityTierProfile, type ComplexityTierProfiles, ConfigLoadError, type ExecutionCategoryProfiles, HARNESS_CONFIG_DEFAULTS, type HarnessAgentProfile, type HarnessConfig, type HarnessConfigInput, type HarnessProfileInput, type LoadHarnessConfigOptions, loadHarnessConfig, } from "./harness-config.js";
1
+ export { type AvailableModelRegistry, type ComplexityTierProfile, type ComplexityTierProfiles, ConfigLoadError, type ExecutionCategoryProfiles, ensureGlobalHarnessConfig, GLOBAL_HARNESS_CONFIG_FILENAME, HARNESS_CONFIG_DEFAULTS, type HarnessAgentProfile, type HarnessConfig, type HarnessConfigInput, type HarnessProfileInput, type LoadHarnessConfigOptions, loadHarnessConfig, resolveGlobalHarnessConfigPath, } from "./harness-config.js";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,eAAe,EACf,KAAK,yBAAyB,EAC9B,uBAAuB,EACvB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,iBAAiB,GAClB,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,eAAe,EACf,KAAK,yBAAyB,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,uBAAuB,EACvB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,iBAAiB,EACjB,8BAA8B,GAC/B,MAAM,qBAAqB,CAAA"}
@@ -1,2 +1,2 @@
1
- export { ConfigLoadError, HARNESS_CONFIG_DEFAULTS, loadHarnessConfig, } from "./harness-config.js";
1
+ export { ConfigLoadError, ensureGlobalHarnessConfig, GLOBAL_HARNESS_CONFIG_FILENAME, HARNESS_CONFIG_DEFAULTS, loadHarnessConfig, resolveGlobalHarnessConfigPath, } from "./harness-config.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,eAAe,EAEf,uBAAuB,EAMvB,iBAAiB,GAClB,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,eAAe,EAEf,yBAAyB,EACzB,8BAA8B,EAC9B,uBAAuB,EAMvB,iBAAiB,EACjB,8BAA8B,GAC/B,MAAM,qBAAqB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"load-harness-config.d.ts","sourceRoot":"","sources":["../../src/config/load-harness-config.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAsB,MAAM,oBAAoB,CAAA;AACpG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAE/D,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAA;IACzC,QAAQ,CAAC,eAAe,CAAC,EAAE,sBAAsB,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,SAAS,wBAAwB,KAChC,OAAO,CAAC,aAAa,CAmBvB,CAAA"}
1
+ {"version":3,"file":"load-harness-config.d.ts","sourceRoot":"","sources":["../../src/config/load-harness-config.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAsB,MAAM,oBAAoB,CAAA;AACpG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAG/D,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAA;IACzC,QAAQ,CAAC,eAAe,CAAC,EAAE,sBAAsB,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,SAAS,wBAAwB,KAChC,OAAO,CAAC,aAAa,CA4BvB,CAAA"}
@@ -4,12 +4,20 @@ import { ConfigLoadError } from "./config-errors.js";
4
4
  import { readHarnessConfigFile } from "./config-file.js";
5
5
  import { mergeHarnessConfig } from "./config-merge.js";
6
6
  import { parseHarnessConfig } from "./config-schema.js";
7
+ import { ensureGlobalHarnessConfig } from "./global-config-init.js";
7
8
  export const loadHarnessConfig = async (options) => {
8
- const sourcePath = join(options.projectRoot, ".harness", "config.yaml");
9
+ const projectConfigPath = join(options.projectRoot, ".harness", "config.yaml");
9
10
  try {
10
- const projectConfig = await readHarnessConfigFile(sourcePath);
11
+ // 确保全局配置存在(不存在则初始化)
12
+ const globalConfigPath = await ensureGlobalHarnessConfig();
13
+ // 读取全局配置和项目配置
14
+ const [globalConfig, projectConfig] = await Promise.all([
15
+ readGlobalConfigSafely(globalConfigPath),
16
+ readHarnessConfigFile(projectConfigPath),
17
+ ]);
11
18
  const mergedConfig = mergeHarnessConfig({
12
19
  defaults: HARNESS_CONFIG_DEFAULTS,
20
+ globalConfig,
13
21
  projectConfig,
14
22
  runOverride: options.runOverride,
15
23
  });
@@ -19,7 +27,17 @@ export const loadHarnessConfig = async (options) => {
19
27
  if (error instanceof ConfigLoadError) {
20
28
  throw error;
21
29
  }
22
- throw new ConfigLoadError(sourcePath, error);
30
+ throw new ConfigLoadError(projectConfigPath, error);
31
+ }
32
+ };
33
+ const readGlobalConfigSafely = async (configPath) => {
34
+ try {
35
+ return await readHarnessConfigFile(configPath);
36
+ }
37
+ catch (error) {
38
+ // 全局配置读取失败不阻塞启动,仅记录警告
39
+ console.warn(`[harness] Failed to read global config at ${configPath}:`, error instanceof Error ? error.message : error);
40
+ return undefined;
23
41
  }
24
42
  };
25
43
  //# sourceMappingURL=load-harness-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-harness-config.js","sourceRoot":"","sources":["../../src/config/load-harness-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAA+C,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AASpG,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,OAAiC,EACT,EAAE;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;IAEvE,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAAC,UAAU,CAAC,CAAA;QAC7D,MAAM,YAAY,GAAG,kBAAkB,CAAC;YACtC,QAAQ,EAAE,uBAAuB;YACjC,aAAa;YACb,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAA;QAEF,OAAO,kBAAkB,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,MAAM,KAAK,CAAA;QACb,CAAC;QAED,MAAM,IAAI,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"load-harness-config.js","sourceRoot":"","sources":["../../src/config/load-harness-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAA+C,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEpG,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAQnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,OAAiC,EACT,EAAE;IAC1B,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;IAE9E,IAAI,CAAC;QACH,oBAAoB;QACpB,MAAM,gBAAgB,GAAG,MAAM,yBAAyB,EAAE,CAAA;QAE1D,cAAc;QACd,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACtD,sBAAsB,CAAC,gBAAgB,CAAC;YACxC,qBAAqB,CAAC,iBAAiB,CAAC;SACzC,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,kBAAkB,CAAC;YACtC,QAAQ,EAAE,uBAAuB;YACjC,YAAY;YACZ,aAAa;YACb,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAA;QAEF,OAAO,kBAAkB,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,MAAM,KAAK,CAAA;QACb,CAAC;QAED,MAAM,IAAI,eAAe,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;IACrD,CAAC;AACH,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,KAAK,EAClC,UAAkB,EACuB,EAAE;IAC3C,IAAI,CAAC;QACH,OAAO,MAAM,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sBAAsB;QACtB,OAAO,CAAC,IAAI,CACV,6CAA6C,UAAU,GAAG,EAC1D,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAA;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harness-engineering-agent",
3
- "version": "0.2.3",
3
+ "version": "0.3.0",
4
4
  "description": "Minimal OpenCode harness plugin package.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",