habit-hooks 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/README.md +17 -226
  2. package/bin/habit-hooks.js +32 -0
  3. package/package.json +11 -44
  4. package/LICENSE.md +0 -21
  5. package/dist/baseline/auto-prune.d.ts +0 -4
  6. package/dist/baseline/auto-prune.js +0 -38
  7. package/dist/baseline/auto-prune.js.map +0 -1
  8. package/dist/baseline/commands.d.ts +0 -12
  9. package/dist/baseline/commands.js +0 -125
  10. package/dist/baseline/commands.js.map +0 -1
  11. package/dist/baseline/file-hash.d.ts +0 -2
  12. package/dist/baseline/file-hash.js +0 -25
  13. package/dist/baseline/file-hash.js.map +0 -1
  14. package/dist/baseline/filter.d.ts +0 -9
  15. package/dist/baseline/filter.js +0 -18
  16. package/dist/baseline/filter.js.map +0 -1
  17. package/dist/baseline/reap.d.ts +0 -6
  18. package/dist/baseline/reap.js +0 -22
  19. package/dist/baseline/reap.js.map +0 -1
  20. package/dist/baseline/snooze-index.d.ts +0 -5
  21. package/dist/baseline/snooze-index.js +0 -65
  22. package/dist/baseline/snooze-index.js.map +0 -1
  23. package/dist/baseline/store.d.ts +0 -18
  24. package/dist/baseline/store.js +0 -106
  25. package/dist/baseline/store.js.map +0 -1
  26. package/dist/checks/comment-check.d.ts +0 -3
  27. package/dist/checks/comment-check.js +0 -85
  28. package/dist/checks/comment-check.js.map +0 -1
  29. package/dist/checks/eslint-wrap.d.ts +0 -2
  30. package/dist/checks/eslint-wrap.js +0 -107
  31. package/dist/checks/eslint-wrap.js.map +0 -1
  32. package/dist/checks/jscpd-wrap.d.ts +0 -9
  33. package/dist/checks/jscpd-wrap.js +0 -159
  34. package/dist/checks/jscpd-wrap.js.map +0 -1
  35. package/dist/checks/knip-resolve.d.ts +0 -4
  36. package/dist/checks/knip-resolve.js +0 -49
  37. package/dist/checks/knip-resolve.js.map +0 -1
  38. package/dist/checks/knip-schema.d.ts +0 -32
  39. package/dist/checks/knip-schema.js +0 -24
  40. package/dist/checks/knip-schema.js.map +0 -1
  41. package/dist/checks/knip-wrap.d.ts +0 -4
  42. package/dist/checks/knip-wrap.js +0 -135
  43. package/dist/checks/knip-wrap.js.map +0 -1
  44. package/dist/cli/baseline-commands.d.ts +0 -2
  45. package/dist/cli/baseline-commands.js +0 -61
  46. package/dist/cli/baseline-commands.js.map +0 -1
  47. package/dist/cli/emit.d.ts +0 -7
  48. package/dist/cli/emit.js +0 -8
  49. package/dist/cli/emit.js.map +0 -1
  50. package/dist/cli/init/apply-recommendations.d.ts +0 -3
  51. package/dist/cli/init/apply-recommendations.js +0 -76
  52. package/dist/cli/init/apply-recommendations.js.map +0 -1
  53. package/dist/cli/init/command-runner.d.ts +0 -6
  54. package/dist/cli/init/command-runner.js +0 -22
  55. package/dist/cli/init/command-runner.js.map +0 -1
  56. package/dist/cli/init/completion-report.d.ts +0 -11
  57. package/dist/cli/init/completion-report.js +0 -98
  58. package/dist/cli/init/completion-report.js.map +0 -1
  59. package/dist/cli/init/ctx.d.ts +0 -12
  60. package/dist/cli/init/ctx.js +0 -16
  61. package/dist/cli/init/ctx.js.map +0 -1
  62. package/dist/cli/init/detect.d.ts +0 -10
  63. package/dist/cli/init/detect.js +0 -69
  64. package/dist/cli/init/detect.js.map +0 -1
  65. package/dist/cli/init/git-hook.d.ts +0 -7
  66. package/dist/cli/init/git-hook.js +0 -52
  67. package/dist/cli/init/git-hook.js.map +0 -1
  68. package/dist/cli/init/install-commands.d.ts +0 -8
  69. package/dist/cli/init/install-commands.js +0 -82
  70. package/dist/cli/init/install-commands.js.map +0 -1
  71. package/dist/cli/init/package-scripts.d.ts +0 -6
  72. package/dist/cli/init/package-scripts.js +0 -55
  73. package/dist/cli/init/package-scripts.js.map +0 -1
  74. package/dist/cli/init/prompts.d.ts +0 -9
  75. package/dist/cli/init/prompts.js +0 -33
  76. package/dist/cli/init/prompts.js.map +0 -1
  77. package/dist/cli/init/recommendations.d.ts +0 -14
  78. package/dist/cli/init/recommendations.js +0 -66
  79. package/dist/cli/init/recommendations.js.map +0 -1
  80. package/dist/cli/init/report-language.d.ts +0 -1
  81. package/dist/cli/init/report-language.js +0 -12
  82. package/dist/cli/init/report-language.js.map +0 -1
  83. package/dist/cli/init/reporters.d.ts +0 -12
  84. package/dist/cli/init/reporters.js +0 -44
  85. package/dist/cli/init/reporters.js.map +0 -1
  86. package/dist/cli/init/run.d.ts +0 -17
  87. package/dist/cli/init/run.js +0 -123
  88. package/dist/cli/init/run.js.map +0 -1
  89. package/dist/cli/init/scaffold-baseline.d.ts +0 -4
  90. package/dist/cli/init/scaffold-baseline.js +0 -11
  91. package/dist/cli/init/scaffold-baseline.js.map +0 -1
  92. package/dist/cli/init/scaffold-config.d.ts +0 -20
  93. package/dist/cli/init/scaffold-config.js +0 -59
  94. package/dist/cli/init/scaffold-config.js.map +0 -1
  95. package/dist/cli/init/scaffold-eslint-config.d.ts +0 -2
  96. package/dist/cli/init/scaffold-eslint-config.js +0 -12
  97. package/dist/cli/init/scaffold-eslint-config.js.map +0 -1
  98. package/dist/cli/init/scaffold-jscpd-config.d.ts +0 -3
  99. package/dist/cli/init/scaffold-jscpd-config.js +0 -12
  100. package/dist/cli/init/scaffold-jscpd-config.js.map +0 -1
  101. package/dist/cli/init/scaffold-knip-config.d.ts +0 -2
  102. package/dist/cli/init/scaffold-knip-config.js +0 -12
  103. package/dist/cli/init/scaffold-knip-config.js.map +0 -1
  104. package/dist/cli/init/scaffold-ruff-config.d.ts +0 -2
  105. package/dist/cli/init/scaffold-ruff-config.js +0 -12
  106. package/dist/cli/init/scaffold-ruff-config.js.map +0 -1
  107. package/dist/cli/init/skill.d.ts +0 -8
  108. package/dist/cli/init/skill.js +0 -39
  109. package/dist/cli/init/skill.js.map +0 -1
  110. package/dist/cli/init/snippet.d.ts +0 -2
  111. package/dist/cli/init/snippet.js +0 -31
  112. package/dist/cli/init/snippet.js.map +0 -1
  113. package/dist/cli/init/templates/eslint-config.d.ts +0 -2
  114. package/dist/cli/init/templates/eslint-config.js +0 -45
  115. package/dist/cli/init/templates/eslint-config.js.map +0 -1
  116. package/dist/cli/init/templates/jscpd-config.d.ts +0 -3
  117. package/dist/cli/init/templates/jscpd-config.js +0 -17
  118. package/dist/cli/init/templates/jscpd-config.js.map +0 -1
  119. package/dist/cli/init/templates/knip-config.d.ts +0 -2
  120. package/dist/cli/init/templates/knip-config.js +0 -8
  121. package/dist/cli/init/templates/knip-config.js.map +0 -1
  122. package/dist/cli/init/templates/ruff-config.d.ts +0 -2
  123. package/dist/cli/init/templates/ruff-config.js +0 -16
  124. package/dist/cli/init/templates/ruff-config.js.map +0 -1
  125. package/dist/cli/init/tool-steps.d.ts +0 -2
  126. package/dist/cli/init/tool-steps.js +0 -78
  127. package/dist/cli/init/tool-steps.js.map +0 -1
  128. package/dist/cli/init-command.d.ts +0 -2
  129. package/dist/cli/init-command.js +0 -59
  130. package/dist/cli/init-command.js.map +0 -1
  131. package/dist/cli.d.ts +0 -2
  132. package/dist/cli.js +0 -101
  133. package/dist/cli.js.map +0 -1
  134. package/dist/config/catalogue-unused.d.ts +0 -2
  135. package/dist/config/catalogue-unused.js +0 -39
  136. package/dist/config/catalogue-unused.js.map +0 -1
  137. package/dist/config/catalogue.d.ts +0 -2
  138. package/dist/config/catalogue.js +0 -163
  139. package/dist/config/catalogue.js.map +0 -1
  140. package/dist/config/defaults.d.ts +0 -4
  141. package/dist/config/defaults.js +0 -12
  142. package/dist/config/defaults.js.map +0 -1
  143. package/dist/config/jiti-loader.d.ts +0 -1
  144. package/dist/config/jiti-loader.js +0 -13
  145. package/dist/config/jiti-loader.js.map +0 -1
  146. package/dist/config/load.d.ts +0 -9
  147. package/dist/config/load.js +0 -54
  148. package/dist/config/load.js.map +0 -1
  149. package/dist/config/merge.d.ts +0 -3
  150. package/dist/config/merge.js +0 -91
  151. package/dist/config/merge.js.map +0 -1
  152. package/dist/config/schema.d.ts +0 -41
  153. package/dist/config/schema.js +0 -4
  154. package/dist/config/schema.js.map +0 -1
  155. package/dist/config/tool-smells.d.ts +0 -14
  156. package/dist/config/tool-smells.js +0 -69
  157. package/dist/config/tool-smells.js.map +0 -1
  158. package/dist/config/validate.d.ts +0 -2
  159. package/dist/config/validate.js +0 -159
  160. package/dist/config/validate.js.map +0 -1
  161. package/dist/detect/package-json.d.ts +0 -1
  162. package/dist/detect/package-json.js +0 -15
  163. package/dist/detect/package-json.js.map +0 -1
  164. package/dist/detect/path.d.ts +0 -1
  165. package/dist/detect/path.js +0 -14
  166. package/dist/detect/path.js.map +0 -1
  167. package/dist/detect/tool.d.ts +0 -10
  168. package/dist/detect/tool.js +0 -75
  169. package/dist/detect/tool.js.map +0 -1
  170. package/dist/discover.d.ts +0 -2
  171. package/dist/discover.js +0 -14
  172. package/dist/discover.js.map +0 -1
  173. package/dist/git/exec.d.ts +0 -8
  174. package/dist/git/exec.js +0 -48
  175. package/dist/git/exec.js.map +0 -1
  176. package/dist/git/resolve-scope.d.ts +0 -15
  177. package/dist/git/resolve-scope.js +0 -89
  178. package/dist/git/resolve-scope.js.map +0 -1
  179. package/dist/git/scope.d.ts +0 -7
  180. package/dist/git/scope.js +0 -58
  181. package/dist/git/scope.js.map +0 -1
  182. package/dist/guide/command.d.ts +0 -6
  183. package/dist/guide/command.js +0 -20
  184. package/dist/guide/command.js.map +0 -1
  185. package/dist/guide/guide.d.ts +0 -11
  186. package/dist/guide/guide.js +0 -82
  187. package/dist/guide/guide.js.map +0 -1
  188. package/dist/guide/render.d.ts +0 -3
  189. package/dist/guide/render.js +0 -14
  190. package/dist/guide/render.js.map +0 -1
  191. package/dist/index.d.ts +0 -1
  192. package/dist/index.js +0 -2
  193. package/dist/index.js.map +0 -1
  194. package/dist/mapper/mapper.d.ts +0 -34
  195. package/dist/mapper/mapper.js +0 -80
  196. package/dist/mapper/mapper.js.map +0 -1
  197. package/dist/prompts/loader.d.ts +0 -6
  198. package/dist/prompts/loader.js +0 -27
  199. package/dist/prompts/loader.js.map +0 -1
  200. package/dist/prompts/packaged-dir.d.ts +0 -1
  201. package/dist/prompts/packaged-dir.js +0 -10
  202. package/dist/prompts/packaged-dir.js.map +0 -1
  203. package/dist/prompts/registry.d.ts +0 -3
  204. package/dist/prompts/registry.js +0 -43
  205. package/dist/prompts/registry.js.map +0 -1
  206. package/dist/rule-files.d.ts +0 -2
  207. package/dist/rule-files.js +0 -22
  208. package/dist/rule-files.js.map +0 -1
  209. package/dist/rules/registry.d.ts +0 -3
  210. package/dist/rules/registry.js +0 -37
  211. package/dist/rules/registry.js.map +0 -1
  212. package/dist/runner.d.ts +0 -15
  213. package/dist/runner.js +0 -141
  214. package/dist/runner.js.map +0 -1
  215. package/dist/sensors/adapter.d.ts +0 -17
  216. package/dist/sensors/adapter.js +0 -81
  217. package/dist/sensors/adapter.js.map +0 -1
  218. package/dist/sensors/deptry-sensor.d.ts +0 -3
  219. package/dist/sensors/deptry-sensor.js +0 -43
  220. package/dist/sensors/deptry-sensor.js.map +0 -1
  221. package/dist/sensors/line-count-sensor.d.ts +0 -3
  222. package/dist/sensors/line-count-sensor.js +0 -50
  223. package/dist/sensors/line-count-sensor.js.map +0 -1
  224. package/dist/sensors/needs-extraction.d.ts +0 -3
  225. package/dist/sensors/needs-extraction.js +0 -57
  226. package/dist/sensors/needs-extraction.js.map +0 -1
  227. package/dist/sensors/preset.d.ts +0 -17
  228. package/dist/sensors/preset.js +0 -57
  229. package/dist/sensors/preset.js.map +0 -1
  230. package/dist/sensors/python-preset.d.ts +0 -7
  231. package/dist/sensors/python-preset.js +0 -34
  232. package/dist/sensors/python-preset.js.map +0 -1
  233. package/dist/sensors/runner.d.ts +0 -12
  234. package/dist/sensors/runner.js +0 -94
  235. package/dist/sensors/runner.js.map +0 -1
  236. package/dist/sensors/types.d.ts +0 -15
  237. package/dist/sensors/types.js +0 -5
  238. package/dist/sensors/types.js.map +0 -1
  239. package/dist/types.d.ts +0 -44
  240. package/dist/types.js +0 -2
  241. package/dist/types.js.map +0 -1
  242. package/dist/wrap/notices.d.ts +0 -19
  243. package/dist/wrap/notices.js +0 -38
  244. package/dist/wrap/notices.js.map +0 -1
  245. package/dist/wrap/resolve.d.ts +0 -5
  246. package/dist/wrap/resolve.js +0 -9
  247. package/dist/wrap/resolve.js.map +0 -1
  248. package/dist/wrap/run.d.ts +0 -17
  249. package/dist/wrap/run.js +0 -31
  250. package/dist/wrap/run.js.map +0 -1
  251. package/dist/wrap/shell.d.ts +0 -15
  252. package/dist/wrap/shell.js +0 -50
  253. package/dist/wrap/shell.js.map +0 -1
  254. package/src/prompts/deep-nesting.md +0 -13
  255. package/src/prompts/duplicated-code.md +0 -9
  256. package/src/prompts/high-complexity.md +0 -9
  257. package/src/prompts/needs-extraction.md +0 -9
  258. package/src/prompts/non-essential-comment.md +0 -7
  259. package/src/prompts/non-null-assertion.md +0 -10
  260. package/src/prompts/oversized-file.md +0 -9
  261. package/src/prompts/oversized-function.issues.njk +0 -5
  262. package/src/prompts/oversized-function.md +0 -9
  263. package/src/prompts/parse-error.md +0 -5
  264. package/src/prompts/too-many-parameters.md +0 -9
  265. package/src/prompts/uncoached.md +0 -4
  266. package/src/skills/habit-hooks-prompting/SKILL.md +0 -37
  267. package/src/skills/habit-hooks-review/SKILL.md +0 -108
