@massu/core 1.10.8 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +1334 -0
  2. package/dist/adapter.js +6 -4
  3. package/dist/cli.js +581 -448
  4. package/dist/detect/adapters/.bundle-shasums.json +4 -7
  5. package/dist/detect/adapters/rails.js +6 -4
  6. package/dist/detect/adapters/spring.js +6 -4
  7. package/dist/detect/adapters/tree-sitter-loader.js +6 -4
  8. package/dist/hooks/auto-learning-pipeline.js +24 -1
  9. package/dist/hooks/classify-failure.js +32 -3
  10. package/dist/hooks/cost-tracker.js +24 -0
  11. package/dist/hooks/fix-detector.js +97 -1
  12. package/dist/hooks/incident-pipeline.js +30 -1
  13. package/dist/hooks/intent-suggester.js +6 -3
  14. package/dist/hooks/post-edit-context.js +24 -1
  15. package/dist/hooks/post-tool-use.js +67 -19
  16. package/dist/hooks/pre-compact.js +28 -3
  17. package/dist/hooks/pre-delete-check.js +53 -27
  18. package/dist/hooks/pre-tool-use-gate.js +962 -0
  19. package/dist/hooks/quality-event.js +24 -0
  20. package/dist/hooks/rule-enforcement-pipeline.js +24 -1
  21. package/dist/hooks/security-gate.js +29 -16
  22. package/dist/hooks/session-end.js +31 -6
  23. package/dist/hooks/session-start.js +8709 -8459
  24. package/dist/hooks/user-prompt.js +25 -1
  25. package/package.json +15 -18
  26. package/commands/README.md +0 -134
  27. package/src/adapter.ts +0 -121
  28. package/src/adr-generator.ts +0 -292
  29. package/src/analytics.ts +0 -373
  30. package/src/audit-trail.ts +0 -450
  31. package/src/backfill-sessions.ts +0 -182
  32. package/src/changelog-generator.ts +0 -178
  33. package/src/cli.ts +0 -246
  34. package/src/cloud-sync.ts +0 -234
  35. package/src/commands/adapters.ts +0 -824
  36. package/src/commands/changelog.ts +0 -165
  37. package/src/commands/config-check-drift.ts +0 -133
  38. package/src/commands/config-refresh.ts +0 -396
  39. package/src/commands/config-upgrade.ts +0 -127
  40. package/src/commands/doctor.ts +0 -485
  41. package/src/commands/hook-runner.ts +0 -145
  42. package/src/commands/init.ts +0 -1823
  43. package/src/commands/install-commands.ts +0 -692
  44. package/src/commands/install-hooks.ts +0 -27
  45. package/src/commands/permissions.ts +0 -150
  46. package/src/commands/refresh-log.ts +0 -37
  47. package/src/commands/show-template.ts +0 -65
  48. package/src/commands/template-engine.ts +0 -301
  49. package/src/commands/watch.ts +0 -430
  50. package/src/config.ts +0 -765
  51. package/src/cost-tracker.ts +0 -355
  52. package/src/db.ts +0 -370
  53. package/src/dependency-scorer.ts +0 -337
  54. package/src/detect/adapters/aspnet.ts +0 -4
  55. package/src/detect/adapters/discover.ts +0 -469
  56. package/src/detect/adapters/file-sampler.ts +0 -225
  57. package/src/detect/adapters/go-chi.ts +0 -4
  58. package/src/detect/adapters/index.ts +0 -51
  59. package/src/detect/adapters/nextjs-trpc.ts +0 -166
  60. package/src/detect/adapters/parse-guard.ts +0 -133
  61. package/src/detect/adapters/phoenix.ts +0 -4
  62. package/src/detect/adapters/python-django.ts +0 -208
  63. package/src/detect/adapters/python-fastapi.ts +0 -223
  64. package/src/detect/adapters/python-flask.ts +0 -235
  65. package/src/detect/adapters/query-helpers.ts +0 -170
  66. package/src/detect/adapters/rails.ts +0 -4
  67. package/src/detect/adapters/runner.ts +0 -284
  68. package/src/detect/adapters/spring.ts +0 -4
  69. package/src/detect/adapters/swift-swiftui.ts +0 -171
  70. package/src/detect/adapters/tree-sitter-loader.ts +0 -517
  71. package/src/detect/adapters/types.ts +0 -191
  72. package/src/detect/codebase-introspector.ts +0 -210
  73. package/src/detect/domain-inferrer.ts +0 -197
  74. package/src/detect/drift.ts +0 -199
  75. package/src/detect/framework-detector.ts +0 -307
  76. package/src/detect/index.ts +0 -209
  77. package/src/detect/manifest-registry.ts +0 -261
  78. package/src/detect/migrate.ts +0 -362
  79. package/src/detect/monorepo-detector.ts +0 -348
  80. package/src/detect/package-detector.ts +0 -828
  81. package/src/detect/passthrough.ts +0 -108
  82. package/src/detect/regex-fallback.ts +0 -449
  83. package/src/detect/source-dir-detector.ts +0 -297
  84. package/src/detect/vr-command-map.ts +0 -167
  85. package/src/docs-map.json +0 -100
  86. package/src/docs-tools.ts +0 -519
  87. package/src/domains.ts +0 -182
  88. package/src/hooks/auto-learning-pipeline.ts +0 -228
  89. package/src/hooks/classify-failure.ts +0 -259
  90. package/src/hooks/cost-tracker.ts +0 -66
  91. package/src/hooks/fix-detector.ts +0 -186
  92. package/src/hooks/incident-pipeline.ts +0 -190
  93. package/src/hooks/intent-suggester.ts +0 -131
  94. package/src/hooks/post-edit-context.ts +0 -91
  95. package/src/hooks/post-tool-use.ts +0 -413
  96. package/src/hooks/pre-compact.ts +0 -168
  97. package/src/hooks/pre-delete-check.ts +0 -243
  98. package/src/hooks/quality-event.ts +0 -127
  99. package/src/hooks/rule-enforcement-pipeline.ts +0 -159
  100. package/src/hooks/security-gate.ts +0 -153
  101. package/src/hooks/session-end.ts +0 -467
  102. package/src/hooks/session-start.ts +0 -436
  103. package/src/hooks/user-prompt.ts +0 -157
  104. package/src/import-resolver.ts +0 -226
  105. package/src/knowledge-db.ts +0 -176
  106. package/src/knowledge-indexer.ts +0 -708
  107. package/src/knowledge-tools.ts +0 -1414
  108. package/src/lib/fileLock.ts +0 -203
  109. package/src/lib/framework-supports.ts +0 -85
  110. package/src/lib/gitToplevel.ts +0 -22
  111. package/src/lib/hook-registry.ts +0 -43
  112. package/src/lib/installLock.ts +0 -66
  113. package/src/lib/memory-path.ts +0 -49
  114. package/src/lib/pidLiveness.ts +0 -67
  115. package/src/lib/settings-local.ts +0 -110
  116. package/src/lib/sql-table-names.ts +0 -71
  117. package/src/license.ts +0 -547
  118. package/src/lsp/auto-detect.ts +0 -98
  119. package/src/lsp/client.ts +0 -776
  120. package/src/lsp/enrich.ts +0 -127
  121. package/src/lsp/types.ts +0 -221
  122. package/src/memory-db.ts +0 -1614
  123. package/src/memory-file-ingest.ts +0 -128
  124. package/src/memory-tools.ts +0 -424
  125. package/src/middleware-tree.ts +0 -71
  126. package/src/observability-tools.ts +0 -343
  127. package/src/observation-extractor.ts +0 -418
  128. package/src/page-deps.ts +0 -285
  129. package/src/permissions.ts +0 -422
  130. package/src/prompt-analyzer.ts +0 -332
  131. package/src/python/coupling-detector.ts +0 -125
  132. package/src/python/domain-enforcer.ts +0 -84
  133. package/src/python/impact-analyzer.ts +0 -96
  134. package/src/python/import-parser.ts +0 -244
  135. package/src/python/import-resolver.ts +0 -136
  136. package/src/python/migration-indexer.ts +0 -116
  137. package/src/python/migration-parser.ts +0 -332
  138. package/src/python/model-indexer.ts +0 -71
  139. package/src/python/model-parser.ts +0 -279
  140. package/src/python/route-indexer.ts +0 -59
  141. package/src/python/route-parser.ts +0 -317
  142. package/src/python-tools.ts +0 -630
  143. package/src/regression-detector.ts +0 -319
  144. package/src/rules.ts +0 -57
  145. package/src/schema-mapper.ts +0 -232
  146. package/src/security/adapter-origin.ts +0 -130
  147. package/src/security/adapter-verifier.ts +0 -319
  148. package/src/security/atomic-write.ts +0 -164
  149. package/src/security/fetcher.ts +0 -200
  150. package/src/security/install-tracking.ts +0 -319
  151. package/src/security/license-pubkey.generated.ts +0 -30
  152. package/src/security/license-response-verifier.ts +0 -149
  153. package/src/security/local-fingerprint.ts +0 -225
  154. package/src/security/manifest-cache.ts +0 -333
  155. package/src/security/manifest-schema.ts +0 -129
  156. package/src/security/registry-pubkey.generated.ts +0 -35
  157. package/src/security/telemetry.ts +0 -320
  158. package/src/security-scorer.ts +0 -405
  159. package/src/security-utils.ts +0 -133
  160. package/src/sentinel-db.ts +0 -580
  161. package/src/sentinel-scanner.ts +0 -406
  162. package/src/sentinel-tools.ts +0 -513
  163. package/src/sentinel-types.ts +0 -140
  164. package/src/server-dispatch.ts +0 -225
  165. package/src/server.ts +0 -107
  166. package/src/session-archiver.ts +0 -111
  167. package/src/session-state-generator.ts +0 -174
  168. package/src/team-knowledge.ts +0 -407
  169. package/src/tool-db-needs.ts +0 -232
  170. package/src/tools.ts +0 -1206
  171. package/src/transcript-parser.ts +0 -458
  172. package/src/trpc-index.ts +0 -215
  173. package/src/validate-features-runner.ts +0 -107
  174. package/src/validation-engine.ts +0 -358
  175. package/src/watch/daemon.ts +0 -385
  176. package/src/watch/lockfile-detector.ts +0 -65
  177. package/src/watch/paths.ts +0 -279
  178. package/src/watch/state.ts +0 -178
