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.
- package/README.md +238 -529
- package/dist/cli.js +14 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +5 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +83 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +20 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/review.js +19 -1
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +4 -100
- package/dist/commands/status.js.map +1 -1
- package/dist/types/cli.d.ts +8 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/ui/components/Dashboard.d.ts +11 -0
- package/dist/ui/components/Dashboard.d.ts.map +1 -0
- package/dist/ui/components/Dashboard.js +63 -0
- package/dist/ui/components/Dashboard.js.map +1 -0
- package/dist/ui/components/dashboard/ContextReductionCard.d.ts +9 -0
- package/dist/ui/components/dashboard/ContextReductionCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/ContextReductionCard.js +38 -0
- package/dist/ui/components/dashboard/ContextReductionCard.js.map +1 -0
- package/dist/ui/components/dashboard/CostSavingsCard.d.ts +10 -0
- package/dist/ui/components/dashboard/CostSavingsCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/CostSavingsCard.js +45 -0
- package/dist/ui/components/dashboard/CostSavingsCard.js.map +1 -0
- package/dist/ui/components/dashboard/FileDistributionCard.d.ts +10 -0
- package/dist/ui/components/dashboard/FileDistributionCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/FileDistributionCard.js +51 -0
- package/dist/ui/components/dashboard/FileDistributionCard.js.map +1 -0
- package/dist/ui/components/dashboard/FileSizeHealthCard.d.ts +15 -0
- package/dist/ui/components/dashboard/FileSizeHealthCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/FileSizeHealthCard.js +48 -0
- package/dist/ui/components/dashboard/FileSizeHealthCard.js.map +1 -0
- package/dist/ui/components/dashboard/Footer.d.ts +3 -0
- package/dist/ui/components/dashboard/Footer.d.ts.map +1 -0
- package/dist/ui/components/dashboard/Footer.js +13 -0
- package/dist/ui/components/dashboard/Footer.js.map +1 -0
- package/dist/ui/components/dashboard/GovernanceHealthCard.d.ts +10 -0
- package/dist/ui/components/dashboard/GovernanceHealthCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/GovernanceHealthCard.js +43 -0
- package/dist/ui/components/dashboard/GovernanceHealthCard.js.map +1 -0
- package/dist/ui/components/dashboard/GuardianStatusCard.d.ts +10 -0
- package/dist/ui/components/dashboard/GuardianStatusCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/GuardianStatusCard.js +58 -0
- package/dist/ui/components/dashboard/GuardianStatusCard.js.map +1 -0
- package/dist/ui/components/dashboard/Header.d.ts +7 -0
- package/dist/ui/components/dashboard/Header.d.ts.map +1 -0
- package/dist/ui/components/dashboard/Header.js +21 -0
- package/dist/ui/components/dashboard/Header.js.map +1 -0
- package/dist/ui/components/dashboard/HotFilesCard.d.ts +8 -0
- package/dist/ui/components/dashboard/HotFilesCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/HotFilesCard.js +28 -0
- package/dist/ui/components/dashboard/HotFilesCard.js.map +1 -0
- package/dist/ui/components/dashboard/NotConfiguredCard.d.ts +10 -0
- package/dist/ui/components/dashboard/NotConfiguredCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/NotConfiguredCard.js +13 -0
- package/dist/ui/components/dashboard/NotConfiguredCard.js.map +1 -0
- package/dist/ui/components/dashboard/SprintProgressCard.d.ts +11 -0
- package/dist/ui/components/dashboard/SprintProgressCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/SprintProgressCard.js +33 -0
- package/dist/ui/components/dashboard/SprintProgressCard.js.map +1 -0
- package/dist/ui/components/dashboard/StalenessCard.d.ts +10 -0
- package/dist/ui/components/dashboard/StalenessCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/StalenessCard.js +43 -0
- package/dist/ui/components/dashboard/StalenessCard.js.map +1 -0
- package/dist/ui/components/dashboard/TabBar.d.ts +8 -0
- package/dist/ui/components/dashboard/TabBar.d.ts.map +1 -0
- package/dist/ui/components/dashboard/TabBar.js +16 -0
- package/dist/ui/components/dashboard/TabBar.js.map +1 -0
- package/dist/ui/components/dashboard/ValidationCard.d.ts +10 -0
- package/dist/ui/components/dashboard/ValidationCard.d.ts.map +1 -0
- package/dist/ui/components/dashboard/ValidationCard.js +62 -0
- package/dist/ui/components/dashboard/ValidationCard.js.map +1 -0
- package/dist/ui/components/dashboard/ViewContainer.d.ts +14 -0
- package/dist/ui/components/dashboard/ViewContainer.d.ts.map +1 -0
- package/dist/ui/components/dashboard/ViewContainer.js +53 -0
- package/dist/ui/components/dashboard/ViewContainer.js.map +1 -0
- package/dist/ui/components/dashboard/index.d.ts +14 -0
- package/dist/ui/components/dashboard/index.d.ts.map +1 -0
- package/dist/ui/components/dashboard/index.js +14 -0
- package/dist/ui/components/dashboard/index.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +46 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/utils/git-staleness.d.ts +13 -0
- package/dist/utils/git-staleness.d.ts.map +1 -0
- package/dist/utils/git-staleness.js +129 -0
- package/dist/utils/git-staleness.js.map +1 -0
- package/dist/utils/stats-collector.d.ts +62 -0
- package/dist/utils/stats-collector.d.ts.map +1 -0
- package/dist/utils/stats-collector.js +253 -0
- package/dist/utils/stats-collector.js.map +1 -0
- package/dist/utils/validation.d.ts +1 -10
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +1 -15
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/validator.d.ts.map +1 -1
- package/dist/utils/validator.js +66 -1
- package/dist/utils/validator.js.map +1 -1
- package/package.json +6 -2
- package/templates/CLAUDE.md +1 -1
- package/templates/FUTURE-ENHANCEMENTS.md +1 -1
- package/templates/NEXT-TASKS.md +1 -1
- package/templates/PROMPTS.md +1 -1
- package/templates/README.md +1 -1
- package/templates/docs/archive/v1.0-CHANGELOG.md +1 -1
- package/templates/docs/core/ARCHITECTURE.md +1 -1
- package/templates/docs/core/DECISIONS.md +1 -1
- package/templates/docs/core/DOMAIN-LOGIC.md +1 -1
- package/templates/docs/core/GLOSSARY.md +1 -1
- package/templates/docs/core/PATTERNS.md +1 -1
- package/templates/docs/core/SCHEMA.md +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/ui/index.js
ADDED
|
@@ -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":"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"}
|
|
@@ -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"}
|