@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 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
@@ -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"}
@@ -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.5",
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/core": "0.2.0"
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
+ }