@a-company/paradigm 3.1.5 → 3.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 (80) hide show
  1. package/dist/{accept-orchestration-CWZNCGZX.js → accept-orchestration-DIGPJVUR.js} +6 -5
  2. package/dist/{aggregate-W7Q6VIM2.js → aggregate-V4KPR3RW.js} +2 -2
  3. package/dist/{beacon-B47XSTL7.js → beacon-XRXL5KZB.js} +2 -2
  4. package/dist/{chunk-4LGLU2LO.js → chunk-2E2RTBSM.js} +533 -182
  5. package/dist/{chunk-YCLN7WXV.js → chunk-2QNZ6PVD.js} +219 -35
  6. package/dist/{chunk-UM54F7G5.js → chunk-4N6AYEEA.js} +1 -1
  7. package/dist/{chunk-MVXJVRFI.js → chunk-5TUAVVIG.js} +65 -1
  8. package/dist/{chunk-5C4SGQKH.js → chunk-6P4IFIK2.js} +4 -2
  9. package/dist/{chunk-WS5KM7OL.js → chunk-6RNYVBSG.js} +1 -1
  10. package/dist/{chunk-N6PJAPDE.js → chunk-AK5M6KJB.js} +18 -0
  11. package/dist/{chunk-VZ7CXFRZ.js → chunk-CRICL4FQ.js} +1004 -17
  12. package/dist/{chunk-MC7XC7XQ.js → chunk-GZDFVP2N.js} +20 -13
  13. package/dist/chunk-HPC3JAUP.js +42 -0
  14. package/dist/chunk-IRVA7NKV.js +657 -0
  15. package/dist/{chunk-ZPN7MXRA.js → chunk-KFHK6EBI.js} +184 -1
  16. package/dist/{chunk-UUZ2DMG5.js → chunk-KWDTBXP2.js} +1 -1
  17. package/dist/{chunk-DRUDZKIT.js → chunk-M2XMTJHQ.js} +693 -70
  18. package/dist/{chunk-PW2EXJQT.js → chunk-MRENOFTR.js} +24 -1
  19. package/dist/{chunk-QS36NGWV.js → chunk-QHJGB5TV.js} +1 -1
  20. package/dist/chunk-UI3XXVJ6.js +449 -0
  21. package/dist/{chunk-AD2LSCHB.js → chunk-Y4XZWCHK.js} +40 -74
  22. package/dist/{constellation-K3CIQCHI.js → constellation-GNK5DIMH.js} +2 -2
  23. package/dist/{cost-AEK6R7HK.js → cost-AGO5N7DD.js} +1 -1
  24. package/dist/{cursorrules-KI5QWHIX.js → cursorrules-LQFA7M62.js} +2 -2
  25. package/dist/{delete-W67IVTLJ.js → delete-3YXAJ5AA.js} +12 -1
  26. package/dist/{diff-AJJ5H6HV.js → diff-J6C5IHPV.js} +6 -5
  27. package/dist/{dist-2F7NO4H4-KSL6SJIO.js → dist-AG5JNIZU-XSEZ2LLK.js} +28 -3
  28. package/dist/dist-JOHRYQUA.js +7294 -0
  29. package/dist/{dist-NHJQVVUW.js → dist-Q6SAZI7X.js} +2 -2
  30. package/dist/{dist-GPQ4LAY3.js → dist-YP2CO4TG.js} +24 -6
  31. package/dist/{doctor-JBIV5PMN.js → doctor-TQYRF7KK.js} +2 -2
  32. package/dist/{edit-Y7XPYSMK.js → edit-EOMPXOG5.js} +1 -1
  33. package/dist/flow-7JUH6D4H.js +185 -0
  34. package/dist/global-AXILUM5X.js +136 -0
  35. package/dist/{habits-FA65W77Y.js → habits-CHP4EW5H.js} +234 -5
  36. package/dist/{hooks-JKWO44WH.js → hooks-DLZEYHI3.js} +1 -1
  37. package/dist/index.js +125 -100
  38. package/dist/{lint-HXKTWRNO.js → lint-N4LMMEXH.js} +141 -1
  39. package/dist/{list-R3QWW4SC.js → list-JKBJ7ESH.js} +1 -1
  40. package/dist/mcp.js +9273 -6515
  41. package/dist/{orchestrate-4ZH5GUQH.js → orchestrate-FAV64G2R.js} +6 -5
  42. package/dist/{probe-OYCP4JYG.js → probe-X3J2JX62.js} +18 -3
  43. package/dist/{promote-E6NBZ3BK.js → promote-HZH5E5CO.js} +1 -1
  44. package/dist/{providers-4PGPZEWP.js → providers-NQ67LO2Z.js} +1 -1
  45. package/dist/{record-OHQNWOUP.js → record-EECZ3E4I.js} +1 -1
  46. package/dist/{remember-6VZ74B7E.js → remember-3KJZGDUG.js} +1 -1
  47. package/dist/{review-RUHX25A5.js → review-BF26ILZB.js} +1 -1
  48. package/dist/{ripple-SBQOSTZD.js → ripple-JIUAMBLA.js} +2 -2
  49. package/dist/sentinel-ZTL224IG.js +63 -0
  50. package/dist/{server-MV4HNFVF.js → server-MZBYDXJY.js} +4193 -9
  51. package/dist/{setup-DF4F3ICN.js → setup-363IB6MO.js} +1 -1
  52. package/dist/{setup-JHBPZAG7.js → setup-UKJ3VGHI.js} +4 -4
  53. package/dist/{shift-2LQFQP4P.js → shift-KDVYB6CR.js} +16 -13
  54. package/dist/{show-WTOJXUTN.js → show-SAMTXEHG.js} +1 -1
  55. package/dist/{snapshot-GTVPRYZG.js → snapshot-KCMONZAO.js} +2 -2
  56. package/dist/{spawn-BJRQA2NR.js → spawn-EO7B2UM3.js} +2 -2
  57. package/dist/{summary-5SBFO7QK.js → summary-E2PU4UN2.js} +3 -3
  58. package/dist/{switch-6EANJ7O6.js → switch-CC2KACXO.js} +1 -1
  59. package/dist/{sync-5KSTPJ4B.js → sync-5VJPZQNX.js} +2 -2
  60. package/dist/sync-llms-7QDA3ZWC.js +166 -0
  61. package/dist/{team-NWP2KJAB.js → team-6CCNANKE.js} +7 -6
  62. package/dist/{test-MA5TWJQV.js → test-DK2RWLTK.js} +91 -8
  63. package/dist/{thread-JCJVRUQR.js → thread-RNSLADXN.js} +18 -2
  64. package/dist/{timeline-P7BARFLI.js → timeline-TJDVVVA3.js} +1 -1
  65. package/dist/{triage-TBIWJA6R.js → triage-PXMU3RWV.js} +2 -2
  66. package/dist/university-content/courses/para-101.json +2 -1
  67. package/dist/university-content/courses/para-201.json +102 -3
  68. package/dist/university-content/courses/para-301.json +14 -11
  69. package/dist/university-content/courses/para-401.json +57 -3
  70. package/dist/university-content/courses/para-501.json +204 -6
  71. package/dist/university-content/plsat/v3.0.json +808 -3
  72. package/dist/university-content/reference.json +270 -0
  73. package/dist/{upgrade-TIYFQYPO.js → upgrade-RBSE4M6I.js} +1 -1
  74. package/dist/{validate-QEEY6KFS.js → validate-2LTHHORX.js} +1 -1
  75. package/dist/{watch-4LT4O6K7.js → watch-NBPOMOEX.js} +76 -0
  76. package/dist/{watch-2XEYUH43.js → watch-PAEH6MOG.js} +1 -1
  77. package/package.json +1 -1
  78. package/dist/chunk-GWM2WRXL.js +0 -1095
  79. package/dist/sentinel-WB7GIK4V.js +0 -43
  80. /package/dist/{chunk-TAP5N3HH.js → chunk-CCG6KYBT.js} +0 -0
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  detectIDE,
4
4
  getAdapter
