cortex-tms 3.2.0 → 4.0.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 (120) hide show
  1. package/README.md +238 -529
  2. package/dist/cli.js +14 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/archive.d.ts +5 -0
  5. package/dist/commands/archive.d.ts.map +1 -0
  6. package/dist/commands/archive.js +83 -0
  7. package/dist/commands/archive.js.map +1 -0
  8. package/dist/commands/dashboard.d.ts +3 -0
  9. package/dist/commands/dashboard.d.ts.map +1 -0
  10. package/dist/commands/dashboard.js +20 -0
  11. package/dist/commands/dashboard.js.map +1 -0
  12. package/dist/commands/review.js +19 -1
  13. package/dist/commands/review.js.map +1 -1
  14. package/dist/commands/status.d.ts +1 -0
  15. package/dist/commands/status.d.ts.map +1 -1
  16. package/dist/commands/status.js +4 -100
  17. package/dist/commands/status.js.map +1 -1
  18. package/dist/types/cli.d.ts +8 -0
  19. package/dist/types/cli.d.ts.map +1 -1
  20. package/dist/ui/components/Dashboard.d.ts +11 -0
  21. package/dist/ui/components/Dashboard.d.ts.map +1 -0
  22. package/dist/ui/components/Dashboard.js +63 -0
  23. package/dist/ui/components/Dashboard.js.map +1 -0
  24. package/dist/ui/components/dashboard/ContextReductionCard.d.ts +9 -0
  25. package/dist/ui/components/dashboard/ContextReductionCard.d.ts.map +1 -0
  26. package/dist/ui/components/dashboard/ContextReductionCard.js +38 -0
  27. package/dist/ui/components/dashboard/ContextReductionCard.js.map +1 -0
  28. package/dist/ui/components/dashboard/CostSavingsCard.d.ts +10 -0
  29. package/dist/ui/components/dashboard/CostSavingsCard.d.ts.map +1 -0
  30. package/dist/ui/components/dashboard/CostSavingsCard.js +45 -0
  31. package/dist/ui/components/dashboard/CostSavingsCard.js.map +1 -0
  32. package/dist/ui/components/dashboard/FileDistributionCard.d.ts +10 -0
  33. package/dist/ui/components/dashboard/FileDistributionCard.d.ts.map +1 -0
  34. package/dist/ui/components/dashboard/FileDistributionCard.js +51 -0
  35. package/dist/ui/components/dashboard/FileDistributionCard.js.map +1 -0
  36. package/dist/ui/components/dashboard/FileSizeHealthCard.d.ts +15 -0
  37. package/dist/ui/components/dashboard/FileSizeHealthCard.d.ts.map +1 -0
  38. package/dist/ui/components/dashboard/FileSizeHealthCard.js +48 -0
  39. package/dist/ui/components/dashboard/FileSizeHealthCard.js.map +1 -0
  40. package/dist/ui/components/dashboard/Footer.d.ts +3 -0
  41. package/dist/ui/components/dashboard/Footer.d.ts.map +1 -0
  42. package/dist/ui/components/dashboard/Footer.js +13 -0
  43. package/dist/ui/components/dashboard/Footer.js.map +1 -0
  44. package/dist/ui/components/dashboard/GovernanceHealthCard.d.ts +10 -0
  45. package/dist/ui/components/dashboard/GovernanceHealthCard.d.ts.map +1 -0
  46. package/dist/ui/components/dashboard/GovernanceHealthCard.js +43 -0
  47. package/dist/ui/components/dashboard/GovernanceHealthCard.js.map +1 -0
  48. package/dist/ui/components/dashboard/GuardianStatusCard.d.ts +10 -0
  49. package/dist/ui/components/dashboard/GuardianStatusCard.d.ts.map +1 -0
  50. package/dist/ui/components/dashboard/GuardianStatusCard.js +58 -0
  51. package/dist/ui/components/dashboard/GuardianStatusCard.js.map +1 -0
  52. package/dist/ui/components/dashboard/Header.d.ts +7 -0
  53. package/dist/ui/components/dashboard/Header.d.ts.map +1 -0
  54. package/dist/ui/components/dashboard/Header.js +21 -0
  55. package/dist/ui/components/dashboard/Header.js.map +1 -0
  56. package/dist/ui/components/dashboard/HotFilesCard.d.ts +8 -0
  57. package/dist/ui/components/dashboard/HotFilesCard.d.ts.map +1 -0
  58. package/dist/ui/components/dashboard/HotFilesCard.js +28 -0
  59. package/dist/ui/components/dashboard/HotFilesCard.js.map +1 -0
  60. package/dist/ui/components/dashboard/NotConfiguredCard.d.ts +10 -0
  61. package/dist/ui/components/dashboard/NotConfiguredCard.d.ts.map +1 -0
  62. package/dist/ui/components/dashboard/NotConfiguredCard.js +13 -0
  63. package/dist/ui/components/dashboard/NotConfiguredCard.js.map +1 -0
  64. package/dist/ui/components/dashboard/SprintProgressCard.d.ts +11 -0
  65. package/dist/ui/components/dashboard/SprintProgressCard.d.ts.map +1 -0
  66. package/dist/ui/components/dashboard/SprintProgressCard.js +33 -0
  67. package/dist/ui/components/dashboard/SprintProgressCard.js.map +1 -0
  68. package/dist/ui/components/dashboard/StalenessCard.d.ts +10 -0
  69. package/dist/ui/components/dashboard/StalenessCard.d.ts.map +1 -0
  70. package/dist/ui/components/dashboard/StalenessCard.js +43 -0
  71. package/dist/ui/components/dashboard/StalenessCard.js.map +1 -0
  72. package/dist/ui/components/dashboard/TabBar.d.ts +8 -0
  73. package/dist/ui/components/dashboard/TabBar.d.ts.map +1 -0
  74. package/dist/ui/components/dashboard/TabBar.js +16 -0
  75. package/dist/ui/components/dashboard/TabBar.js.map +1 -0
  76. package/dist/ui/components/dashboard/ValidationCard.d.ts +10 -0
  77. package/dist/ui/components/dashboard/ValidationCard.d.ts.map +1 -0
  78. package/dist/ui/components/dashboard/ValidationCard.js +62 -0
  79. package/dist/ui/components/dashboard/ValidationCard.js.map +1 -0
  80. package/dist/ui/components/dashboard/ViewContainer.d.ts +14 -0
  81. package/dist/ui/components/dashboard/ViewContainer.d.ts.map +1 -0
  82. package/dist/ui/components/dashboard/ViewContainer.js +53 -0
  83. package/dist/ui/components/dashboard/ViewContainer.js.map +1 -0
  84. package/dist/ui/components/dashboard/index.d.ts +14 -0
  85. package/dist/ui/components/dashboard/index.d.ts.map +1 -0
  86. package/dist/ui/components/dashboard/index.js +14 -0
  87. package/dist/ui/components/dashboard/index.js.map +1 -0
  88. package/dist/ui/index.d.ts +5 -0
  89. package/dist/ui/index.d.ts.map +1 -0
  90. package/dist/ui/index.js +46 -0
  91. package/dist/ui/index.js.map +1 -0
  92. package/dist/utils/git-staleness.d.ts +13 -0
  93. package/dist/utils/git-staleness.d.ts.map +1 -0
  94. package/dist/utils/git-staleness.js +129 -0
  95. package/dist/utils/git-staleness.js.map +1 -0
  96. package/dist/utils/stats-collector.d.ts +62 -0
  97. package/dist/utils/stats-collector.d.ts.map +1 -0
  98. package/dist/utils/stats-collector.js +253 -0
  99. package/dist/utils/stats-collector.js.map +1 -0
  100. package/dist/utils/validation.d.ts +1 -10
  101. package/dist/utils/validation.d.ts.map +1 -1
  102. package/dist/utils/validation.js +1 -15
  103. package/dist/utils/validation.js.map +1 -1
  104. package/dist/utils/validator.d.ts.map +1 -1
  105. package/dist/utils/validator.js +66 -1
  106. package/dist/utils/validator.js.map +1 -1
  107. package/package.json +6 -2
  108. package/templates/CLAUDE.md +1 -1
  109. package/templates/FUTURE-ENHANCEMENTS.md +1 -1
  110. package/templates/NEXT-TASKS.md +1 -1
  111. package/templates/PROMPTS.md +1 -1
  112. package/templates/README.md +1 -1
  113. package/templates/docs/archive/v1.0-CHANGELOG.md +1 -1
  114. package/templates/docs/core/ARCHITECTURE.md +1 -1
  115. package/templates/docs/core/DECISIONS.md +1 -1
  116. package/templates/docs/core/DOMAIN-LOGIC.md +1 -1
  117. package/templates/docs/core/GLOSSARY.md +1 -1
  118. package/templates/docs/core/PATTERNS.md +1 -1
  119. package/templates/docs/core/SCHEMA.md +1 -1
  120. package/templates/docs/core/TROUBLESHOOTING.md +1 -1
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ import { Box, Text, Newline } from 'ink';
3
+ export const StalenessCard = ({ staleDocsCount, totalDocsCount, freshnessPercent, oldestDocDays, }) => {
4
+ const isFresh = staleDocsCount === 0;
5
+ const color = isFresh ? 'green' : freshnessPercent >= 70 ? 'yellow' : 'red';
6
+ return (React.createElement(React.Fragment, null,
7
+ React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: color, padding: 1 },
8
+ React.createElement(Box, { justifyContent: "center" },
9
+ React.createElement(Text, { bold: true, color: color }, "\uD83D\uDCC5 DOCUMENTATION FRESHNESS")),
10
+ React.createElement(Newline, null),
11
+ React.createElement(Box, { justifyContent: "center" },
12
+ React.createElement(Text, { bold: true, color: color, dimColor: false }, '█'.repeat(Math.min(40, Math.round(freshnessPercent / 2.5))))),
13
+ React.createElement(Newline, null),
14
+ React.createElement(Box, { justifyContent: "center" },
15
+ React.createElement(Text, { bold: true, color: color },
16
+ React.createElement(Text, { color: "white", bold: true, underline: true },
17
+ freshnessPercent.toFixed(0),
18
+ "%"))),
19
+ React.createElement(Newline, null),
20
+ React.createElement(Box, { justifyContent: "center" },
21
+ React.createElement(Text, { dimColor: true },
22
+ "Fresh docs:",
23
+ ' ',
24
+ React.createElement(Text, { color: color },
25
+ totalDocsCount - staleDocsCount,
26
+ "/",
27
+ totalDocsCount))),
28
+ oldestDocDays !== undefined && oldestDocDays > 0 && (React.createElement(Box, { justifyContent: "center" },
29
+ React.createElement(Text, { dimColor: true },
30
+ "Oldest:",
31
+ ' ',
32
+ React.createElement(Text, { color: oldestDocDays > 60 ? 'red' : 'yellow' },
33
+ oldestDocDays,
34
+ " days")))),
35
+ React.createElement(Box, { justifyContent: "center" },
36
+ React.createElement(Text, { dimColor: true },
37
+ "Status:",
38
+ ' ',
39
+ React.createElement(Text, { color: color }, isFresh ? 'All docs current' : `${staleDocsCount} need review`)))),
40
+ React.createElement(Newline, null),
41
+ React.createElement(Newline, null)));
42
+ };
43
+ //# sourceMappingURL=StalenessCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StalenessCard.js","sourceRoot":"","sources":["../../../../src/ui/components/dashboard/StalenessCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAYzC,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EAC1D,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,EAAE,EAAE;IACH,MAAM,OAAO,GAAG,cAAc,KAAK,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAE5E,OAAO,CACL;QACE,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAC5E,oBAAC,GAAG,IAAC,cAAc,EAAC,QAAQ;gBAC1B,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,2CAEhB,CACH;YAEN,oBAAC,OAAO,OAAG;YAEX,oBAAC,GAAG,IAAC,cAAc,EAAC,QAAQ;gBAC1B,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,IACrC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,CAAC,CACxD,CACH;YAEN,oBAAC,OAAO,OAAG;YAEX,oBAAC,GAAG,IAAC,cAAc,EAAC,QAAQ;gBAC1B,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK;oBACrB,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,QAAC,SAAS;wBAC/B,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;4BACvB,CACF,CACH;YAEN,oBAAC,OAAO,OAAG;YAEX,oBAAC,GAAG,IAAC,cAAc,EAAC,QAAQ;gBAC1B,oBAAC,IAAI,IAAC,QAAQ;;oBACA,GAAG;oBACf,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;wBACf,cAAc,GAAG,cAAc;;wBAAG,cAAc,CAC5C,CACF,CACH;YAEL,aAAa,KAAK,SAAS,IAAI,aAAa,GAAG,CAAC,IAAI,CACnD,oBAAC,GAAG,IAAC,cAAc,EAAC,QAAQ;gBAC1B,oBAAC,IAAI,IAAC,QAAQ;;oBACJ,GAAG;oBACX,oBAAC,IAAI,IAAC,KAAK,EAAE,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;wBAC/C,aAAa;gCACT,CACF,CACH,CACP;YAED,oBAAC,GAAG,IAAC,cAAc,EAAC,QAAQ;gBAC1B,oBAAC,IAAI,IAAC,QAAQ;;oBACJ,GAAG;oBACX,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IACf,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,cAAc,cAAc,CAC1D,CACF,CACH,CACF;QAEN,oBAAC,OAAO,OAAG;QACX,oBAAC,OAAO,OAAG,CACV,CACJ,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export type ViewType = 'overview' | 'files' | 'health';
3
+ interface TabBarProps {
4
+ activeView: ViewType;
5
+ }
6
+ export declare const TabBar: React.FC<TabBarProps>;
7
+ export {};
8
+ //# sourceMappingURL=TabBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabBar.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/dashboard/TabBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEvD,UAAU,WAAW;IACnB,UAAU,EAAE,QAAQ,CAAC;CACtB;AAKD,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAsBxC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import { Box, Text } from 'ink';
3
+ export const TabBar = ({ activeView }) => {
4
+ const tabs = [
5
+ { key: 'overview', label: '1. Overview', number: '1' },
6
+ { key: 'files', label: '2. Files', number: '2' },
7
+ { key: 'health', label: '3. Health', number: '3' },
8
+ ];
9
+ return (React.createElement(Box, { paddingX: 2 }, tabs.map((tab, index) => {
10
+ const isActive = activeView === tab.key;
11
+ return (React.createElement(React.Fragment, { key: tab.key },
12
+ index > 0 && React.createElement(Text, { dimColor: true }, " "),
13
+ React.createElement(Text, { bold: isActive, color: isActive ? 'cyan' : 'gray' }, isActive ? `[${tab.label}]` : tab.label)));
14
+ })));
15
+ };
16
+ //# sourceMappingURL=TabBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabBar.js","sourceRoot":"","sources":["../../../../src/ui/components/dashboard/TabBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAWhC,MAAM,CAAC,MAAM,MAAM,GAA0B,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG;QACX,EAAE,GAAG,EAAE,UAAsB,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE;QAClE,EAAE,GAAG,EAAE,OAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE;QAC5D,EAAE,GAAG,EAAE,QAAoB,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE;KAC/D,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,IACb,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,QAAQ,GAAG,UAAU,KAAK,GAAG,CAAC,GAAG,CAAC;QACxC,OAAO,CACL,oBAAC,KAAK,CAAC,QAAQ,IAAC,GAAG,EAAE,GAAG,CAAC,GAAG;YACzB,KAAK,GAAG,CAAC,IAAI,oBAAC,IAAI,IAAC,QAAQ,iBAAY;YACxC,oBAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IACpD,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CACnC,CACQ,CAClB,CAAC;IACJ,CAAC,CAAC,CACE,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ type ValidationStatus = 'healthy' | 'warnings' | 'errors' | 'unknown';
3
+ interface ValidationCardProps {
4
+ status: ValidationStatus;
5
+ violations: number;
6
+ lastChecked: Date | null;
7
+ }
8
+ export declare const ValidationCard: React.FC<ValidationCardProps>;
9
+ export {};
10
+ //# sourceMappingURL=ValidationCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationCard.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/dashboard/ValidationCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,KAAK,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAGtE,UAAU,mBAAmB;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAgCD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAyCxD,CAAC"}
@@ -0,0 +1,62 @@
1
+ import React from 'react';
2
+ import { Box, Text, Newline } from 'ink';
3
+ function getHealthEmoji(status) {
4
+ if (status === 'healthy')
5
+ return '✅';
6
+ if (status === 'warnings')
7
+ return '⚠️ ';
8
+ if (status === 'errors')
9
+ return '❌';
10
+ return '❓';
11
+ }
12
+ function getHealthText(status, violations) {
13
+ if (status === 'healthy')
14
+ return 'HEALTHY';
15
+ if (status === 'warnings')
16
+ return `${violations} warnings`;
17
+ if (status === 'errors')
18
+ return `${violations} errors`;
19
+ return 'Not validated';
20
+ }
21
+ function getHealthColor(status) {
22
+ if (status === 'healthy')
23
+ return 'green';
24
+ if (status === 'warnings')
25
+ return 'yellow';
26
+ if (status === 'errors')
27
+ return 'red';
28
+ return 'gray';
29
+ }
30
+ function getTimeAgo(date) {
31
+ const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
32
+ if (seconds < 60)
33
+ return `${seconds}s ago`;
34
+ if (seconds < 3600)
35
+ return `${Math.floor(seconds / 60)}m ago`;
36
+ if (seconds < 86400)
37
+ return `${Math.floor(seconds / 3600)}h ago`;
38
+ return `${Math.floor(seconds / 86400)}d ago`;
39
+ }
40
+ export const ValidationCard = ({ status, violations, lastChecked, }) => {
41
+ const color = getHealthColor(status);
42
+ return (React.createElement(React.Fragment, null,
43
+ React.createElement(Box, { flexDirection: "column", borderStyle: "single", borderColor: color, paddingX: 1 },
44
+ React.createElement(Text, { bold: true, color: color }, "\uD83D\uDEE1\uFE0F VALIDATION STATUS"),
45
+ React.createElement(Newline, null),
46
+ React.createElement(Box, null,
47
+ React.createElement(Text, { color: color },
48
+ getHealthEmoji(status),
49
+ " ",
50
+ getHealthText(status, violations))),
51
+ React.createElement(Newline, null),
52
+ lastChecked ? (React.createElement(Box, null,
53
+ React.createElement(Text, { dimColor: true },
54
+ "Last checked: ",
55
+ getTimeAgo(lastChecked)))) : (React.createElement(Box, null,
56
+ React.createElement(Text, { dimColor: true }, "Run "),
57
+ React.createElement(Text, { color: "cyan" }, "cortex-tms validate"),
58
+ React.createElement(Text, { dimColor: true }, " to check project health")))),
59
+ React.createElement(Newline, null),
60
+ React.createElement(Newline, null)));
61
+ };
62
+ //# sourceMappingURL=ValidationCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationCard.js","sourceRoot":"","sources":["../../../../src/ui/components/dashboard/ValidationCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAWzC,SAAS,cAAc,CAAC,MAAwB;IAC9C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IACrC,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,MAAwB,EAAE,UAAkB;IACjE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,GAAG,UAAU,WAAW,CAAC;IAC3D,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,UAAU,SAAS,CAAC;IACvD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,MAAwB;IAC9C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACzC,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAEjE,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,IAAI,OAAO,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;IAC9D,IAAI,OAAO,GAAG,KAAK;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IACjE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAkC,CAAC,EAC5D,MAAM,EACN,UAAU,EACV,WAAW,GACZ,EAAE,EAAE;IACH,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAErC,OAAO,CACL;QACE,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YAC9E,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,4CAEhB;YAEP,oBAAC,OAAO,OAAG;YAEX,oBAAC,GAAG;gBACF,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;oBACf,cAAc,CAAC,MAAM,CAAC;;oBAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CACtD,CACH;YAEN,oBAAC,OAAO,OAAG;YAEV,WAAW,CAAC,CAAC,CAAC,CACb,oBAAC,GAAG;gBACF,oBAAC,IAAI,IAAC,QAAQ;;oBAAgB,UAAU,CAAC,WAAW,CAAC,CAAQ,CACzD,CACP,CAAC,CAAC,CAAC,CACF,oBAAC,GAAG;gBACF,oBAAC,IAAI,IAAC,QAAQ,iBAAY;gBAC1B,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,0BAA2B;gBAC7C,oBAAC,IAAI,IAAC,QAAQ,qCAAgC,CAC1C,CACP,CACG;QAEN,oBAAC,OAAO,OAAG;QACX,oBAAC,OAAO,OAAG,CACV,CACJ,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { TMSStats } from '../../../utils/stats-collector.js';
3
+ import type { ViewType } from './TabBar.js';
4
+ interface ViewContainerProps {
5
+ view: ViewType;
6
+ stats: TMSStats;
7
+ contextReduction: number;
8
+ typicalReads: number;
9
+ total: number;
10
+ hotFiles: string[];
11
+ }
12
+ export declare const ViewContainer: React.FC<ViewContainerProps>;
13
+ export {};
14
+ //# sourceMappingURL=ViewContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewContainer.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/dashboard/ViewContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAU7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,UAAU,kBAAkB;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAKD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAqHtD,CAAC"}
@@ -0,0 +1,53 @@
1
+ import React from 'react';
2
+ import { Box } from 'ink';
3
+ import { StalenessCard } from './StalenessCard.js';
4
+ import { SprintProgressCard } from './SprintProgressCard.js';
5
+ import { GovernanceHealthCard } from './GovernanceHealthCard.js';
6
+ import { HotFilesCard } from './HotFilesCard.js';
7
+ import { FileDistributionCard } from './FileDistributionCard.js';
8
+ import { FileSizeHealthCard } from './FileSizeHealthCard.js';
9
+ import { ValidationCard } from './ValidationCard.js';
10
+ import { GuardianStatusCard } from './GuardianStatusCard.js';
11
+ import { NotConfiguredCard } from './NotConfiguredCard.js';
12
+ export const ViewContainer = ({ view, stats, total, hotFiles, }) => {
13
+ const { files, sprint, fileSizeHealth, validation, guardian } = stats;
14
+ if (view === 'overview') {
15
+ const calculateGovernanceScore = () => {
16
+ let score = 100;
17
+ if (validation.status === 'errors')
18
+ score -= 40;
19
+ else if (validation.status === 'warnings')
20
+ score -= 20;
21
+ else if (validation.status === 'unknown')
22
+ score -= 10;
23
+ if (guardian && guardian.status === 'major_violations')
24
+ score -= 30;
25
+ else if (guardian && guardian.status === 'minor_issues')
26
+ score -= 15;
27
+ return Math.max(0, score);
28
+ };
29
+ const staleness = stats.staleness;
30
+ const staleDocsCount = staleness?.staleDocsCount || 0;
31
+ const totalDocsCount = staleness?.totalChecked || 0;
32
+ const freshnessPercent = staleness?.freshnessPercent || 100;
33
+ const oldestDocDays = staleness?.oldestDocDays ?? undefined;
34
+ const governanceScore = calculateGovernanceScore();
35
+ return (React.createElement(Box, { flexDirection: "column" },
36
+ React.createElement(GovernanceHealthCard, { score: governanceScore, validationStatus: validation.status, guardianStatus: guardian?.status || 'unknown', staleness: staleDocsCount }),
37
+ totalDocsCount > 0 && (React.createElement(StalenessCard, { staleDocsCount: staleDocsCount, totalDocsCount: totalDocsCount, freshnessPercent: freshnessPercent, oldestDocDays: oldestDocDays })),
38
+ sprint ? (React.createElement(SprintProgressCard, { sprintName: sprint.name, progress: sprint.progress, done: sprint.tasks.done, inProgress: sprint.tasks.inProgress, todo: sprint.tasks.todo })) : (React.createElement(NotConfiguredCard, { title: "SPRINT PROGRESS", message: "No sprint configured in NEXT-TASKS.md", icon: "\uD83C\uDFAF", color: "gray" }))));
39
+ }
40
+ if (view === 'files') {
41
+ return (React.createElement(Box, { flexDirection: "column" },
42
+ React.createElement(HotFilesCard, { hotFiles: hotFiles, count: files.hot }),
43
+ React.createElement(FileDistributionCard, { hot: files.hot, warm: files.warm, cold: files.cold, total: total }),
44
+ fileSizeHealth && fileSizeHealth.length > 0 && (React.createElement(FileSizeHealthCard, { files: fileSizeHealth }))));
45
+ }
46
+ if (view === 'health') {
47
+ return (React.createElement(Box, { flexDirection: "column" },
48
+ React.createElement(ValidationCard, { status: validation.status, violations: validation.violations, lastChecked: validation.lastChecked }),
49
+ guardian ? (React.createElement(GuardianStatusCard, { status: guardian.status, violationCount: guardian.violationCount, highConfidenceCount: guardian.highConfidenceCount, lastChecked: guardian.lastChecked })) : (React.createElement(GuardianStatusCard, { status: "unknown", violationCount: 0, highConfidenceCount: 0, lastChecked: null }))));
50
+ }
51
+ return null;
52
+ };
53
+ //# sourceMappingURL=ViewContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewContainer.js","sourceRoot":"","sources":["../../../../src/ui/components/dashboard/ViewContainer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { Header } from './Header.js';
2
+ export { HotFilesCard } from './HotFilesCard.js';
3
+ export { FileDistributionCard } from './FileDistributionCard.js';
4
+ export { ValidationCard } from './ValidationCard.js';
5
+ export { Footer } from './Footer.js';
6
+ export { SprintProgressCard } from './SprintProgressCard.js';
7
+ export { GovernanceHealthCard } from './GovernanceHealthCard.js';
8
+ export { StalenessCard } from './StalenessCard.js';
9
+ export { FileSizeHealthCard } from './FileSizeHealthCard.js';
10
+ export { GuardianStatusCard } from './GuardianStatusCard.js';
11
+ export { TabBar } from './TabBar.js';
12
+ export { ViewContainer } from './ViewContainer.js';
13
+ export { NotConfiguredCard } from './NotConfiguredCard.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/dashboard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export { Header } from './Header.js';
2
+ export { HotFilesCard } from './HotFilesCard.js';
3
+ export { FileDistributionCard } from './FileDistributionCard.js';
4
+ export { ValidationCard } from './ValidationCard.js';
5
+ export { Footer } from './Footer.js';
6
+ export { SprintProgressCard } from './SprintProgressCard.js';
7
+ export { GovernanceHealthCard } from './GovernanceHealthCard.js';
8
+ export { StalenessCard } from './StalenessCard.js';
9
+ export { FileSizeHealthCard } from './FileSizeHealthCard.js';
10
+ export { GuardianStatusCard } from './GuardianStatusCard.js';
11
+ export { TabBar } from './TabBar.js';
12
+ export { ViewContainer } from './ViewContainer.js';
13
+ export { NotConfiguredCard } from './NotConfiguredCard.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/components/dashboard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function renderDashboard(options?: {
2
+ cwd?: string;
3
+ live?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.tsx"],"names":[],"mappings":"AA6DA,wBAAgB,eAAe,CAAC,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,iBAM7E"}
@@ -0,0 +1,46 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { render } from 'ink';
3
+ import { Dashboard } from './components/Dashboard.js';
4
+ import { collectTMSStats } from '../utils/stats-collector.js';
5
+ const DashboardApp = ({ cwd, live = false }) => {
6
+ const [stats, setStats] = useState(null);
7
+ const [loading, setLoading] = useState(true);
8
+ const [error, setError] = useState(null);
9
+ useEffect(() => {
10
+ const loadStats = async () => {
11
+ try {
12
+ setLoading(true);
13
+ const newStats = await collectTMSStats(cwd);
14
+ setStats(newStats);
15
+ setError(null);
16
+ }
17
+ catch (err) {
18
+ setError(err instanceof Error ? err.message : 'Failed to load stats');
19
+ }
20
+ finally {
21
+ setLoading(false);
22
+ }
23
+ };
24
+ loadStats();
25
+ if (live) {
26
+ const interval = setInterval(loadStats, 5000);
27
+ return () => clearInterval(interval);
28
+ }
29
+ return undefined;
30
+ }, [cwd, live]);
31
+ if (!stats) {
32
+ return React.createElement(Dashboard, { stats: {
33
+ files: { hot: 0, warm: 0, cold: 0, total: 0 },
34
+ hotFiles: [],
35
+ validation: { status: 'unknown', violations: 0, lastChecked: null },
36
+ project: { name: '', hasTMS: false },
37
+ }, loading: loading, error: error });
38
+ }
39
+ return React.createElement(Dashboard, { stats: stats, hotFiles: stats.hotFiles, loading: loading, error: error });
40
+ };
41
+ export function renderDashboard(options = {}) {
42
+ const { cwd = process.cwd(), live = false } = options;
43
+ const { waitUntilExit } = render(React.createElement(DashboardApp, { cwd: cwd, live: live }));
44
+ return waitUntilExit();
45
+ }
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAY,MAAM,6BAA6B,CAAC;AAUxE,MAAM,YAAY,GAAgC,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,KAAK,EAAE,EAAE,EAAE;IAC1E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAkB,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAGxD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;YAC3B,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;gBAC5C,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;YACxE,CAAC;oBAAS,CAAC;gBACT,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;QAEF,SAAS,EAAE,CAAC;QAGZ,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC9C,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAEhB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,oBAAC,SAAS,IAAC,KAAK,EACrB;gBACE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC7C,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE;gBACnE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;aACrC,EACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;IACvC,CAAC;IAED,OAAO,oBAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;AAC/F,CAAC,CAAC;AAKF,MAAM,UAAU,eAAe,CAAC,UAA4C,EAAE;IAC5E,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEtD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,oBAAC,YAAY,IAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAC;IAEzE,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface StalenessResult {
2
+ isStale: boolean;
3
+ docLastModified: number | null;
4
+ codeLastModified: number | null;
5
+ daysSinceDocUpdate: number | null;
6
+ meaningfulCommits: number;
7
+ reason: string;
8
+ }
9
+ export declare function getLastGitCommitEpochSeconds(pathSpec: string, cwd: string): number | null;
10
+ export declare function countMeaningfulCommits(pathSpec: string, sinceEpoch: number, cwd: string): number;
11
+ export declare function isShallowClone(cwd: string): boolean;
12
+ export declare function checkDocStaleness(docPath: string, watchPaths: string[], thresholdDays: number, minCommits: number, cwd: string): StalenessResult;
13
+ //# sourceMappingURL=git-staleness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-staleness.d.ts","sourceRoot":"","sources":["../../src/utils/git-staleness.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBzF;AAMD,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,GACV,MAAM,CAmDR;AAKD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGnD;AAKD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,GACV,eAAe,CAgFjB"}
@@ -0,0 +1,129 @@
1
+ import { execSync } from 'child_process';
2
+ import { existsSync } from 'fs';
3
+ export function getLastGitCommitEpochSeconds(pathSpec, cwd) {
4
+ try {
5
+ const result = execSync(`git log -1 --format=%ct -- "${pathSpec}"`, {
6
+ cwd,
7
+ encoding: 'utf-8',
8
+ stdio: ['pipe', 'pipe', 'ignore'],
9
+ }).trim();
10
+ if (!result) {
11
+ return null;
12
+ }
13
+ const timestamp = parseInt(result, 10);
14
+ return isNaN(timestamp) ? null : timestamp;
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ export function countMeaningfulCommits(pathSpec, sinceEpoch, cwd) {
21
+ try {
22
+ const result = execSync(`git log --no-merges --format=%H --since="${sinceEpoch}" -- "${pathSpec}"`, {
23
+ cwd,
24
+ encoding: 'utf-8',
25
+ stdio: ['pipe', 'pipe', 'ignore'],
26
+ }).trim();
27
+ if (!result) {
28
+ return 0;
29
+ }
30
+ const commits = result.split('\n').filter(Boolean);
31
+ let meaningfulCount = 0;
32
+ for (const commitHash of commits) {
33
+ const files = execSync(`git diff-tree --no-commit-id --name-only -r ${commitHash}`, {
34
+ cwd,
35
+ encoding: 'utf-8',
36
+ stdio: ['pipe', 'pipe', 'ignore'],
37
+ })
38
+ .trim()
39
+ .split('\n')
40
+ .filter(Boolean);
41
+ const hasMeaningfulFile = files.some((file) => !file.includes('test') &&
42
+ !file.includes('.test.') &&
43
+ !file.includes('package-lock.json') &&
44
+ !file.includes('yarn.lock') &&
45
+ !file.includes('pnpm-lock.yaml') &&
46
+ !file.endsWith('.config.js') &&
47
+ !file.endsWith('.config.ts'));
48
+ if (hasMeaningfulFile) {
49
+ meaningfulCount++;
50
+ }
51
+ }
52
+ return meaningfulCount;
53
+ }
54
+ catch {
55
+ return 0;
56
+ }
57
+ }
58
+ export function isShallowClone(cwd) {
59
+ const shallowFile = `${cwd}/.git/shallow`;
60
+ return existsSync(shallowFile);
61
+ }
62
+ export function checkDocStaleness(docPath, watchPaths, thresholdDays, minCommits, cwd) {
63
+ const docTimestamp = getLastGitCommitEpochSeconds(docPath, cwd);
64
+ if (docTimestamp === null) {
65
+ return {
66
+ isStale: false,
67
+ docLastModified: null,
68
+ codeLastModified: null,
69
+ daysSinceDocUpdate: null,
70
+ meaningfulCommits: 0,
71
+ reason: 'Doc has no git history (may be new or untracked)',
72
+ };
73
+ }
74
+ let mostRecentCodeTimestamp = 0;
75
+ for (const watchPath of watchPaths) {
76
+ const timestamp = getLastGitCommitEpochSeconds(watchPath, cwd);
77
+ if (timestamp && timestamp > mostRecentCodeTimestamp) {
78
+ mostRecentCodeTimestamp = timestamp;
79
+ }
80
+ }
81
+ if (mostRecentCodeTimestamp === 0) {
82
+ return {
83
+ isStale: false,
84
+ docLastModified: docTimestamp,
85
+ codeLastModified: null,
86
+ daysSinceDocUpdate: null,
87
+ meaningfulCommits: 0,
88
+ reason: 'No code changes found in watched paths',
89
+ };
90
+ }
91
+ const secondsSinceDocUpdate = mostRecentCodeTimestamp - docTimestamp;
92
+ const daysSinceDocUpdate = secondsSinceDocUpdate / (60 * 60 * 24);
93
+ if (daysSinceDocUpdate <= 0) {
94
+ return {
95
+ isStale: false,
96
+ docLastModified: docTimestamp,
97
+ codeLastModified: mostRecentCodeTimestamp,
98
+ daysSinceDocUpdate: 0,
99
+ meaningfulCommits: 0,
100
+ reason: 'Doc is up to date (modified after code)',
101
+ };
102
+ }
103
+ let totalMeaningfulCommits = 0;
104
+ for (const watchPath of watchPaths) {
105
+ totalMeaningfulCommits += countMeaningfulCommits(watchPath, docTimestamp, cwd);
106
+ }
107
+ const exceedsTimeThreshold = daysSinceDocUpdate > thresholdDays;
108
+ const exceedsCommitThreshold = totalMeaningfulCommits >= minCommits;
109
+ const isStale = exceedsTimeThreshold && exceedsCommitThreshold;
110
+ let reason = '';
111
+ if (isStale) {
112
+ reason = `Doc is ${Math.round(daysSinceDocUpdate)} days older than code with ${totalMeaningfulCommits} meaningful commits`;
113
+ }
114
+ else if (exceedsTimeThreshold && !exceedsCommitThreshold) {
115
+ reason = `Time threshold exceeded but only ${totalMeaningfulCommits} commits (< ${minCommits} minimum)`;
116
+ }
117
+ else {
118
+ reason = `Within ${thresholdDays} day threshold (${Math.round(daysSinceDocUpdate)} days)`;
119
+ }
120
+ return {
121
+ isStale,
122
+ docLastModified: docTimestamp,
123
+ codeLastModified: mostRecentCodeTimestamp,
124
+ daysSinceDocUpdate: Math.round(daysSinceDocUpdate),
125
+ meaningfulCommits: totalMeaningfulCommits,
126
+ reason,
127
+ };
128
+ }
129
+ //# sourceMappingURL=git-staleness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-staleness.js","sourceRoot":"","sources":["../../src/utils/git-staleness.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAehC,MAAM,UAAU,4BAA4B,CAAC,QAAgB,EAAE,GAAW;IACxE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,+BAA+B,QAAQ,GAAG,EAAE;YAClE,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,UAAkB,EAClB,GAAW;IAEX,IAAI,CAAC;QAEH,MAAM,MAAM,GAAG,QAAQ,CACrB,4CAA4C,UAAU,SAAS,QAAQ,GAAG,EAC1E;YACE,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SAClC,CACF,CAAC,IAAI,EAAE,CAAC;QAET,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAGnD,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,KAAK,MAAM,UAAU,IAAI,OAAO,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,+CAA+C,UAAU,EAAE,EAAE;gBAClF,GAAG;gBACH,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;aAClC,CAAC;iBACC,IAAI,EAAE;iBACN,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,OAAO,CAAC,CAAC;YAGnB,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAClC,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACtB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACxB,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACnC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC3B,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBAChC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAC5B,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC/B,CAAC;YAEF,IAAI,iBAAiB,EAAE,CAAC;gBACtB,eAAe,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,WAAW,GAAG,GAAG,GAAG,eAAe,CAAC;IAC1C,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAKD,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,UAAoB,EACpB,aAAqB,EACrB,UAAkB,EAClB,GAAW;IAGX,MAAM,YAAY,GAAG,4BAA4B,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAEhE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,eAAe,EAAE,IAAI;YACrB,gBAAgB,EAAE,IAAI;YACtB,kBAAkB,EAAE,IAAI;YACxB,iBAAiB,EAAE,CAAC;YACpB,MAAM,EAAE,kDAAkD;SAC3D,CAAC;IACJ,CAAC;IAGD,IAAI,uBAAuB,GAAG,CAAC,CAAC;IAChC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,4BAA4B,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,SAAS,IAAI,SAAS,GAAG,uBAAuB,EAAE,CAAC;YACrD,uBAAuB,GAAG,SAAS,CAAC;QACtC,CAAC;IACH,CAAC;IAED,IAAI,uBAAuB,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,eAAe,EAAE,YAAY;YAC7B,gBAAgB,EAAE,IAAI;YACtB,kBAAkB,EAAE,IAAI;YACxB,iBAAiB,EAAE,CAAC;YACpB,MAAM,EAAE,wCAAwC;SACjD,CAAC;IACJ,CAAC;IAGD,MAAM,qBAAqB,GAAG,uBAAuB,GAAG,YAAY,CAAC;IACrE,MAAM,kBAAkB,GAAG,qBAAqB,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAGlE,IAAI,kBAAkB,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,eAAe,EAAE,YAAY;YAC7B,gBAAgB,EAAE,uBAAuB;YACzC,kBAAkB,EAAE,CAAC;YACrB,iBAAiB,EAAE,CAAC;YACpB,MAAM,EAAE,yCAAyC;SAClD,CAAC;IACJ,CAAC;IAGD,IAAI,sBAAsB,GAAG,CAAC,CAAC;IAC/B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,sBAAsB,IAAI,sBAAsB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IAGD,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,aAAa,CAAC;IAChE,MAAM,sBAAsB,GAAG,sBAAsB,IAAI,UAAU,CAAC;IAEpE,MAAM,OAAO,GAAG,oBAAoB,IAAI,sBAAsB,CAAC;IAE/D,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,UAAU,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,8BAA8B,sBAAsB,qBAAqB,CAAC;IAC7H,CAAC;SAAM,IAAI,oBAAoB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC3D,MAAM,GAAG,oCAAoC,sBAAsB,eAAe,UAAU,WAAW,CAAC;IAC1G,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,UAAU,aAAa,mBAAmB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC;IAC5F,CAAC;IAED,OAAO;QACL,OAAO;QACP,eAAe,EAAE,YAAY;QAC7B,gBAAgB,EAAE,uBAAuB;QACzC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAClD,iBAAiB,EAAE,sBAAsB;QACzC,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ export interface TMSStats {
2
+ files: {
3
+ hot: number;
4
+ warm: number;
5
+ cold: number;
6
+ total: number;
7
+ };
8
+ hotFiles: string[];
9
+ validation: {
10
+ status: 'healthy' | 'warnings' | 'errors' | 'unknown';
11
+ violations: number;
12
+ lastChecked: Date | null;
13
+ };
14
+ project: {
15
+ name: string;
16
+ hasTMS: boolean;
17
+ };
18
+ sprint?: {
19
+ name: string;
20
+ progress: number;
21
+ tasks: {
22
+ done: number;
23
+ inProgress: number;
24
+ todo: number;
25
+ };
26
+ };
27
+ savings?: {
28
+ monthlyCost: number;
29
+ tokensAvoided: number;
30
+ percentReduction: number;
31
+ model: string;
32
+ };
33
+ fileSizeHealth?: Array<{
34
+ file: string;
35
+ lines: number;
36
+ limit: number;
37
+ percent: number;
38
+ status: 'healthy' | 'warning' | 'over';
39
+ }>;
40
+ guardian?: {
41
+ status: 'compliant' | 'minor_issues' | 'major_violations' | 'unknown';
42
+ violationCount: number;
43
+ highConfidenceCount: number;
44
+ lastChecked: Date | null;
45
+ };
46
+ staleness?: {
47
+ staleDocsCount: number;
48
+ totalChecked: number;
49
+ freshnessPercent: number;
50
+ oldestDocDays: number | null;
51
+ staleFiles: Array<{
52
+ path: string;
53
+ daysSinceUpdate: number;
54
+ meaningfulCommits: number;
55
+ }>;
56
+ };
57
+ }
58
+ export interface CollectStatsOptions {
59
+ silent?: boolean;
60
+ }
61
+ export declare function collectTMSStats(cwd?: string, options?: CollectStatsOptions): Promise<TMSStats>;
62
+ //# sourceMappingURL=stats-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-collector.d.ts","sourceRoot":"","sources":["../../src/utils/stats-collector.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE;QACV,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;QACtD,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;KAC1B,CAAC;IACF,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3D,CAAC;IACF,OAAO,CAAC,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,cAAc,CAAC,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;KACxC,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,kBAAkB,GAAG,SAAS,CAAC;QACtE,cAAc,EAAE,MAAM,CAAC;QACvB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;KAC1B,CAAC;IACF,SAAS,CAAC,EAAE;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,UAAU,EAAE,KAAK,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,eAAe,EAAE,MAAM,CAAC;YACxB,iBAAiB,EAAE,MAAM,CAAC;SAC3B,CAAC,CAAC;KACJ,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAsED,wBAAsB,eAAe,CACnC,GAAG,GAAE,MAAsB,EAC3B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,QAAQ,CAAC,CA8OnB"}