@radkode/neo 1.3.0 → 1.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.
@@ -0,0 +1,17 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ type BumpType = 'major' | 'minor' | 'patch' | 'empty';
3
+ interface ChangesetOptions {
4
+ bump?: string;
5
+ summary?: string;
6
+ package?: string;
7
+ }
8
+ interface ChangesetResult {
9
+ path: string;
10
+ bump: BumpType;
11
+ packages: string[];
12
+ summary: string;
13
+ }
14
+ export declare function executeChangeset(cwd: string, options: ChangesetOptions): Promise<ChangesetResult>;
15
+ export declare function createChangesetCommand(): Command;
16
+ export {};
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/changeset/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAUtD,KAAK,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAItD,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AA6JD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAmF1B;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAsDhD"}
@@ -0,0 +1,251 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ import inquirer from 'inquirer';
3
+ import { access, readFile, readdir, writeFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { ui } from '../../utils/ui.js';
6
+ import { emitJson } from '../../utils/output.js';
7
+ import { runAction } from '../../utils/run-action.js';
8
+ import { NonInteractiveError, promptSelect } from '../../utils/prompt.js';
9
+ import { getRuntimeContext } from '../../utils/runtime-context.js';
10
+ const BUMP_VALUES = ['major', 'minor', 'patch', 'empty'];
11
+ async function pathExists(p) {
12
+ try {
13
+ await access(p);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ async function readJson(path) {
21
+ const raw = await readFile(path, 'utf-8');
22
+ return JSON.parse(raw);
23
+ }
24
+ async function discoverPackages(cwd) {
25
+ const rootPkg = await readJson(join(cwd, 'package.json'));
26
+ const workspacePatterns = [];
27
+ if (Array.isArray(rootPkg.workspaces)) {
28
+ workspacePatterns.push(...rootPkg.workspaces);
29
+ }
30
+ else if (rootPkg.workspaces?.packages) {
31
+ workspacePatterns.push(...rootPkg.workspaces.packages);
32
+ }
33
+ const pnpmWorkspacePath = join(cwd, 'pnpm-workspace.yaml');
34
+ if (await pathExists(pnpmWorkspacePath)) {
35
+ const yaml = await readFile(pnpmWorkspacePath, 'utf-8');
36
+ const lines = yaml.split('\n');
37
+ let inPackages = false;
38
+ for (const line of lines) {
39
+ if (/^packages\s*:/.test(line)) {
40
+ inPackages = true;
41
+ continue;
42
+ }
43
+ if (inPackages) {
44
+ const match = line.match(/^\s*-\s*['"]?([^'"]+?)['"]?\s*$/);
45
+ if (match?.[1])
46
+ workspacePatterns.push(match[1]);
47
+ else if (line.trim() && !line.startsWith(' ') && !line.startsWith('\t'))
48
+ break;
49
+ }
50
+ }
51
+ }
52
+ if (workspacePatterns.length === 0) {
53
+ if (rootPkg.name && !rootPkg.private)
54
+ return [rootPkg.name];
55
+ if (rootPkg.name)
56
+ return [rootPkg.name];
57
+ throw new Error('Root package.json is missing a "name" field.');
58
+ }
59
+ const names = new Set();
60
+ for (const pattern of workspacePatterns) {
61
+ const trimmed = pattern.replace(/\/\*$/, '');
62
+ const base = join(cwd, trimmed);
63
+ if (!(await pathExists(base)))
64
+ continue;
65
+ const isGlob = pattern.endsWith('/*');
66
+ const candidates = isGlob
67
+ ? (await readdir(base, { withFileTypes: true }))
68
+ .filter((d) => d.isDirectory())
69
+ .map((d) => join(base, d.name))
70
+ : [base];
71
+ for (const dir of candidates) {
72
+ const pkgPath = join(dir, 'package.json');
73
+ if (!(await pathExists(pkgPath)))
74
+ continue;
75
+ try {
76
+ const pkg = await readJson(pkgPath);
77
+ if (pkg.name && !pkg.private)
78
+ names.add(pkg.name);
79
+ }
80
+ catch {
81
+ continue;
82
+ }
83
+ }
84
+ }
85
+ if (names.size === 0) {
86
+ throw new Error('No publishable packages found in workspaces.');
87
+ }
88
+ return [...names];
89
+ }
90
+ const ADJECTIVES = [
91
+ 'brisk', 'bright', 'bold', 'busy', 'calm', 'clever', 'curious', 'eager',
92
+ 'fierce', 'gentle', 'happy', 'jolly', 'keen', 'lucky', 'mellow', 'nimble',
93
+ 'quiet', 'quick', 'rapid', 'silent', 'snappy', 'spry', 'swift', 'tidy',
94
+ 'vivid', 'warm', 'witty', 'zesty',
95
+ ];
96
+ const ANIMALS = [
97
+ 'ants', 'bees', 'cats', 'crows', 'deer', 'dogs', 'eels', 'foxes',
98
+ 'frogs', 'geckos', 'goats', 'hares', 'hawks', 'jays', 'lions', 'lynx',
99
+ 'moles', 'moths', 'newts', 'owls', 'pandas', 'pigs', 'quails', 'rabbits',
100
+ 'seals', 'tigers', 'wolves', 'yaks',
101
+ ];
102
+ const VERBS = [
103
+ 'bake', 'bounce', 'cheer', 'dance', 'dream', 'glow', 'hike', 'jump',
104
+ 'laugh', 'march', 'paint', 'race', 'sing', 'skate', 'smile', 'sparkle',
105
+ 'swim', 'think', 'wander', 'wave',
106
+ ];
107
+ function pick(list) {
108
+ return list[Math.floor(Math.random() * list.length)];
109
+ }
110
+ function generateChangesetName() {
111
+ return `${pick(ADJECTIVES)}-${pick(ANIMALS)}-${pick(VERBS)}`;
112
+ }
113
+ function parseBump(raw) {
114
+ if (!raw)
115
+ return undefined;
116
+ const normalized = raw.trim().toLowerCase();
117
+ if (BUMP_VALUES.includes(normalized)) {
118
+ return normalized;
119
+ }
120
+ throw new Error(`Invalid --bump "${raw}". Expected one of: ${BUMP_VALUES.join(', ')}.`);
121
+ }
122
+ async function ensureUniquePath(cwd) {
123
+ for (let attempt = 0; attempt < 8; attempt++) {
124
+ const name = generateChangesetName();
125
+ const path = join(cwd, '.changeset', `${name}.md`);
126
+ if (!(await pathExists(path)))
127
+ return path;
128
+ }
129
+ return join(cwd, '.changeset', `neo-${Date.now()}.md`);
130
+ }
131
+ function formatChangesetBody(bump, packages, summary) {
132
+ if (bump === 'empty') {
133
+ return '---\n---\n';
134
+ }
135
+ const lines = packages.map((name) => `'${name}': ${bump}`);
136
+ return `---\n${lines.join('\n')}\n---\n\n${summary.trim()}\n`;
137
+ }
138
+ export async function executeChangeset(cwd, options) {
139
+ const configPath = join(cwd, '.changeset', 'config.json');
140
+ if (!(await pathExists(configPath))) {
141
+ throw new Error('No .changeset/config.json found. Run `pnpm dlx @changesets/cli init` first.');
142
+ }
143
+ const ctx = getRuntimeContext();
144
+ const bumpArg = parseBump(options.bump);
145
+ const bump = bumpArg ??
146
+ (await promptSelect({
147
+ message: 'What kind of change is this?',
148
+ flag: '--bump',
149
+ choices: [
150
+ { label: 'patch — bugfix, no behavior change for consumers', value: 'patch' },
151
+ { label: 'minor — backwards-compatible feature', value: 'minor' },
152
+ { label: 'major — breaking change', value: 'major' },
153
+ { label: 'empty — no package version bump (tooling/docs only)', value: 'empty' },
154
+ ],
155
+ defaultValue: 'patch',
156
+ }));
157
+ let packages = [];
158
+ if (bump !== 'empty') {
159
+ const discovered = await discoverPackages(cwd);
160
+ if (options.package) {
161
+ const requested = options.package.split(',').map((s) => s.trim()).filter(Boolean);
162
+ const unknown = requested.filter((name) => !discovered.includes(name));
163
+ if (unknown.length > 0) {
164
+ throw new Error(`Unknown package(s): ${unknown.join(', ')}. Known: ${discovered.join(', ')}.`);
165
+ }
166
+ packages = requested;
167
+ }
168
+ else if (discovered.length === 1) {
169
+ packages = discovered;
170
+ }
171
+ else {
172
+ if (ctx.yes || ctx.nonInteractive) {
173
+ throw new NonInteractiveError('Select package(s) to bump', '--package <name>[,<name>...]');
174
+ }
175
+ const { selected } = await inquirer.prompt([
176
+ {
177
+ type: 'checkbox',
178
+ name: 'selected',
179
+ message: 'Which packages are affected?',
180
+ choices: discovered.map((name) => ({ name, value: name })),
181
+ validate: (choices) => choices.length > 0 ? true : 'Pick at least one package.',
182
+ },
183
+ ]);
184
+ packages = selected;
185
+ }
186
+ }
187
+ let summary = options.summary?.trim() ?? '';
188
+ if (bump !== 'empty' && !summary) {
189
+ if (ctx.yes || ctx.nonInteractive) {
190
+ throw new NonInteractiveError('Changeset summary', '--summary "<text>"');
191
+ }
192
+ const answer = await inquirer.prompt([
193
+ {
194
+ type: 'input',
195
+ name: 'summary',
196
+ message: 'One-line summary (shown in the changelog):',
197
+ validate: (input) => (input.trim() ? true : 'Summary cannot be empty.'),
198
+ },
199
+ ]);
200
+ summary = answer.summary.trim();
201
+ }
202
+ const path = await ensureUniquePath(cwd);
203
+ const body = formatChangesetBody(bump, packages, summary);
204
+ await writeFile(path, body, 'utf-8');
205
+ return { path, bump, packages, summary };
206
+ }
207
+ export function createChangesetCommand() {
208
+ const command = new Command('changeset');
209
+ command
210
+ .description('Create a changeset file (bump type + summary) under .changeset/')
211
+ .option('--bump <level>', 'bump level: major, minor, patch, or empty')
212
+ .option('--summary <text>', 'one-line summary for the changelog')
213
+ .option('--package <names>', 'comma-separated package names (monorepos)')
214
+ .addHelpText('after', `
215
+ Examples:
216
+ Interactive (prompts for bump + summary):
217
+ $ neo changeset
218
+
219
+ Non-interactive minor bump with summary:
220
+ $ neo changeset --yes --bump minor --summary "Add neo sync command"
221
+
222
+ Empty changeset (CLAUDE.md rule for tooling/docs-only changes):
223
+ $ neo changeset --yes --bump empty
224
+
225
+ Agent-friendly:
226
+ $ neo changeset --yes --json --bump patch --summary "Fix parse edge case"
227
+ `)
228
+ .action(runAction(async (options) => {
229
+ const result = await executeChangeset(process.cwd(), options);
230
+ emitJson({
231
+ ok: true,
232
+ command: 'changeset',
233
+ path: result.path,
234
+ bump: result.bump,
235
+ packages: result.packages,
236
+ summary: result.summary,
237
+ }, {
238
+ text: () => {
239
+ ui.success(`Wrote ${result.path}`);
240
+ if (result.bump === 'empty') {
241
+ ui.muted('Empty changeset — no package version bump.');
242
+ }
243
+ else {
244
+ ui.muted(`${result.bump} bump for ${result.packages.join(', ')}`);
245
+ }
246
+ },
247
+ });
248
+ }));
249
+ return command;
250
+ }
251
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/changeset/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAI/D,MAAM,WAAW,GAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AAevF,KAAK,UAAU,UAAU,CAAC,CAAS;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAI,IAAY;IACrC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;AAC9B,CAAC;AAYD,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAI3B,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;IAE9B,MAAM,iBAAiB,GAAa,EAAE,CAAC;IAEvC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,iBAAiB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;QACxC,iBAAiB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IAC3D,IAAI,MAAM,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAGxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,UAAU,GAAG,IAAI,CAAC;gBAClB,SAAS;YACX,CAAC;YACD,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAC5D,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;oBAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,MAAM;YACjF,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QAGxC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAAE,SAAS;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,MAAM;YACvB,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;iBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACX,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;gBAAE,SAAS;YAC3C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAuC,OAAO,CAAC,CAAC;gBAC1E,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO;oBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO;IACvE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ;IACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;CAClC,CAAC;AACF,MAAM,OAAO,GAAG;IACd,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAChE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS;IACxE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;CACpC,CAAC;AACF,MAAM,KAAK,GAAG;IACZ,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACnE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;IACtE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM;CAClC,CAAC;AAEF,SAAS,IAAI,CAAI,IAAkB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAM,CAAC;AAC5D,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS,CAAC,GAAuB;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAK,WAAiC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,OAAO,UAAsB,CAAC;IAChC,CAAC;IACD,MAAM,IAAI,KAAK,CACb,mBAAmB,GAAG,uBAAuB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACvE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,qBAAqB,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IAC7C,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAAc,EACd,QAAkB,EAClB,OAAe;IAEf,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC;IAC3D,OAAO,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,OAAyB;IAEzB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,MAAM,IAAI,GAAa,OAAO;QAC5B,CAAC,MAAM,YAAY,CAAW;YAC5B,OAAO,EAAE,8BAA8B;YACvC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,kDAAkD,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC7E,EAAE,KAAK,EAAE,sCAAsC,EAAE,KAAK,EAAE,OAAO,EAAE;gBACjE,EAAE,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE;gBACpD,EAAE,KAAK,EAAE,qDAAqD,EAAE,KAAK,EAAE,OAAO,EAAE;aACjF;YACD,YAAY,EAAE,OAAO;SACtB,CAAC,CAAC,CAAC;IAEN,IAAI,QAAQ,GAAa,EAAE,CAAC;IAC5B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAE/C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClF,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9E,CAAC;YACJ,CAAC;YACD,QAAQ,GAAG,SAAS,CAAC;QACvB,CAAC;aAAM,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,QAAQ,GAAG,UAAU,CAAC;QACxB,CAAC;aAAM,CAAC;YAEN,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;gBAClC,MAAM,IAAI,mBAAmB,CAC3B,2BAA2B,EAC3B,8BAA8B,CAC/B,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;gBACjE;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,8BAA8B;oBACvC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1D,QAAQ,EAAE,CAAC,OAA0B,EAAE,EAAE,CACvC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B;iBAC3D;aACF,CAAC,CAAC;YACH,QAAQ,GAAG,QAAQ,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,mBAAmB,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAsB;YACxD;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,4CAA4C;gBACrD,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC;aAChF;SACF,CAAC,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE1D,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAErC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAEzC,OAAO;SACJ,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,oCAAoC,CAAC;SAChE,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;SACxE,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;CAaL,CACI;SACA,MAAM,CACL,SAAS,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QAC9D,QAAQ,CACN;YACE,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,EACD;YACE,IAAI,EAAE,GAAG,EAAE;gBACT,EAAE,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACnC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC5B,EAAE,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBACzD,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,KAAK,CACN,GAAG,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxD,CAAC;gBACJ,CAAC;YACH,CAAC;SACF,CACF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -10,4 +10,7 @@ export { createUpdateCommand } from './update/index.js';
10
10
  export { createAgentCommand } from './agent/index.js';
11
11
  export { createCompletionsCommand } from './completions/index.js';
12
12
  export { createSchemaCommand } from './schema/index.js';
13
+ export { createSyncCommand } from './sync/index.js';
14
+ export { createVerifyCommand } from './verify/index.js';
15
+ export { createChangesetCommand } from './changeset/index.js';
13
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAYtD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAWvD;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAetD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAcvD;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -8,6 +8,9 @@ import { createAliasCommand } from './alias/index.js';
8
8
  import { createAgentCommand } from './agent/index.js';
9
9
  import { createCompletionsCommand } from './completions/index.js';
10
10
  import { createSchemaCommand } from './schema/index.js';
11
+ import { createSyncCommand } from './sync/index.js';
12
+ import { createVerifyCommand } from './verify/index.js';
13
+ import { createChangesetCommand } from './changeset/index.js';
11
14
  export function registerCommands(program) {
12
15
  program.addCommand(createInitCommand());
13
16
  program.addCommand(createConfigCommand());
@@ -19,6 +22,9 @@ export function registerCommands(program) {
19
22
  program.addCommand(createAgentCommand());
20
23
  program.addCommand(createCompletionsCommand());
21
24
  program.addCommand(createSchemaCommand());
25
+ program.addCommand(createSyncCommand());
26
+ program.addCommand(createVerifyCommand());
27
+ program.addCommand(createChangesetCommand());
22
28
  }
23
29
  export { createInitCommand } from './init/index.js';
24
30
  export { createConfigCommand } from './config/index.js';
@@ -30,4 +36,7 @@ export { createUpdateCommand } from './update/index.js';
30
36
  export { createAgentCommand } from './agent/index.js';
31
37
  export { createCompletionsCommand } from './completions/index.js';
32
38
  export { createSchemaCommand } from './schema/index.js';
39
+ export { createSyncCommand } from './sync/index.js';
40
+ export { createVerifyCommand } from './verify/index.js';
41
+ export { createChangesetCommand } from './changeset/index.js';
33
42
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ interface SyncOptions {
3
+ merge?: boolean;
4
+ branch?: string;
5
+ stash?: boolean;
6
+ }
7
+ interface SyncResult {
8
+ branch: string;
9
+ base: string;
10
+ strategy: 'rebase' | 'merge';
11
+ stashed: boolean;
12
+ ahead: number;
13
+ behind: number;
14
+ }
15
+ export declare function executeSync(options: SyncOptions): Promise<SyncResult>;
16
+ export declare function createSyncCommand(): Command;
17
+ export {};
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAatD,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AA6CD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA4G3E;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAqD3C"}
@@ -0,0 +1,193 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ import { execa } from 'execa';
3
+ import { ui } from '../../utils/ui.js';
4
+ import { emitJson } from '../../utils/output.js';
5
+ import { runAction } from '../../utils/run-action.js';
6
+ import { GitErrors, isAuthenticationError, isConflictError, isNetworkError, isNotGitRepository, } from '../../utils/git-errors.js';
7
+ async function detectDefaultBranch() {
8
+ try {
9
+ const { stdout } = await execa('git', ['symbolic-ref', 'refs/remotes/origin/HEAD']);
10
+ return stdout.replace('refs/remotes/origin/', '').trim();
11
+ }
12
+ catch {
13
+ for (const name of ['main', 'master']) {
14
+ try {
15
+ await execa('git', ['show-ref', '--verify', '--quiet', `refs/remotes/origin/${name}`]);
16
+ return name;
17
+ }
18
+ catch {
19
+ continue;
20
+ }
21
+ }
22
+ throw new Error('Could not detect default branch. Run `git remote set-head origin --auto`, or pass --branch <name>.');
23
+ }
24
+ }
25
+ async function getCurrentBranch() {
26
+ const { stdout } = await execa('git', ['branch', '--show-current']);
27
+ return stdout.trim();
28
+ }
29
+ async function isTreeDirty() {
30
+ const { stdout } = await execa('git', ['status', '--porcelain']);
31
+ return stdout.trim().length > 0;
32
+ }
33
+ async function tryPopStash() {
34
+ try {
35
+ await execa('git', ['stash', 'pop']);
36
+ ui.muted('Restored stashed changes.');
37
+ }
38
+ catch {
39
+ ui.warn('Stash pop failed; run `git stash list` to recover.');
40
+ }
41
+ }
42
+ export async function executeSync(options) {
43
+ try {
44
+ await execa('git', ['rev-parse', '--is-inside-work-tree']);
45
+ }
46
+ catch (error) {
47
+ if (isNotGitRepository(error)) {
48
+ throw GitErrors.notARepository('sync');
49
+ }
50
+ throw GitErrors.unknown('sync', error);
51
+ }
52
+ const currentBranch = await getCurrentBranch();
53
+ if (!currentBranch) {
54
+ throw new Error('Detached HEAD — check out a branch before syncing.');
55
+ }
56
+ const targetBranch = options.branch ?? (await detectDefaultBranch());
57
+ const strategy = options.merge ? 'merge' : 'rebase';
58
+ const allowStash = options.stash !== false;
59
+ let stashed = false;
60
+ if (await isTreeDirty()) {
61
+ if (!allowStash) {
62
+ throw new Error('Working tree has uncommitted changes. Commit them first, or drop --no-stash to auto-stash.');
63
+ }
64
+ const stashSpinner = ui.spinner('Stashing local changes');
65
+ stashSpinner.start();
66
+ try {
67
+ await execa('git', [
68
+ 'stash',
69
+ 'push',
70
+ '--include-untracked',
71
+ '--message',
72
+ 'neo sync: auto-stash',
73
+ ]);
74
+ stashed = true;
75
+ stashSpinner.succeed('Stashed local changes');
76
+ }
77
+ catch (error) {
78
+ stashSpinner.fail('Failed to stash local changes');
79
+ throw GitErrors.unknown('sync', error);
80
+ }
81
+ }
82
+ const rebaseTarget = `origin/${targetBranch}`;
83
+ const fetchSpinner = ui.spinner(`Fetching ${rebaseTarget}`);
84
+ fetchSpinner.start();
85
+ try {
86
+ await execa('git', ['fetch', 'origin', targetBranch]);
87
+ fetchSpinner.succeed(`Fetched ${rebaseTarget}`);
88
+ }
89
+ catch (error) {
90
+ fetchSpinner.fail('Fetch failed');
91
+ if (stashed)
92
+ await tryPopStash();
93
+ if (isAuthenticationError(error))
94
+ throw GitErrors.authenticationFailed('sync');
95
+ if (isNetworkError(error))
96
+ throw GitErrors.networkError('sync');
97
+ throw GitErrors.unknown('sync', error);
98
+ }
99
+ const verb = strategy === 'rebase' ? 'Rebasing' : 'Merging';
100
+ const applySpinner = ui.spinner(`${verb} onto ${rebaseTarget}`);
101
+ applySpinner.start();
102
+ try {
103
+ if (strategy === 'rebase') {
104
+ await execa('git', ['rebase', rebaseTarget]);
105
+ }
106
+ else {
107
+ await execa('git', ['merge', '--no-ff', rebaseTarget]);
108
+ }
109
+ applySpinner.succeed(`${verb === 'Rebasing' ? 'Rebased' : 'Merged'} onto ${rebaseTarget}`);
110
+ }
111
+ catch (error) {
112
+ applySpinner.fail(`${verb} failed`);
113
+ if (isConflictError(error)) {
114
+ if (strategy === 'rebase')
115
+ throw GitErrors.rebaseConflict('sync');
116
+ throw GitErrors.mergeConflict('sync');
117
+ }
118
+ throw GitErrors.unknown('sync', error);
119
+ }
120
+ if (stashed) {
121
+ const popSpinner = ui.spinner('Restoring stashed changes');
122
+ popSpinner.start();
123
+ try {
124
+ await execa('git', ['stash', 'pop']);
125
+ popSpinner.succeed('Restored stashed changes');
126
+ }
127
+ catch {
128
+ popSpinner.warn('Stash pop had conflicts — left stash in place. Run `git stash list`.');
129
+ }
130
+ }
131
+ const { stdout } = await execa('git', [
132
+ 'rev-list',
133
+ '--left-right',
134
+ '--count',
135
+ `${rebaseTarget}...HEAD`,
136
+ ]);
137
+ const [behindStr, aheadStr] = stdout.trim().split(/\s+/);
138
+ const behind = Number.parseInt(behindStr ?? '0', 10) || 0;
139
+ const ahead = Number.parseInt(aheadStr ?? '0', 10) || 0;
140
+ return {
141
+ branch: currentBranch,
142
+ base: targetBranch,
143
+ strategy,
144
+ stashed,
145
+ ahead,
146
+ behind,
147
+ };
148
+ }
149
+ export function createSyncCommand() {
150
+ const command = new Command('sync');
151
+ command
152
+ .description('Rebase the current branch onto origin/<default-branch>, auto-stashing if dirty')
153
+ .option('--merge', 'use merge (--no-ff) instead of rebase')
154
+ .option('--branch <name>', 'sync against a specific remote branch (default: origin HEAD)')
155
+ .option('--no-stash', 'do not auto-stash a dirty tree — fail instead')
156
+ .addHelpText('after', `
157
+ Examples:
158
+ Rebase current branch onto origin/<default>:
159
+ $ neo sync
160
+
161
+ Merge instead of rebase:
162
+ $ neo sync --merge
163
+
164
+ Sync against a non-default base:
165
+ $ neo sync --branch develop
166
+
167
+ Agent-friendly (structured output):
168
+ $ neo sync --yes --json
169
+ `)
170
+ .action(runAction(async (options) => {
171
+ const result = await executeSync(options);
172
+ emitJson({
173
+ ok: true,
174
+ command: 'sync',
175
+ branch: result.branch,
176
+ base: result.base,
177
+ strategy: result.strategy,
178
+ stashed: result.stashed,
179
+ ahead: result.ahead,
180
+ behind: result.behind,
181
+ }, {
182
+ text: () => {
183
+ ui.success(`Synced ${result.branch} onto origin/${result.base}`);
184
+ ui.muted(`ahead: ${result.ahead}, behind: ${result.behind}`);
185
+ if (result.stashed) {
186
+ ui.muted('auto-stash restored');
187
+ }
188
+ },
189
+ });
190
+ }));
191
+ return command;
192
+ }
193
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sync/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';
3
+ interface VerifyOptions {
4
+ pm?: string;
5
+ only?: string;
6
+ skip?: string;
7
+ }
8
+ interface ScriptResult {
9
+ script: string;
10
+ status: 'passed' | 'failed' | 'skipped';
11
+ durationMs: number;
12
+ exitCode?: number;
13
+ }
14
+ interface VerifyResult {
15
+ packageManager: PackageManager;
16
+ results: ScriptResult[];
17
+ ok: boolean;
18
+ totalDurationMs: number;
19
+ }
20
+ export declare function executeVerify(cwd: string, options: VerifyOptions): Promise<VerifyResult>;
21
+ export declare function createVerifyCommand(): Command;
22
+ export {};
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/verify/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAQtD,KAAK,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAatD,UAAU,aAAa;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;CACzB;AA8DD,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAqD9F;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CA6D7C"}
@@ -0,0 +1,155 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ import { execa } from 'execa';
3
+ import { access, readFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { ui } from '../../utils/ui.js';
6
+ import { emitJson } from '../../utils/output.js';
7
+ import { runAction } from '../../utils/run-action.js';
8
+ const LOCKFILES = [
9
+ { file: 'pnpm-lock.yaml', pm: 'pnpm' },
10
+ { file: 'yarn.lock', pm: 'yarn' },
11
+ { file: 'bun.lock', pm: 'bun' },
12
+ { file: 'bun.lockb', pm: 'bun' },
13
+ { file: 'package-lock.json', pm: 'npm' },
14
+ ];
15
+ const DEFAULT_SCRIPTS = ['build', 'test', 'lint', 'typecheck'];
16
+ async function pathExists(p) {
17
+ try {
18
+ await access(p);
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ async function detectPackageManager(cwd) {
26
+ const present = await Promise.all(LOCKFILES.map(async ({ file, pm }) => ((await pathExists(join(cwd, file))) ? pm : null)));
27
+ const found = [...new Set(present.filter((x) => x !== null))];
28
+ if (found.length === 0) {
29
+ throw new Error('No lockfile found. Expected one of: pnpm-lock.yaml, yarn.lock, bun.lock, package-lock.json. Pass --pm <name> to override.');
30
+ }
31
+ if (found.length > 1) {
32
+ ui.warn(`Multiple lockfiles detected (${found.join(', ')}). Using ${found[0]}. Pass --pm to disambiguate.`);
33
+ }
34
+ return found[0];
35
+ }
36
+ async function readScripts(cwd) {
37
+ const pkgPath = join(cwd, 'package.json');
38
+ if (!(await pathExists(pkgPath))) {
39
+ throw new Error('No package.json in current directory.');
40
+ }
41
+ const raw = await readFile(pkgPath, 'utf-8');
42
+ const pkg = JSON.parse(raw);
43
+ return pkg.scripts ?? {};
44
+ }
45
+ function parseFilter(value) {
46
+ if (!value)
47
+ return null;
48
+ return value
49
+ .split(',')
50
+ .map((s) => s.trim())
51
+ .filter(Boolean);
52
+ }
53
+ function pickScripts(scripts, only, skip) {
54
+ const base = only ?? DEFAULT_SCRIPTS;
55
+ const skipSet = new Set(skip ?? []);
56
+ return base.filter((s) => s in scripts && !skipSet.has(s));
57
+ }
58
+ function pmArgs(pm, script) {
59
+ if (pm === 'npm')
60
+ return ['run', script];
61
+ return ['run', script];
62
+ }
63
+ export async function executeVerify(cwd, options) {
64
+ const only = parseFilter(options.only);
65
+ const skip = parseFilter(options.skip);
66
+ const pm = options.pm
67
+ ? options.pm
68
+ : await detectPackageManager(cwd);
69
+ const scripts = await readScripts(cwd);
70
+ const toRun = pickScripts(scripts, only, skip);
71
+ if (toRun.length === 0) {
72
+ throw new Error(`No matching scripts found in package.json. Looked for: ${(only ?? DEFAULT_SCRIPTS).join(', ')}.`);
73
+ }
74
+ const results = [];
75
+ const startedAt = Date.now();
76
+ for (const script of toRun) {
77
+ const scriptSpinner = ui.spinner(`${pm} run ${script}`);
78
+ scriptSpinner.start();
79
+ const t0 = Date.now();
80
+ try {
81
+ await execa(pm, pmArgs(pm, script), {
82
+ cwd,
83
+ stdio: ['ignore', 'pipe', 'pipe'],
84
+ });
85
+ const durationMs = Date.now() - t0;
86
+ scriptSpinner.succeed(`${script} passed (${Math.round(durationMs / 100) / 10}s)`);
87
+ results.push({ script, status: 'passed', durationMs });
88
+ }
89
+ catch (error) {
90
+ const durationMs = Date.now() - t0;
91
+ const exitCode = typeof error.exitCode === 'number'
92
+ ? error.exitCode
93
+ : 1;
94
+ scriptSpinner.fail(`${script} failed (${Math.round(durationMs / 100) / 10}s)`);
95
+ const stderr = error.stderr ?? '';
96
+ const stdout = error.stdout ?? '';
97
+ const tail = (stderr || stdout).trim().split('\n').slice(-20).join('\n');
98
+ if (tail)
99
+ ui.muted(tail);
100
+ results.push({ script, status: 'failed', durationMs, exitCode });
101
+ }
102
+ }
103
+ const totalDurationMs = Date.now() - startedAt;
104
+ const ok = results.every((r) => r.status !== 'failed');
105
+ return { packageManager: pm, results, ok, totalDurationMs };
106
+ }
107
+ export function createVerifyCommand() {
108
+ const command = new Command('verify');
109
+ command
110
+ .description('Run build, test, lint, and typecheck scripts and summarize results')
111
+ .option('--pm <name>', 'force a specific package manager (pnpm|npm|yarn|bun)')
112
+ .option('--only <scripts>', 'comma-separated subset to run (e.g. build,test)')
113
+ .option('--skip <scripts>', 'comma-separated scripts to skip')
114
+ .addHelpText('after', `
115
+ Examples:
116
+ Run every verify step the repo defines:
117
+ $ neo verify
118
+
119
+ Just build and test:
120
+ $ neo verify --only build,test
121
+
122
+ Skip lint (useful while iterating):
123
+ $ neo verify --skip lint
124
+
125
+ Agent-friendly (structured pass/fail):
126
+ $ neo verify --json
127
+ `)
128
+ .action(runAction(async (options) => {
129
+ const result = await executeVerify(process.cwd(), options);
130
+ emitJson({
131
+ ok: result.ok,
132
+ command: 'verify',
133
+ packageManager: result.packageManager,
134
+ results: result.results,
135
+ totalDurationMs: result.totalDurationMs,
136
+ }, {
137
+ text: () => {
138
+ ui.newline();
139
+ const passed = result.results.filter((r) => r.status === 'passed').length;
140
+ const failed = result.results.filter((r) => r.status === 'failed').length;
141
+ if (result.ok) {
142
+ ui.success(`All ${passed} script(s) passed in ${Math.round(result.totalDurationMs / 100) / 10}s`);
143
+ }
144
+ else {
145
+ ui.error(`${failed} of ${result.results.length} script(s) failed`);
146
+ }
147
+ },
148
+ });
149
+ if (!result.ok) {
150
+ process.exitCode = 1;
151
+ }
152
+ }));
153
+ return command;
154
+ }
155
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/verify/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@radkode/neo",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Modern CLI toolkit with intelligent git workflows and configuration management",
5
5
  "author": "Jacek Radko",
6
6
  "license": "MIT",