opkg 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -33
- package/dist/commands/install.js +12 -7
- package/dist/commands/install.js.map +1 -1
- package/dist/constants/index.js +21 -0
- package/dist/constants/index.js.map +1 -1
- package/dist/core/add/add-to-source-pipeline.js +1 -1
- package/dist/core/add/add-to-source-pipeline.js.map +1 -1
- package/dist/core/directory.js +18 -18
- package/dist/core/directory.js.map +1 -1
- package/dist/core/flows/platform-converter.js +2 -3
- package/dist/core/flows/platform-converter.js.map +1 -1
- package/dist/core/install/bulk-install-pipeline.js +2 -1
- package/dist/core/install/bulk-install-pipeline.js.map +1 -1
- package/dist/core/install/flow-based-installer.js +28 -10
- package/dist/core/install/flow-based-installer.js.map +1 -1
- package/dist/core/install/git-package-loader.js +23 -5
- package/dist/core/install/git-package-loader.js.map +1 -1
- package/dist/core/install/marketplace-handler.js +67 -26
- package/dist/core/install/marketplace-handler.js.map +1 -1
- package/dist/core/install/path-install-pipeline.js +9 -5
- package/dist/core/install/path-install-pipeline.js.map +1 -1
- package/dist/core/install/path-package-loader.js +15 -9
- package/dist/core/install/path-package-loader.js.map +1 -1
- package/dist/core/install/plugin-detector.js +4 -6
- package/dist/core/install/plugin-detector.js.map +1 -1
- package/dist/core/install/plugin-transformer.js +25 -15
- package/dist/core/install/plugin-transformer.js.map +1 -1
- package/dist/core/package.js +1 -1
- package/dist/core/package.js.map +1 -1
- package/dist/core/remove/remove-from-source-pipeline.js +1 -1
- package/dist/core/remove/remove-from-source-pipeline.js.map +1 -1
- package/dist/utils/git-cache.js +196 -0
- package/dist/utils/git-cache.js.map +1 -0
- package/dist/utils/git-clone.js +123 -43
- package/dist/utils/git-clone.js.map +1 -1
- package/dist/utils/git-url-parser.js +113 -0
- package/dist/utils/git-url-parser.js.map +1 -0
- package/dist/utils/index-based-installer.js +2 -2
- package/dist/utils/index-based-installer.js.map +1 -1
- package/dist/utils/package-input.js +5 -4
- package/dist/utils/package-input.js.map +1 -1
- package/dist/utils/package-name.js +54 -16
- package/dist/utils/package-name.js.map +1 -1
- package/dist/utils/platform-file.js +2 -4
- package/dist/utils/platform-file.js.map +1 -1
- package/dist/utils/plugin-naming.js +111 -0
- package/dist/utils/plugin-naming.js.map +1 -0
- package/dist/utils/tarball.js +2 -2
- package/dist/utils/tarball.js.map +1 -1
- package/package.json +1 -1
- package/platforms.jsonc +1 -1
- package/specs/install/README.md +2 -1
- package/specs/install/git-cache.md +403 -0
- package/specs/install/git-sources.md +111 -23
- package/specs/new/README.md +3 -1
- package/specs/set/README.md +5 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ValidationError } from './errors.js';
|
|
2
2
|
/**
|
|
3
|
-
* Regex pattern for scoped package names (@scope/name)
|
|
3
|
+
* Regex pattern for scoped package names (@scope/name or @scope/name/subname/...)
|
|
4
|
+
* Supports multiple slashes for hierarchical names like @anthropics/claude-code/commit-commands
|
|
4
5
|
*/
|
|
5
6
|
export const SCOPED_PACKAGE_REGEX = /^@([^\/]+)\/(.+)$/;
|
|
6
7
|
/**
|
|
@@ -45,17 +46,26 @@ function validatePackageNamePart(part, fullName, partType) {
|
|
|
45
46
|
if (/[A-Z]/.test(part)) {
|
|
46
47
|
throw new ValidationError(`Package name '${fullName}' must be lowercase`);
|
|
47
48
|
}
|
|
48
|
-
//
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
// Split by slashes to validate each segment individually
|
|
50
|
+
const segments = part.split('/');
|
|
51
|
+
for (let i = 0; i < segments.length; i++) {
|
|
52
|
+
const segment = segments[i];
|
|
53
|
+
// Check for empty segments (e.g., double slashes)
|
|
54
|
+
if (!segment || segment.trim() === '') {
|
|
55
|
+
throw new ValidationError(`Package name '${fullName}' cannot have empty segments (consecutive or trailing slashes)`);
|
|
56
|
+
}
|
|
57
|
+
// Check first character of each segment
|
|
58
|
+
if (/^[0-9.\-]/.test(segment)) {
|
|
59
|
+
throw new ValidationError(`Package ${partType} '${fullName}' segment '${segment}' cannot start with a number, dot, or hyphen`);
|
|
60
|
+
}
|
|
61
|
+
// Check for consecutive special characters within a segment
|
|
62
|
+
if (/(\.\.|__|--)/.test(segment)) {
|
|
63
|
+
throw new ValidationError(`Package name '${fullName}' segment '${segment}' cannot have consecutive dots, underscores, or hyphens`);
|
|
64
|
+
}
|
|
65
|
+
// Check allowed characters only (a-z, 0-9, ., _, -, but no slashes within segment)
|
|
66
|
+
if (!/^[a-z0-9._-]+$/.test(segment)) {
|
|
67
|
+
throw new ValidationError(`Package name '${fullName}' segment '${segment}' contains invalid characters (use only: a-z, 0-9, ., _, -)`);
|
|
68
|
+
}
|
|
59
69
|
}
|
|
60
70
|
}
|
|
61
71
|
/**
|
|
@@ -89,13 +99,41 @@ export function parsePackageInput(packageInput) {
|
|
|
89
99
|
* Returns { name, version?, registryPath? }
|
|
90
100
|
*/
|
|
91
101
|
export function parsePackageInstallSpec(raw) {
|
|
92
|
-
|
|
93
|
-
|
|
102
|
+
// Explicit separator for unambiguous registry paths:
|
|
103
|
+
// package@1.2.3::rules/foo.md
|
|
104
|
+
// @scope/name/sub::commands/bar.md
|
|
105
|
+
const explicitSep = raw.indexOf('::');
|
|
106
|
+
if (explicitSep !== -1) {
|
|
107
|
+
const packagePortion = raw.slice(0, explicitSep);
|
|
108
|
+
const registryPath = raw.slice(explicitSep + 2);
|
|
109
|
+
if (!packagePortion || !registryPath) {
|
|
110
|
+
throw new ValidationError(`Invalid install spec '${raw}'. Use 'package::path/to/file' or 'package@version::path/to/file'.`);
|
|
111
|
+
}
|
|
112
|
+
const { name, version } = parsePackageInput(packagePortion);
|
|
113
|
+
return { name, version, registryPath };
|
|
114
|
+
}
|
|
115
|
+
// Backward-compatible "package/path" parsing, with special handling for scoped
|
|
116
|
+
// hierarchical names like @scope/marketplace/plugin (3+ segments).
|
|
117
|
+
const scopeFirstSlash = raw.startsWith('@') ? raw.indexOf('/', 1) : -1;
|
|
118
|
+
const scopedSecondSlash = scopeFirstSlash !== -1 ? raw.indexOf('/', scopeFirstSlash + 1) : -1;
|
|
119
|
+
const splitSlashIndex = raw.indexOf('/', raw.startsWith('@') ? scopeFirstSlash + 1 : 0);
|
|
120
|
+
// For scoped names, only treat the third segment as registryPath if it looks like a path
|
|
121
|
+
// (contains '/' or '.') to avoid breaking marketplace plugin names like:
|
|
122
|
+
// @anthropics/claude-plugins-official/github
|
|
123
|
+
if (raw.startsWith('@') && scopedSecondSlash !== -1) {
|
|
124
|
+
const registryPathCandidate = raw.slice(scopedSecondSlash + 1);
|
|
125
|
+
const looksLikeRegistryPath = registryPathCandidate.includes('/') || registryPathCandidate.includes('.');
|
|
126
|
+
if (!looksLikeRegistryPath) {
|
|
127
|
+
// Treat the whole string as the package name.
|
|
128
|
+
return parsePackageInput(raw);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (splitSlashIndex === -1) {
|
|
94
132
|
// No path portion; fall back to standard parsing
|
|
95
133
|
return parsePackageInput(raw);
|
|
96
134
|
}
|
|
97
|
-
const packagePortion = raw.slice(0,
|
|
98
|
-
const registryPath = raw.slice(
|
|
135
|
+
const packagePortion = raw.slice(0, splitSlashIndex);
|
|
136
|
+
const registryPath = raw.slice(splitSlashIndex + 1);
|
|
99
137
|
if (!registryPath) {
|
|
100
138
|
throw new ValidationError(`Invalid install spec '${raw}'. Provide a registry path after the package name, e.g. package/path/to/file.md.`);
|
|
101
139
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-name.js","sourceRoot":"","sources":["../../src/utils/package-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C
|
|
1
|
+
{"version":3,"file":"package-name.js","sourceRoot":"","sources":["../../src/utils/package-name.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* Platform File Utilities
|
|
3
3
|
* Shared utilities for handling platform-specific file paths and extensions
|
|
4
4
|
*/
|
|
5
|
-
import { basename } from 'path';
|
|
5
|
+
import { basename, join } from 'path';
|
|
6
6
|
import { getPlatformDefinition, getAllPlatforms, getAllUniversalSubdirs, isPlatformId } from '../core/platforms.js';
|
|
7
7
|
import { FILE_PATTERNS } from '../constants/index.js';
|
|
8
8
|
import { getFirstPathComponent, parsePathWithPrefix, normalizePathForProcessing } from './path-normalization.js';
|
|
9
|
+
import { mapUniversalToPlatform } from './platform-mapper.js';
|
|
9
10
|
/**
|
|
10
11
|
* Parse a registry or universal path to extract subdir and relative path info
|
|
11
12
|
* Platform suffix detection is always enabled and supports both file-level and directory-level suffixes.
|
|
@@ -116,12 +117,9 @@ export function getPlatformSpecificFilename(universalPath, platform, cwd) {
|
|
|
116
117
|
* @returns Object with absolute directory and file paths
|
|
117
118
|
*/
|
|
118
119
|
export async function getPlatformSpecificPath(cwd, universalSubdir, relPath, platform) {
|
|
119
|
-
// Import here to avoid circular dependencies
|
|
120
|
-
const { mapUniversalToPlatform } = await import('./platform-mapper.js');
|
|
121
120
|
// Get the mapping
|
|
122
121
|
const { relDir, relFile } = mapUniversalToPlatform(platform, universalSubdir, relPath, cwd);
|
|
123
122
|
// Convert relative paths to absolute paths
|
|
124
|
-
const { join } = await import('path');
|
|
125
123
|
return {
|
|
126
124
|
absDir: join(cwd, relDir),
|
|
127
125
|
absFile: join(cwd, relFile)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-file.js","sourceRoot":"","sources":["../../src/utils/platform-file.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"platform-file.js","sourceRoot":"","sources":["../../src/utils/platform-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { basename } from 'path';
|
|
2
|
+
import { extractGitHubInfo } from './git-url-parser.js';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Generate a scoped name for a Claude Code plugin.
|
|
6
|
+
*
|
|
7
|
+
* Format:
|
|
8
|
+
* - GitHub repo with subdirectory: @username/repo/plugin-name
|
|
9
|
+
* - GitHub repo (plugin is the repo): @username/plugin-name
|
|
10
|
+
* - Non-GitHub or local: plugin-name (no scoping)
|
|
11
|
+
*
|
|
12
|
+
* Fallback behavior:
|
|
13
|
+
* - If pluginManifestName is undefined → use subdirectory name or repo name
|
|
14
|
+
* - If marketplaceName is undefined → use repo name
|
|
15
|
+
*/
|
|
16
|
+
export function generatePluginName(context) {
|
|
17
|
+
const { gitUrl, subdirectory, pluginManifestName, marketplaceName, repoPath } = context;
|
|
18
|
+
// If no Git URL, use plugin manifest name or fallback
|
|
19
|
+
if (!gitUrl) {
|
|
20
|
+
const generated = pluginManifestName || (subdirectory ? basename(subdirectory) : 'unnamed-plugin');
|
|
21
|
+
return generated;
|
|
22
|
+
}
|
|
23
|
+
// Try to extract GitHub info
|
|
24
|
+
const githubInfo = extractGitHubInfo(gitUrl);
|
|
25
|
+
// If not GitHub, use plugin manifest name
|
|
26
|
+
if (!githubInfo) {
|
|
27
|
+
logger.debug('Non-GitHub URL, using plugin manifest name', { gitUrl });
|
|
28
|
+
const generated = pluginManifestName || (subdirectory ? basename(subdirectory) : 'unnamed-plugin');
|
|
29
|
+
return generated;
|
|
30
|
+
}
|
|
31
|
+
// GitHub URL - generate scoped name
|
|
32
|
+
const { username, repo } = githubInfo;
|
|
33
|
+
// Determine plugin name
|
|
34
|
+
let pluginName;
|
|
35
|
+
if (pluginManifestName) {
|
|
36
|
+
// Use plugin manifest name if provided
|
|
37
|
+
pluginName = pluginManifestName;
|
|
38
|
+
}
|
|
39
|
+
else if (subdirectory) {
|
|
40
|
+
// Use subdirectory name as fallback
|
|
41
|
+
pluginName = basename(subdirectory);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Use repo name as fallback
|
|
45
|
+
pluginName = repo;
|
|
46
|
+
}
|
|
47
|
+
// Determine if this is a marketplace plugin (has subdirectory)
|
|
48
|
+
const isMarketplacePlugin = Boolean(subdirectory);
|
|
49
|
+
if (isMarketplacePlugin) {
|
|
50
|
+
// Format (marketplace plugin): @username/marketplace/plugin
|
|
51
|
+
// This matches how Claude Code marketplaces identify plugins.
|
|
52
|
+
const marketplace = (marketplaceName || repo).toLowerCase();
|
|
53
|
+
const plugin = pluginName.toLowerCase();
|
|
54
|
+
const generated = `@${username}/${marketplace}/${plugin}`;
|
|
55
|
+
return generated;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Format: @username/plugin-name
|
|
59
|
+
const generated = `@${username}/${pluginName}`;
|
|
60
|
+
return generated;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Generate a scoped name for a marketplace.
|
|
65
|
+
*
|
|
66
|
+
* Format:
|
|
67
|
+
* - GitHub: @username/marketplace-name
|
|
68
|
+
* - Non-GitHub: marketplace-name
|
|
69
|
+
*/
|
|
70
|
+
export function generateMarketplaceName(gitUrl, marketplaceManifestName, repoPath) {
|
|
71
|
+
// If no Git URL, use marketplace manifest name or fallback
|
|
72
|
+
if (!gitUrl) {
|
|
73
|
+
return marketplaceManifestName ||
|
|
74
|
+
(repoPath ? basename(repoPath) : 'unnamed-marketplace');
|
|
75
|
+
}
|
|
76
|
+
// Try to extract GitHub info
|
|
77
|
+
const githubInfo = extractGitHubInfo(gitUrl);
|
|
78
|
+
// If not GitHub, use marketplace manifest name
|
|
79
|
+
if (!githubInfo) {
|
|
80
|
+
return marketplaceManifestName ||
|
|
81
|
+
(repoPath ? basename(repoPath) : 'unnamed-marketplace');
|
|
82
|
+
}
|
|
83
|
+
// GitHub URL - generate scoped name
|
|
84
|
+
const { username, repo } = githubInfo;
|
|
85
|
+
const marketplaceName = marketplaceManifestName || repo;
|
|
86
|
+
return `@${username}/${marketplaceName}`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse a scoped plugin name into its components.
|
|
90
|
+
* Returns null if the name is not scoped.
|
|
91
|
+
*/
|
|
92
|
+
export function parseScopedPluginName(name) {
|
|
93
|
+
// Format: @username/marketplace/plugin or @username/plugin
|
|
94
|
+
const match = name.match(/^@([^\/]+)\/(?:([^\/]+)\/)?([^\/]+)$/);
|
|
95
|
+
if (!match) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const [, username, marketplace, plugin] = match;
|
|
99
|
+
return {
|
|
100
|
+
username,
|
|
101
|
+
marketplace,
|
|
102
|
+
plugin
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if a name is a scoped plugin name.
|
|
107
|
+
*/
|
|
108
|
+
export function isScopedPluginName(name) {
|
|
109
|
+
return parseScopedPluginName(name) !== null;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=plugin-naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-naming.js","sourceRoot":"","sources":["../../src/utils/plugin-naming.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/tarball.js
CHANGED
|
@@ -6,7 +6,7 @@ import { tmpdir } from 'os';
|
|
|
6
6
|
import { logger } from './logger.js';
|
|
7
7
|
import { ValidationError } from './errors.js';
|
|
8
8
|
import { writeTextFile, readTextFile, ensureDir, exists } from './fs.js';
|
|
9
|
-
import { UNVERSIONED } from '../constants/index.js';
|
|
9
|
+
import { UNVERSIONED, FILE_PATTERNS } from '../constants/index.js';
|
|
10
10
|
/**
|
|
11
11
|
* Create a tarball from package files
|
|
12
12
|
*/
|
|
@@ -162,7 +162,7 @@ export function createFormDataForUpload(packageName, version, tarballInfo) {
|
|
|
162
162
|
}
|
|
163
163
|
// Add tarball file
|
|
164
164
|
const blob = new Blob([tarballInfo.buffer], { type: 'application/gzip' });
|
|
165
|
-
const filename = version ? `${packageName}-${version}.
|
|
165
|
+
const filename = version ? `${packageName}-${version}${FILE_PATTERNS.TGZ_FILES}` : `${packageName}-${UNVERSIONED}${FILE_PATTERNS.TGZ_FILES}`;
|
|
166
166
|
formData.append('file', blob, filename);
|
|
167
167
|
return formData;
|
|
168
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tarball.js","sourceRoot":"","sources":["../../src/utils/tarball.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAE5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"tarball.js","sourceRoot":"","sources":["../../src/utils/tarball.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/platforms.jsonc
CHANGED
package/specs/install/README.md
CHANGED
|
@@ -14,7 +14,8 @@ The documents are intended to be implementation-guiding but not tied to specific
|
|
|
14
14
|
### Files
|
|
15
15
|
|
|
16
16
|
- **`install-behavior.md`**: Top-level `opkg install` UX and scenarios (CLI shapes, fresh vs existing deps, dev vs prod). Includes Claude Code plugin support (§9) with Universal Converter integration.
|
|
17
|
-
- **`git-sources.md`**: Installing packages from git repositories (`git:` and `github:` inputs), including subdirectory support for monorepos and Claude Code plugins.
|
|
17
|
+
- **`git-sources.md`**: Installing packages from git repositories (`git:` and `github:` inputs), including subdirectory support for monorepos and Claude Code plugins. Covers scoped naming for GitHub plugins.
|
|
18
|
+
- **`git-cache.md`**: Structured Git cache architecture at `~/.openpackage/cache/git/` with deterministic paths, automatic reuse, and metadata tracking.
|
|
18
19
|
- **`version-resolution.md`**: Formal rules for "latest in range from local+remote", including pre-release vs stable semantics.
|
|
19
20
|
- **`package-yml-canonical.md`**: Rules for treating `openpackage.yml` as the canonical declaration for install.
|
|
20
21
|
|