@openreef/cli 0.4.0 → 0.5.1

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.
Files changed (61) hide show
  1. package/README.md +15 -1
  2. package/dist/commands/diff.d.ts +9 -0
  3. package/dist/commands/diff.d.ts.map +1 -0
  4. package/dist/commands/diff.js +34 -0
  5. package/dist/commands/diff.js.map +1 -0
  6. package/dist/commands/install.d.ts.map +1 -1
  7. package/dist/commands/install.js +32 -7
  8. package/dist/commands/install.js.map +1 -1
  9. package/dist/commands/lock.d.ts +5 -1
  10. package/dist/commands/lock.d.ts.map +1 -1
  11. package/dist/commands/lock.js +37 -3
  12. package/dist/commands/lock.js.map +1 -1
  13. package/dist/commands/logs.d.ts.map +1 -1
  14. package/dist/commands/logs.js +261 -13
  15. package/dist/commands/logs.js.map +1 -1
  16. package/dist/commands/publish.d.ts +8 -0
  17. package/dist/commands/publish.d.ts.map +1 -0
  18. package/dist/commands/publish.js +146 -0
  19. package/dist/commands/publish.js.map +1 -0
  20. package/dist/commands/update.d.ts.map +1 -1
  21. package/dist/commands/update.js +32 -207
  22. package/dist/commands/update.js.map +1 -1
  23. package/dist/core/config-patcher.d.ts.map +1 -1
  24. package/dist/core/config-patcher.js +9 -3
  25. package/dist/core/config-patcher.js.map +1 -1
  26. package/dist/core/diff-engine.d.ts +21 -0
  27. package/dist/core/diff-engine.d.ts.map +1 -0
  28. package/dist/core/diff-engine.js +140 -0
  29. package/dist/core/diff-engine.js.map +1 -0
  30. package/dist/core/github-api.d.ts +37 -0
  31. package/dist/core/github-api.d.ts.map +1 -0
  32. package/dist/core/github-api.js +163 -0
  33. package/dist/core/github-api.js.map +1 -0
  34. package/dist/core/registry.d.ts.map +1 -1
  35. package/dist/core/registry.js +17 -39
  36. package/dist/core/registry.js.map +1 -1
  37. package/dist/core/skills-registry.d.ts +32 -0
  38. package/dist/core/skills-registry.d.ts.map +1 -0
  39. package/dist/core/skills-registry.js +186 -0
  40. package/dist/core/skills-registry.js.map +1 -0
  41. package/dist/index.d.ts +2 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +289 -225
  44. package/dist/index.js.map +1 -1
  45. package/dist/types/lockfile.d.ts +9 -0
  46. package/dist/types/lockfile.d.ts.map +1 -0
  47. package/dist/types/lockfile.js +2 -0
  48. package/dist/types/lockfile.js.map +1 -0
  49. package/dist/utils/download.d.ts +18 -0
  50. package/dist/utils/download.d.ts.map +1 -0
  51. package/dist/utils/download.js +72 -0
  52. package/dist/utils/download.js.map +1 -0
  53. package/dist/utils/plan-display.d.ts +3 -0
  54. package/dist/utils/plan-display.d.ts.map +1 -0
  55. package/dist/utils/plan-display.js +80 -0
  56. package/dist/utils/plan-display.js.map +1 -0
  57. package/dist/utils/semver.d.ts +12 -0
  58. package/dist/utils/semver.d.ts.map +1 -0
  59. package/dist/utils/semver.js +82 -0
  60. package/dist/utils/semver.js.map +1 -0
  61. package/package.json +3 -3
