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.
Files changed (211) hide show
  1. package/dist/baseline/auto-prune.d.ts +4 -0
  2. package/dist/baseline/auto-prune.js +38 -0
  3. package/dist/baseline/auto-prune.js.map +1 -0
  4. package/dist/baseline/commands.js +3 -9
  5. package/dist/baseline/commands.js.map +1 -1
  6. package/dist/baseline/filter.d.ts +2 -1
  7. package/dist/baseline/filter.js +2 -15
  8. package/dist/baseline/filter.js.map +1 -1
  9. package/dist/baseline/reap.d.ts +6 -0
  10. package/dist/baseline/reap.js +22 -0
  11. package/dist/baseline/reap.js.map +1 -0
  12. package/dist/baseline/snooze-index.d.ts +5 -0
  13. package/dist/baseline/snooze-index.js +65 -0
  14. package/dist/baseline/snooze-index.js.map +1 -0
  15. package/dist/checks/comment-check.js +4 -2
  16. package/dist/checks/comment-check.js.map +1 -1
  17. package/dist/checks/eslint-wrap.js +10 -7
  18. package/dist/checks/eslint-wrap.js.map +1 -1
  19. package/dist/checks/jscpd-wrap.d.ts +4 -1
  20. package/dist/checks/jscpd-wrap.js +12 -11
  21. package/dist/checks/jscpd-wrap.js.map +1 -1
  22. package/dist/checks/knip-wrap.js +20 -12
  23. package/dist/checks/knip-wrap.js.map +1 -1
  24. package/dist/cli/init/apply-recommendations.d.ts +3 -0
  25. package/dist/cli/init/apply-recommendations.js +76 -0
  26. package/dist/cli/init/apply-recommendations.js.map +1 -0
  27. package/dist/cli/init/command-runner.d.ts +6 -0
  28. package/dist/cli/init/command-runner.js +22 -0
  29. package/dist/cli/init/command-runner.js.map +1 -0
  30. package/dist/cli/init/completion-report.d.ts +11 -0
  31. package/dist/cli/init/completion-report.js +98 -0
  32. package/dist/cli/init/completion-report.js.map +1 -0
  33. package/dist/cli/init/ctx.d.ts +12 -0
  34. package/dist/cli/init/ctx.js +16 -0
  35. package/dist/cli/init/ctx.js.map +1 -0
  36. package/dist/cli/init/detect.d.ts +2 -0
  37. package/dist/cli/init/detect.js +55 -6
  38. package/dist/cli/init/detect.js.map +1 -1
  39. package/dist/cli/init/git-hook.d.ts +2 -1
  40. package/dist/cli/init/git-hook.js +10 -6
  41. package/dist/cli/init/git-hook.js.map +1 -1
  42. package/dist/cli/init/install-commands.d.ts +3 -1
  43. package/dist/cli/init/install-commands.js +27 -0
  44. package/dist/cli/init/install-commands.js.map +1 -1
  45. package/dist/cli/init/recommendations.d.ts +14 -0
  46. package/dist/cli/init/recommendations.js +66 -0
  47. package/dist/cli/init/recommendations.js.map +1 -0
  48. package/dist/cli/init/report-language.d.ts +1 -0
  49. package/dist/cli/init/report-language.js +12 -0
  50. package/dist/cli/init/report-language.js.map +1 -0
  51. package/dist/cli/init/reporters.d.ts +1 -0
  52. package/dist/cli/init/reporters.js +8 -4
  53. package/dist/cli/init/reporters.js.map +1 -1
  54. package/dist/cli/init/run.d.ts +5 -0
  55. package/dist/cli/init/run.js +60 -96
  56. package/dist/cli/init/run.js.map +1 -1
  57. package/dist/cli/init/scaffold-config.d.ts +8 -1
  58. package/dist/cli/init/scaffold-config.js +20 -3
  59. package/dist/cli/init/scaffold-config.js.map +1 -1
  60. package/dist/cli/init/scaffold-jscpd-config.d.ts +2 -1
  61. package/dist/cli/init/scaffold-jscpd-config.js +3 -3
  62. package/dist/cli/init/scaffold-jscpd-config.js.map +1 -1
  63. package/dist/cli/init/scaffold-ruff-config.d.ts +2 -0
  64. package/dist/cli/init/scaffold-ruff-config.js +12 -0
  65. package/dist/cli/init/scaffold-ruff-config.js.map +1 -0
  66. package/dist/cli/init/skill.d.ts +2 -1
  67. package/dist/cli/init/skill.js +18 -15
  68. package/dist/cli/init/skill.js.map +1 -1
  69. package/dist/cli/init/snippet.d.ts +2 -1
  70. package/dist/cli/init/snippet.js +17 -4
  71. package/dist/cli/init/snippet.js.map +1 -1
  72. package/dist/cli/init/templates/eslint-config.d.ts +1 -1
  73. package/dist/cli/init/templates/eslint-config.js +10 -0
  74. package/dist/cli/init/templates/eslint-config.js.map +1 -1
  75. package/dist/cli/init/templates/jscpd-config.d.ts +2 -1
  76. package/dist/cli/init/templates/jscpd-config.js +14 -6
  77. package/dist/cli/init/templates/jscpd-config.js.map +1 -1
  78. package/dist/cli/init/templates/ruff-config.d.ts +2 -0
  79. package/dist/cli/init/templates/ruff-config.js +16 -0
  80. package/dist/cli/init/templates/ruff-config.js.map +1 -0
  81. package/dist/cli/init/tool-steps.d.ts +2 -0
  82. package/dist/cli/init/tool-steps.js +78 -0
  83. package/dist/cli/init/tool-steps.js.map +1 -0
  84. package/dist/cli/init-command.js +32 -6
  85. package/dist/cli/init-command.js.map +1 -1
  86. package/dist/cli.js +2 -2
  87. package/dist/cli.js.map +1 -1
  88. package/dist/config/catalogue-unused.d.ts +2 -0
  89. package/dist/config/catalogue-unused.js +39 -0
  90. package/dist/config/catalogue-unused.js.map +1 -0
  91. package/dist/config/catalogue.d.ts +2 -0
  92. package/dist/config/catalogue.js +163 -0
  93. package/dist/config/catalogue.js.map +1 -0
  94. package/dist/config/defaults.d.ts +2 -2
  95. package/dist/config/defaults.js +7 -167
  96. package/dist/config/defaults.js.map +1 -1
  97. package/dist/config/load.d.ts +1 -0
  98. package/dist/config/load.js +1 -0
  99. package/dist/config/load.js.map +1 -1
  100. package/dist/config/merge.js +1 -0
  101. package/dist/config/merge.js.map +1 -1
  102. package/dist/config/schema.d.ts +9 -0
  103. package/dist/config/schema.js.map +1 -1
  104. package/dist/config/tool-smells.d.ts +14 -0
  105. package/dist/config/tool-smells.js +69 -0
  106. package/dist/config/tool-smells.js.map +1 -0
  107. package/dist/config/validate.js +42 -11
  108. package/dist/config/validate.js.map +1 -1
  109. package/dist/detect/path.d.ts +1 -0
  110. package/dist/detect/path.js +14 -0
  111. package/dist/detect/path.js.map +1 -0
  112. package/dist/detect/tool.d.ts +2 -2
  113. package/dist/detect/tool.js +2 -0
  114. package/dist/detect/tool.js.map +1 -1
  115. package/dist/discover.d.ts +2 -0
  116. package/dist/discover.js +14 -0
  117. package/dist/discover.js.map +1 -0
  118. package/dist/guide/command.d.ts +6 -0
  119. package/dist/guide/command.js +20 -0
  120. package/dist/guide/command.js.map +1 -0
  121. package/dist/guide/guide.d.ts +11 -0
  122. package/dist/guide/guide.js +82 -0
  123. package/dist/guide/guide.js.map +1 -0
  124. package/dist/guide/render.d.ts +3 -0
  125. package/dist/guide/render.js +14 -0
  126. package/dist/guide/render.js.map +1 -0
  127. package/dist/mapper/mapper.d.ts +34 -0
  128. package/dist/mapper/mapper.js +80 -0
  129. package/dist/mapper/mapper.js.map +1 -0
  130. package/dist/prompts/packaged-dir.js +1 -1
  131. package/dist/prompts/packaged-dir.js.map +1 -1
  132. package/dist/prompts/registry.js +1 -26
  133. package/dist/prompts/registry.js.map +1 -1
  134. package/dist/rule-files.d.ts +2 -0
  135. package/dist/rule-files.js +22 -0
  136. package/dist/rule-files.js.map +1 -0
  137. package/dist/rules/registry.js +3 -3
  138. package/dist/rules/registry.js.map +1 -1
  139. package/dist/runner.d.ts +4 -4
  140. package/dist/runner.js +95 -105
  141. package/dist/runner.js.map +1 -1
  142. package/dist/sensors/adapter.d.ts +17 -0
  143. package/dist/sensors/adapter.js +81 -0
  144. package/dist/sensors/adapter.js.map +1 -0
  145. package/dist/sensors/deptry-sensor.d.ts +3 -0
  146. package/dist/sensors/deptry-sensor.js +43 -0
  147. package/dist/sensors/deptry-sensor.js.map +1 -0
  148. package/dist/sensors/line-count-sensor.d.ts +3 -0
  149. package/dist/sensors/line-count-sensor.js +50 -0
  150. package/dist/sensors/line-count-sensor.js.map +1 -0
  151. package/dist/sensors/needs-extraction.d.ts +3 -0
  152. package/dist/sensors/needs-extraction.js +57 -0
  153. package/dist/sensors/needs-extraction.js.map +1 -0
  154. package/dist/sensors/preset.d.ts +17 -0
  155. package/dist/sensors/preset.js +57 -0
  156. package/dist/sensors/preset.js.map +1 -0
  157. package/dist/sensors/python-preset.d.ts +7 -0
  158. package/dist/sensors/python-preset.js +34 -0
  159. package/dist/sensors/python-preset.js.map +1 -0
  160. package/dist/sensors/runner.d.ts +12 -0
  161. package/dist/sensors/runner.js +94 -0
  162. package/dist/sensors/runner.js.map +1 -0
  163. package/dist/sensors/types.d.ts +15 -0
  164. package/dist/sensors/types.js +5 -0
  165. package/dist/sensors/types.js.map +1 -0
  166. package/dist/types.d.ts +4 -1
  167. package/dist/wrap/notices.d.ts +6 -0
  168. package/dist/wrap/notices.js +9 -0
  169. package/dist/wrap/notices.js.map +1 -1
  170. package/dist/wrap/run.d.ts +2 -0
  171. package/dist/wrap/run.js +6 -1
  172. package/dist/wrap/run.js.map +1 -1
  173. package/dist/wrap/shell.d.ts +1 -0
  174. package/dist/wrap/shell.js +8 -2
  175. package/dist/wrap/shell.js.map +1 -1
  176. package/package.json +17 -10
  177. package/src/prompts/deep-nesting.md +13 -0
  178. package/src/prompts/needs-extraction.md +9 -0
  179. package/src/prompts/non-null-assertion.md +10 -0
  180. package/src/prompts/oversized-function.issues.njk +5 -0
  181. package/src/prompts/parse-error.md +5 -0
  182. package/src/prompts/uncoached.md +4 -3
  183. package/src/skills/habit-hooks-prompting/SKILL.md +37 -0
  184. package/dist/eslint-runner.d.ts +0 -7
  185. package/dist/eslint-runner.js +0 -34
  186. package/dist/eslint-runner.js.map +0 -1
  187. package/dist/reporter.d.ts +0 -7
  188. package/dist/reporter.js +0 -114
  189. package/dist/reporter.js.map +0 -1
  190. package/src/prompts/eslint-boundaries-dependencies.md +0 -9
  191. package/src/prompts/eslint-eqeqeq.md +0 -3
  192. package/src/prompts/eslint-fatal.md +0 -7
  193. package/src/prompts/eslint-no-duplicate-imports.md +0 -1
  194. package/src/prompts/eslint-no-unused-vars.md +0 -3
  195. package/src/prompts/eslint-no-var.md +0 -1
  196. package/src/prompts/eslint-no-warning-comments.md +0 -3
  197. package/src/prompts/eslint-prefer-const.md +0 -3
  198. package/src/prompts/eslint-typescript-eslint-no-explicit-any.md +0 -3
  199. package/src/prompts/eslint-typescript-eslint-no-inferrable-types.md +0 -3
  200. package/src/prompts/eslint-typescript-eslint-no-non-null-assertion.md +0 -3
  201. package/src/prompts/knip-classMembers.md +0 -7
  202. package/src/prompts/knip-dependencies.md +0 -9
  203. package/src/prompts/knip-exports.md +0 -9
  204. package/src/prompts/knip-files.md +0 -9
  205. package/src/prompts/knip-types.md +0 -9
  206. /package/src/prompts/{jscpd-duplication.md → duplicated-code.md} +0 -0
  207. /package/src/prompts/{eslint-complexity.md → high-complexity.md} +0 -0
  208. /package/src/prompts/{comment-non-essential.md → non-essential-comment.md} +0 -0
  209. /package/src/prompts/{eslint-max-lines.md → oversized-file.md} +0 -0
  210. /package/src/prompts/{eslint-max-lines-per-function.md → oversized-function.md} +0 -0
  211. /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":"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"}
