@dzhechkov/harness-core 0.3.5 → 0.3.6
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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/publish.d.ts +35 -0
- package/dist/publish.d.ts.map +1 -0
- package/dist/publish.js +87 -0
- package/dist/publish.js.map +1 -0
- package/package.json +3 -3
- package/src/index.ts +2 -0
- package/src/publish.ts +121 -0
package/dist/index.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export { checkUpstream, loadSourcesManifest } from './sync-upstream.js';
|
|
|
16
16
|
export type { SyncUpstreamReport, UpstreamCheckResult, SourcesManifest } from './sync-upstream.js';
|
|
17
17
|
export { benchmarkSkill, benchmarkSkills, compareSkills } from './benchmark.js';
|
|
18
18
|
export { buildRegistry, searchRegistry, filterByCategory } from './registry.js';
|
|
19
|
+
export { discoverPackages, publishPackages } from './publish.js';
|
|
20
|
+
export type { PublishResult, PublishReport } from './publish.js';
|
|
19
21
|
export type { RegistryEntry, Registry } from './registry.js';
|
|
20
22
|
export type { BenchmarkCheck, BenchmarkScore, BenchmarkReport, CompareResult } from './benchmark.js';
|
|
21
23
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAE5C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACxE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAE5C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACxE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,4 +14,5 @@ export { createSkill } from './create-skill.js';
|
|
|
14
14
|
export { checkUpstream, loadSourcesManifest } from './sync-upstream.js';
|
|
15
15
|
export { benchmarkSkill, benchmarkSkills, compareSkills } from './benchmark.js';
|
|
16
16
|
export { buildRegistry, searchRegistry, filterByCategory } from './registry.js';
|
|
17
|
+
export { discoverPackages, publishPackages } from './publish.js';
|
|
17
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE5C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE5C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automated publish — discovers changed packages, bumps patch versions,
|
|
3
|
+
* builds, and publishes to npm.
|
|
4
|
+
*
|
|
5
|
+
* @packageDocumentation
|
|
6
|
+
*/
|
|
7
|
+
/** Result for a single package publish attempt. */
|
|
8
|
+
export interface PublishResult {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly oldVersion: string;
|
|
11
|
+
readonly newVersion: string;
|
|
12
|
+
readonly status: 'published' | 'skipped' | 'error';
|
|
13
|
+
readonly error?: string | undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Full publish report. */
|
|
16
|
+
export interface PublishReport {
|
|
17
|
+
readonly packages: readonly PublishResult[];
|
|
18
|
+
readonly published: number;
|
|
19
|
+
readonly skipped: number;
|
|
20
|
+
readonly errors: number;
|
|
21
|
+
readonly dryRun: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** Discover all publishable @dzhechkov packages. */
|
|
24
|
+
export declare function discoverPackages(monorepoRoot: string): {
|
|
25
|
+
name: string;
|
|
26
|
+
dir: string;
|
|
27
|
+
version: string;
|
|
28
|
+
}[];
|
|
29
|
+
/** Publish packages that have changes since last publish. */
|
|
30
|
+
export declare function publishPackages(monorepoRoot: string, opts?: {
|
|
31
|
+
dryRun?: boolean | undefined;
|
|
32
|
+
filter?: string[] | undefined;
|
|
33
|
+
bumpOnly?: boolean | undefined;
|
|
34
|
+
}): PublishReport;
|
|
35
|
+
//# sourceMappingURL=publish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AASD,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAavG;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3B,GACL,aAAa,CA4Df"}
|
package/dist/publish.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automated publish — discovers changed packages, bumps patch versions,
|
|
3
|
+
* builds, and publishes to npm.
|
|
4
|
+
*
|
|
5
|
+
* @packageDocumentation
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync, readdirSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { execSync } from 'node:child_process';
|
|
10
|
+
/** Bump patch version: 0.3.11 → 0.3.12 */
|
|
11
|
+
function bumpPatch(version) {
|
|
12
|
+
const parts = version.split('.');
|
|
13
|
+
const patch = parseInt(parts[2] ?? '0', 10);
|
|
14
|
+
return `${parts[0]}.${parts[1]}.${patch + 1}`;
|
|
15
|
+
}
|
|
16
|
+
/** Discover all publishable @dzhechkov packages. */
|
|
17
|
+
export function discoverPackages(monorepoRoot) {
|
|
18
|
+
const baseDir = join(monorepoRoot, 'packages', '@dzhechkov');
|
|
19
|
+
if (!existsSync(baseDir))
|
|
20
|
+
return [];
|
|
21
|
+
return readdirSync(baseDir, { withFileTypes: true })
|
|
22
|
+
.filter((e) => e.isDirectory())
|
|
23
|
+
.map((e) => {
|
|
24
|
+
const pkgPath = join(baseDir, e.name, 'package.json');
|
|
25
|
+
if (!existsSync(pkgPath))
|
|
26
|
+
return undefined;
|
|
27
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
28
|
+
return { name: pkg.name, dir: join(baseDir, e.name), version: pkg.version };
|
|
29
|
+
})
|
|
30
|
+
.filter((p) => p !== undefined);
|
|
31
|
+
}
|
|
32
|
+
/** Publish packages that have changes since last publish. */
|
|
33
|
+
export function publishPackages(monorepoRoot, opts = {}) {
|
|
34
|
+
const packages = discoverPackages(monorepoRoot);
|
|
35
|
+
const results = [];
|
|
36
|
+
const filtered = opts.filter && opts.filter.length > 0
|
|
37
|
+
? packages.filter((p) => opts.filter.some((f) => p.name.includes(f) || p.dir.includes(f)))
|
|
38
|
+
: packages;
|
|
39
|
+
for (const pkg of filtered) {
|
|
40
|
+
const oldVersion = pkg.version;
|
|
41
|
+
const newVersion = bumpPatch(oldVersion);
|
|
42
|
+
if (opts.dryRun) {
|
|
43
|
+
results.push({ name: pkg.name, oldVersion, newVersion, status: 'skipped' });
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
// Bump version in package.json
|
|
48
|
+
const pkgJsonPath = join(pkg.dir, 'package.json');
|
|
49
|
+
const pkgJson = readFileSync(pkgJsonPath, 'utf-8');
|
|
50
|
+
writeFileSync(pkgJsonPath, pkgJson.replace(`"version": "${oldVersion}"`, `"version": "${newVersion}"`));
|
|
51
|
+
if (opts.bumpOnly) {
|
|
52
|
+
results.push({ name: pkg.name, oldVersion, newVersion, status: 'published' });
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Build if has build script
|
|
56
|
+
const parsed = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
57
|
+
if (parsed.scripts?.['build']) {
|
|
58
|
+
execSync('pnpm build', { cwd: pkg.dir, stdio: 'pipe', encoding: 'utf-8' });
|
|
59
|
+
}
|
|
60
|
+
// Publish
|
|
61
|
+
execSync('pnpm publish --access public --no-git-checks', {
|
|
62
|
+
cwd: pkg.dir,
|
|
63
|
+
stdio: 'pipe',
|
|
64
|
+
encoding: 'utf-8',
|
|
65
|
+
env: { ...process.env },
|
|
66
|
+
});
|
|
67
|
+
results.push({ name: pkg.name, oldVersion, newVersion, status: 'published' });
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
results.push({
|
|
71
|
+
name: pkg.name,
|
|
72
|
+
oldVersion,
|
|
73
|
+
newVersion,
|
|
74
|
+
status: 'error',
|
|
75
|
+
error: err instanceof Error ? err.message : String(err),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
packages: results,
|
|
81
|
+
published: results.filter((r) => r.status === 'published').length,
|
|
82
|
+
skipped: results.filter((r) => r.status === 'skipped').length,
|
|
83
|
+
errors: results.filter((r) => r.status === 'error').length,
|
|
84
|
+
dryRun: opts.dryRun === true,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/harness-core",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.6",
|
|
4
4
|
"description": "Shared harness logic - skill loading, additive apply, and the init/sync/verify/doctor operations.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
"yaml": "^2.0.0",
|
|
28
28
|
"@dzhechkov/adapter-claude": "0.2.0",
|
|
29
29
|
"@dzhechkov/adapter-hermes": "0.2.0",
|
|
30
|
+
"@dzhechkov/core": "0.2.0",
|
|
30
31
|
"@dzhechkov/adapter-opencode": "0.2.0",
|
|
31
|
-
"@dzhechkov/adapter-codex": "0.2.0",
|
|
32
32
|
"@dzhechkov/adapter-openclaude": "0.1.0",
|
|
33
|
-
"@dzhechkov/
|
|
33
|
+
"@dzhechkov/adapter-codex": "0.2.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/node": "^25.6.0",
|
package/src/index.ts
CHANGED
|
@@ -18,5 +18,7 @@ export { checkUpstream, loadSourcesManifest } from './sync-upstream.js';
|
|
|
18
18
|
export type { SyncUpstreamReport, UpstreamCheckResult, SourcesManifest } from './sync-upstream.js';
|
|
19
19
|
export { benchmarkSkill, benchmarkSkills, compareSkills } from './benchmark.js';
|
|
20
20
|
export { buildRegistry, searchRegistry, filterByCategory } from './registry.js';
|
|
21
|
+
export { discoverPackages, publishPackages } from './publish.js';
|
|
22
|
+
export type { PublishResult, PublishReport } from './publish.js';
|
|
21
23
|
export type { RegistryEntry, Registry } from './registry.js';
|
|
22
24
|
export type { BenchmarkCheck, BenchmarkScore, BenchmarkReport, CompareResult } from './benchmark.js';
|
package/src/publish.ts
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automated publish — discovers changed packages, bumps patch versions,
|
|
3
|
+
* builds, and publishes to npm.
|
|
4
|
+
*
|
|
5
|
+
* @packageDocumentation
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { existsSync, readFileSync, writeFileSync, readdirSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
|
|
12
|
+
/** Result for a single package publish attempt. */
|
|
13
|
+
export interface PublishResult {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly oldVersion: string;
|
|
16
|
+
readonly newVersion: string;
|
|
17
|
+
readonly status: 'published' | 'skipped' | 'error';
|
|
18
|
+
readonly error?: string | undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Full publish report. */
|
|
22
|
+
export interface PublishReport {
|
|
23
|
+
readonly packages: readonly PublishResult[];
|
|
24
|
+
readonly published: number;
|
|
25
|
+
readonly skipped: number;
|
|
26
|
+
readonly errors: number;
|
|
27
|
+
readonly dryRun: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Bump patch version: 0.3.11 → 0.3.12 */
|
|
31
|
+
function bumpPatch(version: string): string {
|
|
32
|
+
const parts = version.split('.');
|
|
33
|
+
const patch = parseInt(parts[2] ?? '0', 10);
|
|
34
|
+
return `${parts[0]}.${parts[1]}.${patch + 1}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Discover all publishable @dzhechkov packages. */
|
|
38
|
+
export function discoverPackages(monorepoRoot: string): { name: string; dir: string; version: string }[] {
|
|
39
|
+
const baseDir = join(monorepoRoot, 'packages', '@dzhechkov');
|
|
40
|
+
if (!existsSync(baseDir)) return [];
|
|
41
|
+
|
|
42
|
+
return readdirSync(baseDir, { withFileTypes: true })
|
|
43
|
+
.filter((e) => e.isDirectory())
|
|
44
|
+
.map((e) => {
|
|
45
|
+
const pkgPath = join(baseDir, e.name, 'package.json');
|
|
46
|
+
if (!existsSync(pkgPath)) return undefined;
|
|
47
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { name: string; version: string };
|
|
48
|
+
return { name: pkg.name, dir: join(baseDir, e.name), version: pkg.version };
|
|
49
|
+
})
|
|
50
|
+
.filter((p): p is { name: string; dir: string; version: string } => p !== undefined);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Publish packages that have changes since last publish. */
|
|
54
|
+
export function publishPackages(
|
|
55
|
+
monorepoRoot: string,
|
|
56
|
+
opts: {
|
|
57
|
+
dryRun?: boolean | undefined;
|
|
58
|
+
filter?: string[] | undefined;
|
|
59
|
+
bumpOnly?: boolean | undefined;
|
|
60
|
+
} = {},
|
|
61
|
+
): PublishReport {
|
|
62
|
+
const packages = discoverPackages(monorepoRoot);
|
|
63
|
+
const results: PublishResult[] = [];
|
|
64
|
+
const filtered = opts.filter && opts.filter.length > 0
|
|
65
|
+
? packages.filter((p) => opts.filter!.some((f) => p.name.includes(f) || p.dir.includes(f)))
|
|
66
|
+
: packages;
|
|
67
|
+
|
|
68
|
+
for (const pkg of filtered) {
|
|
69
|
+
const oldVersion = pkg.version;
|
|
70
|
+
const newVersion = bumpPatch(oldVersion);
|
|
71
|
+
|
|
72
|
+
if (opts.dryRun) {
|
|
73
|
+
results.push({ name: pkg.name, oldVersion, newVersion, status: 'skipped' });
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
// Bump version in package.json
|
|
79
|
+
const pkgJsonPath = join(pkg.dir, 'package.json');
|
|
80
|
+
const pkgJson = readFileSync(pkgJsonPath, 'utf-8');
|
|
81
|
+
writeFileSync(pkgJsonPath, pkgJson.replace(`"version": "${oldVersion}"`, `"version": "${newVersion}"`));
|
|
82
|
+
|
|
83
|
+
if (opts.bumpOnly) {
|
|
84
|
+
results.push({ name: pkg.name, oldVersion, newVersion, status: 'published' });
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Build if has build script
|
|
89
|
+
const parsed = JSON.parse(readFileSync(pkgJsonPath, 'utf-8')) as { scripts?: Record<string, string> };
|
|
90
|
+
if (parsed.scripts?.['build']) {
|
|
91
|
+
execSync('pnpm build', { cwd: pkg.dir, stdio: 'pipe', encoding: 'utf-8' });
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Publish
|
|
95
|
+
execSync('pnpm publish --access public --no-git-checks', {
|
|
96
|
+
cwd: pkg.dir,
|
|
97
|
+
stdio: 'pipe',
|
|
98
|
+
encoding: 'utf-8',
|
|
99
|
+
env: { ...process.env },
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
results.push({ name: pkg.name, oldVersion, newVersion, status: 'published' });
|
|
103
|
+
} catch (err) {
|
|
104
|
+
results.push({
|
|
105
|
+
name: pkg.name,
|
|
106
|
+
oldVersion,
|
|
107
|
+
newVersion,
|
|
108
|
+
status: 'error',
|
|
109
|
+
error: err instanceof Error ? err.message : String(err),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
packages: results,
|
|
116
|
+
published: results.filter((r) => r.status === 'published').length,
|
|
117
|
+
skipped: results.filter((r) => r.status === 'skipped').length,
|
|
118
|
+
errors: results.filter((r) => r.status === 'error').length,
|
|
119
|
+
dryRun: opts.dryRun === true,
|
|
120
|
+
};
|
|
121
|
+
}
|