5
- } from "./chunk-YCLN7WXV.js";
5
+ } from "./chunk-2QNZ6PVD.js";
6
6
  import {
7
7
  log
8
8
  } from "./chunk-4NCFWYGG.js";
@@ -261,6 +261,189 @@ async function doctorCommand(options = {}) {
261
261
  message: "No unresolved markers"
262
262
  });
263
263
  }
264
+ const portalPath = path.join(cwd, "portal.yaml");
265
+ if (fs.existsSync(portalPath)) {
266
+ try {
267
+ const portalContent = fs.readFileSync(portalPath, "utf8");
268
+ const { parse } = await import("./dist-JOHRYQUA.js");
269
+ const portal = parse(portalContent);
270
+ if (portal?.version && portal?.gates) {
271
+ const gateCount = Object.keys(portal.gates || {}).length;
272
+ const routeCount = Object.keys(portal.routes || {}).length;
273
+ results.push({
274
+ name: "portal.yaml",
275
+ status: "ok",
276
+ message: `Valid (${gateCount} gates, ${routeCount} routes)`
277
+ });
278
+ } else {
279
+ results.push({
280
+ name: "portal.yaml",
281
+ status: "warn",
282
+ message: "Missing version or gates section",
283
+ fix: 'Add version: "1.0" and gates: {} to portal.yaml'
284
+ });
285
+ }
286
+ } catch (e) {
287
+ results.push({
288
+ name: "portal.yaml",
289
+ status: "error",
290
+ message: `Invalid YAML: ${e.message}`,
291
+ fix: "Check YAML syntax in portal.yaml"
292
+ });
293
+ }
294
+ }
295
+ const flowsPath = path.join(paradigmDir, "flows.yaml");
296
+ if (fs.existsSync(flowsPath)) {
297
+ try {
298
+ const flowsContent = fs.readFileSync(flowsPath, "utf8");
299
+ const { parse } = await import("./dist-JOHRYQUA.js");
300
+ const flows = parse(flowsContent);
301
+ if (flows?.version && flows?.flows) {
302
+ const flowCount = Object.keys(flows.flows || {}).length;
303
+ const emptyFlows = Object.entries(flows.flows || {}).filter(
304
+ ([, f]) => !f?.steps || (f.steps?.length ?? 0) === 0
305
+ );
306
+ if (emptyFlows.length > 0) {
307
+ results.push({
308
+ name: ".paradigm/flows.yaml",
309
+ status: "warn",
310
+ message: `${flowCount} flows defined, ${emptyFlows.length} have no steps`,
311
+ fix: "Add steps to empty flow definitions"
312
+ });
313
+ } else {
314
+ results.push({
315
+ name: ".paradigm/flows.yaml",
316
+ status: "ok",
317
+ message: `Valid (${flowCount} flows)`
318
+ });
319
+ }
320
+ } else {
321
+ results.push({
322
+ name: ".paradigm/flows.yaml",
323
+ status: "warn",
324
+ message: "Missing version or flows section",
325
+ fix: 'Ensure flows.yaml has version: "1.0" and flows: {}'
326
+ });
327
+ }
328
+ } catch (e) {
329
+ results.push({
330
+ name: ".paradigm/flows.yaml",
331
+ status: "error",
332
+ message: `Invalid YAML: ${e.message}`,
333
+ fix: "Check YAML syntax in flows.yaml"
334
+ });
335
+ }
336
+ }
337
+ const loreDir = path.join(paradigmDir, "lore");
338
+ if (fs.existsSync(loreDir)) {
339
+ try {
340
+ const loreFiles = fs.readdirSync(loreDir).filter((f) => f.endsWith(".yaml"));
341
+ if (loreFiles.length === 0) {
342
+ results.push({
343
+ name: "Lore entries",
344
+ status: "warn",
345
+ message: "Lore directory exists but no entries found",
346
+ fix: "Record a lore entry: paradigm lore record"
347
+ });
348
+ } else {
349
+ results.push({
350
+ name: "Lore entries",
351
+ status: "ok",
352
+ message: `${loreFiles.length} lore file${loreFiles.length > 1 ? "s" : ""}`
353
+ });
354
+ }
355
+ } catch {
356
+ results.push({
357
+ name: "Lore entries",
358
+ status: "warn",
359
+ message: "Could not read lore directory"
360
+ });
361
+ }
362
+ }
363
+ const hooksJsonPath = path.join(cwd, ".claude", "hooks.json");
364
+ const pluginHooksPath = path.join(cwd, "plugins", "paradigm", "hooks.json");
365
+ if (fs.existsSync(hooksJsonPath)) {
366
+ const stat = fs.statSync(hooksJsonPath);
367
+ const ageMs = Date.now() - stat.mtime.getTime();
368
+ const ageDays = Math.floor(ageMs / (1e3 * 60 * 60 * 24));
369
+ if (ageDays > 30) {
370
+ results.push({
371
+ name: "Claude Code hooks",
372
+ status: "warn",
373
+ message: `Hooks are ${ageDays} days old \u2014 may be outdated`,
374
+ fix: "paradigm hooks install"
375
+ });
376
+ } else {
377
+ results.push({
378
+ name: "Claude Code hooks",
379
+ status: "ok",
380
+ message: ageDays > 0 ? `${ageDays} days old` : "Fresh"
381
+ });
382
+ }
383
+ } else if (fs.existsSync(pluginHooksPath)) {
384
+ results.push({
385
+ name: "Claude Code hooks",
386
+ status: "ok",
387
+ message: "Using plugin hooks"
388
+ });
389
+ } else {
390
+ results.push({
391
+ name: "Claude Code hooks",
392
+ status: "missing",
393
+ message: "No hooks installed",
394
+ fix: "paradigm hooks install"
395
+ });
396
+ }
397
+ const habitsPath = path.join(paradigmDir, "habits.yaml");
398
+ if (fs.existsSync(habitsPath)) {
399
+ try {
400
+ const habitsContent = fs.readFileSync(habitsPath, "utf8");
401
+ const { parse } = await import("./dist-JOHRYQUA.js");
402
+ const habits = parse(habitsContent);
403
+ if (habits?.version && Array.isArray(habits?.habits)) {
404
+ const enabled = habits.habits.filter((h) => h.enabled !== false).length;
405
+ results.push({
406
+ name: "Habits config",
407
+ status: "ok",
408
+ message: `Valid (${enabled}/${habits.habits.length} enabled)`
409
+ });
410
+ } else {
411
+ results.push({
412
+ name: "Habits config",
413
+ status: "warn",
414
+ message: "Missing version or habits array",
415
+ fix: "Regenerate habits.yaml with paradigm habits init"
416
+ });
417
+ }
418
+ } catch (e) {
419
+ results.push({
420
+ name: "Habits config",
421
+ status: "error",
422
+ message: `Invalid YAML: ${e.message}`,
423
+ fix: "Check YAML syntax in habits.yaml"
424
+ });
425
+ }
426
+ }
427
+ const agentsMdPath = path.join(cwd, "AGENTS.md");
428
+ if (fs.existsSync(agentsMdPath)) {
429
+ const stat = fs.statSync(agentsMdPath);
430
+ const ageMs = Date.now() - stat.mtime.getTime();
431
+ const ageDays = Math.floor(ageMs / (1e3 * 60 * 60 * 24));
432
+ if (ageDays > 60) {
433
+ results.push({
434
+ name: "AGENTS.md",
435
+ status: "warn",
436
+ message: `${ageDays} days since last update \u2014 may be stale`,
437
+ fix: "paradigm sync"
438
+ });
439
+ } else {
440
+ results.push({
441
+ name: "AGENTS.md",
442
+ status: "ok",
443
+ message: ageDays > 0 ? `Updated ${ageDays} days ago` : "Fresh"
444
+ });
445
+ }
446
+ }
264
447
  let errorCount = 0;
265
448
  let warnCount = 0;
266
449
  let missingCount = 0;
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getScanProtocol
4
- } from "./chunk-N6PJAPDE.js";
4
+ } from "./chunk-AK5M6KJB.js";
5
5
 
6
6
  // src/core/cursorrules.ts
7
7
  import * as fs from "fs";