@kadi.build/core 0.15.4 → 0.15.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/agent.json +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -1
- package/dist/config.js.map +1 -1
- package/package.json +1 -1
- package/src/config.ts +42 -1
package/agent.json
CHANGED
package/dist/config.d.ts
CHANGED
|
@@ -75,6 +75,10 @@ export interface ConfigResult<T = Record<string, unknown>> {
|
|
|
75
75
|
/**
|
|
76
76
|
* Walk up the directory tree looking for a file.
|
|
77
77
|
*
|
|
78
|
+
* If the search starts inside an `abilities/` folder (indicating the
|
|
79
|
+
* caller is an installed sub-component), config files found at that
|
|
80
|
+
* level are skipped so the walk continues to the project root.
|
|
81
|
+
*
|
|
78
82
|
* @param filename - File to search for (default: `'config.yml'`)
|
|
79
83
|
* @param startDir - Directory to start from (default: `process.cwd()`)
|
|
80
84
|
* @returns Absolute path if found, `null` otherwise.
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAqBH,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5D,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,oCAAoC;AACpC,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvD,qFAAqF;IACrF,MAAM,EAAE,CAAC,CAAC;IACV,8EAA8E;IAC9E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0CAA0C;IAC1C,MAAM,EAAE,YAAY,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAqBH,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5D,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,oCAAoC;AACpC,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvD,qFAAqF;IACrF,MAAM,EAAE,CAAC,CAAC;IACV,8EAA8E;IAC9E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0CAA0C;IAC1C,MAAM,EAAE,YAAY,CAAC;CACtB;AA+BD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,GAAE,MAAyB,EACnC,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CA+Bf;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,GAAE,MAAyB,GAClC,MAAM,GAAG,IAAI,CAUf;AA6ED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpD,OAAO,EAAE,iBAAiB,GACzB,YAAY,CAAC,CAAC,CAAC,CAsDjB"}
|
package/dist/config.js
CHANGED
|
@@ -41,21 +41,63 @@ const GLOBAL_KADI_DIR = path.join(os.homedir(), '.kadi');
|
|
|
41
41
|
// ═══════════════════════════════════════════════════════════════════════
|
|
42
42
|
// File discovery
|
|
43
43
|
// ═══════════════════════════════════════════════════════════════════════
|
|
44
|
+
/**
|
|
45
|
+
* Check whether a directory is inside an `abilities/` folder.
|
|
46
|
+
*
|
|
47
|
+
* When an ability is installed as a dependency (e.g.
|
|
48
|
+
* `project/abilities/auth-ability@0.1.0/`), it lives inside an
|
|
49
|
+
* `abilities/` directory and should NOT use its own config.yml —
|
|
50
|
+
* the project's config.yml (one or more levels above `abilities/`)
|
|
51
|
+
* is the correct one.
|
|
52
|
+
*
|
|
53
|
+
* When the same ability runs standalone (deployed directly, no
|
|
54
|
+
* `abilities/` ancestor), its local config.yml is the right choice.
|
|
55
|
+
*/
|
|
56
|
+
function isInsideAbilitiesDir(dir) {
|
|
57
|
+
// Walk up a few levels looking for a parent named 'abilities'.
|
|
58
|
+
// Limit depth to avoid scanning the entire filesystem.
|
|
59
|
+
let current = dir;
|
|
60
|
+
for (let i = 0; i < 4; i++) {
|
|
61
|
+
const parent = path.dirname(current);
|
|
62
|
+
if (parent === current)
|
|
63
|
+
break; // filesystem root
|
|
64
|
+
if (path.basename(parent) === 'abilities')
|
|
65
|
+
return true;
|
|
66
|
+
current = parent;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
44
70
|
/**
|
|
45
71
|
* Walk up the directory tree looking for a file.
|
|
46
72
|
*
|
|
73
|
+
* If the search starts inside an `abilities/` folder (indicating the
|
|
74
|
+
* caller is an installed sub-component), config files found at that
|
|
75
|
+
* level are skipped so the walk continues to the project root.
|
|
76
|
+
*
|
|
47
77
|
* @param filename - File to search for (default: `'config.yml'`)
|
|
48
78
|
* @param startDir - Directory to start from (default: `process.cwd()`)
|
|
49
79
|
* @returns Absolute path if found, `null` otherwise.
|
|
50
80
|
*/
|
|
51
81
|
export function findConfigFile(filename = DEFAULT_FILENAME, startDir) {
|
|
52
82
|
let dir = path.resolve(startDir ?? process.cwd());
|
|
83
|
+
// Detect whether we started inside an abilities/ directory.
|
|
84
|
+
// If so, skip config files at the starting level and inside abilities/.
|
|
85
|
+
const startedInAbilities = isInsideAbilitiesDir(dir);
|
|
53
86
|
// eslint-disable-next-line no-constant-condition
|
|
54
87
|
while (true) {
|
|
55
88
|
const candidate = path.join(dir, filename);
|
|
56
89
|
try {
|
|
57
90
|
if (fs.statSync(candidate).isFile()) {
|
|
58
|
-
|
|
91
|
+
// If we started inside abilities/, skip config files that
|
|
92
|
+
// are still within the abilities/ tree (the sub-component's
|
|
93
|
+
// own defaults). Once we've walked above abilities/, the
|
|
94
|
+
// next match is the project config — use it.
|
|
95
|
+
if (startedInAbilities && isInsideAbilitiesDir(dir)) {
|
|
96
|
+
// Skip this candidate and keep walking
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
return candidate;
|
|
100
|
+
}
|
|
59
101
|
}
|
|
60
102
|
}
|
|
61
103
|
catch {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,0EAA0E;AAC1E,YAAY;AACZ,0EAA0E;AAE1E,+BAA+B;AAC/B,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAEtC,oCAAoC;AACpC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AA0DzD,0EAA0E;AAC1E,iBAAiB;AACjB,0EAA0E;AAE1E
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/config.ts
CHANGED
|
@@ -103,9 +103,38 @@ export interface ConfigResult<T = Record<string, unknown>> {
|
|
|
103
103
|
// File discovery
|
|
104
104
|
// ═══════════════════════════════════════════════════════════════════════
|
|
105
105
|
|
|
106
|
+
/**
|
|
107
|
+
* Check whether a directory is inside an `abilities/` folder.
|
|
108
|
+
*
|
|
109
|
+
* When an ability is installed as a dependency (e.g.
|
|
110
|
+
* `project/abilities/auth-ability@0.1.0/`), it lives inside an
|
|
111
|
+
* `abilities/` directory and should NOT use its own config.yml —
|
|
112
|
+
* the project's config.yml (one or more levels above `abilities/`)
|
|
113
|
+
* is the correct one.
|
|
114
|
+
*
|
|
115
|
+
* When the same ability runs standalone (deployed directly, no
|
|
116
|
+
* `abilities/` ancestor), its local config.yml is the right choice.
|
|
117
|
+
*/
|
|
118
|
+
function isInsideAbilitiesDir(dir: string): boolean {
|
|
119
|
+
// Walk up a few levels looking for a parent named 'abilities'.
|
|
120
|
+
// Limit depth to avoid scanning the entire filesystem.
|
|
121
|
+
let current = dir;
|
|
122
|
+
for (let i = 0; i < 4; i++) {
|
|
123
|
+
const parent = path.dirname(current);
|
|
124
|
+
if (parent === current) break; // filesystem root
|
|
125
|
+
if (path.basename(parent) === 'abilities') return true;
|
|
126
|
+
current = parent;
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
|
|
106
131
|
/**
|
|
107
132
|
* Walk up the directory tree looking for a file.
|
|
108
133
|
*
|
|
134
|
+
* If the search starts inside an `abilities/` folder (indicating the
|
|
135
|
+
* caller is an installed sub-component), config files found at that
|
|
136
|
+
* level are skipped so the walk continues to the project root.
|
|
137
|
+
*
|
|
109
138
|
* @param filename - File to search for (default: `'config.yml'`)
|
|
110
139
|
* @param startDir - Directory to start from (default: `process.cwd()`)
|
|
111
140
|
* @returns Absolute path if found, `null` otherwise.
|
|
@@ -116,12 +145,24 @@ export function findConfigFile(
|
|
|
116
145
|
): string | null {
|
|
117
146
|
let dir = path.resolve(startDir ?? process.cwd());
|
|
118
147
|
|
|
148
|
+
// Detect whether we started inside an abilities/ directory.
|
|
149
|
+
// If so, skip config files at the starting level and inside abilities/.
|
|
150
|
+
const startedInAbilities = isInsideAbilitiesDir(dir);
|
|
151
|
+
|
|
119
152
|
// eslint-disable-next-line no-constant-condition
|
|
120
153
|
while (true) {
|
|
121
154
|
const candidate = path.join(dir, filename);
|
|
122
155
|
try {
|
|
123
156
|
if (fs.statSync(candidate).isFile()) {
|
|
124
|
-
|
|
157
|
+
// If we started inside abilities/, skip config files that
|
|
158
|
+
// are still within the abilities/ tree (the sub-component's
|
|
159
|
+
// own defaults). Once we've walked above abilities/, the
|
|
160
|
+
// next match is the project config — use it.
|
|
161
|
+
if (startedInAbilities && isInsideAbilitiesDir(dir)) {
|
|
162
|
+
// Skip this candidate and keep walking
|
|
163
|
+
} else {
|
|
164
|
+
return candidate;
|
|
165
|
+
}
|
|
125
166
|
}
|
|
126
167
|
} catch {
|
|
127
168
|
// Not found, keep walking
|