@massu/core 1.4.0 → 1.5.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 (60) hide show
  1. package/dist/cli.js +9445 -5483
  2. package/dist/hooks/auto-learning-pipeline.js +18 -0
  3. package/dist/hooks/classify-failure.js +18 -0
  4. package/dist/hooks/cost-tracker.js +18 -0
  5. package/dist/hooks/fix-detector.js +18 -0
  6. package/dist/hooks/incident-pipeline.js +18 -0
  7. package/dist/hooks/post-edit-context.js +18 -0
  8. package/dist/hooks/post-tool-use.js +18 -0
  9. package/dist/hooks/pre-compact.js +18 -0
  10. package/dist/hooks/pre-delete-check.js +18 -0
  11. package/dist/hooks/quality-event.js +18 -0
  12. package/dist/hooks/rule-enforcement-pipeline.js +18 -0
  13. package/dist/hooks/session-end.js +18 -0
  14. package/dist/hooks/session-start.js +2668 -2674
  15. package/dist/hooks/user-prompt.js +18 -0
  16. package/docs/AUTHORING-ADAPTERS.md +207 -0
  17. package/docs/SECURITY.md +250 -0
  18. package/package.json +7 -3
  19. package/src/adapter.ts +90 -0
  20. package/src/cli.ts +7 -0
  21. package/src/commands/adapters.ts +824 -0
  22. package/src/commands/config-check-drift.ts +1 -0
  23. package/src/commands/config-refresh.ts +1 -0
  24. package/src/commands/config-upgrade.ts +1 -0
  25. package/src/commands/doctor.ts +2 -0
  26. package/src/commands/init.ts +2 -0
  27. package/src/config.ts +63 -0
  28. package/src/detect/adapters/aspnet.ts +293 -0
  29. package/src/detect/adapters/discover.ts +469 -0
  30. package/src/detect/adapters/go-chi.ts +261 -0
  31. package/src/detect/adapters/index.ts +49 -0
  32. package/src/detect/adapters/phoenix.ts +277 -0
  33. package/src/detect/adapters/python-flask.ts +235 -0
  34. package/src/detect/adapters/rails.ts +279 -0
  35. package/src/detect/adapters/runner.ts +32 -0
  36. package/src/detect/adapters/spring.ts +284 -0
  37. package/src/detect/adapters/tree-sitter-loader.ts +50 -0
  38. package/src/detect/adapters/types.ts +18 -0
  39. package/src/detect/monorepo-detector.ts +1 -0
  40. package/src/hooks/post-tool-use.ts +1 -0
  41. package/src/hooks/session-start.ts +1 -0
  42. package/src/lib/fileLock.ts +203 -0
  43. package/src/lib/installLock.ts +31 -144
  44. package/src/memory-file-ingest.ts +1 -0
  45. package/src/security/adapter-origin.ts +130 -0
  46. package/src/security/adapter-verifier.ts +319 -0
  47. package/src/security/atomic-write.ts +164 -0
  48. package/src/security/fetcher.ts +200 -0
  49. package/src/security/install-tracking.ts +319 -0
  50. package/src/security/local-fingerprint.ts +225 -0
  51. package/src/security/manifest-cache.ts +333 -0
  52. package/src/security/manifest-schema.ts +129 -0
  53. package/src/security/registry-pubkey.generated.ts +35 -0
  54. package/src/security/telemetry.ts +320 -0
  55. package/templates/aspnet/massu.config.yaml +57 -0
  56. package/templates/go-chi/massu.config.yaml +52 -0
  57. package/templates/phoenix/massu.config.yaml +54 -0
  58. package/templates/python-flask/massu.config.yaml +51 -0
  59. package/templates/rails/massu.config.yaml +56 -0
  60. package/templates/spring/massu.config.yaml +56 -0
@@ -292,6 +292,18 @@ var WatchConfigSchema = z.object({
292
292
  max_watched_files: z.number().int().positive().default(1e4),
293
293
  paths_full_root_opt_in: z.boolean().default(false)
294
294
  }).passthrough().optional();
