opkg 0.5.0 → 0.6.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/README.md +49 -8
- package/dist/commands/add.js +11 -276
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/init.js +73 -145
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +26 -668
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/pack.js +10 -137
- package/dist/commands/pack.js.map +1 -1
- package/dist/commands/push.js +14 -8
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/save.js +12 -167
- package/dist/commands/save.js.map +1 -1
- package/dist/commands/status.js +2 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/uninstall.js +5 -5
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/constants/index.js +18 -45
- package/dist/constants/index.js.map +1 -1
- package/dist/constants/workspace.js +9 -0
- package/dist/constants/workspace.js.map +1 -0
- package/dist/core/add/add-conflict-handler.js +68 -0
- package/dist/core/add/add-conflict-handler.js.map +1 -0
- package/dist/core/add/add-pipeline.js +137 -0
- package/dist/core/add/add-pipeline.js.map +1 -0
- package/dist/core/add/package-index-updater.js +62 -33
- package/dist/core/add/package-index-updater.js.map +1 -1
- package/dist/core/add/platform-path-transformer.js +47 -0
- package/dist/core/add/platform-path-transformer.js.map +1 -0
- package/dist/core/add/source-collector.js +57 -0
- package/dist/core/add/source-collector.js.map +1 -0
- package/dist/core/dependency-resolver.js +3 -1
- package/dist/core/dependency-resolver.js.map +1 -1
- package/dist/core/directory.js +2 -2
- package/dist/core/directory.js.map +1 -1
- package/dist/core/discovery/file-discovery.js +55 -54
- package/dist/core/discovery/file-discovery.js.map +1 -1
- package/dist/core/discovery/platform-files-discovery.js +32 -17
- package/dist/core/discovery/platform-files-discovery.js.map +1 -1
- package/dist/core/install/bulk-install-pipeline.js +199 -0
- package/dist/core/install/bulk-install-pipeline.js.map +1 -0
- package/dist/core/install/canonical-plan.js +123 -0
- package/dist/core/install/canonical-plan.js.map +1 -0
- package/dist/core/install/dry-run.js +2 -2
- package/dist/core/install/dry-run.js.map +1 -1
- package/dist/core/install/index.js +3 -0
- package/dist/core/install/index.js.map +1 -0
- package/dist/core/install/install-errors.js +41 -0
- package/dist/core/install/install-errors.js.map +1 -0
- package/dist/core/install/install-flow.js +2 -5
- package/dist/core/install/install-flow.js.map +1 -1
- package/dist/core/install/install-pipeline.js +228 -0
- package/dist/core/install/install-pipeline.js.map +1 -0
- package/dist/core/install/install-reporting.js +99 -0
- package/dist/core/install/install-reporting.js.map +1 -0
- package/dist/core/install/platform-resolution.js +6 -6
- package/dist/core/install/platform-resolution.js.map +1 -1
- package/dist/core/install/remote-flow.js +67 -1
- package/dist/core/install/remote-flow.js.map +1 -1
- package/dist/core/openpackage.js +16 -8
- package/dist/core/openpackage.js.map +1 -1
- package/dist/core/package-context.js +246 -0
- package/dist/core/package-context.js.map +1 -0
- package/dist/core/package.js +3 -2
- package/dist/core/package.js.map +1 -1
- package/dist/core/platforms.js +126 -217
- package/dist/core/platforms.js.map +1 -1
- package/dist/core/registry/registry-rename.js +2 -1
- package/dist/core/registry/registry-rename.js.map +1 -1
- package/dist/core/registry.js +10 -3
- package/dist/core/registry.js.map +1 -1
- package/dist/core/remote-pull.js +2 -1
- package/dist/core/remote-pull.js.map +1 -1
- package/dist/core/save/constants.js +4 -0
- package/dist/core/save/constants.js.map +1 -1
- package/dist/core/save/name-resolution.js +31 -0
- package/dist/core/save/name-resolution.js.map +1 -0
- package/dist/core/save/package-detection.js +147 -0
- package/dist/core/save/package-detection.js.map +1 -0
- package/dist/core/save/package-saver.js +46 -43
- package/dist/core/save/package-saver.js.map +1 -1
- package/dist/core/save/package-yml-generator.js +50 -71
- package/dist/core/save/package-yml-generator.js.map +1 -1
- package/dist/core/save/root-save-candidates.js.map +1 -1
- package/dist/core/save/save-candidate-loader.js +89 -0
- package/dist/core/save/save-candidate-loader.js.map +1 -0
- package/dist/core/save/save-conflict-resolution.js +72 -410
- package/dist/core/save/save-conflict-resolution.js.map +1 -1
- package/dist/core/save/save-conflict-resolver.js +277 -0
- package/dist/core/save/save-conflict-resolver.js.map +1 -0
- package/dist/core/save/save-pipeline.js +151 -0
- package/dist/core/save/save-pipeline.js.map +1 -0
- package/dist/core/save/save-types.js +2 -0
- package/dist/core/save/save-types.js.map +1 -0
- package/dist/core/save/save-yml-resolution.js +77 -39
- package/dist/core/save/save-yml-resolution.js.map +1 -1
- package/dist/core/save/workspace-rename.js +6 -6
- package/dist/core/save/workspace-rename.js.map +1 -1
- package/dist/core/scoping/package-scoping.js +13 -1
- package/dist/core/scoping/package-scoping.js.map +1 -1
- package/dist/core/status/status-file-discovery.js +12 -30
- package/dist/core/status/status-file-discovery.js.map +1 -1
- package/dist/core/sync/platform-sync.js +7 -4
- package/dist/core/sync/platform-sync.js.map +1 -1
- package/dist/core/sync/root-files-sync.js +59 -1
- package/dist/core/sync/root-files-sync.js.map +1 -1
- package/dist/core/uninstall/uninstall-file-discovery.js +1 -2
- package/dist/core/uninstall/uninstall-file-discovery.js.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/file-processing.js +5 -58
- package/dist/utils/file-processing.js.map +1 -1
- package/dist/utils/index-based-installer.js +15 -33
- package/dist/utils/index-based-installer.js.map +1 -1
- package/dist/utils/install-file-discovery.js +3 -3
- package/dist/utils/install-file-discovery.js.map +1 -1
- package/dist/utils/install-orchestrator.js +21 -21
- package/dist/utils/install-orchestrator.js.map +1 -1
- package/dist/utils/jsonc.js +44 -0
- package/dist/utils/jsonc.js.map +1 -0
- package/dist/utils/package-copy.js +199 -0
- package/dist/utils/package-copy.js.map +1 -0
- package/dist/utils/package-filters.js +125 -0
- package/dist/utils/package-filters.js.map +1 -0
- package/dist/utils/package-index-yml.js +15 -10
- package/dist/utils/package-index-yml.js.map +1 -1
- package/dist/utils/package-installation.js +4 -113
- package/dist/utils/package-installation.js.map +1 -1
- package/dist/utils/package-local-files.js +2 -35
- package/dist/utils/package-local-files.js.map +1 -1
- package/dist/utils/package-management.js +59 -37
- package/dist/utils/package-management.js.map +1 -1
- package/dist/utils/package-yml.js +24 -0
- package/dist/utils/package-yml.js.map +1 -1
- package/dist/utils/path-normalization.js +8 -53
- package/dist/utils/path-normalization.js.map +1 -1
- package/dist/utils/paths.js +17 -9
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/platform-file.js +16 -59
- package/dist/utils/platform-file.js.map +1 -1
- package/dist/utils/platform-mapper.js +29 -41
- package/dist/utils/platform-mapper.js.map +1 -1
- package/dist/utils/platform-specific-paths.js.map +1 -1
- package/dist/utils/platform-utils.js +28 -139
- package/dist/utils/platform-utils.js.map +1 -1
- package/dist/utils/platform-yaml-merge.js +13 -6
- package/dist/utils/platform-yaml-merge.js.map +1 -1
- package/dist/utils/registry-entry-filter.js +38 -24
- package/dist/utils/registry-entry-filter.js.map +1 -1
- package/dist/utils/registry-paths.js +10 -0
- package/dist/utils/registry-paths.js.map +1 -0
- package/dist/utils/root-file-installer.js +19 -0
- package/dist/utils/root-file-installer.js.map +1 -1
- package/dist/utils/root-file-registry.js.map +1 -1
- package/package.json +3 -2
- package/platforms.jsonc +178 -0
- package/specs/package/README.md +60 -0
- package/specs/package/nested-packages-and-parent-packages.md +79 -0
- package/specs/package/package-index-yml.md +171 -0
- package/specs/package/package-root-layout.md +78 -0
- package/specs/package/registry-payload-and-copy.md +77 -0
- package/specs/package/universal-content.md +144 -0
- package/specs/platforms.md +193 -0
- package/specs/save/README.md +40 -0
- package/specs/save/save-conflict-resolution.md +146 -0
- package/specs/save/save-file-discovery.md +101 -0
- package/specs/save/save-frontmatter-overrides.md +81 -0
- package/specs/save/save-modes-inputs.md +53 -0
- package/specs/save/save-naming-scoping.md +93 -0
- package/specs/save/save-package-detection.md +60 -0
- package/specs/save/save-registry-sync.md +126 -0
- package/dist/commands/release.js +0 -33
- package/dist/commands/release.js.map +0 -1
- package/dist/commands/tag.js +0 -311
- package/dist/commands/tag.js.map +0 -1
- package/dist/commands/update.js +0 -30
- package/dist/commands/update.js.map +0 -1
- package/dist/core/add/formula-index-updater.js +0 -290
- package/dist/core/add/formula-index-updater.js.map +0 -1
- package/dist/core/discovery/ai-files-discovery.js +0 -2
- package/dist/core/discovery/ai-files-discovery.js.map +0 -1
- package/dist/core/discovery/formula-files-discovery.js +0 -14
- package/dist/core/discovery/formula-files-discovery.js.map +0 -1
- package/dist/core/discovery/index-files-discovery.js +0 -91
- package/dist/core/discovery/index-files-discovery.js.map +0 -1
- package/dist/core/discovery/md-files-discovery.js +0 -82
- package/dist/core/discovery/md-files-discovery.js.map +0 -1
- package/dist/core/discovery/package-files-discovery.js +0 -14
- package/dist/core/discovery/package-files-discovery.js.map +0 -1
- package/dist/core/discovery/platform-discovery.js +0 -84
- package/dist/core/discovery/platform-discovery.js.map +0 -1
- package/dist/core/discovery/root-files-discovery.js +0 -2
- package/dist/core/discovery/root-files-discovery.js.map +0 -1
- package/dist/core/formula.js +0 -170
- package/dist/core/formula.js.map +0 -1
- package/dist/core/git-registry.js +0 -46
- package/dist/core/git-registry.js.map +0 -1
- package/dist/core/groundzero.js +0 -277
- package/dist/core/groundzero.js.map +0 -1
- package/dist/core/install/scenario.js +0 -11
- package/dist/core/install/scenario.js.map +0 -1
- package/dist/core/package-sync.js +0 -219
- package/dist/core/package-sync.js.map +0 -1
- package/dist/core/save/formula-file-generator.js +0 -167
- package/dist/core/save/formula-file-generator.js.map +0 -1
- package/dist/core/save/formula-saver.js +0 -52
- package/dist/core/save/formula-saver.js.map +0 -1
- package/dist/core/save/formula-yml-generator.js +0 -89
- package/dist/core/save/formula-yml-generator.js.map +0 -1
- package/dist/core/save/formula-yml-versioning.js +0 -108
- package/dist/core/save/formula-yml-versioning.js.map +0 -1
- package/dist/core/save/generic-file-sync.js +0 -38
- package/dist/core/save/generic-file-sync.js.map +0 -1
- package/dist/core/save/md-files-sync.js +0 -33
- package/dist/core/save/md-files-sync.js.map +0 -1
- package/dist/core/save/package-yml-versioning.js +0 -108
- package/dist/core/save/package-yml-versioning.js.map +0 -1
- package/dist/core/save/platform-sync.js +0 -95
- package/dist/core/save/platform-sync.js.map +0 -1
- package/dist/core/save/root-files-sync.js +0 -140
- package/dist/core/save/root-files-sync.js.map +0 -1
- package/dist/core/save/save-candidate-types.js +0 -2
- package/dist/core/save/save-candidate-types.js.map +0 -1
- package/dist/core/save/save-conflict-types.js +0 -2
- package/dist/core/save/save-conflict-types.js.map +0 -1
- package/dist/core/save/save-file-discovery.js +0 -5
- package/dist/core/save/save-file-discovery.js.map +0 -1
- package/dist/core/status-file-discovery.js +0 -175
- package/dist/core/status-file-discovery.js.map +0 -1
- package/dist/utils/discovery/file-processing.js +0 -156
- package/dist/utils/discovery/file-processing.js.map +0 -1
- package/dist/utils/discovery/formula-discovery.js +0 -211
- package/dist/utils/discovery/formula-discovery.js.map +0 -1
- package/dist/utils/discovery/platform-discovery.js +0 -2
- package/dist/utils/discovery/platform-discovery.js.map +0 -1
- package/dist/utils/formula-discovery.js +0 -102
- package/dist/utils/formula-discovery.js.map +0 -1
- package/dist/utils/formula-index-yml.js +0 -122
- package/dist/utils/formula-index-yml.js.map +0 -1
- package/dist/utils/formula-installation.js +0 -110
- package/dist/utils/formula-installation.js.map +0 -1
- package/dist/utils/formula-local-files.js +0 -38
- package/dist/utils/formula-local-files.js.map +0 -1
- package/dist/utils/formula-management.js +0 -191
- package/dist/utils/formula-management.js.map +0 -1
- package/dist/utils/formula-name.js +0 -97
- package/dist/utils/formula-name.js.map +0 -1
- package/dist/utils/formula-versioning.js +0 -109
- package/dist/utils/formula-versioning.js.map +0 -1
- package/dist/utils/formula-yml.js +0 -82
- package/dist/utils/formula-yml.js.map +0 -1
- package/dist/utils/git.js +0 -54
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/id-based-discovery.js +0 -126
- package/dist/utils/id-based-discovery.js.map +0 -1
- package/dist/utils/id-based-installer.js +0 -249
- package/dist/utils/id-based-installer.js.map +0 -1
- package/dist/utils/index-yml-based-installer.js +0 -375
- package/dist/utils/index-yml-based-installer.js.map +0 -1
- package/dist/utils/index-yml.js +0 -124
- package/dist/utils/index-yml.js.map +0 -1
- package/dist/utils/md-frontmatter.js +0 -3
- package/dist/utils/md-frontmatter.js.map +0 -1
- package/dist/utils/package-link-yml.js +0 -92
- package/dist/utils/package-link-yml.js.map +0 -1
- package/dist/utils/platform-discovery.js +0 -2
- package/dist/utils/platform-discovery.js.map +0 -1
- package/dist/utils/platform-frontmatter-split.js +0 -15
- package/dist/utils/platform-frontmatter-split.js.map +0 -1
- package/dist/utils/timestamp-encoder.js +0 -13
- package/dist/utils/timestamp-encoder.js.map +0 -1
- package/dist/utils/wip-versioning.js +0 -24
- package/dist/utils/wip-versioning.js.map +0 -1
|
@@ -1,62 +1,63 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { getPlatformDefinition } from '../platforms.js';
|
|
3
|
+
import { mapPlatformFileToUniversal } from '../../utils/platform-mapper.js';
|
|
4
|
+
import { exists, isDirectory, readTextFile } from '../../utils/fs.js';
|
|
5
|
+
import { getFileMtime, findFilesByExtension } from '../../utils/file-processing.js';
|
|
6
|
+
import { calculateFileHash } from '../../utils/hash-utils.js';
|
|
7
|
+
import { logger } from '../../utils/logger.js';
|
|
8
|
+
import { DIR_PATTERNS } from '../../constants/index.js';
|
|
9
|
+
export async function obtainSourceDirAndRegistryPath(file, context = {}) {
|
|
10
|
+
const fallbackPath = context.registryPathPrefix
|
|
11
|
+
? join(context.registryPathPrefix, file.relativePath)
|
|
12
|
+
: file.relativePath;
|
|
13
|
+
if (context.platform) {
|
|
12
14
|
const mapping = mapPlatformFileToUniversal(file.fullPath);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
registryPath = registryPathPrefix
|
|
19
|
-
? join(registryPathPrefix, file.relativePath)
|
|
20
|
-
: file.relativePath;
|
|
21
|
-
}
|
|
15
|
+
const registryPath = mapping
|
|
16
|
+
? join(DIR_PATTERNS.OPENPACKAGE, mapping.subdir, mapping.relPath)
|
|
17
|
+
: fallbackPath;
|
|
18
|
+
const sourceDir = context.sourceDirLabel ?? getPlatformDefinition(context.platform).rootDir;
|
|
19
|
+
return { sourceDir, registryPath };
|
|
22
20
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
registryPath
|
|
26
|
-
|
|
27
|
-
: file.relativePath;
|
|
28
|
-
}
|
|
29
|
-
return { sourceDir, registryPath };
|
|
21
|
+
return {
|
|
22
|
+
sourceDir: context.sourceDirLabel ?? (context.registryPathPrefix || 'workspace'),
|
|
23
|
+
registryPath: fallbackPath
|
|
24
|
+
};
|
|
30
25
|
}
|
|
31
|
-
export async function discoverFiles(rootDir, packageName,
|
|
26
|
+
export async function discoverFiles(rootDir, packageName, context) {
|
|
32
27
|
if (!(await exists(rootDir)) || !(await isDirectory(rootDir))) {
|
|
33
28
|
return [];
|
|
34
29
|
}
|
|
35
|
-
const
|
|
36
|
-
|
|
30
|
+
const fileExtensions = context.fileExtensions ?? [];
|
|
31
|
+
const files = await findFilesByExtension(rootDir, fileExtensions, rootDir, {
|
|
32
|
+
excludeDirs: context.excludeDirs
|
|
33
|
+
});
|
|
34
|
+
const processPromises = files.map(async (file) => processFileForDiscovery(file, packageName, context));
|
|
35
|
+
const results = await Promise.all(processPromises);
|
|
36
|
+
return results.filter((result) => result !== null);
|
|
37
|
+
}
|
|
38
|
+
async function processFileForDiscovery(file, packageName, context) {
|
|
39
|
+
try {
|
|
40
|
+
const content = await readTextFile(file.fullPath);
|
|
41
|
+
try {
|
|
42
|
+
const mtime = await getFileMtime(file.fullPath);
|
|
43
|
+
const contentHash = await calculateFileHash(content);
|
|
44
|
+
const { sourceDir, registryPath } = await obtainSourceDirAndRegistryPath(file, context);
|
|
45
|
+
return {
|
|
46
|
+
fullPath: file.fullPath,
|
|
47
|
+
relativePath: file.relativePath,
|
|
48
|
+
sourceDir,
|
|
49
|
+
registryPath,
|
|
50
|
+
mtime,
|
|
51
|
+
contentHash
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
logger.warn(`Failed to process file metadata for ${file.relativePath}: ${error}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
logger.warn(`Failed to read ${file.relativePath}: ${error}`);
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
37
62
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Discover markdown files in a directory with specified patterns and inclusion rules
|
|
40
|
-
*/
|
|
41
|
-
// export async function discoverFiles(
|
|
42
|
-
// directoryPath: string,
|
|
43
|
-
// packageName: string,
|
|
44
|
-
// platform: Platformish,
|
|
45
|
-
// registryPathPrefix: string = '',
|
|
46
|
-
// ): Promise<DiscoveredFile[]> {
|
|
47
|
-
// if (!(await exists(directoryPath)) || !(await isDirectory(directoryPath))) {
|
|
48
|
-
// return [];
|
|
49
|
-
// }
|
|
50
|
-
// // Find files with the specified patterns
|
|
51
|
-
// const allFiles: Array<{ fullPath: string; relativePath: string }> = [];
|
|
52
|
-
// // Recursive search using findFilesByExtension
|
|
53
|
-
// const files = await findFilesByExtension(directoryPath, filePatterns);
|
|
54
|
-
// allFiles.push(...files);
|
|
55
|
-
// // Process files in parallel using the extracted helper
|
|
56
|
-
// const processPromises = allFiles.map(async (file) =>
|
|
57
|
-
// processMdFileForDiscovery(file, packageName, platform, registryPathPrefix)
|
|
58
|
-
// );
|
|
59
|
-
// const results = await Promise.all(processPromises);
|
|
60
|
-
// return results.filter((result): result is DiscoveredFile => result !== null);
|
|
61
|
-
// }
|
|
62
63
|
//# sourceMappingURL=file-discovery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-discovery.js","sourceRoot":"","sources":["../../../src/core/discovery/file-discovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-discovery.js","sourceRoot":"","sources":["../../../src/core/discovery/file-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +1,34 @@
|
|
|
1
1
|
import { join } from 'path';
|
|
2
|
-
import { PLATFORM_AI, PLATFORM_DIRS } from '../../constants/index.js';
|
|
3
2
|
import { exists, isDirectory } from '../../utils/fs.js';
|
|
4
|
-
import { getPlatformDefinition, isUniversalSubdirPath } from '../../core/platforms.js';
|
|
5
|
-
// Import the shared type
|
|
6
|
-
import { buildPlatformSearchConfig } from './platform-discovery.js';
|
|
3
|
+
import { getPlatformDefinition, getDetectedPlatforms, isUniversalSubdirPath } from '../../core/platforms.js';
|
|
7
4
|
import { discoverFiles } from './file-discovery.js';
|
|
8
5
|
import { normalizePathForProcessing } from '../../utils/path-normalization.js';
|
|
6
|
+
import { WORKSPACE_DISCOVERY_EXCLUDES } from '../../constants/workspace.js';
|
|
7
|
+
import { DIR_PATTERNS } from '../../constants/index.js';
|
|
9
8
|
/**
|
|
10
9
|
* Process platform subdirectories (rules/commands/agents) within a base directory
|
|
11
10
|
* Common logic shared between different discovery methods
|
|
12
11
|
*/
|
|
13
|
-
async function discoverPlatformFiles(
|
|
14
|
-
|
|
15
|
-
if (config.platform === PLATFORM_AI) {
|
|
16
|
-
return discoverFiles(PLATFORM_DIRS.AI, packageName, config.platform, PLATFORM_DIRS.AI);
|
|
17
|
-
}
|
|
18
|
-
const definition = getPlatformDefinition(config.platform);
|
|
12
|
+
async function discoverPlatformFiles(cwd, platform, packageName) {
|
|
13
|
+
const definition = getPlatformDefinition(platform);
|
|
19
14
|
const allFiles = [];
|
|
20
15
|
// Process each universal subdir that this platform supports
|
|
21
16
|
for (const [subdirName, subdirDef] of Object.entries(definition.subdirs)) {
|
|
22
|
-
|
|
17
|
+
if (!subdirDef) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const subdirPath = join(cwd, definition.rootDir, subdirDef.path);
|
|
21
|
+
const allowedExts = subdirDef.exts;
|
|
22
|
+
if (allowedExts && allowedExts.length === 0) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
23
25
|
if (await exists(subdirPath) && await isDirectory(subdirPath)) {
|
|
24
|
-
const files = await discoverFiles(subdirPath, packageName,
|
|
26
|
+
const files = await discoverFiles(subdirPath, packageName, {
|
|
27
|
+
platform,
|
|
28
|
+
registryPathPrefix: `${DIR_PATTERNS.OPENPACKAGE}/${subdirName}`,
|
|
29
|
+
sourceDirLabel: platform,
|
|
30
|
+
fileExtensions: allowedExts
|
|
31
|
+
});
|
|
25
32
|
allFiles.push(...files);
|
|
26
33
|
}
|
|
27
34
|
}
|
|
@@ -35,8 +42,6 @@ function dedupeDiscoveredFilesPreferUniversal(files) {
|
|
|
35
42
|
// Normalize registry path to use forward slashes for consistent comparison
|
|
36
43
|
const normalizedPath = normalizePathForProcessing(file.registryPath);
|
|
37
44
|
if (isUniversalSubdirPath(normalizedPath))
|
|
38
|
-
return 3;
|
|
39
|
-
if (normalizedPath.startsWith(`${PLATFORM_DIRS.AI}/`) || normalizedPath === PLATFORM_DIRS.AI)
|
|
40
45
|
return 2;
|
|
41
46
|
return 1;
|
|
42
47
|
};
|
|
@@ -56,15 +61,25 @@ function dedupeDiscoveredFilesPreferUniversal(files) {
|
|
|
56
61
|
/**
|
|
57
62
|
* Unified file discovery function that searches platform-specific directories
|
|
58
63
|
*/
|
|
64
|
+
async function discoverWorkspaceFiles(cwd, packageName) {
|
|
65
|
+
return await discoverFiles(cwd, packageName, {
|
|
66
|
+
registryPathPrefix: '',
|
|
67
|
+
sourceDirLabel: 'workspace',
|
|
68
|
+
excludeDirs: WORKSPACE_DISCOVERY_EXCLUDES,
|
|
69
|
+
fileExtensions: []
|
|
70
|
+
});
|
|
71
|
+
}
|
|
59
72
|
export async function discoverPlatformFilesUnified(cwd, packageName) {
|
|
60
|
-
const
|
|
73
|
+
const detectedPlatforms = await getDetectedPlatforms(cwd);
|
|
61
74
|
const allDiscoveredFiles = [];
|
|
62
75
|
// Process all platform configurations in parallel
|
|
63
|
-
const discoveryPromises =
|
|
64
|
-
return discoverPlatformFiles(
|
|
76
|
+
const discoveryPromises = detectedPlatforms.map(async (platform) => {
|
|
77
|
+
return discoverPlatformFiles(cwd, platform, packageName);
|
|
65
78
|
});
|
|
66
79
|
const discoveredFiles = await Promise.all(discoveryPromises);
|
|
67
80
|
allDiscoveredFiles.push(...discoveredFiles.flat());
|
|
81
|
+
const workspaceDiscovered = await discoverWorkspaceFiles(cwd, packageName);
|
|
82
|
+
allDiscoveredFiles.push(...workspaceDiscovered);
|
|
68
83
|
return dedupeDiscoveredFilesPreferUniversal(allDiscoveredFiles);
|
|
69
84
|
}
|
|
70
85
|
//# sourceMappingURL=platform-files-discovery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-files-discovery.js","sourceRoot":"","sources":["../../../src/core/discovery/platform-files-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"platform-files-discovery.js","sourceRoot":"","sources":["../../../src/core/discovery/platform-files-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { ensureRegistryDirectories, listPackageVersions } from '../directory.js';
|
|
2
|
+
import { createWorkspacePackageYml } from '../../utils/package-management.js';
|
|
3
|
+
import { getLocalPackageYmlPath } from '../../utils/paths.js';
|
|
4
|
+
import { parsePackageYml } from '../../utils/package-yml.js';
|
|
5
|
+
import { withOperationErrorHandling } from '../../utils/error-handling.js';
|
|
6
|
+
import { UserCancellationError } from '../../utils/errors.js';
|
|
7
|
+
import { extractPackagesFromConfig } from '../../utils/install-helpers.js';
|
|
8
|
+
import { isRootPackage } from '../../utils/paths.js';
|
|
9
|
+
import { logger } from '../../utils/logger.js';
|
|
10
|
+
import { normalizePlatforms } from '../../utils/platform-mapper.js';
|
|
11
|
+
import { resolvePlatforms } from './platform-resolution.js';
|
|
12
|
+
import { runInstallPipeline } from './install-pipeline.js';
|
|
13
|
+
import { displayInstallationSummary } from './install-reporting.js';
|
|
14
|
+
import { planConflictsForPackage } from '../../utils/index-based-installer.js';
|
|
15
|
+
import { safePrompts } from '../../utils/prompts.js';
|
|
16
|
+
import { resolveVersionRange, isExactVersion } from '../../utils/version-ranges.js';
|
|
17
|
+
export async function runBulkInstallPipeline(targetDir, options) {
|
|
18
|
+
const cwd = process.cwd();
|
|
19
|
+
await ensureRegistryDirectories();
|
|
20
|
+
await createWorkspacePackageYml(cwd);
|
|
21
|
+
const packageYmlPath = getLocalPackageYmlPath(cwd);
|
|
22
|
+
const cwdConfig = await withOperationErrorHandling(() => parsePackageYml(packageYmlPath), 'parse package.yml', packageYmlPath);
|
|
23
|
+
const allPackages = extractPackagesFromConfig(cwdConfig);
|
|
24
|
+
const packagesToInstall = [];
|
|
25
|
+
const skippedRootPackages = [];
|
|
26
|
+
for (const pkg of allPackages) {
|
|
27
|
+
if (await isRootPackage(cwd, pkg.name)) {
|
|
28
|
+
skippedRootPackages.push(pkg);
|
|
29
|
+
console.log(`⚠️ Skipping ${pkg.name} - it matches your project's root package name`);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
packagesToInstall.push(pkg);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (packagesToInstall.length === 0) {
|
|
36
|
+
if (skippedRootPackages.length > 0) {
|
|
37
|
+
console.log('✓ All packages in package.yml were skipped (matched root package)');
|
|
38
|
+
console.log('\nTips:');
|
|
39
|
+
console.log('• Root packages cannot be installed as dependencies');
|
|
40
|
+
console.log('• Use "opkg install <package-name>" to install external packages');
|
|
41
|
+
console.log('• Use "opkg save" to create a WIP copy of your root package in the registry');
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
console.log('⚠️ No packages found in package.yml');
|
|
45
|
+
console.log('\nTips:');
|
|
46
|
+
console.log('• Add packages to the "packages" array in package.yml');
|
|
47
|
+
console.log('• Add development packages to the "dev-packages" array in package.yml');
|
|
48
|
+
console.log('• Use "opkg install <package-name>" to install a specific package');
|
|
49
|
+
}
|
|
50
|
+
return { success: true, data: { installed: 0, skipped: skippedRootPackages.length } };
|
|
51
|
+
}
|
|
52
|
+
console.log(`✓ Installing ${packagesToInstall.length} packages from package.yml:`);
|
|
53
|
+
packagesToInstall.forEach(pkg => {
|
|
54
|
+
const prefix = pkg.isDev ? '[dev] ' : '';
|
|
55
|
+
const label = pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name;
|
|
56
|
+
console.log(` • ${prefix}${label}`);
|
|
57
|
+
});
|
|
58
|
+
if (skippedRootPackages.length > 0) {
|
|
59
|
+
console.log(` • ${skippedRootPackages.length} packages skipped (matched root package)`);
|
|
60
|
+
}
|
|
61
|
+
console.log('');
|
|
62
|
+
const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
63
|
+
const normalizedPlatforms = normalizePlatforms(options.platforms);
|
|
64
|
+
const resolvedPlatforms = await resolvePlatforms(cwd, normalizedPlatforms, { interactive });
|
|
65
|
+
let totalInstalled = 0;
|
|
66
|
+
let totalSkipped = 0;
|
|
67
|
+
const results = [];
|
|
68
|
+
const aggregateWarnings = new Set();
|
|
69
|
+
for (const pkg of packagesToInstall) {
|
|
70
|
+
try {
|
|
71
|
+
const label = pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name;
|
|
72
|
+
const baseConflictDecisions = options.conflictDecisions
|
|
73
|
+
? { ...options.conflictDecisions }
|
|
74
|
+
: undefined;
|
|
75
|
+
const installOptions = {
|
|
76
|
+
...options,
|
|
77
|
+
dev: pkg.isDev,
|
|
78
|
+
resolvedPlatforms,
|
|
79
|
+
conflictDecisions: baseConflictDecisions
|
|
80
|
+
};
|
|
81
|
+
let conflictPlanningVersion = pkg.version;
|
|
82
|
+
if (pkg.version && !isExactVersion(pkg.version)) {
|
|
83
|
+
try {
|
|
84
|
+
const localVersions = await listPackageVersions(pkg.name);
|
|
85
|
+
conflictPlanningVersion = resolveVersionRange(pkg.version, localVersions) ?? undefined;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
conflictPlanningVersion = undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (conflictPlanningVersion) {
|
|
92
|
+
try {
|
|
93
|
+
const conflicts = await planConflictsForPackage(cwd, pkg.name, conflictPlanningVersion, resolvedPlatforms);
|
|
94
|
+
if (conflicts.length > 0) {
|
|
95
|
+
const shouldPrompt = interactive &&
|
|
96
|
+
(!installOptions.conflictStrategy || installOptions.conflictStrategy === 'ask');
|
|
97
|
+
if (shouldPrompt) {
|
|
98
|
+
console.log(`\n⚠️ Detected ${conflicts.length} potential file conflict${conflicts.length === 1 ? '' : 's'} for ${label}.`);
|
|
99
|
+
const preview = conflicts.slice(0, 5);
|
|
100
|
+
for (const conflict of preview) {
|
|
101
|
+
const ownerInfo = conflict.ownerPackage ? `owned by ${conflict.ownerPackage}` : 'already exists locally';
|
|
102
|
+
console.log(` • ${conflict.relPath} (${ownerInfo})`);
|
|
103
|
+
}
|
|
104
|
+
if (conflicts.length > preview.length) {
|
|
105
|
+
console.log(` • ... and ${conflicts.length - preview.length} more`);
|
|
106
|
+
}
|
|
107
|
+
const selection = await safePrompts({
|
|
108
|
+
type: 'select',
|
|
109
|
+
name: 'strategy',
|
|
110
|
+
message: `Choose conflict handling for ${label}:`,
|
|
111
|
+
choices: [
|
|
112
|
+
{ title: 'Keep both (rename existing files)', value: 'keep-both' },
|
|
113
|
+
{ title: 'Overwrite existing files', value: 'overwrite' },
|
|
114
|
+
{ title: 'Skip conflicting files', value: 'skip' },
|
|
115
|
+
{ title: 'Review individually', value: 'ask' }
|
|
116
|
+
],
|
|
117
|
+
initial: installOptions.conflictStrategy === 'ask' ? 3 : 0
|
|
118
|
+
});
|
|
119
|
+
const chosenStrategy = selection.strategy;
|
|
120
|
+
installOptions.conflictStrategy = chosenStrategy;
|
|
121
|
+
if (chosenStrategy === 'ask') {
|
|
122
|
+
const decisions = {};
|
|
123
|
+
for (const conflict of conflicts) {
|
|
124
|
+
const detail = await safePrompts({
|
|
125
|
+
type: 'select',
|
|
126
|
+
name: 'decision',
|
|
127
|
+
message: `${conflict.relPath}${conflict.ownerPackage ? ` (owned by ${conflict.ownerPackage})` : ''}:`,
|
|
128
|
+
choices: [
|
|
129
|
+
{ title: 'Keep both (rename existing)', value: 'keep-both' },
|
|
130
|
+
{ title: 'Overwrite existing', value: 'overwrite' },
|
|
131
|
+
{ title: 'Skip (keep existing)', value: 'skip' }
|
|
132
|
+
],
|
|
133
|
+
initial: 0
|
|
134
|
+
});
|
|
135
|
+
const decisionValue = detail.decision;
|
|
136
|
+
decisions[conflict.relPath] = decisionValue;
|
|
137
|
+
}
|
|
138
|
+
installOptions.conflictDecisions = decisions;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else if (!interactive && (!installOptions.conflictStrategy || installOptions.conflictStrategy === 'ask')) {
|
|
142
|
+
logger.warn(`Detected ${conflicts.length} potential conflict${conflicts.length === 1 ? '' : 's'} for ${label}, but running in non-interactive mode. Conflicting files will be skipped unless '--conflicts' is provided.`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (planError) {
|
|
147
|
+
logger.warn(`Failed to evaluate conflicts for ${label}: ${planError}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
console.log(`\n🔧 Installing ${pkg.isDev ? '[dev] ' : ''}${label}...`);
|
|
151
|
+
const result = await runInstallPipeline({
|
|
152
|
+
...installOptions,
|
|
153
|
+
packageName: pkg.name,
|
|
154
|
+
version: pkg.version,
|
|
155
|
+
targetDir
|
|
156
|
+
});
|
|
157
|
+
if (result.success) {
|
|
158
|
+
totalInstalled++;
|
|
159
|
+
results.push({ name: pkg.name, success: true });
|
|
160
|
+
console.log(`✓ Successfully installed ${pkg.name}`);
|
|
161
|
+
if (result.warnings && result.warnings.length > 0) {
|
|
162
|
+
result.warnings.forEach(warning => aggregateWarnings.add(warning));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
totalSkipped++;
|
|
167
|
+
results.push({ name: pkg.name, success: false, error: result.error });
|
|
168
|
+
console.log(`❌ Failed to install ${pkg.name}: ${result.error}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (error instanceof UserCancellationError) {
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
totalSkipped++;
|
|
176
|
+
results.push({ name: pkg.name, success: false, error: String(error) });
|
|
177
|
+
console.log(`❌ Failed to install ${pkg.name}: ${error}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
displayInstallationSummary(totalInstalled, totalSkipped, packagesToInstall.length, results);
|
|
181
|
+
if (aggregateWarnings.size > 0) {
|
|
182
|
+
console.log('\n⚠️ Warnings during installation:');
|
|
183
|
+
aggregateWarnings.forEach(warning => {
|
|
184
|
+
console.log(` • ${warning}`);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
const allSuccessful = totalSkipped === 0;
|
|
188
|
+
return {
|
|
189
|
+
success: allSuccessful,
|
|
190
|
+
data: {
|
|
191
|
+
installed: totalInstalled,
|
|
192
|
+
skipped: totalSkipped,
|
|
193
|
+
results
|
|
194
|
+
},
|
|
195
|
+
error: allSuccessful ? undefined : `${totalSkipped} packages failed to install`,
|
|
196
|
+
warnings: totalSkipped > 0 ? [`${totalSkipped} packages failed to install`] : undefined
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=bulk-install-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-install-pipeline.js","sourceRoot":"","sources":["../../../src/core/install/bulk-install-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import * as semver from 'semver';
|
|
2
|
+
import { exists } from '../../utils/fs.js';
|
|
3
|
+
import { getLocalPackageYmlPath } from '../../utils/paths.js';
|
|
4
|
+
import { parsePackageYml } from '../../utils/package-yml.js';
|
|
5
|
+
import { createCaretRange, parseVersionRange } from '../../utils/version-ranges.js';
|
|
6
|
+
import { arePackageNamesEquivalent } from '../../utils/package-name.js';
|
|
7
|
+
export async function determineCanonicalInstallPlan(args) {
|
|
8
|
+
const normalizedCliSpec = args.cliSpec?.trim() || undefined;
|
|
9
|
+
const existing = await findCanonicalDependency(args.cwd, args.packageName);
|
|
10
|
+
const target = args.devFlag ? 'dev-packages' : 'packages';
|
|
11
|
+
if (existing) {
|
|
12
|
+
const canonicalConstraint = parseConstraintOrThrow('package', existing.range, args.packageName);
|
|
13
|
+
if (normalizedCliSpec) {
|
|
14
|
+
const cliConstraint = parseConstraintOrThrow('cli', normalizedCliSpec, args.packageName);
|
|
15
|
+
if (!isRangeSubset(cliConstraint.resolverRange, canonicalConstraint.resolverRange)) {
|
|
16
|
+
throw buildCanonicalConflictError(args.packageName, cliConstraint.displayRange, existing.range);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
effectiveRange: canonicalConstraint.resolverRange,
|
|
20
|
+
dependencyState: 'existing',
|
|
21
|
+
canonicalRange: existing.range,
|
|
22
|
+
canonicalTarget: existing.target,
|
|
23
|
+
persistDecision: { type: 'none' },
|
|
24
|
+
compatibilityMessage: `Using version range from package.yml (${existing.range}); CLI spec '${cliConstraint.displayRange}' is compatible.`
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
effectiveRange: canonicalConstraint.resolverRange,
|
|
29
|
+
dependencyState: 'existing',
|
|
30
|
+
canonicalRange: existing.range,
|
|
31
|
+
canonicalTarget: existing.target,
|
|
32
|
+
persistDecision: { type: 'none' }
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (normalizedCliSpec) {
|
|
36
|
+
const cliConstraint = parseConstraintOrThrow('cli', normalizedCliSpec, args.packageName);
|
|
37
|
+
return {
|
|
38
|
+
effectiveRange: cliConstraint.resolverRange,
|
|
39
|
+
dependencyState: 'fresh',
|
|
40
|
+
persistDecision: {
|
|
41
|
+
type: 'explicit',
|
|
42
|
+
target,
|
|
43
|
+
range: cliConstraint.displayRange
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
effectiveRange: '*',
|
|
49
|
+
dependencyState: 'fresh',
|
|
50
|
+
persistDecision: {
|
|
51
|
+
type: 'derive',
|
|
52
|
+
target,
|
|
53
|
+
mode: 'caret-or-exact'
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export async function findCanonicalDependency(cwd, packageName) {
|
|
58
|
+
const packageYmlPath = getLocalPackageYmlPath(cwd);
|
|
59
|
+
if (!(await exists(packageYmlPath))) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const config = await parsePackageYml(packageYmlPath);
|
|
64
|
+
const match = locateDependencyInArray(config.packages, packageName, 'packages') ||
|
|
65
|
+
locateDependencyInArray(config['dev-packages'], packageName, 'dev-packages');
|
|
66
|
+
return match;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
70
|
+
throw new Error(`Failed to parse ${packageYmlPath}: ${detail}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function locateDependencyInArray(deps, packageName, target) {
|
|
74
|
+
if (!deps) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const entry = deps.find(dep => arePackageNamesEquivalent(dep.name, packageName));
|
|
78
|
+
if (!entry) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
if (!entry.version || !entry.version.trim()) {
|
|
82
|
+
throw new Error(`Dependency '${packageName}' in .openpackage/package.yml must declare a version range. Edit the file and try again.`);
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
range: entry.version.trim(),
|
|
86
|
+
target
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function parseConstraintOrThrow(source, raw, packageName) {
|
|
90
|
+
try {
|
|
91
|
+
const parsed = parseVersionRange(raw);
|
|
92
|
+
return { resolverRange: parsed.range, displayRange: parsed.original };
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
96
|
+
if (source === 'cli') {
|
|
97
|
+
throw new Error(`Invalid version spec '${raw}' provided via CLI for '${packageName}'. ${message}. Adjust the CLI input and try again.`);
|
|
98
|
+
}
|
|
99
|
+
throw new Error(`Dependency '${packageName}' in .openpackage/package.yml has invalid version '${raw}'. ${message}. Edit the file and try again.`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function isRangeSubset(candidate, canonical) {
|
|
103
|
+
try {
|
|
104
|
+
return semver.subset(candidate, canonical, { includePrerelease: true });
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function buildCanonicalConflictError(packageName, cliSpec, canonicalRange) {
|
|
111
|
+
return new Error(`Requested '${packageName}@${cliSpec}', but .openpackage/package.yml declares '${packageName}' with range '${canonicalRange}'. Edit package.yml to change the dependency line, then re-run opkg install.`);
|
|
112
|
+
}
|
|
113
|
+
export function resolvePersistRange(decision, selectedVersion) {
|
|
114
|
+
if (decision.type === 'none') {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
if (decision.type === 'explicit') {
|
|
118
|
+
return { range: decision.range, target: decision.target };
|
|
119
|
+
}
|
|
120
|
+
const derivedRange = createCaretRange(selectedVersion);
|
|
121
|
+
return { range: derivedRange, target: decision.target };
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=canonical-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-plan.js","sourceRoot":"","sources":["../../../src/core/install/canonical-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AA8BxE,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,IAAuB;IACzE,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAqB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;IAE5E,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAEhG,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,aAAa,GAAG,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACzF,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,EAAE,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC;gBACnF,MAAM,2BAA2B,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClG,CAAC;YAED,OAAO;gBACL,cAAc,EAAE,mBAAmB,CAAC,aAAa;gBACjD,eAAe,EAAE,UAAU;gBAC3B,cAAc,EAAE,QAAQ,CAAC,KAAK;gBAC9B,eAAe,EAAE,QAAQ,CAAC,MAAM;gBAChC,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;gBACjC,oBAAoB,EAAE,yCAAyC,QAAQ,CAAC,KAAK,gBAAgB,aAAa,CAAC,YAAY,kBAAkB;aAC1I,CAAC;QACJ,CAAC;QAED,OAAO;YACL,cAAc,EAAE,mBAAmB,CAAC,aAAa;YACjD,eAAe,EAAE,UAAU;YAC3B,cAAc,EAAE,QAAQ,CAAC,KAAK;YAC9B,eAAe,EAAE,QAAQ,CAAC,MAAM;YAChC,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SAClC,CAAC;IACJ,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACzF,OAAO;YACL,cAAc,EAAE,aAAa,CAAC,aAAa;YAC3C,eAAe,EAAE,OAAO;YACxB,eAAe,EAAE;gBACf,IAAI,EAAE,UAAU;gBAChB,MAAM;gBACN,KAAK,EAAE,aAAa,CAAC,YAAY;aAClC;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,cAAc,EAAE,GAAG;QACnB,eAAe,EAAE,OAAO;QACxB,eAAe,EAAE;YACf,IAAI,EAAE,QAAQ;YACd,MAAM;YACN,IAAI,EAAE,gBAAgB;SACvB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,GAAW,EACX,WAAmB;IAEnB,MAAM,cAAc,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,CAAC;QACrD,MAAM,KAAK,GACT,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC;YACjE,uBAAuB,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,mBAAmB,cAAc,KAAK,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAA4B,EAC5B,WAAmB,EACnB,MAAwB;IAExB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,eAAe,WAAW,0FAA0F,CACrH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QAC3B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAyB,EAAE,GAAW,EAAE,WAAmB;IACzF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,yBAAyB,GAAG,2BAA2B,WAAW,MAAM,OAAO,uCAAuC,CACvH,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,KAAK,CACb,eAAe,WAAW,sDAAsD,GAAG,MAAM,OAAO,gCAAgC,CACjI,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB,EAAE,SAAiB;IACzD,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,WAAmB,EAAE,OAAe,EAAE,cAAsB;IAC/F,OAAO,IAAI,KAAK,CACd,cAAc,WAAW,IAAI,OAAO,6CAA6C,WAAW,iBAAiB,cAAc,8EAA8E,CAC1M,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAyB,EACzB,eAAuB;IAEvB,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACvD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CONFLICT_RESOLUTION } from '../../constants/index.js';
|
|
2
|
-
import {
|
|
2
|
+
import { installWorkspaceFiles } from '../../utils/install-orchestrator.js';
|
|
3
3
|
/**
|
|
4
4
|
* Handle dry run mode for package installation
|
|
5
5
|
*/
|
|
@@ -23,7 +23,7 @@ export async function handleDryRunMode(resolvedPackages, packageName, targetDir,
|
|
|
23
23
|
console.log(`✓ Would skip ${resolved.name}@${resolved.version} (same or newer version already installed)`);
|
|
24
24
|
continue;
|
|
25
25
|
}
|
|
26
|
-
const dryRunResult = await
|
|
26
|
+
const dryRunResult = await installWorkspaceFiles(resolved.name, targetDir, options, resolved.version, true);
|
|
27
27
|
if (dryRunResult.skipped) {
|
|
28
28
|
console.log(`✓ Would skip ${resolved.name}@${resolved.version} (same or newer version already installed)`);
|
|
29
29
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dry-run.js","sourceRoot":"","sources":["../../../src/core/install/dry-run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dry-run.js","sourceRoot":"","sources":["../../../src/core/install/dry-run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,gBAAmC,EACnC,WAAmB,EACnB,SAAiB,EACjB,OAAuB,EACvB,gBAAyB;IAEzB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAE9D,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,IAAI,QAAQ,CAAC,kBAAkB,KAAK,mBAAmB,CAAC,OAAO,EAAE,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,iCAAiC,CAAC,CAAC;YAChG,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,kBAAkB,KAAK,mBAAmB,CAAC,IAAI,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,4CAA4C,CAAC,CAAC;YAC3G,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAE5G,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,4CAA4C,CAAC,CAAC;YAC3G,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,cAAc,QAAQ,CAAC,CAAC;QAEtH,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,8CAA8C,WAAW,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5H,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IACpF,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI;YACZ,gBAAgB;YAChB,aAAa,EAAE,gBAAgB,CAAC,MAAM;SACvC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/install/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC"}
|