habit-hooks 0.1.0-beta.0 → 0.2.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/dist/baseline/auto-prune.d.ts +4 -0
- package/dist/baseline/auto-prune.js +38 -0
- package/dist/baseline/auto-prune.js.map +1 -0
- package/dist/baseline/commands.js +3 -9
- package/dist/baseline/commands.js.map +1 -1
- package/dist/baseline/filter.d.ts +2 -1
- package/dist/baseline/filter.js +2 -15
- package/dist/baseline/filter.js.map +1 -1
- package/dist/baseline/reap.d.ts +6 -0
- package/dist/baseline/reap.js +22 -0
- package/dist/baseline/reap.js.map +1 -0
- package/dist/baseline/snooze-index.d.ts +5 -0
- package/dist/baseline/snooze-index.js +65 -0
- package/dist/baseline/snooze-index.js.map +1 -0
- package/dist/checks/comment-check.js +4 -2
- package/dist/checks/comment-check.js.map +1 -1
- package/dist/checks/eslint-wrap.js +10 -7
- package/dist/checks/eslint-wrap.js.map +1 -1
- package/dist/checks/jscpd-wrap.d.ts +4 -1
- package/dist/checks/jscpd-wrap.js +12 -11
- package/dist/checks/jscpd-wrap.js.map +1 -1
- package/dist/checks/knip-wrap.js +20 -12
- package/dist/checks/knip-wrap.js.map +1 -1
- package/dist/cli/init/apply-recommendations.d.ts +3 -0
- package/dist/cli/init/apply-recommendations.js +76 -0
- package/dist/cli/init/apply-recommendations.js.map +1 -0
- package/dist/cli/init/command-runner.d.ts +6 -0
- package/dist/cli/init/command-runner.js +22 -0
- package/dist/cli/init/command-runner.js.map +1 -0
- package/dist/cli/init/completion-report.d.ts +11 -0
- package/dist/cli/init/completion-report.js +98 -0
- package/dist/cli/init/completion-report.js.map +1 -0
- package/dist/cli/init/ctx.d.ts +12 -0
- package/dist/cli/init/ctx.js +16 -0
- package/dist/cli/init/ctx.js.map +1 -0
- package/dist/cli/init/detect.d.ts +2 -0
- package/dist/cli/init/detect.js +55 -6
- package/dist/cli/init/detect.js.map +1 -1
- package/dist/cli/init/git-hook.d.ts +2 -1
- package/dist/cli/init/git-hook.js +10 -6
- package/dist/cli/init/git-hook.js.map +1 -1
- package/dist/cli/init/install-commands.d.ts +3 -1
- package/dist/cli/init/install-commands.js +27 -0
- package/dist/cli/init/install-commands.js.map +1 -1
- package/dist/cli/init/recommendations.d.ts +14 -0
- package/dist/cli/init/recommendations.js +66 -0
- package/dist/cli/init/recommendations.js.map +1 -0
- package/dist/cli/init/report-language.d.ts +1 -0
- package/dist/cli/init/report-language.js +12 -0
- package/dist/cli/init/report-language.js.map +1 -0
- package/dist/cli/init/reporters.d.ts +1 -0
- package/dist/cli/init/reporters.js +8 -4
- package/dist/cli/init/reporters.js.map +1 -1
- package/dist/cli/init/run.d.ts +5 -0
- package/dist/cli/init/run.js +60 -96
- package/dist/cli/init/run.js.map +1 -1
- package/dist/cli/init/scaffold-config.d.ts +8 -1
- package/dist/cli/init/scaffold-config.js +20 -3
- package/dist/cli/init/scaffold-config.js.map +1 -1
- package/dist/cli/init/scaffold-jscpd-config.d.ts +2 -1
- package/dist/cli/init/scaffold-jscpd-config.js +3 -3
- package/dist/cli/init/scaffold-jscpd-config.js.map +1 -1
- package/dist/cli/init/scaffold-ruff-config.d.ts +2 -0
- package/dist/cli/init/scaffold-ruff-config.js +12 -0
- package/dist/cli/init/scaffold-ruff-config.js.map +1 -0
- package/dist/cli/init/skill.d.ts +2 -1
- package/dist/cli/init/skill.js +18 -15
- package/dist/cli/init/skill.js.map +1 -1
- package/dist/cli/init/snippet.d.ts +2 -1
- package/dist/cli/init/snippet.js +17 -4
- package/dist/cli/init/snippet.js.map +1 -1
- package/dist/cli/init/templates/eslint-config.d.ts +1 -1
- package/dist/cli/init/templates/eslint-config.js +10 -0
- package/dist/cli/init/templates/eslint-config.js.map +1 -1
- package/dist/cli/init/templates/jscpd-config.d.ts +2 -1
- package/dist/cli/init/templates/jscpd-config.js +14 -6
- package/dist/cli/init/templates/jscpd-config.js.map +1 -1
- package/dist/cli/init/templates/ruff-config.d.ts +2 -0
- package/dist/cli/init/templates/ruff-config.js +16 -0
- package/dist/cli/init/templates/ruff-config.js.map +1 -0
- package/dist/cli/init/tool-steps.d.ts +2 -0
- package/dist/cli/init/tool-steps.js +78 -0
- package/dist/cli/init/tool-steps.js.map +1 -0
- package/dist/cli/init-command.js +32 -6
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/config/catalogue-unused.d.ts +2 -0
- package/dist/config/catalogue-unused.js +39 -0
- package/dist/config/catalogue-unused.js.map +1 -0
- package/dist/config/catalogue.d.ts +2 -0
- package/dist/config/catalogue.js +163 -0
- package/dist/config/catalogue.js.map +1 -0
- package/dist/config/defaults.d.ts +2 -2
- package/dist/config/defaults.js +7 -167
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/load.d.ts +1 -0
- package/dist/config/load.js +1 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/merge.js +1 -0
- package/dist/config/merge.js.map +1 -1
- package/dist/config/schema.d.ts +9 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config/tool-smells.d.ts +14 -0
- package/dist/config/tool-smells.js +69 -0
- package/dist/config/tool-smells.js.map +1 -0
- package/dist/config/validate.js +42 -11
- package/dist/config/validate.js.map +1 -1
- package/dist/detect/path.d.ts +1 -0
- package/dist/detect/path.js +14 -0
- package/dist/detect/path.js.map +1 -0
- package/dist/detect/tool.d.ts +2 -2
- package/dist/detect/tool.js +2 -0
- package/dist/detect/tool.js.map +1 -1
- package/dist/discover.d.ts +2 -0
- package/dist/discover.js +14 -0
- package/dist/discover.js.map +1 -0
- package/dist/guide/command.d.ts +6 -0
- package/dist/guide/command.js +20 -0
- package/dist/guide/command.js.map +1 -0
- package/dist/guide/guide.d.ts +11 -0
- package/dist/guide/guide.js +82 -0
- package/dist/guide/guide.js.map +1 -0
- package/dist/guide/render.d.ts +3 -0
- package/dist/guide/render.js +14 -0
- package/dist/guide/render.js.map +1 -0
- package/dist/mapper/mapper.d.ts +34 -0
- package/dist/mapper/mapper.js +80 -0
- package/dist/mapper/mapper.js.map +1 -0
- package/dist/prompts/packaged-dir.js +1 -1
- package/dist/prompts/packaged-dir.js.map +1 -1
- package/dist/prompts/registry.js +1 -26
- package/dist/prompts/registry.js.map +1 -1
- package/dist/rule-files.d.ts +2 -0
- package/dist/rule-files.js +22 -0
- package/dist/rule-files.js.map +1 -0
- package/dist/rules/registry.js +3 -3
- package/dist/rules/registry.js.map +1 -1
- package/dist/runner.d.ts +4 -4
- package/dist/runner.js +95 -105
- package/dist/runner.js.map +1 -1
- package/dist/sensors/adapter.d.ts +17 -0
- package/dist/sensors/adapter.js +81 -0
- package/dist/sensors/adapter.js.map +1 -0
- package/dist/sensors/deptry-sensor.d.ts +3 -0
- package/dist/sensors/deptry-sensor.js +43 -0
- package/dist/sensors/deptry-sensor.js.map +1 -0
- package/dist/sensors/line-count-sensor.d.ts +3 -0
- package/dist/sensors/line-count-sensor.js +50 -0
- package/dist/sensors/line-count-sensor.js.map +1 -0
- package/dist/sensors/needs-extraction.d.ts +3 -0
- package/dist/sensors/needs-extraction.js +57 -0
- package/dist/sensors/needs-extraction.js.map +1 -0
- package/dist/sensors/preset.d.ts +17 -0
- package/dist/sensors/preset.js +57 -0
- package/dist/sensors/preset.js.map +1 -0
- package/dist/sensors/python-preset.d.ts +7 -0
- package/dist/sensors/python-preset.js +34 -0
- package/dist/sensors/python-preset.js.map +1 -0
- package/dist/sensors/runner.d.ts +12 -0
- package/dist/sensors/runner.js +94 -0
- package/dist/sensors/runner.js.map +1 -0
- package/dist/sensors/types.d.ts +15 -0
- package/dist/sensors/types.js +5 -0
- package/dist/sensors/types.js.map +1 -0
- package/dist/types.d.ts +4 -1
- package/dist/wrap/notices.d.ts +6 -0
- package/dist/wrap/notices.js +9 -0
- package/dist/wrap/notices.js.map +1 -1
- package/dist/wrap/run.d.ts +2 -0
- package/dist/wrap/run.js +6 -1
- package/dist/wrap/run.js.map +1 -1
- package/dist/wrap/shell.d.ts +1 -0
- package/dist/wrap/shell.js +8 -2
- package/dist/wrap/shell.js.map +1 -1
- package/package.json +17 -10
- package/src/prompts/deep-nesting.md +13 -0
- package/src/prompts/needs-extraction.md +9 -0
- package/src/prompts/non-null-assertion.md +10 -0
- package/src/prompts/oversized-function.issues.njk +5 -0
- package/src/prompts/parse-error.md +5 -0
- package/src/prompts/uncoached.md +4 -3
- package/src/skills/habit-hooks-prompting/SKILL.md +37 -0
- package/dist/eslint-runner.d.ts +0 -7
- package/dist/eslint-runner.js +0 -34
- package/dist/eslint-runner.js.map +0 -1
- package/dist/reporter.d.ts +0 -7
- package/dist/reporter.js +0 -114
- package/dist/reporter.js.map +0 -1
- package/src/prompts/eslint-boundaries-dependencies.md +0 -9
- package/src/prompts/eslint-eqeqeq.md +0 -3
- package/src/prompts/eslint-fatal.md +0 -7
- package/src/prompts/eslint-no-duplicate-imports.md +0 -1
- package/src/prompts/eslint-no-unused-vars.md +0 -3
- package/src/prompts/eslint-no-var.md +0 -1
- package/src/prompts/eslint-no-warning-comments.md +0 -3
- package/src/prompts/eslint-prefer-const.md +0 -3
- package/src/prompts/eslint-typescript-eslint-no-explicit-any.md +0 -3
- package/src/prompts/eslint-typescript-eslint-no-inferrable-types.md +0 -3
- package/src/prompts/eslint-typescript-eslint-no-non-null-assertion.md +0 -3
- package/src/prompts/knip-classMembers.md +0 -7
- package/src/prompts/knip-dependencies.md +0 -9
- package/src/prompts/knip-exports.md +0 -9
- package/src/prompts/knip-files.md +0 -9
- package/src/prompts/knip-types.md +0 -9
- /package/src/prompts/{jscpd-duplication.md → duplicated-code.md} +0 -0
- /package/src/prompts/{eslint-complexity.md → high-complexity.md} +0 -0
- /package/src/prompts/{comment-non-essential.md → non-essential-comment.md} +0 -0
- /package/src/prompts/{eslint-max-lines.md → oversized-file.md} +0 -0
- /package/src/prompts/{eslint-max-lines-per-function.md → oversized-function.md} +0 -0
- /package/src/prompts/{eslint-max-params.md → too-many-parameters.md} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knip-wrap.js","sourceRoot":"","sources":["../../src/checks/knip-wrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAsB,MAAM,oBAAoB,CAAC;AACzG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"knip-wrap.js","sourceRoot":"","sources":["../../src/checks/knip-wrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { detectToolStates, toolsForLanguage } from './detect.js';
|
|
4
|
+
import { installCommandsFor } from './install-commands.js';
|
|
5
|
+
import { describeKey, JSCPD_RECOMMENDATION } from './recommendations.js';
|
|
6
|
+
// `--accept-recommendations` only auto-applies the safe, mechanical fixes:
|
|
7
|
+
// running install commands and additively merging keys into our own
|
|
8
|
+
// `.jscpd.json`. We deliberately never edit user-owned ruff.toml / pyproject.toml
|
|
9
|
+
// thresholds or eslint flat config — safe in-place TOML/JS editing needs a real
|
|
10
|
+
// parser, so those stay reported as manual steps even with the flag.
|
|
11
|
+
const HEADER = 'Applying recommendations:\n';
|
|
12
|
+
function missingTools(ctx, matrix) {
|
|
13
|
+
return toolsForLanguage(ctx.language).filter((tool) => !matrix[tool].installed);
|
|
14
|
+
}
|
|
15
|
+
async function runInstall(ctx, command, runCommand) {
|
|
16
|
+
ctx.lines.out.push(` Running: ${command}\n`);
|
|
17
|
+
const result = await runCommand(command, ctx.cwd);
|
|
18
|
+
if (result.ok)
|
|
19
|
+
ctx.lines.out.push(' ✓ installed\n');
|
|
20
|
+
else
|
|
21
|
+
ctx.lines.out.push(` ✗ failed: ${result.output}\n`);
|
|
22
|
+
}
|
|
23
|
+
async function installMissingTools(ctx, matrix, runCommand) {
|
|
24
|
+
const commands = installCommandsFor(ctx.cwd, missingTools(ctx, matrix));
|
|
25
|
+
for (const command of commands)
|
|
26
|
+
await runInstall(ctx, command, runCommand);
|
|
27
|
+
}
|
|
28
|
+
function jscpdPath(cwd) {
|
|
29
|
+
return join(cwd, '.jscpd.json');
|
|
30
|
+
}
|
|
31
|
+
function withAddedKeys(config, keys) {
|
|
32
|
+
const merged = { ...config };
|
|
33
|
+
for (const key of keys)
|
|
34
|
+
merged[key] = describeKey(JSCPD_RECOMMENDATION, key).value;
|
|
35
|
+
return merged;
|
|
36
|
+
}
|
|
37
|
+
function readJscpd(path) {
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function mergeJscpdConfig(ctx) {
|
|
46
|
+
if (!toolsForLanguage(ctx.language).includes('jscpd'))
|
|
47
|
+
return;
|
|
48
|
+
const path = jscpdPath(ctx.cwd);
|
|
49
|
+
if (!existsSync(path))
|
|
50
|
+
return;
|
|
51
|
+
const missing = JSCPD_RECOMMENDATION.missingKeys(ctx.cwd);
|
|
52
|
+
const config = readJscpd(path);
|
|
53
|
+
if (missing.length === 0 || config === null)
|
|
54
|
+
return;
|
|
55
|
+
writeFileSync(path, `${JSON.stringify(withAddedKeys(config, missing), null, 2)}\n`);
|
|
56
|
+
ctx.lines.out.push(` Updated .jscpd.json (added: ${missing.join(', ')})\n`);
|
|
57
|
+
}
|
|
58
|
+
function jscpdHasMissingKeys(ctx) {
|
|
59
|
+
if (!toolsForLanguage(ctx.language).includes('jscpd'))
|
|
60
|
+
return false;
|
|
61
|
+
if (!existsSync(jscpdPath(ctx.cwd)))
|
|
62
|
+
return false;
|
|
63
|
+
return JSCPD_RECOMMENDATION.missingKeys(ctx.cwd).length > 0;
|
|
64
|
+
}
|
|
65
|
+
function hasWork(ctx, matrix) {
|
|
66
|
+
return missingTools(ctx, matrix).length > 0 || jscpdHasMissingKeys(ctx);
|
|
67
|
+
}
|
|
68
|
+
export async function applyRecommendations(ctx, runCommand) {
|
|
69
|
+
const matrix = detectToolStates(ctx.cwd);
|
|
70
|
+
if (!hasWork(ctx, matrix))
|
|
71
|
+
return;
|
|
72
|
+
ctx.lines.out.push(`\n${HEADER}`);
|
|
73
|
+
await installMissingTools(ctx, matrix, runCommand);
|
|
74
|
+
mergeJscpdConfig(ctx);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=apply-recommendations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-recommendations.js","sourceRoot":"","sources":["../../../src/cli/init/apply-recommendations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { runTool } from '../../wrap/shell.js';
|
|
2
|
+
const FAILURE_TAIL_LINES = 3;
|
|
3
|
+
function lastLines(text, count) {
|
|
4
|
+
const lines = text.trim().split('\n');
|
|
5
|
+
return lines.slice(-count).join('\n').trim();
|
|
6
|
+
}
|
|
7
|
+
function combinedOutput(stdout, stderr) {
|
|
8
|
+
return `${stdout}${stderr}`.trim();
|
|
9
|
+
}
|
|
10
|
+
// Our generated commands are simple (e.g. `pip install ruff deptry`,
|
|
11
|
+
// `npm install --save-dev jscpd`), so a whitespace split into bin + args is safe.
|
|
12
|
+
export const runCommandWithShell = async (command, cwd) => {
|
|
13
|
+
const [bin, ...args] = command.trim().split(/\s+/);
|
|
14
|
+
if (bin === undefined)
|
|
15
|
+
return { ok: false, output: 'empty command' };
|
|
16
|
+
const result = await runTool({ bin, args, cwd });
|
|
17
|
+
const ok = result.exitCode === 0;
|
|
18
|
+
if (ok)
|
|
19
|
+
return { ok, output: combinedOutput(result.stdout, result.stderr) };
|
|
20
|
+
return { ok, output: lastLines(combinedOutput(result.stdout, result.stderr), FAILURE_TAIL_LINES) };
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=command-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-runner.js","sourceRoot":"","sources":["../../../src/cli/init/command-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAS9C,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,MAAc;IACpD,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,qEAAqE;AACrE,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAkB,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;IACvE,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IACjC,IAAI,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5E,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,EAAE,CAAC;AACrG,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolName, ToolState } from './detect.js';
|
|
2
|
+
import type { Language } from '../../config/schema.js';
|
|
3
|
+
interface ReportInput {
|
|
4
|
+
cwd: string;
|
|
5
|
+
language: Language;
|
|
6
|
+
tools: ToolName[];
|
|
7
|
+
matrix: Record<ToolName, ToolState>;
|
|
8
|
+
advertiseAcceptFlag?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function completionReport(input: ReportInput): string;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { installCommandsFor } from './install-commands.js';
|
|
4
|
+
import { JSCPD_RECOMMENDATION, RUFF_RECOMMENDATION, describeKey, } from './recommendations.js';
|
|
5
|
+
const ADVERT_LINE = 'To install missing tools and apply recommended settings automatically, ' +
|
|
6
|
+
're-run with `--accept-recommendations`.\n';
|
|
7
|
+
const COMPLETE_LINE = '✅ Setup complete.\n';
|
|
8
|
+
const INCOMPLETE_HEADER = '⚠️ Setup incomplete — to finish:\n';
|
|
9
|
+
function missingToolItems(input) {
|
|
10
|
+
const missing = input.tools.filter((t) => !input.matrix[t].installed);
|
|
11
|
+
if (missing.length === 0)
|
|
12
|
+
return [];
|
|
13
|
+
const commands = installCommandsFor(input.cwd, missing);
|
|
14
|
+
return [{ heading: `Install ${missing.join(', ')}:`, details: commands }];
|
|
15
|
+
}
|
|
16
|
+
function deptryConfigItems(input) {
|
|
17
|
+
if (!input.tools.includes('deptry'))
|
|
18
|
+
return [];
|
|
19
|
+
if (existsSync(join(input.cwd, 'pyproject.toml')))
|
|
20
|
+
return [];
|
|
21
|
+
return [
|
|
22
|
+
{ heading: 'Create a pyproject.toml that declares your dependencies (deptry reads it).', details: [] },
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
function ruffEditDetail(recommendation, key) {
|
|
26
|
+
const detail = describeKey(recommendation, key);
|
|
27
|
+
return `set \`${key} = ${detail.value}\` (${detail.description}) in ruff.toml or pyproject.toml [tool.ruff.lint.*]`;
|
|
28
|
+
}
|
|
29
|
+
function ruffRecommendationItems(input) {
|
|
30
|
+
if (!input.tools.includes('ruff'))
|
|
31
|
+
return [];
|
|
32
|
+
const missing = RUFF_RECOMMENDATION.missingKeys(input.cwd);
|
|
33
|
+
if (missing.length === 0)
|
|
34
|
+
return [];
|
|
35
|
+
const details = missing.map((k) => ruffEditDetail(RUFF_RECOMMENDATION, k));
|
|
36
|
+
return [{ heading: 'ruff is missing recommended thresholds:', details }];
|
|
37
|
+
}
|
|
38
|
+
function jscpdEditDetail(key) {
|
|
39
|
+
const detail = describeKey(JSCPD_RECOMMENDATION, key);
|
|
40
|
+
return `add \`"${key}": ${detail.value}\` (${detail.description}) to .jscpd.json`;
|
|
41
|
+
}
|
|
42
|
+
function jscpdRecommendationItems(input) {
|
|
43
|
+
if (!input.tools.includes('jscpd'))
|
|
44
|
+
return [];
|
|
45
|
+
const missing = JSCPD_RECOMMENDATION.missingKeys(input.cwd);
|
|
46
|
+
if (missing.length === 0)
|
|
47
|
+
return [];
|
|
48
|
+
return [{ heading: '.jscpd.json is missing recommended keys:', details: missing.map(jscpdEditDetail) }];
|
|
49
|
+
}
|
|
50
|
+
function hardGapItems(input) {
|
|
51
|
+
return [
|
|
52
|
+
...missingToolItems(input),
|
|
53
|
+
...deptryConfigItems(input),
|
|
54
|
+
...ruffRecommendationItems(input),
|
|
55
|
+
...jscpdRecommendationItems(input),
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
// eslint is advisory-only: its flat `.js` config can't be cheaply parsed, so we
|
|
59
|
+
// can't verify its thresholds — surfacing it as a hard gap would make every
|
|
60
|
+
// configured project read "incomplete". We note it without flipping the status.
|
|
61
|
+
function eslintAdvisoryLine(input) {
|
|
62
|
+
if (!input.tools.includes('eslint') || !input.matrix.eslint.configured)
|
|
63
|
+
return null;
|
|
64
|
+
return 'Note: eslint config may be missing the bundled thresholds — review it against the habit-hooks defaults.';
|
|
65
|
+
}
|
|
66
|
+
function renderItem(item) {
|
|
67
|
+
const heading = ` - ${item.heading}`;
|
|
68
|
+
const details = item.details.map((d) => ` ${d}`);
|
|
69
|
+
return [heading, ...details].join('\n');
|
|
70
|
+
}
|
|
71
|
+
function withAdvisory(body, advisory) {
|
|
72
|
+
if (advisory === null)
|
|
73
|
+
return body;
|
|
74
|
+
return `${body}${advisory}\n`;
|
|
75
|
+
}
|
|
76
|
+
function jscpdKeysMissing(input) {
|
|
77
|
+
if (!input.tools.includes('jscpd'))
|
|
78
|
+
return false;
|
|
79
|
+
return JSCPD_RECOMMENDATION.missingKeys(input.cwd).length > 0;
|
|
80
|
+
}
|
|
81
|
+
function hasAutoApplicableWork(input) {
|
|
82
|
+
const toolMissing = input.tools.some((t) => !input.matrix[t].installed);
|
|
83
|
+
return toolMissing || jscpdKeysMissing(input);
|
|
84
|
+
}
|
|
85
|
+
function withAdvert(body, input) {
|
|
86
|
+
if (input.advertiseAcceptFlag !== true || !hasAutoApplicableWork(input))
|
|
87
|
+
return body;
|
|
88
|
+
return `${body}${ADVERT_LINE}`;
|
|
89
|
+
}
|
|
90
|
+
export function completionReport(input) {
|
|
91
|
+
const items = hardGapItems(input);
|
|
92
|
+
const advisory = eslintAdvisoryLine(input);
|
|
93
|
+
if (items.length === 0)
|
|
94
|
+
return withAdvert(withAdvisory(`\n${COMPLETE_LINE}`, advisory), input);
|
|
95
|
+
const gaps = `\n${INCOMPLETE_HEADER}${items.map(renderItem).join('\n')}\n`;
|
|
96
|
+
return withAdvert(withAdvisory(gaps, advisory), input);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=completion-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-report.js","sourceRoot":"","sources":["../../../src/cli/init/completion-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ScaffoldResult } from './scaffold-config.js';
|
|
2
|
+
import type { Lines } from './reporters.js';
|
|
3
|
+
import type { Language } from '../../config/schema.js';
|
|
4
|
+
export interface Ctx {
|
|
5
|
+
cwd: string;
|
|
6
|
+
lines: Lines;
|
|
7
|
+
dryRun: boolean;
|
|
8
|
+
language: Language;
|
|
9
|
+
acceptRecommendations: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function noteScaffold(ctx: Ctx, result: ScaffoldResult, label: string): void;
|
|
12
|
+
export declare function dryRunPath(ctx: Ctx, filename: string, label: string): void;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export function noteScaffold(ctx, result, label) {
|
|
4
|
+
if (result.created)
|
|
5
|
+
ctx.lines.out.push(`wrote ${result.path}\n`);
|
|
6
|
+
else
|
|
7
|
+
ctx.lines.out.push(`${label} already present at ${result.path}\n`);
|
|
8
|
+
}
|
|
9
|
+
export function dryRunPath(ctx, filename, label) {
|
|
10
|
+
const path = join(ctx.cwd, filename);
|
|
11
|
+
if (existsSync(path))
|
|
12
|
+
ctx.lines.out.push(`${label} already present at ${path}\n`);
|
|
13
|
+
else
|
|
14
|
+
ctx.lines.out.push(`[dry-run] would write ${path}\n`);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=ctx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ctx.js","sourceRoot":"","sources":["../../../src/cli/init/ctx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAajC,MAAM,UAAU,YAAY,CAAC,GAAQ,EAAE,MAAsB,EAAE,KAAa;IAC1E,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;;QAC5D,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,uBAAuB,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAQ,EAAE,QAAgB,EAAE,KAAa;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,uBAAuB,IAAI,IAAI,CAAC,CAAC;;QAC7E,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { type ToolName } from '../../detect/tool.js';
|
|
2
|
+
import type { Language } from '../../config/schema.js';
|
|
2
3
|
export type { ToolName };
|
|
4
|
+
export declare function toolsForLanguage(language: Language): ToolName[];
|
|
3
5
|
export interface ToolState {
|
|
4
6
|
installed: boolean;
|
|
5
7
|
configured: boolean;
|
package/dist/cli/init/detect.js
CHANGED
|
@@ -1,19 +1,68 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { detectTool, TOOL_CONFIG_FILENAMES, TOOL_PACKAGE_JSON_KEYS, } from '../../detect/tool.js';
|
|
4
4
|
import { hasPackageJsonKey } from '../../detect/package-json.js';
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
import { isOnPath } from '../../detect/path.js';
|
|
6
|
+
const TOOLS_BY_LANGUAGE = {
|
|
7
|
+
typescript: ['eslint', 'knip', 'jscpd'],
|
|
8
|
+
python: ['ruff', 'deptry', 'jscpd'],
|
|
9
|
+
};
|
|
10
|
+
export function toolsForLanguage(language) {
|
|
11
|
+
return TOOLS_BY_LANGUAGE[language];
|
|
12
|
+
}
|
|
13
|
+
const DETECTION_KIND = {
|
|
14
|
+
eslint: 'node',
|
|
15
|
+
knip: 'node',
|
|
16
|
+
jscpd: 'node',
|
|
17
|
+
ruff: 'path',
|
|
18
|
+
deptry: 'path',
|
|
19
|
+
};
|
|
20
|
+
const PATH_BIN_NAME = {
|
|
21
|
+
ruff: 'ruff',
|
|
22
|
+
deptry: 'deptry',
|
|
23
|
+
};
|
|
24
|
+
function isInstalled(cwd, tool) {
|
|
25
|
+
if (DETECTION_KIND[tool] === 'path')
|
|
26
|
+
return isOnPath(PATH_BIN_NAME[tool] ?? tool);
|
|
27
|
+
return detectTool(cwd, tool) !== null;
|
|
28
|
+
}
|
|
29
|
+
function hasNodeConfig(cwd, tool) {
|
|
7
30
|
if (TOOL_CONFIG_FILENAMES[tool].some((name) => existsSync(join(cwd, name))))
|
|
8
31
|
return true;
|
|
9
|
-
|
|
32
|
+
const key = TOOL_PACKAGE_JSON_KEYS[tool];
|
|
33
|
+
return key !== undefined && hasPackageJsonKey(cwd, key);
|
|
34
|
+
}
|
|
35
|
+
function readPyproject(cwd) {
|
|
36
|
+
const path = join(cwd, 'pyproject.toml');
|
|
37
|
+
if (!existsSync(path))
|
|
38
|
+
return null;
|
|
39
|
+
try {
|
|
40
|
+
return readFileSync(path, 'utf8');
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function hasRuffConfig(cwd) {
|
|
47
|
+
if (TOOL_CONFIG_FILENAMES.ruff.some((name) => existsSync(join(cwd, name))))
|
|
48
|
+
return true;
|
|
49
|
+
const pyproject = readPyproject(cwd);
|
|
50
|
+
return pyproject !== null && /^\[tool\.ruff/m.test(pyproject);
|
|
51
|
+
}
|
|
52
|
+
function isConfigured(cwd, tool) {
|
|
53
|
+
if (tool === 'ruff')
|
|
54
|
+
return hasRuffConfig(cwd);
|
|
55
|
+
if (tool === 'deptry')
|
|
56
|
+
return readPyproject(cwd) !== null;
|
|
57
|
+
return hasNodeConfig(cwd, tool);
|
|
10
58
|
}
|
|
11
59
|
function stateFor(cwd, tool) {
|
|
12
|
-
return { installed:
|
|
60
|
+
return { installed: isInstalled(cwd, tool), configured: isConfigured(cwd, tool) };
|
|
13
61
|
}
|
|
14
62
|
export function detectToolStates(cwd) {
|
|
63
|
+
const tools = Object.keys(DETECTION_KIND);
|
|
15
64
|
const matrix = {};
|
|
16
|
-
for (const tool of
|
|
65
|
+
for (const tool of tools)
|
|
17
66
|
matrix[tool] = stateFor(cwd, tool);
|
|
18
67
|
return matrix;
|
|
19
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/cli/init/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/cli/init/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { Language } from '../../config/schema.js';
|
|
1
2
|
export type HookAction = 'installed' | 'conflict' | 'no-git' | 'kept';
|
|
2
3
|
export interface HookResult {
|
|
3
4
|
action: HookAction;
|
|
4
5
|
path?: string;
|
|
5
6
|
}
|
|
6
|
-
export declare function installPreCommitHook(cwd: string): HookResult;
|
|
7
|
+
export declare function installPreCommitHook(cwd: string, language: Language): HookResult;
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { chmodSync, existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { detectPackageManager, runScriptCommand } from './install-commands.js';
|
|
4
|
-
function
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
function hookCommandFor(cwd, language) {
|
|
5
|
+
if (language === 'python')
|
|
6
|
+
return 'habit-hooks';
|
|
7
|
+
return runScriptCommand(detectPackageManager(cwd), 'habit-hooks');
|
|
8
|
+
}
|
|
9
|
+
function hookBodyFor(cwd, language) {
|
|
10
|
+
return `#!/usr/bin/env sh\n${hookCommandFor(cwd, language)}\n`;
|
|
7
11
|
}
|
|
8
12
|
function dependsOnHusky(cwd) {
|
|
9
13
|
const pkgPath = join(cwd, 'package.json');
|
|
@@ -26,7 +30,7 @@ function writeHook(path, body) {
|
|
|
26
30
|
return { action: 'installed', path };
|
|
27
31
|
}
|
|
28
32
|
function bodyMatches(content) {
|
|
29
|
-
return
|
|
33
|
+
return /(^|\s)habit-hooks(\s|$)/m.test(content);
|
|
30
34
|
}
|
|
31
35
|
function installAt(path, body) {
|
|
32
36
|
if (existsSync(path)) {
|
|
@@ -37,8 +41,8 @@ function installAt(path, body) {
|
|
|
37
41
|
}
|
|
38
42
|
return writeHook(path, body);
|
|
39
43
|
}
|
|
40
|
-
export function installPreCommitHook(cwd) {
|
|
41
|
-
const body = hookBodyFor(cwd);
|
|
44
|
+
export function installPreCommitHook(cwd, language) {
|
|
45
|
+
const body = hookBodyFor(cwd, language);
|
|
42
46
|
if (dependsOnHusky(cwd))
|
|
43
47
|
return installAt(huskyHookPath(cwd), body);
|
|
44
48
|
if (!existsSync(join(cwd, '.git')))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-hook.js","sourceRoot":"","sources":["../../../src/cli/init/git-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"git-hook.js","sourceRoot":"","sources":["../../../src/cli/init/git-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAU/E,SAAS,cAAc,CAAC,GAAW,EAAE,QAAkB;IACrD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAChD,OAAO,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,QAAkB;IAClD,OAAO,sBAAsB,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1B,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,WAAW,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC3D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,QAAkB;IAClE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,IAAI,cAAc,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAChE,OAAO,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import type { ToolName } from '../../detect/tool.js';
|
|
1
2
|
type PackageManager = 'pnpm' | 'yarn' | 'bun' | 'npm';
|
|
2
3
|
export declare function detectPackageManager(cwd: string): PackageManager;
|
|
3
4
|
export declare function buildInstallCommand(pm: PackageManager, packages: string[]): string;
|
|
4
5
|
export declare function runScriptCommand(pm: PackageManager, script: string): string;
|
|
5
|
-
export declare function packagesFor(tool:
|
|
6
|
+
export declare function packagesFor(tool: ToolName): string[];
|
|
7
|
+
export declare function installCommandsFor(cwd: string, missingTools: ToolName[]): string[];
|
|
6
8
|
export {};
|
|
@@ -52,4 +52,31 @@ export function packagesFor(tool) {
|
|
|
52
52
|
return ESLINT_PACKAGES;
|
|
53
53
|
return [tool];
|
|
54
54
|
}
|
|
55
|
+
const ECOSYSTEM = {
|
|
56
|
+
eslint: 'node',
|
|
57
|
+
knip: 'node',
|
|
58
|
+
jscpd: 'node',
|
|
59
|
+
ruff: 'pip',
|
|
60
|
+
deptry: 'pip',
|
|
61
|
+
};
|
|
62
|
+
function toolsInEcosystem(tools, ecosystem) {
|
|
63
|
+
return tools.filter((tool) => ECOSYSTEM[tool] === ecosystem);
|
|
64
|
+
}
|
|
65
|
+
function nodeInstallCommand(cwd, tools) {
|
|
66
|
+
if (tools.length === 0)
|
|
67
|
+
return null;
|
|
68
|
+
const packages = tools.flatMap((tool) => packagesFor(tool));
|
|
69
|
+
return buildInstallCommand(detectPackageManager(cwd), packages);
|
|
70
|
+
}
|
|
71
|
+
function pipInstallCommand(tools) {
|
|
72
|
+
if (tools.length === 0)
|
|
73
|
+
return null;
|
|
74
|
+
const packages = tools.flatMap((tool) => packagesFor(tool));
|
|
75
|
+
return `pip install ${packages.join(' ')}`;
|
|
76
|
+
}
|
|
77
|
+
export function installCommandsFor(cwd, missingTools) {
|
|
78
|
+
const node = nodeInstallCommand(cwd, toolsInEcosystem(missingTools, 'node'));
|
|
79
|
+
const pip = pipInstallCommand(toolsInEcosystem(missingTools, 'pip'));
|
|
80
|
+
return [node, pip].filter((command) => command !== null);
|
|
81
|
+
}
|
|
55
82
|
//# sourceMappingURL=install-commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-commands.js","sourceRoot":"","sources":["../../../src/cli/init/install-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"install-commands.js","sourceRoot":"","sources":["../../../src/cli/init/install-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface RecommendedKey {
|
|
2
|
+
key: string;
|
|
3
|
+
value: number;
|
|
4
|
+
description: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Recommendation {
|
|
7
|
+
keys: RecommendedKey[];
|
|
8
|
+
missingKeys: (_cwd: string) => string[];
|
|
9
|
+
}
|
|
10
|
+
export declare const JSCPD_RECOMMENDED: RecommendedKey[];
|
|
11
|
+
export declare const RUFF_RECOMMENDED: RecommendedKey[];
|
|
12
|
+
export declare const JSCPD_RECOMMENDATION: Recommendation;
|
|
13
|
+
export declare const RUFF_RECOMMENDATION: Recommendation;
|
|
14
|
+
export declare function describeKey(recommendation: Recommendation, key: string): RecommendedKey;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { TOOL_CONFIG_FILENAMES } from '../../detect/tool.js';
|
|
4
|
+
export const JSCPD_RECOMMENDED = [
|
|
5
|
+
{ key: 'threshold', value: 0, description: 'fail on any duplication' },
|
|
6
|
+
{ key: 'minTokens', value: 50, description: 'smallest duplicate token run reported' },
|
|
7
|
+
{ key: 'minLines', value: 5, description: 'smallest duplicate line run reported' },
|
|
8
|
+
];
|
|
9
|
+
export const RUFF_RECOMMENDED = [
|
|
10
|
+
{ key: 'max-complexity', value: 10, description: 'mccabe cyclomatic complexity ceiling' },
|
|
11
|
+
{ key: 'max-args', value: 3, description: 'pylint maximum function arguments' },
|
|
12
|
+
{ key: 'max-statements', value: 50, description: 'pylint maximum function statements' },
|
|
13
|
+
];
|
|
14
|
+
function readJscpdConfig(cwd) {
|
|
15
|
+
for (const filename of TOOL_CONFIG_FILENAMES.jscpd) {
|
|
16
|
+
const path = join(cwd, filename);
|
|
17
|
+
if (!existsSync(path))
|
|
18
|
+
continue;
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
function jscpdMissingKeys(cwd) {
|
|
29
|
+
const config = readJscpdConfig(cwd);
|
|
30
|
+
if (config === null)
|
|
31
|
+
return JSCPD_RECOMMENDED.map((k) => k.key);
|
|
32
|
+
return JSCPD_RECOMMENDED.filter((k) => !(k.key in config)).map((k) => k.key);
|
|
33
|
+
}
|
|
34
|
+
function readTextOrEmpty(path) {
|
|
35
|
+
if (!existsSync(path))
|
|
36
|
+
return '';
|
|
37
|
+
try {
|
|
38
|
+
return `${readFileSync(path, 'utf8')}\n`;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return '';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function readRuffConfigText(cwd) {
|
|
45
|
+
const sources = [...TOOL_CONFIG_FILENAMES.ruff, 'pyproject.toml'];
|
|
46
|
+
return sources.map((filename) => readTextOrEmpty(join(cwd, filename))).join('');
|
|
47
|
+
}
|
|
48
|
+
function ruffMissingKeys(cwd) {
|
|
49
|
+
const text = readRuffConfigText(cwd);
|
|
50
|
+
return RUFF_RECOMMENDED.filter((k) => !text.includes(k.key)).map((k) => k.key);
|
|
51
|
+
}
|
|
52
|
+
export const JSCPD_RECOMMENDATION = {
|
|
53
|
+
keys: JSCPD_RECOMMENDED,
|
|
54
|
+
missingKeys: jscpdMissingKeys,
|
|
55
|
+
};
|
|
56
|
+
export const RUFF_RECOMMENDATION = {
|
|
57
|
+
keys: RUFF_RECOMMENDED,
|
|
58
|
+
missingKeys: ruffMissingKeys,
|
|
59
|
+
};
|
|
60
|
+
export function describeKey(recommendation, key) {
|
|
61
|
+
const found = recommendation.keys.find((k) => k.key === key);
|
|
62
|
+
if (found === undefined)
|
|
63
|
+
throw new Error(`unknown recommended key ${key}`);
|
|
64
|
+
return found;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=recommendations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../../src/cli/init/recommendations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function detectionReport(cwd: string): string;
|