@context-forge/core 0.9.2 → 0.10.1
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/dist/config/ConfigKeys.d.ts +6 -0
- package/dist/config/ConfigKeys.d.ts.map +1 -1
- package/dist/config/ConfigKeys.js +18 -0
- package/dist/config/ConfigKeys.js.map +1 -1
- package/dist/config/ConfigManager.d.ts +31 -1
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +118 -6
- package/dist/config/ConfigManager.js.map +1 -1
- package/dist/config/configPaths.d.ts +2 -0
- package/dist/config/configPaths.d.ts.map +1 -1
- package/dist/config/configPaths.js +4 -0
- package/dist/config/configPaths.js.map +1 -1
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -2
- package/dist/config/index.js.map +1 -1
- package/dist/guides/GuideManager.d.ts +3 -1
- package/dist/guides/GuideManager.d.ts.map +1 -1
- package/dist/guides/GuideManager.js +9 -1
- package/dist/guides/GuideManager.js.map +1 -1
- package/dist/guides/branchGuard.d.ts +39 -0
- package/dist/guides/branchGuard.d.ts.map +1 -0
- package/dist/guides/branchGuard.js +91 -0
- package/dist/guides/branchGuard.js.map +1 -0
- package/dist/guides/index.d.ts +1 -0
- package/dist/guides/index.d.ts.map +1 -1
- package/dist/guides/index.js +1 -0
- package/dist/guides/index.js.map +1 -1
- package/dist/introspection/ConsistencyChecker.d.ts +9 -0
- package/dist/introspection/ConsistencyChecker.d.ts.map +1 -1
- package/dist/introspection/ConsistencyChecker.js +35 -0
- package/dist/introspection/ConsistencyChecker.js.map +1 -1
- package/dist/introspection/WorkflowNavigator.d.ts +4 -2
- package/dist/introspection/WorkflowNavigator.d.ts.map +1 -1
- package/dist/introspection/WorkflowNavigator.js +7 -3
- package/dist/introspection/WorkflowNavigator.js.map +1 -1
- package/dist/introspection/parsers/statusNormalizer.d.ts +1 -3
- package/dist/introspection/parsers/statusNormalizer.d.ts.map +1 -1
- package/dist/introspection/parsers/statusNormalizer.js +2 -3
- package/dist/introspection/parsers/statusNormalizer.js.map +1 -1
- package/dist/introspection/statusDerivation.d.ts +7 -1
- package/dist/introspection/statusDerivation.d.ts.map +1 -1
- package/dist/introspection/statusDerivation.js +10 -1
- package/dist/introspection/statusDerivation.js.map +1 -1
- package/dist/introspection/types.d.ts +1 -0
- package/dist/introspection/types.d.ts.map +1 -1
- package/dist/introspection/types.js +1 -0
- package/dist/introspection/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
export declare const ConfigScope: {
|
|
2
|
+
readonly Shared: "shared";
|
|
3
|
+
readonly Personal: "personal";
|
|
4
|
+
};
|
|
5
|
+
export type ConfigScope = (typeof ConfigScope)[keyof typeof ConfigScope];
|
|
1
6
|
export interface ConfigKeyDefinition {
|
|
2
7
|
type: 'string' | 'boolean' | 'number';
|
|
3
8
|
default: string | boolean | number;
|
|
4
9
|
description: string;
|
|
10
|
+
scope: ConfigScope;
|
|
5
11
|
enum?: string[];
|
|
6
12
|
validate?: (value: string | boolean | number) => string | null;
|
|
7
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigKeys.d.ts","sourceRoot":"","sources":["../../src/config/ConfigKeys.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAChE;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"ConfigKeys.d.ts","sourceRoot":"","sources":["../../src/config/ConfigKeys.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;CAGd,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAChE;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAqH3D,CAAC"}
|
|
@@ -1,75 +1,92 @@
|
|
|
1
|
+
export const ConfigScope = {
|
|
2
|
+
Shared: 'shared',
|
|
3
|
+
Personal: 'personal',
|
|
4
|
+
};
|
|
1
5
|
export const CONFIG_KEYS = {
|
|
2
6
|
'guide.auto_update': {
|
|
3
7
|
type: 'boolean',
|
|
4
8
|
default: false,
|
|
5
9
|
description: 'Whether to automatically update the AI project guide',
|
|
10
|
+
scope: ConfigScope.Shared,
|
|
6
11
|
},
|
|
7
12
|
'guide.source': {
|
|
8
13
|
type: 'string',
|
|
9
14
|
default: '',
|
|
10
15
|
description: 'URL or path to the AI project guide source',
|
|
16
|
+
scope: ConfigScope.Shared,
|
|
11
17
|
},
|
|
12
18
|
'guide.git_strategy': {
|
|
13
19
|
type: 'string',
|
|
14
20
|
default: 'submodule',
|
|
15
21
|
description: 'Strategy for managing the AI project guide via git',
|
|
16
22
|
enum: ['submodule', 'clone', 'manual'],
|
|
23
|
+
scope: ConfigScope.Shared,
|
|
17
24
|
},
|
|
18
25
|
'workflow.auto_advance': {
|
|
19
26
|
type: 'boolean',
|
|
20
27
|
default: false,
|
|
21
28
|
description: 'Auto-advance to next slice when current is complete',
|
|
29
|
+
scope: ConfigScope.Shared,
|
|
22
30
|
},
|
|
23
31
|
'workflow.auto_fix': {
|
|
24
32
|
type: 'boolean',
|
|
25
33
|
default: false,
|
|
26
34
|
description: 'Automatically apply non-destructive corrections when running consistency checks',
|
|
35
|
+
scope: ConfigScope.Shared,
|
|
27
36
|
},
|
|
28
37
|
'workflow.review_enabled': {
|
|
29
38
|
type: 'boolean',
|
|
30
39
|
default: false,
|
|
31
40
|
description: 'Enable review gating in the workflow navigator (off by default; no behavior change when false)',
|
|
41
|
+
scope: ConfigScope.Shared,
|
|
32
42
|
},
|
|
33
43
|
'workflow.review_threshold': {
|
|
34
44
|
type: 'string',
|
|
35
45
|
default: 'concerns',
|
|
36
46
|
description: 'Verdict floor that clears a review gate: "pass" requires PASS; "concerns" clears on PASS or CONCERNS',
|
|
37
47
|
enum: ['pass', 'concerns'],
|
|
48
|
+
scope: ConfigScope.Shared,
|
|
38
49
|
},
|
|
39
50
|
'workflow.review_unknown_as': {
|
|
40
51
|
type: 'string',
|
|
41
52
|
default: 'fail',
|
|
42
53
|
description: 'How to treat an UNKNOWN/absent/unparseable verdict: "fail" blocks, "concerns" treats as CONCERNS, "pass" clears',
|
|
43
54
|
enum: ['fail', 'concerns', 'pass'],
|
|
55
|
+
scope: ConfigScope.Shared,
|
|
44
56
|
},
|
|
45
57
|
'workflow.review_gates.code.threshold': {
|
|
46
58
|
type: 'string',
|
|
47
59
|
default: '',
|
|
48
60
|
description: 'Per-gate override: verdict floor for the code (pre-advance) review gate (empty = use workflow.review_threshold)',
|
|
49
61
|
enum: ['', 'pass', 'concerns'],
|
|
62
|
+
scope: ConfigScope.Shared,
|
|
50
63
|
},
|
|
51
64
|
'workflow.review_gates.arch.threshold': {
|
|
52
65
|
type: 'string',
|
|
53
66
|
default: '',
|
|
54
67
|
description: 'Per-gate override: verdict floor for the arch (pre-slice-plan) review gate (empty = use workflow.review_threshold)',
|
|
55
68
|
enum: ['', 'pass', 'concerns'],
|
|
69
|
+
scope: ConfigScope.Shared,
|
|
56
70
|
},
|
|
57
71
|
'workflow.review_gates.slice.threshold': {
|
|
58
72
|
type: 'string',
|
|
59
73
|
default: '',
|
|
60
74
|
description: 'Per-gate override: verdict floor for the slice (pre-tasks) review gate (empty = use workflow.review_threshold)',
|
|
61
75
|
enum: ['', 'pass', 'concerns'],
|
|
76
|
+
scope: ConfigScope.Shared,
|
|
62
77
|
},
|
|
63
78
|
'workflow.review_gates.tasks.threshold': {
|
|
64
79
|
type: 'string',
|
|
65
80
|
default: '',
|
|
66
81
|
description: 'Per-gate override: verdict floor for the tasks (pre-implementation) review gate (empty = use workflow.review_threshold)',
|
|
67
82
|
enum: ['', 'pass', 'concerns'],
|
|
83
|
+
scope: ConfigScope.Shared,
|
|
68
84
|
},
|
|
69
85
|
'workflow.review_gate_effective_date': {
|
|
70
86
|
type: 'string',
|
|
71
87
|
default: '',
|
|
72
88
|
description: 'Grandfathers slices/architecture designed before this date (YYYYMMDD, compared against the artifact\'s own dateCreated) out of every review gate boundary. Empty (default) applies no cutoff — every slice is subject to gating. Lets a project turn on review_enabled without retroactively demanding reviews for work completed before the gate existed.',
|
|
89
|
+
scope: ConfigScope.Shared,
|
|
73
90
|
validate: (value) => {
|
|
74
91
|
if (typeof value !== 'string')
|
|
75
92
|
return 'must be a string';
|
|
@@ -84,6 +101,7 @@ export const CONFIG_KEYS = {
|
|
|
84
101
|
type: 'string',
|
|
85
102
|
default: '',
|
|
86
103
|
description: 'Optional long-lived integration branch that work branches fork from and merge into instead of main (e.g. "dev/erik" yields "dev/erik/910-slice.foo", forked from and merged into "dev/erik"). Empty means no integration branch — work branches fork from and merge into main directly. Relative and contained: must not be absolute or escape via "..".',
|
|
104
|
+
scope: ConfigScope.Personal,
|
|
87
105
|
validate: (value) => {
|
|
88
106
|
if (typeof value !== 'string')
|
|
89
107
|
return 'must be a string';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigKeys.js","sourceRoot":"","sources":["../../src/config/ConfigKeys.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConfigKeys.js","sourceRoot":"","sources":["../../src/config/ConfigKeys.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export interface ConfigResult {
|
|
2
2
|
key: string;
|
|
3
3
|
value: string | boolean | number;
|
|
4
|
-
source: 'project' | 'user' | 'default';
|
|
4
|
+
source: 'project-personal' | 'project' | 'user' | 'default';
|
|
5
5
|
description: string;
|
|
6
6
|
}
|
|
7
7
|
export interface ConfigListEntry extends ConfigResult {
|
|
@@ -13,6 +13,36 @@ export declare class ConfigManager {
|
|
|
13
13
|
constructor(projectPath?: string);
|
|
14
14
|
get(key: string): Promise<ConfigResult>;
|
|
15
15
|
set(key: string, value: string | boolean | number, scope: 'user' | 'project'): Promise<void>;
|
|
16
|
+
delete(key: string, scope: 'user' | 'project'): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Resolves the physical file for a `set`/`delete` call. `scope: 'user'` always
|
|
19
|
+
* targets the user config file regardless of the key's own classification —
|
|
20
|
+
* only `scope: 'project'` is routed further, to the personal or shared project
|
|
21
|
+
* file based on `def.scope`.
|
|
22
|
+
*/
|
|
23
|
+
private resolveProjectScopeFilePath;
|
|
24
|
+
/**
|
|
25
|
+
* Reads a key's raw value directly from each project-scope file, bypassing the
|
|
26
|
+
* fallback-merged result `get()` returns. Used where a caller must distinguish
|
|
27
|
+
* "absent from personal" vs. "present in shared" independently — e.g. the
|
|
28
|
+
* personal-config-in-shared-file consistency check and `cf config migrate-personal`,
|
|
29
|
+
* both of which need to know what each file actually contains, not just the
|
|
30
|
+
* precedence-resolved value.
|
|
31
|
+
*/
|
|
32
|
+
getRawProjectFileValues(key: string): Promise<{
|
|
33
|
+
personal: string | boolean | number | undefined;
|
|
34
|
+
shared: string | boolean | number | undefined;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Deletes a key from the shared project file specifically, bypassing the
|
|
38
|
+
* scope-based routing `delete()` applies. Needed by `cf config migrate-personal`:
|
|
39
|
+
* that command's whole purpose is to remove a personal-scope key from the
|
|
40
|
+
* *shared* file once it's confirmed safe to do so (identical value already in
|
|
41
|
+
* the personal file, or successfully copied there) — routed `delete()` would
|
|
42
|
+
* send a personal key's deletion to the personal file instead, deleting the
|
|
43
|
+
* very value the migration just confirmed or wrote.
|
|
44
|
+
*/
|
|
45
|
+
deleteFromSharedProjectFile(key: string): Promise<void>;
|
|
16
46
|
list(): Promise<ConfigListEntry[]>;
|
|
17
47
|
}
|
|
18
48
|
//# sourceMappingURL=ConfigManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtC,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CACzC;AAiGD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;gBAErC,WAAW,CAAC,EAAE,MAAM;IAI1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA2DvC,GAAG,CACP,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAChC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC,IAAI,CAAC;IAkBV,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnE;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IAYnC;;;;;;;OAOG;IACG,uBAAuB,CAC3B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAe9G;;;;;;;;OAQG;IACG,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvD,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;CAYzC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
2
2
|
import { dirname } from 'path';
|
|
3
3
|
import { parse, stringify } from 'smol-toml';
|
|
4
|
-
import { CONFIG_KEYS } from './ConfigKeys.js';
|
|
5
|
-
import { getUserConfigPath, getProjectConfigPath } from './configPaths.js';
|
|
4
|
+
import { CONFIG_KEYS, ConfigScope } from './ConfigKeys.js';
|
|
5
|
+
import { getUserConfigPath, getProjectConfigPath, getProjectPersonalConfigPath } from './configPaths.js';
|
|
6
6
|
async function readToml(filePath) {
|
|
7
7
|
try {
|
|
8
8
|
const content = await readFile(filePath, 'utf-8');
|
|
@@ -41,6 +41,36 @@ function setKey(obj, key, value) {
|
|
|
41
41
|
}
|
|
42
42
|
current[parts[parts.length - 1]] = value;
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Removes the leaf key at the dotted path, then prunes any now-empty parent
|
|
46
|
+
* tables left behind so `stringify` doesn't emit a dangling `[section]`
|
|
47
|
+
* header. No-op if the key or an intermediate table doesn't exist.
|
|
48
|
+
*/
|
|
49
|
+
function deleteKey(obj, key) {
|
|
50
|
+
const parts = key.split('.');
|
|
51
|
+
const chain = [obj];
|
|
52
|
+
let current = obj;
|
|
53
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
54
|
+
const part = parts[i];
|
|
55
|
+
if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
current = current[part];
|
|
59
|
+
chain.push(current);
|
|
60
|
+
}
|
|
61
|
+
const leaf = parts[parts.length - 1];
|
|
62
|
+
if (!(leaf in current))
|
|
63
|
+
return;
|
|
64
|
+
delete current[leaf];
|
|
65
|
+
// Walk back up, pruning any table left empty by the deletion above.
|
|
66
|
+
for (let i = chain.length - 1; i > 0; i--) {
|
|
67
|
+
const table = chain[i];
|
|
68
|
+
if (Object.keys(table).length > 0)
|
|
69
|
+
break;
|
|
70
|
+
const parent = chain[i - 1];
|
|
71
|
+
delete parent[parts[i - 1]];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
44
74
|
function validateValue(key, value, def) {
|
|
45
75
|
if (typeof value !== def.type) {
|
|
46
76
|
throw new Error(`Config key "${key}" expects type "${def.type}", got "${typeof value}"`);
|
|
@@ -65,8 +95,25 @@ export class ConfigManager {
|
|
|
65
95
|
if (!def) {
|
|
66
96
|
throw new Error(`Unknown config key: "${key}"`);
|
|
67
97
|
}
|
|
68
|
-
// Check project config first
|
|
98
|
+
// Check project config first (personal file before shared file, for personal-scope keys)
|
|
69
99
|
if (this.projectPath) {
|
|
100
|
+
if (def.scope === ConfigScope.Personal) {
|
|
101
|
+
const personalConfig = await readToml(getProjectPersonalConfigPath(this.projectPath));
|
|
102
|
+
const personalValue = resolveKey(personalConfig, key);
|
|
103
|
+
if (personalValue !== undefined) {
|
|
104
|
+
return {
|
|
105
|
+
key,
|
|
106
|
+
// resolveKey returns unknown (parsed TOML); safe to assert here because
|
|
107
|
+
// `key` is validated against CONFIG_KEYS above, whose values are all
|
|
108
|
+
// string | boolean | number.
|
|
109
|
+
value: personalValue,
|
|
110
|
+
source: 'project-personal',
|
|
111
|
+
description: def.description,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Shared project file — normal case for shared keys, and the pre-migration
|
|
116
|
+
// fallback for a personal key that still lives in the shared file.
|
|
70
117
|
const projectConfig = await readToml(getProjectConfigPath(this.projectPath));
|
|
71
118
|
const projectValue = resolveKey(projectConfig, key);
|
|
72
119
|
if (projectValue !== undefined) {
|
|
@@ -106,13 +153,78 @@ export class ConfigManager {
|
|
|
106
153
|
throw new Error(`Cannot set project-scoped config: no projectPath provided`);
|
|
107
154
|
}
|
|
108
155
|
validateValue(key, value, def);
|
|
109
|
-
const filePath = scope
|
|
110
|
-
? getProjectConfigPath(this.projectPath)
|
|
111
|
-
: getUserConfigPath();
|
|
156
|
+
const filePath = this.resolveProjectScopeFilePath(def, scope);
|
|
112
157
|
const existing = await readToml(filePath);
|
|
113
158
|
setKey(existing, key, value);
|
|
114
159
|
await writeToml(filePath, existing);
|
|
115
160
|
}
|
|
161
|
+
async delete(key, scope) {
|
|
162
|
+
const def = CONFIG_KEYS[key];
|
|
163
|
+
if (!def) {
|
|
164
|
+
throw new Error(`Unknown config key: "${key}"`);
|
|
165
|
+
}
|
|
166
|
+
if (scope === 'project' && !this.projectPath) {
|
|
167
|
+
throw new Error(`Cannot unset project-scoped config: no projectPath provided`);
|
|
168
|
+
}
|
|
169
|
+
const filePath = this.resolveProjectScopeFilePath(def, scope);
|
|
170
|
+
const existing = await readToml(filePath);
|
|
171
|
+
deleteKey(existing, key);
|
|
172
|
+
await writeToml(filePath, existing);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Resolves the physical file for a `set`/`delete` call. `scope: 'user'` always
|
|
176
|
+
* targets the user config file regardless of the key's own classification —
|
|
177
|
+
* only `scope: 'project'` is routed further, to the personal or shared project
|
|
178
|
+
* file based on `def.scope`.
|
|
179
|
+
*/
|
|
180
|
+
resolveProjectScopeFilePath(def, scope) {
|
|
181
|
+
if (scope === 'user') {
|
|
182
|
+
return getUserConfigPath();
|
|
183
|
+
}
|
|
184
|
+
return def.scope === ConfigScope.Personal
|
|
185
|
+
? getProjectPersonalConfigPath(this.projectPath)
|
|
186
|
+
: getProjectConfigPath(this.projectPath);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Reads a key's raw value directly from each project-scope file, bypassing the
|
|
190
|
+
* fallback-merged result `get()` returns. Used where a caller must distinguish
|
|
191
|
+
* "absent from personal" vs. "present in shared" independently — e.g. the
|
|
192
|
+
* personal-config-in-shared-file consistency check and `cf config migrate-personal`,
|
|
193
|
+
* both of which need to know what each file actually contains, not just the
|
|
194
|
+
* precedence-resolved value.
|
|
195
|
+
*/
|
|
196
|
+
async getRawProjectFileValues(key) {
|
|
197
|
+
if (!this.projectPath) {
|
|
198
|
+
throw new Error('Cannot read project-scoped config: no projectPath provided');
|
|
199
|
+
}
|
|
200
|
+
const personalConfig = await readToml(getProjectPersonalConfigPath(this.projectPath));
|
|
201
|
+
const sharedConfig = await readToml(getProjectConfigPath(this.projectPath));
|
|
202
|
+
// resolveKey returns unknown (parsed TOML); safe to assert here because `key`
|
|
203
|
+
// is expected to be a CONFIG_KEYS entry, whose values are all
|
|
204
|
+
// string | boolean | number (or absent, hence the trailing `| undefined`).
|
|
205
|
+
return {
|
|
206
|
+
personal: resolveKey(personalConfig, key),
|
|
207
|
+
shared: resolveKey(sharedConfig, key),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Deletes a key from the shared project file specifically, bypassing the
|
|
212
|
+
* scope-based routing `delete()` applies. Needed by `cf config migrate-personal`:
|
|
213
|
+
* that command's whole purpose is to remove a personal-scope key from the
|
|
214
|
+
* *shared* file once it's confirmed safe to do so (identical value already in
|
|
215
|
+
* the personal file, or successfully copied there) — routed `delete()` would
|
|
216
|
+
* send a personal key's deletion to the personal file instead, deleting the
|
|
217
|
+
* very value the migration just confirmed or wrote.
|
|
218
|
+
*/
|
|
219
|
+
async deleteFromSharedProjectFile(key) {
|
|
220
|
+
if (!this.projectPath) {
|
|
221
|
+
throw new Error('Cannot delete project-scoped config: no projectPath provided');
|
|
222
|
+
}
|
|
223
|
+
const filePath = getProjectConfigPath(this.projectPath);
|
|
224
|
+
const existing = await readToml(filePath);
|
|
225
|
+
deleteKey(existing, key);
|
|
226
|
+
await writeToml(filePath, existing);
|
|
227
|
+
}
|
|
116
228
|
async list() {
|
|
117
229
|
const results = [];
|
|
118
230
|
for (const [key, def] of Object.entries(CONFIG_KEYS)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAA4B,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,4 +2,6 @@
|
|
|
2
2
|
export declare function getUserConfigPath(): string;
|
|
3
3
|
/** Returns the project-level config file path: {projectPath}/.context-forge.toml */
|
|
4
4
|
export declare function getProjectConfigPath(projectPath: string): string;
|
|
5
|
+
/** Returns the project-level personal config file path: {projectPath}/.context-forge.local.toml */
|
|
6
|
+
export declare function getProjectPersonalConfigPath(projectPath: string): string;
|
|
5
7
|
//# sourceMappingURL=configPaths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configPaths.d.ts","sourceRoot":"","sources":["../../src/config/configPaths.ts"],"names":[],"mappings":"AAGA,yEAAyE;AACzE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
|
1
|
+
{"version":3,"file":"configPaths.d.ts","sourceRoot":"","sources":["../../src/config/configPaths.ts"],"names":[],"mappings":"AAGA,yEAAyE;AACzE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,mGAAmG;AACnG,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExE"}
|
|
@@ -8,4 +8,8 @@ export function getUserConfigPath() {
|
|
|
8
8
|
export function getProjectConfigPath(projectPath) {
|
|
9
9
|
return join(projectPath, '.context-forge.toml');
|
|
10
10
|
}
|
|
11
|
+
/** Returns the project-level personal config file path: {projectPath}/.context-forge.local.toml */
|
|
12
|
+
export function getProjectPersonalConfigPath(projectPath) {
|
|
13
|
+
return join(projectPath, '.context-forge.local.toml');
|
|
14
|
+
}
|
|
11
15
|
//# sourceMappingURL=configPaths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configPaths.js","sourceRoot":"","sources":["../../src/config/configPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,yEAAyE;AACzE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;AAClD,CAAC"}
|
|
1
|
+
{"version":3,"file":"configPaths.js","sourceRoot":"","sources":["../../src/config/configPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,yEAAyE;AACzE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;AAClD,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,4BAA4B,CAAC,WAAmB;IAC9D,OAAO,IAAI,CAAC,WAAW,EAAE,2BAA2B,CAAC,CAAC;AACxD,CAAC"}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { ConfigKeyDefinition, CONFIG_KEYS } from './ConfigKeys.js';
|
|
1
|
+
export { ConfigKeyDefinition, ConfigScope, CONFIG_KEYS } from './ConfigKeys.js';
|
|
2
2
|
export { ConfigResult, ConfigListEntry, ConfigManager } from './ConfigManager.js';
|
|
3
|
-
export { getUserConfigPath, getProjectConfigPath } from './configPaths.js';
|
|
3
|
+
export { getUserConfigPath, getProjectConfigPath, getProjectPersonalConfigPath } from './configPaths.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/config/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { CONFIG_KEYS } from './ConfigKeys.js';
|
|
1
|
+
export { ConfigScope, CONFIG_KEYS } from './ConfigKeys.js';
|
|
2
2
|
export { ConfigManager } from './ConfigManager.js';
|
|
3
|
-
export { getUserConfigPath, getProjectConfigPath } from './configPaths.js';
|
|
3
|
+
export { getUserConfigPath, getProjectConfigPath, getProjectPersonalConfigPath } from './configPaths.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAiC,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -11,7 +11,9 @@ export declare class GuideManager {
|
|
|
11
11
|
/** Install the guide into the project */
|
|
12
12
|
install(strategyOverride?: GuideMethod, sourceOverride?: string): Promise<InstallResult>;
|
|
13
13
|
/** Update an existing guide installation */
|
|
14
|
-
update(
|
|
14
|
+
update(opts?: {
|
|
15
|
+
confirmed?: boolean;
|
|
16
|
+
}): Promise<UpdateResult>;
|
|
15
17
|
/** Uninstall the guide from the project */
|
|
16
18
|
uninstall(): Promise<UninstallResult>;
|
|
17
19
|
/** Sync guide submodule checkout in multiple worktrees */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GuideManager.d.ts","sourceRoot":"","sources":["../../src/guides/GuideManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAmB,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"GuideManager.d.ts","sourceRoot":"","sources":["../../src/guides/GuideManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAmB,UAAU,EAAE,MAAM,YAAY,CAAC;AAQpI,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;gBAE5B,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,EAAE,MAAM;IAOtF,4CAA4C;IACtC,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAKlC,yCAAyC;IACnC,OAAO,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAsB9F,4CAA4C;IACtC,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IA+BnE,2CAA2C;IACrC,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAuD3C,0DAA0D;IACpD,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAwBnE,gDAAgD;YAClC,aAAa;IAc3B,8CAA8C;YAChC,eAAe;IAc7B,2DAA2D;IAC3D,OAAO,CAAC,qBAAqB;IAa7B,2CAA2C;IAC3C,OAAO,CAAC,WAAW;CAUpB"}
|
|
@@ -6,6 +6,7 @@ import { GuideDetector } from './GuideDetector.js';
|
|
|
6
6
|
import { SubmoduleStrategy } from './strategies/SubmoduleStrategy.js';
|
|
7
7
|
import { CloneStrategy } from './strategies/CloneStrategy.js';
|
|
8
8
|
import { TarballStrategy } from './strategies/TarballStrategy.js';
|
|
9
|
+
import { evaluateBranchGuard, BranchGuardBlockedError, BranchGuardWarnError } from './branchGuard.js';
|
|
9
10
|
export class GuideManager {
|
|
10
11
|
projectPath;
|
|
11
12
|
configManager;
|
|
@@ -39,13 +40,20 @@ export class GuideManager {
|
|
|
39
40
|
return result;
|
|
40
41
|
}
|
|
41
42
|
/** Update an existing guide installation */
|
|
42
|
-
async update() {
|
|
43
|
+
async update(opts) {
|
|
43
44
|
const source = await this.resolveSource();
|
|
44
45
|
const targetDir = join(this.projectPath, GUIDE_RELATIVE_PATH);
|
|
45
46
|
const info = await this.detector.detect(this.projectPath, source);
|
|
46
47
|
if (!info.installed || !info.method) {
|
|
47
48
|
throw new Error('Guide is not installed. Use guide_install (or cf guides install) to install it first.');
|
|
48
49
|
}
|
|
50
|
+
const verdict = await evaluateBranchGuard(this.projectPath, this.configManager);
|
|
51
|
+
if (verdict.outcome === 'block') {
|
|
52
|
+
throw new BranchGuardBlockedError(verdict.trunk, verdict.current);
|
|
53
|
+
}
|
|
54
|
+
if (verdict.outcome === 'warn' && opts?.confirmed !== true) {
|
|
55
|
+
throw new BranchGuardWarnError(verdict.trunk, verdict.current, verdict.ancestry);
|
|
56
|
+
}
|
|
49
57
|
const strategy = this.getStrategy(info.method);
|
|
50
58
|
const result = await strategy.update(this.projectPath, targetDir);
|
|
51
59
|
// Sync the worktree's submodule checkout if operating from a non-default worktree
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GuideManager.js","sourceRoot":"","sources":["../../src/guides/GuideManager.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAGnD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"GuideManager.js","sourceRoot":"","sources":["../../src/guides/GuideManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ConfigManager } from '../config/ConfigManager.js';
|
|
2
|
+
export type BranchGuardVerdict = {
|
|
3
|
+
outcome: 'proceed';
|
|
4
|
+
} | {
|
|
5
|
+
outcome: 'block';
|
|
6
|
+
trunk: string;
|
|
7
|
+
current: string;
|
|
8
|
+
} | {
|
|
9
|
+
outcome: 'warn';
|
|
10
|
+
trunk: string;
|
|
11
|
+
current: string;
|
|
12
|
+
ancestry: 'descends' | 'unrelated';
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Checks whether `trunk` is an ancestor of HEAD via `git merge-base --is-ancestor`,
|
|
16
|
+
* whose exit code is its actual return value (0 = true, 1 = false, >1 = error) rather
|
|
17
|
+
* than a uniform success/failure signal — so this bypasses gitExec's throw-on-nonzero
|
|
18
|
+
* contract with a standalone execFile call instead of changing that contract for every
|
|
19
|
+
* other caller.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isAncestor(trunk: string, cwd: string): Promise<boolean>;
|
|
22
|
+
export declare class BranchGuardBlockedError extends Error {
|
|
23
|
+
readonly trunk: string;
|
|
24
|
+
readonly current: string;
|
|
25
|
+
constructor(trunk: string, current: string);
|
|
26
|
+
}
|
|
27
|
+
export declare class BranchGuardWarnError extends Error {
|
|
28
|
+
readonly trunk: string;
|
|
29
|
+
readonly current: string;
|
|
30
|
+
readonly ancestry: 'descends' | 'unrelated';
|
|
31
|
+
constructor(trunk: string, current: string, ancestry: 'descends' | 'unrelated');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolves the configured trunk branch and the current branch, then applies the
|
|
35
|
+
* guard decision table to determine whether a guide-update commit should proceed,
|
|
36
|
+
* block, or require confirmation.
|
|
37
|
+
*/
|
|
38
|
+
export declare function evaluateBranchGuard(projectPath: string, configManager?: ConfigManager): Promise<BranchGuardVerdict>;
|
|
39
|
+
//# sourceMappingURL=branchGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branchGuard.d.ts","sourceRoot":"","sources":["../../src/guides/branchGuard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAGhE,MAAM,MAAM,kBAAkB,GAC1B;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,GACtB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,UAAU,GAAG,WAAW,CAAA;CAAE,CAAC;AAE5F;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBvE;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAU3C;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,WAAW,CAAC;gBAEhC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,WAAW;CAW/E;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAgC7B"}
|