trinity-method-sdk 2.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/CHANGELOG.md +116 -0
- package/LICENSE +21 -0
- package/README.md +555 -0
- package/dist/cli/commands/deploy/agents.d.ts +14 -0
- package/dist/cli/commands/deploy/agents.js +59 -0
- package/dist/cli/commands/deploy/ci-cd.d.ts +13 -0
- package/dist/cli/commands/deploy/ci-cd.js +50 -0
- package/dist/cli/commands/deploy/claude-setup.d.ts +17 -0
- package/dist/cli/commands/deploy/claude-setup.js +91 -0
- package/dist/cli/commands/deploy/configuration.d.ts +13 -0
- package/dist/cli/commands/deploy/configuration.js +215 -0
- package/dist/cli/commands/deploy/directories.d.ts +12 -0
- package/dist/cli/commands/deploy/directories.js +38 -0
- package/dist/cli/commands/deploy/gitignore.d.ts +12 -0
- package/dist/cli/commands/deploy/gitignore.js +53 -0
- package/dist/cli/commands/deploy/index.d.ts +38 -0
- package/dist/cli/commands/deploy/index.js +156 -0
- package/dist/cli/commands/deploy/knowledge-base.d.ts +16 -0
- package/dist/cli/commands/deploy/knowledge-base.js +75 -0
- package/dist/cli/commands/deploy/linting.d.ts +18 -0
- package/dist/cli/commands/deploy/linting.js +51 -0
- package/dist/cli/commands/deploy/metrics.d.ts +13 -0
- package/dist/cli/commands/deploy/metrics.js +34 -0
- package/dist/cli/commands/deploy/pre-flight.d.ts +13 -0
- package/dist/cli/commands/deploy/pre-flight.js +29 -0
- package/dist/cli/commands/deploy/root-files.d.ts +16 -0
- package/dist/cli/commands/deploy/root-files.js +178 -0
- package/dist/cli/commands/deploy/sdk-install.d.ts +12 -0
- package/dist/cli/commands/deploy/sdk-install.js +57 -0
- package/dist/cli/commands/deploy/summary.d.ts +14 -0
- package/dist/cli/commands/deploy/summary.js +130 -0
- package/dist/cli/commands/deploy/templates.d.ts +14 -0
- package/dist/cli/commands/deploy/templates.js +84 -0
- package/dist/cli/commands/deploy/types.d.ts +39 -0
- package/dist/cli/commands/deploy/types.js +5 -0
- package/dist/cli/commands/update/agents.d.ts +14 -0
- package/dist/cli/commands/update/agents.js +31 -0
- package/dist/cli/commands/update/backup.d.ts +31 -0
- package/dist/cli/commands/update/backup.js +97 -0
- package/dist/cli/commands/update/commands.d.ts +14 -0
- package/dist/cli/commands/update/commands.js +75 -0
- package/dist/cli/commands/update/index.d.ts +15 -0
- package/dist/cli/commands/update/index.js +118 -0
- package/dist/cli/commands/update/knowledge-base.d.ts +14 -0
- package/dist/cli/commands/update/knowledge-base.js +38 -0
- package/dist/cli/commands/update/pre-flight.d.ts +13 -0
- package/dist/cli/commands/update/pre-flight.js +37 -0
- package/dist/cli/commands/update/summary.d.ts +20 -0
- package/dist/cli/commands/update/summary.js +47 -0
- package/dist/cli/commands/update/templates.d.ts +14 -0
- package/dist/cli/commands/update/templates.js +25 -0
- package/dist/cli/commands/update/types.d.ts +13 -0
- package/dist/cli/commands/update/types.js +7 -0
- package/dist/cli/commands/update/utils.d.ts +11 -0
- package/dist/cli/commands/update/utils.js +19 -0
- package/dist/cli/commands/update/verification.d.ts +20 -0
- package/dist/cli/commands/update/verification.js +54 -0
- package/dist/cli/commands/update/version.d.ts +18 -0
- package/dist/cli/commands/update/version.js +36 -0
- package/dist/cli/commands/update.d.ts +7 -0
- package/dist/cli/commands/update.js +7 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +36 -0
- package/dist/cli/types.d.ts +77 -0
- package/dist/cli/types.js +5 -0
- package/dist/cli/utils/deploy-ci.d.ts +22 -0
- package/dist/cli/utils/deploy-ci.js +138 -0
- package/dist/cli/utils/deploy-linting.d.ts +3 -0
- package/dist/cli/utils/deploy-linting.js +136 -0
- package/dist/cli/utils/detect-stack.d.ts +3 -0
- package/dist/cli/utils/detect-stack.js +270 -0
- package/dist/cli/utils/error-classes.d.ts +63 -0
- package/dist/cli/utils/error-classes.js +84 -0
- package/dist/cli/utils/error-handler.d.ts +59 -0
- package/dist/cli/utils/error-handler.js +127 -0
- package/dist/cli/utils/errors.d.ts +52 -0
- package/dist/cli/utils/errors.js +102 -0
- package/dist/cli/utils/get-sdk-path.d.ts +18 -0
- package/dist/cli/utils/get-sdk-path.js +31 -0
- package/dist/cli/utils/inject-dependencies.d.ts +2 -0
- package/dist/cli/utils/inject-dependencies.js +55 -0
- package/dist/cli/utils/linting-tools.d.ts +8 -0
- package/dist/cli/utils/linting-tools.js +206 -0
- package/dist/cli/utils/metrics/code-quality.d.ts +32 -0
- package/dist/cli/utils/metrics/code-quality.js +122 -0
- package/dist/cli/utils/metrics/dependency-parser.d.ts +21 -0
- package/dist/cli/utils/metrics/dependency-parser.js +153 -0
- package/dist/cli/utils/metrics/file-complexity.d.ts +26 -0
- package/dist/cli/utils/metrics/file-complexity.js +77 -0
- package/dist/cli/utils/metrics/framework-detector.d.ts +17 -0
- package/dist/cli/utils/metrics/framework-detector.js +120 -0
- package/dist/cli/utils/metrics/git-metrics.d.ts +30 -0
- package/dist/cli/utils/metrics/git-metrics.js +83 -0
- package/dist/cli/utils/metrics/index.d.ts +28 -0
- package/dist/cli/utils/metrics/index.js +100 -0
- package/dist/cli/utils/template-processor.d.ts +10 -0
- package/dist/cli/utils/template-processor.js +188 -0
- package/dist/cli/utils/validate-path.d.ts +80 -0
- package/dist/cli/utils/validate-path.js +180 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +8 -0
- package/dist/templates/agents/aj-team/apo-documentation-specialist.md.template +572 -0
- package/dist/templates/agents/aj-team/bas-quality-gate.md.template +906 -0
- package/dist/templates/agents/aj-team/bon-dependency-manager.md.template +636 -0
- package/dist/templates/agents/aj-team/cap-configuration-specialist.md.template +670 -0
- package/dist/templates/agents/aj-team/dra-code-reviewer.md.template +768 -0
- package/dist/templates/agents/aj-team/kil-task-executor.md.template +764 -0
- package/dist/templates/agents/aj-team/uro-refactoring-specialist.md.template +759 -0
- package/dist/templates/agents/audit/juno-auditor.md.template +447 -0
- package/dist/templates/agents/deployment/ein-cicd.md.template +694 -0
- package/dist/templates/agents/deployment/ino-context.md.template +733 -0
- package/dist/templates/agents/deployment/tan-structure.md.template +661 -0
- package/dist/templates/agents/deployment/zen-knowledge.md.template +451 -0
- package/dist/templates/agents/leadership/aj-cc.md.template +462 -0
- package/dist/templates/agents/leadership/aj-maestro.md.template +943 -0
- package/dist/templates/agents/leadership/aly-cto.md.template +407 -0
- package/dist/templates/agents/planning/eus-decomposer.md.template +496 -0
- package/dist/templates/agents/planning/mon-requirements.md.template +323 -0
- package/dist/templates/agents/planning/ror-design.md.template +465 -0
- package/dist/templates/agents/planning/tra-planner.md.template +432 -0
- package/dist/templates/ci/cd.yml.template +175 -0
- package/dist/templates/ci/ci.yml.template +196 -0
- package/dist/templates/ci/generic-ci.yml +115 -0
- package/dist/templates/ci/github-actions.yml +86 -0
- package/dist/templates/ci/gitlab-ci.yml +103 -0
- package/dist/templates/claude/EMPLOYEE-DIRECTORY.md.template +545 -0
- package/dist/templates/documentation/ROOT-README.md.template +307 -0
- package/dist/templates/documentation/SUBDIRECTORY-README.md.template +261 -0
- package/dist/templates/investigations/bug.md.template +484 -0
- package/dist/templates/investigations/feature.md.template +564 -0
- package/dist/templates/investigations/performance.md.template +625 -0
- package/dist/templates/investigations/security.md.template +714 -0
- package/dist/templates/investigations/technical.md.template +433 -0
- package/dist/templates/knowledge-base/AI-DEVELOPMENT-GUIDE.md.template +957 -0
- package/dist/templates/knowledge-base/ARCHITECTURE.md.template +452 -0
- package/dist/templates/knowledge-base/CODING-PRINCIPLES.md.template +750 -0
- package/dist/templates/knowledge-base/DOCUMENTATION-CRITERIA.md.template +1118 -0
- package/dist/templates/knowledge-base/ISSUES.md.template +539 -0
- package/dist/templates/knowledge-base/TESTING-PRINCIPLES.md.template +894 -0
- package/dist/templates/knowledge-base/Technical-Debt.md.template +640 -0
- package/dist/templates/knowledge-base/To-do.md.template +407 -0
- package/dist/templates/knowledge-base/Trinity.md.template +464 -0
- package/dist/templates/linting/flutter/.pre-commit-config.yaml.template +27 -0
- package/dist/templates/linting/flutter/analysis_options.yaml.template +26 -0
- package/dist/templates/linting/nodejs/.eslintrc-commonjs.json.template +19 -0
- package/dist/templates/linting/nodejs/.eslintrc-esm.json.template +19 -0
- package/dist/templates/linting/nodejs/.eslintrc-typescript.json.template +22 -0
- package/dist/templates/linting/nodejs/.pre-commit-config.yaml.template +51 -0
- package/dist/templates/linting/nodejs/.prettierrc.json.template +10 -0
- package/dist/templates/linting/python/.flake8.template +16 -0
- package/dist/templates/linting/python/.pre-commit-config.yaml.template +30 -0
- package/dist/templates/linting/python/pyproject.toml.template +38 -0
- package/dist/templates/linting/rust/.pre-commit-config.yaml.template +28 -0
- package/dist/templates/linting/rust/clippy.toml.template +14 -0
- package/dist/templates/linting/rust/rustfmt.toml.template +12 -0
- package/dist/templates/root/CLAUDE.md.template +65 -0
- package/dist/templates/root/TRINITY.md.template +52 -0
- package/dist/templates/shared/claude-commands/trinity-agents.md.template +168 -0
- package/dist/templates/shared/claude-commands/trinity-audit.md.template +646 -0
- package/dist/templates/shared/claude-commands/trinity-changelog.md.template +624 -0
- package/dist/templates/shared/claude-commands/trinity-continue.md.template +549 -0
- package/dist/templates/shared/claude-commands/trinity-create-investigation.md.template +232 -0
- package/dist/templates/shared/claude-commands/trinity-decompose.md.template +181 -0
- package/dist/templates/shared/claude-commands/trinity-design.md.template +347 -0
- package/dist/templates/shared/claude-commands/trinity-docs.md.template +2093 -0
- package/dist/templates/shared/claude-commands/trinity-end.md.template +397 -0
- package/dist/templates/shared/claude-commands/trinity-init.md.template +606 -0
- package/dist/templates/shared/claude-commands/trinity-investigate-templates.md.template +725 -0
- package/dist/templates/shared/claude-commands/trinity-orchestrate.md.template +1061 -0
- package/dist/templates/shared/claude-commands/trinity-plan-investigation.md.template +135 -0
- package/dist/templates/shared/claude-commands/trinity-plan.md.template +201 -0
- package/dist/templates/shared/claude-commands/trinity-readme.md.template +1971 -0
- package/dist/templates/shared/claude-commands/trinity-requirements.md.template +148 -0
- package/dist/templates/shared/claude-commands/trinity-start.md.template +268 -0
- package/dist/templates/shared/claude-commands/trinity-verify.md.template +453 -0
- package/dist/templates/shared/claude-commands/trinity-workorder.md.template +249 -0
- package/dist/templates/source/base-CLAUDE.md.template +310 -0
- package/dist/templates/source/flutter-CLAUDE.md.template +593 -0
- package/dist/templates/source/nodejs-CLAUDE.md.template +531 -0
- package/dist/templates/source/python-CLAUDE.md.template +510 -0
- package/dist/templates/source/react-CLAUDE.md.template +513 -0
- package/dist/templates/source/rust-CLAUDE.md.template +653 -0
- package/dist/templates/source/tests-CLAUDE.md.template +432 -0
- package/dist/templates/trinity/CLAUDE.md.template +372 -0
- package/dist/templates/work-orders/ANALYSIS-TEMPLATE.md.template +276 -0
- package/dist/templates/work-orders/AUDIT-TEMPLATE.md.template +262 -0
- package/dist/templates/work-orders/IMPLEMENTATION-TEMPLATE.md.template +260 -0
- package/dist/templates/work-orders/INVESTIGATION-TEMPLATE.md.template +206 -0
- package/dist/templates/work-orders/PATTERN-TEMPLATE.md.template +320 -0
- package/dist/templates/work-orders/VERIFICATION-TEMPLATE.md.template +273 -0
- package/package.json +94 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
export const lintingTools = {
|
|
2
|
+
'Node.js': [
|
|
3
|
+
{
|
|
4
|
+
id: 'eslint',
|
|
5
|
+
name: 'ESLint',
|
|
6
|
+
description: 'JavaScript/TypeScript linter',
|
|
7
|
+
file: '.eslintrc.json',
|
|
8
|
+
recommended: true,
|
|
9
|
+
dependencies: ['eslint@^8.50.0'],
|
|
10
|
+
scripts: {
|
|
11
|
+
lint: 'eslint .',
|
|
12
|
+
'lint:fix': 'eslint . --fix',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: 'prettier',
|
|
17
|
+
name: 'Prettier',
|
|
18
|
+
description: 'Code formatter',
|
|
19
|
+
file: '.prettierrc.json',
|
|
20
|
+
recommended: true,
|
|
21
|
+
dependencies: ['prettier@^3.0.0'],
|
|
22
|
+
scripts: {
|
|
23
|
+
format: 'prettier --write "**/*.{js,jsx,ts,tsx,json,md}"',
|
|
24
|
+
'format:check': 'prettier --check "**/*.{js,jsx,ts,tsx,json,md}"',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'precommit',
|
|
29
|
+
name: 'Pre-commit hooks',
|
|
30
|
+
description: 'Git hooks for code quality',
|
|
31
|
+
file: '.pre-commit-config.yaml',
|
|
32
|
+
recommended: true,
|
|
33
|
+
dependencies: [],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: 'typescript-eslint',
|
|
37
|
+
name: 'TypeScript ESLint',
|
|
38
|
+
description: 'TypeScript-specific linting',
|
|
39
|
+
file: 'extends typescript in .eslintrc.json',
|
|
40
|
+
recommended: false, // Only if TypeScript detected
|
|
41
|
+
dependencies: ['@typescript-eslint/parser@^6.7.0', '@typescript-eslint/eslint-plugin@^6.7.0'],
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
React: [
|
|
45
|
+
{
|
|
46
|
+
id: 'eslint',
|
|
47
|
+
name: 'ESLint',
|
|
48
|
+
description: 'JavaScript/TypeScript linter',
|
|
49
|
+
file: '.eslintrc.json',
|
|
50
|
+
recommended: true,
|
|
51
|
+
dependencies: ['eslint@^8.50.0', 'eslint-plugin-react@^7.33.0'],
|
|
52
|
+
scripts: {
|
|
53
|
+
lint: 'eslint .',
|
|
54
|
+
'lint:fix': 'eslint . --fix',
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: 'prettier',
|
|
59
|
+
name: 'Prettier',
|
|
60
|
+
description: 'Code formatter',
|
|
61
|
+
file: '.prettierrc.json',
|
|
62
|
+
recommended: true,
|
|
63
|
+
dependencies: ['prettier@^3.0.0'],
|
|
64
|
+
scripts: {
|
|
65
|
+
format: 'prettier --write "**/*.{js,jsx,ts,tsx,json,md}"',
|
|
66
|
+
'format:check': 'prettier --check "**/*.{js,jsx,ts,tsx,json,md}"',
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'precommit',
|
|
71
|
+
name: 'Pre-commit hooks',
|
|
72
|
+
description: 'Git hooks for code quality',
|
|
73
|
+
file: '.pre-commit-config.yaml',
|
|
74
|
+
recommended: true,
|
|
75
|
+
dependencies: [],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'typescript-eslint',
|
|
79
|
+
name: 'TypeScript ESLint',
|
|
80
|
+
description: 'TypeScript-specific linting',
|
|
81
|
+
file: 'extends typescript in .eslintrc.json',
|
|
82
|
+
recommended: false,
|
|
83
|
+
dependencies: ['@typescript-eslint/parser@^6.7.0', '@typescript-eslint/eslint-plugin@^6.7.0'],
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
Python: [
|
|
87
|
+
{
|
|
88
|
+
id: 'black',
|
|
89
|
+
name: 'Black',
|
|
90
|
+
description: 'Python code formatter',
|
|
91
|
+
file: 'pyproject.toml',
|
|
92
|
+
recommended: true,
|
|
93
|
+
dependencies: ['black>=23.0.0'],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: 'flake8',
|
|
97
|
+
name: 'Flake8',
|
|
98
|
+
description: 'Python linter',
|
|
99
|
+
file: '.flake8',
|
|
100
|
+
recommended: true,
|
|
101
|
+
dependencies: ['flake8>=6.0.0'],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'isort',
|
|
105
|
+
name: 'isort',
|
|
106
|
+
description: 'Import sorter',
|
|
107
|
+
file: 'pyproject.toml',
|
|
108
|
+
recommended: true,
|
|
109
|
+
dependencies: ['isort>=5.12.0'],
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: 'precommit',
|
|
113
|
+
name: 'Pre-commit hooks',
|
|
114
|
+
description: 'Git hooks for code quality',
|
|
115
|
+
file: '.pre-commit-config.yaml',
|
|
116
|
+
recommended: true,
|
|
117
|
+
dependencies: ['pre-commit>=3.3.0'],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
Flutter: [
|
|
121
|
+
{
|
|
122
|
+
id: 'dartanalyzer',
|
|
123
|
+
name: 'Dart Analyzer',
|
|
124
|
+
description: 'Dart/Flutter linter',
|
|
125
|
+
file: 'analysis_options.yaml',
|
|
126
|
+
recommended: true,
|
|
127
|
+
dependencies: [], // Built into Dart SDK
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: 'precommit',
|
|
131
|
+
name: 'Pre-commit hooks',
|
|
132
|
+
description: 'Git hooks for code quality',
|
|
133
|
+
file: '.pre-commit-config.yaml',
|
|
134
|
+
recommended: true,
|
|
135
|
+
dependencies: [],
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
Rust: [
|
|
139
|
+
{
|
|
140
|
+
id: 'clippy',
|
|
141
|
+
name: 'Clippy',
|
|
142
|
+
description: 'Rust linter',
|
|
143
|
+
file: 'clippy.toml',
|
|
144
|
+
recommended: true,
|
|
145
|
+
dependencies: [], // Built into Rust toolchain
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: 'rustfmt',
|
|
149
|
+
name: 'Rustfmt',
|
|
150
|
+
description: 'Rust formatter',
|
|
151
|
+
file: 'rustfmt.toml',
|
|
152
|
+
recommended: true,
|
|
153
|
+
dependencies: [], // Built into Rust toolchain
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
id: 'precommit',
|
|
157
|
+
name: 'Pre-commit hooks',
|
|
158
|
+
description: 'Git hooks for code quality',
|
|
159
|
+
file: '.pre-commit-config.yaml',
|
|
160
|
+
recommended: true,
|
|
161
|
+
dependencies: [],
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
};
|
|
165
|
+
export function getToolsForFramework(framework, language) {
|
|
166
|
+
// Special handling for TypeScript
|
|
167
|
+
const tools = lintingTools[framework] || lintingTools['Node.js'] || [];
|
|
168
|
+
if (language === 'TypeScript') {
|
|
169
|
+
return tools.map((tool) => {
|
|
170
|
+
if (tool.requiresTypeScript) {
|
|
171
|
+
return { ...tool, recommended: true };
|
|
172
|
+
}
|
|
173
|
+
return tool;
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return tools.filter((tool) => !tool.requiresTypeScript);
|
|
177
|
+
}
|
|
178
|
+
export function getRecommendedTools(framework, language) {
|
|
179
|
+
const tools = getToolsForFramework(framework, language);
|
|
180
|
+
return tools.filter((tool) => tool.recommended);
|
|
181
|
+
}
|
|
182
|
+
export function getDependenciesForTools(selectedTools) {
|
|
183
|
+
return selectedTools.flatMap((tool) => tool.dependencies || []);
|
|
184
|
+
}
|
|
185
|
+
export function getScriptsForTools(selectedTools) {
|
|
186
|
+
const scripts = {};
|
|
187
|
+
selectedTools.forEach((tool) => {
|
|
188
|
+
if (tool.scripts) {
|
|
189
|
+
Object.assign(scripts, tool.scripts);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
return scripts;
|
|
193
|
+
}
|
|
194
|
+
export function getPostInstallInstructions(selectedTools, _framework) {
|
|
195
|
+
const instructions = [];
|
|
196
|
+
selectedTools.forEach((tool) => {
|
|
197
|
+
if (tool.postInstall) {
|
|
198
|
+
instructions.push({
|
|
199
|
+
command: tool.postInstall,
|
|
200
|
+
description: `Setup ${tool.name}`,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
return instructions;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=linting-tools.js.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Quality Metrics Collection
|
|
3
|
+
* Counts TODOs, FIXMEs, console statements, and commented code blocks
|
|
4
|
+
* @module cli/utils/metrics/code-quality
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Count occurrences of a pattern in source files
|
|
8
|
+
* @param dir - Directory to search
|
|
9
|
+
* @param pattern - Pattern to match
|
|
10
|
+
* @returns Count of matches
|
|
11
|
+
*/
|
|
12
|
+
export declare function countPattern(dir: string, pattern: RegExp): Promise<number>;
|
|
13
|
+
/**
|
|
14
|
+
* Count commented code blocks (heuristic: 3+ consecutive comment lines)
|
|
15
|
+
* @param dir - Directory to search
|
|
16
|
+
* @returns Estimated count of commented code blocks
|
|
17
|
+
*/
|
|
18
|
+
export declare function countCommentedCode(dir: string): Promise<number>;
|
|
19
|
+
/**
|
|
20
|
+
* Collect code quality metrics
|
|
21
|
+
* @param sourceDir - Source directory to analyze
|
|
22
|
+
* @returns Code quality metrics
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectCodeQualityMetrics(sourceDir: string): Promise<{
|
|
25
|
+
todoCount: number;
|
|
26
|
+
todoComments: number;
|
|
27
|
+
fixmeComments: number;
|
|
28
|
+
hackComments: number;
|
|
29
|
+
consoleStatements: number;
|
|
30
|
+
commentedCodeBlocks: number;
|
|
31
|
+
}>;
|
|
32
|
+
//# sourceMappingURL=code-quality.d.ts.map
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Quality Metrics Collection
|
|
3
|
+
* Counts TODOs, FIXMEs, console statements, and commented code blocks
|
|
4
|
+
* @module cli/utils/metrics/code-quality
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
import { globSync } from 'glob';
|
|
8
|
+
/**
|
|
9
|
+
* Count occurrences of a pattern in source files
|
|
10
|
+
* @param dir - Directory to search
|
|
11
|
+
* @param pattern - Pattern to match
|
|
12
|
+
* @returns Count of matches
|
|
13
|
+
*/
|
|
14
|
+
export async function countPattern(dir, pattern) {
|
|
15
|
+
if (!(await fs.pathExists(dir))) {
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
// Get all source files
|
|
20
|
+
const files = globSync(`${dir}/**/*.{js,jsx,ts,tsx,dart,py,rs}`, {
|
|
21
|
+
ignore: [
|
|
22
|
+
'**/node_modules/**',
|
|
23
|
+
'**/build/**',
|
|
24
|
+
'**/.dart_tool/**',
|
|
25
|
+
'**/dist/**',
|
|
26
|
+
'**/__pycache__/**',
|
|
27
|
+
],
|
|
28
|
+
});
|
|
29
|
+
let count = 0;
|
|
30
|
+
for (const file of files) {
|
|
31
|
+
const content = await fs.readFile(file, 'utf8');
|
|
32
|
+
const matches = content.match(pattern);
|
|
33
|
+
if (matches) {
|
|
34
|
+
count += matches.length;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return count;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const { displayWarning, getErrorMessage } = await import('../errors.js');
|
|
41
|
+
displayWarning(`Error counting pattern: ${getErrorMessage(error)}`);
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Count consecutive comments in a single file
|
|
47
|
+
* @param file - File path to analyze
|
|
48
|
+
* @returns Number of commented code blocks in the file
|
|
49
|
+
*/
|
|
50
|
+
async function countCommentsInFile(file) {
|
|
51
|
+
const content = await fs.readFile(file, 'utf8');
|
|
52
|
+
const lines = content.split('\n');
|
|
53
|
+
let blockCount = 0;
|
|
54
|
+
let consecutiveComments = 0;
|
|
55
|
+
for (const line of lines) {
|
|
56
|
+
const trimmed = line.trim();
|
|
57
|
+
const isComment = trimmed.startsWith('//') || trimmed.startsWith('#');
|
|
58
|
+
if (isComment) {
|
|
59
|
+
consecutiveComments++;
|
|
60
|
+
if (consecutiveComments === 3) {
|
|
61
|
+
blockCount++;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
consecutiveComments = 0;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return blockCount;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Count commented code blocks (heuristic: 3+ consecutive comment lines)
|
|
72
|
+
* @param dir - Directory to search
|
|
73
|
+
* @returns Estimated count of commented code blocks
|
|
74
|
+
*/
|
|
75
|
+
export async function countCommentedCode(dir) {
|
|
76
|
+
if (!(await fs.pathExists(dir))) {
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const files = globSync(`${dir}/**/*.{js,jsx,ts,tsx,dart,py,rs}`, {
|
|
81
|
+
ignore: [
|
|
82
|
+
'**/node_modules/**',
|
|
83
|
+
'**/build/**',
|
|
84
|
+
'**/.dart_tool/**',
|
|
85
|
+
'**/dist/**',
|
|
86
|
+
'**/__pycache__/**',
|
|
87
|
+
],
|
|
88
|
+
});
|
|
89
|
+
let blockCount = 0;
|
|
90
|
+
for (const file of files) {
|
|
91
|
+
blockCount += await countCommentsInFile(file);
|
|
92
|
+
}
|
|
93
|
+
return blockCount;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const { displayWarning, getErrorMessage } = await import('../errors.js');
|
|
97
|
+
displayWarning(`Error counting commented code: ${getErrorMessage(error)}`);
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Collect code quality metrics
|
|
103
|
+
* @param sourceDir - Source directory to analyze
|
|
104
|
+
* @returns Code quality metrics
|
|
105
|
+
*/
|
|
106
|
+
export async function collectCodeQualityMetrics(sourceDir) {
|
|
107
|
+
const todoComments = await countPattern(sourceDir, /\/\/\s*TODO|#\s*TODO/gi);
|
|
108
|
+
const fixmeComments = await countPattern(sourceDir, /\/\/\s*FIXME|#\s*FIXME/gi);
|
|
109
|
+
const hackComments = await countPattern(sourceDir, /\/\/\s*HACK|#\s*HACK/gi);
|
|
110
|
+
const todoCount = todoComments + fixmeComments + hackComments;
|
|
111
|
+
const consoleStatements = await countPattern(sourceDir, /console\.(log|warn|error|debug|info)/gi);
|
|
112
|
+
const commentedCodeBlocks = await countCommentedCode(sourceDir);
|
|
113
|
+
return {
|
|
114
|
+
todoCount,
|
|
115
|
+
todoComments,
|
|
116
|
+
fixmeComments,
|
|
117
|
+
hackComments,
|
|
118
|
+
consoleStatements,
|
|
119
|
+
commentedCodeBlocks,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=code-quality.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Parsing Module
|
|
3
|
+
* Parses dependencies from framework-specific files (package.json, pubspec.yaml, etc.)
|
|
4
|
+
* @module cli/utils/metrics/dependency-parser
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Dependency metrics
|
|
8
|
+
*/
|
|
9
|
+
export interface DependencyMetrics {
|
|
10
|
+
dependencies: Record<string, string>;
|
|
11
|
+
dependencyCount: number;
|
|
12
|
+
devDependencies: Record<string, string>;
|
|
13
|
+
devDependencyCount: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse dependencies from framework-specific files
|
|
17
|
+
* @param framework - Framework name
|
|
18
|
+
* @returns Dependencies and counts
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseDependencies(framework: string): Promise<DependencyMetrics>;
|
|
21
|
+
//# sourceMappingURL=dependency-parser.d.ts.map
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Parsing Module
|
|
3
|
+
* Parses dependencies from framework-specific files (package.json, pubspec.yaml, etc.)
|
|
4
|
+
* @module cli/utils/metrics/dependency-parser
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
/**
|
|
8
|
+
* Parse package.json dependencies
|
|
9
|
+
*/
|
|
10
|
+
async function parsePackageJson() {
|
|
11
|
+
if (!(await fs.pathExists('package.json'))) {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
const pkg = await fs.readJson('package.json');
|
|
15
|
+
const dependencies = pkg.dependencies || {};
|
|
16
|
+
const devDependencies = pkg.devDependencies || {};
|
|
17
|
+
return {
|
|
18
|
+
dependencies,
|
|
19
|
+
devDependencies,
|
|
20
|
+
dependencyCount: Object.keys(dependencies).length,
|
|
21
|
+
devDependencyCount: Object.keys(devDependencies).length,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse pubspec.yaml dependencies (Flutter)
|
|
26
|
+
*/
|
|
27
|
+
async function parsePubspecYaml() {
|
|
28
|
+
if (!(await fs.pathExists('pubspec.yaml'))) {
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
const yaml = await fs.readFile('pubspec.yaml', 'utf8');
|
|
32
|
+
const dependencies = {};
|
|
33
|
+
const devDependencies = {};
|
|
34
|
+
const depMatch = yaml.match(/dependencies:\s*\n((?: {2}[^\s].*\n(?: {4}.*\n)*)*)/);
|
|
35
|
+
const devDepMatch = yaml.match(/dev_dependencies:\s*\n((?: {2}[^\s].*\n(?: {4}.*\n)*)*)/);
|
|
36
|
+
if (depMatch) {
|
|
37
|
+
const deps = depMatch[1]
|
|
38
|
+
.split('\n')
|
|
39
|
+
.filter((line) => line.match(/^ {2}[^\s]/) && line.trim().length > 0);
|
|
40
|
+
deps.forEach((dep) => {
|
|
41
|
+
const [name] = dep.trim().split(':');
|
|
42
|
+
dependencies[name] = 'latest';
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (devDepMatch) {
|
|
46
|
+
const devDeps = devDepMatch[1]
|
|
47
|
+
.split('\n')
|
|
48
|
+
.filter((line) => line.match(/^ {2}[^\s]/) && line.trim().length > 0);
|
|
49
|
+
devDeps.forEach((dep) => {
|
|
50
|
+
const [name] = dep.trim().split(':');
|
|
51
|
+
devDependencies[name] = 'latest';
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
dependencies,
|
|
56
|
+
devDependencies,
|
|
57
|
+
dependencyCount: Object.keys(dependencies).length,
|
|
58
|
+
devDependencyCount: Object.keys(devDependencies).length,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Parse requirements.txt dependencies (Python)
|
|
63
|
+
*/
|
|
64
|
+
async function parseRequirementsTxt() {
|
|
65
|
+
if (!(await fs.pathExists('requirements.txt'))) {
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
const reqs = await fs.readFile('requirements.txt', 'utf8');
|
|
69
|
+
const deps = reqs
|
|
70
|
+
.split('\n')
|
|
71
|
+
.filter((line) => line.trim().length > 0 && !line.startsWith('#'));
|
|
72
|
+
const dependencies = {};
|
|
73
|
+
deps.forEach((dep) => {
|
|
74
|
+
const [name] = dep.split(/[=<>]/);
|
|
75
|
+
dependencies[name.trim()] = 'latest';
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
dependencies,
|
|
79
|
+
dependencyCount: deps.length,
|
|
80
|
+
devDependencies: {},
|
|
81
|
+
devDependencyCount: 0,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Parse Cargo.toml dependencies (Rust)
|
|
86
|
+
*/
|
|
87
|
+
async function parseCargoToml() {
|
|
88
|
+
if (!(await fs.pathExists('Cargo.toml'))) {
|
|
89
|
+
return {};
|
|
90
|
+
}
|
|
91
|
+
const toml = await fs.readFile('Cargo.toml', 'utf8');
|
|
92
|
+
const dependencies = {};
|
|
93
|
+
const devDependencies = {};
|
|
94
|
+
const depMatch = toml.match(/\[dependencies\]\s*\n((?:\w+\s*[={].*(?:\n|$))*)/);
|
|
95
|
+
const devDepMatch = toml.match(/\[dev-dependencies\]\s*\n((?:\w+\s*[={].*(?:\n|$))*)/);
|
|
96
|
+
if (depMatch) {
|
|
97
|
+
const deps = depMatch[1].split('\n').filter((line) => line.trim().length > 0);
|
|
98
|
+
deps.forEach((dep) => {
|
|
99
|
+
const [name] = dep.trim().split(/\s*[={]/);
|
|
100
|
+
dependencies[name] = 'latest';
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (devDepMatch) {
|
|
104
|
+
const devDeps = devDepMatch[1].split('\n').filter((line) => line.trim().length > 0);
|
|
105
|
+
devDeps.forEach((dep) => {
|
|
106
|
+
const [name] = dep.trim().split(/\s*[={]/);
|
|
107
|
+
devDependencies[name] = 'latest';
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
dependencies,
|
|
112
|
+
devDependencies,
|
|
113
|
+
dependencyCount: Object.keys(dependencies).length,
|
|
114
|
+
devDependencyCount: Object.keys(devDependencies).length,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parser map - maps frameworks to their dependency parsers
|
|
119
|
+
*/
|
|
120
|
+
const DEPENDENCY_PARSERS = {
|
|
121
|
+
'Node.js': parsePackageJson,
|
|
122
|
+
React: parsePackageJson,
|
|
123
|
+
'Next.js': parsePackageJson,
|
|
124
|
+
Flutter: parsePubspecYaml,
|
|
125
|
+
Python: parseRequirementsTxt,
|
|
126
|
+
Rust: parseCargoToml,
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Parse dependencies from framework-specific files
|
|
130
|
+
* @param framework - Framework name
|
|
131
|
+
* @returns Dependencies and counts
|
|
132
|
+
*/
|
|
133
|
+
export async function parseDependencies(framework) {
|
|
134
|
+
const defaultResult = {
|
|
135
|
+
dependencies: {},
|
|
136
|
+
dependencyCount: 0,
|
|
137
|
+
devDependencies: {},
|
|
138
|
+
devDependencyCount: 0,
|
|
139
|
+
};
|
|
140
|
+
try {
|
|
141
|
+
const parser = DEPENDENCY_PARSERS[framework];
|
|
142
|
+
if (parser) {
|
|
143
|
+
const parsed = await parser();
|
|
144
|
+
return { ...defaultResult, ...parsed };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
const { displayWarning, getErrorMessage } = await import('../errors.js');
|
|
149
|
+
displayWarning(`Error parsing dependencies: ${getErrorMessage(error)}`);
|
|
150
|
+
}
|
|
151
|
+
return defaultResult;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=dependency-parser.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Complexity Metrics Collection
|
|
3
|
+
* Analyzes file counts, line counts, and identifies large files
|
|
4
|
+
* @module cli/utils/metrics/file-complexity
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* File complexity metrics
|
|
8
|
+
*/
|
|
9
|
+
export interface FileComplexityMetrics {
|
|
10
|
+
totalFiles: number;
|
|
11
|
+
filesOver500: number;
|
|
12
|
+
filesOver1000: number;
|
|
13
|
+
filesOver3000: number;
|
|
14
|
+
avgFileLength: number;
|
|
15
|
+
largestFiles: Array<{
|
|
16
|
+
file: string;
|
|
17
|
+
lines: number;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Analyze file complexity metrics
|
|
22
|
+
* @param dir - Directory to analyze
|
|
23
|
+
* @returns File complexity metrics
|
|
24
|
+
*/
|
|
25
|
+
export declare function analyzeFileComplexity(dir: string): Promise<FileComplexityMetrics>;
|
|
26
|
+
//# sourceMappingURL=file-complexity.d.ts.map
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Complexity Metrics Collection
|
|
3
|
+
* Analyzes file counts, line counts, and identifies large files
|
|
4
|
+
* @module cli/utils/metrics/file-complexity
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { globSync } from 'glob';
|
|
9
|
+
/**
|
|
10
|
+
* Analyze file complexity metrics
|
|
11
|
+
* @param dir - Directory to analyze
|
|
12
|
+
* @returns File complexity metrics
|
|
13
|
+
*/
|
|
14
|
+
export async function analyzeFileComplexity(dir) {
|
|
15
|
+
if (!(await fs.pathExists(dir))) {
|
|
16
|
+
return {
|
|
17
|
+
totalFiles: 0,
|
|
18
|
+
filesOver500: 0,
|
|
19
|
+
filesOver1000: 0,
|
|
20
|
+
filesOver3000: 0,
|
|
21
|
+
avgFileLength: 0,
|
|
22
|
+
largestFiles: [],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const files = globSync(`${dir}/**/*.{js,jsx,ts,tsx,dart,py,rs}`, {
|
|
27
|
+
ignore: [
|
|
28
|
+
'**/node_modules/**',
|
|
29
|
+
'**/build/**',
|
|
30
|
+
'**/.dart_tool/**',
|
|
31
|
+
'**/dist/**',
|
|
32
|
+
'**/__pycache__/**',
|
|
33
|
+
],
|
|
34
|
+
});
|
|
35
|
+
const fileSizes = [];
|
|
36
|
+
let filesOver500 = 0;
|
|
37
|
+
let filesOver1000 = 0;
|
|
38
|
+
let filesOver3000 = 0;
|
|
39
|
+
let totalLines = 0;
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
const content = await fs.readFile(file, 'utf8');
|
|
42
|
+
const lineCount = content.split('\n').length;
|
|
43
|
+
totalLines += lineCount;
|
|
44
|
+
fileSizes.push({ file: path.relative(dir, file), lines: lineCount });
|
|
45
|
+
if (lineCount > 500)
|
|
46
|
+
filesOver500++;
|
|
47
|
+
if (lineCount > 1000)
|
|
48
|
+
filesOver1000++;
|
|
49
|
+
if (lineCount > 3000)
|
|
50
|
+
filesOver3000++;
|
|
51
|
+
}
|
|
52
|
+
// Sort by size and get top 10
|
|
53
|
+
fileSizes.sort((a, b) => b.lines - a.lines);
|
|
54
|
+
const largestFiles = fileSizes.slice(0, 10);
|
|
55
|
+
return {
|
|
56
|
+
totalFiles: files.length,
|
|
57
|
+
filesOver500,
|
|
58
|
+
filesOver1000,
|
|
59
|
+
filesOver3000,
|
|
60
|
+
avgFileLength: files.length > 0 ? Math.round(totalLines / files.length) : 0,
|
|
61
|
+
largestFiles,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const { displayWarning, getErrorMessage } = await import('../errors.js');
|
|
66
|
+
displayWarning(`Error analyzing file complexity: ${getErrorMessage(error)}`);
|
|
67
|
+
return {
|
|
68
|
+
totalFiles: 0,
|
|
69
|
+
filesOver500: 0,
|
|
70
|
+
filesOver1000: 0,
|
|
71
|
+
filesOver3000: 0,
|
|
72
|
+
avgFileLength: 0,
|
|
73
|
+
largestFiles: [],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=file-complexity.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework Detection Module
|
|
3
|
+
* Detects framework versions and package managers
|
|
4
|
+
* @module cli/utils/metrics/framework-detector
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Detect framework version
|
|
8
|
+
* @param framework - Framework name
|
|
9
|
+
* @returns Version string
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectFrameworkVersion(framework: string): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Detect package manager
|
|
14
|
+
* @returns Package manager name
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectPackageManager(): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=framework-detector.d.ts.map
|