@@ -1,123 +0,0 @@
1
- import { scaffoldConfig } from './scaffold-config.js';
2
- import { scaffoldBaseline } from './scaffold-baseline.js';
3
- import { runToolSteps } from './tool-steps.js';
4
- import { detectToolStates, toolsForLanguage } from './detect.js';
5
- import { completionReport } from './completion-report.js';
6
- import { dryRunPath, noteScaffold } from './ctx.js';
7
- import { detectionReport } from './report-language.js';
8
- import { addCiScript, addHabitHooksScript } from './package-scripts.js';
9
- import { installPreCommitHook } from './git-hook.js';
10
- import { installSkills } from './skill.js';
11
- import { agentSnippet } from './snippet.js';
12
- import { reportHookResult, reportScriptResult, reportSkillResults, } from './reporters.js';
13
- import { applyRecommendations } from './apply-recommendations.js';
14
- import { runCommandWithShell } from './command-runner.js';
15
- function writeConfigStep(ctx) {
16
- if (ctx.dryRun) {
17
- dryRunPath(ctx, 'habit-hooks.config.js', 'habit-hooks config');
18
- return;
19
- }
20
- noteScaffold(ctx, scaffoldConfig(ctx.cwd, ctx.language), 'habit-hooks config');
21
- }
22
- function writeBaselineStep(ctx) {
23
- if (ctx.dryRun) {
24
- dryRunPath(ctx, '.habit-hooks-baseline.json', 'baseline');
25
- return;
26
- }
27
- const result = scaffoldBaseline(ctx.cwd);
28
- if (result.created)
29
- ctx.lines.out.push(`wrote ${result.path}\n`);
30
- else
31
- ctx.lines.out.push(`baseline already present at ${result.path}\n`);
32
- }
33
- async function maybeAddHabitHooksScript(ctx, prompter) {
34
- if (ctx.dryRun)
35
- return;
36
- const yes = await prompter.ask("Add 'habit-hooks' to package.json scripts?", { defaultYes: true });
37
- if (!yes)
38
- return;
39
- reportScriptResult('habit-hooks', addHabitHooksScript(ctx.cwd), ctx.lines);
40
- }
41
- async function maybeAddCiScript(ctx, prompter) {
42
- if (ctx.dryRun)
43
- return;
44
- const yes = await prompter.ask("Wire 'npm run ci' as the full quality gate?", { defaultYes: true });
45
- if (!yes)
46
- return;
47
- reportScriptResult('ci', addCiScript(ctx.cwd), ctx.lines);
48
- }
49
- async function maybeInstallHook(ctx, prompter) {
50
- if (ctx.dryRun)
51
- return;
52
- const yes = await prompter.ask('Install a git pre-commit hook?', { defaultYes: false });
53
- if (!yes)
54
- return;
55
- reportHookResult(installPreCommitHook(ctx.cwd, ctx.language), ctx.lines);
56
- }
57
- async function maybeInstallSkill(ctx, prompter) {
58
- if (ctx.dryRun)
59
- return;
60
- const yes = await prompter.ask('Install the bundled habit-hooks skills into ~/.claude/skills/?', { defaultYes: false });
61
- if (!yes)
62
- return;
63
- reportSkillResults(installSkills(), ctx.lines);
64
- }
65
- function printCompletionReport(ctx) {
66
- ctx.lines.out.push(completionReport({
67
- cwd: ctx.cwd,
68
- language: ctx.language,
69
- tools: toolsForLanguage(ctx.language),
70
- matrix: detectToolStates(ctx.cwd),
71
- advertiseAcceptFlag: !ctx.acceptRecommendations,
72
- }));
73
- }
74
- function printSnippet(ctx) {
75
- ctx.lines.out.push('\n--- paste into CLAUDE.md / AGENTS.md ---\n');
76
- ctx.lines.out.push(agentSnippet(ctx.language));
77
- ctx.lines.out.push('--- end snippet ---\n');
78
- }
79
- async function maybeAddNpmScripts(ctx, prompter) {
80
- if (ctx.language === 'python')
81
- return;
82
- await maybeAddHabitHooksScript(ctx, prompter);
83
- await maybeAddCiScript(ctx, prompter);
84
- }
85
- async function runPrompts(ctx, prompter) {
86
- await maybeAddNpmScripts(ctx, prompter);
87
- await maybeInstallHook(ctx, prompter);
88
- await maybeInstallSkill(ctx, prompter);
89
- }
90
- function toResult(lines) {
91
- return { stdout: lines.out.join(''), stderr: lines.err.join(''), exitCode: lines.exit };
92
- }
93
- function reportOnly(cwd) {
94
- return { stdout: detectionReport(cwd), stderr: '', exitCode: 0 };
95
- }
96
- async function maybeApplyRecommendations(ctx, runCommand) {
97
- if (!ctx.acceptRecommendations || ctx.dryRun)
98
- return;
99
- await applyRecommendations(ctx, runCommand);
100
- }
101
- async function scaffold(ctx, prompter, runCommand) {
102
- runToolSteps(ctx);
103
- writeConfigStep(ctx);
104
- writeBaselineStep(ctx);
105
- await runPrompts(ctx, prompter);
106
- await maybeApplyRecommendations(ctx, runCommand);
107
- printCompletionReport(ctx);
108
- printSnippet(ctx);
109
- return toResult(ctx.lines);
110
- }
111
- export async function runInit(cwd, opts) {
112
- if (opts.language === undefined)
113
- return reportOnly(cwd);
114
- const ctx = {
115
- cwd,
116
- lines: { out: [], err: [], exit: 0 },
117
- dryRun: opts.dryRun === true,
118
- language: opts.language,
119
- acceptRecommendations: opts.acceptRecommendations === true,
120
- };
121
- return scaffold(ctx, opts.prompter, opts.runCommand ?? runCommandWithShell);
122
- }
123
- //# sourceMappingURL=run.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/init/run.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- export declare function scaffoldBaseline(cwd: string): {
2
- path: string;
3
- created: boolean;
4
- };
@@ -1,11 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { BASELINE_FILENAME, BASELINE_VERSION, saveBaseline } from '../../baseline/store.js';
4
- export function scaffoldBaseline(cwd) {
5
- const path = join(cwd, BASELINE_FILENAME);
6
- if (existsSync(path))
7
- return { path, created: false };
8
- saveBaseline(cwd, { version: BASELINE_VERSION, files: {} });
9
- return { path, created: true };
10
- }
11
- //# sourceMappingURL=scaffold-baseline.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold-baseline.js","sourceRoot":"","sources":["../../../src/cli/init/scaffold-baseline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5F,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACtD,YAAY,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC"}
@@ -1,20 +0,0 @@
1
- import type { Language } from '../../config/schema.js';
2
- export interface DetectedLanguage {
3
- language: Language;
4
- reason: string;
5
- }
6
- export declare function detectLanguageWithReason(cwd: string): DetectedLanguage;
7
- export declare function detectLanguage(cwd: string): Language;
8
- export interface ScaffoldResult {
9
- path: string;
10
- created: boolean;
11
- }
12
- interface ScaffoldFileArgs {
13
- cwd: string;
14
- candidates: readonly string[];
15
- defaultName: string;
16
- template: string;
17
- }
18
- export declare function scaffoldFile(args: ScaffoldFileArgs): ScaffoldResult;
19
- export declare function scaffoldConfig(cwd: string, language?: Language): ScaffoldResult;
20
- export {};
@@ -1,59 +0,0 @@
1
- import { existsSync, writeFileSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- const CONFIG_FILENAMES = [
4
- 'habit-hooks.config.ts',
5
- 'habit-hooks.config.mjs',
6
- 'habit-hooks.config.js',
7
- 'habit-hooks.config.json',
8
- ];
9
- const NEW_CONFIG_FILENAME = 'habit-hooks.config.js';
10
- // init selects the language so only that language's sensors run. A Python
11
- // project is recognised by its manifest; everything else defaults to TypeScript.
12
- export function detectLanguageWithReason(cwd) {
13
- if (existsSync(join(cwd, 'pyproject.toml'))) {
14
- return { language: 'python', reason: 'found pyproject.toml' };
15
- }
16
- if (existsSync(join(cwd, 'setup.py'))) {
17
- return { language: 'python', reason: 'found setup.py' };
18
- }
19
- return { language: 'typescript', reason: 'no Python manifest found' };
20
- }
21
- export function detectLanguage(cwd) {
22
- return detectLanguageWithReason(cwd).language;
23
- }
24
- function configTemplate(language) {
25
- return `export default {
26
- language: '${language}',
27
- scope: {
28
- onlyChangedFiles: true,
29
- branchBase: 'main',
30
- },
31
- };
32
- `;
33
- }
34
- function findExisting(cwd, candidates) {
35
- for (const name of candidates) {
36
- const candidate = join(cwd, name);
37
- if (existsSync(candidate))
38
- return candidate;
39
- }
40
- return null;
41
- }
42
- export function scaffoldFile(args) {
43
- const { cwd, candidates, defaultName, template } = args;
44
- const existing = findExisting(cwd, candidates);
45
- if (existing !== null)
46
- return { path: existing, created: false };
47
- const path = join(cwd, defaultName);
48
- writeFileSync(path, template);
49
- return { path, created: true };
50
- }
51
- export function scaffoldConfig(cwd, language) {
52
- return scaffoldFile({
53
- cwd,
54
- candidates: CONFIG_FILENAMES,
55
- defaultName: NEW_CONFIG_FILENAME,
56
- template: configTemplate(language ?? detectLanguage(cwd)),
57
- });
58
- }
59
- //# sourceMappingURL=scaffold-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold-config.js","sourceRoot":"","sources":["../../../src/cli/init/scaffold-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,gBAAgB,GAAG;IACvB,uBAAuB;IACvB,wBAAwB;IACxB,uBAAuB;IACvB,yBAAyB;CAC1B,CAAC;AAEF,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AAOpD,0EAA0E;AAC1E,iFAAiF;AACjF,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,wBAAwB,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;AAChD,CAAC;AAED,SAAS,cAAc,CAAC,QAAkB;IACxC,OAAO;eACM,QAAQ;;;;;;CAMtB,CAAC;AACF,CAAC;AAOD,SAAS,YAAY,CAAC,GAAW,EAAE,UAA6B;IAC9D,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AASD,MAAM,UAAU,YAAY,CAAC,IAAsB;IACjD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IACxD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACjE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAmB;IAC7D,OAAO,YAAY,CAAC;QAClB,GAAG;QACH,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;KAC1D,CAAC,CAAC;AACL,CAAC"}
@@ -1,2 +0,0 @@
1
- import { type ScaffoldResult } from './scaffold-config.js';
2
- export declare function scaffoldEslintConfig(cwd: string): ScaffoldResult;
@@ -1,12 +0,0 @@
1
- import { TOOL_CONFIG_FILENAMES } from '../../detect/tool.js';
2
- import { ESLINT_CONFIG_FILENAME, ESLINT_CONFIG_TEMPLATE } from './templates/eslint-config.js';
3
- import { scaffoldFile } from './scaffold-config.js';
4
- export function scaffoldEslintConfig(cwd) {
5
- return scaffoldFile({
6
- cwd,
7
- candidates: TOOL_CONFIG_FILENAMES.eslint,
8
- defaultName: ESLINT_CONFIG_FILENAME,
9
- template: ESLINT_CONFIG_TEMPLATE,
10
- });
11
- }
12
- //# sourceMappingURL=scaffold-eslint-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold-eslint-config.js","sourceRoot":"","sources":["../../../src/cli/init/scaffold-eslint-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC9F,OAAO,EAAE,YAAY,EAAuB,MAAM,sBAAsB,CAAC;AAEzE,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,YAAY,CAAC;QAClB,GAAG;QACH,UAAU,EAAE,qBAAqB,CAAC,MAAM;QACxC,WAAW,EAAE,sBAAsB;QACnC,QAAQ,EAAE,sBAAsB;KACjC,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Language } from '../../config/schema.js';
2
- import { type ScaffoldResult } from './scaffold-config.js';
3
- export declare function scaffoldJscpdConfig(cwd: string, language: Language): ScaffoldResult;
@@ -1,12 +0,0 @@
1
- import { TOOL_CONFIG_FILENAMES } from '../../detect/tool.js';
2
- import { JSCPD_CONFIG_FILENAME, jscpdConfigTemplate } from './templates/jscpd-config.js';
3
- import { scaffoldFile } from './scaffold-config.js';
4
- export function scaffoldJscpdConfig(cwd, language) {
5
- return scaffoldFile({
6
- cwd,
7
- candidates: TOOL_CONFIG_FILENAMES.jscpd,
8
- defaultName: JSCPD_CONFIG_FILENAME,
9
- template: jscpdConfigTemplate(language),
10
- });
11
- }
12
- //# sourceMappingURL=scaffold-jscpd-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold-jscpd-config.js","sourceRoot":"","sources":["../../../src/cli/init/scaffold-jscpd-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,YAAY,EAAuB,MAAM,sBAAsB,CAAC;AAEzE,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,QAAkB;IACjE,OAAO,YAAY,CAAC;QAClB,GAAG;QACH,UAAU,EAAE,qBAAqB,CAAC,KAAK;QACvC,WAAW,EAAE,qBAAqB;QAClC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,CAAC;KACxC,CAAC,CAAC;AACL,CAAC"}
@@ -1,2 +0,0 @@
1
- import { type ScaffoldResult } from './scaffold-config.js';
2
- export declare function scaffoldKnipConfig(cwd: string): ScaffoldResult;
@@ -1,12 +0,0 @@
1
- import { TOOL_CONFIG_FILENAMES } from '../../detect/tool.js';
2
- import { KNIP_CONFIG_FILENAME, KNIP_CONFIG_TEMPLATE } from './templates/knip-config.js';
3
- import { scaffoldFile } from './scaffold-config.js';
4
- export function scaffoldKnipConfig(cwd) {
5
- return scaffoldFile({
6
- cwd,
7
- candidates: TOOL_CONFIG_FILENAMES.knip,
8
- defaultName: KNIP_CONFIG_FILENAME,
9
- template: KNIP_CONFIG_TEMPLATE,
10
- });
11
- }
12
- //# sourceMappingURL=scaffold-knip-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold-knip-config.js","sourceRoot":"","sources":["../../../src/cli/init/scaffold-knip-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EAAE,YAAY,EAAuB,MAAM,sBAAsB,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,YAAY,CAAC;QAClB,GAAG;QACH,UAAU,EAAE,qBAAqB,CAAC,IAAI;QACtC,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,oBAAoB;KAC/B,CAAC,CAAC;AACL,CAAC"}
@@ -1,2 +0,0 @@
1
- import { type ScaffoldResult } from './scaffold-config.js';
2
- export declare function scaffoldRuffConfig(cwd: string): ScaffoldResult;
@@ -1,12 +0,0 @@
1
- import { TOOL_CONFIG_FILENAMES } from '../../detect/tool.js';
2
- import { RUFF_CONFIG_FILENAME, RUFF_CONFIG_TEMPLATE } from './templates/ruff-config.js';
3
- import { scaffoldFile } from './scaffold-config.js';
4
- export function scaffoldRuffConfig(cwd) {
5
- return scaffoldFile({
6
- cwd,
7
- candidates: TOOL_CONFIG_FILENAMES.ruff,
8
- defaultName: RUFF_CONFIG_FILENAME,
9
- template: RUFF_CONFIG_TEMPLATE,
10
- });
11
- }
12
- //# sourceMappingURL=scaffold-ruff-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold-ruff-config.js","sourceRoot":"","sources":["../../../src/cli/init/scaffold-ruff-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EAAE,YAAY,EAAuB,MAAM,sBAAsB,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,YAAY,CAAC;QAClB,GAAG;QACH,UAAU,EAAE,qBAAqB,CAAC,IAAI;QACtC,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,oBAAoB;KAC/B,CAAC,CAAC;AACL,CAAC"}
@@ -1,8 +0,0 @@
1
- export type SkillAction = 'installed' | 'conflict' | 'source-missing' | 'kept';
2
- export interface SkillResult {
3
- name: string;
4
- action: SkillAction;
5
- source?: string;
6
- target?: string;
7
- }
8
- export declare function installSkills(): SkillResult[];
@@ -1,39 +0,0 @@
1
- import { copyFileSync, existsSync, mkdirSync } from 'node:fs';
2
- import { homedir } from 'node:os';
3
- import { dirname, join, resolve } from 'node:path';
4
- import { fileURLToPath } from 'node:url';
5
- const SKILL_NAMES = ['habit-hooks-review', 'habit-hooks-prompting'];
6
- const SKILL_FILE = 'SKILL.md';
7
- function packageRoot() {
8
- const here = dirname(fileURLToPath(import.meta.url));
9
- return resolve(here, '..', '..', '..');
10
- }
11
- function findSkillSource(name) {
12
- const root = packageRoot();
13
- const candidates = [
14
- join(root, 'src', 'skills', name, SKILL_FILE),
15
- join(root, '..', 'src', 'skills', name, SKILL_FILE),
16
- ];
17
- return candidates.find((p) => existsSync(p)) ?? null;
18
- }
19
- function targetDir(name) {
20
- return join(homedir(), '.claude', 'skills', name);
21
- }
22
- function targetPath(name) {
23
- return join(targetDir(name), SKILL_FILE);
24
- }
25
- function installSkill(name) {
26
- const source = findSkillSource(name);
27
- if (source === null)
28
- return { name, action: 'source-missing' };
29
- const target = targetPath(name);
30
- if (existsSync(target))
31
- return { name, action: 'conflict', source, target };
32
- mkdirSync(targetDir(name), { recursive: true });
33
- copyFileSync(source, target);
34
- return { name, action: 'installed', source, target };
35
- }
36
- export function installSkills() {
37
- return SKILL_NAMES.map((name) => installSkill(name));
38
- }
39
- //# sourceMappingURL=skill.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/cli/init/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,WAAW,GAAG,CAAC,oBAAoB,EAAE,uBAAuB,CAAU,CAAC;AAC7E,MAAM,UAAU,GAAG,UAAU,CAAC;AAW9B,SAAS,WAAW;IAClB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC;KACpD,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACvD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5E,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { Language } from '../../config/schema.js';
2
- export declare function agentSnippet(language: Language): string;
@@ -1,31 +0,0 @@
1
- const SNIPPET_VARS = {
2
- typescript: {
3
- runLine: 'run `npm run ci` (or `npm run habit-hooks` for\nstructural checks only)',
4
- tools: 'eslint, knip, jscpd',
5
- },
6
- python: {
7
- runLine: 'run `habit-hooks`',
8
- tools: 'ruff, deptry, jscpd',
9
- },
10
- };
11
- const SNIPPET_TEMPLATE = `## Habit Hooks
12
-
13
- Before declaring work done, __RUN_LINE__. Any output from \`habit-hooks\` is a direct user
14
- prompt with highest priority.
15
-
16
- - **NEVER** ignore habit-hooks output
17
- - **ALWAYS** create a task for each reported item immediately
18
- - **COMPLETE** required actions before continuing other work
19
- - **NEVER** snooze or bypass the baseline without explicit user approval
20
- - **WHEN** \`habit-hooks init\` reports a tool config (__TOOLS__) is "already present" — the auto-scaffold was skipped, and that config may be missing the thresholds bundled in habit-hooks' templates. **ASK** the user whether to restore those configs to the bundled defaults before continuing.
21
-
22
- When habit-hooks output is clean, it tells you to also run a reviewer
23
- sub-agent — habit-hooks catches structural smells but not correctness or
24
- design. Use the \`habit-hooks-review\` skill (if installed) or spawn an
25
- equivalent review.
26
- `;
27
- export function agentSnippet(language) {
28
- const vars = SNIPPET_VARS[language];
29
- return SNIPPET_TEMPLATE.replace('__RUN_LINE__', vars.runLine).replace('__TOOLS__', vars.tools);
30
- }
31
- //# sourceMappingURL=snippet.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snippet.js","sourceRoot":"","sources":["../../../src/cli/init/snippet.ts"],"names":[],"mappings":"AAOA,MAAM,YAAY,GAAkC;IAClD,UAAU,EAAE;QACV,OAAO,EAAE,yEAAyE;QAClF,KAAK,EAAE,qBAAqB;KAC7B;IACD,MAAM,EAAE;QACN,OAAO,EAAE,mBAAmB;QAC5B,KAAK,EAAE,qBAAqB;KAC7B;CACF,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;CAexB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,QAAkB;IAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,gBAAgB,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACjG,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const ESLINT_CONFIG_FILENAME = "eslint.config.js";
2
- export declare const ESLINT_CONFIG_TEMPLATE: string;
@@ -1,45 +0,0 @@
1
- import { TEST_FILE_EXCLUDE } from '../../../config/defaults.js';
2
- export const ESLINT_CONFIG_FILENAME = 'eslint.config.js';
3
- const testFileGlobs = TEST_FILE_EXCLUDE.map((glob) => `'${glob}'`).join(', ');
4
- export const ESLINT_CONFIG_TEMPLATE = `import js from '@eslint/js';
5
- import tseslint from 'typescript-eslint';
6
-
7
- export default tseslint.config(
8
- {
9
- ignores: ['node_modules', 'dist'],
10
- },
11
- js.configs.recommended,
12
- ...tseslint.configs.recommended,
13
- {
14
- languageOptions: {
15
- ecmaVersion: 2022,
16
- sourceType: 'module',
17
- },
18
- rules: {
19
- 'max-lines-per-function': ['error', { max: 12, skipBlankLines: false, skipComments: false, IIFEs: true }],
20
- 'max-params': ['error', { max: 3 }],
21
- 'complexity': ['error', { max: 10 }],
22
- 'max-depth': ['error', { max: 4 }],
23
- 'max-lines': ['error', { max: 200, skipBlankLines: false, skipComments: false }],
24
- 'no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
25
- '@typescript-eslint/no-unused-vars': 'off',
26
- 'eqeqeq': ['error', 'always'],
27
- 'no-var': 'error',
28
- 'prefer-const': 'error',
29
- 'no-duplicate-imports': 'error',
30
- 'no-warning-comments': ['warn', { terms: ['todo', 'fixme', 'xxx', 'hack'], location: 'anywhere' }],
31
- '@typescript-eslint/no-explicit-any': 'warn',
32
- '@typescript-eslint/no-non-null-assertion': 'warn',
33
- '@typescript-eslint/no-inferrable-types': 'error',
34
- },
35
- },
36
- {
37
- files: [${testFileGlobs}],
38
- rules: {
39
- 'max-lines-per-function': 'off',
40
- 'max-lines': 'off',
41
- },
42
- },
43
- );
44
- `;
45
- //# sourceMappingURL=eslint-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eslint-config.js","sourceRoot":"","sources":["../../../../src/cli/init/templates/eslint-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAEzD,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE9E,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAiCxB,aAAa;;;;;;;CAO1B,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Language } from '../../../config/schema.js';
2
- export declare const JSCPD_CONFIG_FILENAME = ".jscpd.json";
3
- export declare function jscpdConfigTemplate(language: Language): string;
@@ -1,17 +0,0 @@
1
- import { JSCPD_RECOMMENDED } from '../recommendations.js';
2
- export const JSCPD_CONFIG_FILENAME = '.jscpd.json';
3
- const IGNORE_BY_LANGUAGE = {
4
- typescript: ['**/node_modules/**', '**/dist/**', '**/*.test.ts', '**/*.spec.ts'],
5
- python: ['**/.venv/**', '**/venv/**', '**/__pycache__/**', '**/*_test.py', '**/test_*.py'],
6
- };
7
- function recommendedSettings() {
8
- const settings = {};
9
- for (const { key, value } of JSCPD_RECOMMENDED)
10
- settings[key] = value;
11
- return settings;
12
- }
13
- export function jscpdConfigTemplate(language) {
14
- const config = { ...recommendedSettings(), ignore: IGNORE_BY_LANGUAGE[language] };
15
- return `${JSON.stringify(config, null, 2)}\n`;
16
- }
17
- //# sourceMappingURL=jscpd-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jscpd-config.js","sourceRoot":"","sources":["../../../../src/cli/init/templates/jscpd-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAEnD,MAAM,kBAAkB,GAA+B;IACrD,UAAU,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,CAAC;IAChF,MAAM,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,cAAc,CAAC;CAC3F,CAAC;AAEF,SAAS,mBAAmB;IAC1B,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,iBAAiB;QAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAkB;IACpD,MAAM,MAAM,GAAG,EAAE,GAAG,mBAAmB,EAAE,EAAE,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAClF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const KNIP_CONFIG_FILENAME = "knip.json";
2
- export declare const KNIP_CONFIG_TEMPLATE = "{\n \"entry\": [\"src/index.ts\", \"src/cli.ts\"],\n \"project\": [\"src/**/*.ts\"],\n \"ignore\": [\"dist/**\", \"coverage/**\"]\n}\n";
@@ -1,8 +0,0 @@
1
- export const KNIP_CONFIG_FILENAME = 'knip.json';
2
- export const KNIP_CONFIG_TEMPLATE = `{
3
- "entry": ["src/index.ts", "src/cli.ts"],
4
- "project": ["src/**/*.ts"],
5
- "ignore": ["dist/**", "coverage/**"]
6
- }
7
- `;
8
- //# sourceMappingURL=knip-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"knip-config.js","sourceRoot":"","sources":["../../../../src/cli/init/templates/knip-config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAAC;AAEhD,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;CAKnC,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const RUFF_CONFIG_FILENAME = "ruff.toml";
2
- export declare const RUFF_CONFIG_TEMPLATE: string;
@@ -1,16 +0,0 @@
1
- import { RUFF_RECOMMENDED } from '../recommendations.js';
2
- export const RUFF_CONFIG_FILENAME = 'ruff.toml';
3
- function valueOf(key) {
4
- const found = RUFF_RECOMMENDED.find((k) => k.key === key);
5
- if (found === undefined)
6
- throw new Error(`unknown ruff recommended key ${key}`);
7
- return found.value;
8
- }
9
- export const RUFF_CONFIG_TEMPLATE = `[lint.mccabe]
10
- max-complexity = ${valueOf('max-complexity')}
11
-
12
- [lint.pylint]
13
- max-args = ${valueOf('max-args')}
14
- max-statements = ${valueOf('max-statements')}
15
- `;
16
- //# sourceMappingURL=ruff-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ruff-config.js","sourceRoot":"","sources":["../../../../src/cli/init/templates/ruff-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAAC;AAEhD,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1D,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG;mBACjB,OAAO,CAAC,gBAAgB,CAAC;;;aAG/B,OAAO,CAAC,UAAU,CAAC;mBACb,OAAO,CAAC,gBAAgB,CAAC;CAC3C,CAAC"}
@@ -1,2 +0,0 @@
1
- import { type Ctx } from './ctx.js';
2
- export declare function runToolSteps(ctx: Ctx): void;
@@ -1,78 +0,0 @@
1
- import { scaffoldEslintConfig } from './scaffold-eslint-config.js';
2
- import { scaffoldKnipConfig } from './scaffold-knip-config.js';
3
- import { scaffoldJscpdConfig } from './scaffold-jscpd-config.js';
4
- import { scaffoldRuffConfig } from './scaffold-ruff-config.js';
5
- import { detectToolStates, toolsForLanguage } from './detect.js';
6
- import { installCommandsFor } from './install-commands.js';
7
- import { dryRunPath, noteScaffold } from './ctx.js';
8
- const SCAFFOLDERS = {
9
- eslint: (ctx) => scaffoldEslintConfig(ctx.cwd),
10
- knip: (ctx) => scaffoldKnipConfig(ctx.cwd),
11
- jscpd: (ctx) => scaffoldJscpdConfig(ctx.cwd, ctx.language),
12
- ruff: (ctx) => scaffoldRuffConfig(ctx.cwd),
13
- };
14
- const DEFAULT_FILENAMES = {
15
- eslint: 'eslint.config.js',
16
- knip: 'knip.json',
17
- jscpd: '.jscpd.json',
18
- ruff: 'ruff.toml',
19
- };
20
- const UNSCAFFOLDABLE_NOTES = {
21
- deptry: 'deptry has no config file; ensure pyproject.toml declares your dependencies\n',
22
- };
23
- const KNIP_STARTER_NOTE = 'knip.json written with starter entry points. Edit `entry` in knip.json to match your project.\n';
24
- function noteKnipStarter(ctx, result) {
25
- if (result.created)
26
- ctx.lines.out.push(KNIP_STARTER_NOTE);
27
- }
28
- function writeScaffold(ctx, tool, scaffolder) {
29
- const result = scaffolder(ctx);
30
- noteScaffold(ctx, result, `${tool} config`);
31
- if (tool === 'knip')
32
- noteKnipStarter(ctx, result);
33
- }
34
- function scaffoldFor(ctx, tool) {
35
- const scaffolder = SCAFFOLDERS[tool];
36
- const filename = DEFAULT_FILENAMES[tool];
37
- if (scaffolder === undefined || filename === undefined)
38
- return noteUnscaffoldable(ctx, tool);
39
- if (ctx.dryRun)
40
- return dryRunPath(ctx, filename, `${tool} config`);
41
- writeScaffold(ctx, tool, scaffolder);
42
- }
43
- function noteUnscaffoldable(ctx, tool) {
44
- const note = UNSCAFFOLDABLE_NOTES[tool];
45
- if (note !== undefined)
46
- ctx.lines.out.push(note);
47
- }
48
- function handleTool(ctx, tool, state) {
49
- if (state.installed && state.configured) {
50
- ctx.lines.out.push(`${tool} already installed and configured\n`);
51
- return;
52
- }
53
- if (state.configured)
54
- ctx.lines.out.push(`${tool} config already present (binary missing)\n`);
55
- else
56
- scaffoldFor(ctx, tool);
57
- }
58
- function collectMissingTools(tools, matrix) {
59
- return tools.filter((t) => !matrix[t].installed);
60
- }
61
- function printInstallCommands(ctx, missing) {
62
- const commands = installCommandsFor(ctx.cwd, missing);
63
- if (commands.length === 0)
64
- return;
65
- ctx.lines.out.push('\nTo install missing tools, run:\n');
66
- for (const command of commands)
67
- ctx.lines.out.push(` ${command}\n`);
68
- }
69
- export function runToolSteps(ctx) {
70
- const tools = toolsForLanguage(ctx.language);
71
- if (tools.length === 0)
72
- return;
73
- const matrix = detectToolStates(ctx.cwd);
74
- for (const tool of tools)
75
- handleTool(ctx, tool, matrix[tool]);
76
- printInstallCommands(ctx, collectMissingTools(tools, matrix));
77
- }
78
- //# sourceMappingURL=tool-steps.js.map