295
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
296
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
297
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
298
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
299
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
300
+ var AdaptersConfigSchema = z.object({
301
+ enabled: z.boolean().default(false),
302
+ local: z.array(AdapterLocalPathSchema).default([])
303
+ }).passthrough().optional();
304
+ var TelemetryConfigSchema = z.object({
305
+ adapters: z.boolean().default(false)
306
+ }).passthrough().optional();
295
307
  var LSPConfigSchema = z.object({
296
308
  enabled: z.boolean().default(false),
297
309
  servers: z.array(z.object({
@@ -347,6 +359,10 @@ var RawConfigSchema = z.object({
347
359
  detected: DetectedConfigSchema,
348
360
  // Plan 3a: file-watcher daemon tunables
349
361
  watch: WatchConfigSchema,
362
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
363
+ adapters: AdaptersConfigSchema,
364
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
365
+ telemetry: TelemetryConfigSchema,
350
366
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
351
367
  lsp: LSPConfigSchema.optional()
352
368
  }).passthrough();
@@ -458,6 +474,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
458
474
  detection: parsed.detection,
459
475
  detected: parsed.detected,
460
476
  watch: parsed.watch,
477
+ adapters: parsed.adapters,
478
+ telemetry: parsed.telemetry,
461
479
  lsp: parsed.lsp
462
480
  };
463
481
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -292,6 +292,18 @@ var WatchConfigSchema = z.object({
292
292
  max_watched_files: z.number().int().positive().default(1e4),
293
293
  paths_full_root_opt_in: z.boolean().default(false)
294
294
  }).passthrough().optional();
295
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
296
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
297
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
298
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
299
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
300
+ var AdaptersConfigSchema = z.object({
301
+ enabled: z.boolean().default(false),
302
+ local: z.array(AdapterLocalPathSchema).default([])
303
+ }).passthrough().optional();
304
+ var TelemetryConfigSchema = z.object({
305
+ adapters: z.boolean().default(false)
306
+ }).passthrough().optional();
295
307
  var LSPConfigSchema = z.object({
296
308
  enabled: z.boolean().default(false),
297
309
  servers: z.array(z.object({
@@ -347,6 +359,10 @@ var RawConfigSchema = z.object({
347
359
  detected: DetectedConfigSchema,
348
360
  // Plan 3a: file-watcher daemon tunables
349
361
  watch: WatchConfigSchema,
362
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
363
+ adapters: AdaptersConfigSchema,
364
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
365
+ telemetry: TelemetryConfigSchema,
350
366
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
351
367
  lsp: LSPConfigSchema.optional()
352
368
  }).passthrough();
@@ -458,6 +474,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
458
474
  detection: parsed.detection,
459
475
  detected: parsed.detected,
460
476
  watch: parsed.watch,
477
+ adapters: parsed.adapters,
478
+ telemetry: parsed.telemetry,
461
479
  lsp: parsed.lsp
462
480
  };
463
481
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -292,6 +292,18 @@ var WatchConfigSchema = z.object({
292
292
  max_watched_files: z.number().int().positive().default(1e4),
293
293
  paths_full_root_opt_in: z.boolean().default(false)
294
294
  }).passthrough().optional();
295
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
296
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
297
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
298
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
299
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
300
+ var AdaptersConfigSchema = z.object({
301
+ enabled: z.boolean().default(false),
302
+ local: z.array(AdapterLocalPathSchema).default([])
303
+ }).passthrough().optional();
304
+ var TelemetryConfigSchema = z.object({
305
+ adapters: z.boolean().default(false)
306
+ }).passthrough().optional();
295
307
  var LSPConfigSchema = z.object({
296
308
  enabled: z.boolean().default(false),
297
309
  servers: z.array(z.object({
@@ -347,6 +359,10 @@ var RawConfigSchema = z.object({
347
359
  detected: DetectedConfigSchema,
348
360
  // Plan 3a: file-watcher daemon tunables
349
361
  watch: WatchConfigSchema,
362
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
363
+ adapters: AdaptersConfigSchema,
364
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
365
+ telemetry: TelemetryConfigSchema,
350
366
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
351
367
  lsp: LSPConfigSchema.optional()
352
368
  }).passthrough();
@@ -458,6 +474,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
458
474
  detection: parsed.detection,
459
475
  detected: parsed.detected,
460
476
  watch: parsed.watch,
477
+ adapters: parsed.adapters,
478
+ telemetry: parsed.telemetry,
461
479
  lsp: parsed.lsp
462
480
  };
463
481
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -292,6 +292,18 @@ var WatchConfigSchema = z.object({
292
292
  max_watched_files: z.number().int().positive().default(1e4),
293
293
  paths_full_root_opt_in: z.boolean().default(false)
294
294
  }).passthrough().optional();
295
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
296
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
297
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
298
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
299
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
300
+ var AdaptersConfigSchema = z.object({
301
+ enabled: z.boolean().default(false),
302
+ local: z.array(AdapterLocalPathSchema).default([])
303
+ }).passthrough().optional();
304
+ var TelemetryConfigSchema = z.object({
305
+ adapters: z.boolean().default(false)
306
+ }).passthrough().optional();
295
307
  var LSPConfigSchema = z.object({
296
308
  enabled: z.boolean().default(false),
297
309
  servers: z.array(z.object({
@@ -347,6 +359,10 @@ var RawConfigSchema = z.object({
347
359
  detected: DetectedConfigSchema,
348
360
  // Plan 3a: file-watcher daemon tunables
349
361
  watch: WatchConfigSchema,
362
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
363
+ adapters: AdaptersConfigSchema,
364
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
365
+ telemetry: TelemetryConfigSchema,
350
366
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
351
367
  lsp: LSPConfigSchema.optional()
352
368
  }).passthrough();
@@ -458,6 +474,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
458
474
  detection: parsed.detection,
459
475
  detected: parsed.detected,
460
476
  watch: parsed.watch,
477
+ adapters: parsed.adapters,
478
+ telemetry: parsed.telemetry,
461
479
  lsp: parsed.lsp
462
480
  };
463
481
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -291,6 +291,18 @@ var WatchConfigSchema = z.object({
291
291
  max_watched_files: z.number().int().positive().default(1e4),
292
292
  paths_full_root_opt_in: z.boolean().default(false)
293
293
  }).passthrough().optional();
294
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
295
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
296
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
297
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
298
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
299
+ var AdaptersConfigSchema = z.object({
300
+ enabled: z.boolean().default(false),
301
+ local: z.array(AdapterLocalPathSchema).default([])
302
+ }).passthrough().optional();
303
+ var TelemetryConfigSchema = z.object({
304
+ adapters: z.boolean().default(false)
305
+ }).passthrough().optional();
294
306
  var LSPConfigSchema = z.object({
295
307
  enabled: z.boolean().default(false),
296
308
  servers: z.array(z.object({
@@ -346,6 +358,10 @@ var RawConfigSchema = z.object({
346
358
  detected: DetectedConfigSchema,
347
359
  // Plan 3a: file-watcher daemon tunables
348
360
  watch: WatchConfigSchema,
361
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
362
+ adapters: AdaptersConfigSchema,
363
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
364
+ telemetry: TelemetryConfigSchema,
349
365
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
350
366
  lsp: LSPConfigSchema.optional()
351
367
  }).passthrough();
@@ -457,6 +473,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
457
473
  detection: parsed.detection,
458
474
  detected: parsed.detected,
459
475
  watch: parsed.watch,
476
+ adapters: parsed.adapters,
477
+ telemetry: parsed.telemetry,
460
478
  lsp: parsed.lsp
461
479
  };
462
480
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -290,6 +290,18 @@ var WatchConfigSchema = z.object({
290
290
  max_watched_files: z.number().int().positive().default(1e4),
291
291
  paths_full_root_opt_in: z.boolean().default(false)
292
292
  }).passthrough().optional();
293
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
294
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
295
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
296
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
297
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
298
+ var AdaptersConfigSchema = z.object({
299
+ enabled: z.boolean().default(false),
300
+ local: z.array(AdapterLocalPathSchema).default([])
301
+ }).passthrough().optional();
302
+ var TelemetryConfigSchema = z.object({
303
+ adapters: z.boolean().default(false)
304
+ }).passthrough().optional();
293
305
  var LSPConfigSchema = z.object({
294
306
  enabled: z.boolean().default(false),
295
307
  servers: z.array(z.object({
@@ -345,6 +357,10 @@ var RawConfigSchema = z.object({
345
357
  detected: DetectedConfigSchema,
346
358
  // Plan 3a: file-watcher daemon tunables
347
359
  watch: WatchConfigSchema,
360
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
361
+ adapters: AdaptersConfigSchema,
362
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
363
+ telemetry: TelemetryConfigSchema,
348
364
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
349
365
  lsp: LSPConfigSchema.optional()
350
366
  }).passthrough();
@@ -456,6 +472,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
456
472
  detection: parsed.detection,
457
473
  detected: parsed.detected,
458
474
  watch: parsed.watch,
475
+ adapters: parsed.adapters,
476
+ telemetry: parsed.telemetry,
459
477
  lsp: parsed.lsp
460
478
  };
461
479
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -292,6 +292,18 @@ var WatchConfigSchema = z.object({
292
292
  max_watched_files: z.number().int().positive().default(1e4),
293
293
  paths_full_root_opt_in: z.boolean().default(false)
294
294
  }).passthrough().optional();
295
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
296
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
297
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
298
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
299
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
300
+ var AdaptersConfigSchema = z.object({
301
+ enabled: z.boolean().default(false),
302
+ local: z.array(AdapterLocalPathSchema).default([])
303
+ }).passthrough().optional();
304
+ var TelemetryConfigSchema = z.object({
305
+ adapters: z.boolean().default(false)
306
+ }).passthrough().optional();
295
307
  var LSPConfigSchema = z.object({
296
308
  enabled: z.boolean().default(false),
297
309
  servers: z.array(z.object({
@@ -347,6 +359,10 @@ var RawConfigSchema = z.object({
347
359
  detected: DetectedConfigSchema,
348
360
  // Plan 3a: file-watcher daemon tunables
349
361
  watch: WatchConfigSchema,
362
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
363
+ adapters: AdaptersConfigSchema,
364
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
365
+ telemetry: TelemetryConfigSchema,
350
366
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
351
367
  lsp: LSPConfigSchema.optional()
352
368
  }).passthrough();
@@ -458,6 +474,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
458
474
  detection: parsed.detection,
459
475
  detected: parsed.detected,
460
476
  watch: parsed.watch,
477
+ adapters: parsed.adapters,
478
+ telemetry: parsed.telemetry,
461
479
  lsp: parsed.lsp
462
480
  };
463
481
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -292,6 +292,18 @@ var WatchConfigSchema = z.object({
292
292
  max_watched_files: z.number().int().positive().default(1e4),
293
293
  paths_full_root_opt_in: z.boolean().default(false)
294
294
  }).passthrough().optional();
295
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
296
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
297
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
298
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
299
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
300
+ var AdaptersConfigSchema = z.object({
301
+ enabled: z.boolean().default(false),
302
+ local: z.array(AdapterLocalPathSchema).default([])
303
+ }).passthrough().optional();
304
+ var TelemetryConfigSchema = z.object({
305
+ adapters: z.boolean().default(false)
306
+ }).passthrough().optional();
295
307
  var LSPConfigSchema = z.object({
296
308
  enabled: z.boolean().default(false),
297
309
  servers: z.array(z.object({
@@ -347,6 +359,10 @@ var RawConfigSchema = z.object({
347
359
  detected: DetectedConfigSchema,
348
360
  // Plan 3a: file-watcher daemon tunables
349
361
  watch: WatchConfigSchema,
362
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
363
+ adapters: AdaptersConfigSchema,
364
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
365
+ telemetry: TelemetryConfigSchema,
350
366
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
351
367
  lsp: LSPConfigSchema.optional()
352
368
  }).passthrough();
@@ -458,6 +474,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
458
474
  detection: parsed.detection,
459
475
  detected: parsed.detected,
460
476
  watch: parsed.watch,
477
+ adapters: parsed.adapters,
478
+ telemetry: parsed.telemetry,
461
479
  lsp: parsed.lsp
462
480
  };
463
481
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -291,6 +291,18 @@ var WatchConfigSchema = z.object({
291
291
  max_watched_files: z.number().int().positive().default(1e4),
292
292
  paths_full_root_opt_in: z.boolean().default(false)
293
293
  }).passthrough().optional();
294
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
295
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
296
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
297
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
298
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
299
+ var AdaptersConfigSchema = z.object({
300
+ enabled: z.boolean().default(false),
301
+ local: z.array(AdapterLocalPathSchema).default([])
302
+ }).passthrough().optional();
303
+ var TelemetryConfigSchema = z.object({
304
+ adapters: z.boolean().default(false)
305
+ }).passthrough().optional();
294
306
  var LSPConfigSchema = z.object({
295
307
  enabled: z.boolean().default(false),
296
308
  servers: z.array(z.object({
@@ -346,6 +358,10 @@ var RawConfigSchema = z.object({
346
358
  detected: DetectedConfigSchema,
347
359
  // Plan 3a: file-watcher daemon tunables
348
360
  watch: WatchConfigSchema,
361
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
362
+ adapters: AdaptersConfigSchema,
363
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
364
+ telemetry: TelemetryConfigSchema,
349
365
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
350
366
  lsp: LSPConfigSchema.optional()
351
367
  }).passthrough();
@@ -457,6 +473,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
457
473
  detection: parsed.detection,
458
474
  detected: parsed.detected,
459
475
  watch: parsed.watch,
476
+ adapters: parsed.adapters,
477
+ telemetry: parsed.telemetry,
460
478
  lsp: parsed.lsp
461
479
  };
462
480
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -292,6 +292,18 @@ var WatchConfigSchema = z.object({
292
292
  max_watched_files: z.number().int().positive().default(1e4),
293
293
  paths_full_root_opt_in: z.boolean().default(false)
294
294
  }).passthrough().optional();
295
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
296
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
297
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
298
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
299
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
300
+ var AdaptersConfigSchema = z.object({
301
+ enabled: z.boolean().default(false),
302
+ local: z.array(AdapterLocalPathSchema).default([])
303
+ }).passthrough().optional();
304
+ var TelemetryConfigSchema = z.object({
305
+ adapters: z.boolean().default(false)
306
+ }).passthrough().optional();
295
307
  var LSPConfigSchema = z.object({
296
308
  enabled: z.boolean().default(false),
297
309
  servers: z.array(z.object({
@@ -347,6 +359,10 @@ var RawConfigSchema = z.object({
347
359
  detected: DetectedConfigSchema,
348
360
  // Plan 3a: file-watcher daemon tunables
349
361
  watch: WatchConfigSchema,
362
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
363
+ adapters: AdaptersConfigSchema,
364
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
365
+ telemetry: TelemetryConfigSchema,
350
366
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
351
367
  lsp: LSPConfigSchema.optional()
352
368
  }).passthrough();
@@ -458,6 +474,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
458
474
  detection: parsed.detection,
459
475
  detected: parsed.detected,
460
476
  watch: parsed.watch,
477
+ adapters: parsed.adapters,
478
+ telemetry: parsed.telemetry,
461
479
  lsp: parsed.lsp
462
480
  };
463
481
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -290,6 +290,18 @@ var WatchConfigSchema = z.object({
290
290
  max_watched_files: z.number().int().positive().default(1e4),
291
291
  paths_full_root_opt_in: z.boolean().default(false)
292
292
  }).passthrough().optional();
293
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
294
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
295
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
296
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
297
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
298
+ var AdaptersConfigSchema = z.object({
299
+ enabled: z.boolean().default(false),
300
+ local: z.array(AdapterLocalPathSchema).default([])
301
+ }).passthrough().optional();
302
+ var TelemetryConfigSchema = z.object({
303
+ adapters: z.boolean().default(false)
304
+ }).passthrough().optional();
293
305
  var LSPConfigSchema = z.object({
294
306
  enabled: z.boolean().default(false),
295
307
  servers: z.array(z.object({
@@ -345,6 +357,10 @@ var RawConfigSchema = z.object({
345
357
  detected: DetectedConfigSchema,
346
358
  // Plan 3a: file-watcher daemon tunables
347
359
  watch: WatchConfigSchema,
360
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
361
+ adapters: AdaptersConfigSchema,
362
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
363
+ telemetry: TelemetryConfigSchema,
348
364
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
349
365
  lsp: LSPConfigSchema.optional()
350
366
  }).passthrough();
@@ -456,6 +472,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
456
472
  detection: parsed.detection,
457
473
  detected: parsed.detected,
458
474
  watch: parsed.watch,
475
+ adapters: parsed.adapters,
476
+ telemetry: parsed.telemetry,
459
477
  lsp: parsed.lsp
460
478
  };
461
479
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {
@@ -292,6 +292,18 @@ var WatchConfigSchema = z.object({
292
292
  max_watched_files: z.number().int().positive().default(1e4),
293
293
  paths_full_root_opt_in: z.boolean().default(false)
294
294
  }).passthrough().optional();
295
+ var AdapterLocalPathSchema = z.string().refine((s) => !/^([A-Za-z]:[\\/]|[\\/])/.test(s), {
296
+ message: "absolute paths are rejected; adapters.local entries must be relative to the massu.config.yaml directory"
297
+ }).refine((s) => !s.split(/[\\/]/).includes(".."), {
298
+ message: "parent-directory traversal (`..`) is rejected; adapters.local entries must stay inside the project tree"
299
+ }).transform((s) => s.split(/[\\/]/).filter((part) => part !== "" && part !== ".").join("/"));
300
+ var AdaptersConfigSchema = z.object({
301
+ enabled: z.boolean().default(false),
302
+ local: z.array(AdapterLocalPathSchema).default([])
303
+ }).passthrough().optional();
304
+ var TelemetryConfigSchema = z.object({
305
+ adapters: z.boolean().default(false)
306
+ }).passthrough().optional();
295
307
  var LSPConfigSchema = z.object({
296
308
  enabled: z.boolean().default(false),
297
309
  servers: z.array(z.object({
@@ -347,6 +359,10 @@ var RawConfigSchema = z.object({
347
359
  detected: DetectedConfigSchema,
348
360
  // Plan 3a: file-watcher daemon tunables
349
361
  watch: WatchConfigSchema,
362
+ // Plan 3c: third-party adapter registry kill-switch + signing override + local-path opt-in.
363
+ adapters: AdaptersConfigSchema,
364
+ // Plan 3c: anonymous adapter-discovery telemetry opt-in (default off).
365
+ telemetry: TelemetryConfigSchema,
350
366
  // Plan 3b Phase 4: optional LSP enrichment of AST adapter results.
351
367
  lsp: LSPConfigSchema.optional()
352
368
  }).passthrough();
@@ -458,6 +474,8 @@ Hint: run \`massu config refresh\` to regenerate a valid config or fix the liste
458
474
  detection: parsed.detection,
459
475
  detected: parsed.detected,
460
476
  watch: parsed.watch,
477
+ adapters: parsed.adapters,
478
+ telemetry: parsed.telemetry,
461
479
  lsp: parsed.lsp
462
480
  };
463
481
  if (!_config.cloud?.apiKey && process.env.MASSU_API_KEY) {