package/src/lsp/enrich.ts DELETED
@@ -1,127 +0,0 @@
1
- // Copyright (c) 2026 Massu. All rights reserved.
2
- // Licensed under BSL 1.1 - see LICENSE file for details.
3
-
4
- /**
5
- * Plan 3b — Phase 4: LSP enrichment of AST adapter results.
6
- *
7
- * For each field in `result.conventions`, optionally enrich via LSP responses
8
- * (e.g., resolve `Depends` → `fastapi.Depends` via `textDocument/definition`).
9
- *
10
- * Authority rule (per spec §4 / plan line 173-175):
11
- * - AST is AUTHORITATIVE. LSP only refines (e.g., resolves alias → fully
12
- * qualified import).
13
- * - LSP unavailable / timeout / Zod-fail / version-mismatch → keep AST,
14
- * log warning at field granularity, do NOT crash.
15
- *
16
- * Failure modes:
17
- * - `lspClient === null` → return original result unchanged (no log; the
18
- * "LSP not configured" path is the common case).
19
- * - LSP method returns null (capability missing, timeout, Zod fail) →
20
- * keep AST value, append a `_lsp_skipped: <reason>` note to provenance.
21
- * - Per-field error → ignore that single field, keep others (per plan).
22
- */
23
-
24
- import type { AdapterResult, SourceFile } from '../detect/adapters/types.ts';
25
- import { pathToFileURL } from 'url';
26
- import type { LSPClient } from './client.ts';
27
-
28
- /**
29
- * Enrich an `AdapterResult` with LSP data when the client is available.
30
- *
31
- * The current v1 implementation is intentionally minimal: it walks each
32
- * source file and asks the LSP for `textDocument/documentSymbol`. When the
33
- * LSP returns a populated symbol list AND a convention field's value matches
34
- * a symbol name, the convention's provenance is annotated with the LSP-
35
- * provided detail (e.g., the canonical import path).
36
- *
37
- * AST values are NEVER overwritten — provenance is the only field touched.
38
- */
39
- export async function enrichAdapterResult(
40
- result: AdapterResult,
41
- lspClient: LSPClient | null,
42
- sourceFiles: SourceFile[]
43
- ): Promise<AdapterResult> {
44
- if (!lspClient) return result;
45
- if (sourceFiles.length === 0) return result;
46
-
47
- // Build a map of convention-value → field-name(s) so we can match symbols.
48
- const valueToFields = new Map<string, string[]>();
49
- for (const [field, value] of Object.entries(result.conventions)) {
50
- if (typeof value !== 'string') continue;
51
- const arr = valueToFields.get(value) ?? [];
52
- arr.push(field);
53
- valueToFields.set(value, arr);
54
- }
55
- if (valueToFields.size === 0) return result;
56
-
57
- const enrichedProvenance = [...result.provenance];
58
-
59
- for (const file of sourceFiles) {
60
- let symbols;
61
- try {
62
- const uri = pathToFileURL(file.path).toString();
63
- symbols = await lspClient.documentSymbol(uri);
64
- } catch (e) {
65
- process.stderr.write(
66
- `[massu/lsp] WARN: documentSymbol threw on ${file.path} — skipping enrichment for this file. (${e instanceof Error ? e.message : String(e)})\n`
67
- );
68
- continue;
69
- }
70
- if (!symbols || !Array.isArray(symbols)) continue;
71
-
72
- for (const sym of symbols) {
73
- if (!sym || typeof sym !== 'object') continue;
74
- const symObj = sym as Record<string, unknown>;
75
- const name = typeof symObj.name === 'string' ? symObj.name : null;
76
- if (!name) continue;
77
- const matchedFields = valueToFields.get(name);
78
- if (!matchedFields) continue;
79
-
80
- // Append an LSP-sourced provenance entry for each matched field. The
81
- // AST entry stays in place — LSP is enrichment-only.
82
- const detail = typeof symObj.detail === 'string' ? symObj.detail : null;
83
- const line = extractStartLine(symObj);
84
- for (const field of matchedFields) {
85
- enrichedProvenance.push({
86
- field,
87
- sourceFile: file.path,
88
- line: line ?? 0,
89
- query: detail ? `lsp:documentSymbol(${detail})` : 'lsp:documentSymbol',
90
- });
91
- }
92
- }
93
- }
94
-
95
- return {
96
- ...result,
97
- provenance: enrichedProvenance,
98
- };
99
- }
100
-
101
- /**
102
- * Pluck the start line from either DocumentSymbol shape (range.start.line) or
103
- * SymbolInformation shape (location.range.start.line). Returns null if
104
- * neither shape matches.
105
- */
106
- function extractStartLine(sym: Record<string, unknown>): number | null {
107
- // DocumentSymbol shape
108
- const range = sym.range as Record<string, unknown> | undefined;
109
- if (range && typeof range === 'object') {
110
- const start = range.start as Record<string, unknown> | undefined;
111
- if (start && typeof start.line === 'number') {
112
- return start.line + 1; // convert 0-indexed to 1-indexed
113
- }
114
- }
115
- // SymbolInformation shape
116
- const loc = sym.location as Record<string, unknown> | undefined;
117
- if (loc && typeof loc === 'object') {
118
- const locRange = loc.range as Record<string, unknown> | undefined;
119
- if (locRange && typeof locRange === 'object') {
120
- const start = locRange.start as Record<string, unknown> | undefined;
121
- if (start && typeof start.line === 'number') {
122
- return start.line + 1;
123
- }
124
- }
125
- }
126
- return null;
127
- }
package/src/lsp/types.ts DELETED
@@ -1,221 +0,0 @@
1
- // Copyright (c) 2026 Massu. All rights reserved.
2
- // Licensed under BSL 1.1 - see LICENSE file for details.
3
-
4
- /**
5
- * Plan 3b — Phase 4: LSP message TypeScript interfaces + Zod runtime schemas.
6
- *
7
- * Per audit-iter-4 fix DD: every `*Request` / `*Response` / `*Params` /
8
- * `ServerCapabilities` type is paired with a co-located `*ResponseSchema` for
9
- * runtime validation. `client.ts` imports from here only — no inline Zod
10
- * definitions in `client.ts`.
11
- *
12
- * The schemas validate the LSP `result` payloads we consume (NOT the
13
- * full envelope) — `LSPMessageEnvelopeSchema` covers the wire envelope.
14
- *
15
- * VR check (per plan): `grep -nE 'export (interface|type|const) .*(Schema|
16
- * Request|Response|Params|Capabilities)' packages/core/src/lsp/types.ts` MUST
17
- * return ≥8 hits after Phase 4.
18
- */
19
-
20
- import { z } from 'zod';
21
-
22
- // ============================================================
23
- // LSP error codes (subset we reference)
24
- // ============================================================
25
-
26
- /**
27
- * JSON-RPC + LSP error codes used by the client. Numeric values match the
28
- * LSP 3.17 spec — `MethodNotFound = -32601` is the gatekeeper for the
29
- * graceful-degrade path (per plan line 160).
30
- */
31
- export const LSPErrorCode = {
32
- ParseError: -32700,
33
- InvalidRequest: -32600,
34
- MethodNotFound: -32601,
35
- InvalidParams: -32602,
36
- InternalError: -32603,
37
- ServerNotInitialized: -32002,
38
- RequestFailed: -32803,
39
- ServerCancelled: -32802,
40
- } as const;
41
- export type LSPErrorCodeValue = typeof LSPErrorCode[keyof typeof LSPErrorCode];
42
-
43
- // ============================================================
44
- // Wire envelope (every LSP/JSON-RPC message)
45
- // ============================================================
46
-
47
- /**
48
- * JSON-RPC 2.0 / LSP envelope. `id` is required for request/response, absent
49
- * for notifications. `method` is present on requests/notifications, absent on
50
- * responses. `result` xor `error` on responses.
51
- */
52
- export const LSPMessageEnvelopeSchema = z.object({
53
- jsonrpc: z.literal('2.0'),
54
- id: z.union([z.number(), z.string()]).optional(),
55
- method: z.string().optional(),
56
- params: z.unknown().optional(),
57
- result: z.unknown().optional(),
58
- error: z
59
- .object({
60
- code: z.number(),
61
- message: z.string(),
62
- data: z.unknown().optional(),
63
- })
64
- .optional(),
65
- }).passthrough();
66
- export type LSPMessageEnvelope = z.infer<typeof LSPMessageEnvelopeSchema>;
67
-
68
- // ============================================================
69
- // Initialize
70
- // ============================================================
71
-
72
- export interface InitializeRequest {
73
- processId: number | null;
74
- rootUri: string | null;
75
- capabilities: Record<string, unknown>;
76
- workspaceFolders?: Array<{ uri: string; name: string }> | null;
77
- }
78
-
79
- /**
80
- * Subset of LSP `ServerCapabilities` we consume. Everything else is ignored.
81
- * Each `*Provider` flag may be absent (treat as false), `true`, or an object
82
- * (treat as true — server supports the method but with options we don't use).
83
- */
84
- export interface ServerCapabilities {
85
- documentSymbolProvider?: boolean | Record<string, unknown>;
86
- workspaceSymbolProvider?: boolean | Record<string, unknown>;
87
- definitionProvider?: boolean | Record<string, unknown>;
88
- }
89
-
90
- export const ServerCapabilitiesSchema = z
91
- .object({
92
- documentSymbolProvider: z.union([z.boolean(), z.record(z.string(), z.unknown())]).optional(),
93
- workspaceSymbolProvider: z.union([z.boolean(), z.record(z.string(), z.unknown())]).optional(),
94
- definitionProvider: z.union([z.boolean(), z.record(z.string(), z.unknown())]).optional(),
95
- })
96
- .passthrough();
97
-
98
- export interface InitializeResponse {
99
- capabilities: ServerCapabilities;
100
- serverInfo?: { name: string; version?: string };
101
- }
102
-
103
- export const InitializeResponseSchema = z
104
- .object({
105
- capabilities: ServerCapabilitiesSchema,
106
- serverInfo: z
107
- .object({
108
- name: z.string(),
109
- version: z.string().optional(),
110
- })
111
- .optional(),
112
- })
113
- .passthrough();
114
-
115
- // ============================================================
116
- // Position / Range / Location (shared)
117
- // ============================================================
118
-
119
- export const PositionSchema = z.object({
120
- line: z.number().int().nonnegative(),
121
- character: z.number().int().nonnegative(),
122
- });
123
- export type Position = z.infer<typeof PositionSchema>;
124
-
125
- export const RangeSchema = z.object({
126
- start: PositionSchema,
127
- end: PositionSchema,
128
- });
129
- export type Range = z.infer<typeof RangeSchema>;
130
-
131
- export const LocationSchema = z.object({
132
- uri: z.string(),
133
- range: RangeSchema,
134
- });
135
- export type Location = z.infer<typeof LocationSchema>;
136
-
137
- // ============================================================
138
- // textDocument/documentSymbol
139
- // ============================================================
140
-
141
- export interface DocumentSymbolParams {
142
- textDocument: { uri: string };
143
- }
144
-
145
- /**
146
- * Document symbols come in two shapes: hierarchical `DocumentSymbol[]` (LSP
147
- * 3.10+) or flat `SymbolInformation[]` (legacy). We accept either at the
148
- * Zod level — consumers in `enrich.ts` pick the shape they care about.
149
- */
150
- const DocumentSymbolNodeSchema: z.ZodType<unknown> = z.lazy(() =>
151
- z
152
- .object({
153
- name: z.string(),
154
- kind: z.number(),
155
- range: RangeSchema,
156
- selectionRange: RangeSchema,
157
- detail: z.string().optional(),
158
- children: z.array(DocumentSymbolNodeSchema).optional(),
159
- })
160
- .passthrough()
161
- );
162
-
163
- const SymbolInformationNodeSchema = z
164
- .object({
165
- name: z.string(),
166
- kind: z.number(),
167
- location: LocationSchema,
168
- containerName: z.string().optional(),
169
- })
170
- .passthrough();
171
-
172
- export const DocumentSymbolResponseSchema = z.union([
173
- z.array(DocumentSymbolNodeSchema),
174
- z.array(SymbolInformationNodeSchema),
175
- z.null(),
176
- ]);
177
- export type DocumentSymbolResponse = z.infer<typeof DocumentSymbolResponseSchema>;
178
-
179
- // ============================================================
180
- // workspace/symbol
181
- // ============================================================
182
-
183
- export interface WorkspaceSymbolParams {
184
- query: string;
185
- }
186
-
187
- export const WorkspaceSymbolResponseSchema = z.union([
188
- z.array(SymbolInformationNodeSchema),
189
- z.null(),
190
- ]);
191
- export type WorkspaceSymbolResponse = z.infer<typeof WorkspaceSymbolResponseSchema>;
192
-
193
- // ============================================================
194
- // textDocument/definition
195
- // ============================================================
196
-
197
- export interface DefinitionParams {
198
- textDocument: { uri: string };
199
- position: Position;
200
- }
201
-
202
- /**
203
- * Definition can be a single Location, an array of Locations, or null.
204
- * (LSP also allows `LocationLink[]` — we accept it via passthrough but
205
- * downstream consumers stick to `Location`.)
206
- */
207
- export const DefinitionResponseSchema = z.union([
208
- LocationSchema,
209
- z.array(LocationSchema),
210
- z.array(
211
- z
212
- .object({
213
- targetUri: z.string(),
214
- targetRange: RangeSchema,
215
- targetSelectionRange: RangeSchema,
216
- })
217
- .passthrough()
218
- ),
219
- z.null(),
220
- ]);
221
- export type DefinitionResponse = z.infer<typeof DefinitionResponseSchema>;