1
+ {"version":3,"file":"knip-wrap.js","sourceRoot":"","sources":["../../src/checks/knip-wrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandRunner } from './command-runner.js';
2
+ import type { Ctx } from './ctx.js';
3
+ export declare function applyRecommendations(ctx: Ctx, runCommand: CommandRunner): Promise<void>;
@@ -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,6 @@
1
+ export interface CommandResult {
2
+ ok: boolean;
3
+ output: string;
4
+ }
5
+ export type CommandRunner = (_command: string, _cwd: string) => Promise<CommandResult>;
6
+ export declare const runCommandWithShell: CommandRunner;
@@ -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;
@@ -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
- const TOOLS = ['eslint', 'knip', 'jscpd'];
6
- function hasConfigFile(cwd, tool) {
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
- return hasPackageJsonKey(cwd, TOOL_PACKAGE_JSON_KEYS[tool]);
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: detectTool(cwd, tool) !== null, configured: hasConfigFile(cwd, tool) };
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 TOOLS)
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;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAWjE,MAAM,KAAK,GAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,SAAS,aAAa,CAAC,GAAW,EAAE,IAAc;IAChD,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACzF,OAAO,iBAAiB,CAAC,GAAG,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,IAAc;IAC3C,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,MAAM,GAA6B,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7D,OAAO,MAAyB,CAAC;AACnC,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 hookBodyFor(cwd) {
5
- const command = runScriptCommand(detectPackageManager(cwd), 'habit-hooks');
6
- return `#!/usr/bin/env sh\n${command}\n`;
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 content.includes(' run habit-hooks');
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;AAS/E,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,OAAO,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;IAC3E,OAAO,sBAAsB,OAAO,IAAI,CAAC;AAC3C,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,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAC9C,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;IAC9C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,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
+ {"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: 'eslint' | 'knip' | 'jscpd'): string[];
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;AAMjC,MAAM,SAAS,GAA0C;IACvD,IAAI,EAAE,CAAC,gBAAgB,CAAC;IACxB,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,GAAG,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;CAC/B,CAAC;AAQF,SAAS,eAAe,CAAC,GAAW,EAAE,EAAc;IAClD,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAiB,EAAE,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,IAAmB;IACrC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAClF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,SAAS,GAAqC;IAClD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACnB,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACnB,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IAClB,GAAG,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC;CAC/B,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,EAAkB,EAAE,QAAkB;IACxE,OAAO,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAkB,EAAE,MAAc;IACjE,OAAO,GAAG,EAAE,QAAQ,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;AAEtE,MAAM,UAAU,WAAW,CAAC,IAAiC;IAC3D,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,eAAe,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,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;