lsp-intelligence 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dist/adapters/express/index.d.ts +9 -0
  2. package/dist/adapters/express/index.js +46 -0
  3. package/dist/adapters/express/index.js.map +1 -0
  4. package/dist/adapters/next/index.d.ts +10 -0
  5. package/dist/adapters/next/index.js +67 -0
  6. package/dist/adapters/next/index.js.map +1 -0
  7. package/dist/adapters/react/index.d.ts +11 -0
  8. package/dist/adapters/react/index.js +133 -0
  9. package/dist/adapters/react/index.js.map +1 -0
  10. package/dist/adapters/registry.d.ts +22 -0
  11. package/dist/adapters/registry.js +101 -0
  12. package/dist/adapters/registry.js.map +1 -0
  13. package/dist/adapters/types.d.ts +97 -0
  14. package/dist/adapters/types.js +2 -0
  15. package/dist/adapters/types.js.map +1 -0
  16. package/dist/analysis/ts/applyVirtualEdit.d.ts +27 -0
  17. package/dist/analysis/ts/applyVirtualEdit.js +235 -0
  18. package/dist/analysis/ts/applyVirtualEdit.js.map +1 -0
  19. package/dist/analysis/ts/changeRecipes.d.ts +52 -0
  20. package/dist/analysis/ts/changeRecipes.js +14 -0
  21. package/dist/analysis/ts/changeRecipes.js.map +1 -0
  22. package/dist/analysis/ts/compatibility.d.ts +54 -0
  23. package/dist/analysis/ts/compatibility.js +113 -0
  24. package/dist/analysis/ts/compatibility.js.map +1 -0
  25. package/dist/analysis/ts/diffDeclarationShape.d.ts +26 -0
  26. package/dist/analysis/ts/diffDeclarationShape.js +114 -0
  27. package/dist/analysis/ts/diffDeclarationShape.js.map +1 -0
  28. package/dist/analysis/ts/exhaustiveness.d.ts +49 -0
  29. package/dist/analysis/ts/exhaustiveness.js +158 -0
  30. package/dist/analysis/ts/exhaustiveness.js.map +1 -0
  31. package/dist/analysis/ts/extractDeclarationShape.d.ts +30 -0
  32. package/dist/analysis/ts/extractDeclarationShape.js +127 -0
  33. package/dist/analysis/ts/extractDeclarationShape.js.map +1 -0
  34. package/dist/analysis/ts/extractExports.d.ts +19 -0
  35. package/dist/analysis/ts/extractExports.js +178 -0
  36. package/dist/analysis/ts/extractExports.js.map +1 -0
  37. package/dist/analysis/ts/extractRoutes.d.ts +12 -0
  38. package/dist/analysis/ts/extractRoutes.js +165 -0
  39. package/dist/analysis/ts/extractRoutes.js.map +1 -0
  40. package/dist/analysis/ts/parseSourceFile.d.ts +5 -1
  41. package/dist/analysis/ts/parseSourceFile.js +6 -2
  42. package/dist/analysis/ts/parseSourceFile.js.map +1 -1
  43. package/dist/analysis/ts/program/CheckerQueries.d.ts +56 -0
  44. package/dist/analysis/ts/program/CheckerQueries.js +187 -0
  45. package/dist/analysis/ts/program/CheckerQueries.js.map +1 -0
  46. package/dist/analysis/ts/program/ProgramManager.d.ts +27 -0
  47. package/dist/analysis/ts/program/ProgramManager.js +147 -0
  48. package/dist/analysis/ts/program/ProgramManager.js.map +1 -0
  49. package/dist/analysis/ts/program/TypeFacts.d.ts +58 -0
  50. package/dist/analysis/ts/program/TypeFacts.js +68 -0
  51. package/dist/analysis/ts/program/TypeFacts.js.map +1 -0
  52. package/dist/analysis/ts/typeState.d.ts +46 -0
  53. package/dist/analysis/ts/typeState.js +108 -0
  54. package/dist/analysis/ts/typeState.js.map +1 -0
  55. package/dist/ast/diffDeclarationShapes.js +25 -11
  56. package/dist/ast/diffDeclarationShapes.js.map +1 -1
  57. package/dist/ast/extractExportDeclarations.js +8 -3
  58. package/dist/ast/extractExportDeclarations.js.map +1 -1
  59. package/dist/cache/CacheSchema.d.ts +30 -0
  60. package/dist/cache/CacheSchema.js +9 -0
  61. package/dist/cache/CacheSchema.js.map +1 -0
  62. package/dist/cache/CacheStore.d.ts +22 -0
  63. package/dist/cache/CacheStore.js +111 -0
  64. package/dist/cache/CacheStore.js.map +1 -0
  65. package/dist/cache/SemanticCache.d.ts +38 -0
  66. package/dist/cache/SemanticCache.js +87 -0
  67. package/dist/cache/SemanticCache.js.map +1 -0
  68. package/dist/cache/SnapshotFingerprint.d.ts +17 -0
  69. package/dist/cache/SnapshotFingerprint.js +14 -0
  70. package/dist/cache/SnapshotFingerprint.js.map +1 -0
  71. package/dist/engine/DocumentManager.d.ts +16 -0
  72. package/dist/engine/DocumentManager.js +32 -0
  73. package/dist/engine/DocumentManager.js.map +1 -1
  74. package/dist/index.js +6 -0
  75. package/dist/index.js.map +1 -1
  76. package/dist/search/adapters/http.d.ts +9 -3
  77. package/dist/search/adapters/http.js +7 -52
  78. package/dist/search/adapters/http.js.map +1 -1
  79. package/dist/search/adapters/react.d.ts +8 -8
  80. package/dist/search/adapters/react.js +3 -88
  81. package/dist/search/adapters/react.js.map +1 -1
  82. package/dist/search/adapters/registry.d.ts +7 -4
  83. package/dist/search/adapters/registry.js +7 -17
  84. package/dist/search/adapters/registry.js.map +1 -1
  85. package/dist/search/expand/graphExpansion.js +47 -14
  86. package/dist/search/expand/graphExpansion.js.map +1 -1
  87. package/dist/search/index/declarationIndex.d.ts +3 -1
  88. package/dist/search/index/declarationIndex.js +4 -2
  89. package/dist/search/index/declarationIndex.js.map +1 -1
  90. package/dist/search/index/routeIndex.d.ts +6 -0
  91. package/dist/search/index/routeIndex.js +19 -0
  92. package/dist/search/index/routeIndex.js.map +1 -0
  93. package/dist/search/index/usageIndex.d.ts +3 -1
  94. package/dist/search/index/usageIndex.js +4 -2
  95. package/dist/search/index/usageIndex.js.map +1 -1
  96. package/dist/search/index/workspaceIndex.d.ts +7 -1
  97. package/dist/search/index/workspaceIndex.js +54 -14
  98. package/dist/search/index/workspaceIndex.js.map +1 -1
  99. package/dist/search/query/compileEffectiveSearchSpec.js +9 -0
  100. package/dist/search/query/compileEffectiveSearchSpec.js.map +1 -1
  101. package/dist/search/query/parseQuery.js +5 -1
  102. package/dist/search/query/parseQuery.js.map +1 -1
  103. package/dist/search/query/planQuery.js +14 -4
  104. package/dist/search/query/planQuery.js.map +1 -1
  105. package/dist/search/ranking/mergeCandidates.d.ts +1 -0
  106. package/dist/search/ranking/mergeCandidates.js +16 -0
  107. package/dist/search/ranking/mergeCandidates.js.map +1 -1
  108. package/dist/search/retrievers/routeRetriever.d.ts +7 -0
  109. package/dist/search/retrievers/routeRetriever.js +64 -0
  110. package/dist/search/retrievers/routeRetriever.js.map +1 -0
  111. package/dist/search/types.d.ts +16 -4
  112. package/dist/session/OverlayStore.d.ts +15 -0
  113. package/dist/session/OverlayStore.js +46 -0
  114. package/dist/session/OverlayStore.js.map +1 -0
  115. package/dist/session/SnapshotResolver.d.ts +31 -0
  116. package/dist/session/SnapshotResolver.js +50 -0
  117. package/dist/session/SnapshotResolver.js.map +1 -0
  118. package/dist/session/WorkspaceSnapshot.d.ts +21 -0
  119. package/dist/session/WorkspaceSnapshot.js +2 -0
  120. package/dist/session/WorkspaceSnapshot.js.map +1 -0
  121. package/dist/tools/composites/apiGuard.d.ts +4 -0
  122. package/dist/tools/composites/apiGuard.js +158 -24
  123. package/dist/tools/composites/apiGuard.js.map +1 -1
  124. package/dist/tools/composites/findCode.js +12 -2
  125. package/dist/tools/composites/findCode.js.map +1 -1
  126. package/dist/tools/composites/rootCauseTrace.js +89 -13
  127. package/dist/tools/composites/rootCauseTrace.js.map +1 -1
  128. package/dist/workflows/simulateChange.d.ts +44 -0
  129. package/dist/workflows/simulateChange.js +194 -0
  130. package/dist/workflows/simulateChange.js.map +1 -0
  131. package/dist/workflows/verifyChangeSet.d.ts +58 -0
  132. package/dist/workflows/verifyChangeSet.js +300 -0
  133. package/dist/workflows/verifyChangeSet.js.map +1 -0
  134. package/package.json +6 -4
