@agpm/core 0.0.1 → 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/cache.d.ts +38 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +118 -0
- package/dist/cache.js.map +1 -0
- package/dist/config.d.ts +46 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +37 -1
- package/dist/config.js.map +1 -1
- package/dist/discovery.d.ts +63 -11
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +189 -77
- package/dist/discovery.js.map +1 -1
- package/dist/git.d.ts +25 -23
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +130 -42
- package/dist/git.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/targets.d.ts +46 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +84 -0
- package/dist/targets.js.map +1 -0
- package/package.json +19 -7
package/dist/git.js
CHANGED
|
@@ -2,63 +2,115 @@ import { simpleGit } from "simple-git";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { mkdir } from "node:fs/promises";
|
|
5
|
+
import { cacheRepo, isCached, getCachedRepoPath } from "./cache.js";
|
|
5
6
|
// ============================================================================
|
|
6
7
|
// Source Parsing
|
|
7
8
|
// ============================================================================
|
|
8
9
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* Supported formats:
|
|
12
|
-
* - owner/repo
|
|
13
|
-
* - owner/repo#subpath
|
|
14
|
-
* - https://github.com/owner/repo
|
|
15
|
-
* - https://github.com/owner/repo#subpath
|
|
16
|
-
* - ./local/path
|
|
10
|
+
* Check if a string looks like a git URL.
|
|
17
11
|
*/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
function isGitUrl(str) {
|
|
13
|
+
return (str.startsWith("https://") ||
|
|
14
|
+
str.startsWith("http://") ||
|
|
15
|
+
str.startsWith("git://") ||
|
|
16
|
+
str.startsWith("git+ssh://") ||
|
|
17
|
+
str.startsWith("git+https://") ||
|
|
18
|
+
str.startsWith("ssh://") ||
|
|
19
|
+
str.startsWith("git@"));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract owner/repo from a GitHub-like URL.
|
|
23
|
+
* Works with github.com, gitlab.com, bitbucket.org, etc.
|
|
24
|
+
*/
|
|
25
|
+
function extractRepoInfo(url) {
|
|
26
|
+
// Handle git@host:owner/repo.git format
|
|
27
|
+
const sshMatch = url.match(/git@[\w.-]+:([\w.-]+)\/([\w.-]+)/);
|
|
28
|
+
if (sshMatch) {
|
|
29
|
+
return {
|
|
30
|
+
owner: sshMatch[1],
|
|
31
|
+
repo: sshMatch[2].replace(/\.git$/, ""),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Handle URL formats (https://, git://, ssh://, etc.)
|
|
35
|
+
const urlMatch = url.match(/(?:github\.com|gitlab\.com|bitbucket\.org)[/:]+([\w.-]+)\/([\w.-]+)/);
|
|
36
|
+
if (urlMatch) {
|
|
22
37
|
return {
|
|
23
|
-
|
|
24
|
-
|
|
38
|
+
owner: urlMatch[1],
|
|
39
|
+
repo: urlMatch[2].replace(/\.git$/, ""),
|
|
25
40
|
};
|
|
26
41
|
}
|
|
27
|
-
|
|
28
|
-
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Ensure URL ends with .git for consistency.
|
|
46
|
+
*/
|
|
47
|
+
function normalizeGitUrl(url) {
|
|
48
|
+
// Remove git+ prefix for storage (git+ssh:// -> ssh://)
|
|
49
|
+
let normalized = url.replace(/^git\+(ssh|https):\/\//, "$1://");
|
|
50
|
+
// Add .git suffix if missing
|
|
51
|
+
if (!normalized.endsWith(".git")) {
|
|
52
|
+
normalized = `${normalized}.git`;
|
|
53
|
+
}
|
|
54
|
+
return normalized;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse a CLI source shorthand string into a normalized Source object.
|
|
58
|
+
*
|
|
59
|
+
* Supported formats:
|
|
60
|
+
* - owner/repo (GitHub shorthand)
|
|
61
|
+
* - owner/repo#subdir
|
|
62
|
+
* - https://github.com/owner/repo
|
|
63
|
+
* - git://github.com/owner/repo
|
|
64
|
+
* - git+ssh://git@github.com/owner/repo
|
|
65
|
+
* - git@github.com:owner/repo
|
|
66
|
+
* - Any of the above with #subdir suffix
|
|
67
|
+
*
|
|
68
|
+
* Returns a Source object suitable for storing in agpm.json.
|
|
69
|
+
*/
|
|
70
|
+
export function parseSourceString(input) {
|
|
71
|
+
// Split on # for subdir
|
|
72
|
+
let subdir;
|
|
73
|
+
let source = input;
|
|
29
74
|
const hashIndex = source.indexOf("#");
|
|
30
75
|
if (hashIndex !== -1) {
|
|
31
|
-
|
|
76
|
+
subdir = source.slice(hashIndex + 1);
|
|
32
77
|
source = source.slice(0, hashIndex);
|
|
33
78
|
}
|
|
34
|
-
// Full URL
|
|
35
|
-
if (
|
|
36
|
-
const
|
|
37
|
-
|
|
79
|
+
// Full URL (various git protocols)
|
|
80
|
+
if (isGitUrl(source)) {
|
|
81
|
+
const repoInfo = extractRepoInfo(source);
|
|
82
|
+
const url = normalizeGitUrl(source);
|
|
83
|
+
if (repoInfo) {
|
|
38
84
|
return {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
subpath,
|
|
43
|
-
original,
|
|
85
|
+
name: `${repoInfo.owner}/${repoInfo.repo}`,
|
|
86
|
+
url,
|
|
87
|
+
...(subdir && { subdir }),
|
|
44
88
|
};
|
|
45
89
|
}
|
|
46
|
-
|
|
90
|
+
// Non-standard URL - use sanitized version as name
|
|
91
|
+
const name = source
|
|
92
|
+
.replace(/^(git\+)?(https?|git|ssh):\/\//, "")
|
|
93
|
+
.replace(/^git@/, "")
|
|
94
|
+
.replace(/\.git$/, "")
|
|
95
|
+
.replace(":", "/");
|
|
96
|
+
return {
|
|
97
|
+
name,
|
|
98
|
+
url,
|
|
99
|
+
...(subdir && { subdir }),
|
|
100
|
+
};
|
|
47
101
|
}
|
|
48
|
-
// owner/repo shorthand
|
|
102
|
+
// owner/repo shorthand (assumes GitHub)
|
|
49
103
|
const parts = source.split("/");
|
|
50
104
|
if (parts.length >= 2) {
|
|
51
105
|
const owner = parts[0];
|
|
52
106
|
const repo = parts[1];
|
|
53
107
|
return {
|
|
108
|
+
name: `${owner}/${repo}`,
|
|
54
109
|
url: `https://github.com/${owner}/${repo}.git`,
|
|
55
|
-
|
|
56
|
-
repo,
|
|
57
|
-
subpath,
|
|
58
|
-
original,
|
|
110
|
+
...(subdir && { subdir }),
|
|
59
111
|
};
|
|
60
112
|
}
|
|
61
|
-
throw new Error(`Invalid source format: ${
|
|
113
|
+
throw new Error(`Invalid source format: ${input}`);
|
|
62
114
|
}
|
|
63
115
|
// ============================================================================
|
|
64
116
|
// Repository Management
|
|
@@ -70,19 +122,35 @@ export function getAgpmDir() {
|
|
|
70
122
|
return join(homedir(), ".agpm");
|
|
71
123
|
}
|
|
72
124
|
/**
|
|
73
|
-
* Get the path where a repo should be stored.
|
|
125
|
+
* Get the path where a repo should be stored based on its URL.
|
|
74
126
|
*/
|
|
75
127
|
export function getRepoPath(source) {
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
128
|
+
const agpmDir = getAgpmDir();
|
|
129
|
+
// Parse the URL to extract host and path
|
|
130
|
+
const url = source.url;
|
|
131
|
+
// Handle git@host:path format
|
|
132
|
+
const sshMatch = url.match(/git@([\w.-]+):([\w.-]+)\/([\w.-]+)/);
|
|
133
|
+
if (sshMatch) {
|
|
134
|
+
const host = sshMatch[1];
|
|
135
|
+
const owner = sshMatch[2];
|
|
136
|
+
const repo = sshMatch[3].replace(/\.git$/, "");
|
|
137
|
+
return join(agpmDir, "repos", host, owner, repo);
|
|
138
|
+
}
|
|
139
|
+
// Handle URL formats
|
|
140
|
+
const urlMatch = url.match(/(?:https?|git|ssh):\/\/([\w.-]+)\/([\w.-]+)\/([\w.-]+)/);
|
|
141
|
+
if (urlMatch) {
|
|
142
|
+
const host = urlMatch[1];
|
|
143
|
+
const owner = urlMatch[2];
|
|
144
|
+
const repo = urlMatch[3].replace(/\.git$/, "");
|
|
145
|
+
return join(agpmDir, "repos", host, owner, repo);
|
|
79
146
|
}
|
|
80
|
-
//
|
|
81
|
-
const sanitized =
|
|
82
|
-
.replace(/^https
|
|
147
|
+
// Fallback: sanitize the whole URL
|
|
148
|
+
const sanitized = url
|
|
149
|
+
.replace(/^(git\+)?(https?|git|ssh):\/\//, "")
|
|
150
|
+
.replace(/^git@/, "")
|
|
83
151
|
.replace(/\.git$/, "")
|
|
84
|
-
.replace(/[^a-zA-Z0-9
|
|
85
|
-
return join(
|
|
152
|
+
.replace(/[^a-zA-Z0-9./-]/g, "_");
|
|
153
|
+
return join(agpmDir, "repos", sanitized);
|
|
86
154
|
}
|
|
87
155
|
/**
|
|
88
156
|
* Clone or fetch a repository.
|
|
@@ -127,4 +195,24 @@ export async function resolveRef(repoPath, ref = "HEAD") {
|
|
|
127
195
|
const result = await git.revparse([ref]);
|
|
128
196
|
return result.trim();
|
|
129
197
|
}
|
|
198
|
+
/**
|
|
199
|
+
* Checkout a ref and cache the repo at that SHA.
|
|
200
|
+
*
|
|
201
|
+
* 1. Resolves the ref to a full SHA
|
|
202
|
+
* 2. If not already cached, checkouts the repo at that SHA and caches it
|
|
203
|
+
* 3. Returns the SHA and path to the cached repo
|
|
204
|
+
*/
|
|
205
|
+
export async function checkoutToCache(repoPath, ref = "HEAD") {
|
|
206
|
+
// Resolve ref to full SHA
|
|
207
|
+
const sha = await resolveRef(repoPath, ref);
|
|
208
|
+
// Check if already cached
|
|
209
|
+
if (await isCached(sha)) {
|
|
210
|
+
return { sha, cachePath: getCachedRepoPath(sha) };
|
|
211
|
+
}
|
|
212
|
+
// Checkout the specific SHA
|
|
213
|
+
await checkoutRef(repoPath, sha);
|
|
214
|
+
// Cache the repo at this SHA
|
|
215
|
+
const cachePath = await cacheRepo(repoPath, sha);
|
|
216
|
+
return { sha, cachePath };
|
|
217
|
+
}
|
|
130
218
|
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
export { type AgpmConfig, type AgpmLock, type TargetConfig, type LockedArtifact, DEFAULT_CONFIG, DEFAULT_LOCK, CONFIG_SCHEMA_URL, LOCK_SCHEMA_URL, loadConfig, saveConfig, loadLock, saveLock, } from "./config.js";
|
|
1
|
+
export { type AgpmConfig, type AgpmLock, type TargetConfig, type LockedArtifact, type Source, type SourceFormat, type ArtifactRef, DEFAULT_CONFIG, DEFAULT_LOCK, CONFIG_SCHEMA_URL, LOCK_SCHEMA_URL, loadConfig, saveConfig, loadLock, saveLock, parseArtifactRef, } from "./config.js";
|
|
2
2
|
export { type ValidationError, type ValidationResult, validateConfig, validateLock, formatValidationErrors, } from "./validate.js";
|
|
3
|
-
export { type
|
|
4
|
-
export {
|
|
3
|
+
export { type RepoInfo, parseSourceString, getAgpmDir, getRepoPath, ensureRepo, checkoutRef, resolveRef, checkoutToCache, } from "./git.js";
|
|
4
|
+
export { getAgpmCacheDir, getCachedRepoPath, isCached, cacheRepo, hashDirectory, verifyIntegrity, } from "./cache.js";
|
|
5
|
+
export { type DiscoveredArtifact, type DiscoveredCollection, type DiscoveryResult, type PluginEntry, type ClaudeMarketplaceManifest, type ClaudePluginManifest, type SkillMetadata, type RepoFormat, detectFormat, discover, discoverArtifacts, } from "./discovery.js";
|
|
6
|
+
export { type TargetDefinition, type ArtifactType, BUILT_IN_TARGETS, getTargetPath, getEnabledTargetPaths, isValidTarget, getValidTargetNames, } from "./targets.js";
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,cAAc,EACd,YAAY,EACZ,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,KAAK,QAAQ,EACb,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,eAAe,GAChB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,YAAY,EACZ,QAAQ,EACR,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,mBAAmB,GACpB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
// Config types and I/O
|
|
2
|
-
export { DEFAULT_CONFIG, DEFAULT_LOCK, CONFIG_SCHEMA_URL, LOCK_SCHEMA_URL, loadConfig, saveConfig, loadLock, saveLock, } from "./config.js";
|
|
2
|
+
export { DEFAULT_CONFIG, DEFAULT_LOCK, CONFIG_SCHEMA_URL, LOCK_SCHEMA_URL, loadConfig, saveConfig, loadLock, saveLock, parseArtifactRef, } from "./config.js";
|
|
3
3
|
// Validation
|
|
4
4
|
export { validateConfig, validateLock, formatValidationErrors, } from "./validate.js";
|
|
5
5
|
// Git operations
|
|
6
|
-
export {
|
|
6
|
+
export { parseSourceString, getAgpmDir, getRepoPath, ensureRepo, checkoutRef, resolveRef, checkoutToCache, } from "./git.js";
|
|
7
|
+
// Cache operations
|
|
8
|
+
export { getAgpmCacheDir, getCachedRepoPath, isCached, cacheRepo, hashDirectory, verifyIntegrity, } from "./cache.js";
|
|
7
9
|
// Discovery
|
|
8
|
-
export { detectFormat, discoverArtifacts, } from "./discovery.js";
|
|
10
|
+
export { detectFormat, discover, discoverArtifacts, } from "./discovery.js";
|
|
11
|
+
// Targets
|
|
12
|
+
export { BUILT_IN_TARGETS, getTargetPath, getEnabledTargetPaths, isValidTarget, getValidTargetNames, } from "./targets.js";
|
|
9
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAQL,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,aAAa;AACb,OAAO,EAGL,cAAc,EACd,YAAY,EACZ,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,iBAAiB;AACjB,OAAO,EAEL,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,eAAe,GAChB,MAAM,UAAU,CAAC;AAElB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,YAAY;AACZ,OAAO,EASL,YAAY,EACZ,QAAQ,EACR,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,UAAU;AACV,OAAO,EAGL,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,mBAAmB,GACpB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Definition of a target tool's directory structure.
|
|
3
|
+
*/
|
|
4
|
+
export interface TargetDefinition {
|
|
5
|
+
/** Base directory for this target (e.g., ".claude") */
|
|
6
|
+
basePath: string;
|
|
7
|
+
/** Subdirectory for skills (relative to basePath) */
|
|
8
|
+
skillsDir: string;
|
|
9
|
+
/** Subdirectory for commands (relative to basePath), undefined if not supported */
|
|
10
|
+
commandsDir?: string;
|
|
11
|
+
/** Subdirectory for hooks (relative to basePath), undefined if not supported */
|
|
12
|
+
hooksDir?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Built-in target definitions.
|
|
16
|
+
* Only these targets are supported.
|
|
17
|
+
*/
|
|
18
|
+
export declare const BUILT_IN_TARGETS: Record<string, TargetDefinition>;
|
|
19
|
+
/**
|
|
20
|
+
* Artifact types that can be installed.
|
|
21
|
+
*/
|
|
22
|
+
export type ArtifactType = "skill" | "command" | "hook";
|
|
23
|
+
/**
|
|
24
|
+
* Get the target path for a specific artifact type.
|
|
25
|
+
* Returns null if the target doesn't exist or doesn't support the artifact type.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getTargetPath(targetName: string, artifactType: ArtifactType): string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Get all target paths for enabled targets.
|
|
30
|
+
* Only returns paths for targets that support the given artifact type.
|
|
31
|
+
*
|
|
32
|
+
* Target config can be:
|
|
33
|
+
* - `true` (simplified form): target is enabled with defaults
|
|
34
|
+
* - `{}` (object form): target is enabled, allows future options
|
|
35
|
+
* - `false` or missing: target is disabled
|
|
36
|
+
*/
|
|
37
|
+
export declare function getEnabledTargetPaths(targets: Record<string, unknown>, artifactType: ArtifactType): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Check if a target name is valid (built-in).
|
|
40
|
+
*/
|
|
41
|
+
export declare function isValidTarget(targetName: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get list of all valid target names.
|
|
44
|
+
*/
|
|
45
|
+
export declare function getValidTargetNames(): string[];
|
|
46
|
+
//# sourceMappingURL=targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAgB7D,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAMxD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,GACzB,MAAM,GAAG,IAAI,CAkBf;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,EAAE,YAAY,GACzB,MAAM,EAAE,CAcV;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
|
package/dist/targets.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Target Definitions
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Built-in target definitions.
|
|
6
|
+
* Only these targets are supported.
|
|
7
|
+
*/
|
|
8
|
+
export const BUILT_IN_TARGETS = {
|
|
9
|
+
"claude-code": {
|
|
10
|
+
basePath: ".claude",
|
|
11
|
+
skillsDir: "skills",
|
|
12
|
+
commandsDir: "commands",
|
|
13
|
+
hooksDir: "hooks",
|
|
14
|
+
},
|
|
15
|
+
opencode: {
|
|
16
|
+
basePath: ".opencode",
|
|
17
|
+
skillsDir: "skills",
|
|
18
|
+
hooksDir: "hooks",
|
|
19
|
+
},
|
|
20
|
+
codex: {
|
|
21
|
+
basePath: ".codex",
|
|
22
|
+
skillsDir: "skills",
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Helper Functions
|
|
27
|
+
// ============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* Get the target path for a specific artifact type.
|
|
30
|
+
* Returns null if the target doesn't exist or doesn't support the artifact type.
|
|
31
|
+
*/
|
|
32
|
+
export function getTargetPath(targetName, artifactType) {
|
|
33
|
+
const target = BUILT_IN_TARGETS[targetName];
|
|
34
|
+
if (!target)
|
|
35
|
+
return null;
|
|
36
|
+
let subdir;
|
|
37
|
+
switch (artifactType) {
|
|
38
|
+
case "skill":
|
|
39
|
+
subdir = target.skillsDir;
|
|
40
|
+
break;
|
|
41
|
+
case "command":
|
|
42
|
+
subdir = target.commandsDir;
|
|
43
|
+
break;
|
|
44
|
+
case "hook":
|
|
45
|
+
subdir = target.hooksDir;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
return subdir ? `${target.basePath}/${subdir}` : null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get all target paths for enabled targets.
|
|
52
|
+
* Only returns paths for targets that support the given artifact type.
|
|
53
|
+
*
|
|
54
|
+
* Target config can be:
|
|
55
|
+
* - `true` (simplified form): target is enabled with defaults
|
|
56
|
+
* - `{}` (object form): target is enabled, allows future options
|
|
57
|
+
* - `false` or missing: target is disabled
|
|
58
|
+
*/
|
|
59
|
+
export function getEnabledTargetPaths(targets, artifactType) {
|
|
60
|
+
const paths = [];
|
|
61
|
+
for (const [targetName, config] of Object.entries(targets)) {
|
|
62
|
+
// Skip disabled targets (false or falsy, but not empty object)
|
|
63
|
+
if (config === false)
|
|
64
|
+
continue;
|
|
65
|
+
const path = getTargetPath(targetName, artifactType);
|
|
66
|
+
if (path) {
|
|
67
|
+
paths.push(path);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return paths;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if a target name is valid (built-in).
|
|
74
|
+
*/
|
|
75
|
+
export function isValidTarget(targetName) {
|
|
76
|
+
return targetName in BUILT_IN_TARGETS;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get list of all valid target names.
|
|
80
|
+
*/
|
|
81
|
+
export function getValidTargetNames() {
|
|
82
|
+
return Object.keys(BUILT_IN_TARGETS);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAgB/E;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IAChE,aAAa,EAAE;QACb,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,UAAU;QACvB,QAAQ,EAAE,OAAO;KAClB;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,OAAO;KAClB;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,QAAQ;KACpB;CACF,CAAC;AAOF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,UAAkB,EAClB,YAA0B;IAE1B,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,MAA0B,CAAC;IAC/B,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,OAAO;YACV,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;YAC1B,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;YAC5B,MAAM;QACR,KAAK,MAAM;YACT,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;YACzB,MAAM;IACV,CAAC;IAED,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAgC,EAChC,YAA0B;IAE1B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,+DAA+D;QAC/D,IAAI,MAAM,KAAK,KAAK;YAAE,SAAS;QAE/B,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACrD,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,UAAU,IAAI,gBAAgB,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACvC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agpm/core",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Core library for AGPM - config, git, discovery, caching, validation",
|
|
4
5
|
"type": "module",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/kepler16/agpm.git",
|
|
9
|
+
"directory": "cli/packages/core"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://agpm.dev",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/kepler16/agpm/issues"
|
|
14
|
+
},
|
|
5
15
|
"exports": {
|
|
6
16
|
".": {
|
|
7
17
|
"types": "./dist/index.d.ts",
|
|
8
18
|
"import": "./dist/index.js"
|
|
9
19
|
}
|
|
10
20
|
},
|
|
11
|
-
"files": [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"typecheck": "tsc --noEmit"
|
|
15
|
-
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
16
24
|
"dependencies": {
|
|
17
25
|
"ajv": "^8.17.1",
|
|
18
26
|
"fast-glob": "^3.3.3",
|
|
@@ -21,5 +29,9 @@
|
|
|
21
29
|
},
|
|
22
30
|
"devDependencies": {
|
|
23
31
|
"typescript": "^5.7.0"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc",
|
|
35
|
+
"typecheck": "tsc --noEmit"
|
|
24
36
|
}
|
|
25
|
-
}
|
|
37
|
+
}
|