@agpm/cli 0.0.2 → 0.1.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.
- package/LICENSE +21 -0
- package/dist/commands/add.d.ts +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +140 -57
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +113 -33
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/source.d.ts.map +1 -1
- package/dist/commands/source.js +75 -38
- package/dist/commands/source.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +43 -16
- package/dist/commands/update.js.map +1 -1
- package/package.json +12 -2
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Kepler16
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/commands/add.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,UAAU;;;;;;;;;;;EA2FrB,CAAC"}
|
package/dist/commands/add.js
CHANGED
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
|
-
import { loadConfig, saveConfig,
|
|
2
|
+
import { loadConfig, saveConfig, parseSourceString, ensureRepo, getRepoPath, discover, } from "@agpm/core";
|
|
3
|
+
/**
|
|
4
|
+
* Parse artifact name that may include a version ref.
|
|
5
|
+
* Returns { name, ref } where ref is the version if specified.
|
|
6
|
+
*/
|
|
7
|
+
function parseArtifactName(input) {
|
|
8
|
+
const atIndex = input.lastIndexOf("@");
|
|
9
|
+
if (atIndex > 0) {
|
|
10
|
+
return {
|
|
11
|
+
name: input.slice(0, atIndex),
|
|
12
|
+
ref: input.slice(atIndex + 1),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
return { name: input };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Find a source in the config by name.
|
|
19
|
+
*/
|
|
20
|
+
function findSource(sources, name) {
|
|
21
|
+
return sources.find((s) => s.name === name);
|
|
22
|
+
}
|
|
3
23
|
export const addCommand = defineCommand({
|
|
4
24
|
meta: {
|
|
5
25
|
name: "add",
|
|
6
|
-
description: "Add an artifact to the project",
|
|
26
|
+
description: "Add an artifact or collection to the project",
|
|
7
27
|
},
|
|
8
28
|
args: {
|
|
9
29
|
source: {
|
|
@@ -11,82 +31,145 @@ export const addCommand = defineCommand({
|
|
|
11
31
|
description: "Source containing the artifact (owner/repo or URL)",
|
|
12
32
|
required: true,
|
|
13
33
|
},
|
|
14
|
-
|
|
34
|
+
name: {
|
|
15
35
|
type: "positional",
|
|
16
|
-
description: "Artifact name to add
|
|
36
|
+
description: "Artifact or collection name to add",
|
|
17
37
|
required: false,
|
|
18
38
|
},
|
|
19
39
|
},
|
|
20
40
|
async run({ args }) {
|
|
21
41
|
const cwd = process.cwd();
|
|
22
42
|
const config = await loadConfig(cwd);
|
|
23
|
-
|
|
24
|
-
|
|
43
|
+
// Parse CLI shorthand into a Source object
|
|
44
|
+
const source = parseSourceString(args.source);
|
|
45
|
+
console.log(`Resolving ${source.name}...`);
|
|
25
46
|
// Ensure repo is cloned
|
|
26
|
-
await ensureRepo(
|
|
27
|
-
const repoPath = getRepoPath(
|
|
28
|
-
// Discover available artifacts
|
|
29
|
-
const
|
|
30
|
-
if (artifacts.length === 0) {
|
|
31
|
-
console.log("No artifacts found in source");
|
|
47
|
+
await ensureRepo(source);
|
|
48
|
+
const repoPath = getRepoPath(source);
|
|
49
|
+
// Discover available artifacts and collections
|
|
50
|
+
const result = await discover(repoPath, source.subdir, source.format);
|
|
51
|
+
if (result.artifacts.length === 0 && result.collections.length === 0) {
|
|
52
|
+
console.log("No artifacts or collections found in source");
|
|
32
53
|
return;
|
|
33
54
|
}
|
|
34
|
-
|
|
35
|
-
if (
|
|
36
|
-
|
|
37
|
-
artifact = artifacts.find((a) => a.name === args.artifact ||
|
|
38
|
-
a.path === args.artifact ||
|
|
39
|
-
a.path.endsWith(`/${args.artifact}`));
|
|
40
|
-
if (!artifact) {
|
|
41
|
-
console.log(`Artifact "${args.artifact}" not found in source.`);
|
|
42
|
-
console.log("\nAvailable artifacts:");
|
|
43
|
-
for (const a of artifacts) {
|
|
44
|
-
console.log(` - ${a.name}`);
|
|
45
|
-
}
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
55
|
+
// Also ensure source is in sources list
|
|
56
|
+
if (!findSource(config.sources, source.name)) {
|
|
57
|
+
config.sources.push(source);
|
|
48
58
|
}
|
|
49
|
-
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
for (const a of artifacts) {
|
|
58
|
-
console.log(` ${a.name}`);
|
|
59
|
-
if (a.description) {
|
|
60
|
-
const desc = a.description.length > 60
|
|
61
|
-
? a.description.slice(0, 57) + "..."
|
|
62
|
-
: a.description;
|
|
63
|
-
console.log(` ${desc}`);
|
|
59
|
+
if (args.name) {
|
|
60
|
+
// Parse artifact name (may include @version)
|
|
61
|
+
const { name: itemName, ref: versionRef } = parseArtifactName(args.name);
|
|
62
|
+
// Check if it's a collection first (collections don't support version refs)
|
|
63
|
+
const collection = result.collections.find((c) => c.name === itemName);
|
|
64
|
+
if (collection) {
|
|
65
|
+
if (versionRef) {
|
|
66
|
+
console.log("Warning: Collections do not support version refs. Ignoring @" + versionRef);
|
|
64
67
|
}
|
|
68
|
+
return addCollection(config, source, collection, cwd);
|
|
69
|
+
}
|
|
70
|
+
// Otherwise, find specific artifact
|
|
71
|
+
const artifact = result.artifacts.find((a) => a.name === itemName ||
|
|
72
|
+
a.path === itemName ||
|
|
73
|
+
a.path.endsWith(`/${itemName}`));
|
|
74
|
+
if (artifact) {
|
|
75
|
+
return addArtifact(config, source, artifact, cwd, versionRef);
|
|
65
76
|
}
|
|
66
|
-
|
|
67
|
-
console.log(`
|
|
77
|
+
// Not found
|
|
78
|
+
console.log(`"${itemName}" not found in source.`);
|
|
79
|
+
showAvailable(result.collections, result.artifacts, args.source);
|
|
68
80
|
return;
|
|
69
81
|
}
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
82
|
+
// No name specified - auto-select or show options
|
|
83
|
+
if (result.collections.length === 1 && result.artifacts.length === 0) {
|
|
84
|
+
// Only one collection, auto-add it
|
|
85
|
+
return addCollection(config, source, result.collections[0], cwd);
|
|
86
|
+
}
|
|
87
|
+
if (result.artifacts.length === 1 && result.collections.length === 0) {
|
|
88
|
+
// Only one artifact, auto-add it
|
|
89
|
+
return addArtifact(config, source, result.artifacts[0], cwd);
|
|
90
|
+
}
|
|
91
|
+
// Multiple options, must specify
|
|
92
|
+
console.log("Multiple items found. Please specify which one to add:\n");
|
|
93
|
+
showAvailable(result.collections, result.artifacts, args.source);
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
async function addCollection(config, source, collection, cwd) {
|
|
97
|
+
const collectionRef = `${source.name}/${collection.name}`;
|
|
98
|
+
if (config.collections.includes(collectionRef)) {
|
|
99
|
+
console.log(`Collection already configured: ${collectionRef}`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
config.collections.push(collectionRef);
|
|
103
|
+
await saveConfig(cwd, config);
|
|
104
|
+
console.log(`Added collection: ${collectionRef}`);
|
|
105
|
+
if (collection.description) {
|
|
106
|
+
console.log(` ${collection.description}`);
|
|
107
|
+
}
|
|
108
|
+
console.log(` Contains: ${collection.artifacts.join(", ")}`);
|
|
109
|
+
console.log();
|
|
110
|
+
console.log("Run `agpm install` to install the collection.");
|
|
111
|
+
}
|
|
112
|
+
async function addArtifact(config, source, artifact, cwd, versionRef) {
|
|
113
|
+
// Build artifact reference with optional version
|
|
114
|
+
const artifactRef = versionRef
|
|
115
|
+
? `${source.name}/${artifact.name}@${versionRef}`
|
|
116
|
+
: `${source.name}/${artifact.name}`;
|
|
117
|
+
// Check for existing entry (with or without version)
|
|
118
|
+
const baseRef = `${source.name}/${artifact.name}`;
|
|
119
|
+
const existingIndex = config.artifacts.findIndex((a) => a === artifactRef || a.startsWith(baseRef + "@") || a === baseRef);
|
|
120
|
+
if (existingIndex !== -1) {
|
|
121
|
+
const existing = config.artifacts[existingIndex];
|
|
122
|
+
if (existing === artifactRef) {
|
|
74
123
|
console.log(`Artifact already configured: ${artifactRef}`);
|
|
75
124
|
return;
|
|
76
125
|
}
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
|
|
126
|
+
// Update to new version
|
|
127
|
+
config.artifacts[existingIndex] = artifactRef;
|
|
128
|
+
await saveConfig(cwd, config);
|
|
129
|
+
console.log(`Updated: ${existing} → ${artifactRef}`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
82
132
|
config.artifacts.push(artifactRef);
|
|
83
133
|
await saveConfig(cwd, config);
|
|
84
134
|
console.log(`Added: ${artifactRef}`);
|
|
85
|
-
|
|
86
|
-
|
|
135
|
+
}
|
|
136
|
+
if (artifact.description) {
|
|
137
|
+
console.log(` ${artifact.description}`);
|
|
138
|
+
}
|
|
139
|
+
if (versionRef) {
|
|
140
|
+
console.log(` Pinned to: ${versionRef}`);
|
|
141
|
+
}
|
|
142
|
+
console.log();
|
|
143
|
+
console.log("Run `agpm install` to install the artifact.");
|
|
144
|
+
}
|
|
145
|
+
function showAvailable(collections, artifacts, sourceArg) {
|
|
146
|
+
if (collections.length > 0) {
|
|
147
|
+
console.log("Collections:");
|
|
148
|
+
for (const c of collections) {
|
|
149
|
+
console.log(` ${c.name}`);
|
|
150
|
+
if (c.description) {
|
|
151
|
+
const desc = c.description.length > 60
|
|
152
|
+
? c.description.slice(0, 57) + "..."
|
|
153
|
+
: c.description;
|
|
154
|
+
console.log(` ${desc}`);
|
|
155
|
+
}
|
|
156
|
+
console.log(` (${c.artifacts.length} artifacts)`);
|
|
87
157
|
}
|
|
88
158
|
console.log();
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
159
|
+
}
|
|
160
|
+
if (artifacts.length > 0) {
|
|
161
|
+
console.log("Artifacts:");
|
|
162
|
+
for (const a of artifacts) {
|
|
163
|
+
console.log(` ${a.name}`);
|
|
164
|
+
if (a.description) {
|
|
165
|
+
const desc = a.description.length > 60
|
|
166
|
+
? a.description.slice(0, 57) + "..."
|
|
167
|
+
: a.description;
|
|
168
|
+
console.log(` ${desc}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
console.log();
|
|
172
|
+
}
|
|
173
|
+
console.log(`Usage: agpm add ${sourceArg} <name>`);
|
|
174
|
+
}
|
|
92
175
|
//# sourceMappingURL=add.js.map
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EACL,UAAU,EACV,UAAU,EACV,
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,cAAc;;;;;;;EAqLzB,CAAC"}
|
package/dist/commands/install.js
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
2
|
import { cp, mkdir, rm } from "node:fs/promises";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import { loadConfig, loadLock, saveLock,
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { loadConfig, loadLock, saveLock, parseSourceString, parseArtifactRef, ensureRepo, getRepoPath, discover, checkoutToCache, hashDirectory, getEnabledTargetPaths, } from "@agpm/core";
|
|
5
|
+
/**
|
|
6
|
+
* Find a source in the config by name.
|
|
7
|
+
*/
|
|
8
|
+
function findSource(sources, name) {
|
|
9
|
+
return sources.find((s) => s.name === name);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse collection reference (source/name) into source name and collection name.
|
|
13
|
+
* Collections don't support version refs.
|
|
14
|
+
*/
|
|
15
|
+
function parseCollectionRef(ref) {
|
|
16
|
+
const lastSlash = ref.lastIndexOf("/");
|
|
17
|
+
if (lastSlash === -1)
|
|
18
|
+
return null;
|
|
19
|
+
return {
|
|
20
|
+
sourceName: ref.slice(0, lastSlash),
|
|
21
|
+
collectionName: ref.slice(lastSlash + 1),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
7
24
|
export const installCommand = defineCommand({
|
|
8
25
|
meta: {
|
|
9
26
|
name: "install",
|
|
@@ -21,63 +38,127 @@ export const installCommand = defineCommand({
|
|
|
21
38
|
const cwd = process.cwd();
|
|
22
39
|
const config = await loadConfig(cwd);
|
|
23
40
|
const lock = await loadLock(cwd);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
41
|
+
// Check for configured targets
|
|
42
|
+
const targetDirs = getEnabledTargetPaths(config.targets, "skill");
|
|
43
|
+
if (targetDirs.length === 0) {
|
|
44
|
+
console.log("No targets configured.");
|
|
45
|
+
console.log("\nAdd targets to agpm.json:");
|
|
46
|
+
console.log(' "targets": { "claude-code": true, "opencode": true }');
|
|
27
47
|
return;
|
|
28
48
|
}
|
|
29
|
-
|
|
49
|
+
if (config.collections.length === 0 && config.artifacts.length === 0) {
|
|
50
|
+
console.log("No artifacts or collections configured.");
|
|
51
|
+
console.log("\nAdd artifacts with: agpm add <source> <name>");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Build list of artifact refs to install (expand collections)
|
|
55
|
+
const artifactRefs = [...config.artifacts];
|
|
56
|
+
// Expand collections to their artifacts
|
|
57
|
+
for (const collectionRef of config.collections) {
|
|
58
|
+
const parsed = parseCollectionRef(collectionRef);
|
|
59
|
+
if (!parsed) {
|
|
60
|
+
console.log(`Invalid collection reference: ${collectionRef}`);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const { sourceName, collectionName } = parsed;
|
|
64
|
+
let source = findSource(config.sources, sourceName);
|
|
65
|
+
if (!source) {
|
|
66
|
+
try {
|
|
67
|
+
source = parseSourceString(sourceName);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
console.log(`Source not found: ${sourceName}`);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Discover to find the collection
|
|
75
|
+
await ensureRepo(source);
|
|
76
|
+
const repoPath = getRepoPath(source);
|
|
77
|
+
const result = await discover(repoPath, source.subdir, source.format);
|
|
78
|
+
const collection = result.collections.find((c) => c.name === collectionName);
|
|
79
|
+
if (!collection) {
|
|
80
|
+
console.log(`Collection not found: ${collectionName}`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
// Add each artifact from the collection
|
|
84
|
+
for (const artifactName of collection.artifacts) {
|
|
85
|
+
const artifactRef = `${sourceName}/${artifactName}`;
|
|
86
|
+
if (!artifactRefs.includes(artifactRef)) {
|
|
87
|
+
artifactRefs.push(artifactRef);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
console.log(`Installing ${artifactRefs.length} artifact(s)...\n`);
|
|
30
92
|
let updated = false;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
93
|
+
// Cache discovered artifacts per source to avoid repeated discovery
|
|
94
|
+
const discoveryCache = new Map();
|
|
95
|
+
for (const artifactRef of artifactRefs) {
|
|
96
|
+
const parsed = parseArtifactRef(artifactRef);
|
|
97
|
+
if (!parsed) {
|
|
35
98
|
console.log(`Invalid artifact reference: ${artifactRef}`);
|
|
36
99
|
continue;
|
|
37
100
|
}
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
101
|
+
const { source: sourceName, artifact: artifactName, ref: versionRef } = parsed;
|
|
102
|
+
let source = findSource(config.sources, sourceName);
|
|
103
|
+
if (!source) {
|
|
104
|
+
try {
|
|
105
|
+
source = parseSourceString(sourceName);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
console.log(`Source not found: ${sourceName}`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Build the lock key (without version ref - lock tracks resolved SHA)
|
|
113
|
+
const lockKey = `${sourceName}/${artifactName}`;
|
|
41
114
|
// Check if we have a lock entry
|
|
42
|
-
let lockEntry = lock.artifacts[
|
|
115
|
+
let lockEntry = lock.artifacts[lockKey];
|
|
43
116
|
if (!lockEntry || args.force) {
|
|
44
|
-
// Need to resolve
|
|
45
117
|
console.log(`Resolving ${artifactRef}...`);
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
118
|
+
await ensureRepo(source);
|
|
119
|
+
const repoPath = getRepoPath(source);
|
|
120
|
+
// Checkout to cache at the specified ref (or HEAD)
|
|
121
|
+
const { sha, cachePath } = await checkoutToCache(repoPath, versionRef ?? "HEAD");
|
|
122
|
+
// Get or cache discovered artifacts (discovered from cached repo)
|
|
123
|
+
const cacheKey = `${sourceName}@${sha}`;
|
|
124
|
+
let artifacts = discoveryCache.get(cacheKey);
|
|
125
|
+
if (!artifacts) {
|
|
126
|
+
const result = await discover(cachePath, source.subdir, source.format);
|
|
127
|
+
artifacts = result.artifacts;
|
|
128
|
+
discoveryCache.set(cacheKey, artifacts);
|
|
129
|
+
}
|
|
51
130
|
const artifact = artifacts.find((a) => a.name === artifactName);
|
|
52
131
|
if (!artifact) {
|
|
53
132
|
console.log(` Artifact not found: ${artifactName}`);
|
|
54
133
|
continue;
|
|
55
134
|
}
|
|
56
|
-
//
|
|
57
|
-
const
|
|
135
|
+
// Compute integrity hash of the artifact directory
|
|
136
|
+
const artifactPath = join(cachePath, artifact.path);
|
|
137
|
+
const integrity = await hashDirectory(artifactPath);
|
|
58
138
|
lockEntry = {
|
|
59
139
|
sha,
|
|
60
|
-
integrity
|
|
140
|
+
integrity,
|
|
61
141
|
path: artifact.path,
|
|
142
|
+
...(versionRef && { ref: versionRef }),
|
|
62
143
|
metadata: {
|
|
63
144
|
name: artifact.name,
|
|
64
145
|
description: artifact.description,
|
|
65
146
|
},
|
|
66
147
|
};
|
|
67
|
-
lock.artifacts[
|
|
148
|
+
lock.artifacts[lockKey] = lockEntry;
|
|
68
149
|
updated = true;
|
|
69
150
|
}
|
|
70
|
-
// Install to target directories
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
151
|
+
// Install from cache to target directories
|
|
152
|
+
// First, ensure we have the SHA in cache
|
|
153
|
+
await ensureRepo(source);
|
|
154
|
+
const repoPath = getRepoPath(source);
|
|
155
|
+
const { cachePath } = await checkoutToCache(repoPath, lockEntry.sha);
|
|
156
|
+
const sourcePath = join(cachePath, lockEntry.path);
|
|
157
|
+
for (const targetDir of targetDirs) {
|
|
74
158
|
const targetPath = join(cwd, targetDir, artifactName);
|
|
75
159
|
try {
|
|
76
|
-
// Remove existing
|
|
77
160
|
await rm(targetPath, { recursive: true, force: true });
|
|
78
|
-
// Create parent directory
|
|
79
161
|
await mkdir(join(cwd, targetDir), { recursive: true });
|
|
80
|
-
// Copy skill directory
|
|
81
162
|
await cp(sourcePath, targetPath, { recursive: true });
|
|
82
163
|
console.log(` Installed: ${targetDir}/${artifactName}`);
|
|
83
164
|
}
|
|
@@ -86,7 +167,6 @@ export const installCommand = defineCommand({
|
|
|
86
167
|
}
|
|
87
168
|
}
|
|
88
169
|
}
|
|
89
|
-
// Save lock file if updated
|
|
90
170
|
if (updated) {
|
|
91
171
|
await saveLock(cwd, lock);
|
|
92
172
|
console.log("\nUpdated agpm-lock.json");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,eAAe,EACf,aAAa,EACb,qBAAqB,GAGtB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,SAAS,UAAU,CAAC,OAAiB,EAAE,IAAY;IACjD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;QACnC,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;IAC1C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,oDAAoD;KAClE;IACD,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,GAAG;YACV,WAAW,EAAE,2CAA2C;YACxD,OAAO,EAAE,KAAK;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEjC,+BAA+B;QAC/B,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,8DAA8D;QAC9D,MAAM,YAAY,GAAa,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAErD,wCAAwC;QACxC,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,iCAAiC,aAAa,EAAE,CAAC,CAAC;gBAC9D,SAAS;YACX,CAAC;YAED,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;YAE9C,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;oBAC/C,SAAS;gBACX,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAEtE,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;YAC7E,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,cAAc,EAAE,CAAC,CAAC;gBACvD,SAAS;YACX,CAAC;YAED,wCAAwC;YACxC,KAAK,MAAM,YAAY,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBAChD,MAAM,WAAW,GAAG,GAAG,UAAU,IAAI,YAAY,EAAE,CAAC;gBACpD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBACxC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,cAAc,YAAY,CAAC,MAAM,mBAAmB,CAAC,CAAC;QAElE,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,oEAAoE;QACpE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAgC,CAAC;QAE/D,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;gBAC1D,SAAS;YACX,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;YAE/E,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;oBAC/C,SAAS;gBACX,CAAC;YACH,CAAC;YAED,sEAAsE;YACtE,MAAM,OAAO,GAAG,GAAG,UAAU,IAAI,YAAY,EAAE,CAAC;YAEhD,gCAAgC;YAChC,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAExC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,KAAK,CAAC,CAAC;gBAE3C,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;gBACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;gBAErC,mDAAmD;gBACnD,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,UAAU,IAAI,MAAM,CAAC,CAAC;gBAEjF,kEAAkE;gBAClE,MAAM,QAAQ,GAAG,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC;gBACxC,IAAI,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBACvE,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC7B,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAC1C,CAAC;gBAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;gBAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;oBACrD,SAAS;gBACX,CAAC;gBAED,mDAAmD;gBACnD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;gBAEpD,SAAS,GAAG;oBACV,GAAG;oBACH,SAAS;oBACT,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,GAAG,CAAC,UAAU,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;oBACtC,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;qBAClC;iBACF,CAAC;gBAEF,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;gBACpC,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;YAED,2CAA2C;YAC3C,yCAAyC;YACzC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;YACrE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAEnD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;gBAEtD,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBACvD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACvD,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,IAAI,YAAY,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CACT,0BAA0B,SAAS,KAAM,KAAe,CAAC,OAAO,EAAE,CACnE,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/commands/source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/commands/source.ts"],"names":[],"mappings":"AAwMA,eAAO,MAAM,aAAa,qDAWxB,CAAC"}
|
package/dist/commands/source.js
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
|
-
import { loadConfig, saveConfig,
|
|
2
|
+
import { loadConfig, saveConfig, parseSourceString, ensureRepo, getRepoPath, detectFormat, discover, } from "@agpm/core";
|
|
3
|
+
/**
|
|
4
|
+
* Find a source in the config by name (exact match or partial).
|
|
5
|
+
*/
|
|
6
|
+
function findSource(sources, query) {
|
|
7
|
+
// Try exact name match first
|
|
8
|
+
const exact = sources.find((s) => s.name === query);
|
|
9
|
+
if (exact)
|
|
10
|
+
return exact;
|
|
11
|
+
// Try partial match
|
|
12
|
+
return sources.find((s) => s.name.includes(query) || s.url.includes(query));
|
|
13
|
+
}
|
|
3
14
|
const addCommand = defineCommand({
|
|
4
15
|
meta: {
|
|
5
16
|
name: "add",
|
|
@@ -15,22 +26,22 @@ const addCommand = defineCommand({
|
|
|
15
26
|
async run({ args }) {
|
|
16
27
|
const cwd = process.cwd();
|
|
17
28
|
const config = await loadConfig(cwd);
|
|
18
|
-
// Parse
|
|
19
|
-
const
|
|
20
|
-
console.log(`Adding source: ${
|
|
29
|
+
// Parse CLI shorthand into a Source object
|
|
30
|
+
const source = parseSourceString(args.source);
|
|
31
|
+
console.log(`Adding source: ${source.name}`);
|
|
21
32
|
// Check if already added
|
|
22
|
-
if (config.sources.
|
|
33
|
+
if (findSource(config.sources, source.name)) {
|
|
23
34
|
console.log("Source already exists in config");
|
|
24
35
|
return;
|
|
25
36
|
}
|
|
26
37
|
// Clone/fetch the repo to validate it exists
|
|
27
|
-
console.log(`Fetching ${
|
|
28
|
-
const repo = await ensureRepo(
|
|
38
|
+
console.log(`Fetching ${source.url}...`);
|
|
39
|
+
const repo = await ensureRepo(source);
|
|
29
40
|
console.log(`Cloned to ${repo.path} (${repo.sha.slice(0, 8)})`);
|
|
30
|
-
// Add to config
|
|
31
|
-
config.sources.push(
|
|
41
|
+
// Add to config (as full object)
|
|
42
|
+
config.sources.push(source);
|
|
32
43
|
await saveConfig(cwd, config);
|
|
33
|
-
console.log(`Added source: ${
|
|
44
|
+
console.log(`Added source: ${source.name}`);
|
|
34
45
|
},
|
|
35
46
|
});
|
|
36
47
|
const listCommand = defineCommand({
|
|
@@ -48,10 +59,13 @@ const listCommand = defineCommand({
|
|
|
48
59
|
}
|
|
49
60
|
console.log("Configured sources:\n");
|
|
50
61
|
for (const source of config.sources) {
|
|
51
|
-
|
|
52
|
-
console.log(`
|
|
53
|
-
if (
|
|
54
|
-
console.log(`
|
|
62
|
+
console.log(` ${source.name}`);
|
|
63
|
+
console.log(` url: ${source.url}`);
|
|
64
|
+
if (source.format && source.format !== "auto") {
|
|
65
|
+
console.log(` format: ${source.format}`);
|
|
66
|
+
}
|
|
67
|
+
if (source.subdir) {
|
|
68
|
+
console.log(` subdir: ${source.subdir}`);
|
|
55
69
|
}
|
|
56
70
|
}
|
|
57
71
|
},
|
|
@@ -64,27 +78,27 @@ const removeCommand = defineCommand({
|
|
|
64
78
|
args: {
|
|
65
79
|
source: {
|
|
66
80
|
type: "positional",
|
|
67
|
-
description: "Source to remove",
|
|
81
|
+
description: "Source name to remove",
|
|
68
82
|
required: true,
|
|
69
83
|
},
|
|
70
84
|
},
|
|
71
85
|
async run({ args }) {
|
|
72
86
|
const cwd = process.cwd();
|
|
73
87
|
const config = await loadConfig(cwd);
|
|
74
|
-
const index = config.sources.
|
|
88
|
+
const index = config.sources.findIndex((s) => s.name === args.source);
|
|
75
89
|
if (index === -1) {
|
|
76
90
|
console.log(`Source not found: ${args.source}`);
|
|
77
91
|
return;
|
|
78
92
|
}
|
|
79
|
-
config.sources.splice(index, 1);
|
|
93
|
+
const removed = config.sources.splice(index, 1)[0];
|
|
80
94
|
await saveConfig(cwd, config);
|
|
81
|
-
console.log(`Removed source: ${
|
|
95
|
+
console.log(`Removed source: ${removed.name}`);
|
|
82
96
|
},
|
|
83
97
|
});
|
|
84
98
|
const discoverCommand = defineCommand({
|
|
85
99
|
meta: {
|
|
86
100
|
name: "discover",
|
|
87
|
-
description: "Discover artifacts in a source",
|
|
101
|
+
description: "Discover artifacts and collections in a source",
|
|
88
102
|
},
|
|
89
103
|
args: {
|
|
90
104
|
source: {
|
|
@@ -94,11 +108,17 @@ const discoverCommand = defineCommand({
|
|
|
94
108
|
},
|
|
95
109
|
},
|
|
96
110
|
async run({ args }) {
|
|
97
|
-
const
|
|
98
|
-
const
|
|
111
|
+
const cwd = process.cwd();
|
|
112
|
+
const config = await loadConfig(cwd);
|
|
113
|
+
// Check if source is in config, otherwise parse as new
|
|
114
|
+
let source = findSource(config.sources, args.source);
|
|
115
|
+
if (!source) {
|
|
116
|
+
source = parseSourceString(args.source);
|
|
117
|
+
}
|
|
118
|
+
const repoPath = getRepoPath(source);
|
|
99
119
|
// Ensure repo is cloned
|
|
100
|
-
console.log(`Checking ${
|
|
101
|
-
await ensureRepo(
|
|
120
|
+
console.log(`Checking ${source.name}...`);
|
|
121
|
+
await ensureRepo(source);
|
|
102
122
|
// Detect format
|
|
103
123
|
const format = await detectFormat(repoPath);
|
|
104
124
|
console.log(`Format: ${format}\n`);
|
|
@@ -106,24 +126,41 @@ const discoverCommand = defineCommand({
|
|
|
106
126
|
console.log("Unknown format - no .claude-plugin/marketplace.json or skills/ directory found");
|
|
107
127
|
return;
|
|
108
128
|
}
|
|
109
|
-
// Discover artifacts
|
|
110
|
-
const
|
|
111
|
-
if (artifacts.length === 0) {
|
|
112
|
-
console.log("No artifacts found");
|
|
129
|
+
// Discover artifacts and collections
|
|
130
|
+
const result = await discover(repoPath, source.subdir, source.format);
|
|
131
|
+
if (result.artifacts.length === 0 && result.collections.length === 0) {
|
|
132
|
+
console.log("No artifacts or collections found");
|
|
113
133
|
return;
|
|
114
134
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
console.log(`
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
135
|
+
// Show collections first
|
|
136
|
+
if (result.collections.length > 0) {
|
|
137
|
+
console.log(`Found ${result.collections.length} collection(s):\n`);
|
|
138
|
+
for (const collection of result.collections) {
|
|
139
|
+
console.log(` ${collection.name}`);
|
|
140
|
+
if (collection.description) {
|
|
141
|
+
const desc = collection.description.length > 80
|
|
142
|
+
? collection.description.slice(0, 77) + "..."
|
|
143
|
+
: collection.description;
|
|
144
|
+
console.log(` ${desc}`);
|
|
145
|
+
}
|
|
146
|
+
console.log(` artifacts: ${collection.artifacts.join(", ")}`);
|
|
147
|
+
console.log();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Show artifacts
|
|
151
|
+
if (result.artifacts.length > 0) {
|
|
152
|
+
console.log(`Found ${result.artifacts.length} artifact(s):\n`);
|
|
153
|
+
for (const artifact of result.artifacts) {
|
|
154
|
+
console.log(` ${artifact.name}`);
|
|
155
|
+
if (artifact.description) {
|
|
156
|
+
const desc = artifact.description.length > 80
|
|
157
|
+
? artifact.description.slice(0, 77) + "..."
|
|
158
|
+
: artifact.description;
|
|
159
|
+
console.log(` ${desc}`);
|
|
160
|
+
}
|
|
161
|
+
console.log(` path: ${artifact.path}`);
|
|
162
|
+
console.log();
|
|
124
163
|
}
|
|
125
|
-
console.log(` path: ${artifact.path}`);
|
|
126
|
-
console.log();
|
|
127
164
|
}
|
|
128
165
|
},
|
|
129
166
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/commands/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/commands/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EACL,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,QAAQ,GAET,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,SAAS,UAAU,CAAC,OAAiB,EAAE,KAAa;IAClD,6BAA6B;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACpD,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,oBAAoB;IACpB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,GAAG,aAAa,CAAC;IAC/B,IAAI,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,6BAA6B;KAC3C;IACD,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,mDAAmD;YAChE,QAAQ,EAAE,IAAI;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QAErC,2CAA2C;QAC3C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAE7C,yBAAyB;QACzB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,6CAA6C;QAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAEhE,iCAAiC;QACjC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAE9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,aAAa,CAAC;IAChC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,yBAAyB;KACvC;IACD,KAAK,CAAC,GAAG;QACP,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,aAAa,CAAC;IAClC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kCAAkC;KAChD;IACD,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,uBAAuB;YACpC,QAAQ,EAAE,IAAI;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QAErC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;QACtE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAE9B,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,aAAa,CAAC;IACpC,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,gDAAgD;KAC9D;IACD,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,iCAAiC;YAC9C,QAAQ,EAAE,IAAI;SACf;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QAErC,uDAAuD;QACvD,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAErC,wBAAwB;QACxB,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;QAC1C,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QAEzB,gBAAgB;QAChB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,IAAI,CAAC,CAAC;QAEnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;YAC9F,OAAO;QACT,CAAC;QAED,qCAAqC;QACrC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAEtE,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,WAAW,CAAC,MAAM,mBAAmB,CAAC,CAAC;YACnE,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpC,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;oBAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE;wBAC7C,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;wBAC7C,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC7B,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjE,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,SAAS,CAAC,MAAM,iBAAiB,CAAC,CAAC;YAC/D,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;oBACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE;wBAC3C,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;wBAC3C,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC7B,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,yBAAyB;KACvC;IACD,WAAW,EAAE;QACX,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,aAAa;QACrB,QAAQ,EAAE,eAAe;KAC1B;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,aAAa;;;;;;EAyHxB,CAAC"}
|
package/dist/commands/update.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
|
-
import {
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { loadConfig, loadLock, saveLock, parseSourceString, parseArtifactRef, ensureRepo, getRepoPath, discover, checkoutToCache, hashDirectory, } from "@agpm/core";
|
|
4
|
+
/**
|
|
5
|
+
* Find a source in the config by name.
|
|
6
|
+
*/
|
|
7
|
+
function findSource(sources, name) {
|
|
8
|
+
return sources.find((s) => s.name === name);
|
|
9
|
+
}
|
|
3
10
|
export const updateCommand = defineCommand({
|
|
4
11
|
meta: {
|
|
5
12
|
name: "update",
|
|
@@ -33,36 +40,56 @@ export const updateCommand = defineCommand({
|
|
|
33
40
|
console.log(`Updating ${artifactsToUpdate.length} artifact(s)...\n`);
|
|
34
41
|
let updated = 0;
|
|
35
42
|
for (const artifactRef of artifactsToUpdate) {
|
|
36
|
-
// Parse artifact reference: source/artifact-name
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
// Parse artifact reference: source-name/artifact-name[@ref]
|
|
44
|
+
const parsed = parseArtifactRef(artifactRef);
|
|
45
|
+
if (!parsed) {
|
|
46
|
+
console.log(`Invalid artifact reference: ${artifactRef}`);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const { source: sourceName, artifact: artifactName, ref: versionRef } = parsed;
|
|
50
|
+
// Look up source from config, fallback to parsing as new
|
|
51
|
+
let source = findSource(config.sources, sourceName);
|
|
52
|
+
if (!source) {
|
|
53
|
+
try {
|
|
54
|
+
source = parseSourceString(sourceName);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
console.log(`Source not found: ${sourceName}`);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Lock key is without version ref
|
|
62
|
+
const lockKey = `${sourceName}/${artifactName}`;
|
|
41
63
|
console.log(`Checking ${artifactRef}...`);
|
|
42
64
|
// Fetch latest
|
|
43
|
-
await ensureRepo(
|
|
44
|
-
const repoPath = getRepoPath(
|
|
45
|
-
// Resolve
|
|
46
|
-
const
|
|
65
|
+
await ensureRepo(source);
|
|
66
|
+
const repoPath = getRepoPath(source);
|
|
67
|
+
// Resolve ref to SHA (use pinned ref if specified, otherwise HEAD)
|
|
68
|
+
const refToResolve = versionRef ?? "HEAD";
|
|
69
|
+
const { sha: latestSha, cachePath } = await checkoutToCache(repoPath, refToResolve);
|
|
47
70
|
// Check if update needed
|
|
48
|
-
const lockEntry = lock.artifacts[
|
|
71
|
+
const lockEntry = lock.artifacts[lockKey];
|
|
49
72
|
if (lockEntry && lockEntry.sha === latestSha) {
|
|
50
73
|
console.log(` Already up to date (${latestSha.slice(0, 8)})`);
|
|
51
74
|
continue;
|
|
52
75
|
}
|
|
53
|
-
// Discover to get path
|
|
54
|
-
const
|
|
55
|
-
const artifact = artifacts.find((a) => a.name === artifactName);
|
|
76
|
+
// Discover to get path from cached repo
|
|
77
|
+
const result = await discover(cachePath, source.subdir, source.format);
|
|
78
|
+
const artifact = result.artifacts.find((a) => a.name === artifactName);
|
|
56
79
|
if (!artifact) {
|
|
57
80
|
console.log(` Artifact not found in source`);
|
|
58
81
|
continue;
|
|
59
82
|
}
|
|
83
|
+
// Compute integrity hash
|
|
84
|
+
const artifactPath = join(cachePath, artifact.path);
|
|
85
|
+
const integrity = await hashDirectory(artifactPath);
|
|
60
86
|
const oldSha = lockEntry?.sha?.slice(0, 8) || "none";
|
|
61
87
|
// Update lock
|
|
62
|
-
lock.artifacts[
|
|
88
|
+
lock.artifacts[lockKey] = {
|
|
63
89
|
sha: latestSha,
|
|
64
|
-
integrity
|
|
90
|
+
integrity,
|
|
65
91
|
path: artifact.path,
|
|
92
|
+
...(versionRef && { ref: versionRef }),
|
|
66
93
|
metadata: {
|
|
67
94
|
name: artifact.name,
|
|
68
95
|
description: artifact.description,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,eAAe,EACf,aAAa,GAGd,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,SAAS,UAAU,CAAC,OAAiB,EAAE,IAAY;IACjD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,qCAAqC;KACnD;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE;YACR,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,sEAAsE;YACnF,QAAQ,EAAE,KAAK;SAChB;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,0CAA0C;QAC1C,IAAI,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,KAAK,IAAI,CAAC,QAAQ;gBACrB,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CACpC,CAAC;YAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,iBAAiB,CAAC,MAAM,mBAAmB,CAAC,CAAC;QAErE,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,WAAW,IAAI,iBAAiB,EAAE,CAAC;YAC5C,4DAA4D;YAC5D,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;gBAC1D,SAAS;YACX,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;YAE/E,yDAAyD;YACzD,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;oBAC/C,SAAS;gBACX,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,MAAM,OAAO,GAAG,GAAG,UAAU,IAAI,YAAY,EAAE,CAAC;YAEhD,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,KAAK,CAAC,CAAC;YAE1C,eAAe;YACf,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAErC,mEAAmE;YACnE,MAAM,YAAY,GAAG,UAAU,IAAI,MAAM,CAAC;YAC1C,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAEpF,yBAAyB;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,SAAS,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC/D,SAAS;YACX,CAAC;YAED,wCAAwC;YACxC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAE3F,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,yBAAyB;YACzB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC;YAErD,cAAc;YACd,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG;gBACxB,GAAG,EAAE,SAAS;gBACd,SAAS;gBACT,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,GAAG,CAAC,UAAU,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;gBACtC,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;iBAClC;aACF,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAChE,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,gCAAgC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agpm/cli",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for AGPM - Agent Package Manager for AI coding tool artifacts",
|
|
4
5
|
"type": "module",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/kepler16/agpm.git",
|
|
9
|
+
"directory": "cli/packages/cli"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://agpm.dev",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/kepler16/agpm/issues"
|
|
14
|
+
},
|
|
5
15
|
"bin": {
|
|
6
16
|
"agpm": "dist/index.js"
|
|
7
17
|
},
|
|
@@ -10,7 +20,7 @@
|
|
|
10
20
|
],
|
|
11
21
|
"dependencies": {
|
|
12
22
|
"citty": "^0.1.6",
|
|
13
|
-
"@agpm/core": "0.0
|
|
23
|
+
"@agpm/core": "0.1.0"
|
|
14
24
|
},
|
|
15
25
|
"devDependencies": {
|
|
16
26
|
"tsx": "^4.19.4",
|