@@ -0,0 +1,9 @@
1
+ import type { IntelligenceAdapter } from '../types.js';
2
+ /**
3
+ * Express/Fastify IntelligenceAdapter v2.
4
+ *
5
+ * Capabilities:
6
+ * - detect: route definition queries
7
+ * - graph.denylist: Express framework functions not useful as implementation roots
8
+ */
9
+ export declare const expressAdapter: IntelligenceAdapter;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Express/Fastify IntelligenceAdapter v2.
3
+ *
4
+ * Capabilities:
5
+ * - detect: route definition queries
6
+ * - graph.denylist: Express framework functions not useful as implementation roots
7
+ */
8
+ export const expressAdapter = {
9
+ id: 'express',
10
+ detect(ir) {
11
+ if (!ir.traits.routeLike)
12
+ return [];
13
+ const nlTokens = ir.nlTokens;
14
+ const recipes = [];
15
+ const isRouteDef = nlTokens.some(t => ['route', 'endpoint', 'handler', 'defined', 'registered', 'handled'].includes(t)) || ir.phrases.some(p => p.includes('is handled') || p.includes('is defined'));
16
+ if (isRouteDef) {
17
+ recipes.push({
18
+ id: 'express.route-definition',
19
+ adapter: 'express',
20
+ retrievers: ['route', 'behavior', 'regex'],
21
+ exactIdentifiers: [],
22
+ regexes: [
23
+ { id: 'express-route', pattern: '(?:app|router)\\.(?:get|post|put|delete|patch|all|use)\\s*\\(', flags: 'gi' },
24
+ { id: 'fastify-route', pattern: 'fastify\\.(?:get|post|put|delete|patch)\\s*\\(', flags: 'g' },
25
+ { id: 'route-config', pattern: '(?:routes|endpoints)\\s*[:=]\\s*[\\[{]', flags: 'gi' },
26
+ ],
27
+ scoreBoost: 3,
28
+ reasons: ['Express adapter: route definition pattern'],
29
+ });
30
+ }
31
+ return recipes;
32
+ },
33
+ graph: {
34
+ denylist: [
35
+ // Express framework — not real implementation roots
36
+ 'Router', 'express', 'use', 'listen', 'set',
37
+ 'json', 'urlencoded', 'static', 'raw', 'text',
38
+ 'next', // Express next() middleware callback
39
+ // Common Express middleware names
40
+ 'cors', 'helmet', 'morgan', 'compression',
41
+ // Fastify framework
42
+ 'fastify', 'register', 'addHook', 'addPlugin',
43
+ ],
44
+ },
45
+ };
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/express/index.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAwB;IACjD,EAAE,EAAE,SAAS;IAEb,MAAM,CAAC,EAAW;QAChB,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;QAC7B,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACnC,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CACjF,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAEhF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,0BAA0B;gBAC9B,OAAO,EAAE,SAAS;gBAClB,UAAU,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC;gBAC1C,gBAAgB,EAAE,EAAE;gBACpB,OAAO,EAAE;oBACP,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,+DAA+D,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC9G,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,gDAAgD,EAAE,KAAK,EAAE,GAAG,EAAE;oBAC9F,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,wCAAwC,EAAE,KAAK,EAAE,IAAI,EAAE;iBACvF;gBACD,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC,2CAA2C,CAAC;aACvD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,EAAE;QACL,QAAQ,EAAE;YACR,oDAAoD;YACpD,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK;YAC3C,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM;YAC7C,MAAM,EAAK,qCAAqC;YAChD,kCAAkC;YAClC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa;YACzC,oBAAoB;YACpB,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW;SAC9C;KACF;CACF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { IntelligenceAdapter } from '../types.js';
2
+ /**
3
+ * Next.js IntelligenceAdapter v2.
4
+ *
5
+ * Capabilities:
6
+ * - detect: route/page/API queries routed to Next.js patterns
7
+ * - graph.denylist: Next.js framework functions not useful as impl roots
8
+ * - graph.rootHints: page/route handler patterns that ARE real roots
9
+ */
10
+ export declare const nextAdapter: IntelligenceAdapter;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Next.js IntelligenceAdapter v2.
3
+ *
4
+ * Capabilities:
5
+ * - detect: route/page/API queries routed to Next.js patterns
6
+ * - graph.denylist: Next.js framework functions not useful as impl roots
7
+ * - graph.rootHints: page/route handler patterns that ARE real roots
8
+ */
9
+ export const nextAdapter = {
10
+ id: 'next',
11
+ detect(ir) {
12
+ if (!ir.traits.routeLike && !ir.traits.reactLike)
13
+ return [];
14
+ const recipes = [];
15
+ const nlTokens = ir.nlTokens;
16
+ const isApiRoute = nlTokens.some(t => ['api', 'endpoint', 'handler'].includes(t)) ||
17
+ ir.phrases.some(p => p.includes('api route') || p.includes('api handler'));
18
+ const isPageRoute = nlTokens.some(t => ['page', 'route', 'layout'].includes(t)) ||
19
+ ir.phrases.some(p => p.includes('page component') || p.includes('app router'));
20
+ if (isApiRoute) {
21
+ recipes.push({
22
+ id: 'next.api-route',
23
+ adapter: 'next',
24
+ retrievers: ['route', 'identifier'],
25
+ exactIdentifiers: [],
26
+ regexes: [
27
+ { id: 'next-api-handler', pattern: 'export\\s+(?:default\\s+)?(?:async\\s+)?function\\s+handler', flags: 'g' },
28
+ { id: 'next-route-handler', pattern: 'export\\s+(?:async\\s+)?function\\s+(?:GET|POST|PUT|DELETE|PATCH)', flags: 'g' },
29
+ ],
30
+ scoreBoost: 3,
31
+ reasons: ['Next adapter: API route handler pattern'],
32
+ });
33
+ }
34
+ if (isPageRoute) {
35
+ recipes.push({
36
+ id: 'next.page-component',
37
+ adapter: 'next',
38
+ retrievers: ['identifier', 'route'],
39
+ exactIdentifiers: [],
40
+ regexes: [
41
+ { id: 'next-page-export', pattern: 'export\\s+default\\s+(?:function|const|class)', flags: 'g' },
42
+ { id: 'next-get-static', pattern: 'getStaticProps|getServerSideProps|generateStaticParams', flags: 'g' },
43
+ ],
44
+ scoreBoost: 2,
45
+ reasons: ['Next adapter: page component pattern'],
46
+ });
47
+ }
48
+ return recipes;
49
+ },
50
+ graph: {
51
+ denylist: [
52
+ // Next.js data fetching helpers — not implementation roots
53
+ 'getStaticProps', 'getServerSideProps', 'getStaticPaths', 'generateStaticParams',
54
+ 'generateMetadata', 'revalidate',
55
+ // Next.js router
56
+ 'useRouter', 'usePathname', 'useSearchParams', 'useParams',
57
+ 'redirect', 'notFound', 'permanentRedirect',
58
+ // Next.js image/link
59
+ 'Image', 'Link', 'Script', 'Head',
60
+ ],
61
+ rootHints: [
62
+ // Functions that ARE real implementation roots in Next.js
63
+ // (future: boost these during graph expansion)
64
+ ],
65
+ },
66
+ };
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/next/index.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAwB;IAC9C,EAAE,EAAE,MAAM;IAEV,MAAM,CAAC,EAAW;QAChB,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAE5D,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;QAE7B,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC/E,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QAE7E,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7E,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAEjF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,gBAAgB;gBACpB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;gBACnC,gBAAgB,EAAE,EAAE;gBACpB,OAAO,EAAE;oBACP,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,6DAA6D,EAAE,KAAK,EAAE,GAAG,EAAE;oBAC9G,EAAE,EAAE,EAAE,oBAAoB,EAAE,OAAO,EAAE,mEAAmE,EAAE,KAAK,EAAE,GAAG,EAAE;iBACvH;gBACD,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC,yCAAyC,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,qBAAqB;gBACzB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC;gBACnC,gBAAgB,EAAE,EAAE;gBACpB,OAAO,EAAE;oBACP,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,+CAA+C,EAAE,KAAK,EAAE,GAAG,EAAE;oBAChG,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,wDAAwD,EAAE,KAAK,EAAE,GAAG,EAAE;iBACzG;gBACD,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC,sCAAsC,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,EAAE;QACL,QAAQ,EAAE;YACR,2DAA2D;YAC3D,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,sBAAsB;YAChF,kBAAkB,EAAE,YAAY;YAChC,iBAAiB;YACjB,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW;YAC1D,UAAU,EAAE,UAAU,EAAE,mBAAmB;YAC3C,qBAAqB;YACrB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;SAClC;QAED,SAAS,EAAE;QACT,0DAA0D;QAC1D,+CAA+C;SAChD;KACF;CACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { IntelligenceAdapter } from '../types.js';
2
+ /**
3
+ * React IntelligenceAdapter v2.
4
+ *
5
+ * Capabilities beyond the old SearchAdapter:
6
+ * - graph.denylist: React built-ins and HOC wrappers that should never be
7
+ * promoted as implementation roots during graph expansion
8
+ * - graph.rootHints: patterns indicating actual component implementations
9
+ * - explain.causeHints: React-specific root cause patterns
10
+ */
11
+ export declare const reactAdapter: IntelligenceAdapter;
@@ -0,0 +1,133 @@
1
+ const HOOK_PATTERN = /^use[A-Z]/;
2
+ /**
3
+ * React IntelligenceAdapter v2.
4
+ *
5
+ * Capabilities beyond the old SearchAdapter:
6
+ * - graph.denylist: React built-ins and HOC wrappers that should never be
7
+ * promoted as implementation roots during graph expansion
8
+ * - graph.rootHints: patterns indicating actual component implementations
9
+ * - explain.causeHints: React-specific root cause patterns
10
+ */
11
+ export const reactAdapter = {
12
+ id: 'react',
13
+ // ---------------------------------------------------------------------------
14
+ // Search recipes (migrated from src/search/adapters/react.ts)
15
+ // ---------------------------------------------------------------------------
16
+ detect(ir) {
17
+ if (!ir.traits.reactLike)
18
+ return [];
19
+ const recipes = [];
20
+ const hookIds = ir.exactIdentifiers.filter((id) => HOOK_PATTERN.test(id));
21
+ const hasUseEffect = hookIds.includes('useEffect');
22
+ const hasUseMemo = hookIds.includes('useMemo');
23
+ const hasUseCallback = hookIds.includes('useCallback');
24
+ if (hasUseEffect && (ir.structuralPredicates.includes('conditional') ||
25
+ ir.structuralPredicates.includes('returns-cleanup') ||
26
+ ir.codeTokens.includes('cleanup'))) {
27
+ recipes.push({
28
+ id: 'react.useeffect.conditional-cleanup',
29
+ adapter: 'react',
30
+ retrievers: ['identifier', 'structural', 'regex'],
31
+ exactIdentifiers: ['useEffect'],
32
+ structuralPredicates: ['returns-cleanup', 'conditional'],
33
+ regexes: [
34
+ { id: 'conditional-return', pattern: 'if\\s*\\([^)]*\\)\\s*\\{[^}]*return\\s*\\(\\)', flags: 'g' },
35
+ { id: 'useeffect-cleanup', pattern: 'useEffect\\s*\\(\\s*\\(\\)\\s*=>\\s*\\{[\\s\\S]*?return\\s', flags: 'g' },
36
+ ],
37
+ scoreBoost: 3,
38
+ reasons: ['React adapter: useEffect + conditional cleanup pattern'],
39
+ });
40
+ }
41
+ if (hasUseEffect && ir.traits.previousStateLike) {
42
+ recipes.push({
43
+ id: 'react.useeffect.functional-state-updater',
44
+ adapter: 'react',
45
+ retrievers: ['identifier', 'structural', 'regex'],
46
+ exactIdentifiers: ['useEffect'],
47
+ structuralPredicates: ['functional-state-updater'],
48
+ regexes: [
49
+ { id: 'functional-updater', pattern: 'set\\w+\\s*\\(\\s*(?:prev|current|existing|old)\\w*\\s*=>', flags: 'g' },
50
+ { id: 'updater-arrow', pattern: 'set\\w+\\s*\\(\\s*\\w+\\s*=>\\s*\\w+', flags: 'g' },
51
+ ],
52
+ scoreBoost: 4,
53
+ reasons: ['React adapter: useEffect + functional state updater'],
54
+ });
55
+ }
56
+ if (hasUseMemo) {
57
+ recipes.push({
58
+ id: 'react.usememo.computation',
59
+ adapter: 'react',
60
+ retrievers: ['identifier'],
61
+ exactIdentifiers: ['useMemo'],
62
+ scoreBoost: 1,
63
+ reasons: ['React adapter: useMemo computation'],
64
+ });
65
+ }
66
+ if (hasUseCallback) {
67
+ recipes.push({
68
+ id: 'react.usecallback.memoized-handler',
69
+ adapter: 'react',
70
+ retrievers: ['identifier'],
71
+ exactIdentifiers: ['useCallback'],
72
+ scoreBoost: 1,
73
+ reasons: ['React adapter: useCallback memoized handler'],
74
+ });
75
+ }
76
+ if (hookIds.length > 0 && recipes.length === 0) {
77
+ recipes.push({
78
+ id: 'react.hook.general',
79
+ adapter: 'react',
80
+ retrievers: ['identifier'],
81
+ exactIdentifiers: hookIds,
82
+ scoreBoost: 0,
83
+ reasons: [`React adapter: general hook query for ${hookIds.join(', ')}`],
84
+ });
85
+ }
86
+ return recipes;
87
+ },
88
+ // ---------------------------------------------------------------------------
89
+ // Phase 2E: Graph intelligence — prevents React built-ins from appearing
90
+ // as implementation roots when users ask "what is the real implementation?"
91
+ // ---------------------------------------------------------------------------
92
+ graph: {
93
+ denylist: [
94
+ // React core hooks
95
+ 'useState', 'useEffect', 'useMemo', 'useCallback', 'useRef', 'useContext',
96
+ 'useReducer', 'useLayoutEffect', 'useImperativeHandle', 'useDebugValue',
97
+ 'useTransition', 'useDeferredValue', 'useId', 'useSyncExternalStore',
98
+ // React component wrappers — not "real" implementations
99
+ 'memo', 'forwardRef', 'lazy', 'Suspense',
100
+ // React factory functions
101
+ 'createElement', 'createContext', 'createRef', 'createPortal',
102
+ 'cloneElement', 'isValidElement', 'Children',
103
+ // React Router / Next.js HOCs
104
+ 'withRouter', 'connect', 'inject',
105
+ ],
106
+ rootHints: [
107
+ // Functions named after common React patterns are often real implementations
108
+ // (used to boost these during graph expansion)
109
+ ],
110
+ },
111
+ // ---------------------------------------------------------------------------
112
+ // Phase 2E: Explain hints — React-specific root cause patterns
113
+ // ---------------------------------------------------------------------------
114
+ explain: {
115
+ causeHints: [
116
+ {
117
+ matchCode: '2345',
118
+ matchMessage: /props/i,
119
+ causeCategory: 'react-prop-type-mismatch',
120
+ hint: 'Check that the component\'s prop type interface matches what is being passed',
121
+ scoreBoost: 2,
122
+ },
123
+ {
124
+ matchCode: '2339',
125
+ matchMessage: /useEffect|useState|useMemo/i,
126
+ causeCategory: 'react-hook-return',
127
+ hint: 'The hook may not return what you expect — check the hook\'s return type definition',
128
+ scoreBoost: 2,
129
+ },
130
+ ],
131
+ },
132
+ };
133
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/react/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { QueryIR, SearchRecipe } from '../search/types.js';
2
+ import type { IntelligenceAdapter, AdapterCauseHint } from './types.js';
3
+ /** Run all adapter detect() methods and return merged search recipes. */
4
+ export declare function runAdapters(ir: QueryIR): SearchRecipe[];
5
+ /** Get the merged denylist from all adapters. */
6
+ export declare function getAdapterGraphDenylist(): Set<string>;
7
+ /** Get all root hints from all adapters. */
8
+ export declare function getAdapterRootHints(): string[];
9
+ /** Get all cause hints from all adapters. */
10
+ export declare function getAdapterCauseHints(): AdapterCauseHint[];
11
+ /**
12
+ * Find the best cause hint for a given diagnostic code + message.
13
+ * Returns the highest-scoring matching hint, or null if none match.
14
+ */
15
+ export declare function matchCauseHint(code: string | undefined, message: string): AdapterCauseHint | null;
16
+ /** Run all adapter verify checks on the given files. */
17
+ export declare function runAdapterVerifyChecks(filePaths: string[]): Array<{
18
+ adapterId: string;
19
+ issues: ReturnType<NonNullable<NonNullable<IntelligenceAdapter['verify']>['checks']>[number]['run']>;
20
+ }>;
21
+ export declare function getAdapter(id: string): IntelligenceAdapter | undefined;
22
+ export declare function getAllAdapters(): readonly IntelligenceAdapter[];
@@ -0,0 +1,101 @@
1
+ import { reactAdapter } from './react/index.js';
2
+ import { nextAdapter } from './next/index.js';
3
+ import { expressAdapter } from './express/index.js';
4
+ // Config adapter remains in search/adapters until Phase 4 — wrapped here for compatibility
5
+ import { configAdapter as legacyConfigAdapter } from '../search/adapters/config.js';
6
+ /**
7
+ * Phase 2E — Central IntelligenceAdapter registry.
8
+ *
9
+ * This is the single source of truth for all adapter capabilities.
10
+ * The old src/search/adapters/registry.ts delegates here for backward compatibility.
11
+ */
12
+ // Wrap the legacy configAdapter as an IntelligenceAdapter for inclusion
13
+ const configAdapterCompat = {
14
+ id: 'config',
15
+ detect: (ir) => legacyConfigAdapter.detect(ir),
16
+ };
17
+ const ADAPTERS = [
18
+ reactAdapter,
19
+ nextAdapter,
20
+ expressAdapter,
21
+ configAdapterCompat,
22
+ ];
23
+ // ---------------------------------------------------------------------------
24
+ // Search recipes (backward-compatible with old SearchAdapter.detect())
25
+ // ---------------------------------------------------------------------------
26
+ /** Run all adapter detect() methods and return merged search recipes. */
27
+ export function runAdapters(ir) {
28
+ const recipes = [];
29
+ for (const adapter of ADAPTERS) {
30
+ if (adapter.detect) {
31
+ recipes.push(...adapter.detect(ir));
32
+ }
33
+ }
34
+ return recipes;
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Graph intelligence
38
+ // ---------------------------------------------------------------------------
39
+ /** Get the merged denylist from all adapters. */
40
+ export function getAdapterGraphDenylist() {
41
+ const merged = new Set();
42
+ for (const adapter of ADAPTERS) {
43
+ for (const symbol of adapter.graph?.denylist ?? []) {
44
+ merged.add(symbol);
45
+ }
46
+ }
47
+ return merged;
48
+ }
49
+ /** Get all root hints from all adapters. */
50
+ export function getAdapterRootHints() {
51
+ return ADAPTERS.flatMap((a) => a.graph?.rootHints ?? []);
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // Explain intelligence
55
+ // ---------------------------------------------------------------------------
56
+ /** Get all cause hints from all adapters. */
57
+ export function getAdapterCauseHints() {
58
+ return ADAPTERS.flatMap((a) => a.explain?.causeHints ?? []);
59
+ }
60
+ /**
61
+ * Find the best cause hint for a given diagnostic code + message.
62
+ * Returns the highest-scoring matching hint, or null if none match.
63
+ */
64
+ export function matchCauseHint(code, message) {
65
+ const candidates = getAdapterCauseHints().filter((h) => {
66
+ if (h.matchCode && code !== h.matchCode)
67
+ return false;
68
+ if (h.matchMessage && !h.matchMessage.test(message))
69
+ return false;
70
+ return true;
71
+ });
72
+ if (candidates.length === 0)
73
+ return null;
74
+ return candidates.reduce((best, c) => c.scoreBoost > best.scoreBoost ? c : best);
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Verify checks
78
+ // ---------------------------------------------------------------------------
79
+ /** Run all adapter verify checks on the given files. */
80
+ export function runAdapterVerifyChecks(filePaths) {
81
+ const results = [];
82
+ for (const adapter of ADAPTERS) {
83
+ for (const check of adapter.verify?.checks ?? []) {
84
+ const issues = check.run(filePaths);
85
+ if (issues.length > 0) {
86
+ results.push({ adapterId: adapter.id, issues });
87
+ }
88
+ }
89
+ }
90
+ return results;
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Adapter access
94
+ // ---------------------------------------------------------------------------
95
+ export function getAdapter(id) {
96
+ return ADAPTERS.find((a) => a.id === id);
97
+ }
98
+ export function getAllAdapters() {
99
+ return ADAPTERS;
100
+ }
101
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/adapters/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import type { QueryIR, SearchRecipe } from '../search/types.js';
2
+ /**
3
+ * Phase 2E — IntelligenceAdapter v2 interface.
4
+ *
5
+ * Replaces the narrow SearchAdapter (search-recipe-only) with a composable
6
+ * adapter that can contribute to every layer of the engine:
7
+ * search, graph, explain, guard, verify.
8
+ *
9
+ * Migration policy:
10
+ * When an adapter contributes at least one non-recipe capability (e.g. graph.denylist),
11
+ * the corresponding old src/search/adapters/* file must be reduced to a thin
12
+ * re-export within one sprint.
13
+ */
14
+ export interface IntelligenceAdapter {
15
+ readonly id: string;
16
+ /**
17
+ * Emit search recipes for queries that match this adapter's domain.
18
+ * Equivalent to the old SearchAdapter.detect().
19
+ */
20
+ detect?(ir: QueryIR): SearchRecipe[];
21
+ /**
22
+ * Contribute additional IR enrichment beyond what the query parser produces.
23
+ * Useful for framework-specific token classification.
24
+ */
25
+ enrichQuery?(ir: QueryIR): AdapterQueryContribution;
26
+ graph?: {
27
+ /**
28
+ * Symbols that should NEVER be promoted as implementation roots.
29
+ * The engine skips these during graph expansion.
30
+ * React: memo, forwardRef, createContext, etc.
31
+ * Express: Router, app.use, etc.
32
+ */
33
+ denylist?: string[];
34
+ /**
35
+ * Symbol name patterns that ARE likely real implementation roots for this domain.
36
+ * Used to boost candidates during graph expansion.
37
+ */
38
+ rootHints?: string[];
39
+ };
40
+ explain?: {
41
+ /**
42
+ * Hints that help root_cause_trace identify likely cause categories
43
+ * for framework-specific error patterns.
44
+ */
45
+ causeHints?: AdapterCauseHint[];
46
+ };
47
+ guard?: {
48
+ /**
49
+ * Extra rules that api_guard applies when checking contracts.
50
+ * E.g. React: prop type changes are always consumer-breaking.
51
+ */
52
+ rules?: AdapterGuardRule[];
53
+ };
54
+ verify?: {
55
+ /**
56
+ * Checks that verify_changes runs for this framework's idioms.
57
+ * E.g. React: no conditional hooks, exhaustive useEffect deps.
58
+ */
59
+ checks?: AdapterVerifyCheck[];
60
+ };
61
+ }
62
+ export interface AdapterQueryContribution {
63
+ /** Additional exact identifiers to include */
64
+ extraIdentifiers?: string[];
65
+ /** Additional behavior terms to score against */
66
+ extraBehaviorTerms?: string[];
67
+ /** Additional config terms for config/env retrieval */
68
+ extraConfigTerms?: string[];
69
+ }
70
+ export interface AdapterCauseHint {
71
+ /** TypeScript diagnostic code this hint applies to (e.g. '2345') */
72
+ matchCode?: string;
73
+ /** Pattern matched against the diagnostic message */
74
+ matchMessage?: RegExp;
75
+ /** Short human-readable category label */
76
+ causeCategory: string;
77
+ /** Actionable hint for the developer */
78
+ hint: string;
79
+ /** Score boost applied to candidates matching this hint */
80
+ scoreBoost: number;
81
+ }
82
+ export interface AdapterGuardRule {
83
+ id: string;
84
+ description: string;
85
+ }
86
+ export interface AdapterVerifyCheck {
87
+ id: string;
88
+ description: string;
89
+ /** Run the check and return issues found */
90
+ run(filePaths: string[]): AdapterVerifyIssue[];
91
+ }
92
+ export interface AdapterVerifyIssue {
93
+ filePath: string;
94
+ line?: number;
95
+ message: string;
96
+ severity: 'error' | 'warning';
97
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import type { ChangeRecipe } from './changeRecipes.js';
2
+ /**
3
+ * Phase 3B — Apply a change recipe to source text without touching disk.
4
+ *
5
+ * Returns modified source content as a string, or null if the recipe
6
+ * cannot be applied (symbol not found, ambiguous match, etc.).
7
+ *
8
+ * The output is used to build a SnapshotResolver overlay so the TypeScript
9
+ * program reflects the hypothetical change for semantic analysis.
10
+ */
11
+ export interface VirtualEditResult {
12
+ /** The modified source text */
13
+ modifiedSource: string;
14
+ /** Original signature text (for diff display) */
15
+ originalSignature: string;
16
+ /** New signature text after the change */
17
+ newSignature: string;
18
+ /** 0-indexed start position of the edit in the original source */
19
+ editStart: number;
20
+ /** 0-indexed end position (exclusive) in the original source */
21
+ editEnd: number;
22
+ }
23
+ /**
24
+ * Apply a change recipe to source text.
25
+ * Returns null if the target symbol cannot be found.
26
+ */
27
+ export declare function applyVirtualEdit(source: string, filePath: string, recipe: ChangeRecipe): VirtualEditResult | null;