@@ -0,0 +1,72 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync } from 'node:fs';
3
+ import { mkdir, readFile, writeFile, unlink } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ export class ArtifactDownloadError extends Error {
6
+ cause;
7
+ constructor(message, cause) {
8
+ super(message);
9
+ this.cause = cause;
10
+ this.name = 'ArtifactDownloadError';
11
+ }
12
+ }
13
+ export class ArtifactIntegrityError extends Error {
14
+ expected;
15
+ actual;
16
+ constructor(expected, actual) {
17
+ super(`Integrity check failed: expected sha256 ${expected}, got ${actual}`);
18
+ this.expected = expected;
19
+ this.actual = actual;
20
+ this.name = 'ArtifactIntegrityError';
21
+ }
22
+ }
23
+ function validateUrlScheme(url) {
24
+ if (!url.startsWith('https://') && !url.startsWith('http://')) {
25
+ throw new ArtifactDownloadError(`Invalid URL scheme: only https:// and http:// are allowed, got "${url}"`);
26
+ }
27
+ }
28
+ export async function downloadArtifact(options) {
29
+ const { url, sha256, cacheDir, cacheName, userAgent } = options;
30
+ const hasHash = !!sha256;
31
+ const subdir = hasHash ? 'verified' : 'unverified';
32
+ const cachePath = join(cacheDir, subdir, cacheName);
33
+ // Verified artifacts: reuse from cache after re-checking hash
34
+ if (hasHash && existsSync(cachePath)) {
35
+ const cached = await readFile(cachePath);
36
+ const cachedHash = createHash('sha256').update(cached).digest('hex');
37
+ if (cachedHash === sha256) {
38
+ return cachePath;
39
+ }
40
+ await unlink(cachePath).catch(() => { });
41
+ }
42
+ if (!hasHash) {
43
+ console.warn(`WARNING: No integrity hash — artifact is UNVERIFIED`);
44
+ }
45
+ validateUrlScheme(url);
46
+ let response;
47
+ try {
48
+ response = await fetch(url, {
49
+ headers: { 'User-Agent': userAgent },
50
+ });
51
+ }
52
+ catch (err) {
53
+ throw new ArtifactDownloadError(`Failed to download: ${err instanceof Error ? err.message : String(err)}`, err);
54
+ }
55
+ if (!response.ok) {
56
+ throw new ArtifactDownloadError(`Download returned HTTP ${response.status}: ${response.statusText}`);
57
+ }
58
+ const buffer = Buffer.from(await response.arrayBuffer());
59
+ // Verify SHA-256 if present
60
+ if (sha256) {
61
+ const actual = createHash('sha256').update(buffer).digest('hex');
62
+ if (actual !== sha256) {
63
+ throw new ArtifactIntegrityError(sha256, actual);
64
+ }
65
+ }
66
+ // Write to cache
67
+ const parentDir = join(cacheDir, subdir);
68
+ await mkdir(parentDir, { recursive: true });
69
+ await writeFile(cachePath, buffer);
70
+ return cachePath;
71
+ }
72
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { MigrationPlan } from '../core/migration-planner.js';
2
+ export declare function displayMigrationPlan(plan: MigrationPlan, namespace: string, name: string): void;
3
+ //# sourceMappingURL=plan-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-display.d.ts","sourceRoot":"","sources":["../../src/utils/plan-display.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAOlE,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,IAAI,CAuFN"}
@@ -0,0 +1,80 @@
1
+ import chalk from 'chalk';
2
+ import { header, label } from './output.js';
3
+ import { extractChannelType, isBareChannel, } from '../core/config-patcher.js';
4
+ export function displayMigrationPlan(plan, namespace, name) {
5
+ console.log('');
6
+ const versionStr = plan.versionChange
7
+ ? ` v${plan.versionChange.from} → v${plan.versionChange.to}`
8
+ : '';
9
+ console.log(header(`Migration Plan: ${namespace}/${name}${versionStr}`));
10
+ console.log('');
11
+ // Agents
12
+ console.log(label('Agents:'));
13
+ for (const a of plan.agents) {
14
+ switch (a.type) {
15
+ case 'add':
16
+ console.log(` ${chalk.green('+')} ${a.slug} (add)`);
17
+ break;
18
+ case 'remove':
19
+ console.log(` ${chalk.red('-')} ${a.slug} (remove)`);
20
+ break;
21
+ case 'update':
22
+ console.log(` ${chalk.yellow('~')} ${a.slug} (${a.changedFiles?.length} files changed)`);
23
+ break;
24
+ case 'unchanged':
25
+ console.log(` ${chalk.dim('=')} ${a.slug} (unchanged)`);
26
+ break;
27
+ }
28
+ }
29
+ // Bindings
30
+ if (plan.bindings.length > 0) {
31
+ console.log('');
32
+ console.log(label('Bindings:'));
33
+ for (const b of plan.bindings) {
34
+ if (b.type === 'add') {
35
+ const channelType = extractChannelType(b.binding.match.channel);
36
+ const bare = isBareChannel(b.binding.match.channel);
37
+ let annotation = '';
38
+ if (bare) {
39
+ annotation = chalk.dim(' (bare channel — shadows main)');
40
+ }
41
+ console.log(` ${chalk.green('+')} ${b.binding.match.channel} → ${b.binding.agentId}${annotation}`);
42
+ }
43
+ else {
44
+ console.log(` ${chalk.red('-')} ${b.binding.match.channel} → ${b.binding.agentId}`);
45
+ }
46
+ }
47
+ }
48
+ // Cron
49
+ if (plan.cron.length > 0) {
50
+ console.log('');
51
+ console.log(label('Cron Jobs:'));
52
+ for (const c of plan.cron) {
53
+ switch (c.type) {
54
+ case 'add':
55
+ console.log(` ${chalk.green('+')} ${c.name}`);
56
+ break;
57
+ case 'remove':
58
+ console.log(` ${chalk.red('-')} ${c.name}`);
59
+ break;
60
+ case 'update':
61
+ console.log(` ${chalk.yellow('~')} ${c.name}`);
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ // A2a
67
+ if (plan.a2a.length > 0) {
68
+ console.log('');
69
+ console.log(label('Agent-to-Agent:'));
70
+ for (const edge of plan.a2a) {
71
+ const prefix = edge.type === 'add'
72
+ ? chalk.green('+')
73
+ : edge.type === 'remove'
74
+ ? chalk.red('-')
75
+ : chalk.yellow('~');
76
+ console.log(` ${prefix} ${edge.from} → ${edge.to}`);
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=plan-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-display.js","sourceRoot":"","sources":["../../src/utils/plan-display.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare class UnsupportedSemverRange extends Error {
2
+ constructor(range: string);
3
+ }
4
+ export declare function parseSemver(v: string): {
5
+ major: number;
6
+ minor: number;
7
+ patch: number;
8
+ };
9
+ export declare function compareSemver(a: string, b: string): number;
10
+ export declare function satisfiesRange(version: string, range: string): boolean;
11
+ export declare function resolveRange(versions: string[], range: string): string | null;
12
+ //# sourceMappingURL=semver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/utils/semver.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,KAAK,EAAE,MAAM;CAI1B;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAWtF;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAoDtE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK7E"}
@@ -0,0 +1,82 @@
1
+ export class UnsupportedSemverRange extends Error {
2
+ constructor(range) {
3
+ super(`Unsupported semver range: "${range}"`);
4
+ this.name = 'UnsupportedSemverRange';
5
+ }
6
+ }
7
+ export function parseSemver(v) {
8
+ const cleaned = v.startsWith('v') ? v.slice(1) : v;
9
+ const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(cleaned);
10
+ if (!match) {
11
+ throw new Error(`Invalid semver version: "${v}"`);
12
+ }
13
+ return {
14
+ major: parseInt(match[1], 10),
15
+ minor: parseInt(match[2], 10),
16
+ patch: parseInt(match[3], 10),
17
+ };
18
+ }
19
+ export function compareSemver(a, b) {
20
+ const pa = parseSemver(a);
21
+ const pb = parseSemver(b);
22
+ if (pa.major !== pb.major)
23
+ return pa.major - pb.major;
24
+ if (pa.minor !== pb.minor)
25
+ return pa.minor - pb.minor;
26
+ return pa.patch - pb.patch;
27
+ }
28
+ export function satisfiesRange(version, range) {
29
+ const trimmed = range.trim();
30
+ // Wildcard — matches everything
31
+ if (trimmed === '*')
32
+ return true;
33
+ // Exact match: 1.2.3
34
+ if (/^\d+\.\d+\.\d+$/.test(trimmed)) {
35
+ return compareSemver(version, trimmed) === 0;
36
+ }
37
+ // Caret: ^1.2.3
38
+ const caretMatch = /^\^(\d+\.\d+\.\d+)$/.exec(trimmed);
39
+ if (caretMatch) {
40
+ const base = parseSemver(caretMatch[1]);
41
+ const v = parseSemver(version);
42
+ if (base.major > 0) {
43
+ // ^1.2.3 := >=1.2.3, <2.0.0
44
+ return v.major === base.major &&
45
+ compareSemver(version, caretMatch[1]) >= 0;
46
+ }
47
+ if (base.minor > 0) {
48
+ // ^0.2.3 := >=0.2.3, <0.3.0
49
+ return v.major === 0 &&
50
+ v.minor === base.minor &&
51
+ compareSemver(version, caretMatch[1]) >= 0;
52
+ }
53
+ // ^0.0.3 := >=0.0.3, <0.0.4
54
+ return v.major === 0 &&
55
+ v.minor === 0 &&
56
+ v.patch === base.patch;
57
+ }
58
+ // Tilde: ~1.2.3
59
+ const tildeMatch = /^~(\d+\.\d+\.\d+)$/.exec(trimmed);
60
+ if (tildeMatch) {
61
+ const base = parseSemver(tildeMatch[1]);
62
+ const v = parseSemver(version);
63
+ // ~1.2.3 := >=1.2.3, <1.3.0
64
+ return v.major === base.major &&
65
+ v.minor === base.minor &&
66
+ compareSemver(version, tildeMatch[1]) >= 0;
67
+ }
68
+ // GTE: >=1.2.3
69
+ const gteMatch = /^>=(\d+\.\d+\.\d+)$/.exec(trimmed);
70
+ if (gteMatch) {
71
+ return compareSemver(version, gteMatch[1]) >= 0;
72
+ }
73
+ throw new UnsupportedSemverRange(range);
74
+ }
75
+ export function resolveRange(versions, range) {
76
+ const matching = versions.filter((v) => satisfiesRange(v, range));
77
+ if (matching.length === 0)
78
+ return null;
79
+ matching.sort(compareSemver);
80
+ return matching[matching.length - 1];
81
+ }
82
+ //# sourceMappingURL=semver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/utils/semver.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@openreef/cli",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "CLI toolchain for OpenReef formations — package and deploy multi-agent teams",
5
5
  "type": "module",
6
6
  "bin": {
7
- "reef": "./dist/index.js"
7
+ "reef": "dist/index.js"
8
8
  },
9
9
  "files": [
10
10
  "dist",
@@ -51,6 +51,6 @@
51
51
  "license": "MIT",
52
52
  "repository": {
53
53
  "type": "git",
54
- "url": "https://github.com/openreefai/openreef.git"
54
+ "url": "git+https://github.com/openreefai/openreef.git"
55
55
  }
56
56
  }