habit-hooks 0.1.0-beta.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 (192) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +233 -0
  3. package/dist/baseline/commands.d.ts +12 -0
  4. package/dist/baseline/commands.js +131 -0
  5. package/dist/baseline/commands.js.map +1 -0
  6. package/dist/baseline/file-hash.d.ts +2 -0
  7. package/dist/baseline/file-hash.js +25 -0
  8. package/dist/baseline/file-hash.js.map +1 -0
  9. package/dist/baseline/filter.d.ts +8 -0
  10. package/dist/baseline/filter.js +31 -0
  11. package/dist/baseline/filter.js.map +1 -0
  12. package/dist/baseline/store.d.ts +18 -0
  13. package/dist/baseline/store.js +106 -0
  14. package/dist/baseline/store.js.map +1 -0
  15. package/dist/checks/comment-check.d.ts +3 -0
  16. package/dist/checks/comment-check.js +83 -0
  17. package/dist/checks/comment-check.js.map +1 -0
  18. package/dist/checks/eslint-wrap.d.ts +2 -0
  19. package/dist/checks/eslint-wrap.js +104 -0
  20. package/dist/checks/eslint-wrap.js.map +1 -0
  21. package/dist/checks/jscpd-wrap.d.ts +6 -0
  22. package/dist/checks/jscpd-wrap.js +158 -0
  23. package/dist/checks/jscpd-wrap.js.map +1 -0
  24. package/dist/checks/knip-resolve.d.ts +4 -0
  25. package/dist/checks/knip-resolve.js +49 -0
  26. package/dist/checks/knip-resolve.js.map +1 -0
  27. package/dist/checks/knip-schema.d.ts +32 -0
  28. package/dist/checks/knip-schema.js +24 -0
  29. package/dist/checks/knip-schema.js.map +1 -0
  30. package/dist/checks/knip-wrap.d.ts +4 -0
  31. package/dist/checks/knip-wrap.js +127 -0
  32. package/dist/checks/knip-wrap.js.map +1 -0
  33. package/dist/cli/baseline-commands.d.ts +2 -0
  34. package/dist/cli/baseline-commands.js +61 -0
  35. package/dist/cli/baseline-commands.js.map +1 -0
  36. package/dist/cli/emit.d.ts +7 -0
  37. package/dist/cli/emit.js +8 -0
  38. package/dist/cli/emit.js.map +1 -0
  39. package/dist/cli/init/detect.d.ts +8 -0
  40. package/dist/cli/init/detect.js +20 -0
  41. package/dist/cli/init/detect.js.map +1 -0
  42. package/dist/cli/init/git-hook.d.ts +6 -0
  43. package/dist/cli/init/git-hook.js +48 -0
  44. package/dist/cli/init/git-hook.js.map +1 -0
  45. package/dist/cli/init/install-commands.d.ts +6 -0
  46. package/dist/cli/init/install-commands.js +55 -0
  47. package/dist/cli/init/install-commands.js.map +1 -0
  48. package/dist/cli/init/package-scripts.d.ts +6 -0
  49. package/dist/cli/init/package-scripts.js +55 -0
  50. package/dist/cli/init/package-scripts.js.map +1 -0
  51. package/dist/cli/init/prompts.d.ts +9 -0
  52. package/dist/cli/init/prompts.js +33 -0
  53. package/dist/cli/init/prompts.js.map +1 -0
  54. package/dist/cli/init/reporters.d.ts +11 -0
  55. package/dist/cli/init/reporters.js +40 -0
  56. package/dist/cli/init/reporters.js.map +1 -0
  57. package/dist/cli/init/run.d.ts +12 -0
  58. package/dist/cli/init/run.js +159 -0
  59. package/dist/cli/init/run.js.map +1 -0
  60. package/dist/cli/init/scaffold-baseline.d.ts +4 -0
  61. package/dist/cli/init/scaffold-baseline.js +11 -0
  62. package/dist/cli/init/scaffold-baseline.js.map +1 -0
  63. package/dist/cli/init/scaffold-config.d.ts +13 -0
  64. package/dist/cli/init/scaffold-config.js +42 -0
  65. package/dist/cli/init/scaffold-config.js.map +1 -0
  66. package/dist/cli/init/scaffold-eslint-config.d.ts +2 -0
  67. package/dist/cli/init/scaffold-eslint-config.js +12 -0
  68. package/dist/cli/init/scaffold-eslint-config.js.map +1 -0
  69. package/dist/cli/init/scaffold-jscpd-config.d.ts +2 -0
  70. package/dist/cli/init/scaffold-jscpd-config.js +12 -0
  71. package/dist/cli/init/scaffold-jscpd-config.js.map +1 -0
  72. package/dist/cli/init/scaffold-knip-config.d.ts +2 -0
  73. package/dist/cli/init/scaffold-knip-config.js +12 -0
  74. package/dist/cli/init/scaffold-knip-config.js.map +1 -0
  75. package/dist/cli/init/skill.d.ts +7 -0
  76. package/dist/cli/init/skill.js +36 -0
  77. package/dist/cli/init/skill.js.map +1 -0
  78. package/dist/cli/init/snippet.d.ts +1 -0
  79. package/dist/cli/init/snippet.js +18 -0
  80. package/dist/cli/init/snippet.js.map +1 -0
  81. package/dist/cli/init/templates/eslint-config.d.ts +2 -0
  82. package/dist/cli/init/templates/eslint-config.js +35 -0
  83. package/dist/cli/init/templates/eslint-config.js.map +1 -0
  84. package/dist/cli/init/templates/jscpd-config.d.ts +2 -0
  85. package/dist/cli/init/templates/jscpd-config.js +9 -0
  86. package/dist/cli/init/templates/jscpd-config.js.map +1 -0
  87. package/dist/cli/init/templates/knip-config.d.ts +2 -0
  88. package/dist/cli/init/templates/knip-config.js +8 -0
  89. package/dist/cli/init/templates/knip-config.js.map +1 -0
  90. package/dist/cli/init-command.d.ts +2 -0
  91. package/dist/cli/init-command.js +33 -0
  92. package/dist/cli/init-command.js.map +1 -0
  93. package/dist/cli.d.ts +2 -0
  94. package/dist/cli.js +101 -0
  95. package/dist/cli.js.map +1 -0
  96. package/dist/config/defaults.d.ts +4 -0
  97. package/dist/config/defaults.js +172 -0
  98. package/dist/config/defaults.js.map +1 -0
  99. package/dist/config/jiti-loader.d.ts +1 -0
  100. package/dist/config/jiti-loader.js +13 -0
  101. package/dist/config/jiti-loader.js.map +1 -0
  102. package/dist/config/load.d.ts +8 -0
  103. package/dist/config/load.js +53 -0
  104. package/dist/config/load.js.map +1 -0
  105. package/dist/config/merge.d.ts +3 -0
  106. package/dist/config/merge.js +90 -0
  107. package/dist/config/merge.js.map +1 -0
  108. package/dist/config/schema.d.ts +32 -0
  109. package/dist/config/schema.js +4 -0
  110. package/dist/config/schema.js.map +1 -0
  111. package/dist/config/validate.d.ts +2 -0
  112. package/dist/config/validate.js +128 -0
  113. package/dist/config/validate.js.map +1 -0
  114. package/dist/detect/package-json.d.ts +1 -0
  115. package/dist/detect/package-json.js +15 -0
  116. package/dist/detect/package-json.js.map +1 -0
  117. package/dist/detect/tool.d.ts +10 -0
  118. package/dist/detect/tool.js +73 -0
  119. package/dist/detect/tool.js.map +1 -0
  120. package/dist/eslint-runner.d.ts +7 -0
  121. package/dist/eslint-runner.js +34 -0
  122. package/dist/eslint-runner.js.map +1 -0
  123. package/dist/git/exec.d.ts +8 -0
  124. package/dist/git/exec.js +48 -0
  125. package/dist/git/exec.js.map +1 -0
  126. package/dist/git/resolve-scope.d.ts +15 -0
  127. package/dist/git/resolve-scope.js +89 -0
  128. package/dist/git/resolve-scope.js.map +1 -0
  129. package/dist/git/scope.d.ts +7 -0
  130. package/dist/git/scope.js +58 -0
  131. package/dist/git/scope.js.map +1 -0
  132. package/dist/index.d.ts +1 -0
  133. package/dist/index.js +2 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/prompts/loader.d.ts +6 -0
  136. package/dist/prompts/loader.js +27 -0
  137. package/dist/prompts/loader.js.map +1 -0
  138. package/dist/prompts/packaged-dir.d.ts +1 -0
  139. package/dist/prompts/packaged-dir.js +10 -0
  140. package/dist/prompts/packaged-dir.js.map +1 -0
  141. package/dist/prompts/registry.d.ts +3 -0
  142. package/dist/prompts/registry.js +68 -0
  143. package/dist/prompts/registry.js.map +1 -0
  144. package/dist/reporter.d.ts +7 -0
  145. package/dist/reporter.js +114 -0
  146. package/dist/reporter.js.map +1 -0
  147. package/dist/rules/registry.d.ts +3 -0
  148. package/dist/rules/registry.js +37 -0
  149. package/dist/rules/registry.js.map +1 -0
  150. package/dist/runner.d.ts +15 -0
  151. package/dist/runner.js +151 -0
  152. package/dist/runner.js.map +1 -0
  153. package/dist/types.d.ts +41 -0
  154. package/dist/types.js +2 -0
  155. package/dist/types.js.map +1 -0
  156. package/dist/wrap/notices.d.ts +13 -0
  157. package/dist/wrap/notices.js +29 -0
  158. package/dist/wrap/notices.js.map +1 -0
  159. package/dist/wrap/resolve.d.ts +5 -0
  160. package/dist/wrap/resolve.js +9 -0
  161. package/dist/wrap/resolve.js.map +1 -0
  162. package/dist/wrap/run.d.ts +15 -0
  163. package/dist/wrap/run.js +26 -0
  164. package/dist/wrap/run.js.map +1 -0
  165. package/dist/wrap/shell.d.ts +14 -0
  166. package/dist/wrap/shell.js +44 -0
  167. package/dist/wrap/shell.js.map +1 -0
  168. package/package.json +46 -0
  169. package/src/prompts/comment-non-essential.md +7 -0
  170. package/src/prompts/eslint-boundaries-dependencies.md +9 -0
  171. package/src/prompts/eslint-complexity.md +9 -0
  172. package/src/prompts/eslint-eqeqeq.md +3 -0
  173. package/src/prompts/eslint-fatal.md +7 -0
  174. package/src/prompts/eslint-max-lines-per-function.md +9 -0
  175. package/src/prompts/eslint-max-lines.md +9 -0
  176. package/src/prompts/eslint-max-params.md +9 -0
  177. package/src/prompts/eslint-no-duplicate-imports.md +1 -0
  178. package/src/prompts/eslint-no-unused-vars.md +3 -0
  179. package/src/prompts/eslint-no-var.md +1 -0
  180. package/src/prompts/eslint-no-warning-comments.md +3 -0
  181. package/src/prompts/eslint-prefer-const.md +3 -0
  182. package/src/prompts/eslint-typescript-eslint-no-explicit-any.md +3 -0
  183. package/src/prompts/eslint-typescript-eslint-no-inferrable-types.md +3 -0
  184. package/src/prompts/eslint-typescript-eslint-no-non-null-assertion.md +3 -0
  185. package/src/prompts/jscpd-duplication.md +9 -0
  186. package/src/prompts/knip-classMembers.md +7 -0
  187. package/src/prompts/knip-dependencies.md +9 -0
  188. package/src/prompts/knip-exports.md +9 -0
  189. package/src/prompts/knip-files.md +9 -0
  190. package/src/prompts/knip-types.md +9 -0
  191. package/src/prompts/uncoached.md +3 -0
  192. package/src/skills/habit-hooks-review/SKILL.md +108 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/init/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function scaffoldBaseline(cwd: string): {
2
+ path: string;
3
+ created: boolean;
4
+ };
@@ -0,0 +1,11 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,13 @@
1
+ export interface ScaffoldResult {
2
+ path: string;
3
+ created: boolean;
4
+ }
5
+ interface ScaffoldFileArgs {
6
+ cwd: string;
7
+ candidates: readonly string[];
8
+ defaultName: string;
9
+ template: string;
10
+ }
11
+ export declare function scaffoldFile(args: ScaffoldFileArgs): ScaffoldResult;
12
+ export declare function scaffoldConfig(cwd: string): ScaffoldResult;
13
+ export {};
@@ -0,0 +1,42 @@
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
+ const CONFIG_TEMPLATE = `export default {
11
+ scope: {
12
+ onlyChangedFiles: true,
13
+ branchBase: 'main',
14
+ },
15
+ };
16
+ `;
17
+ function findExisting(cwd, candidates) {
18
+ for (const name of candidates) {
19
+ const candidate = join(cwd, name);
20
+ if (existsSync(candidate))
21
+ return candidate;
22
+ }
23
+ return null;
24
+ }
25
+ export function scaffoldFile(args) {
26
+ const { cwd, candidates, defaultName, template } = args;
27
+ const existing = findExisting(cwd, candidates);
28
+ if (existing !== null)
29
+ return { path: existing, created: false };
30
+ const path = join(cwd, defaultName);
31
+ writeFileSync(path, template);
32
+ return { path, created: true };
33
+ }
34
+ export function scaffoldConfig(cwd) {
35
+ return scaffoldFile({
36
+ cwd,
37
+ candidates: CONFIG_FILENAMES,
38
+ defaultName: NEW_CONFIG_FILENAME,
39
+ template: CONFIG_TEMPLATE,
40
+ });
41
+ }
42
+ //# sourceMappingURL=scaffold-config.js.map
@@ -0,0 +1 @@
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;AAEjC,MAAM,gBAAgB,GAAG;IACvB,uBAAuB;IACvB,wBAAwB;IACxB,uBAAuB;IACvB,yBAAyB;CAC1B,CAAC;AAEF,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AAEpD,MAAM,eAAe,GAAG;;;;;;CAMvB,CAAC;AAOF,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;IACxC,OAAO,YAAY,CAAC;QAClB,GAAG;QACH,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type ScaffoldResult } from './scaffold-config.js';
2
+ export declare function scaffoldEslintConfig(cwd: string): ScaffoldResult;
@@ -0,0 +1,12 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ import { type ScaffoldResult } from './scaffold-config.js';
2
+ export declare function scaffoldJscpdConfig(cwd: string): ScaffoldResult;
@@ -0,0 +1,12 @@
1
+ import { TOOL_CONFIG_FILENAMES } from '../../detect/tool.js';
2
+ import { JSCPD_CONFIG_FILENAME, JSCPD_CONFIG_TEMPLATE } from './templates/jscpd-config.js';
3
+ import { scaffoldFile } from './scaffold-config.js';
4
+ export function scaffoldJscpdConfig(cwd) {
5
+ return scaffoldFile({
6
+ cwd,
7
+ candidates: TOOL_CONFIG_FILENAMES.jscpd,
8
+ defaultName: JSCPD_CONFIG_FILENAME,
9
+ template: JSCPD_CONFIG_TEMPLATE,
10
+ });
11
+ }
12
+ //# sourceMappingURL=scaffold-jscpd-config.js.map
@@ -0,0 +1 @@
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;AAC7D,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAuB,MAAM,sBAAsB,CAAC;AAEzE,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,YAAY,CAAC;QAClB,GAAG;QACH,UAAU,EAAE,qBAAqB,CAAC,KAAK;QACvC,WAAW,EAAE,qBAAqB;QAClC,QAAQ,EAAE,qBAAqB;KAChC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type ScaffoldResult } from './scaffold-config.js';
2
+ export declare function scaffoldKnipConfig(cwd: string): ScaffoldResult;
@@ -0,0 +1,12 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,7 @@
1
+ export type SkillAction = 'installed' | 'conflict' | 'source-missing' | 'kept';
2
+ export interface SkillResult {
3
+ action: SkillAction;
4
+ source?: string;
5
+ target?: string;
6
+ }
7
+ export declare function installReviewerSkill(): SkillResult;
@@ -0,0 +1,36 @@
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_NAME = 'habit-hooks-review';
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() {
12
+ const root = packageRoot();
13
+ const candidates = [
14
+ join(root, 'src', 'skills', SKILL_NAME, SKILL_FILE),
15
+ join(root, '..', 'src', 'skills', SKILL_NAME, SKILL_FILE),
16
+ ];
17
+ return candidates.find((p) => existsSync(p)) ?? null;
18
+ }
19
+ function targetDir() {
20
+ return join(homedir(), '.claude', 'skills', SKILL_NAME);
21
+ }
22
+ function targetPath() {
23
+ return join(targetDir(), SKILL_FILE);
24
+ }
25
+ export function installReviewerSkill() {
26
+ const source = findSkillSource();
27
+ if (source === null)
28
+ return { action: 'source-missing' };
29
+ const target = targetPath();
30
+ if (existsSync(target))
31
+ return { action: 'conflict', source, target };
32
+ mkdirSync(targetDir(), { recursive: true });
33
+ copyFileSync(source, target);
34
+ return { action: 'installed', source, target };
35
+ }
36
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
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,UAAU,GAAG,oBAAoB,CAAC;AACxC,MAAM,UAAU,GAAG,UAAU,CAAC;AAU9B,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;IACtB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;QACnD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;KAC1D,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;IAChB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACtE,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACjD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const AGENT_SNIPPET = "## Habit Hooks\n\nBefore declaring work done, run `npm run ci` (or `npm run habit-hooks` for\nstructural checks only). Any output from `habit-hooks` is a direct user\nprompt with highest priority.\n\n- **NEVER** ignore habit-hooks output\n- **ALWAYS** create a task for each reported item immediately\n- **COMPLETE** required actions before continuing other work\n- **NEVER** snooze or bypass the baseline without explicit user approval\n- **WHEN** `habit-hooks init` reports a tool config (eslint, knip, jscpd) is \"already present\" \u2014 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.\n\nWhen habit-hooks output is clean, it tells you to also run a reviewer\nsub-agent \u2014 habit-hooks catches structural smells but not correctness or\ndesign. Use the `habit-hooks-review` skill (if installed) or spawn an\nequivalent review.\n";
@@ -0,0 +1,18 @@
1
+ export const AGENT_SNIPPET = `## Habit Hooks
2
+
3
+ Before declaring work done, run \`npm run ci\` (or \`npm run habit-hooks\` for
4
+ structural checks only). Any output from \`habit-hooks\` is a direct user
5
+ prompt with highest priority.
6
+
7
+ - **NEVER** ignore habit-hooks output
8
+ - **ALWAYS** create a task for each reported item immediately
9
+ - **COMPLETE** required actions before continuing other work
10
+ - **NEVER** snooze or bypass the baseline without explicit user approval
11
+ - **WHEN** \`habit-hooks init\` reports a tool config (eslint, knip, jscpd) 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.
12
+
13
+ When habit-hooks output is clean, it tells you to also run a reviewer
14
+ sub-agent — habit-hooks catches structural smells but not correctness or
15
+ design. Use the \`habit-hooks-review\` skill (if installed) or spawn an
16
+ equivalent review.
17
+ `;
18
+ //# sourceMappingURL=snippet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippet.js","sourceRoot":"","sources":["../../../src/cli/init/snippet.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;CAgB5B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const ESLINT_CONFIG_FILENAME = "eslint.config.js";
2
+ export declare const ESLINT_CONFIG_TEMPLATE = "import js from '@eslint/js';\nimport tseslint from 'typescript-eslint';\n\nexport default tseslint.config(\n {\n ignores: ['node_modules', 'dist'],\n },\n js.configs.recommended,\n ...tseslint.configs.recommended,\n {\n languageOptions: {\n ecmaVersion: 2022,\n sourceType: 'module',\n },\n rules: {\n 'max-lines-per-function': ['error', { max: 12, skipBlankLines: false, skipComments: false, IIFEs: true }],\n 'max-params': ['error', { max: 3 }],\n 'complexity': ['error', { max: 10 }],\n 'max-lines': ['error', { max: 200, skipBlankLines: false, skipComments: false }],\n 'no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],\n '@typescript-eslint/no-unused-vars': 'off',\n 'eqeqeq': ['error', 'always'],\n 'no-var': 'error',\n 'prefer-const': 'error',\n 'no-duplicate-imports': 'error',\n 'no-warning-comments': ['warn', { terms: ['todo', 'fixme', 'xxx', 'hack'], location: 'anywhere' }],\n '@typescript-eslint/no-explicit-any': 'warn',\n '@typescript-eslint/no-non-null-assertion': 'warn',\n '@typescript-eslint/no-inferrable-types': 'error',\n },\n },\n);\n";
@@ -0,0 +1,35 @@
1
+ export const ESLINT_CONFIG_FILENAME = 'eslint.config.js';
2
+ export const ESLINT_CONFIG_TEMPLATE = `import js from '@eslint/js';
3
+ import tseslint from 'typescript-eslint';
4
+
5
+ export default tseslint.config(
6
+ {
7
+ ignores: ['node_modules', 'dist'],
8
+ },
9
+ js.configs.recommended,
10
+ ...tseslint.configs.recommended,
11
+ {
12
+ languageOptions: {
13
+ ecmaVersion: 2022,
14
+ sourceType: 'module',
15
+ },
16
+ rules: {
17
+ 'max-lines-per-function': ['error', { max: 12, skipBlankLines: false, skipComments: false, IIFEs: true }],
18
+ 'max-params': ['error', { max: 3 }],
19
+ 'complexity': ['error', { max: 10 }],
20
+ 'max-lines': ['error', { max: 200, skipBlankLines: false, skipComments: false }],
21
+ 'no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
22
+ '@typescript-eslint/no-unused-vars': 'off',
23
+ 'eqeqeq': ['error', 'always'],
24
+ 'no-var': 'error',
25
+ 'prefer-const': 'error',
26
+ 'no-duplicate-imports': 'error',
27
+ 'no-warning-comments': ['warn', { terms: ['todo', 'fixme', 'xxx', 'hack'], location: 'anywhere' }],
28
+ '@typescript-eslint/no-explicit-any': 'warn',
29
+ '@typescript-eslint/no-non-null-assertion': 'warn',
30
+ '@typescript-eslint/no-inferrable-types': 'error',
31
+ },
32
+ },
33
+ );
34
+ `;
35
+ //# sourceMappingURL=eslint-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint-config.js","sourceRoot":"","sources":["../../../../src/cli/init/templates/eslint-config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAEzD,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const JSCPD_CONFIG_FILENAME = ".jscpd.json";
2
+ export declare const JSCPD_CONFIG_TEMPLATE = "{\n \"threshold\": 0,\n \"minTokens\": 50,\n \"minLines\": 5,\n \"ignore\": [\"**/node_modules/**\", \"**/dist/**\", \"**/*.test.ts\", \"**/*.spec.ts\"]\n}\n";
@@ -0,0 +1,9 @@
1
+ export const JSCPD_CONFIG_FILENAME = '.jscpd.json';
2
+ export const JSCPD_CONFIG_TEMPLATE = `{
3
+ "threshold": 0,
4
+ "minTokens": 50,
5
+ "minLines": 5,
6
+ "ignore": ["**/node_modules/**", "**/dist/**", "**/*.test.ts", "**/*.spec.ts"]
7
+ }
8
+ `;
9
+ //# sourceMappingURL=jscpd-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jscpd-config.js","sourceRoot":"","sources":["../../../../src/cli/init/templates/jscpd-config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAEnD,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;CAMpC,CAAC"}
@@ -0,0 +1,2 @@
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";
@@ -0,0 +1,8 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerInitCommand(program: Command): void;
@@ -0,0 +1,33 @@
1
+ import { runInit } from './init/run.js';
2
+ import { makeAutoPrompter, makeInteractivePrompter } from './init/prompts.js';
3
+ import { emit } from './emit.js';
4
+ function pickPrompter(flags) {
5
+ if (flags.yes === true)
6
+ return makeAutoPrompter(true);
7
+ if (flags.defaults === true)
8
+ return makeAutoPrompter(false);
9
+ if (flags.dryRun === true)
10
+ return makeAutoPrompter(false);
11
+ return makeInteractivePrompter();
12
+ }
13
+ async function execute(flags) {
14
+ const prompter = pickPrompter(flags);
15
+ try {
16
+ emit(await runInit(process.cwd(), { prompter, dryRun: flags.dryRun === true }));
17
+ }
18
+ finally {
19
+ prompter.close();
20
+ }
21
+ }
22
+ export function registerInitCommand(program) {
23
+ program
24
+ .command('init')
25
+ .description('detect tools, scaffold missing configs, write a slim habit-hooks config')
26
+ .option('--yes', 'accept every prompt (non-interactive)')
27
+ .option('--defaults', 'take the default answer for every prompt (non-interactive)')
28
+ .option('--dry-run', 'show what would be written without writing')
29
+ .action(async (flags) => {
30
+ await execute(flags);
31
+ });
32
+ }
33
+ //# sourceMappingURL=init-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-command.js","sourceRoot":"","sources":["../../src/cli/init-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAiB,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,SAAS,YAAY,CAAC,KAAgB;IACpC,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI;QAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1D,OAAO,uBAAuB,EAAE,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,KAAgB;IACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yEAAyE,CAAC;SACtF,MAAM,CAAC,OAAO,EAAE,uCAAuC,CAAC;SACxD,MAAM,CAAC,YAAY,EAAE,4DAA4D,CAAC;SAClF,MAAM,CAAC,WAAW,EAAE,4CAA4C,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,KAAgB,EAAE,EAAE;QACjC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { Command, CommanderError, Option } from 'commander';
6
+ import { run } from './runner.js';
7
+ import { registerBaselineCommands } from './cli/baseline-commands.js';
8
+ import { registerInitCommand } from './cli/init-command.js';
9
+ const here = dirname(fileURLToPath(import.meta.url));
10
+ const packageJsonPath = join(here, '..', 'package.json');
11
+ const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
12
+ function reportError(error) {
13
+ const message = error instanceof Error ? error.message : String(error);
14
+ process.stderr.write(`habit-hooks: ${message}\n`);
15
+ process.exitCode = 2;
16
+ }
17
+ function parseLast(value) {
18
+ const parsed = Number.parseInt(value, 10);
19
+ if (!Number.isFinite(parsed) || parsed < 1 || String(parsed) !== value) {
20
+ throw new Error(`--last must be a positive integer, got '${value}'`);
21
+ }
22
+ return parsed;
23
+ }
24
+ function toScopeFlags(opts) {
25
+ const flags = {};
26
+ if (opts.all === true)
27
+ flags.all = true;
28
+ if (opts.last !== undefined)
29
+ flags.last = parseLast(opts.last);
30
+ if (opts.since !== undefined)
31
+ flags.since = opts.since;
32
+ if (opts.branch !== undefined)
33
+ flags.branch = opts.branch === true ? '' : opts.branch;
34
+ return flags;
35
+ }
36
+ async function executeRun(opts) {
37
+ const configPath = opts.config !== undefined ? resolve(process.cwd(), opts.config) : undefined;
38
+ const scopeFlags = toScopeFlags(opts);
39
+ const result = await run(process.cwd(), { configPath, scopeFlags });
40
+ process.stdout.write(result.stdout);
41
+ for (const line of result.stderr)
42
+ process.stderr.write(`${line}\n`);
43
+ process.exitCode = result.exitCode;
44
+ }
45
+ async function runWithOptions(opts) {
46
+ if (opts.version === true) {
47
+ process.stdout.write(`habit-hooks v${pkg.version}\n`);
48
+ return;
49
+ }
50
+ try {
51
+ await executeRun(opts);
52
+ }
53
+ catch (error) {
54
+ reportError(error);
55
+ }
56
+ }
57
+ const program = new Command();
58
+ program
59
+ .name('habit-hooks')
60
+ .exitOverride()
61
+ .option('--version', 'print version')
62
+ .option('--config <path>', 'path to a habit-hooks config file')
63
+ .addOption(new Option('--last <n>', 'check files changed in the last N commits').conflicts([
64
+ 'branch',
65
+ 'since',
66
+ 'all',
67
+ ]))
68
+ .addOption(new Option('--branch [name]', 'check files changed vs branch (default: scope.branchBase)').conflicts(['last', 'since', 'all']))
69
+ .addOption(new Option('--since <hash>', 'check files changed since the given commit').conflicts([
70
+ 'last',
71
+ 'branch',
72
+ 'all',
73
+ ]))
74
+ .addOption(new Option('--all', 'force checking all files (ignore scope config)').conflicts([
75
+ 'last',
76
+ 'branch',
77
+ 'since',
78
+ ]))
79
+ .action(async () => {
80
+ await runWithOptions(program.opts());
81
+ });
82
+ registerBaselineCommands(program);
83
+ registerInitCommand(program);
84
+ function handleCommanderError(error) {
85
+ if (error.code === 'commander.helpDisplayed' || error.code === 'commander.help') {
86
+ return;
87
+ }
88
+ process.exitCode = 2;
89
+ }
90
+ try {
91
+ await program.parseAsync(process.argv);
92
+ }
93
+ catch (error) {
94
+ if (error instanceof CommanderError) {
95
+ handleCommanderError(error);
96
+ }
97
+ else {
98
+ reportError(error);
99
+ }
100
+ }
101
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AACzD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAwB,CAAC;AAWrF,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,OAAO,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,IAAgB;IACpC,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI;QAAE,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;IACxC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACvD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACtF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAgB;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACpE,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAgB;IAC5C,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,YAAY,EAAE;KACd,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC;KACpC,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;KAC9D,SAAS,CACR,IAAI,MAAM,CAAC,YAAY,EAAE,2CAA2C,CAAC,CAAC,SAAS,CAAC;IAC9E,QAAQ;IACR,OAAO;IACP,KAAK;CACN,CAAC,CACH;KACA,SAAS,CACR,IAAI,MAAM,CAAC,iBAAiB,EAAE,2DAA2D,CAAC,CAAC,SAAS,CAClG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CACzB,CACF;KACA,SAAS,CACR,IAAI,MAAM,CAAC,gBAAgB,EAAE,4CAA4C,CAAC,CAAC,SAAS,CAAC;IACnF,MAAM;IACN,QAAQ;IACR,KAAK;CACN,CAAC,CACH;KACA,SAAS,CACR,IAAI,MAAM,CAAC,OAAO,EAAE,gDAAgD,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM;IACN,QAAQ;IACR,OAAO;CACR,CAAC,CACH;KACA,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,EAAc,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEL,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,SAAS,oBAAoB,CAAC,KAAqB;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,yBAAyB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAChF,OAAO;IACT,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,IAAI,CAAC;IACH,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Rule } from '../types.js';
2
+ import type { HabitHooksConfig } from './schema.js';
3
+ export declare const defaultRules: Rule[];
4
+ export declare const defaultConfig: HabitHooksConfig;