@amodalai/amodal 0.2.1 → 0.2.3

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 (92) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/src/commands/connect-channel.d.ts +11 -0
  3. package/dist/src/commands/connect-channel.d.ts.map +1 -0
  4. package/dist/src/commands/connect-channel.js +169 -0
  5. package/dist/src/commands/connect-channel.js.map +1 -0
  6. package/dist/src/commands/connect.d.ts +3 -1
  7. package/dist/src/commands/connect.d.ts.map +1 -1
  8. package/dist/src/commands/connect.js +27 -16
  9. package/dist/src/commands/connect.js.map +1 -1
  10. package/dist/src/commands/groups/connect.d.ts +8 -0
  11. package/dist/src/commands/groups/connect.d.ts.map +1 -0
  12. package/dist/src/commands/groups/connect.js +17 -0
  13. package/dist/src/commands/groups/connect.js.map +1 -0
  14. package/dist/src/commands/groups/pkg.d.ts.map +1 -1
  15. package/dist/src/commands/groups/pkg.js +0 -12
  16. package/dist/src/commands/groups/pkg.js.map +1 -1
  17. package/dist/src/commands/index.d.ts +1 -1
  18. package/dist/src/commands/index.d.ts.map +1 -1
  19. package/dist/src/commands/index.js +3 -1
  20. package/dist/src/commands/index.js.map +1 -1
  21. package/dist/src/commands/init.d.ts.map +1 -1
  22. package/dist/src/commands/init.js +4 -1
  23. package/dist/src/commands/init.js.map +1 -1
  24. package/dist/src/commands/inspect.d.ts.map +1 -1
  25. package/dist/src/commands/inspect.js +32 -38
  26. package/dist/src/commands/inspect.js.map +1 -1
  27. package/dist/src/commands/install-pkg.d.ts +5 -5
  28. package/dist/src/commands/install-pkg.d.ts.map +1 -1
  29. package/dist/src/commands/install-pkg.js +35 -77
  30. package/dist/src/commands/install-pkg.js.map +1 -1
  31. package/dist/src/commands/uninstall.d.ts +2 -2
  32. package/dist/src/commands/uninstall.d.ts.map +1 -1
  33. package/dist/src/commands/uninstall.js +6 -32
  34. package/dist/src/commands/uninstall.js.map +1 -1
  35. package/dist/src/commands/validate.d.ts.map +1 -1
  36. package/dist/src/commands/validate.js +15 -21
  37. package/dist/src/commands/validate.js.map +1 -1
  38. package/dist/src/shared/tarball.js +1 -1
  39. package/dist/src/shared/tarball.js.map +1 -1
  40. package/dist/tsconfig.tsbuildinfo +1 -1
  41. package/package.json +5 -5
  42. package/src/commands/command-exports.test.ts +1 -1
  43. package/src/commands/connect-channel.ts +197 -0
  44. package/src/commands/connect.test.ts +28 -40
  45. package/src/commands/connect.ts +30 -24
  46. package/src/commands/groups/connect.ts +20 -0
  47. package/src/commands/groups/pkg.ts +0 -12
  48. package/src/commands/index.ts +5 -1
  49. package/src/commands/init.test.ts +2 -2
  50. package/src/commands/init.ts +5 -1
  51. package/src/commands/inspect.test.ts +1 -18
  52. package/src/commands/inspect.ts +31 -36
  53. package/src/commands/install-pkg.test.ts +39 -73
  54. package/src/commands/install-pkg.ts +38 -87
  55. package/src/commands/uninstall.test.ts +11 -51
  56. package/src/commands/uninstall.ts +7 -36
  57. package/src/commands/validate.test.ts +5 -26
  58. package/src/commands/validate.ts +15 -20
  59. package/src/e2e-commands.test.ts +0 -1
  60. package/src/e2e-plugins.test.ts +0 -1
  61. package/src/e2e.test.ts +0 -89
  62. package/src/shared/tarball.ts +1 -1
  63. package/dist/src/commands/diff.d.ts +0 -17
  64. package/dist/src/commands/diff.d.ts.map +0 -1
  65. package/dist/src/commands/diff.js +0 -118
  66. package/dist/src/commands/diff.js.map +0 -1
  67. package/dist/src/commands/list.d.ts +0 -18
  68. package/dist/src/commands/list.d.ts.map +0 -1
  69. package/dist/src/commands/list.js +0 -82
  70. package/dist/src/commands/list.js.map +0 -1
  71. package/dist/src/commands/publish.d.ts +0 -18
  72. package/dist/src/commands/publish.d.ts.map +0 -1
  73. package/dist/src/commands/publish.js +0 -121
  74. package/dist/src/commands/publish.js.map +0 -1
  75. package/dist/src/commands/search.d.ts +0 -19
  76. package/dist/src/commands/search.d.ts.map +0 -1
  77. package/dist/src/commands/search.js +0 -97
  78. package/dist/src/commands/search.js.map +0 -1
  79. package/dist/src/commands/update.d.ts +0 -19
  80. package/dist/src/commands/update.d.ts.map +0 -1
  81. package/dist/src/commands/update.js +0 -158
  82. package/dist/src/commands/update.js.map +0 -1
  83. package/src/commands/diff.test.ts +0 -165
  84. package/src/commands/diff.ts +0 -141
  85. package/src/commands/list.test.ts +0 -141
  86. package/src/commands/list.ts +0 -99
  87. package/src/commands/publish.test.ts +0 -169
  88. package/src/commands/publish.ts +0 -141
  89. package/src/commands/search.test.ts +0 -171
  90. package/src/commands/search.ts +0 -120
  91. package/src/commands/update.test.ts +0 -256
  92. package/src/commands/update.ts +0 -196
