@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.
Files changed (63) hide show
  1. package/dist/command-recommender.d.ts.map +1 -1
  2. package/dist/command-recommender.js +110 -1
  3. package/dist/context-tuning.d.ts +14 -0
  4. package/dist/context-tuning.d.ts.map +1 -0
  5. package/dist/context-tuning.js +38 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -0
  9. package/dist/knowledge-stale.d.ts +23 -0
  10. package/dist/knowledge-stale.d.ts.map +1 -1
  11. package/dist/knowledge-stale.js +58 -9
  12. package/dist/monorepo-onboarding.d.ts.map +1 -1
  13. package/dist/monorepo-onboarding.js +122 -12
  14. package/dist/onboarding.d.ts.map +1 -1
  15. package/dist/onboarding.js +79 -18
  16. package/dist/pack-doctor.d.ts +8 -1
  17. package/dist/pack-doctor.d.ts.map +1 -1
  18. package/dist/pack-doctor.js +110 -3
  19. package/dist/pack-quality-score.d.ts.map +1 -1
  20. package/dist/pack-quality-score.js +7 -8
  21. package/dist/pack-release-check.d.ts.map +1 -1
  22. package/dist/pack-release-check.js +23 -20
  23. package/dist/pack-signature-status.d.ts +9 -3
  24. package/dist/pack-signature-status.d.ts.map +1 -1
  25. package/dist/pack-signature-status.js +13 -2
  26. package/dist/plan-simulation.d.ts.map +1 -1
  27. package/dist/plan-simulation.js +26 -12
  28. package/dist/registry-lifecycle.d.ts +8 -0
  29. package/dist/registry-lifecycle.d.ts.map +1 -1
  30. package/dist/registry-lifecycle.js +21 -3
  31. package/dist/resolve-project-config.d.ts +26 -0
  32. package/dist/resolve-project-config.d.ts.map +1 -0
  33. package/dist/resolve-project-config.js +128 -0
  34. package/dist/resolve-verification-commands.d.ts +7 -0
  35. package/dist/resolve-verification-commands.d.ts.map +1 -1
  36. package/dist/resolve-verification-commands.js +53 -4
  37. package/dist/review-packet.d.ts +8 -0
  38. package/dist/review-packet.d.ts.map +1 -1
  39. package/dist/review-packet.js +11 -12
  40. package/dist/sharkcraft-inspector.d.ts.map +1 -1
  41. package/dist/sharkcraft-inspector.js +28 -2
  42. package/dist/spec/__tests__/spec-evidence.test.d.ts +2 -0
  43. package/dist/spec/__tests__/spec-evidence.test.d.ts.map +1 -0
  44. package/dist/spec/__tests__/spec-evidence.test.js +81 -0
  45. package/dist/spec/spec-evidence.d.ts +62 -0
  46. package/dist/spec/spec-evidence.d.ts.map +1 -0
  47. package/dist/spec/spec-evidence.js +215 -0
  48. package/dist/spec/spec-review.d.ts +1 -0
  49. package/dist/spec/spec-review.d.ts.map +1 -1
  50. package/dist/spec/spec-review.js +5 -0
  51. package/dist/symbol-index.d.ts +9 -0
  52. package/dist/symbol-index.d.ts.map +1 -1
  53. package/dist/symbol-index.js +6 -0
  54. package/dist/task-packet.d.ts.map +1 -1
  55. package/dist/task-packet.js +6 -1
  56. package/dist/task-ranker.d.ts +2 -1
  57. package/dist/task-ranker.d.ts.map +1 -1
  58. package/dist/task-ranker.js +30 -5
  59. package/dist/test-runner.d.ts.map +1 -1
  60. package/dist/test-runner.js +3 -0
  61. package/dist/why-file.d.ts.map +1 -1
  62. package/dist/why-file.js +13 -0
  63. package/package.json +17 -17
@@ -1 +1 @@
1
- {"version":3,"file":"command-recommender.d.ts","sourceRoot":"","sources":["../src/command-recommender.ts"],"names":[],"mappings":"AASA,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;AAgFD,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,CAoFvC"}
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';
@@ -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;CACjC;AAwWD,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE,2BAAgC,GACxC,qBAAqB,CAgJvB"}
1
+ {"version":3,"file":"knowledge-stale.d.ts","sourceRoot":"","sources":["../src/knowledge-stale.ts"],"names":[],"mappings":"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"}
@@ -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 checkSymbolReference(projectRoot, ref) {
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,CA+DzB"}
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
- for (const g of GROUPS) {
35
- const children = subDirs.get(g.dir) ?? [];
36
- for (const child of children) {
37
- if (scanned >= PACKAGE_LIMIT)
38
- break;
39
- const rel = nodePath.posix.join(g.dir, child);
40
- const full = nodePath.join(ws.projectRoot, g.dir, child);
41
- if (!statSafeIsDir(full))
42
- continue;
43
- groups[g.key].push(describePackage(full, rel, g.key));
44
- scanned += 1;
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
- out.push('Monorepo signals detected but no apps/packages/libs directories keep onboarding bounded.');
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
  }
@@ -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,CAuEjB;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,CAKzB;AAqDD,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,CAyFjE;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"}
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"}