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,41 +0,0 @@
1
- import type { RuleSource, Severity } from '../types.js';
2
- export interface RuleOverride {
3
- severity?: Severity;
4
- changedFilesOnly?: boolean;
5
- title?: string;
6
- description?: string;
7
- disabled?: boolean;
8
- include?: string[];
9
- exclude?: string[];
10
- fix?: string;
11
- }
12
- export interface RuleDefinition extends RuleOverride {
13
- id: string;
14
- source: RuleSource;
15
- sourceRuleId?: string;
16
- }
17
- export interface ScopeConfig {
18
- onlyChangedFiles?: boolean;
19
- autoBranchOffMain?: boolean;
20
- branchBase?: string;
21
- mainBranch?: string;
22
- exclude?: string[];
23
- }
24
- export interface CommentCheckConfig {
25
- maxSingleLineChars?: number;
26
- maxBlockChars?: number;
27
- }
28
- export interface NeedsExtractionConfig {
29
- replace?: boolean;
30
- }
31
- export type Language = 'typescript' | 'python';
32
- export interface HabitHooksConfig {
33
- prompts?: string;
34
- language?: Language;
35
- smells?: Record<string, RuleOverride | RuleDefinition>;
36
- rules?: Record<string, RuleOverride | RuleDefinition>;
37
- scope?: ScopeConfig;
38
- commentCheck?: CommentCheckConfig;
39
- needsExtraction?: NeedsExtractionConfig;
40
- }
41
- export declare function isRuleDefinition(entry: RuleOverride | RuleDefinition): entry is RuleDefinition;
@@ -1,4 +0,0 @@
1
- export function isRuleDefinition(entry) {
2
- return 'source' in entry && typeof entry.source === 'string';
3
- }
4
- //# sourceMappingURL=schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAsDA,MAAM,UAAU,gBAAgB,CAC9B,KAAoC;IAEpC,OAAO,QAAQ,IAAI,KAAK,IAAI,OAAQ,KAAwB,CAAC,MAAM,KAAK,QAAQ,CAAC;AACnF,CAAC"}
@@ -1,14 +0,0 @@
1
- import type { RuleSource } from '../types.js';
2
- import type { AdapterSpec, DeclarativeSensorSpec } from '../sensors/adapter.js';
3
- export declare function singleSmellFor(source: RuleSource): string;
4
- export declare function catalogueSmell(id: string): string;
5
- export declare const PARSE_ERROR_SMELL = "parse-error";
6
- export declare const ESLINT_SMELL_MAP: Record<string, string>;
7
- export declare const ESLINT_PRODUCES: string[];
8
- export declare const JSCPD_SMELL: string;
9
- export declare const COMMENT_SMELL: string;
10
- export declare const KNIP_SMELL_MAP: Record<string, string>;
11
- export declare const KNIP_PRODUCES: string[];
12
- export declare const RUFF_SPEC: DeclarativeSensorSpec;
13
- export declare const DEPTRY_SPEC: AdapterSpec;
14
- export declare const DEPTRY_PRODUCES: string[];
@@ -1,69 +0,0 @@
1
- import { defaultRules } from './catalogue.js';
2
- // The single home for tool/smell knowledge (issue #24): the sensor and check
3
- // layers receive these from config and never hardcode a smell id. eslint/jscpd
4
- // data is derived from the catalogue, so adding a smell there auto-wires it.
5
- function rulesFor(source) {
6
- return defaultRules.filter((rule) => rule.source === source);
7
- }
8
- function smellsFor(source) {
9
- return rulesFor(source).map((rule) => rule.id);
10
- }
11
- export function singleSmellFor(source) {
12
- const smells = smellsFor(source);
13
- if (smells.length !== 1)
14
- throw new Error(`tool-smells: expected exactly one '${source}' smell, found ${smells.length}`);
15
- return smells[0];
16
- }
17
- export function catalogueSmell(id) {
18
- const matches = defaultRules.filter((rule) => rule.id === id);
19
- if (matches.length !== 1)
20
- throw new Error(`tool-smells: expected exactly one catalogue rule for '${id}', found ${matches.length}`);
21
- return matches[0].id;
22
- }
23
- function rawToSmell(source) {
24
- const map = {};
25
- for (const rule of rulesFor(source)) {
26
- if (rule.sourceRuleId !== undefined)
27
- map[rule.sourceRuleId] = rule.id;
28
- }
29
- return map;
30
- }
31
- // `parse-error` is a supplemental smell (eslint fatal) with no catalogue rule.
32
- export const PARSE_ERROR_SMELL = 'parse-error';
33
- export const ESLINT_SMELL_MAP = rawToSmell('eslint');
34
- export const ESLINT_PRODUCES = [...smellsFor('eslint'), PARSE_ERROR_SMELL];
35
- export const JSCPD_SMELL = singleSmellFor('jscpd');
36
- export const COMMENT_SMELL = catalogueSmell('non-essential-comment');
37
- // knip's raw issue types are tool-specific, not catalogue rule ids, so the
38
- // translation lives here in config.
39
- export const KNIP_SMELL_MAP = {
40
- classMembers: 'unused-class-member',
41
- files: 'unused-file',
42
- exports: 'unused-export',
43
- dependencies: 'unused-dependency',
44
- };
45
- export const KNIP_PRODUCES = Object.values(KNIP_SMELL_MAP);
46
- // Python tool specs (the generalized AdapterSpec model): ruff + deptry.
47
- export const RUFF_SPEC = {
48
- id: 'ruff',
49
- produces: ['high-complexity', 'too-many-parameters', 'oversized-function', 'unused-variable', 'unused-import'],
50
- command: 'ruff check --output-format=json --select=C901,PLR0913,PLR0915,F841,F401 ${files}',
51
- items: '[]',
52
- fields: { smell: 'code', file: 'filename', line: 'location.row', column: 'location.column', message: 'message' },
53
- map: {
54
- C901: 'high-complexity',
55
- PLR0913: 'too-many-parameters',
56
- PLR0915: 'oversized-function',
57
- F841: 'unused-variable',
58
- F401: 'unused-import',
59
- },
60
- };
61
- export const DEPTRY_SPEC = {
62
- id: 'deptry',
63
- command: 'deptry . --json-output <report>',
64
- items: '[]',
65
- fields: { smell: 'error.code', file: 'location.file', line: 'location.line', message: 'error.message' },
66
- map: { DEP002: 'unused-dependency' },
67
- };
68
- export const DEPTRY_PRODUCES = Object.values(DEPTRY_SPEC.map ?? {});
69
- //# sourceMappingURL=tool-smells.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-smells.js","sourceRoot":"","sources":["../../src/config/tool-smells.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { HabitHooksConfig } from './schema.js';
2
- export declare function validateConfig(value: unknown): HabitHooksConfig;
@@ -1,159 +0,0 @@
1
- const SEVERITIES = ['enforced', 'suggested'];
2
- const SOURCES = ['eslint', 'jscpd', 'knip', 'custom'];
3
- const LANGUAGES = ['typescript', 'python'];
4
- function isPlainObject(value) {
5
- return typeof value === 'object' && value !== null && !Array.isArray(value);
6
- }
7
- function isStringArray(value) {
8
- return Array.isArray(value) && value.every((entry) => typeof entry === 'string');
9
- }
10
- function fail(path, expected) {
11
- throw new Error(`Invalid habit-hooks config: ${path} must be ${expected}`);
12
- }
13
- function validateOptionalString(value, path) {
14
- if (value === undefined)
15
- return;
16
- if (typeof value !== 'string')
17
- fail(path, 'a string');
18
- }
19
- function validateOptionalBoolean(value, path) {
20
- if (value === undefined)
21
- return;
22
- if (typeof value !== 'boolean')
23
- fail(path, 'a boolean');
24
- }
25
- function validateOptionalStringArray(value, path) {
26
- if (value === undefined)
27
- return;
28
- if (!isStringArray(value))
29
- fail(path, 'an array of strings');
30
- }
31
- function validateSeverity(value, path) {
32
- if (value === undefined)
33
- return;
34
- if (typeof value !== 'string' || !SEVERITIES.includes(value)) {
35
- fail(path, `'enforced' or 'suggested'`);
36
- }
37
- }
38
- function validateSource(value, path) {
39
- if (typeof value !== 'string' || !SOURCES.includes(value)) {
40
- fail(path, `one of 'eslint', 'jscpd', 'knip', 'custom'`);
41
- }
42
- }
43
- function validateRuleOverrideFields(entry, base) {
44
- validateSeverity(entry.severity, `${base}.severity`);
45
- validateOptionalBoolean(entry.changedFilesOnly, `${base}.changedFilesOnly`);
46
- validateOptionalString(entry.title, `${base}.title`);
47
- validateOptionalString(entry.description, `${base}.description`);
48
- validateOptionalBoolean(entry.disabled, `${base}.disabled`);
49
- validateOptionalStringArray(entry.include, `${base}.include`);
50
- validateOptionalStringArray(entry.exclude, `${base}.exclude`);
51
- validateOptionalString(entry.fix, `${base}.fix`);
52
- }
53
- function validateRuleDefinitionFields(entry, base) {
54
- if (typeof entry.id !== 'string')
55
- fail(`${base}.id`, 'a string');
56
- validateSource(entry.source, `${base}.source`);
57
- validateOptionalString(entry.sourceRuleId, `${base}.sourceRuleId`);
58
- }
59
- function validateRuleEntry(value, base) {
60
- if (!isPlainObject(value))
61
- fail(base, 'an object');
62
- const entry = value;
63
- validateRuleOverrideFields(entry, base);
64
- if ('source' in entry) {
65
- validateRuleDefinitionFields(entry, base);
66
- }
67
- return entry;
68
- }
69
- function validateEntryMap(value, field) {
70
- if (value === undefined)
71
- return undefined;
72
- if (!isPlainObject(value))
73
- fail(field, 'an object keyed by smell key');
74
- const result = {};
75
- for (const [key, entry] of Object.entries(value)) {
76
- result[key] = validateRuleEntry(entry, `${field}.${key}`);
77
- }
78
- return result;
79
- }
80
- function validateScope(value) {
81
- if (value === undefined)
82
- return undefined;
83
- if (!isPlainObject(value))
84
- fail('scope', 'an object');
85
- validateOptionalBoolean(value.onlyChangedFiles, 'scope.onlyChangedFiles');
86
- validateOptionalBoolean(value.autoBranchOffMain, 'scope.autoBranchOffMain');
87
- validateOptionalString(value.branchBase, 'scope.branchBase');
88
- validateOptionalString(value.mainBranch, 'scope.mainBranch');
89
- validateOptionalStringArray(value.exclude, 'scope.exclude');
90
- return value;
91
- }
92
- function validatePositiveInteger(value, path) {
93
- if (value === undefined)
94
- return;
95
- if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0) {
96
- fail(path, 'a positive integer');
97
- }
98
- }
99
- function validateCommentCheck(value) {
100
- if (value === undefined)
101
- return undefined;
102
- if (!isPlainObject(value))
103
- fail('commentCheck', 'an object');
104
- validatePositiveInteger(value.maxSingleLineChars, 'commentCheck.maxSingleLineChars');
105
- validatePositiveInteger(value.maxBlockChars, 'commentCheck.maxBlockChars');
106
- return value;
107
- }
108
- function validateLanguage(value) {
109
- if (value === undefined)
110
- return undefined;
111
- if (typeof value !== 'string' || !LANGUAGES.includes(value)) {
112
- fail('language', `one of 'typescript', 'python'`);
113
- }
114
- return value;
115
- }
116
- function validateNeedsExtraction(value) {
117
- if (value === undefined)
118
- return undefined;
119
- if (!isPlainObject(value))
120
- fail('needsExtraction', 'an object');
121
- validateOptionalBoolean(value.replace, 'needsExtraction.replace');
122
- return value;
123
- }
124
- function assembleConfig(parts) {
125
- const config = {};
126
- if (parts.prompts !== undefined)
127
- config.prompts = parts.prompts;
128
- if (parts.language !== undefined)
129
- config.language = parts.language;
130
- if (parts.smells !== undefined)
131
- config.smells = parts.smells;
132
- if (parts.rules !== undefined)
133
- config.rules = parts.rules;
134
- if (parts.scope !== undefined)
135
- config.scope = parts.scope;
136
- if (parts.commentCheck !== undefined)
137
- config.commentCheck = parts.commentCheck;
138
- if (parts.needsExtraction !== undefined)
139
- config.needsExtraction = parts.needsExtraction;
140
- return config;
141
- }
142
- function validateParts(value) {
143
- return {
144
- prompts: typeof value.prompts === 'string' ? value.prompts : undefined,
145
- language: validateLanguage(value.language),
146
- smells: validateEntryMap(value.smells, 'smells'),
147
- rules: validateEntryMap(value.rules, 'rules'),
148
- scope: validateScope(value.scope),
149
- commentCheck: validateCommentCheck(value.commentCheck),
150
- needsExtraction: validateNeedsExtraction(value.needsExtraction),
151
- };
152
- }
153
- export function validateConfig(value) {
154
- if (!isPlainObject(value))
155
- fail('config', 'an object');
156
- validateOptionalString(value.prompts, 'prompts');
157
- return assembleConfig(validateParts(value));
158
- }
159
- //# sourceMappingURL=validate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/config/validate.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export declare function hasPackageJsonKey(cwd: string, key: string): boolean;
@@ -1,15 +0,0 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- export function hasPackageJsonKey(cwd, key) {
4
- const path = join(cwd, 'package.json');
5
- if (!existsSync(path))
6
- return false;
7
- try {
8
- const pkg = JSON.parse(readFileSync(path, 'utf8'));
9
- return pkg[key] !== undefined;
10
- }
11
- catch {
12
- return false;
13
- }
14
- }
15
- //# sourceMappingURL=package-json.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/detect/package-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,GAAW;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,CAAC;QAC9E,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -1 +0,0 @@
1
- export declare function isOnPath(name: string): boolean;
@@ -1,14 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { delimiter, join } from 'node:path';
3
- const WINDOWS_EXTENSIONS = ['.exe', '.cmd'];
4
- function candidateNames(name) {
5
- return [name, ...WINDOWS_EXTENSIONS.map((ext) => `${name}${ext}`)];
6
- }
7
- function existsInDir(dir, name) {
8
- return candidateNames(name).some((candidate) => existsSync(join(dir, candidate)));
9
- }
10
- export function isOnPath(name) {
11
- const dirs = (process.env.PATH ?? '').split(delimiter).filter((dir) => dir.length > 0);
12
- return dirs.some((dir) => existsInDir(dir, name));
13
- }
14
- //# sourceMappingURL=path.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/detect/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,CAAC,IAAI,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,IAAY;IAC5C,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvF,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -1,10 +0,0 @@
1
- export type ToolName = 'eslint' | 'knip' | 'jscpd' | 'ruff' | 'deptry';
2
- interface ToolDetection {
3
- available: true;
4
- binPath: string;
5
- configPath: string | null;
6
- }
7
- export declare const TOOL_CONFIG_FILENAMES: Record<ToolName, readonly string[]>;
8
- export declare const TOOL_PACKAGE_JSON_KEYS: Partial<Record<ToolName, string>>;
9
- export declare function detectTool(cwd: string, name: string): ToolDetection | null;
10
- export {};
@@ -1,75 +0,0 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- export const TOOL_CONFIG_FILENAMES = {
4
- eslint: ['eslint.config.js', 'eslint.config.mjs', 'eslint.config.ts', 'eslint.config.cjs'],
5
- knip: ['knip.json', 'knip.jsonc', 'knip.ts'],
6
- jscpd: ['.jscpd.json', 'jscpd.json'],
7
- ruff: ['ruff.toml', '.ruff.toml'],
8
- deptry: [],
9
- };
10
- export const TOOL_PACKAGE_JSON_KEYS = {
11
- eslint: 'eslintConfig',
12
- knip: 'knip',
13
- jscpd: 'jscpd',
14
- };
15
- function readJson(path) {
16
- if (!existsSync(path))
17
- return null;
18
- try {
19
- return JSON.parse(readFileSync(path, 'utf8'));
20
- }
21
- catch {
22
- return null;
23
- }
24
- }
25
- function resolveBinFromPackageJson(packageDir, name) {
26
- const pkg = readJson(join(packageDir, 'package.json'));
27
- if (pkg === null)
28
- return null;
29
- const bin = pkg.bin;
30
- if (typeof bin === 'string')
31
- return join(packageDir, bin);
32
- if (bin !== null && typeof bin === 'object' && !Array.isArray(bin)) {
33
- const entry = bin[name];
34
- if (typeof entry === 'string')
35
- return join(packageDir, entry);
36
- }
37
- return null;
38
- }
39
- function findBinPath(cwd, name) {
40
- const packageDir = join(cwd, 'node_modules', name);
41
- const fromPkg = resolveBinFromPackageJson(packageDir, name);
42
- if (fromPkg !== null && existsSync(fromPkg))
43
- return fromPkg;
44
- const fromBin = join(cwd, 'node_modules', '.bin', name);
45
- if (existsSync(fromBin))
46
- return fromBin;
47
- return null;
48
- }
49
- function filenamesFor(name) {
50
- return TOOL_CONFIG_FILENAMES[name] ?? [];
51
- }
52
- function packageJsonKeyFor(name) {
53
- return TOOL_PACKAGE_JSON_KEYS[name];
54
- }
55
- function findConfigFile(cwd, name) {
56
- for (const filename of filenamesFor(name)) {
57
- const candidate = join(cwd, filename);
58
- if (existsSync(candidate))
59
- return candidate;
60
- }
61
- const packageJsonPath = join(cwd, 'package.json');
62
- const pkg = readJson(packageJsonPath);
63
- const key = packageJsonKeyFor(name);
64
- if (pkg !== null && key !== undefined && pkg[key] !== undefined)
65
- return packageJsonPath;
66
- return null;
67
- }
68
- export function detectTool(cwd, name) {
69
- const binPath = findBinPath(cwd, name);
70
- if (binPath === null)
71
- return null;
72
- const configPath = findConfigFile(cwd, name);
73
- return { available: true, binPath, configPath };
74
- }
75
- //# sourceMappingURL=tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/detect/tool.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { Language } from './config/schema.js';
2
- export declare function discoverFiles(cwd: string, language: Language, exclude?: string[]): Promise<string[]>;
package/dist/discover.js DELETED
@@ -1,14 +0,0 @@
1
- import fg from 'fast-glob';
2
- const FILE_GLOBS = {
3
- typescript: ['**/*.{ts,tsx,js,mjs,cjs}'],
4
- python: ['**/*.py'],
5
- };
6
- export async function discoverFiles(cwd, language, exclude = []) {
7
- return fg(FILE_GLOBS[language], {
8
- cwd,
9
- absolute: true,
10
- ignore: ['**/node_modules/**', '**/dist/**', '**/coverage/**', ...exclude],
11
- dot: false,
12
- });
13
- }
14
- //# sourceMappingURL=discover.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAG3B,MAAM,UAAU,GAA+B;IAC7C,UAAU,EAAE,CAAC,0BAA0B,CAAC;IACxC,MAAM,EAAE,CAAC,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,QAAkB,EAClB,UAAoB,EAAE;IAEtB,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC9B,GAAG;QACH,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;QAC1E,GAAG,EAAE,KAAK;KACX,CAAC,CAAC;AACL,CAAC"}
@@ -1,8 +0,0 @@
1
- export declare class GitError extends Error {
2
- readonly command: string;
3
- readonly stderr: string;
4
- readonly cause?: unknown | undefined;
5
- constructor(command: string, stderr: string, cause?: unknown | undefined);
6
- }
7
- export declare function gitExec(args: string[], cwd: string): string;
8
- export declare function isGitRepo(cwd: string): boolean;
package/dist/git/exec.js DELETED
@@ -1,48 +0,0 @@
1
- import { execFileSync } from 'node:child_process';
2
- export class GitError extends Error {
3
- command;
4
- stderr;
5
- cause;
6
- constructor(command, stderr, cause) {
7
- super(`git ${command} failed: ${stderr.trim() || (cause instanceof Error ? cause.message : '')}`);
8
- this.command = command;
9
- this.stderr = stderr;
10
- this.cause = cause;
11
- this.name = 'GitError';
12
- }
13
- }
14
- function readStderr(err) {
15
- if (err && typeof err === 'object' && 'stderr' in err) {
16
- const stderr = err.stderr;
17
- if (typeof stderr === 'string')
18
- return stderr;
19
- if (stderr instanceof Buffer)
20
- return stderr.toString('utf8');
21
- }
22
- return '';
23
- }
24
- export function gitExec(args, cwd) {
25
- try {
26
- return execFileSync('git', args, {
27
- cwd,
28
- encoding: 'utf8',
29
- stdio: ['ignore', 'pipe', 'pipe'],
30
- });
31
- }
32
- catch (err) {
33
- throw new GitError(args.join(' '), readStderr(err), err);
34
- }
35
- }
36
- export function isGitRepo(cwd) {
37
- try {
38
- execFileSync('git', ['rev-parse', '--is-inside-work-tree'], {
39
- cwd,
40
- stdio: ['ignore', 'ignore', 'ignore'],
41
- });
42
- return true;
43
- }
44
- catch {
45
- return false;
46
- }
47
- }
48
- //# sourceMappingURL=exec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/git/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEf;IACA;IACA;IAHlB,YACkB,OAAe,EACf,MAAc,EACd,KAAe;QAE/B,KAAK,CAAC,OAAO,OAAO,YAAY,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAJlF,YAAO,GAAP,OAAO,CAAQ;QACf,WAAM,GAAN,MAAM,CAAQ;QACd,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,SAAS,UAAU,CAAC,GAAY;IAC9B,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;QACtD,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,CAAC;QACnD,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QAC9C,IAAI,MAAM,YAAY,MAAM;YAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAc,EAAE,GAAW;IACjD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;YAC/B,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE;YAC1D,GAAG;YACH,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;SACtC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -1,15 +0,0 @@
1
- import type { ScopeConfig } from '../config/schema.js';
2
- export type ScopeMode = 'uncommitted' | 'last' | 'branch' | 'since' | 'all';
3
- export interface ScopeFlags {
4
- last?: number;
5
- branch?: string;
6
- since?: string;
7
- all?: boolean;
8
- }
9
- export interface ResolvedScope {
10
- mode: ScopeMode;
11
- changedFiles: Set<string> | null;
12
- }
13
- export declare class GitScopeError extends Error {
14
- }
15
- export declare function resolveScope(flags: ScopeFlags, scope: ScopeConfig | undefined, cwd: string): ResolvedScope;
@@ -1,89 +0,0 @@
1
- import { isGitRepo } from './exec.js';
2
- import { getChangedVsBranch, getChangedVsCommit, getCurrentBranch, getLastNCommitsChanges, getUncommittedFiles, unionFiles, } from './scope.js';
3
- const DEFAULT_BRANCH_BASE = 'origin/main';
4
- const DEFAULT_MAIN_BRANCH = 'main';
5
- export class GitScopeError extends Error {
6
- }
7
- function allScope() {
8
- return { mode: 'all', changedFiles: null };
9
- }
10
- function toSet(files) {
11
- return new Set(files);
12
- }
13
- function requireRepo(cwd, mode) {
14
- if (!isGitRepo(cwd)) {
15
- throw new GitScopeError(`--${mode} requires a git repository (run inside a git working tree)`);
16
- }
17
- }
18
- function resolveFromFlags(flags, scope, cwd) {
19
- if (flags.all === true)
20
- return allScope();
21
- if (flags.last !== undefined)
22
- return resolveLastFlag(flags.last, cwd);
23
- if (flags.since !== undefined)
24
- return resolveSinceFlag(flags.since, cwd);
25
- if (flags.branch !== undefined)
26
- return resolveBranchFlag(flags.branch, scope, cwd);
27
- return null;
28
- }
29
- function resolveLastFlag(n, cwd) {
30
- requireRepo(cwd, 'last');
31
- const files = unionFiles(getLastNCommitsChanges(cwd, n), getUncommittedFiles(cwd));
32
- return { mode: 'last', changedFiles: toSet(files) };
33
- }
34
- function resolveSinceFlag(hash, cwd) {
35
- requireRepo(cwd, 'since');
36
- const files = unionFiles(getChangedVsCommit(cwd, hash), getUncommittedFiles(cwd));
37
- return { mode: 'since', changedFiles: toSet(files) };
38
- }
39
- function resolveBranchFlag(value, scope, cwd) {
40
- requireRepo(cwd, 'branch');
41
- const base = value !== '' ? value : (scope.branchBase ?? DEFAULT_BRANCH_BASE);
42
- const files = unionFiles(getChangedVsBranch(cwd, base), getUncommittedFiles(cwd));
43
- return { mode: 'branch', changedFiles: toSet(files) };
44
- }
45
- function resolveUncommitted(cwd) {
46
- if (!isGitRepo(cwd))
47
- return allScope();
48
- return { mode: 'uncommitted', changedFiles: toSet(getUncommittedFiles(cwd)) };
49
- }
50
- function tryGetCurrentBranch(cwd) {
51
- try {
52
- return getCurrentBranch(cwd);
53
- }
54
- catch {
55
- return null;
56
- }
57
- }
58
- function tryGetBranchScope(cwd, branchBase) {
59
- try {
60
- const files = unionFiles(getChangedVsBranch(cwd, branchBase), getUncommittedFiles(cwd));
61
- return { mode: 'branch', changedFiles: toSet(files) };
62
- }
63
- catch {
64
- return allScope();
65
- }
66
- }
67
- function resolveAutoBranch(scope, cwd) {
68
- if (!isGitRepo(cwd))
69
- return allScope();
70
- const current = tryGetCurrentBranch(cwd);
71
- if (current === null)
72
- return allScope();
73
- if (current === (scope.mainBranch ?? DEFAULT_MAIN_BRANCH))
74
- return null;
75
- return tryGetBranchScope(cwd, scope.branchBase ?? DEFAULT_BRANCH_BASE);
76
- }
77
- function resolveFromConfig(scopeCfg, cwd) {
78
- if (scopeCfg.onlyChangedFiles === true)
79
- return resolveUncommitted(cwd);
80
- if (scopeCfg.autoBranchOffMain === true) {
81
- return resolveAutoBranch(scopeCfg, cwd) ?? allScope();
82
- }
83
- return allScope();
84
- }
85
- export function resolveScope(flags, scope, cwd) {
86
- const scopeCfg = scope ?? {};
87
- return resolveFromFlags(flags, scopeCfg, cwd) ?? resolveFromConfig(scopeCfg, cwd);
88
- }
89
- //# sourceMappingURL=resolve-scope.js.map