@@ -1,121 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- import { readFile, readdir, stat, writeFile } from 'node:fs/promises';
7
- import { execFile } from 'node:child_process';
8
- import * as path from 'node:path';
9
- import { promisify } from 'node:util';
10
- import { KNOWN_CONTENT_DIRS } from '@amodalai/core';
11
- const execFileAsync = promisify(execFile);
12
- const DEFAULT_REGISTRY = 'https://registry.amodalai.com';
13
- /**
14
- * Publish a package to the registry.
15
- * Returns 0 on success, 1 on error.
16
- */
17
- export async function runPublish(options = {}) {
18
- const cwd = options.cwd ?? process.cwd();
19
- const registry = options.registry ?? DEFAULT_REGISTRY;
20
- // Validate package.json exists
21
- const pkgJsonPath = path.join(cwd, 'package.json');
22
- let pkgName;
23
- let pkgVersion;
24
- let manifestName;
25
- try {
26
- const content = await readFile(pkgJsonPath, 'utf-8');
27
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- config JSON
28
- const pkg = JSON.parse(content);
29
- pkgName = String(pkg['name'] ?? '');
30
- pkgVersion = String(pkg['version'] ?? '');
31
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
32
- const amodal = pkg['amodal'];
33
- if (!amodal || typeof amodal !== 'object' || !amodal['name']) {
34
- process.stderr.write('[publish] package.json must have an "amodal" block with a "name" field.\n');
35
- return 1;
36
- }
37
- manifestName = String(amodal['name']);
38
- }
39
- catch (err) {
40
- const msg = err instanceof Error ? err.message : String(err);
41
- process.stderr.write(`[publish] Failed to read package.json: ${msg}\n`);
42
- return 1;
43
- }
44
- // Scan for known content directories and auto-populate `contains`
45
- const contains = [];
46
- for (const dir of KNOWN_CONTENT_DIRS) {
47
- try {
48
- const s = await stat(path.join(cwd, dir));
49
- if (s.isDirectory()) {
50
- const entries = await readdir(path.join(cwd, dir));
51
- if (entries.length > 0)
52
- contains.push(dir);
53
- }
54
- }
55
- catch {
56
- // Directory doesn't exist
57
- }
58
- }
59
- if (contains.length === 0) {
60
- process.stderr.write('[publish] Warning: no known amodal directories found (connections, skills, etc.).\n');
61
- }
62
- // Write `contains` into package.json before publishing
63
- try {
64
- const rawContent = await readFile(pkgJsonPath, 'utf-8');
65
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- config JSON
66
- const pkgObj = JSON.parse(rawContent);
67
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
68
- const amodal = pkgObj['amodal'];
69
- amodal['contains'] = contains;
70
- await writeFile(pkgJsonPath, JSON.stringify(pkgObj, null, 2) + '\n', 'utf-8');
71
- }
72
- catch {
73
- // Non-fatal — publish will proceed without contains
74
- }
75
- if (options.dryRun) {
76
- process.stderr.write(`[publish] Dry run: would publish ${pkgName}@${pkgVersion}\n`);
77
- process.stderr.write(`[publish] Name: ${manifestName}\n`);
78
- process.stderr.write(`[publish] Contains: ${contains.length > 0 ? contains.join(', ') : '(none)'}\n`);
79
- process.stderr.write(`[publish] Registry: ${registry}\n`);
80
- return 0;
81
- }
82
- process.stderr.write(`[publish] Publishing ${pkgName}@${pkgVersion} to ${registry}...\n`);
83
- try {
84
- await execFileAsync('npm', ['publish', '--registry', registry], {
85
- cwd,
86
- timeout: 120_000,
87
- });
88
- process.stderr.write(`[publish] Published ${pkgName}@${pkgVersion}\n`);
89
- return 0;
90
- }
91
- catch (err) {
92
- const msg = err instanceof Error ? err.message : String(err);
93
- if (msg.includes('403') || msg.includes('409') || msg.includes('EPUBLISHCONFLICT')) {
94
- process.stderr.write(`[publish] Version ${pkgVersion} already exists. Bump the version and try again.\n`);
95
- }
96
- else if (msg.includes('ENEEDAUTH') || msg.includes('E401')) {
97
- process.stderr.write(`[publish] Not authenticated. Run \`npm login --registry ${registry}\` first.\n`);
98
- }
99
- else {
100
- process.stderr.write(`[publish] Publish failed: ${msg}\n`);
101
- }
102
- return 1;
103
- }
104
- }
105
- export const publishCommand = {
106
- command: 'publish',
107
- describe: 'Publish a package to the registry',
108
- builder: (yargs) => yargs
109
- .option('dry-run', { type: 'boolean', default: false, describe: 'Show what would be published' })
110
- .option('registry', { type: 'string', describe: 'Registry URL' }),
111
- handler: async (argv) => {
112
- const code = await runPublish({
113
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
114
- dryRun: argv['dryRun'],
115
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
116
- registry: argv['registry'],
117
- });
118
- process.exit(code);
119
- },
120
- };
121
- //# sourceMappingURL=publish.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- import type { CommandModule } from 'yargs';
7
- export interface SearchOptions {
8
- cwd?: string;
9
- query?: string;
10
- tag?: string;
11
- json?: boolean;
12
- }
13
- /**
14
- * Search the registry for packages.
15
- * Returns 0 on success, 1 on error.
16
- */
17
- export declare function runSearch(options?: SearchOptions): Promise<number>;
18
- export declare const searchCommand: CommandModule;
19
- //# sourceMappingURL=search.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,OAAO,CAAC;AAQzC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyE5E;AAED,eAAO,MAAM,aAAa,EAAE,aAmB3B,CAAC"}
@@ -1,97 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- import { ensureNpmContext, fromNpmName, npmSearch, } from '@amodalai/core';
7
- import { findRepoRoot } from '../shared/repo-discovery.js';
8
- /**
9
- * Search the registry for packages.
10
- * Returns 0 on success, 1 on error.
11
- */
12
- export async function runSearch(options = {}) {
13
- let repoPath;
14
- try {
15
- repoPath = findRepoRoot(options.cwd);
16
- }
17
- catch {
18
- // Not in a repo — use temp context
19
- }
20
- let paths;
21
- try {
22
- paths = await ensureNpmContext(repoPath ?? process.cwd());
23
- }
24
- catch (err) {
25
- const msg = err instanceof Error ? err.message : String(err);
26
- process.stderr.write(`[search] Failed to set up npm context: ${msg}\n`);
27
- return 1;
28
- }
29
- // Build query
30
- let query = '@amodalai/';
31
- if (options.tag) {
32
- query += `${options.tag}-`;
33
- }
34
- if (options.query) {
35
- query += options.query;
36
- }
37
- process.stderr.write(`[search] Searching for "${query}"...\n`);
38
- let results;
39
- try {
40
- results = await npmSearch(paths, query);
41
- }
42
- catch (err) {
43
- const msg = err instanceof Error ? err.message : String(err);
44
- process.stderr.write(`[search] Search failed: ${msg}\n`);
45
- return 1;
46
- }
47
- // Filter to @amodalai/ packages only
48
- results = results.filter((r) => r.name.startsWith('@amodalai/'));
49
- // Filter by tag if specified (match against npm name prefix)
50
- if (options.tag) {
51
- const prefix = `@amodalai/${options.tag}-`;
52
- results = results.filter((r) => r.name.startsWith(prefix));
53
- }
54
- if (results.length === 0) {
55
- process.stderr.write('[search] No packages found.\n');
56
- return 0;
57
- }
58
- if (options.json) {
59
- const output = results.map((r) => ({
60
- npm: r.name,
61
- name: fromNpmName(r.name),
62
- version: r.version,
63
- description: r.description,
64
- }));
65
- process.stdout.write(JSON.stringify(output, null, 2) + '\n');
66
- return 0;
67
- }
68
- // Display results
69
- const nameWidth = Math.max(4, ...results.map((r) => fromNpmName(r.name).length));
70
- const versionWidth = Math.max(7, ...results.map((r) => r.version.length));
71
- for (const r of results) {
72
- const shortName = fromNpmName(r.name);
73
- process.stdout.write(` ${shortName.padEnd(nameWidth)} ${r.version.padEnd(versionWidth)} ${r.description}\n`);
74
- }
75
- process.stderr.write(`\n[search] ${results.length} package${results.length === 1 ? '' : 's'} found.\n`);
76
- return 0;
77
- }
78
- export const searchCommand = {
79
- command: 'search [query]',
80
- describe: 'Search the registry for packages',
81
- builder: (yargs) => yargs
82
- .positional('query', { type: 'string', describe: 'Search query' })
83
- .option('tag', { type: 'string', describe: 'Filter by tag prefix (e.g., connection, skill)' })
84
- .option('json', { type: 'boolean', default: false, describe: 'Output as JSON' }),
85
- handler: async (argv) => {
86
- const code = await runSearch({
87
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
88
- query: argv['query'],
89
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
90
- tag: argv['tag'],
91
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
92
- json: argv['json'],
93
- });
94
- process.exit(code);
95
- },
96
- };
97
- //# sourceMappingURL=search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- import type { CommandModule } from 'yargs';
7
- export interface UpdateOptions {
8
- cwd?: string;
9
- name?: string;
10
- latest?: boolean;
11
- dryRun?: boolean;
12
- }
13
- /**
14
- * Update installed packages to newer versions.
15
- * Returns the number of failures (0 = success).
16
- */
17
- export declare function runUpdate(options?: UpdateOptions): Promise<number>;
18
- export declare const updateCommand: CommandModule;
19
- //# sourceMappingURL=update.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,OAAO,CAAC;AAazC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAQD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8G5E;AAED,eAAO,MAAM,aAAa,EAAE,aA+C3B,CAAC"}
@@ -1,158 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- import { buildLockFile, discoverInstalledPackages, ensureNpmContext, fromNpmName, npmInstall, npmViewVersions, readLockFile, } from '@amodalai/core';
7
- import * as semver from 'semver';
8
- import { findRepoRoot } from '../shared/repo-discovery.js';
9
- /**
10
- * Update installed packages to newer versions.
11
- * Returns the number of failures (0 = success).
12
- */
13
- export async function runUpdate(options = {}) {
14
- let repoPath;
15
- try {
16
- repoPath = findRepoRoot(options.cwd);
17
- }
18
- catch (err) {
19
- const msg = err instanceof Error ? err.message : String(err);
20
- process.stderr.write(`[update] ${msg}\n`);
21
- return 1;
22
- }
23
- const paths = await ensureNpmContext(repoPath);
24
- const lockFile = await readLockFile(repoPath);
25
- if (!lockFile) {
26
- process.stderr.write('[update] No lock file found. Install packages first.\n');
27
- return 1;
28
- }
29
- // Build list of targets
30
- const targets = [];
31
- for (const [npmName, entry] of Object.entries(lockFile.packages)) {
32
- const shortName = fromNpmName(npmName);
33
- if (options.name && shortName !== options.name && npmName !== options.name)
34
- continue;
35
- targets.push({
36
- npmName,
37
- shortName,
38
- currentVersion: entry.version,
39
- });
40
- }
41
- if (targets.length === 0) {
42
- if (options.name) {
43
- process.stderr.write('[update] No matching packages found in lock file.\n');
44
- }
45
- else {
46
- process.stderr.write('[update] No packages installed.\n');
47
- }
48
- return 0;
49
- }
50
- // Check for updates
51
- const updates = [];
52
- let failures = 0;
53
- for (const target of targets) {
54
- try {
55
- const versions = await npmViewVersions(paths, target.npmName);
56
- let newVersion;
57
- if (options.latest) {
58
- // Take the absolute latest
59
- newVersion = semver.maxSatisfying(versions, '*');
60
- }
61
- else {
62
- // Stay within current major (^current)
63
- newVersion = semver.maxSatisfying(versions, `^${target.currentVersion}`);
64
- }
65
- if (!newVersion || newVersion === target.currentVersion) {
66
- process.stderr.write(`[update] ${target.npmName}@${target.currentVersion} is already up to date.\n`);
67
- continue;
68
- }
69
- updates.push({ target, newVersion });
70
- }
71
- catch (err) {
72
- const msg = err instanceof Error ? err.message : String(err);
73
- process.stderr.write(`[update] Failed to check ${target.npmName}: ${msg}\n`);
74
- failures++;
75
- }
76
- }
77
- if (updates.length === 0) {
78
- if (failures === 0) {
79
- process.stderr.write('[update] All packages are up to date.\n');
80
- }
81
- return failures;
82
- }
83
- // Print what will be updated
84
- if (options.dryRun) {
85
- process.stderr.write('[update] Dry run — the following would be updated:\n');
86
- for (const { target, newVersion } of updates) {
87
- process.stderr.write(` ${target.npmName}: ${target.currentVersion} → ${newVersion}\n`);
88
- }
89
- return 0;
90
- }
91
- // Perform updates
92
- for (const { target, newVersion } of updates) {
93
- process.stderr.write(`[update] Updating ${target.npmName}: ${target.currentVersion} → ${newVersion}...\n`);
94
- try {
95
- const result = await npmInstall(paths, target.npmName, newVersion);
96
- process.stderr.write(`[update] Updated ${target.npmName}@${result.version}\n`);
97
- }
98
- catch (err) {
99
- const msg = err instanceof Error ? err.message : String(err);
100
- process.stderr.write(`[update] Failed to update ${target.npmName}: ${msg}\n`);
101
- failures++;
102
- }
103
- }
104
- // Rebuild lock file from what's actually installed
105
- const discovered = await discoverInstalledPackages(paths);
106
- await buildLockFile(repoPath, discovered);
107
- const successCount = updates.length - failures;
108
- if (failures > 0) {
109
- process.stderr.write(`[update] ${failures} of ${updates.length} update${updates.length === 1 ? '' : 's'} failed.\n`);
110
- }
111
- else {
112
- process.stderr.write(`[update] ${successCount} package${successCount === 1 ? '' : 's'} updated.\n`);
113
- }
114
- return failures;
115
- }
116
- export const updateCommand = {
117
- command: 'update [name]',
118
- describe: 'Update packages. Use --all for all packages, --admin-agent for the admin agent, or specify a name.',
119
- builder: (yargs) => yargs
120
- .positional('name', { type: 'string', describe: 'Package name to update' })
121
- .option('all', { type: 'boolean', default: false, describe: 'Update all installed packages' })
122
- .option('admin-agent', { type: 'boolean', default: false, describe: 'Update the global admin agent cache' })
123
- .option('latest', { type: 'boolean', default: false, describe: 'Allow major version updates' })
124
- .option('dry-run', { type: 'boolean', default: false, describe: 'Show what would be updated' }),
125
- handler: async (argv) => {
126
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
127
- const name = argv['name'];
128
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
129
- const all = argv['all'];
130
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
131
- const adminAgent = argv['adminAgent'];
132
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
133
- const latest = argv['latest'];
134
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
135
- const dryRun = argv['dryRun'];
136
- // Must specify at least one target
137
- if (!name && !all && !adminAgent) {
138
- process.stderr.write('Usage: amodal update <name> | --all | --admin-agent\n');
139
- process.stderr.write(' <name> Update a specific package\n');
140
- process.stderr.write(' --all Update all installed packages\n');
141
- process.stderr.write(' --admin-agent Update the global admin agent\n');
142
- process.stderr.write(' Flags can be combined: amodal update --all --admin-agent\n');
143
- process.exit(1);
144
- }
145
- let failures = 0;
146
- // Update admin agent if requested
147
- if (adminAgent) {
148
- const { updateAdminAgentCommand } = await import('./admin.js');
149
- failures += await updateAdminAgentCommand();
150
- }
151
- // Update packages if requested
152
- if (name || all) {
153
- failures += await runUpdate({ name, latest, dryRun });
154
- }
155
- process.exit(failures > 0 ? 1 : 0);
156
- },
157
- };
158
- //# sourceMappingURL=update.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -1,165 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
-
7
- import {describe, it, expect, vi, beforeEach} from 'vitest';
8
-
9
- const mockFindRepoRoot = vi.fn(() => '/test/repo');
10
- const mockEnsureNpmContext = vi.fn();
11
- const mockGetLockEntry = vi.fn();
12
- const mockNpmView = vi.fn();
13
- const mockGetNpmContextPaths = vi.fn();
14
- const mockReadPackageFile = vi.fn();
15
- const mockListPackageFiles = vi.fn();
16
- const mockToNpmName = vi.fn((name: string) => `@amodalai/${name}`);
17
- const mockFromNpmName = vi.fn((npm: string) => npm.replace('@amodalai/', ''));
18
-
19
- vi.mock('../shared/repo-discovery.js', () => ({
20
- findRepoRoot: mockFindRepoRoot,
21
- }));
22
-
23
- vi.mock('@amodalai/core', () => ({
24
- ensureNpmContext: mockEnsureNpmContext,
25
- getLockEntry: mockGetLockEntry,
26
- npmView: mockNpmView,
27
- getNpmContextPaths: mockGetNpmContextPaths,
28
- readPackageFile: mockReadPackageFile,
29
- listPackageFiles: mockListPackageFiles,
30
- toNpmName: mockToNpmName,
31
- fromNpmName: mockFromNpmName,
32
- }));
33
-
34
- const mockPaths = {
35
- root: '/test/repo/.amodal/packages',
36
- npmDir: '/test/repo/.amodal/packages/.npm',
37
- npmrc: '/test/repo/.amodal/packages/.npm/.npmrc',
38
- packageJson: '/test/repo/.amodal/packages/.npm/package.json',
39
- nodeModules: '/test/repo/.amodal/packages/.npm/node_modules',
40
- };
41
-
42
- describe('runDiff', () => {
43
- let stderrOutput: string;
44
- let stdoutOutput: string;
45
-
46
- beforeEach(() => {
47
- vi.clearAllMocks();
48
- mockFindRepoRoot.mockReturnValue('/test/repo');
49
- mockEnsureNpmContext.mockResolvedValue(mockPaths);
50
- mockGetNpmContextPaths.mockReturnValue(mockPaths);
51
- stderrOutput = '';
52
- stdoutOutput = '';
53
- vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
54
- stderrOutput += String(chunk);
55
- return true;
56
- });
57
- vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
58
- stdoutOutput += String(chunk);
59
- return true;
60
- });
61
- });
62
-
63
- it('should show diff when version differs', async () => {
64
- mockGetLockEntry.mockResolvedValue({version: '1.0.0', integrity: 'sha512-old'});
65
- mockNpmView.mockResolvedValue({name: '@amodalai/connection-salesforce', version: '2.0.0', versions: ['1.0.0', '2.0.0']});
66
- mockListPackageFiles.mockResolvedValue(['spec.json', 'surface.md', 'package.json']);
67
- mockReadPackageFile.mockResolvedValue('content\nline2\n');
68
-
69
- const {runDiff} = await import('./diff.js');
70
- const result = await runDiff({name: 'connection-salesforce'});
71
- expect(result).toBe(0);
72
- expect(stdoutOutput).toContain('1.0.0');
73
- expect(stdoutOutput).toContain('2.0.0');
74
- });
75
-
76
- it('should report already latest', async () => {
77
- mockGetLockEntry.mockResolvedValue({version: '2.0.0', integrity: 'sha512-old'});
78
- mockNpmView.mockResolvedValue({name: '@amodalai/connection-salesforce', version: '2.0.0', versions: ['1.0.0', '2.0.0']});
79
-
80
- const {runDiff} = await import('./diff.js');
81
- const result = await runDiff({name: 'connection-salesforce'});
82
- expect(result).toBe(0);
83
- expect(stderrOutput).toContain('already the latest');
84
- });
85
-
86
- it('should return 1 when not installed', async () => {
87
- mockGetLockEntry.mockResolvedValue(null);
88
-
89
- const {runDiff} = await import('./diff.js');
90
- const result = await runDiff({name: 'connection-salesforce'});
91
- expect(result).toBe(1);
92
- expect(stderrOutput).toContain('not installed');
93
- });
94
-
95
- it('should return 1 when registry unreachable', async () => {
96
- mockGetLockEntry.mockResolvedValue({version: '1.0.0', integrity: 'sha512-old'});
97
- mockNpmView.mockRejectedValue(new Error('Registry unreachable'));
98
-
99
- const {runDiff} = await import('./diff.js');
100
- const result = await runDiff({name: 'connection-salesforce'});
101
- expect(result).toBe(1);
102
- expect(stderrOutput).toContain('Failed to query registry');
103
- });
104
-
105
- it('should return 1 when repo not found', async () => {
106
- mockFindRepoRoot.mockImplementation(() => {
107
- throw new Error('Not found');
108
- });
109
-
110
- const {runDiff} = await import('./diff.js');
111
- const result = await runDiff({name: 'connection-salesforce'});
112
- expect(result).toBe(1);
113
- expect(stderrOutput).toContain('Not found');
114
- });
115
-
116
- it('should show surface endpoint count', async () => {
117
- mockGetLockEntry.mockResolvedValue({version: '1.0.0', integrity: 'sha512-old'});
118
- mockNpmView.mockResolvedValue({name: '@amodalai/connection-salesforce', version: '2.0.0', versions: ['1.0.0', '2.0.0']});
119
- mockListPackageFiles.mockResolvedValue(['surface.md']);
120
- mockReadPackageFile.mockResolvedValue('## GET /users\nList users\n\n## POST /users\nCreate user\n');
121
-
122
- const {runDiff} = await import('./diff.js');
123
- const result = await runDiff({name: 'connection-salesforce'});
124
- expect(result).toBe(0);
125
- expect(stdoutOutput).toContain('2 endpoints');
126
- });
127
-
128
- it('should show spec.json keys', async () => {
129
- mockGetLockEntry.mockResolvedValue({version: '1.0.0', integrity: 'sha512-old'});
130
- mockNpmView.mockResolvedValue({name: '@amodalai/connection-salesforce', version: '2.0.0', versions: ['1.0.0', '2.0.0']});
131
- mockListPackageFiles.mockResolvedValue(['spec.json']);
132
- mockReadPackageFile.mockResolvedValue(JSON.stringify({baseUrl: 'https://api.example.com', specUrl: 'https://api.example.com/spec', format: 'openapi'}));
133
-
134
- const {runDiff} = await import('./diff.js');
135
- const result = await runDiff({name: 'connection-salesforce'});
136
- expect(result).toBe(0);
137
- expect(stdoutOutput).toContain('specUrl');
138
- expect(stdoutOutput).toContain('format');
139
- });
140
-
141
- it('should show access.json rule count', async () => {
142
- mockGetLockEntry.mockResolvedValue({version: '1.0.0', integrity: 'sha512-old'});
143
- mockNpmView.mockResolvedValue({name: '@amodalai/connection-salesforce', version: '2.0.0', versions: ['1.0.0', '2.0.0']});
144
- mockListPackageFiles.mockResolvedValue(['access.json']);
145
- mockReadPackageFile.mockResolvedValue(JSON.stringify({
146
- 'GET /users': {confirm: true},
147
- 'POST /users': {confirm: 'review'},
148
- }));
149
-
150
- const {runDiff} = await import('./diff.js');
151
- const result = await runDiff({name: 'connection-salesforce'});
152
- expect(result).toBe(0);
153
- expect(stdoutOutput).toContain('2 rules');
154
- });
155
-
156
- it('should suggest update command', async () => {
157
- mockGetLockEntry.mockResolvedValue({version: '1.0.0', integrity: 'sha512-old'});
158
- mockNpmView.mockResolvedValue({name: '@amodalai/connection-salesforce', version: '2.0.0', versions: ['1.0.0', '2.0.0']});
159
- mockListPackageFiles.mockResolvedValue([]);
160
-
161
- const {runDiff} = await import('./diff.js');
162
- await runDiff({name: 'connection-salesforce'});
163
- expect(stdoutOutput).toContain('amodal update connection-salesforce');
164
- });
165
- });