@codluv/versionguard 0.3.0 → 0.4.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/dist/calver.d.ts +65 -22
- package/dist/calver.d.ts.map +1 -1
- package/dist/chunks/{index-BrZJDWya.js → index-B3R60bYJ.js} +451 -151
- package/dist/chunks/index-B3R60bYJ.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +248 -25
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/feedback/index.d.ts +1 -1
- package/dist/feedback/index.d.ts.map +1 -1
- package/dist/fix/index.d.ts +6 -1
- package/dist/fix/index.d.ts.map +1 -1
- package/dist/guard.d.ts +45 -1
- package/dist/guard.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -13
- package/dist/init-wizard.d.ts +49 -0
- package/dist/init-wizard.d.ts.map +1 -0
- package/dist/project.d.ts +23 -2
- package/dist/project.d.ts.map +1 -1
- package/dist/sources/git-tag.d.ts +29 -0
- package/dist/sources/git-tag.d.ts.map +1 -1
- package/dist/sources/json.d.ts +31 -0
- package/dist/sources/json.d.ts.map +1 -1
- package/dist/sources/regex.d.ts +30 -0
- package/dist/sources/regex.d.ts.map +1 -1
- package/dist/sources/resolve.d.ts +27 -8
- package/dist/sources/resolve.d.ts.map +1 -1
- package/dist/sources/toml.d.ts +36 -1
- package/dist/sources/toml.d.ts.map +1 -1
- package/dist/sources/utils.d.ts +73 -0
- package/dist/sources/utils.d.ts.map +1 -0
- package/dist/sources/version-file.d.ts +28 -1
- package/dist/sources/version-file.d.ts.map +1 -1
- package/dist/sources/yaml.d.ts +29 -0
- package/dist/sources/yaml.d.ts.map +1 -1
- package/dist/tag/index.d.ts.map +1 -1
- package/dist/types.d.ts +89 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
- package/dist/chunks/index-BrZJDWya.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -4,7 +4,219 @@ import * as path from "node:path";
|
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import chalk from "chalk";
|
|
6
6
|
import { Command } from "commander";
|
|
7
|
-
import { i as
|
|
7
|
+
import { i as isValidCalVerFormat, g as getConfig, a as installHooks, b as getPackageVersion, c as getVersionFeedback, v as validate, h as handlePostTag, r as runGuardChecks, d as getSyncFeedback, e as getChangelogFeedback, f as doctor, j as fixAll, k as fixSyncIssues, s as suggestNextVersion, l as setPackageVersion, m as createTag, u as uninstallHooks, n as areHooksInstalled } from "./chunks/index-B3R60bYJ.js";
|
|
8
|
+
import * as p from "@clack/prompts";
|
|
9
|
+
import * as yaml from "js-yaml";
|
|
10
|
+
async function runWizard(cwd) {
|
|
11
|
+
p.intro("VersionGuard Setup");
|
|
12
|
+
const existingConfig = findExistingConfig(cwd);
|
|
13
|
+
if (existingConfig) {
|
|
14
|
+
p.log.warning(`Config already exists: ${path.relative(cwd, existingConfig)}`);
|
|
15
|
+
const overwrite = await p.confirm({ message: "Overwrite existing config?" });
|
|
16
|
+
if (p.isCancel(overwrite) || !overwrite) {
|
|
17
|
+
p.outro("Setup cancelled.");
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const type = await p.select({
|
|
22
|
+
message: "Versioning strategy",
|
|
23
|
+
options: [
|
|
24
|
+
{ value: "semver", label: "SemVer", hint: "MAJOR.MINOR.PATCH (e.g., 1.2.3)" },
|
|
25
|
+
{ value: "calver", label: "CalVer", hint: "Calendar-based (e.g., 2026.3.0)" }
|
|
26
|
+
]
|
|
27
|
+
});
|
|
28
|
+
if (p.isCancel(type)) {
|
|
29
|
+
p.outro("Setup cancelled.");
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
let format;
|
|
33
|
+
if (type === "calver") {
|
|
34
|
+
const selected = await selectCalVerFormat();
|
|
35
|
+
if (!selected) {
|
|
36
|
+
p.outro("Setup cancelled.");
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
format = selected;
|
|
40
|
+
}
|
|
41
|
+
const manifest = await selectManifest(cwd);
|
|
42
|
+
if (manifest === null) {
|
|
43
|
+
p.outro("Setup cancelled.");
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
const hooks = await p.confirm({
|
|
47
|
+
message: "Install git hooks? (pre-commit, pre-push, post-tag)",
|
|
48
|
+
initialValue: true
|
|
49
|
+
});
|
|
50
|
+
if (p.isCancel(hooks)) {
|
|
51
|
+
p.outro("Setup cancelled.");
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const changelog = await p.confirm({
|
|
55
|
+
message: "Enable changelog validation?",
|
|
56
|
+
initialValue: true
|
|
57
|
+
});
|
|
58
|
+
if (p.isCancel(changelog)) {
|
|
59
|
+
p.outro("Setup cancelled.");
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const config = buildConfig({
|
|
63
|
+
type,
|
|
64
|
+
format,
|
|
65
|
+
manifest: manifest === "auto" ? void 0 : manifest,
|
|
66
|
+
hooks,
|
|
67
|
+
changelog
|
|
68
|
+
});
|
|
69
|
+
const configPath = writeConfig(cwd, config);
|
|
70
|
+
p.log.success(`Created ${path.relative(cwd, configPath)}`);
|
|
71
|
+
p.outro("Run `versionguard validate` to verify your setup.");
|
|
72
|
+
return configPath;
|
|
73
|
+
}
|
|
74
|
+
function runHeadless(options) {
|
|
75
|
+
const existingConfig = findExistingConfig(options.cwd);
|
|
76
|
+
if (existingConfig && !options.yes) {
|
|
77
|
+
throw new Error(`Config already exists: ${existingConfig}. Use --yes to overwrite.`);
|
|
78
|
+
}
|
|
79
|
+
const config = buildConfig({
|
|
80
|
+
type: options.type ?? "semver",
|
|
81
|
+
format: options.format,
|
|
82
|
+
manifest: options.manifest,
|
|
83
|
+
hooks: options.hooks ?? true,
|
|
84
|
+
changelog: options.changelog ?? true
|
|
85
|
+
});
|
|
86
|
+
return writeConfig(options.cwd, config);
|
|
87
|
+
}
|
|
88
|
+
async function selectCalVerFormat() {
|
|
89
|
+
const preset = await p.select({
|
|
90
|
+
message: "CalVer format",
|
|
91
|
+
options: [
|
|
92
|
+
{ value: "YYYY.M.MICRO", label: "YYYY.M.MICRO", hint: "calver.org standard — 2026.3.0" },
|
|
93
|
+
{ value: "YYYY.MM.MICRO", label: "YYYY.MM.MICRO", hint: "padded month — 2026.03.0" },
|
|
94
|
+
{ value: "YY.0M.MICRO", label: "YY.0M.MICRO", hint: "Twisted/pip style — 26.03.0" },
|
|
95
|
+
{ value: "YYYY.0M.0D", label: "YYYY.0M.0D", hint: "date-based — 2026.03.25" },
|
|
96
|
+
{
|
|
97
|
+
value: "YYYY.0M.0D.MICRO",
|
|
98
|
+
label: "YYYY.0M.0D.MICRO",
|
|
99
|
+
hint: "youtube-dl style — 2026.03.25.0"
|
|
100
|
+
},
|
|
101
|
+
{ value: "YY.0M", label: "YY.0M", hint: "Ubuntu style — 26.03" },
|
|
102
|
+
{ value: "custom", label: "Custom...", hint: "enter your own token format" }
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
if (p.isCancel(preset)) return null;
|
|
106
|
+
if (preset === "custom") {
|
|
107
|
+
const custom = await p.text({
|
|
108
|
+
message: "Enter CalVer format (dot-separated tokens)",
|
|
109
|
+
placeholder: "YYYY.MM.MICRO",
|
|
110
|
+
validate(value) {
|
|
111
|
+
if (!value || !isValidCalVerFormat(value)) {
|
|
112
|
+
return "Invalid format. Use tokens: YYYY|YY|0Y, MM|M|0M, WW|0W, DD|D|0D, MICRO|PATCH";
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
if (p.isCancel(custom)) return null;
|
|
117
|
+
return custom;
|
|
118
|
+
}
|
|
119
|
+
return preset;
|
|
120
|
+
}
|
|
121
|
+
async function selectManifest(cwd) {
|
|
122
|
+
const detected = [];
|
|
123
|
+
const checks = [
|
|
124
|
+
{ file: "package.json", label: "package.json", hint: "Node.js / Bun" },
|
|
125
|
+
{ file: "Cargo.toml", label: "Cargo.toml", hint: "Rust" },
|
|
126
|
+
{ file: "pyproject.toml", label: "pyproject.toml", hint: "Python" },
|
|
127
|
+
{ file: "pubspec.yaml", label: "pubspec.yaml", hint: "Dart / Flutter" },
|
|
128
|
+
{ file: "composer.json", label: "composer.json", hint: "PHP" },
|
|
129
|
+
{ file: "pom.xml", label: "pom.xml", hint: "Java / Maven" },
|
|
130
|
+
{ file: "VERSION", label: "VERSION", hint: "Plain text file" }
|
|
131
|
+
];
|
|
132
|
+
for (const check of checks) {
|
|
133
|
+
if (fs.existsSync(path.join(cwd, check.file))) {
|
|
134
|
+
detected.push({ value: check.file, label: `${check.label} (detected)`, hint: check.hint });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const options = [
|
|
138
|
+
{ value: "auto", label: "Auto-detect", hint: "scan for known manifests at runtime" },
|
|
139
|
+
...detected,
|
|
140
|
+
...checks.filter((c) => !detected.some((d) => d.value === c.file)).map((c) => ({ value: c.file, label: c.label, hint: c.hint })),
|
|
141
|
+
{ value: "git-tag", label: "Git tags", hint: "Go / Swift — version from tags" }
|
|
142
|
+
];
|
|
143
|
+
const result = await p.select({
|
|
144
|
+
message: "Version source",
|
|
145
|
+
options,
|
|
146
|
+
initialValue: detected.length === 1 ? detected[0].value : "auto"
|
|
147
|
+
});
|
|
148
|
+
if (p.isCancel(result)) return null;
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
function buildConfig(input) {
|
|
152
|
+
const config = {
|
|
153
|
+
versioning: {
|
|
154
|
+
type: input.type,
|
|
155
|
+
...input.type === "calver" && input.format ? {
|
|
156
|
+
calver: {
|
|
157
|
+
format: input.format,
|
|
158
|
+
preventFutureDates: true
|
|
159
|
+
}
|
|
160
|
+
} : {}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
if (input.manifest) {
|
|
164
|
+
config.manifest = { source: input.manifest };
|
|
165
|
+
}
|
|
166
|
+
config.sync = {
|
|
167
|
+
files: ["README.md", "CHANGELOG.md"],
|
|
168
|
+
patterns: [
|
|
169
|
+
{
|
|
170
|
+
regex: `(version\\s*[=:]\\s*["'])(.+?)(["'])`,
|
|
171
|
+
template: "$1{{version}}$3"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
regex: "(##\\s*\\[)(.+?)(\\])",
|
|
175
|
+
template: "$1{{version}}$3"
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
};
|
|
179
|
+
config.changelog = {
|
|
180
|
+
enabled: input.changelog,
|
|
181
|
+
file: "CHANGELOG.md",
|
|
182
|
+
strict: true,
|
|
183
|
+
requireEntry: input.changelog
|
|
184
|
+
};
|
|
185
|
+
config.git = {
|
|
186
|
+
hooks: {
|
|
187
|
+
"pre-commit": input.hooks,
|
|
188
|
+
"pre-push": input.hooks,
|
|
189
|
+
"post-tag": input.hooks
|
|
190
|
+
},
|
|
191
|
+
enforceHooks: input.hooks
|
|
192
|
+
};
|
|
193
|
+
config.ignore = ["node_modules/**", "dist/**", ".git/**", "*.lock", ".changeset/**"];
|
|
194
|
+
return config;
|
|
195
|
+
}
|
|
196
|
+
function writeConfig(cwd, config) {
|
|
197
|
+
const configPath = path.join(cwd, ".versionguard.yml");
|
|
198
|
+
const content = yaml.dump(config, {
|
|
199
|
+
indent: 2,
|
|
200
|
+
lineWidth: 120,
|
|
201
|
+
noRefs: true,
|
|
202
|
+
quotingType: '"',
|
|
203
|
+
forceQuotes: false
|
|
204
|
+
});
|
|
205
|
+
fs.writeFileSync(configPath, content, "utf-8");
|
|
206
|
+
return configPath;
|
|
207
|
+
}
|
|
208
|
+
function findExistingConfig(cwd) {
|
|
209
|
+
for (const name of [
|
|
210
|
+
".versionguard.yml",
|
|
211
|
+
".versionguard.yaml",
|
|
212
|
+
"versionguard.yml",
|
|
213
|
+
"versionguard.yaml"
|
|
214
|
+
]) {
|
|
215
|
+
const full = path.join(cwd, name);
|
|
216
|
+
if (fs.existsSync(full)) return full;
|
|
217
|
+
}
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
8
220
|
const CLI_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
9
221
|
const CLI_VERSION = JSON.parse(fs.readFileSync(path.join(CLI_DIR, "..", "package.json"), "utf-8")).version;
|
|
10
222
|
const styles = {
|
|
@@ -18,33 +230,44 @@ const styles = {
|
|
|
18
230
|
function createProgram() {
|
|
19
231
|
const program = new Command();
|
|
20
232
|
program.name("versionguard").description("Strict versioning enforcement for SemVer and CalVer").version(CLI_VERSION);
|
|
21
|
-
program.command("init").description("Initialize VersionGuard configuration").option("-c, --cwd <path>", "Working directory", process.cwd()).
|
|
22
|
-
|
|
23
|
-
const configPath = initConfig(options.cwd);
|
|
24
|
-
console.log(styles.success(`✓ Created ${path.relative(options.cwd, configPath)}`));
|
|
233
|
+
program.command("init").description("Initialize VersionGuard configuration (interactive wizard or headless)").option("-c, --cwd <path>", "Working directory", process.cwd()).option("-t, --type <type>", "Versioning type: semver or calver").option("-f, --format <format>", "CalVer format tokens (e.g., YYYY.M.MICRO)").option("--manifest <source>", "Manifest source (e.g., Cargo.toml, pyproject.toml, auto)").option("--hooks", "Install git hooks (default: true)").option("--no-hooks", "Skip git hooks").option("--changelog", "Enable changelog validation (default: true)").option("--no-changelog", "Disable changelog validation").option("-y, --yes", "Accept all defaults, no prompts").action(
|
|
234
|
+
async (options) => {
|
|
25
235
|
try {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
236
|
+
const isHeadless = options.yes || options.type || options.format || options.manifest;
|
|
237
|
+
let configPath;
|
|
238
|
+
if (isHeadless) {
|
|
239
|
+
configPath = runHeadless({
|
|
240
|
+
cwd: options.cwd,
|
|
241
|
+
type: options.type,
|
|
242
|
+
format: options.format,
|
|
243
|
+
manifest: options.manifest,
|
|
244
|
+
hooks: options.hooks,
|
|
245
|
+
changelog: options.changelog,
|
|
246
|
+
yes: options.yes
|
|
247
|
+
});
|
|
248
|
+
console.log(styles.success(`✓ Created ${path.relative(options.cwd, configPath)}`));
|
|
249
|
+
} else {
|
|
250
|
+
configPath = await runWizard(options.cwd);
|
|
251
|
+
if (!configPath) {
|
|
252
|
+
process.exit(0);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
const config = getConfig(options.cwd);
|
|
258
|
+
if (config.git.enforceHooks) {
|
|
259
|
+
installHooks(config.git, options.cwd);
|
|
260
|
+
console.log(styles.success("✓ Git hooks installed"));
|
|
261
|
+
}
|
|
262
|
+
} catch {
|
|
263
|
+
console.log(styles.info("ℹ Skipped hooks install (not a git repository)"));
|
|
264
|
+
}
|
|
265
|
+
} catch (error) {
|
|
266
|
+
console.error(styles.error(`✗ ${error.message}`));
|
|
267
|
+
process.exit(1);
|
|
33
268
|
}
|
|
34
|
-
console.log("");
|
|
35
|
-
console.log(styles.info("Next steps:"));
|
|
36
|
-
console.log(" 1. Edit .versionguard.yml to set your versioning type");
|
|
37
|
-
console.log(" 2. Run: npx versionguard check");
|
|
38
|
-
console.log("");
|
|
39
|
-
console.log(
|
|
40
|
-
styles.info("Tip: Add a prepare script to package.json for clone persistence:")
|
|
41
|
-
);
|
|
42
|
-
console.log(' "prepare": "npx versionguard hooks install"');
|
|
43
|
-
} catch (error) {
|
|
44
|
-
console.error(styles.error(`✗ ${error.message}`));
|
|
45
|
-
process.exit(1);
|
|
46
269
|
}
|
|
47
|
-
|
|
270
|
+
);
|
|
48
271
|
program.command("check").description("Check the current version with actionable feedback").option("-c, --cwd <path>", "Working directory", process.cwd()).option("--prev <version>", "Previous version for comparison").option("--json", "Print machine-readable JSON output").action((options) => {
|
|
49
272
|
try {
|
|
50
273
|
const config = getConfig(options.cwd);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nconst CLI_DIR = path.dirname(fileURLToPath(import.meta.url));\nconst CLI_VERSION: string = (\n JSON.parse(fs.readFileSync(path.join(CLI_DIR, '..', 'package.json'), 'utf-8')) as {\n version: string;\n }\n).version;\n\nimport * as feedback from './feedback';\nimport * as fix from './fix';\nimport * as guard from './guard';\nimport * as versionguard from './index';\nimport * as project from './project';\nimport * as tag from './tag';\n\nconst styles = {\n error: chalk.red,\n warning: chalk.yellow,\n success: chalk.green,\n info: chalk.blue,\n dim: chalk.gray,\n bold: chalk.bold,\n};\n\n/**\n * Creates the VersionGuard CLI program definition.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This function wires all commands, options, and handlers onto a fresh Commander\n * program instance without parsing arguments yet.\n *\n * @returns A configured Commander program for the VersionGuard CLI.\n *\n * @example\n * ```typescript\n * const program = createProgram();\n * console.log(program.name());\n * ```\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('versionguard')\n .description('Strict versioning enforcement for SemVer and CalVer')\n .version(CLI_VERSION);\n\n program\n .command('init')\n .description('Initialize VersionGuard configuration')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const configPath = versionguard.initConfig(options.cwd);\n console.log(styles.success(`✓ Created ${path.relative(options.cwd, configPath)}`));\n\n // Auto-install hooks using the newly created config\n try {\n const config = versionguard.getConfig(options.cwd);\n versionguard.installHooks(config.git, options.cwd);\n console.log(styles.success('✓ Git hooks installed'));\n } catch {\n // Non-fatal: hooks install may fail in non-git environments\n console.log(\n styles.info('ℹ Skipped hooks install (not a git repository or hooks disabled)'),\n );\n }\n\n console.log('');\n console.log(styles.info('Next steps:'));\n console.log(' 1. Edit .versionguard.yml to set your versioning type');\n console.log(' 2. Run: npx versionguard check');\n console.log('');\n console.log(\n styles.info('Tip: Add a prepare script to package.json for clone persistence:'),\n );\n console.log(' \"prepare\": \"npx versionguard hooks install\"');\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('check')\n .description('Check the current version with actionable feedback')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--prev <version>', 'Previous version for comparison')\n .option('--json', 'Print machine-readable JSON output')\n .action((options: { cwd: string; prev?: string; json?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd, config.manifest);\n const result = feedback.getVersionFeedback(version, config, options.prev);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n version,\n versioningType: config.versioning.type,\n valid: result.valid,\n errors: result.errors,\n suggestions: result.suggestions,\n },\n null,\n 2,\n ),\n );\n if (!result.valid) {\n process.exit(1);\n }\n return;\n }\n\n console.log(styles.bold(`Current version: ${version}`));\n console.log(styles.dim(`Versioning type: ${config.versioning.type}`));\n console.log('');\n\n if (result.valid) {\n console.log(styles.success('✓ Version is valid'));\n return;\n }\n\n console.log(styles.error('✗ Version has issues:'));\n console.log('');\n for (const error of result.errors) {\n console.log(styles.error(` ✗ ${error.message}`));\n }\n if (result.suggestions.length > 0) {\n console.log('');\n console.log(styles.info('How to fix:'));\n for (const suggestion of result.suggestions) {\n console.log(` → ${suggestion.message}`);\n if (suggestion.fix) {\n console.log(styles.dim(` Run: ${suggestion.fix}`));\n }\n }\n }\n process.exit(1);\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('validate')\n .description('Run full validation with smart feedback')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--hook <name>', 'Running as git hook')\n .option('--json', 'Print machine-readable JSON output')\n .option('--strict', 'Run guard checks and fail on any policy gap or bypass')\n .action((options: { cwd: string; hook?: string; json?: boolean; strict?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd, config.manifest);\n const result = versionguard.validate(config, options.cwd);\n\n let postTagResult: { success: boolean; message: string; actions: string[] } | undefined;\n let guardReport: guard.GuardReport | undefined;\n\n if (options.hook === 'post-tag') {\n postTagResult = tag.handlePostTag(config, options.cwd);\n }\n\n if (options.strict) {\n guardReport = guard.runGuardChecks(config, options.cwd);\n }\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n ...result,\n hook: options.hook ?? null,\n postTag: postTagResult ?? null,\n guard: guardReport ?? null,\n },\n null,\n 2,\n ),\n );\n\n if (\n !result.valid ||\n (postTagResult && !postTagResult.success) ||\n (guardReport && !guardReport.safe)\n ) {\n process.exit(1);\n }\n\n return;\n }\n\n console.log(styles.bold(`Validating version ${version}...`));\n console.log('');\n\n if (!result.syncValid) {\n console.log(styles.error('Sync Issues:'));\n for (const error of result.errors.filter((item) => item.includes('mismatch'))) {\n const parts = error.match(\n /Version mismatch in (.+):(\\d+) - found \"(.+?)\" but expected \"(.+?)\"/,\n );\n if (!parts) {\n continue;\n }\n const suggestions = feedback.getSyncFeedback(parts[1], parts[3], parts[4]);\n console.log(styles.error(` ✗ ${parts[1]} has wrong version`));\n console.log(styles.dim(` Found: \"${parts[3]}\" Expected: \"${parts[4]}\"`));\n if (suggestions[0]?.fix) {\n console.log(styles.info(` Fix: ${suggestions[0].fix}`));\n }\n }\n console.log('');\n }\n\n if (config.changelog.enabled && !result.changelogValid) {\n console.log(styles.error('Changelog Issues:'));\n for (const error of result.errors.filter((item) =>\n item.toLowerCase().includes('changelog'),\n )) {\n console.log(styles.error(` ✗ ${error}`));\n }\n const suggestions = feedback.getChangelogFeedback(false, version);\n if (suggestions[0]?.fix) {\n console.log(styles.info(`Fix: ${suggestions[0].fix}`));\n }\n console.log('');\n }\n\n if (postTagResult) {\n if (!postTagResult.success) {\n console.log(styles.error(`✗ ${postTagResult.message}`));\n process.exit(1);\n }\n }\n\n if (guardReport && guardReport.warnings.length > 0) {\n console.log(styles.bold('Guard Checks:'));\n for (const warning of guardReport.warnings) {\n const icon = warning.severity === 'error' ? styles.error('✗') : styles.warning('⚠');\n console.log(` ${icon} [${warning.code}] ${warning.message}`);\n if (warning.fix) {\n console.log(styles.dim(` Fix: ${warning.fix}`));\n }\n }\n console.log('');\n }\n\n if (!result.valid || (guardReport && !guardReport.safe)) {\n console.log(styles.error('✗ Validation failed'));\n process.exit(1);\n }\n\n console.log(styles.success('✓ All validations passed'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('doctor')\n .description('Report repository readiness in one pass')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--json', 'Print machine-readable JSON output')\n .option('--strict', 'Include guard checks for bypass detection')\n .action((options: { cwd: string; json?: boolean; strict?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const report = versionguard.doctor(config, options.cwd);\n const guardReport = options.strict ? guard.runGuardChecks(config, options.cwd) : undefined;\n\n if (options.json) {\n console.log(JSON.stringify({ ...report, guard: guardReport ?? null }, null, 2));\n if (!report.ready || (guardReport && !guardReport.safe)) {\n process.exit(1);\n }\n return;\n }\n\n console.log(styles.bold('VersionGuard Doctor'));\n console.log(` Version: ${report.version || '(missing)'}`);\n console.log(` Version valid: ${report.versionValid ? 'yes' : 'no'}`);\n console.log(` Files in sync: ${report.syncValid ? 'yes' : 'no'}`);\n console.log(` Changelog ready: ${report.changelogValid ? 'yes' : 'no'}`);\n console.log(` Git repository: ${report.gitRepository ? 'yes' : 'no'}`);\n console.log(\n ` Hooks installed: ${report.gitRepository ? (report.hooksInstalled ? 'yes' : 'no') : 'n/a'}`,\n );\n console.log(\n ` Worktree clean: ${report.gitRepository ? (report.worktreeClean ? 'yes' : 'no') : 'n/a'}`,\n );\n\n if (guardReport) {\n console.log(` Guard safe: ${guardReport.safe ? 'yes' : 'no'}`);\n }\n\n if (!report.ready || (guardReport && !guardReport.safe)) {\n console.log('');\n console.log(styles.error('Issues:'));\n for (const error of report.errors) {\n console.log(styles.error(` ✗ ${error}`));\n }\n if (guardReport) {\n for (const warning of guardReport.warnings) {\n const icon = warning.severity === 'error' ? '✗' : '⚠';\n console.log(styles.error(` ${icon} [${warning.code}] ${warning.message}`));\n if (warning.fix) {\n console.log(styles.dim(` Fix: ${warning.fix}`));\n }\n }\n }\n process.exit(1);\n }\n\n console.log('');\n console.log(styles.success('✓ Repository is ready'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('fix')\n .description('Auto-fix detected issues')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd, config.manifest);\n const results = fix.fixAll(config, version, options.cwd);\n\n console.log(styles.bold(`Fixing issues for version ${version}...`));\n console.log('');\n\n for (const result of results) {\n const printer = result.fixed ? styles.success : styles.dim;\n console.log(printer(`${result.fixed ? '✓' : '•'} ${result.message}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('sync')\n .description('Sync version to all configured files')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd, config.manifest);\n const results = fix.fixSyncIssues(config, options.cwd);\n\n console.log(styles.bold(`Syncing version ${version}...`));\n for (const result of results) {\n const printer = result.fixed ? styles.success : styles.dim;\n console.log(printer(`${result.fixed ? '✓' : '•'} ${result.message}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('bump')\n .description('Suggest and optionally apply the next version')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('-t, --type <type>', 'Bump type (major, minor, patch, auto)')\n .option('--apply', 'Apply the first suggested version')\n .action(\n (options: { cwd: string; type?: 'major' | 'minor' | 'patch' | 'auto'; apply?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const currentVersion = versionguard.getPackageVersion(options.cwd, config.manifest);\n const suggestions = fix.suggestNextVersion(currentVersion, config, options.type);\n\n console.log(styles.bold(`Current version: ${currentVersion}`));\n console.log('');\n for (const [index, suggestion] of suggestions.entries()) {\n console.log(` ${index + 1}. ${styles.bold(suggestion.version)}`);\n console.log(` ${styles.dim(suggestion.reason)}`);\n }\n\n if (options.apply) {\n const nextVersion = suggestions[0]?.version;\n if (!nextVersion) {\n throw new Error('No version suggestion available');\n }\n project.setPackageVersion(nextVersion, options.cwd, config.manifest);\n fix.fixAll(config, nextVersion, options.cwd);\n console.log(styles.success(`✓ Updated to ${nextVersion}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n },\n );\n\n program\n .command('tag')\n .description('Create a git tag with automation')\n .argument('[version]', 'Version to tag (defaults to manifest version)')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('-m, --message <msg>', 'Tag message')\n .option('--no-fix', 'Skip auto-fixing files before tagging')\n .action(\n (version: string | undefined, options: { cwd: string; message?: string; fix?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const tagVersion =\n version || versionguard.getPackageVersion(options.cwd, config.manifest);\n const result = tag.createTag(\n tagVersion,\n options.message,\n options.fix !== false,\n config,\n options.cwd,\n );\n\n if (!result.success) {\n console.log(styles.error(`✗ ${result.message}`));\n process.exit(1);\n }\n\n console.log(styles.success(`✓ ${result.message}`));\n for (const action of result.actions) {\n console.log(` • ${action}`);\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n },\n );\n\n const hooksCommand = program.command('hooks').description('Manage git hooks');\n\n hooksCommand\n .command('install')\n .description('Install git hooks')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n versionguard.installHooks(config.git, options.cwd);\n console.log(styles.success('✓ Git hooks installed'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n hooksCommand\n .command('uninstall')\n .description('Uninstall git hooks')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n versionguard.uninstallHooks(options.cwd);\n console.log(styles.success('✓ Git hooks uninstalled'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n hooksCommand\n .command('status')\n .description('Check if hooks are installed')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n if (versionguard.areHooksInstalled(options.cwd)) {\n console.log(styles.success('✓ VersionGuard hooks are installed'));\n return;\n }\n\n console.log(styles.warning('✗ VersionGuard hooks are not installed'));\n process.exit(1);\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n return program;\n}\n\n/**\n * Parses CLI arguments and executes the matching command.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This helper delegates argument parsing to the Commander program created by\n * {@link createProgram}. It resolves when the selected command finishes.\n *\n * @param argv - Full argument vector to parse.\n * @see {@link createProgram}\n *\n * @example\n * ```typescript\n * const argv = ['node', 'versionguard', 'check'];\n * await runCli(argv);\n * ```\n */\nexport async function runCli(argv: string[] = process.argv): Promise<void> {\n await createProgram().parseAsync(argv);\n}\n\n/**\n * Determines whether the current module is the invoked CLI entry point.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This helper compares the resolved script path from `argv` with the current\n * module URL so the CLI runs only during direct execution.\n *\n * @param argv - Full process argument vector.\n * @param metaUrl - Module URL to compare against the invoked entry path.\n * @returns `true` when the current module should launch the CLI.\n *\n * @example\n * ```typescript\n * const shouldRun = shouldRunCli(process.argv, import.meta.url);\n * console.log(shouldRun);\n * ```\n */\nexport function shouldRunCli(\n argv: string[] = process.argv,\n metaUrl: string = import.meta.url,\n): boolean {\n const entryPath = argv[1] ? path.resolve(argv[1]) : null;\n return entryPath === fileURLToPath(metaUrl);\n}\n\n/* v8 ignore start -- exercised only by direct CLI execution */\nif (shouldRunCli()) {\n void runCli();\n}\n/* v8 ignore stop */\n"],"names":["versionguard.initConfig","versionguard.getConfig","versionguard.installHooks","versionguard.getPackageVersion","feedback.getVersionFeedback","versionguard.validate","tag.handlePostTag","guard.runGuardChecks","feedback.getSyncFeedback","feedback.getChangelogFeedback","versionguard.doctor","fix.fixAll","fix.fixSyncIssues","fix.suggestNextVersion","project.setPackageVersion","tag.createTag","versionguard.uninstallHooks","versionguard.areHooksInstalled"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../src/init-wizard.ts","../src/cli.ts"],"sourcesContent":["/**\n * Interactive setup wizard and headless init for VersionGuard.\n *\n * @packageDocumentation\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport * as p from '@clack/prompts';\nimport * as yaml from 'js-yaml';\n\nimport { isValidCalVerFormat } from './calver';\nimport type { VersionGuardConfig } from './types';\n\n/**\n * Options for headless (non-interactive) initialization.\n *\n * @public\n * @since 0.3.0\n */\nexport interface InitOptions {\n cwd: string;\n type?: 'semver' | 'calver';\n format?: string;\n manifest?: string;\n hooks?: boolean;\n changelog?: boolean;\n yes?: boolean;\n}\n\n/**\n * Runs the interactive setup wizard.\n *\n * @remarks\n * Walks the user through versioning type, CalVer format, manifest source,\n * git hooks, and changelog configuration. Writes `.versionguard.yml` when done.\n *\n * @param cwd - Project directory to initialize.\n * @returns The path to the created config file, or `null` if cancelled.\n *\n * @public\n * @since 0.3.0\n */\nexport async function runWizard(cwd: string): Promise<string | null> {\n p.intro('VersionGuard Setup');\n\n const existingConfig = findExistingConfig(cwd);\n if (existingConfig) {\n p.log.warning(`Config already exists: ${path.relative(cwd, existingConfig)}`);\n const overwrite = await p.confirm({ message: 'Overwrite existing config?' });\n if (p.isCancel(overwrite) || !overwrite) {\n p.outro('Setup cancelled.');\n return null;\n }\n }\n\n // Step 1: Versioning type\n const type = await p.select({\n message: 'Versioning strategy',\n options: [\n { value: 'semver', label: 'SemVer', hint: 'MAJOR.MINOR.PATCH (e.g., 1.2.3)' },\n { value: 'calver', label: 'CalVer', hint: 'Calendar-based (e.g., 2026.3.0)' },\n ],\n });\n if (p.isCancel(type)) {\n p.outro('Setup cancelled.');\n return null;\n }\n\n // Step 2: CalVer format (if calver)\n let format: string | undefined;\n if (type === 'calver') {\n const selected = await selectCalVerFormat();\n if (!selected) {\n p.outro('Setup cancelled.');\n return null;\n }\n format = selected;\n }\n\n // Step 3: Manifest source\n const manifest = await selectManifest(cwd);\n if (manifest === null) {\n p.outro('Setup cancelled.');\n return null;\n }\n\n // Step 4: Git hooks\n const hooks = await p.confirm({\n message: 'Install git hooks? (pre-commit, pre-push, post-tag)',\n initialValue: true,\n });\n if (p.isCancel(hooks)) {\n p.outro('Setup cancelled.');\n return null;\n }\n\n // Step 5: Changelog\n const changelog = await p.confirm({\n message: 'Enable changelog validation?',\n initialValue: true,\n });\n if (p.isCancel(changelog)) {\n p.outro('Setup cancelled.');\n return null;\n }\n\n // Build and write config\n const config = buildConfig({\n type: type,\n format,\n manifest: manifest === 'auto' ? undefined : manifest,\n hooks: hooks,\n changelog: changelog,\n });\n\n const configPath = writeConfig(cwd, config);\n\n p.log.success(`Created ${path.relative(cwd, configPath)}`);\n p.outro('Run `versionguard validate` to verify your setup.');\n\n return configPath;\n}\n\n/**\n * Initializes VersionGuard non-interactively using CLI flags.\n *\n * @remarks\n * When `--yes` is passed, all defaults are used without prompting.\n * Individual flags override specific defaults.\n *\n * @param options - Headless initialization options.\n * @returns The path to the created config file.\n *\n * @public\n * @since 0.3.0\n */\nexport function runHeadless(options: InitOptions): string {\n const existingConfig = findExistingConfig(options.cwd);\n if (existingConfig && !options.yes) {\n throw new Error(`Config already exists: ${existingConfig}. Use --yes to overwrite.`);\n }\n\n const config = buildConfig({\n type: options.type ?? 'semver',\n format: options.format,\n manifest: options.manifest,\n hooks: options.hooks ?? true,\n changelog: options.changelog ?? true,\n });\n\n return writeConfig(options.cwd, config);\n}\n\nasync function selectCalVerFormat(): Promise<string | null> {\n const preset = await p.select({\n message: 'CalVer format',\n options: [\n { value: 'YYYY.M.MICRO', label: 'YYYY.M.MICRO', hint: 'calver.org standard — 2026.3.0' },\n { value: 'YYYY.MM.MICRO', label: 'YYYY.MM.MICRO', hint: 'padded month — 2026.03.0' },\n { value: 'YY.0M.MICRO', label: 'YY.0M.MICRO', hint: 'Twisted/pip style — 26.03.0' },\n { value: 'YYYY.0M.0D', label: 'YYYY.0M.0D', hint: 'date-based — 2026.03.25' },\n {\n value: 'YYYY.0M.0D.MICRO',\n label: 'YYYY.0M.0D.MICRO',\n hint: 'youtube-dl style — 2026.03.25.0',\n },\n { value: 'YY.0M', label: 'YY.0M', hint: 'Ubuntu style — 26.03' },\n { value: 'custom', label: 'Custom...', hint: 'enter your own token format' },\n ],\n });\n if (p.isCancel(preset)) return null;\n\n if (preset === 'custom') {\n const custom = await p.text({\n message: 'Enter CalVer format (dot-separated tokens)',\n placeholder: 'YYYY.MM.MICRO',\n validate(value: string | undefined) {\n if (!value || !isValidCalVerFormat(value)) {\n return 'Invalid format. Use tokens: YYYY|YY|0Y, MM|M|0M, WW|0W, DD|D|0D, MICRO|PATCH';\n }\n },\n });\n if (p.isCancel(custom)) return null;\n return custom;\n }\n\n return preset as string;\n}\n\nasync function selectManifest(cwd: string): Promise<string | null> {\n // Detect what exists\n const detected: { value: string; label: string; hint?: string }[] = [];\n const checks = [\n { file: 'package.json', label: 'package.json', hint: 'Node.js / Bun' },\n { file: 'Cargo.toml', label: 'Cargo.toml', hint: 'Rust' },\n { file: 'pyproject.toml', label: 'pyproject.toml', hint: 'Python' },\n { file: 'pubspec.yaml', label: 'pubspec.yaml', hint: 'Dart / Flutter' },\n { file: 'composer.json', label: 'composer.json', hint: 'PHP' },\n { file: 'pom.xml', label: 'pom.xml', hint: 'Java / Maven' },\n { file: 'VERSION', label: 'VERSION', hint: 'Plain text file' },\n ];\n\n for (const check of checks) {\n if (fs.existsSync(path.join(cwd, check.file))) {\n detected.push({ value: check.file, label: `${check.label} (detected)`, hint: check.hint });\n }\n }\n\n const options = [\n { value: 'auto', label: 'Auto-detect', hint: 'scan for known manifests at runtime' },\n ...detected,\n ...checks\n .filter((c) => !detected.some((d) => d.value === c.file))\n .map((c) => ({ value: c.file, label: c.label, hint: c.hint })),\n { value: 'git-tag', label: 'Git tags', hint: 'Go / Swift — version from tags' },\n ];\n\n const result = await p.select({\n message: 'Version source',\n options,\n initialValue: detected.length === 1 ? detected[0].value : 'auto',\n });\n\n if (p.isCancel(result)) return null;\n return result;\n}\n\ninterface ConfigInput {\n type: 'semver' | 'calver';\n format?: string;\n manifest?: string;\n hooks: boolean;\n changelog: boolean;\n}\n\nfunction buildConfig(input: ConfigInput): Partial<VersionGuardConfig> {\n const config: Record<string, unknown> = {\n versioning: {\n type: input.type,\n ...(input.type === 'calver' && input.format\n ? {\n calver: {\n format: input.format,\n preventFutureDates: true,\n },\n }\n : {}),\n },\n };\n\n if (input.manifest) {\n config.manifest = { source: input.manifest };\n }\n\n config.sync = {\n files: ['README.md', 'CHANGELOG.md'],\n patterns: [\n {\n regex: '(version\\\\s*[=:]\\\\s*[\"\\'])(.+?)([\"\\'])',\n template: '$1{{version}}$3',\n },\n {\n regex: '(##\\\\s*\\\\[)(.+?)(\\\\])',\n template: '$1{{version}}$3',\n },\n ],\n };\n\n config.changelog = {\n enabled: input.changelog,\n file: 'CHANGELOG.md',\n strict: true,\n requireEntry: input.changelog,\n };\n\n config.git = {\n hooks: {\n 'pre-commit': input.hooks,\n 'pre-push': input.hooks,\n 'post-tag': input.hooks,\n },\n enforceHooks: input.hooks,\n };\n\n config.ignore = ['node_modules/**', 'dist/**', '.git/**', '*.lock', '.changeset/**'];\n\n return config;\n}\n\nfunction writeConfig(cwd: string, config: Partial<VersionGuardConfig>): string {\n const configPath = path.join(cwd, '.versionguard.yml');\n const content = yaml.dump(config, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n quotingType: '\"',\n forceQuotes: false,\n });\n fs.writeFileSync(configPath, content, 'utf-8');\n return configPath;\n}\n\nfunction findExistingConfig(cwd: string): string | null {\n for (const name of [\n '.versionguard.yml',\n '.versionguard.yaml',\n 'versionguard.yml',\n 'versionguard.yaml',\n ]) {\n const full = path.join(cwd, name);\n if (fs.existsSync(full)) return full;\n }\n return null;\n}\n","#!/usr/bin/env node\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\n\nconst CLI_DIR = path.dirname(fileURLToPath(import.meta.url));\nconst CLI_VERSION: string = (\n JSON.parse(fs.readFileSync(path.join(CLI_DIR, '..', 'package.json'), 'utf-8')) as {\n version: string;\n }\n).version;\n\nimport * as feedback from './feedback';\nimport * as fix from './fix';\nimport * as guard from './guard';\nimport * as versionguard from './index';\nimport { runHeadless, runWizard } from './init-wizard';\nimport * as project from './project';\nimport * as tag from './tag';\n\nconst styles = {\n error: chalk.red,\n warning: chalk.yellow,\n success: chalk.green,\n info: chalk.blue,\n dim: chalk.gray,\n bold: chalk.bold,\n};\n\n/**\n * Creates the VersionGuard CLI program definition.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This function wires all commands, options, and handlers onto a fresh Commander\n * program instance without parsing arguments yet.\n *\n * @returns A configured Commander program for the VersionGuard CLI.\n *\n * @example\n * ```typescript\n * const program = createProgram();\n * console.log(program.name());\n * ```\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('versionguard')\n .description('Strict versioning enforcement for SemVer and CalVer')\n .version(CLI_VERSION);\n\n program\n .command('init')\n .description('Initialize VersionGuard configuration (interactive wizard or headless)')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('-t, --type <type>', 'Versioning type: semver or calver')\n .option('-f, --format <format>', 'CalVer format tokens (e.g., YYYY.M.MICRO)')\n .option('--manifest <source>', 'Manifest source (e.g., Cargo.toml, pyproject.toml, auto)')\n .option('--hooks', 'Install git hooks (default: true)')\n .option('--no-hooks', 'Skip git hooks')\n .option('--changelog', 'Enable changelog validation (default: true)')\n .option('--no-changelog', 'Disable changelog validation')\n .option('-y, --yes', 'Accept all defaults, no prompts')\n .action(\n async (options: {\n cwd: string;\n type?: string;\n format?: string;\n manifest?: string;\n hooks?: boolean;\n changelog?: boolean;\n yes?: boolean;\n }) => {\n try {\n const isHeadless = options.yes || options.type || options.format || options.manifest;\n\n let configPath: string | null;\n\n if (isHeadless) {\n // Headless mode: use flags, no prompts\n configPath = runHeadless({\n cwd: options.cwd,\n type: options.type as 'semver' | 'calver' | undefined,\n format: options.format,\n manifest: options.manifest,\n hooks: options.hooks,\n changelog: options.changelog,\n yes: options.yes,\n });\n console.log(styles.success(`✓ Created ${path.relative(options.cwd, configPath)}`));\n } else {\n // Interactive wizard\n configPath = await runWizard(options.cwd);\n if (!configPath) {\n process.exit(0);\n return;\n }\n }\n\n // Auto-install hooks if enabled\n try {\n const config = versionguard.getConfig(options.cwd);\n if (config.git.enforceHooks) {\n versionguard.installHooks(config.git, options.cwd);\n console.log(styles.success('✓ Git hooks installed'));\n }\n } catch {\n console.log(styles.info('ℹ Skipped hooks install (not a git repository)'));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n },\n );\n\n program\n .command('check')\n .description('Check the current version with actionable feedback')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--prev <version>', 'Previous version for comparison')\n .option('--json', 'Print machine-readable JSON output')\n .action((options: { cwd: string; prev?: string; json?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd, config.manifest);\n const result = feedback.getVersionFeedback(version, config, options.prev);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n version,\n versioningType: config.versioning.type,\n valid: result.valid,\n errors: result.errors,\n suggestions: result.suggestions,\n },\n null,\n 2,\n ),\n );\n if (!result.valid) {\n process.exit(1);\n }\n return;\n }\n\n console.log(styles.bold(`Current version: ${version}`));\n console.log(styles.dim(`Versioning type: ${config.versioning.type}`));\n console.log('');\n\n if (result.valid) {\n console.log(styles.success('✓ Version is valid'));\n return;\n }\n\n console.log(styles.error('✗ Version has issues:'));\n console.log('');\n for (const error of result.errors) {\n console.log(styles.error(` ✗ ${error.message}`));\n }\n if (result.suggestions.length > 0) {\n console.log('');\n console.log(styles.info('How to fix:'));\n for (const suggestion of result.suggestions) {\n console.log(` → ${suggestion.message}`);\n if (suggestion.fix) {\n console.log(styles.dim(` Run: ${suggestion.fix}`));\n }\n }\n }\n process.exit(1);\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('validate')\n .description('Run full validation with smart feedback')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--hook <name>', 'Running as git hook')\n .option('--json', 'Print machine-readable JSON output')\n .option('--strict', 'Run guard checks and fail on any policy gap or bypass')\n .action((options: { cwd: string; hook?: string; json?: boolean; strict?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd, config.manifest);\n const result = versionguard.validate(config, options.cwd);\n\n let postTagResult: { success: boolean; message: string; actions: string[] } | undefined;\n let guardReport: guard.GuardReport | undefined;\n\n if (options.hook === 'post-tag') {\n postTagResult = tag.handlePostTag(config, options.cwd);\n }\n\n if (options.strict) {\n guardReport = guard.runGuardChecks(config, options.cwd);\n }\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n ...result,\n hook: options.hook ?? null,\n postTag: postTagResult ?? null,\n guard: guardReport ?? null,\n },\n null,\n 2,\n ),\n );\n\n if (\n !result.valid ||\n (postTagResult && !postTagResult.success) ||\n (guardReport && !guardReport.safe)\n ) {\n process.exit(1);\n }\n\n return;\n }\n\n console.log(styles.bold(`Validating version ${version}...`));\n console.log('');\n\n if (!result.syncValid) {\n console.log(styles.error('Sync Issues:'));\n for (const error of result.errors.filter((item) => item.includes('mismatch'))) {\n const parts = error.match(\n /Version mismatch in (.+):(\\d+) - found \"(.+?)\" but expected \"(.+?)\"/,\n );\n if (!parts) {\n continue;\n }\n const suggestions = feedback.getSyncFeedback(parts[1], parts[3], parts[4]);\n console.log(styles.error(` ✗ ${parts[1]} has wrong version`));\n console.log(styles.dim(` Found: \"${parts[3]}\" Expected: \"${parts[4]}\"`));\n if (suggestions[0]?.fix) {\n console.log(styles.info(` Fix: ${suggestions[0].fix}`));\n }\n }\n console.log('');\n }\n\n if (config.changelog.enabled && !result.changelogValid) {\n console.log(styles.error('Changelog Issues:'));\n for (const error of result.errors.filter((item) =>\n item.toLowerCase().includes('changelog'),\n )) {\n console.log(styles.error(` ✗ ${error}`));\n }\n const suggestions = feedback.getChangelogFeedback(false, version);\n if (suggestions[0]?.fix) {\n console.log(styles.info(`Fix: ${suggestions[0].fix}`));\n }\n console.log('');\n }\n\n if (postTagResult) {\n if (!postTagResult.success) {\n console.log(styles.error(`✗ ${postTagResult.message}`));\n process.exit(1);\n }\n }\n\n if (guardReport && guardReport.warnings.length > 0) {\n console.log(styles.bold('Guard Checks:'));\n for (const warning of guardReport.warnings) {\n const icon = warning.severity === 'error' ? styles.error('✗') : styles.warning('⚠');\n console.log(` ${icon} [${warning.code}] ${warning.message}`);\n if (warning.fix) {\n console.log(styles.dim(` Fix: ${warning.fix}`));\n }\n }\n console.log('');\n }\n\n if (!result.valid || (guardReport && !guardReport.safe)) {\n console.log(styles.error('✗ Validation failed'));\n process.exit(1);\n }\n\n console.log(styles.success('✓ All validations passed'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('doctor')\n .description('Report repository readiness in one pass')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('--json', 'Print machine-readable JSON output')\n .option('--strict', 'Include guard checks for bypass detection')\n .action((options: { cwd: string; json?: boolean; strict?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const report = versionguard.doctor(config, options.cwd);\n const guardReport = options.strict ? guard.runGuardChecks(config, options.cwd) : undefined;\n\n if (options.json) {\n console.log(JSON.stringify({ ...report, guard: guardReport ?? null }, null, 2));\n if (!report.ready || (guardReport && !guardReport.safe)) {\n process.exit(1);\n }\n return;\n }\n\n console.log(styles.bold('VersionGuard Doctor'));\n console.log(` Version: ${report.version || '(missing)'}`);\n console.log(` Version valid: ${report.versionValid ? 'yes' : 'no'}`);\n console.log(` Files in sync: ${report.syncValid ? 'yes' : 'no'}`);\n console.log(` Changelog ready: ${report.changelogValid ? 'yes' : 'no'}`);\n console.log(` Git repository: ${report.gitRepository ? 'yes' : 'no'}`);\n console.log(\n ` Hooks installed: ${report.gitRepository ? (report.hooksInstalled ? 'yes' : 'no') : 'n/a'}`,\n );\n console.log(\n ` Worktree clean: ${report.gitRepository ? (report.worktreeClean ? 'yes' : 'no') : 'n/a'}`,\n );\n\n if (guardReport) {\n console.log(` Guard safe: ${guardReport.safe ? 'yes' : 'no'}`);\n }\n\n if (!report.ready || (guardReport && !guardReport.safe)) {\n console.log('');\n console.log(styles.error('Issues:'));\n for (const error of report.errors) {\n console.log(styles.error(` ✗ ${error}`));\n }\n if (guardReport) {\n for (const warning of guardReport.warnings) {\n const icon = warning.severity === 'error' ? '✗' : '⚠';\n console.log(styles.error(` ${icon} [${warning.code}] ${warning.message}`));\n if (warning.fix) {\n console.log(styles.dim(` Fix: ${warning.fix}`));\n }\n }\n }\n process.exit(1);\n }\n\n console.log('');\n console.log(styles.success('✓ Repository is ready'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('fix')\n .description('Auto-fix detected issues')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd, config.manifest);\n const results = fix.fixAll(config, version, options.cwd);\n\n console.log(styles.bold(`Fixing issues for version ${version}...`));\n console.log('');\n\n for (const result of results) {\n const printer = result.fixed ? styles.success : styles.dim;\n console.log(printer(`${result.fixed ? '✓' : '•'} ${result.message}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('sync')\n .description('Sync version to all configured files')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const version = versionguard.getPackageVersion(options.cwd, config.manifest);\n const results = fix.fixSyncIssues(config, options.cwd);\n\n console.log(styles.bold(`Syncing version ${version}...`));\n for (const result of results) {\n const printer = result.fixed ? styles.success : styles.dim;\n console.log(printer(`${result.fixed ? '✓' : '•'} ${result.message}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n program\n .command('bump')\n .description('Suggest and optionally apply the next version')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('-t, --type <type>', 'Bump type (major, minor, patch, auto)')\n .option('--apply', 'Apply the first suggested version')\n .action(\n (options: { cwd: string; type?: 'major' | 'minor' | 'patch' | 'auto'; apply?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const currentVersion = versionguard.getPackageVersion(options.cwd, config.manifest);\n const suggestions = fix.suggestNextVersion(currentVersion, config, options.type);\n\n console.log(styles.bold(`Current version: ${currentVersion}`));\n console.log('');\n for (const [index, suggestion] of suggestions.entries()) {\n console.log(` ${index + 1}. ${styles.bold(suggestion.version)}`);\n console.log(` ${styles.dim(suggestion.reason)}`);\n }\n\n if (options.apply) {\n const nextVersion = suggestions[0]?.version;\n if (!nextVersion) {\n throw new Error('No version suggestion available');\n }\n project.setPackageVersion(nextVersion, options.cwd, config.manifest);\n fix.fixAll(config, nextVersion, options.cwd);\n console.log(styles.success(`✓ Updated to ${nextVersion}`));\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n },\n );\n\n program\n .command('tag')\n .description('Create a git tag with automation')\n .argument('[version]', 'Version to tag (defaults to manifest version)')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .option('-m, --message <msg>', 'Tag message')\n .option('--no-fix', 'Skip auto-fixing files before tagging')\n .action(\n (version: string | undefined, options: { cwd: string; message?: string; fix?: boolean }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n const tagVersion =\n version || versionguard.getPackageVersion(options.cwd, config.manifest);\n const result = tag.createTag(\n tagVersion,\n options.message,\n options.fix !== false,\n config,\n options.cwd,\n );\n\n if (!result.success) {\n console.log(styles.error(`✗ ${result.message}`));\n process.exit(1);\n }\n\n console.log(styles.success(`✓ ${result.message}`));\n for (const action of result.actions) {\n console.log(` • ${action}`);\n }\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n },\n );\n\n const hooksCommand = program.command('hooks').description('Manage git hooks');\n\n hooksCommand\n .command('install')\n .description('Install git hooks')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n const config = versionguard.getConfig(options.cwd);\n versionguard.installHooks(config.git, options.cwd);\n console.log(styles.success('✓ Git hooks installed'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n hooksCommand\n .command('uninstall')\n .description('Uninstall git hooks')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n versionguard.uninstallHooks(options.cwd);\n console.log(styles.success('✓ Git hooks uninstalled'));\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n hooksCommand\n .command('status')\n .description('Check if hooks are installed')\n .option('-c, --cwd <path>', 'Working directory', process.cwd())\n .action((options: { cwd: string }) => {\n try {\n if (versionguard.areHooksInstalled(options.cwd)) {\n console.log(styles.success('✓ VersionGuard hooks are installed'));\n return;\n }\n\n console.log(styles.warning('✗ VersionGuard hooks are not installed'));\n process.exit(1);\n } catch (error) {\n console.error(styles.error(`✗ ${(error as Error).message}`));\n process.exit(1);\n }\n });\n\n return program;\n}\n\n/**\n * Parses CLI arguments and executes the matching command.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This helper delegates argument parsing to the Commander program created by\n * {@link createProgram}. It resolves when the selected command finishes.\n *\n * @param argv - Full argument vector to parse.\n * @see {@link createProgram}\n *\n * @example\n * ```typescript\n * const argv = ['node', 'versionguard', 'check'];\n * await runCli(argv);\n * ```\n */\nexport async function runCli(argv: string[] = process.argv): Promise<void> {\n await createProgram().parseAsync(argv);\n}\n\n/**\n * Determines whether the current module is the invoked CLI entry point.\n *\n * @public\n * @since 0.1.0\n * @remarks\n * This helper compares the resolved script path from `argv` with the current\n * module URL so the CLI runs only during direct execution.\n *\n * @param argv - Full process argument vector.\n * @param metaUrl - Module URL to compare against the invoked entry path.\n * @returns `true` when the current module should launch the CLI.\n *\n * @example\n * ```typescript\n * const shouldRun = shouldRunCli(process.argv, import.meta.url);\n * console.log(shouldRun);\n * ```\n */\nexport function shouldRunCli(\n argv: string[] = process.argv,\n metaUrl: string = import.meta.url,\n): boolean {\n const entryPath = argv[1] ? path.resolve(argv[1]) : null;\n return entryPath === fileURLToPath(metaUrl);\n}\n\n/* v8 ignore start -- exercised only by direct CLI execution */\nif (shouldRunCli()) {\n void runCli();\n}\n/* v8 ignore stop */\n"],"names":["versionguard.getConfig","versionguard.installHooks","versionguard.getPackageVersion","feedback.getVersionFeedback","versionguard.validate","tag.handlePostTag","guard.runGuardChecks","feedback.getSyncFeedback","feedback.getChangelogFeedback","versionguard.doctor","fix.fixAll","fix.fixSyncIssues","fix.suggestNextVersion","project.setPackageVersion","tag.createTag","versionguard.uninstallHooks","versionguard.areHooksInstalled"],"mappings":"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"}
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAyDlD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,IAAI,kBAAkB,CAErD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CASrE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,CAajE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,GAAG,GAAE,MAAsB,GAAG,kBAAkB,CAGzE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAe9D"}
|
package/dist/feedback/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAElB;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,MAAM,EAAE,eAAe,EAAE,CAAC;IAE1B;;OAEG;IACH,WAAW,EAAE,UAAU,EAAE,CAAC;IAE1B;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,EAC1B,eAAe,CAAC,EAAE,MAAM,GACvB,cAAc,CAMhB;AAuPD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,UAAU,EAAE,CAyBd;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,MAAM,EACf,sBAAsB,CAAC,EAAE,MAAM,GAC9B,UAAU,EAAE,CAyBd;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,OAAO,GACxB,UAAU,EAAE,CAoBd"}
|
package/dist/fix/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ManifestConfig, type VersionGuardConfig } from '../types';
|
|
2
2
|
/**
|
|
3
3
|
* Auto-fix helpers for package versions, synced files, and changelog entries.
|
|
4
4
|
*
|
|
@@ -40,12 +40,17 @@ export interface FixResult {
|
|
|
40
40
|
*
|
|
41
41
|
* @param targetVersion - Version that should be written to `package.json`.
|
|
42
42
|
* @param cwd - Repository directory containing `package.json`.
|
|
43
|
+
* @param manifest - Optional manifest configuration for language-agnostic support.
|
|
43
44
|
* @returns The result of the package version fix attempt.
|
|
44
45
|
*
|
|
45
46
|
* @example
|
|
46
47
|
* ```typescript
|
|
48
|
+
* // Fix using legacy package.json fallback
|
|
47
49
|
* const result = fixPackageVersion('1.2.3', process.cwd());
|
|
48
50
|
* console.log(result.fixed);
|
|
51
|
+
*
|
|
52
|
+
* // Fix using a configured manifest source
|
|
53
|
+
* const result2 = fixPackageVersion('1.2.3', process.cwd(), { source: 'Cargo.toml' });
|
|
49
54
|
* ```
|
|
50
55
|
*/
|
|
51
56
|
export declare function fixPackageVersion(targetVersion: string, cwd?: string, manifest?: ManifestConfig): FixResult;
|
package/dist/fix/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fix/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fix/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEzF;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAsB,EAC3B,QAAQ,CAAC,EAAE,cAAc,GACxB,SAAS,CA8CX;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,kBAAkB,EAC1B,GAAG,GAAE,MAAsB,GAC1B,SAAS,EAAE,CAeb;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,EAC1B,GAAG,GAAE,MAAsB,GAC1B,SAAS,CA0BX;AA6BD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,MAAM,CACpB,MAAM,EAAE,kBAAkB,EAC1B,aAAa,CAAC,EAAE,MAAM,EACtB,GAAG,GAAE,MAAsB,GAC1B,SAAS,EAAE,CAmBb;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,kBAAkB,EAC1B,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAChD;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CA2CvC"}
|
package/dist/guard.d.ts
CHANGED
|
@@ -12,7 +12,11 @@ export interface GuardWarning {
|
|
|
12
12
|
severity: 'error' | 'warning';
|
|
13
13
|
/** Human-readable description of the issue. */
|
|
14
14
|
message: string;
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Suggested remediation command when available.
|
|
17
|
+
*
|
|
18
|
+
* @defaultValue `undefined`
|
|
19
|
+
*/
|
|
16
20
|
fix?: string;
|
|
17
21
|
}
|
|
18
22
|
/**
|
|
@@ -37,6 +41,14 @@ export interface GuardReport {
|
|
|
37
41
|
* @param cwd - Repository directory to inspect.
|
|
38
42
|
* @returns A guard warning when a hooksPath override is detected.
|
|
39
43
|
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* import { checkHooksPathOverride } from './guard';
|
|
47
|
+
*
|
|
48
|
+
* const warning = checkHooksPathOverride(process.cwd());
|
|
49
|
+
* if (warning) console.warn(warning.message);
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
40
52
|
* @public
|
|
41
53
|
* @since 0.2.0
|
|
42
54
|
*/
|
|
@@ -51,6 +63,14 @@ export declare function checkHooksPathOverride(cwd: string): GuardWarning | null
|
|
|
51
63
|
*
|
|
52
64
|
* @returns A guard warning when the HUSKY bypass is detected.
|
|
53
65
|
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* import { checkHuskyBypass } from './guard';
|
|
69
|
+
*
|
|
70
|
+
* const warning = checkHuskyBypass();
|
|
71
|
+
* if (warning) console.warn(warning.message);
|
|
72
|
+
* ```
|
|
73
|
+
*
|
|
54
74
|
* @public
|
|
55
75
|
* @since 0.2.0
|
|
56
76
|
*/
|
|
@@ -67,6 +87,14 @@ export declare function checkHuskyBypass(): GuardWarning | null;
|
|
|
67
87
|
* @param cwd - Repository directory to inspect.
|
|
68
88
|
* @returns Guard warnings for each hook that has been tampered with.
|
|
69
89
|
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```ts
|
|
92
|
+
* import { checkHookIntegrity } from './guard';
|
|
93
|
+
*
|
|
94
|
+
* const warnings = checkHookIntegrity(config, process.cwd());
|
|
95
|
+
* for (const w of warnings) console.warn(w.code, w.message);
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
70
98
|
* @public
|
|
71
99
|
* @since 0.2.0
|
|
72
100
|
*/
|
|
@@ -81,6 +109,14 @@ export declare function checkHookIntegrity(config: VersionGuardConfig, cwd: stri
|
|
|
81
109
|
* @param config - VersionGuard configuration to inspect.
|
|
82
110
|
* @returns A guard warning when hooks are enabled but not enforced.
|
|
83
111
|
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```ts
|
|
114
|
+
* import { checkEnforceHooksPolicy } from './guard';
|
|
115
|
+
*
|
|
116
|
+
* const warning = checkEnforceHooksPolicy(config);
|
|
117
|
+
* if (warning) console.warn(warning.message);
|
|
118
|
+
* ```
|
|
119
|
+
*
|
|
84
120
|
* @public
|
|
85
121
|
* @since 0.2.0
|
|
86
122
|
*/
|
|
@@ -97,6 +133,14 @@ export declare function checkEnforceHooksPolicy(config: VersionGuardConfig): Gua
|
|
|
97
133
|
* @param cwd - Repository directory to inspect.
|
|
98
134
|
* @returns A guard report with all findings.
|
|
99
135
|
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```ts
|
|
138
|
+
* import { runGuardChecks } from './guard';
|
|
139
|
+
*
|
|
140
|
+
* const report = runGuardChecks(config, process.cwd());
|
|
141
|
+
* if (!report.safe) console.error('Guard check failed:', report.warnings);
|
|
142
|
+
* ```
|
|
143
|
+
*
|
|
100
144
|
* @public
|
|
101
145
|
* @since 0.2.0
|
|
102
146
|
*/
|
package/dist/guard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAIlD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAIlD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,IAAI,EAAE,OAAO,CAAC;IACd,yCAAyC;IACzC,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAkCvE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAWtD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAkD1F;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CAcvF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CA2BnF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @packageDocumentation
|
|
5
5
|
* @public
|
|
6
6
|
*/
|
|
7
|
-
import type
|
|
7
|
+
import { type DoctorReport, type FullValidationResult, type ValidationResult, type VersionGuardConfig } from './types';
|
|
8
8
|
export * as calver from './calver';
|
|
9
9
|
export { validateChangelog } from './changelog';
|
|
10
10
|
export { getConfig, initConfig } from './config';
|