@shrkcrft/inspector 0.1.0-alpha.21 → 0.1.0-alpha.23
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/command-recommender.d.ts.map +1 -1
- package/dist/command-recommender.js +110 -1
- package/dist/context-tuning.d.ts +14 -0
- package/dist/context-tuning.d.ts.map +1 -0
- package/dist/context-tuning.js +38 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/knowledge-stale.d.ts +23 -0
- package/dist/knowledge-stale.d.ts.map +1 -1
- package/dist/knowledge-stale.js +58 -9
- package/dist/monorepo-onboarding.d.ts.map +1 -1
- package/dist/monorepo-onboarding.js +122 -12
- package/dist/onboarding.d.ts.map +1 -1
- package/dist/onboarding.js +79 -18
- package/dist/pack-doctor.d.ts +8 -1
- package/dist/pack-doctor.d.ts.map +1 -1
- package/dist/pack-doctor.js +110 -3
- package/dist/pack-quality-score.d.ts.map +1 -1
- package/dist/pack-quality-score.js +7 -8
- package/dist/pack-release-check.d.ts.map +1 -1
- package/dist/pack-release-check.js +23 -20
- package/dist/pack-signature-status.d.ts +9 -3
- package/dist/pack-signature-status.d.ts.map +1 -1
- package/dist/pack-signature-status.js +13 -2
- package/dist/plan-simulation.d.ts.map +1 -1
- package/dist/plan-simulation.js +26 -12
- package/dist/registry-lifecycle.d.ts +8 -0
- package/dist/registry-lifecycle.d.ts.map +1 -1
- package/dist/registry-lifecycle.js +21 -3
- package/dist/resolve-project-config.d.ts +26 -0
- package/dist/resolve-project-config.d.ts.map +1 -0
- package/dist/resolve-project-config.js +128 -0
- package/dist/resolve-verification-commands.d.ts +7 -0
- package/dist/resolve-verification-commands.d.ts.map +1 -1
- package/dist/resolve-verification-commands.js +53 -4
- package/dist/review-packet.d.ts +8 -0
- package/dist/review-packet.d.ts.map +1 -1
- package/dist/review-packet.js +11 -12
- package/dist/sharkcraft-inspector.d.ts.map +1 -1
- package/dist/sharkcraft-inspector.js +28 -2
- package/dist/spec/__tests__/spec-evidence.test.d.ts +2 -0
- package/dist/spec/__tests__/spec-evidence.test.d.ts.map +1 -0
- package/dist/spec/__tests__/spec-evidence.test.js +81 -0
- package/dist/spec/spec-evidence.d.ts +62 -0
- package/dist/spec/spec-evidence.d.ts.map +1 -0
- package/dist/spec/spec-evidence.js +215 -0
- package/dist/spec/spec-review.d.ts +1 -0
- package/dist/spec/spec-review.d.ts.map +1 -1
- package/dist/spec/spec-review.js +5 -0
- package/dist/symbol-index.d.ts +9 -0
- package/dist/symbol-index.d.ts.map +1 -1
- package/dist/symbol-index.js +6 -0
- package/dist/task-packet.d.ts.map +1 -1
- package/dist/task-packet.js +6 -1
- package/dist/task-ranker.d.ts +2 -1
- package/dist/task-ranker.d.ts.map +1 -1
- package/dist/task-ranker.js +30 -5
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +3 -0
- package/dist/why-file.d.ts.map +1 -1
- package/dist/why-file.js +13 -0
- package/package.json +17 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-recommender.d.ts","sourceRoot":"","sources":["../src/command-recommender.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"command-recommender.d.ts","sourceRoot":"","sources":["../src/command-recommender.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,0BAA0B,sCAAsC,CAAC;AAE9E,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,WAAW,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,GAAG,YAAY,CAAC;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,OAAO,0BAA0B,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,iEAAiE;IACjE,WAAW,EAAE,kBAAkB,CAAC;CACjC;AAyHD,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,qBAAqB,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,4BAA4B,CAAC,CAiKvC"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { classifyChangeIntent, ChangeIntentKind } from "./change-intent.js";
|
|
9
9
|
import { buildDiagnosticByCode, listDiagnostics } from "./failure-diagnostics.js";
|
|
10
|
+
import { rankAll } from "./task-ranker.js";
|
|
10
11
|
import { buildUncertaintyReport, } from "./uncertainty-report.js";
|
|
11
12
|
export const COMMAND_RECOMMENDER_SCHEMA = 'sharkcraft.command-recommender/v1';
|
|
12
13
|
const RECIPES = [
|
|
@@ -85,6 +86,46 @@ function safetyLevelFor(command) {
|
|
|
85
86
|
return 'runs-shell';
|
|
86
87
|
return 'read-only';
|
|
87
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Minimum `rankAll` template score to treat the shared ranker's top template as
|
|
91
|
+
* a strong, intent-confirmed structured match. Real template matches score well
|
|
92
|
+
* into double digits; unrelated templates don't match at all — so this bar
|
|
93
|
+
* cleanly separates a genuine scaffold target from noise. Above it, a keyword
|
|
94
|
+
* recipe that only overlapped a single word no longer gets to headline.
|
|
95
|
+
*/
|
|
96
|
+
const RANKER_TEMPLATE_PROMOTE_THRESHOLD = 6;
|
|
97
|
+
/**
|
|
98
|
+
* Minimum `rankAll` pipeline score to let the matched pipeline lead. Higher than
|
|
99
|
+
* the template bar: a generic catch-all pipeline scores low on noise but high on
|
|
100
|
+
* a real scaffolding task, so the bar excludes that baseline.
|
|
101
|
+
*/
|
|
102
|
+
const RANKER_PIPELINE_PROMOTE_THRESHOLD = 8;
|
|
103
|
+
const SCAFFOLD_VERBS = new Set([
|
|
104
|
+
'create', 'build', 'add', 'generate', 'scaffold', 'implement', 'make', 'new', 'introduce', 'write',
|
|
105
|
+
]);
|
|
106
|
+
/**
|
|
107
|
+
* Does the query read like create/build/scaffold work? Gate for ranker-driven
|
|
108
|
+
* `gen <template>` promotion: a strong template token-overlap on a NON-scaffold
|
|
109
|
+
* verb (e.g. "document the cli-command template") must not be routed to a
|
|
110
|
+
* generator. Mirrors the CLI's `looksLikeCreateBuild` (kept local — the
|
|
111
|
+
* inspector layer cannot import the cli layer).
|
|
112
|
+
*/
|
|
113
|
+
function looksLikeScaffolding(query) {
|
|
114
|
+
const tokens = query
|
|
115
|
+
.toLowerCase()
|
|
116
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
117
|
+
.split(/\s+/)
|
|
118
|
+
.filter((t) => t.length > 0);
|
|
119
|
+
if (tokens.length === 0)
|
|
120
|
+
return false;
|
|
121
|
+
if (SCAFFOLD_VERBS.has(tokens[0]))
|
|
122
|
+
return true;
|
|
123
|
+
for (let i = 1; i < Math.min(4, tokens.length); i++) {
|
|
124
|
+
if (SCAFFOLD_VERBS.has(tokens[i]))
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
88
129
|
export async function recommendCommands(inspection, query, options = {}) {
|
|
89
130
|
const warnings = [];
|
|
90
131
|
const trimmed = query.trim();
|
|
@@ -96,6 +137,51 @@ export async function recommendCommands(inspection, query, options = {}) {
|
|
|
96
137
|
recommendations.push({ ...rec, safetyLevel: safetyLevelFor(rec.command) });
|
|
97
138
|
}
|
|
98
139
|
}
|
|
140
|
+
// ── Ranker arbitration ────────────────────────────────────────────────
|
|
141
|
+
// A keyword recipe matches on a single overlapping word (e.g. "release" in
|
|
142
|
+
// "create a cli command for the release tooling"), which would otherwise
|
|
143
|
+
// route a scaffolding intent to unrelated review/release tooling. Consult
|
|
144
|
+
// the SAME shared ranker that `brief`/`task` use: when it confirms a concrete
|
|
145
|
+
// template/pipeline for a create/build query, promote `shrk gen <template>`
|
|
146
|
+
// (or the pipeline packet) to the HEADLINE so the recipe keyword no longer
|
|
147
|
+
// hijacks the route. Mirrors the CLI's R1 routing-hint promotion.
|
|
148
|
+
let promotedRanker;
|
|
149
|
+
if (trimmed.length > 0 && looksLikeScaffolding(trimmed)) {
|
|
150
|
+
try {
|
|
151
|
+
const ranking = rankAll(inspection, trimmed);
|
|
152
|
+
const topTemplate = ranking.templates[0];
|
|
153
|
+
const topPipeline = ranking.pipelines[0];
|
|
154
|
+
if (topTemplate && topTemplate.score >= RANKER_TEMPLATE_PROMOTE_THRESHOLD) {
|
|
155
|
+
promotedRanker = {
|
|
156
|
+
kind: 'template',
|
|
157
|
+
id: topTemplate.item.id,
|
|
158
|
+
label: topTemplate.item.name,
|
|
159
|
+
score: topTemplate.score,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
else if (topPipeline && topPipeline.score >= RANKER_PIPELINE_PROMOTE_THRESHOLD) {
|
|
163
|
+
promotedRanker = {
|
|
164
|
+
kind: 'pipeline',
|
|
165
|
+
id: topPipeline.item.id,
|
|
166
|
+
label: topPipeline.item.title,
|
|
167
|
+
score: topPipeline.score,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// The ranker is advisory — fall back to recipe/intent output on failure.
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (promotedRanker) {
|
|
176
|
+
const command = promotedRanker.kind === 'template'
|
|
177
|
+
? `shrk gen ${promotedRanker.id} <name> --dry-run`
|
|
178
|
+
: `shrk task "${trimmed.replace(/"/g, '\\"')}"`;
|
|
179
|
+
const why = promotedRanker.kind === 'template'
|
|
180
|
+
? `Ranker matched template "${promotedRanker.label}" (score ${promotedRanker.score}) — the project scaffold for this create/build task, ahead of the keyword recipe.`
|
|
181
|
+
: `Ranker matched pipeline "${promotedRanker.label}" (score ${promotedRanker.score}) — run the full task packet for this create/build task, ahead of the keyword recipe.`;
|
|
182
|
+
// Headline: unshift so it leads; dedup below keeps this first occurrence.
|
|
183
|
+
recommendations.unshift({ command, why, safetyLevel: safetyLevelFor(command) });
|
|
184
|
+
}
|
|
99
185
|
// If a stderr-like input was provided, do a diagnostic-suggest pass.
|
|
100
186
|
if (options.fromError && options.fromError.length > 0) {
|
|
101
187
|
for (const e of listDiagnostics()) {
|
|
@@ -132,11 +218,33 @@ export async function recommendCommands(inspection, query, options = {}) {
|
|
|
132
218
|
let confidence = 'medium';
|
|
133
219
|
const reasons = [];
|
|
134
220
|
const missing = [];
|
|
221
|
+
const conflicting = [];
|
|
135
222
|
const increase = [];
|
|
136
|
-
if (usedRecipe) {
|
|
223
|
+
if (usedRecipe && promotedRanker) {
|
|
224
|
+
// Divergent signals: a keyword recipe fired AND a stronger ranker
|
|
225
|
+
// template/pipeline match was promoted to the headline. Keyword overlap
|
|
226
|
+
// alone is NOT enough for HIGH — emit a medium confidence + review note so
|
|
227
|
+
// the agent confirms the corrected route rather than trusting it blindly.
|
|
228
|
+
confidence = 'medium';
|
|
229
|
+
reasons.push(`Keyword recipe matched "${trimmed}", but the shared ranker found a stronger ${promotedRanker.kind} "${promotedRanker.id}" (score ${promotedRanker.score}) and now headlines it — review which fits.`);
|
|
230
|
+
conflicting.push({
|
|
231
|
+
id: 'conflict-recipe-vs-ranker',
|
|
232
|
+
message: `Recipe keyword overlap competes with ranker ${promotedRanker.kind} "${promotedRanker.id}". The headline was routed to the ranker match; confirm the intended target.`,
|
|
233
|
+
});
|
|
234
|
+
increase.push('Tighten the recipe regex or add a routing hint so the keyword stops overlapping unrelated tooling.');
|
|
235
|
+
warnings.push(`review: recipe keyword overlap was outranked by ranker ${promotedRanker.kind} "${promotedRanker.id}" — headline routed to the scaffold; confirm before applying.`);
|
|
236
|
+
}
|
|
237
|
+
else if (usedRecipe) {
|
|
238
|
+
// Pure-recipe case (no competing ranker match) — HIGH stays appropriate.
|
|
137
239
|
confidence = 'high';
|
|
138
240
|
reasons.push(`Recipe matched the query "${trimmed}".`);
|
|
139
241
|
}
|
|
242
|
+
else if (promotedRanker) {
|
|
243
|
+
// A clean, intent-confirmed structured match with no competing keyword
|
|
244
|
+
// recipe — the ranker is the engine's confident answer.
|
|
245
|
+
confidence = 'high';
|
|
246
|
+
reasons.push(`Shared ranker matched ${promotedRanker.kind} "${promotedRanker.id}" (score ${promotedRanker.score}).`);
|
|
247
|
+
}
|
|
140
248
|
else if (recommendations.length > 0 && recommendations[0]?.why.startsWith('Intent fallback')) {
|
|
141
249
|
confidence = 'low';
|
|
142
250
|
reasons.push('No recipe matched — fell back to intent classification.');
|
|
@@ -151,6 +259,7 @@ export async function recommendCommands(inspection, query, options = {}) {
|
|
|
151
259
|
confidence,
|
|
152
260
|
reasons,
|
|
153
261
|
missingSignals: missing,
|
|
262
|
+
conflictingSignals: conflicting,
|
|
154
263
|
suggestedCommands: recommendations.slice(0, 3).map((r) => r.command),
|
|
155
264
|
safeFallbackCommand: 'shrk start-here',
|
|
156
265
|
whatWouldIncreaseConfidence: increase,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ISharkcraftInspection } from './sharkcraft-inspector.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a context `boostFor(entry)` callback from the pack search-tuning — the
|
|
4
|
+
* same tuning `shrk search` and the task ranker use. Returns the TASK-SPECIFIC
|
|
5
|
+
* (taskHint) boost only, scaled for the context score range; ambient boostTags
|
|
6
|
+
* are intentionally ignored here. Returns undefined when no tuning is loaded so
|
|
7
|
+
* buildContext skips the re-rank entirely.
|
|
8
|
+
*/
|
|
9
|
+
export declare function contextTuningBoostFor(inspection: ISharkcraftInspection, task: string): ((entry: {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly type?: unknown;
|
|
12
|
+
readonly tags?: readonly string[];
|
|
13
|
+
}) => number) | undefined;
|
|
14
|
+
//# sourceMappingURL=context-tuning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-tuning.d.ts","sourceRoot":"","sources":["../src/context-tuning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAYvE;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,MAAM,GAEV,CAAC,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,KAAK,MAAM,CAAC,GACxG,SAAS,CAoBZ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { listSearchTuning, tuningBoostFor } from "./search-tuning-registry.js";
|
|
2
|
+
// Context relevance scores are on a large scale (priority × weights, ~100–190),
|
|
3
|
+
// so the pack's small ambient boostTags (±2–3) are noise there. The meaningful
|
|
4
|
+
// signal for "this entry must surface" is a TASK-SPECIFIC taskHint boost
|
|
5
|
+
// (whenTokens-gated boostIds). We isolate it (full boost minus the
|
|
6
|
+
// token-agnostic ambient boost) and scale it so a directed taskHint boost
|
|
7
|
+
// decisively lifts the entry into its section — without disturbing the base
|
|
8
|
+
// relevance order of everything the pack did NOT explicitly target.
|
|
9
|
+
const TASK_HINT_SCALE = 100;
|
|
10
|
+
/**
|
|
11
|
+
* Build a context `boostFor(entry)` callback from the pack search-tuning — the
|
|
12
|
+
* same tuning `shrk search` and the task ranker use. Returns the TASK-SPECIFIC
|
|
13
|
+
* (taskHint) boost only, scaled for the context score range; ambient boostTags
|
|
14
|
+
* are intentionally ignored here. Returns undefined when no tuning is loaded so
|
|
15
|
+
* buildContext skips the re-rank entirely.
|
|
16
|
+
*/
|
|
17
|
+
export function contextTuningBoostFor(inspection, task) {
|
|
18
|
+
const tuning = listSearchTuning(inspection);
|
|
19
|
+
if (tuning.length === 0)
|
|
20
|
+
return undefined;
|
|
21
|
+
const tokens = task
|
|
22
|
+
.toLowerCase()
|
|
23
|
+
.split(/[^a-z0-9]+/)
|
|
24
|
+
.filter((t) => t.length > 1);
|
|
25
|
+
return (entry) => {
|
|
26
|
+
const isRule = String(entry.type).toLowerCase() === 'rule';
|
|
27
|
+
const doc = {
|
|
28
|
+
id: `${isRule ? 'rule' : 'knowledge'}:${entry.id}`,
|
|
29
|
+
kind: isRule ? 'rule' : 'knowledge',
|
|
30
|
+
...(entry.tags ? { tags: entry.tags } : {}),
|
|
31
|
+
source: 'local',
|
|
32
|
+
};
|
|
33
|
+
const full = tuningBoostFor(doc, tokens, tuning).delta;
|
|
34
|
+
const ambient = tuningBoostFor(doc, [], tuning).delta;
|
|
35
|
+
const taskHintDelta = full - ambient;
|
|
36
|
+
return taskHintDelta > 0 ? taskHintDelta * TASK_HINT_SCALE : 0;
|
|
37
|
+
};
|
|
38
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,9 @@ export * from './action-hint-diagnostics.js';
|
|
|
9
9
|
export * from './ai-readiness.js';
|
|
10
10
|
export * from './pack-doctor.js';
|
|
11
11
|
export * from './task-packet.js';
|
|
12
|
+
export * from './context-tuning.js';
|
|
12
13
|
export * from './resolve-verification-commands.js';
|
|
14
|
+
export * from './resolve-project-config.js';
|
|
13
15
|
export * from './reference-lookup.js';
|
|
14
16
|
export * from './task-ranker.js';
|
|
15
17
|
export * from './drift.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,9 @@ export * from "./action-hint-diagnostics.js";
|
|
|
9
9
|
export * from "./ai-readiness.js";
|
|
10
10
|
export * from "./pack-doctor.js";
|
|
11
11
|
export * from "./task-packet.js";
|
|
12
|
+
export * from "./context-tuning.js";
|
|
12
13
|
export * from "./resolve-verification-commands.js";
|
|
14
|
+
export * from "./resolve-project-config.js";
|
|
13
15
|
export * from "./reference-lookup.js";
|
|
14
16
|
export * from "./task-ranker.js";
|
|
15
17
|
export * from "./drift.js";
|
|
@@ -108,6 +108,22 @@ export interface IKnowledgeStaleReport {
|
|
|
108
108
|
referenceChecks: ReadonlyArray<IKnowledgeReferenceCheck>;
|
|
109
109
|
anchorChecks: ReadonlyArray<IKnowledgeAnchorCheck>;
|
|
110
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Minimal structural view of the code graph's symbol index.
|
|
113
|
+
*
|
|
114
|
+
* `GraphQueryApi.findSymbol` satisfies this shape. Inspector sits *below*
|
|
115
|
+
* `@shrkcrft/graph` in the layer order and therefore cannot import it; the
|
|
116
|
+
* gate (which lives above the graph) injects a resolver that conforms to
|
|
117
|
+
* this interface so symbol checks can resolve cross-file without an upward
|
|
118
|
+
* dependency.
|
|
119
|
+
*/
|
|
120
|
+
export interface ISymbolGraphResolver {
|
|
121
|
+
/** Return the declaration nodes for `name` (project-relative `path`). */
|
|
122
|
+
findSymbol(name: string): ReadonlyArray<{
|
|
123
|
+
path?: string;
|
|
124
|
+
line?: number;
|
|
125
|
+
}>;
|
|
126
|
+
}
|
|
111
127
|
export interface IKnowledgeStaleCheckOptions {
|
|
112
128
|
/** When provided, only entries referencing one of these files are checked. */
|
|
113
129
|
changedFiles?: ReadonlyArray<string>;
|
|
@@ -119,6 +135,13 @@ export interface IKnowledgeStaleCheckOptions {
|
|
|
119
135
|
* leads.
|
|
120
136
|
*/
|
|
121
137
|
renameStrategy?: RenameStrategy;
|
|
138
|
+
/**
|
|
139
|
+
* Optional code-graph resolver. When supplied, symbol references are
|
|
140
|
+
* resolved cross-file via the graph's global symbol index (so a *moved*
|
|
141
|
+
* symbol is distinguished from a deleted one) and only fall back to the
|
|
142
|
+
* single-file AST scan when the graph cannot answer.
|
|
143
|
+
*/
|
|
144
|
+
graph?: ISymbolGraphResolver;
|
|
122
145
|
}
|
|
123
146
|
export declare function buildKnowledgeStaleReport(inspection: ISharkcraftInspection, options?: IKnowledgeStaleCheckOptions): IKnowledgeStaleReport;
|
|
124
147
|
//# sourceMappingURL=knowledge-stale.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-stale.d.ts","sourceRoot":"","sources":["../src/knowledge-stale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EACV,gBAAgB,EAEhB,mBAAmB,EAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAIvE,eAAO,MAAM,sBAAsB,kCAAkC,CAAC;AAEtE,oBAAY,qBAAqB;IAC/B,EAAE,OAAO;IACT,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,oBAAY,gBAAgB;IAC1B,KAAK,UAAU;IACf,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED;;;;;;;;;GASG;AACH,oBAAY,cAAc;IACxB,MAAM,WAAW;IACjB,IAAI,SAAS;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,UAAU,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC9C,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,qBAAqB,CAAC;IAC/B,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,sBAAsB,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,eAAe,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;IACzD,YAAY,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,2BAA2B;IAC1C,8EAA8E;IAC9E,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"knowledge-stale.d.ts","sourceRoot":"","sources":["../src/knowledge-stale.ts"],"names":[],"mappings":"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"}
|
package/dist/knowledge-stale.js
CHANGED
|
@@ -131,7 +131,10 @@ function packageExists(inspection, id) {
|
|
|
131
131
|
const rel = id.startsWith('@') ? id.split('/')[1] ?? '' : id;
|
|
132
132
|
return dirExists(inspection.projectRoot, `packages/${rel}`);
|
|
133
133
|
}
|
|
134
|
-
function
|
|
134
|
+
function normalizeRel(p) {
|
|
135
|
+
return p.split(/[\\/]/).join('/').replace(/^\.\//, '');
|
|
136
|
+
}
|
|
137
|
+
function checkSymbolReference(projectRoot, ref, graph) {
|
|
135
138
|
const sym = ref.symbol ?? '';
|
|
136
139
|
if (!sym) {
|
|
137
140
|
return {
|
|
@@ -140,6 +143,52 @@ function checkSymbolReference(projectRoot, ref) {
|
|
|
140
143
|
message: 'Symbol reference has no `symbol` field.',
|
|
141
144
|
};
|
|
142
145
|
}
|
|
146
|
+
// Graph-resolved, cross-file path (preferred when a graph is supplied).
|
|
147
|
+
// A single-file AST scan cannot tell a *moved* symbol from a deleted one;
|
|
148
|
+
// the graph's global symbol index can, so consult it first.
|
|
149
|
+
if (graph) {
|
|
150
|
+
const decl = graph
|
|
151
|
+
.findSymbol(sym)
|
|
152
|
+
.map((n) => n.path)
|
|
153
|
+
.filter((p) => typeof p === 'string' && p.length > 0)
|
|
154
|
+
.map(normalizeRel);
|
|
155
|
+
if (decl.length > 0) {
|
|
156
|
+
if (ref.path) {
|
|
157
|
+
const target = normalizeRel(ref.path);
|
|
158
|
+
if (decl.includes(target)) {
|
|
159
|
+
return {
|
|
160
|
+
outcome: ReferenceCheckOutcome.Ok,
|
|
161
|
+
confidence: SymbolConfidence.Exact,
|
|
162
|
+
message: `\`${sym}\` resolves to ${ref.path} (graph).`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// Symbol exists but no longer at the pinned file — it moved.
|
|
166
|
+
return {
|
|
167
|
+
outcome: ReferenceCheckOutcome.Stale,
|
|
168
|
+
confidence: SymbolConfidence.Missing,
|
|
169
|
+
message: `Symbol \`${sym}\` is no longer in ${ref.path}; the graph resolves it to ${decl
|
|
170
|
+
.slice(0, 3)
|
|
171
|
+
.join(', ')}.`,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// No file pin, but the graph resolved it cross-file.
|
|
175
|
+
return {
|
|
176
|
+
outcome: ReferenceCheckOutcome.Ok,
|
|
177
|
+
confidence: SymbolConfidence.Probable,
|
|
178
|
+
message: `\`${sym}\` resolves via the code graph to ${decl.slice(0, 3).join(', ')}.`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// Absent from the graph. The graph may be partial (locals, unindexed
|
|
182
|
+
// languages), so fall through to the AST/text backstop when a file is
|
|
183
|
+
// pinned; otherwise we cannot verify.
|
|
184
|
+
if (!ref.path) {
|
|
185
|
+
return {
|
|
186
|
+
outcome: ReferenceCheckOutcome.Unknown,
|
|
187
|
+
confidence: SymbolConfidence.Unknown,
|
|
188
|
+
message: `Symbol reference \`${sym}\` has no file pin and is absent from the code graph; stale-check cannot verify.`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
143
192
|
const file = ref.path ? nodePath.join(projectRoot, ref.path) : null;
|
|
144
193
|
if (file) {
|
|
145
194
|
if (!existsSync(file)) {
|
|
@@ -230,7 +279,7 @@ function checkSymbolReference(projectRoot, ref) {
|
|
|
230
279
|
function escapeRe(s) {
|
|
231
280
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
232
281
|
}
|
|
233
|
-
function checkReference(inspection, ref) {
|
|
282
|
+
function checkReference(inspection, ref, graph) {
|
|
234
283
|
const projectRoot = inspection.projectRoot;
|
|
235
284
|
switch (ref.kind) {
|
|
236
285
|
case 'file': {
|
|
@@ -254,7 +303,7 @@ function checkReference(inspection, ref) {
|
|
|
254
303
|
};
|
|
255
304
|
}
|
|
256
305
|
case 'symbol': {
|
|
257
|
-
const r = checkSymbolReference(projectRoot, ref);
|
|
306
|
+
const r = checkSymbolReference(projectRoot, ref, graph);
|
|
258
307
|
return r;
|
|
259
308
|
}
|
|
260
309
|
case 'command': {
|
|
@@ -415,7 +464,7 @@ export function buildKnowledgeStaleReport(inspection, options = {}) {
|
|
|
415
464
|
}
|
|
416
465
|
for (const ref of entry.references ?? []) {
|
|
417
466
|
totalReferences += 1;
|
|
418
|
-
const result = checkReference(inspection, ref);
|
|
467
|
+
const result = checkReference(inspection, ref, options.graph);
|
|
419
468
|
const outcome = result.outcome;
|
|
420
469
|
if (outcome === ReferenceCheckOutcome.Ok)
|
|
421
470
|
counts.ok += 1;
|
|
@@ -503,7 +552,7 @@ export function buildKnowledgeStaleReport(inspection, options = {}) {
|
|
|
503
552
|
}
|
|
504
553
|
for (const anchor of entry.anchors ?? []) {
|
|
505
554
|
totalAnchors += 1;
|
|
506
|
-
const inspected = checkAnchor(inspection, anchor);
|
|
555
|
+
const inspected = checkAnchor(inspection, anchor, options.graph);
|
|
507
556
|
anchorChecks.push({
|
|
508
557
|
entryId: entry.id,
|
|
509
558
|
anchor,
|
|
@@ -838,7 +887,7 @@ function walkForSymbols(dir, projectRoot, out) {
|
|
|
838
887
|
}
|
|
839
888
|
}
|
|
840
889
|
}
|
|
841
|
-
function checkAnchor(inspection, anchor) {
|
|
890
|
+
function checkAnchor(inspection, anchor, graph) {
|
|
842
891
|
switch (anchor.kind) {
|
|
843
892
|
case 'file':
|
|
844
893
|
if (!anchor.path) {
|
|
@@ -849,7 +898,7 @@ function checkAnchor(inspection, anchor) {
|
|
|
849
898
|
}
|
|
850
899
|
return { outcome: ReferenceCheckOutcome.Stale, message: `anchor file missing: ${anchor.path}` };
|
|
851
900
|
case 'symbol':
|
|
852
|
-
return checkSymbolAnchor(inspection, anchor);
|
|
901
|
+
return checkSymbolAnchor(inspection, anchor, graph);
|
|
853
902
|
case 'command':
|
|
854
903
|
if (anchor.targetId && commandExistsInInspection(inspection, anchor.targetId)) {
|
|
855
904
|
return { outcome: ReferenceCheckOutcome.Ok, message: `command exists: ${anchor.targetId}` };
|
|
@@ -882,11 +931,11 @@ function checkAnchor(inspection, anchor) {
|
|
|
882
931
|
return { outcome: ReferenceCheckOutcome.Stale, message: `policy anchor unresolved: ${anchor.targetId ?? '?'}` };
|
|
883
932
|
}
|
|
884
933
|
}
|
|
885
|
-
function checkSymbolAnchor(inspection, anchor) {
|
|
934
|
+
function checkSymbolAnchor(inspection, anchor, graph) {
|
|
886
935
|
const r = checkSymbolReference(inspection.projectRoot, {
|
|
887
936
|
kind: 'symbol',
|
|
888
937
|
symbol: anchor.symbol,
|
|
889
938
|
...(anchor.path ? { path: anchor.path } : {}),
|
|
890
|
-
});
|
|
939
|
+
}, graph);
|
|
891
940
|
return { outcome: r.outcome, message: r.message };
|
|
892
941
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monorepo-onboarding.d.ts","sourceRoot":"","sources":["../src/monorepo-onboarding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACpC,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,qDAAqD;IACrD,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,2BAA2B;IAC3B,IAAI,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClC,+BAA+B;IAC/B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACtC,2BAA2B;IAC3B,IAAI,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClC,8DAA8D;IAC9D,wBAAwB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,sCAAsC;IACtC,2BAA2B,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAClE,+DAA+D;IAC/D,kBAAkB,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC1D,yDAAyD;IACzD,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,qCAAqC;IACrC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAmBD,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,iBAAiB,EACrB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,GAC9C,gBAAgB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"monorepo-onboarding.d.ts","sourceRoot":"","sources":["../src/monorepo-onboarding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACpC,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,qDAAqD;IACrD,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,2BAA2B;IAC3B,IAAI,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClC,+BAA+B;IAC/B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACtC,2BAA2B;IAC3B,IAAI,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClC,8DAA8D;IAC9D,wBAAwB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,sCAAsC;IACtC,2BAA2B,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAClE,+DAA+D;IAC/D,kBAAkB,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC1D,yDAAyD;IACzD,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,qCAAqC;IACrC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAmBD,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,iBAAiB,EACrB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,GAC9C,gBAAgB,GAAG,IAAI,CAsFzB"}
|
|
@@ -31,17 +31,42 @@ export function buildMonorepoSummary(ws, subDirs) {
|
|
|
31
31
|
libs: [],
|
|
32
32
|
};
|
|
33
33
|
let scanned = 0;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
34
|
+
if (workspacesArr.length > 0) {
|
|
35
|
+
// Drive discovery from the declared `workspaces` globs so non-standard
|
|
36
|
+
// layouts (modules/*) and grouped layouts (packages/*/*) resolve to the
|
|
37
|
+
// real package directories rather than the hardcoded apps|packages|libs
|
|
38
|
+
// immediate children.
|
|
39
|
+
const seenPaths = new Set();
|
|
40
|
+
outer: for (const glob of workspacesArr) {
|
|
41
|
+
const leadSegment = glob.replace(/\\/g, '/').split('/').filter((s) => s.length > 0)[0] ?? '';
|
|
42
|
+
const groupKey = classifyGroup(leadSegment);
|
|
43
|
+
for (const rel of expandWorkspaceGlob(ws.projectRoot, glob)) {
|
|
44
|
+
if (scanned >= PACKAGE_LIMIT)
|
|
45
|
+
break outer;
|
|
46
|
+
if (seenPaths.has(rel))
|
|
47
|
+
continue;
|
|
48
|
+
seenPaths.add(rel);
|
|
49
|
+
const full = nodePath.join(ws.projectRoot, ...rel.split('/'));
|
|
50
|
+
groups[groupKey].push(describePackage(full, rel, groupKey));
|
|
51
|
+
scanned += 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// No `workspaces` field (e.g. Nx) — fall back to scanning the
|
|
57
|
+
// conventional apps|packages|libs immediate children.
|
|
58
|
+
for (const g of GROUPS) {
|
|
59
|
+
const children = subDirs.get(g.dir) ?? [];
|
|
60
|
+
for (const child of children) {
|
|
61
|
+
if (scanned >= PACKAGE_LIMIT)
|
|
62
|
+
break;
|
|
63
|
+
const rel = nodePath.posix.join(g.dir, child);
|
|
64
|
+
const full = nodePath.join(ws.projectRoot, g.dir, child);
|
|
65
|
+
if (!statSafeIsDir(full))
|
|
66
|
+
continue;
|
|
67
|
+
groups[g.key].push(describePackage(full, rel, g.key));
|
|
68
|
+
scanned += 1;
|
|
69
|
+
}
|
|
45
70
|
}
|
|
46
71
|
}
|
|
47
72
|
const rootVerificationCommands = buildRootVerificationCommands(ws);
|
|
@@ -78,6 +103,89 @@ export function buildMonorepoSummary(ws, subDirs) {
|
|
|
78
103
|
};
|
|
79
104
|
}
|
|
80
105
|
// ── Helpers ──────────────────────────────────────────────────────────────
|
|
106
|
+
const WORKSPACE_IGNORE_DIRS = new Set([
|
|
107
|
+
'node_modules',
|
|
108
|
+
'.git',
|
|
109
|
+
'dist',
|
|
110
|
+
'build',
|
|
111
|
+
'.cache',
|
|
112
|
+
'.nx',
|
|
113
|
+
'.turbo',
|
|
114
|
+
'coverage',
|
|
115
|
+
]);
|
|
116
|
+
/** Classify a workspace glob into a group by its leading path segment. */
|
|
117
|
+
function classifyGroup(leadSegment) {
|
|
118
|
+
if (leadSegment === 'apps')
|
|
119
|
+
return 'apps';
|
|
120
|
+
if (leadSegment === 'libs')
|
|
121
|
+
return 'libs';
|
|
122
|
+
return 'packages';
|
|
123
|
+
}
|
|
124
|
+
function listChildDirs(dir) {
|
|
125
|
+
try {
|
|
126
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
127
|
+
.filter((e) => e.isDirectory() && !WORKSPACE_IGNORE_DIRS.has(e.name))
|
|
128
|
+
.map((e) => e.name)
|
|
129
|
+
.sort(); // deterministic regardless of filesystem order
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function hasPackageJson(dir) {
|
|
136
|
+
try {
|
|
137
|
+
return existsSync(nodePath.join(dir, 'package.json'));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Expand a `workspaces` glob to the directories that actually contain a
|
|
145
|
+
* `package.json`. Handles the simple cases the overwhelming majority of
|
|
146
|
+
* monorepos use: an exact path, a one-level wildcard ("dir" + slash + star),
|
|
147
|
+
* and a two-level wildcard (grouped packages). Returns relative posix-style
|
|
148
|
+
* paths. Anything more exotic (recursive globstars, or fixed segments after a
|
|
149
|
+
* wildcard) is skipped rather than guessed.
|
|
150
|
+
*/
|
|
151
|
+
function expandWorkspaceGlob(projectRoot, glob) {
|
|
152
|
+
const segments = glob
|
|
153
|
+
.replace(/\\/g, '/')
|
|
154
|
+
.replace(/\/+$/, '')
|
|
155
|
+
.split('/')
|
|
156
|
+
.filter((s) => s.length > 0);
|
|
157
|
+
if (segments.length === 0)
|
|
158
|
+
return [];
|
|
159
|
+
const starIdx = segments.findIndex((s) => s.includes('*'));
|
|
160
|
+
if (starIdx === -1) {
|
|
161
|
+
// Exact path, e.g. "packages/core".
|
|
162
|
+
const rel = segments.join('/');
|
|
163
|
+
return hasPackageJson(nodePath.join(projectRoot, ...segments)) ? [rel] : [];
|
|
164
|
+
}
|
|
165
|
+
const wildcardSegments = segments.slice(starIdx);
|
|
166
|
+
// Only the pure trailing-wildcard cases `dir/*` and `dir/*/*`.
|
|
167
|
+
if (wildcardSegments.length > 2 || !wildcardSegments.every((s) => s === '*')) {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
const baseSegments = segments.slice(0, starIdx);
|
|
171
|
+
const baseDir = nodePath.join(projectRoot, ...baseSegments);
|
|
172
|
+
const out = [];
|
|
173
|
+
for (const first of listChildDirs(baseDir)) {
|
|
174
|
+
if (wildcardSegments.length === 1) {
|
|
175
|
+
if (hasPackageJson(nodePath.join(baseDir, first))) {
|
|
176
|
+
out.push([...baseSegments, first].join('/'));
|
|
177
|
+
}
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const mid = nodePath.join(baseDir, first);
|
|
181
|
+
for (const second of listChildDirs(mid)) {
|
|
182
|
+
if (hasPackageJson(nodePath.join(mid, second))) {
|
|
183
|
+
out.push([...baseSegments, first, second].join('/'));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return out;
|
|
188
|
+
}
|
|
81
189
|
function statSafeIsDir(p) {
|
|
82
190
|
try {
|
|
83
191
|
return existsSync(p) && statSync(p).isDirectory();
|
|
@@ -229,7 +337,9 @@ function buildNotes(ws, groups) {
|
|
|
229
337
|
out.push('package.json workspaces detected.');
|
|
230
338
|
}
|
|
231
339
|
if (groups.apps.length === 0 && groups.packages.length === 0 && groups.libs.length === 0) {
|
|
232
|
-
|
|
340
|
+
// Discovery truly found nothing — no workspace package carried a
|
|
341
|
+
// package.json under any declared glob (or the GROUPS fallback scan).
|
|
342
|
+
out.push('Monorepo signals detected but no workspace packages with a package.json were discovered — keep onboarding bounded.');
|
|
233
343
|
}
|
|
234
344
|
return out;
|
|
235
345
|
}
|
package/dist/onboarding.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,gBAAgB,EAEhB,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAIlC,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,yBAAyB,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,MAAM,EACF,cAAc,GACd,UAAU,GACV,kBAAkB,GAClB,SAAS,GACT,WAAW,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,cAAc,CAAC;IACjD,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACtC,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,yBAAyB,CAAC;IAC1C,yDAAyD;IACzD,kBAAkB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACrD,gDAAgD;IAChD,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,uBAAuB,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC5D,4BAA4B,EAAE,SAAS,4BAA4B,EAAE,CAAC;IACtE,qBAAqB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACxD,0BAA0B,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAClE,aAAa,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,iBAAiB,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,0EAA0E;IAC1E,wBAAwB,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC9D,sEAAsE;IACtE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,gDAAgD;IAChD,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,SAAS,EAAE,kBAAkB,CAAC;IAC9B;;;OAGG;IACH,eAAe,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,2BAA2B;IAC1C,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAID,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE,2BAAgC,GACxC,eAAe,
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,gBAAgB,EAEhB,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAIlC,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,yBAAyB,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,MAAM,EACF,cAAc,GACd,UAAU,GACV,kBAAkB,GAClB,SAAS,GACT,WAAW,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,cAAc,CAAC;IACjD,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACtC,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,yBAAyB,CAAC;IAC1C,yDAAyD;IACzD,kBAAkB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACrD,gDAAgD;IAChD,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,uBAAuB,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC5D,4BAA4B,EAAE,SAAS,4BAA4B,EAAE,CAAC;IACtE,qBAAqB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACxD,0BAA0B,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAClE,aAAa,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,iBAAiB,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,0EAA0E;IAC1E,wBAAwB,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC9D,sEAAsE;IACtE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,gDAAgD;IAChD,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,SAAS,EAAE,kBAAkB,CAAC;IAC9B;;;OAGG;IACH,eAAe,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,2BAA2B;IAC1C,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAID,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE,2BAAgC,GACxC,eAAe,CAgFjB;AA8ED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,iBAAiB,EACrB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,GAC9C,uBAAuB,EAAE,CA2C3B;AAoBD,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,iBAAiB,GACpB,4BAA4B,EAAE,CAqBhC;AA4BD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,GAC/C,qBAAqB,EAAE,CAMzB;AAmFD,MAAM,WAAW,+BAA+B;IAC9C,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,+BAAoC,GAC5C,0BAA0B,EAAE,CAmC9B;AAID,wBAAgB,UAAU,CAAC,EAAE,EAAE,iBAAiB,GAAG,aAAa,EAAE,CAsHjE;AAID,wBAAgB,cAAc,CAC5B,EAAE,EAAE,iBAAiB,EACrB,YAAY,EAAE,SAAS,4BAA4B,EAAE,GACpD,iBAAiB,EAAE,CA4DrB;AAID,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,GAClB,wBAAwB,EAAE,CAyB5B"}
|