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.
- package/README.md +17 -226
- package/bin/habit-hooks.js +32 -0
- package/package.json +11 -44
- package/LICENSE.md +0 -21
- package/dist/baseline/auto-prune.d.ts +0 -4
- package/dist/baseline/auto-prune.js +0 -38
- package/dist/baseline/auto-prune.js.map +0 -1
- package/dist/baseline/commands.d.ts +0 -12
- package/dist/baseline/commands.js +0 -125
- package/dist/baseline/commands.js.map +0 -1
- package/dist/baseline/file-hash.d.ts +0 -2
- package/dist/baseline/file-hash.js +0 -25
- package/dist/baseline/file-hash.js.map +0 -1
- package/dist/baseline/filter.d.ts +0 -9
- package/dist/baseline/filter.js +0 -18
- package/dist/baseline/filter.js.map +0 -1
- package/dist/baseline/reap.d.ts +0 -6
- package/dist/baseline/reap.js +0 -22
- package/dist/baseline/reap.js.map +0 -1
- package/dist/baseline/snooze-index.d.ts +0 -5
- package/dist/baseline/snooze-index.js +0 -65
- package/dist/baseline/snooze-index.js.map +0 -1
- package/dist/baseline/store.d.ts +0 -18
- package/dist/baseline/store.js +0 -106
- package/dist/baseline/store.js.map +0 -1
- package/dist/checks/comment-check.d.ts +0 -3
- package/dist/checks/comment-check.js +0 -85
- package/dist/checks/comment-check.js.map +0 -1
- package/dist/checks/eslint-wrap.d.ts +0 -2
- package/dist/checks/eslint-wrap.js +0 -107
- package/dist/checks/eslint-wrap.js.map +0 -1
- package/dist/checks/jscpd-wrap.d.ts +0 -9
- package/dist/checks/jscpd-wrap.js +0 -159
- package/dist/checks/jscpd-wrap.js.map +0 -1
- package/dist/checks/knip-resolve.d.ts +0 -4
- package/dist/checks/knip-resolve.js +0 -49
- package/dist/checks/knip-resolve.js.map +0 -1
- package/dist/checks/knip-schema.d.ts +0 -32
- package/dist/checks/knip-schema.js +0 -24
- package/dist/checks/knip-schema.js.map +0 -1
- package/dist/checks/knip-wrap.d.ts +0 -4
- package/dist/checks/knip-wrap.js +0 -135
- package/dist/checks/knip-wrap.js.map +0 -1
- package/dist/cli/baseline-commands.d.ts +0 -2
- package/dist/cli/baseline-commands.js +0 -61
- package/dist/cli/baseline-commands.js.map +0 -1
- package/dist/cli/emit.d.ts +0 -7
- package/dist/cli/emit.js +0 -8
- package/dist/cli/emit.js.map +0 -1
- package/dist/cli/init/apply-recommendations.d.ts +0 -3
- package/dist/cli/init/apply-recommendations.js +0 -76
- package/dist/cli/init/apply-recommendations.js.map +0 -1
- package/dist/cli/init/command-runner.d.ts +0 -6
- package/dist/cli/init/command-runner.js +0 -22
- package/dist/cli/init/command-runner.js.map +0 -1
- package/dist/cli/init/completion-report.d.ts +0 -11
- package/dist/cli/init/completion-report.js +0 -98
- package/dist/cli/init/completion-report.js.map +0 -1
- package/dist/cli/init/ctx.d.ts +0 -12
- package/dist/cli/init/ctx.js +0 -16
- package/dist/cli/init/ctx.js.map +0 -1
- package/dist/cli/init/detect.d.ts +0 -10
- package/dist/cli/init/detect.js +0 -69
- package/dist/cli/init/detect.js.map +0 -1
- package/dist/cli/init/git-hook.d.ts +0 -7
- package/dist/cli/init/git-hook.js +0 -52
- package/dist/cli/init/git-hook.js.map +0 -1
- package/dist/cli/init/install-commands.d.ts +0 -8
- package/dist/cli/init/install-commands.js +0 -82
- package/dist/cli/init/install-commands.js.map +0 -1
- package/dist/cli/init/package-scripts.d.ts +0 -6
- package/dist/cli/init/package-scripts.js +0 -55
- package/dist/cli/init/package-scripts.js.map +0 -1
- package/dist/cli/init/prompts.d.ts +0 -9
- package/dist/cli/init/prompts.js +0 -33
- package/dist/cli/init/prompts.js.map +0 -1
- package/dist/cli/init/recommendations.d.ts +0 -14
- package/dist/cli/init/recommendations.js +0 -66
- package/dist/cli/init/recommendations.js.map +0 -1
- package/dist/cli/init/report-language.d.ts +0 -1
- package/dist/cli/init/report-language.js +0 -12
- package/dist/cli/init/report-language.js.map +0 -1
- package/dist/cli/init/reporters.d.ts +0 -12
- package/dist/cli/init/reporters.js +0 -44
- package/dist/cli/init/reporters.js.map +0 -1
- package/dist/cli/init/run.d.ts +0 -17
- package/dist/cli/init/run.js +0 -123
- package/dist/cli/init/run.js.map +0 -1
- package/dist/cli/init/scaffold-baseline.d.ts +0 -4
- package/dist/cli/init/scaffold-baseline.js +0 -11
- package/dist/cli/init/scaffold-baseline.js.map +0 -1
- package/dist/cli/init/scaffold-config.d.ts +0 -20
- package/dist/cli/init/scaffold-config.js +0 -59
- package/dist/cli/init/scaffold-config.js.map +0 -1
- package/dist/cli/init/scaffold-eslint-config.d.ts +0 -2
- package/dist/cli/init/scaffold-eslint-config.js +0 -12
- package/dist/cli/init/scaffold-eslint-config.js.map +0 -1
- package/dist/cli/init/scaffold-jscpd-config.d.ts +0 -3
- package/dist/cli/init/scaffold-jscpd-config.js +0 -12
- package/dist/cli/init/scaffold-jscpd-config.js.map +0 -1
- package/dist/cli/init/scaffold-knip-config.d.ts +0 -2
- package/dist/cli/init/scaffold-knip-config.js +0 -12
- package/dist/cli/init/scaffold-knip-config.js.map +0 -1
- package/dist/cli/init/scaffold-ruff-config.d.ts +0 -2
- package/dist/cli/init/scaffold-ruff-config.js +0 -12
- package/dist/cli/init/scaffold-ruff-config.js.map +0 -1
- package/dist/cli/init/skill.d.ts +0 -8
- package/dist/cli/init/skill.js +0 -39
- package/dist/cli/init/skill.js.map +0 -1
- package/dist/cli/init/snippet.d.ts +0 -2
- package/dist/cli/init/snippet.js +0 -31
- package/dist/cli/init/snippet.js.map +0 -1
- package/dist/cli/init/templates/eslint-config.d.ts +0 -2
- package/dist/cli/init/templates/eslint-config.js +0 -45
- package/dist/cli/init/templates/eslint-config.js.map +0 -1
- package/dist/cli/init/templates/jscpd-config.d.ts +0 -3
- package/dist/cli/init/templates/jscpd-config.js +0 -17
- package/dist/cli/init/templates/jscpd-config.js.map +0 -1
- package/dist/cli/init/templates/knip-config.d.ts +0 -2
- package/dist/cli/init/templates/knip-config.js +0 -8
- package/dist/cli/init/templates/knip-config.js.map +0 -1
- package/dist/cli/init/templates/ruff-config.d.ts +0 -2
- package/dist/cli/init/templates/ruff-config.js +0 -16
- package/dist/cli/init/templates/ruff-config.js.map +0 -1
- package/dist/cli/init/tool-steps.d.ts +0 -2
- package/dist/cli/init/tool-steps.js +0 -78
- package/dist/cli/init/tool-steps.js.map +0 -1
- package/dist/cli/init-command.d.ts +0 -2
- package/dist/cli/init-command.js +0 -59
- package/dist/cli/init-command.js.map +0 -1
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -101
- package/dist/cli.js.map +0 -1
- package/dist/config/catalogue-unused.d.ts +0 -2
- package/dist/config/catalogue-unused.js +0 -39
- package/dist/config/catalogue-unused.js.map +0 -1
- package/dist/config/catalogue.d.ts +0 -2
- package/dist/config/catalogue.js +0 -163
- package/dist/config/catalogue.js.map +0 -1
- package/dist/config/defaults.d.ts +0 -4
- package/dist/config/defaults.js +0 -12
- package/dist/config/defaults.js.map +0 -1
- package/dist/config/jiti-loader.d.ts +0 -1
- package/dist/config/jiti-loader.js +0 -13
- package/dist/config/jiti-loader.js.map +0 -1
- package/dist/config/load.d.ts +0 -9
- package/dist/config/load.js +0 -54
- package/dist/config/load.js.map +0 -1
- package/dist/config/merge.d.ts +0 -3
- package/dist/config/merge.js +0 -91
- package/dist/config/merge.js.map +0 -1
- package/dist/config/schema.d.ts +0 -41
- package/dist/config/schema.js +0 -4
- package/dist/config/schema.js.map +0 -1
- package/dist/config/tool-smells.d.ts +0 -14
- package/dist/config/tool-smells.js +0 -69
- package/dist/config/tool-smells.js.map +0 -1
- package/dist/config/validate.d.ts +0 -2
- package/dist/config/validate.js +0 -159
- package/dist/config/validate.js.map +0 -1
- package/dist/detect/package-json.d.ts +0 -1
- package/dist/detect/package-json.js +0 -15
- package/dist/detect/package-json.js.map +0 -1
- package/dist/detect/path.d.ts +0 -1
- package/dist/detect/path.js +0 -14
- package/dist/detect/path.js.map +0 -1
- package/dist/detect/tool.d.ts +0 -10
- package/dist/detect/tool.js +0 -75
- package/dist/detect/tool.js.map +0 -1
- package/dist/discover.d.ts +0 -2
- package/dist/discover.js +0 -14
- package/dist/discover.js.map +0 -1
- package/dist/git/exec.d.ts +0 -8
- package/dist/git/exec.js +0 -48
- package/dist/git/exec.js.map +0 -1
- package/dist/git/resolve-scope.d.ts +0 -15
- package/dist/git/resolve-scope.js +0 -89
- package/dist/git/resolve-scope.js.map +0 -1
- package/dist/git/scope.d.ts +0 -7
- package/dist/git/scope.js +0 -58
- package/dist/git/scope.js.map +0 -1
- package/dist/guide/command.d.ts +0 -6
- package/dist/guide/command.js +0 -20
- package/dist/guide/command.js.map +0 -1
- package/dist/guide/guide.d.ts +0 -11
- package/dist/guide/guide.js +0 -82
- package/dist/guide/guide.js.map +0 -1
- package/dist/guide/render.d.ts +0 -3
- package/dist/guide/render.js +0 -14
- package/dist/guide/render.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- package/dist/mapper/mapper.d.ts +0 -34
- package/dist/mapper/mapper.js +0 -80
- package/dist/mapper/mapper.js.map +0 -1
- package/dist/prompts/loader.d.ts +0 -6
- package/dist/prompts/loader.js +0 -27
- package/dist/prompts/loader.js.map +0 -1
- package/dist/prompts/packaged-dir.d.ts +0 -1
- package/dist/prompts/packaged-dir.js +0 -10
- package/dist/prompts/packaged-dir.js.map +0 -1
- package/dist/prompts/registry.d.ts +0 -3
- package/dist/prompts/registry.js +0 -43
- package/dist/prompts/registry.js.map +0 -1
- package/dist/rule-files.d.ts +0 -2
- package/dist/rule-files.js +0 -22
- package/dist/rule-files.js.map +0 -1
- package/dist/rules/registry.d.ts +0 -3
- package/dist/rules/registry.js +0 -37
- package/dist/rules/registry.js.map +0 -1
- package/dist/runner.d.ts +0 -15
- package/dist/runner.js +0 -141
- package/dist/runner.js.map +0 -1
- package/dist/sensors/adapter.d.ts +0 -17
- package/dist/sensors/adapter.js +0 -81
- package/dist/sensors/adapter.js.map +0 -1
- package/dist/sensors/deptry-sensor.d.ts +0 -3
- package/dist/sensors/deptry-sensor.js +0 -43
- package/dist/sensors/deptry-sensor.js.map +0 -1
- package/dist/sensors/line-count-sensor.d.ts +0 -3
- package/dist/sensors/line-count-sensor.js +0 -50
- package/dist/sensors/line-count-sensor.js.map +0 -1
- package/dist/sensors/needs-extraction.d.ts +0 -3
- package/dist/sensors/needs-extraction.js +0 -57
- package/dist/sensors/needs-extraction.js.map +0 -1
- package/dist/sensors/preset.d.ts +0 -17
- package/dist/sensors/preset.js +0 -57
- package/dist/sensors/preset.js.map +0 -1
- package/dist/sensors/python-preset.d.ts +0 -7
- package/dist/sensors/python-preset.js +0 -34
- package/dist/sensors/python-preset.js.map +0 -1
- package/dist/sensors/runner.d.ts +0 -12
- package/dist/sensors/runner.js +0 -94
- package/dist/sensors/runner.js.map +0 -1
- package/dist/sensors/types.d.ts +0 -15
- package/dist/sensors/types.js +0 -5
- package/dist/sensors/types.js.map +0 -1
- package/dist/types.d.ts +0 -44
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/wrap/notices.d.ts +0 -19
- package/dist/wrap/notices.js +0 -38
- package/dist/wrap/notices.js.map +0 -1
- package/dist/wrap/resolve.d.ts +0 -5
- package/dist/wrap/resolve.js +0 -9
- package/dist/wrap/resolve.js.map +0 -1
- package/dist/wrap/run.d.ts +0 -17
- package/dist/wrap/run.js +0 -31
- package/dist/wrap/run.js.map +0 -1
- package/dist/wrap/shell.d.ts +0 -15
- package/dist/wrap/shell.js +0 -50
- package/dist/wrap/shell.js.map +0 -1
- package/src/prompts/deep-nesting.md +0 -13
- package/src/prompts/duplicated-code.md +0 -9
- package/src/prompts/high-complexity.md +0 -9
- package/src/prompts/needs-extraction.md +0 -9
- package/src/prompts/non-essential-comment.md +0 -7
- package/src/prompts/non-null-assertion.md +0 -10
- package/src/prompts/oversized-file.md +0 -9
- package/src/prompts/oversized-function.issues.njk +0 -5
- package/src/prompts/oversized-function.md +0 -9
- package/src/prompts/parse-error.md +0 -5
- package/src/prompts/too-many-parameters.md +0 -9
- package/src/prompts/uncoached.md +0 -4
- package/src/skills/habit-hooks-prompting/SKILL.md +0 -37
- package/src/skills/habit-hooks-review/SKILL.md +0 -108
package/dist/cli/init/ctx.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ctx.js","sourceRoot":"","sources":["../../../src/cli/init/ctx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAajC,MAAM,UAAU,YAAY,CAAC,GAAQ,EAAE,MAAsB,EAAE,KAAa;IAC1E,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;;QAC5D,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,uBAAuB,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAQ,EAAE,QAAgB,EAAE,KAAa;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,uBAAuB,IAAI,IAAI,CAAC,CAAC;;QAC7E,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { type ToolName } from '../../detect/tool.js';
|
|
2
|
-
import type { Language } from '../../config/schema.js';
|
|
3
|
-
export type { ToolName };
|
|
4
|
-
export declare function toolsForLanguage(language: Language): ToolName[];
|
|
5
|
-
export interface ToolState {
|
|
6
|
-
installed: boolean;
|
|
7
|
-
configured: boolean;
|
|
8
|
-
}
|
|
9
|
-
type ToolStateMatrix = Record<ToolName, ToolState>;
|
|
10
|
-
export declare function detectToolStates(cwd: string): ToolStateMatrix;
|
package/dist/cli/init/detect.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { detectTool, TOOL_CONFIG_FILENAMES, TOOL_PACKAGE_JSON_KEYS, } from '../../detect/tool.js';
|
|
4
|
-
import { hasPackageJsonKey } from '../../detect/package-json.js';
|
|
5
|
-
import { isOnPath } from '../../detect/path.js';
|
|
6
|
-
const TOOLS_BY_LANGUAGE = {
|
|
7
|
-
typescript: ['eslint', 'knip', 'jscpd'],
|
|
8
|
-
python: ['ruff', 'deptry', 'jscpd'],
|
|
9
|
-
};
|
|
10
|
-
export function toolsForLanguage(language) {
|
|
11
|
-
return TOOLS_BY_LANGUAGE[language];
|
|
12
|
-
}
|
|
13
|
-
const DETECTION_KIND = {
|
|
14
|
-
eslint: 'node',
|
|
15
|
-
knip: 'node',
|
|
16
|
-
jscpd: 'node',
|
|
17
|
-
ruff: 'path',
|
|
18
|
-
deptry: 'path',
|
|
19
|
-
};
|
|
20
|
-
const PATH_BIN_NAME = {
|
|
21
|
-
ruff: 'ruff',
|
|
22
|
-
deptry: 'deptry',
|
|
23
|
-
};
|
|
24
|
-
function isInstalled(cwd, tool) {
|
|
25
|
-
if (DETECTION_KIND[tool] === 'path')
|
|
26
|
-
return isOnPath(PATH_BIN_NAME[tool] ?? tool);
|
|
27
|
-
return detectTool(cwd, tool) !== null;
|
|
28
|
-
}
|
|
29
|
-
function hasNodeConfig(cwd, tool) {
|
|
30
|
-
if (TOOL_CONFIG_FILENAMES[tool].some((name) => existsSync(join(cwd, name))))
|
|
31
|
-
return true;
|
|
32
|
-
const key = TOOL_PACKAGE_JSON_KEYS[tool];
|
|
33
|
-
return key !== undefined && hasPackageJsonKey(cwd, key);
|
|
34
|
-
}
|
|
35
|
-
function readPyproject(cwd) {
|
|
36
|
-
const path = join(cwd, 'pyproject.toml');
|
|
37
|
-
if (!existsSync(path))
|
|
38
|
-
return null;
|
|
39
|
-
try {
|
|
40
|
-
return readFileSync(path, 'utf8');
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
function hasRuffConfig(cwd) {
|
|
47
|
-
if (TOOL_CONFIG_FILENAMES.ruff.some((name) => existsSync(join(cwd, name))))
|
|
48
|
-
return true;
|
|
49
|
-
const pyproject = readPyproject(cwd);
|
|
50
|
-
return pyproject !== null && /^\[tool\.ruff/m.test(pyproject);
|
|
51
|
-
}
|
|
52
|
-
function isConfigured(cwd, tool) {
|
|
53
|
-
if (tool === 'ruff')
|
|
54
|
-
return hasRuffConfig(cwd);
|
|
55
|
-
if (tool === 'deptry')
|
|
56
|
-
return readPyproject(cwd) !== null;
|
|
57
|
-
return hasNodeConfig(cwd, tool);
|
|
58
|
-
}
|
|
59
|
-
function stateFor(cwd, tool) {
|
|
60
|
-
return { installed: isInstalled(cwd, tool), configured: isConfigured(cwd, tool) };
|
|
61
|
-
}
|
|
62
|
-
export function detectToolStates(cwd) {
|
|
63
|
-
const tools = Object.keys(DETECTION_KIND);
|
|
64
|
-
const matrix = {};
|
|
65
|
-
for (const tool of tools)
|
|
66
|
-
matrix[tool] = stateFor(cwd, tool);
|
|
67
|
-
return matrix;
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=detect.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/cli/init/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { Language } from '../../config/schema.js';
|
|
2
|
-
export type HookAction = 'installed' | 'conflict' | 'no-git' | 'kept';
|
|
3
|
-
export interface HookResult {
|
|
4
|
-
action: HookAction;
|
|
5
|
-
path?: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function installPreCommitHook(cwd: string, language: Language): HookResult;
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { chmodSync, existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { detectPackageManager, runScriptCommand } from './install-commands.js';
|
|
4
|
-
function hookCommandFor(cwd, language) {
|
|
5
|
-
if (language === 'python')
|
|
6
|
-
return 'habit-hooks';
|
|
7
|
-
return runScriptCommand(detectPackageManager(cwd), 'habit-hooks');
|
|
8
|
-
}
|
|
9
|
-
function hookBodyFor(cwd, language) {
|
|
10
|
-
return `#!/usr/bin/env sh\n${hookCommandFor(cwd, language)}\n`;
|
|
11
|
-
}
|
|
12
|
-
function dependsOnHusky(cwd) {
|
|
13
|
-
const pkgPath = join(cwd, 'package.json');
|
|
14
|
-
if (!existsSync(pkgPath))
|
|
15
|
-
return false;
|
|
16
|
-
if (!existsSync(join(cwd, '.husky')))
|
|
17
|
-
return false;
|
|
18
|
-
const raw = readFileSync(pkgPath, 'utf8');
|
|
19
|
-
return raw.includes('"husky"');
|
|
20
|
-
}
|
|
21
|
-
function huskyHookPath(cwd) {
|
|
22
|
-
return join(cwd, '.husky', 'pre-commit');
|
|
23
|
-
}
|
|
24
|
-
function nativeHookPath(cwd) {
|
|
25
|
-
return join(cwd, '.git', 'hooks', 'pre-commit');
|
|
26
|
-
}
|
|
27
|
-
function writeHook(path, body) {
|
|
28
|
-
writeFileSync(path, body);
|
|
29
|
-
chmodSync(path, 0o755);
|
|
30
|
-
return { action: 'installed', path };
|
|
31
|
-
}
|
|
32
|
-
function bodyMatches(content) {
|
|
33
|
-
return /(^|\s)habit-hooks(\s|$)/m.test(content);
|
|
34
|
-
}
|
|
35
|
-
function installAt(path, body) {
|
|
36
|
-
if (existsSync(path)) {
|
|
37
|
-
const existing = readFileSync(path, 'utf8');
|
|
38
|
-
if (bodyMatches(existing))
|
|
39
|
-
return { action: 'kept', path };
|
|
40
|
-
return { action: 'conflict', path };
|
|
41
|
-
}
|
|
42
|
-
return writeHook(path, body);
|
|
43
|
-
}
|
|
44
|
-
export function installPreCommitHook(cwd, language) {
|
|
45
|
-
const body = hookBodyFor(cwd, language);
|
|
46
|
-
if (dependsOnHusky(cwd))
|
|
47
|
-
return installAt(huskyHookPath(cwd), body);
|
|
48
|
-
if (!existsSync(join(cwd, '.git')))
|
|
49
|
-
return { action: 'no-git' };
|
|
50
|
-
return installAt(nativeHookPath(cwd), body);
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=git-hook.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-hook.js","sourceRoot":"","sources":["../../../src/cli/init/git-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAU/E,SAAS,cAAc,CAAC,GAAW,EAAE,QAAkB;IACrD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAChD,OAAO,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,QAAkB;IAClD,OAAO,sBAAsB,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1B,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,WAAW,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC3D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,QAAkB;IAClE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,IAAI,cAAc,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAChE,OAAO,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { ToolName } from '../../detect/tool.js';
|
|
2
|
-
type PackageManager = 'pnpm' | 'yarn' | 'bun' | 'npm';
|
|
3
|
-
export declare function detectPackageManager(cwd: string): PackageManager;
|
|
4
|
-
export declare function buildInstallCommand(pm: PackageManager, packages: string[]): string;
|
|
5
|
-
export declare function runScriptCommand(pm: PackageManager, script: string): string;
|
|
6
|
-
export declare function packagesFor(tool: ToolName): string[];
|
|
7
|
-
export declare function installCommandsFor(cwd: string, missingTools: ToolName[]): string[];
|
|
8
|
-
export {};
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { existsSync, statSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
const LOCKFILES = {
|
|
4
|
-
pnpm: ['pnpm-lock.yaml'],
|
|
5
|
-
yarn: ['yarn.lock'],
|
|
6
|
-
bun: ['bun.lock', 'bun.lockb'],
|
|
7
|
-
};
|
|
8
|
-
function lockfileHitsFor(cwd, pm) {
|
|
9
|
-
const hits = [];
|
|
10
|
-
for (const file of LOCKFILES[pm]) {
|
|
11
|
-
const path = join(cwd, file);
|
|
12
|
-
if (existsSync(path))
|
|
13
|
-
hits.push({ pm, path, mtimeMs: statSync(path).mtimeMs });
|
|
14
|
-
}
|
|
15
|
-
return hits;
|
|
16
|
-
}
|
|
17
|
-
function findAllLockfileHits(cwd) {
|
|
18
|
-
const all = [];
|
|
19
|
-
for (const pm of Object.keys(LOCKFILES)) {
|
|
20
|
-
all.push(...lockfileHitsFor(cwd, pm));
|
|
21
|
-
}
|
|
22
|
-
return all;
|
|
23
|
-
}
|
|
24
|
-
function pickNewest(hits) {
|
|
25
|
-
const sorted = [...hits].sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
26
|
-
const newest = sorted[0];
|
|
27
|
-
if (newest === undefined)
|
|
28
|
-
throw new Error('pickNewest requires at least one hit');
|
|
29
|
-
return newest;
|
|
30
|
-
}
|
|
31
|
-
export function detectPackageManager(cwd) {
|
|
32
|
-
const hits = findAllLockfileHits(cwd);
|
|
33
|
-
if (hits.length === 0)
|
|
34
|
-
return 'npm';
|
|
35
|
-
return pickNewest(hits).pm;
|
|
36
|
-
}
|
|
37
|
-
const ADD_FLAGS = {
|
|
38
|
-
pnpm: ['add', '-D'],
|
|
39
|
-
yarn: ['add', '-D'],
|
|
40
|
-
bun: ['add', '-d'],
|
|
41
|
-
npm: ['install', '--save-dev'],
|
|
42
|
-
};
|
|
43
|
-
export function buildInstallCommand(pm, packages) {
|
|
44
|
-
return [pm, ...ADD_FLAGS[pm], ...packages].join(' ');
|
|
45
|
-
}
|
|
46
|
-
export function runScriptCommand(pm, script) {
|
|
47
|
-
return `${pm} run ${script}`;
|
|
48
|
-
}
|
|
49
|
-
const ESLINT_PACKAGES = ['eslint', '@eslint/js', 'typescript-eslint'];
|
|
50
|
-
export function packagesFor(tool) {
|
|
51
|
-
if (tool === 'eslint')
|
|
52
|
-
return ESLINT_PACKAGES;
|
|
53
|
-
return [tool];
|
|
54
|
-
}
|
|
55
|
-
const ECOSYSTEM = {
|
|
56
|
-
eslint: 'node',
|
|
57
|
-
knip: 'node',
|
|
58
|
-
jscpd: 'node',
|
|
59
|
-
ruff: 'pip',
|
|
60
|
-
deptry: 'pip',
|
|
61
|
-
};
|
|
62
|
-
function toolsInEcosystem(tools, ecosystem) {
|
|
63
|
-
return tools.filter((tool) => ECOSYSTEM[tool] === ecosystem);
|
|
64
|
-
}
|
|
65
|
-
function nodeInstallCommand(cwd, tools) {
|
|
66
|
-
if (tools.length === 0)
|
|
67
|
-
return null;
|
|
68
|
-
const packages = tools.flatMap((tool) => packagesFor(tool));
|
|
69
|
-
return buildInstallCommand(detectPackageManager(cwd), packages);
|
|
70
|
-
}
|
|
71
|
-
function pipInstallCommand(tools) {
|
|
72
|
-
if (tools.length === 0)
|
|
73
|
-
return null;
|
|
74
|
-
const packages = tools.flatMap((tool) => packagesFor(tool));
|
|
75
|
-
return `pip install ${packages.join(' ')}`;
|
|
76
|
-
}
|
|
77
|
-
export function installCommandsFor(cwd, missingTools) {
|
|
78
|
-
const node = nodeInstallCommand(cwd, toolsInEcosystem(missingTools, 'node'));
|
|
79
|
-
const pip = pipInstallCommand(toolsInEcosystem(missingTools, 'pip'));
|
|
80
|
-
return [node, pip].filter((command) => command !== null);
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=install-commands.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install-commands.js","sourceRoot":"","sources":["../../../src/cli/init/install-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
const HABIT_HOOKS_SCRIPT = 'habit-hooks';
|
|
4
|
-
const HABIT_HOOKS_COMMAND = 'habit-hooks';
|
|
5
|
-
const CI_SCRIPT = 'ci';
|
|
6
|
-
const CI_CANDIDATES = ['lint', 'test', 'build', HABIT_HOOKS_SCRIPT];
|
|
7
|
-
function readPackageJson(cwd) {
|
|
8
|
-
const path = join(cwd, 'package.json');
|
|
9
|
-
if (!existsSync(path))
|
|
10
|
-
return null;
|
|
11
|
-
const raw = readFileSync(path, 'utf8');
|
|
12
|
-
return { path, data: JSON.parse(raw) };
|
|
13
|
-
}
|
|
14
|
-
function writePackageJson(path, data) {
|
|
15
|
-
writeFileSync(path, `${JSON.stringify(data, null, 2)}\n`);
|
|
16
|
-
}
|
|
17
|
-
function ensureScripts(data) {
|
|
18
|
-
if (!data.scripts)
|
|
19
|
-
data.scripts = {};
|
|
20
|
-
return data.scripts;
|
|
21
|
-
}
|
|
22
|
-
export function addHabitHooksScript(cwd) {
|
|
23
|
-
const pkg = readPackageJson(cwd);
|
|
24
|
-
if (pkg === null)
|
|
25
|
-
return { action: 'no-package-json' };
|
|
26
|
-
const scripts = ensureScripts(pkg.data);
|
|
27
|
-
const existing = scripts[HABIT_HOOKS_SCRIPT];
|
|
28
|
-
if (existing === HABIT_HOOKS_COMMAND)
|
|
29
|
-
return { action: 'kept', before: existing };
|
|
30
|
-
if (existing !== undefined)
|
|
31
|
-
return { action: 'conflict', before: existing };
|
|
32
|
-
scripts[HABIT_HOOKS_SCRIPT] = HABIT_HOOKS_COMMAND;
|
|
33
|
-
writePackageJson(pkg.path, pkg.data);
|
|
34
|
-
return { action: 'added' };
|
|
35
|
-
}
|
|
36
|
-
function buildCiCommand(scripts) {
|
|
37
|
-
const present = CI_CANDIDATES.filter((name) => scripts[name] !== undefined);
|
|
38
|
-
return present.map((name) => `npm run ${name}`).join(' && ');
|
|
39
|
-
}
|
|
40
|
-
export function addCiScript(cwd) {
|
|
41
|
-
const pkg = readPackageJson(cwd);
|
|
42
|
-
if (pkg === null)
|
|
43
|
-
return { action: 'no-package-json' };
|
|
44
|
-
const scripts = ensureScripts(pkg.data);
|
|
45
|
-
const desired = buildCiCommand(scripts);
|
|
46
|
-
const existing = scripts[CI_SCRIPT];
|
|
47
|
-
if (existing === desired)
|
|
48
|
-
return { action: 'kept', before: existing };
|
|
49
|
-
if (existing !== undefined)
|
|
50
|
-
return { action: 'conflict', before: existing };
|
|
51
|
-
scripts[CI_SCRIPT] = desired;
|
|
52
|
-
writePackageJson(pkg.path, pkg.data);
|
|
53
|
-
return { action: 'added' };
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=package-scripts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"package-scripts.js","sourceRoot":"","sources":["../../../src/cli/init/package-scripts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export interface PromptOptions {
|
|
2
|
-
defaultYes: boolean;
|
|
3
|
-
}
|
|
4
|
-
export interface Prompter {
|
|
5
|
-
ask(_question: string, _opts: PromptOptions): Promise<boolean>;
|
|
6
|
-
close(): void;
|
|
7
|
-
}
|
|
8
|
-
export declare function makeInteractivePrompter(): Prompter;
|
|
9
|
-
export declare function makeAutoPrompter(defaultYesForAll: boolean): Prompter;
|
package/dist/cli/init/prompts.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import readline from 'node:readline';
|
|
2
|
-
function suffix(defaultYes) {
|
|
3
|
-
return defaultYes ? '[Y/n]' : '[y/N]';
|
|
4
|
-
}
|
|
5
|
-
function interpret(answer, defaultYes) {
|
|
6
|
-
const trimmed = answer.trim().toLowerCase();
|
|
7
|
-
if (trimmed.length === 0)
|
|
8
|
-
return defaultYes;
|
|
9
|
-
return trimmed === 'y' || trimmed === 'yes';
|
|
10
|
-
}
|
|
11
|
-
function askVia(rl, question, opts) {
|
|
12
|
-
return new Promise((resolve) => {
|
|
13
|
-
rl.question(`${question} ${suffix(opts.defaultYes)} `, (answer) => {
|
|
14
|
-
resolve(interpret(answer, opts.defaultYes));
|
|
15
|
-
});
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
export function makeInteractivePrompter() {
|
|
19
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
20
|
-
return {
|
|
21
|
-
ask: (q, opts) => askVia(rl, q, opts),
|
|
22
|
-
close: () => rl.close(),
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
export function makeAutoPrompter(defaultYesForAll) {
|
|
26
|
-
return {
|
|
27
|
-
ask(_question, opts) {
|
|
28
|
-
return Promise.resolve(defaultYesForAll ? true : opts.defaultYes);
|
|
29
|
-
},
|
|
30
|
-
close() { },
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=prompts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/cli/init/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAWrC,SAAS,MAAM,CAAC,UAAmB;IACjC,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACxC,CAAC;AAED,SAAS,SAAS,CAAC,MAAc,EAAE,UAAmB;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5C,OAAO,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,KAAK,CAAC;AAC9C,CAAC;AAED,SAAS,MAAM,CAAC,EAAsB,EAAE,QAAgB,EAAE,IAAmB;IAC3E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE;YAChE,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;QACrC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,gBAAyB;IACxD,OAAO;QACL,GAAG,CAAC,SAAS,EAAE,IAAI;YACjB,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpE,CAAC;QACD,KAAK,KAAI,CAAC;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export interface RecommendedKey {
|
|
2
|
-
key: string;
|
|
3
|
-
value: number;
|
|
4
|
-
description: string;
|
|
5
|
-
}
|
|
6
|
-
export interface Recommendation {
|
|
7
|
-
keys: RecommendedKey[];
|
|
8
|
-
missingKeys: (_cwd: string) => string[];
|
|
9
|
-
}
|
|
10
|
-
export declare const JSCPD_RECOMMENDED: RecommendedKey[];
|
|
11
|
-
export declare const RUFF_RECOMMENDED: RecommendedKey[];
|
|
12
|
-
export declare const JSCPD_RECOMMENDATION: Recommendation;
|
|
13
|
-
export declare const RUFF_RECOMMENDATION: Recommendation;
|
|
14
|
-
export declare function describeKey(recommendation: Recommendation, key: string): RecommendedKey;
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { TOOL_CONFIG_FILENAMES } from '../../detect/tool.js';
|
|
4
|
-
export const JSCPD_RECOMMENDED = [
|
|
5
|
-
{ key: 'threshold', value: 0, description: 'fail on any duplication' },
|
|
6
|
-
{ key: 'minTokens', value: 50, description: 'smallest duplicate token run reported' },
|
|
7
|
-
{ key: 'minLines', value: 5, description: 'smallest duplicate line run reported' },
|
|
8
|
-
];
|
|
9
|
-
export const RUFF_RECOMMENDED = [
|
|
10
|
-
{ key: 'max-complexity', value: 10, description: 'mccabe cyclomatic complexity ceiling' },
|
|
11
|
-
{ key: 'max-args', value: 3, description: 'pylint maximum function arguments' },
|
|
12
|
-
{ key: 'max-statements', value: 50, description: 'pylint maximum function statements' },
|
|
13
|
-
];
|
|
14
|
-
function readJscpdConfig(cwd) {
|
|
15
|
-
for (const filename of TOOL_CONFIG_FILENAMES.jscpd) {
|
|
16
|
-
const path = join(cwd, filename);
|
|
17
|
-
if (!existsSync(path))
|
|
18
|
-
continue;
|
|
19
|
-
try {
|
|
20
|
-
return JSON.parse(readFileSync(path, 'utf8'));
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
function jscpdMissingKeys(cwd) {
|
|
29
|
-
const config = readJscpdConfig(cwd);
|
|
30
|
-
if (config === null)
|
|
31
|
-
return JSCPD_RECOMMENDED.map((k) => k.key);
|
|
32
|
-
return JSCPD_RECOMMENDED.filter((k) => !(k.key in config)).map((k) => k.key);
|
|
33
|
-
}
|
|
34
|
-
function readTextOrEmpty(path) {
|
|
35
|
-
if (!existsSync(path))
|
|
36
|
-
return '';
|
|
37
|
-
try {
|
|
38
|
-
return `${readFileSync(path, 'utf8')}\n`;
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
return '';
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function readRuffConfigText(cwd) {
|
|
45
|
-
const sources = [...TOOL_CONFIG_FILENAMES.ruff, 'pyproject.toml'];
|
|
46
|
-
return sources.map((filename) => readTextOrEmpty(join(cwd, filename))).join('');
|
|
47
|
-
}
|
|
48
|
-
function ruffMissingKeys(cwd) {
|
|
49
|
-
const text = readRuffConfigText(cwd);
|
|
50
|
-
return RUFF_RECOMMENDED.filter((k) => !text.includes(k.key)).map((k) => k.key);
|
|
51
|
-
}
|
|
52
|
-
export const JSCPD_RECOMMENDATION = {
|
|
53
|
-
keys: JSCPD_RECOMMENDED,
|
|
54
|
-
missingKeys: jscpdMissingKeys,
|
|
55
|
-
};
|
|
56
|
-
export const RUFF_RECOMMENDATION = {
|
|
57
|
-
keys: RUFF_RECOMMENDED,
|
|
58
|
-
missingKeys: ruffMissingKeys,
|
|
59
|
-
};
|
|
60
|
-
export function describeKey(recommendation, key) {
|
|
61
|
-
const found = recommendation.keys.find((k) => k.key === key);
|
|
62
|
-
if (found === undefined)
|
|
63
|
-
throw new Error(`unknown recommended key ${key}`);
|
|
64
|
-
return found;
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=recommendations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../../src/cli/init/recommendations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function detectionReport(cwd: string): string;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { detectLanguageWithReason } from './scaffold-config.js';
|
|
2
|
-
const LANGUAGE_LABELS = {
|
|
3
|
-
typescript: 'TypeScript',
|
|
4
|
-
python: 'Python',
|
|
5
|
-
};
|
|
6
|
-
export function detectionReport(cwd) {
|
|
7
|
-
const { language, reason } = detectLanguageWithReason(cwd);
|
|
8
|
-
const label = LANGUAGE_LABELS[language];
|
|
9
|
-
return (`Detected ${label} (${reason}). Re-run \`habit-hooks init ${language}\` to proceed, ` +
|
|
10
|
-
'or `habit-hooks init <language>` to install for other supported languages.\n');
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=report-language.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"report-language.js","sourceRoot":"","sources":["../../../src/cli/init/report-language.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAGhE,MAAM,eAAe,GAA6B;IAChD,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,CACL,YAAY,KAAK,KAAK,MAAM,gCAAgC,QAAQ,iBAAiB;QACrF,8EAA8E,CAC/E,CAAC;AACJ,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { HookResult } from './git-hook.js';
|
|
2
|
-
import type { ScriptResult } from './package-scripts.js';
|
|
3
|
-
import type { SkillResult } from './skill.js';
|
|
4
|
-
export interface Lines {
|
|
5
|
-
out: string[];
|
|
6
|
-
err: string[];
|
|
7
|
-
exit: number;
|
|
8
|
-
}
|
|
9
|
-
export declare function reportScriptResult(name: string, result: ScriptResult, lines: Lines): void;
|
|
10
|
-
export declare function reportHookResult(result: HookResult, lines: Lines): void;
|
|
11
|
-
export declare function reportSkillResult(result: SkillResult, lines: Lines): void;
|
|
12
|
-
export declare function reportSkillResults(results: SkillResult[], lines: Lines): void;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
function emitConflict(lines, message) {
|
|
2
|
-
lines.err.push(`habit-hooks: ${message}\n`);
|
|
3
|
-
lines.exit = 2;
|
|
4
|
-
}
|
|
5
|
-
export function reportScriptResult(name, result, lines) {
|
|
6
|
-
if (result.action === 'added')
|
|
7
|
-
lines.out.push(`added '${name}' to package.json scripts\n`);
|
|
8
|
-
else if (result.action === 'kept')
|
|
9
|
-
lines.out.push(`'${name}' already set as desired in package.json\n`);
|
|
10
|
-
else if (result.action === 'no-package-json')
|
|
11
|
-
lines.out.push(`skipped '${name}': no package.json in cwd\n`);
|
|
12
|
-
else if (result.action === 'conflict') {
|
|
13
|
-
emitConflict(lines, `refusing to replace '${name}' script (currently: ${result.before ?? '<unknown>'})`);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export function reportHookResult(result, lines) {
|
|
17
|
-
if (result.action === 'installed')
|
|
18
|
-
lines.out.push(`installed pre-commit hook at ${result.path}\n`);
|
|
19
|
-
else if (result.action === 'kept')
|
|
20
|
-
lines.out.push(`pre-commit hook already installed at ${result.path}\n`);
|
|
21
|
-
else if (result.action === 'conflict') {
|
|
22
|
-
lines.out.push(`pre-commit hook already exists at ${result.path} — left untouched\n`);
|
|
23
|
-
}
|
|
24
|
-
else if (result.action === 'no-git') {
|
|
25
|
-
lines.out.push(`skipped pre-commit hook: no .git directory in cwd\n`);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
export function reportSkillResult(result, lines) {
|
|
29
|
-
if (result.action === 'installed')
|
|
30
|
-
lines.out.push(`installed ${result.name} at ${result.target}\n`);
|
|
31
|
-
else if (result.action === 'kept')
|
|
32
|
-
lines.out.push(`${result.name} already at ${result.target}\n`);
|
|
33
|
-
else if (result.action === 'conflict') {
|
|
34
|
-
lines.out.push(`${result.name} already exists at ${result.target} — left untouched\n`);
|
|
35
|
-
}
|
|
36
|
-
else if (result.action === 'source-missing') {
|
|
37
|
-
lines.err.push(`habit-hooks: could not find packaged SKILL.md for ${result.name} — skipping\n`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export function reportSkillResults(results, lines) {
|
|
41
|
-
for (const result of results)
|
|
42
|
-
reportSkillResult(result, lines);
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=reporters.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reporters.js","sourceRoot":"","sources":["../../../src/cli/init/reporters.ts"],"names":[],"mappings":"AAUA,SAAS,YAAY,CAAC,KAAY,EAAE,OAAe;IACjD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,OAAO,IAAI,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,MAAoB,EAAE,KAAY;IACjF,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,6BAA6B,CAAC,CAAC;SACtF,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,4CAA4C,CAAC,CAAC;SACnG,IAAI,MAAM,CAAC,MAAM,KAAK,iBAAiB;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,6BAA6B,CAAC,CAAC;SACvG,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACtC,YAAY,CAAC,KAAK,EAAE,wBAAwB,IAAI,wBAAwB,MAAM,CAAC,MAAM,IAAI,WAAW,GAAG,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAkB,EAAE,KAAY;IAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;SAC9F,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,wCAAwC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;SACtG,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACtC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC;IACxF,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAmB,EAAE,KAAY;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;SAC/F,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,eAAe,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;SAC7F,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACtC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,sBAAsB,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC;IACzF,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAC9C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,qDAAqD,MAAM,CAAC,IAAI,eAAe,CAAC,CAAC;IAClG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAsB,EAAE,KAAY;IACrE,KAAK,MAAM,MAAM,IAAI,OAAO;QAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACjE,CAAC"}
|
package/dist/cli/init/run.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { Language } from '../../config/schema.js';
|
|
2
|
-
import type { Prompter } from './prompts.js';
|
|
3
|
-
import { type CommandRunner } from './command-runner.js';
|
|
4
|
-
interface InitOptions {
|
|
5
|
-
prompter: Prompter;
|
|
6
|
-
dryRun?: boolean;
|
|
7
|
-
language?: Language;
|
|
8
|
-
acceptRecommendations?: boolean;
|
|
9
|
-
runCommand?: CommandRunner;
|
|
10
|
-
}
|
|
11
|
-
interface InitResult {
|
|
12
|
-
stdout: string;
|
|
13
|
-
stderr: string;
|
|
14
|
-
exitCode: number;
|
|
15
|
-
}
|
|
16
|
-
export declare function runInit(cwd: string, opts: InitOptions): Promise<InitResult>;
|
|
17
|
-
export {};
|