opkg 0.9.2 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/package.json +3 -1
  2. package/packages/cli/dist/add-U44SL3OR.js +624 -0
  3. package/packages/cli/dist/add-U44SL3OR.js.map +7 -0
  4. package/packages/cli/dist/chunk-4B5HJLP2.js +48 -0
  5. package/packages/cli/dist/chunk-4B5HJLP2.js.map +7 -0
  6. package/packages/cli/dist/chunk-BROJ6OUT.js +631 -0
  7. package/packages/cli/dist/chunk-BROJ6OUT.js.map +7 -0
  8. package/packages/cli/dist/chunk-CVA64SXK.js +1136 -0
  9. package/packages/cli/dist/chunk-CVA64SXK.js.map +7 -0
  10. package/packages/cli/dist/chunk-D6LEPODL.js +413 -0
  11. package/packages/cli/dist/chunk-D6LEPODL.js.map +7 -0
  12. package/packages/cli/dist/chunk-HTYHJA3B.js +61 -0
  13. package/packages/cli/dist/chunk-HTYHJA3B.js.map +7 -0
  14. package/packages/cli/dist/chunk-KI7FDU3H.js +99 -0
  15. package/packages/cli/dist/chunk-KI7FDU3H.js.map +7 -0
  16. package/packages/cli/dist/chunk-PSQXKAL4.js +371 -0
  17. package/packages/cli/dist/chunk-PSQXKAL4.js.map +7 -0
  18. package/packages/cli/dist/chunk-PUDRKDVZ.js +1419 -0
  19. package/packages/cli/dist/chunk-PUDRKDVZ.js.map +7 -0
  20. package/packages/cli/dist/chunk-U7FW7SXX.js +568 -0
  21. package/packages/cli/dist/chunk-U7FW7SXX.js.map +7 -0
  22. package/packages/cli/dist/configure-3AZUMDJZ.js +107 -0
  23. package/packages/cli/dist/configure-3AZUMDJZ.js.map +7 -0
  24. package/packages/cli/dist/index.js +15 -15
  25. package/packages/cli/dist/install-EZNWMLJR.js +7581 -0
  26. package/packages/cli/dist/install-EZNWMLJR.js.map +7 -0
  27. package/packages/cli/dist/list-XR7RSJFS.js +327 -0
  28. package/packages/cli/dist/list-XR7RSJFS.js.map +7 -0
  29. package/packages/cli/dist/login-NRKHXZKM.js +150 -0
  30. package/packages/cli/dist/login-NRKHXZKM.js.map +7 -0
  31. package/packages/cli/dist/logout-SYHXCVCQ.js +40 -0
  32. package/packages/cli/dist/logout-SYHXCVCQ.js.map +7 -0
  33. package/packages/cli/dist/new-F46OSD72.js +277 -0
  34. package/packages/cli/dist/new-F46OSD72.js.map +7 -0
  35. package/packages/cli/dist/publish-4H43PCSG.js +619 -0
  36. package/packages/cli/dist/publish-4H43PCSG.js.map +7 -0
  37. package/packages/cli/dist/remove-BD52BHR2.js +542 -0
  38. package/packages/cli/dist/remove-BD52BHR2.js.map +7 -0
  39. package/packages/cli/dist/save-N3QWF2WN.js +1728 -0
  40. package/packages/cli/dist/save-N3QWF2WN.js.map +7 -0
  41. package/packages/cli/dist/search-ABROK3UO.js +157 -0
  42. package/packages/cli/dist/search-ABROK3UO.js.map +7 -0
  43. package/packages/cli/dist/set-NGM2FIKF.js +251 -0
  44. package/packages/cli/dist/set-NGM2FIKF.js.map +7 -0
  45. package/packages/cli/dist/uninstall-Q3CP4UN5.js +539 -0
  46. package/packages/cli/dist/uninstall-Q3CP4UN5.js.map +7 -0
  47. package/packages/cli/dist/unpublish-VBTNTMS5.js +245 -0
  48. package/packages/cli/dist/unpublish-VBTNTMS5.js.map +7 -0
  49. package/packages/cli/dist/view-MXRBMXOG.js +488 -0
  50. package/packages/cli/dist/view-MXRBMXOG.js.map +7 -0
  51. package/packages/cli/package.json +2 -0
  52. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts +5 -4
  53. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts.map +1 -1
  54. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js +6 -5
  55. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js.map +1 -1
  56. package/packages/core/dist/core/install/install-reporting.js +1 -1
  57. package/packages/core/dist/core/install/install-reporting.js.map +1 -1
  58. package/packages/core/dist/core/install/list-handler.d.ts.map +1 -1
  59. package/packages/core/dist/core/install/list-handler.js +7 -0
  60. package/packages/core/dist/core/install/list-handler.js.map +1 -1
  61. package/packages/core/dist/core/install/marketplace-handler.d.ts.map +1 -1
  62. package/packages/core/dist/core/install/marketplace-handler.js.map +1 -1
  63. package/packages/core/dist/core/install/operations/conflict-handler.d.ts +2 -1
  64. package/packages/core/dist/core/install/operations/conflict-handler.d.ts.map +1 -1
  65. package/packages/core/dist/core/install/operations/conflict-handler.js +2 -2
  66. package/packages/core/dist/core/install/operations/conflict-handler.js.map +1 -1
  67. package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts.map +1 -1
  68. package/packages/core/dist/core/install/orchestrator/orchestrator.js +22 -14
  69. package/packages/core/dist/core/install/orchestrator/orchestrator.js.map +1 -1
  70. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts +1 -0
  71. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts.map +1 -1
  72. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js +11 -24
  73. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js.map +1 -1
  74. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts +2 -0
  75. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts.map +1 -1
  76. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js +14 -14
  77. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js.map +1 -1
  78. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts +7 -0
  79. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts.map +1 -1
  80. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js +28 -0
  81. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js.map +1 -1
  82. package/packages/core/dist/core/install/platform-resolution.d.ts +3 -0
  83. package/packages/core/dist/core/install/platform-resolution.d.ts.map +1 -1
  84. package/packages/core/dist/core/install/platform-resolution.js +5 -2
  85. package/packages/core/dist/core/install/platform-resolution.js.map +1 -1
  86. package/packages/core/dist/core/install/preprocessing/context-population.d.ts +18 -0
  87. package/packages/core/dist/core/install/preprocessing/context-population.d.ts.map +1 -0
  88. package/packages/core/dist/core/install/preprocessing/context-population.js +36 -0
  89. package/packages/core/dist/core/install/preprocessing/context-population.js.map +1 -0
  90. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts +23 -0
  91. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts.map +1 -1
  92. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js +44 -0
  93. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js.map +1 -1
  94. package/packages/core/dist/core/install/sources/path-source.d.ts.map +1 -1
  95. package/packages/core/dist/core/install/sources/path-source.js +8 -0
  96. package/packages/core/dist/core/install/sources/path-source.js.map +1 -1
  97. package/packages/core/dist/core/install/unified/context-builders.d.ts +5 -0
  98. package/packages/core/dist/core/install/unified/context-builders.d.ts.map +1 -1
  99. package/packages/core/dist/core/install/unified/context-builders.js +13 -0
  100. package/packages/core/dist/core/install/unified/context-builders.js.map +1 -1
  101. package/packages/core/dist/core/install/unified/context-helpers.d.ts.map +1 -1
  102. package/packages/core/dist/core/install/unified/context-helpers.js +5 -0
  103. package/packages/core/dist/core/install/unified/context-helpers.js.map +1 -1
  104. package/packages/core/dist/core/install/unified/context.d.ts +6 -0
  105. package/packages/core/dist/core/install/unified/context.d.ts.map +1 -1
  106. package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts.map +1 -1
  107. package/packages/core/dist/core/install/unified/multi-context-pipeline.js +0 -2
  108. package/packages/core/dist/core/install/unified/multi-context-pipeline.js.map +1 -1
  109. package/packages/core/dist/core/install/unified/phases/conflicts.d.ts.map +1 -1
  110. package/packages/core/dist/core/install/unified/phases/conflicts.js +1 -1
  111. package/packages/core/dist/core/install/unified/phases/conflicts.js.map +1 -1
  112. package/packages/core/dist/core/install/unified/phases/execute.d.ts.map +1 -1
  113. package/packages/core/dist/core/install/unified/phases/execute.js +2 -1
  114. package/packages/core/dist/core/install/unified/phases/execute.js.map +1 -1
  115. package/packages/core/dist/core/install/unified/phases/report.js +1 -1
  116. package/packages/core/dist/core/install/unified/phases/report.js.map +1 -1
  117. package/packages/core/dist/core/install/unified/pipeline.d.ts.map +1 -1
  118. package/packages/core/dist/core/install/unified/pipeline.js +5 -2
  119. package/packages/core/dist/core/install/unified/pipeline.js.map +1 -1
  120. package/packages/core/dist/core/ports/resolve.d.ts +0 -13
  121. package/packages/core/dist/core/ports/resolve.d.ts.map +1 -1
  122. package/packages/core/dist/core/ports/resolve.js +0 -28
  123. package/packages/core/dist/core/ports/resolve.js.map +1 -1
  124. package/packages/core/dist/core/remove/removal-confirmation.d.ts +4 -1
  125. package/packages/core/dist/core/remove/removal-confirmation.d.ts.map +1 -1
  126. package/packages/core/dist/core/remove/removal-confirmation.js +5 -4
  127. package/packages/core/dist/core/remove/removal-confirmation.js.map +1 -1
  128. package/packages/core/dist/core/remove/remove-from-source-pipeline.d.ts.map +1 -1
  129. package/packages/core/dist/core/remove/remove-from-source-pipeline.js +1 -10
  130. package/packages/core/dist/core/remove/remove-from-source-pipeline.js.map +1 -1
  131. package/packages/core/dist/core/uninstall/uninstall-executor.js +1 -1
  132. package/packages/core/dist/core/uninstall/uninstall-executor.js.map +1 -1
  133. package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts +2 -2
  134. package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts.map +1 -1
  135. package/packages/core/dist/core/uninstall/uninstall-reporter.js +4 -4
  136. package/packages/core/dist/core/uninstall/uninstall-reporter.js.map +1 -1
  137. package/packages/core/dist/index.d.ts +1 -1
  138. package/packages/core/dist/index.d.ts.map +1 -1
  139. package/packages/core/dist/types/execution-context.d.ts +24 -10
  140. package/packages/core/dist/types/execution-context.d.ts.map +1 -1
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getChildPrefix,
4
+ getTreeConnector
5
+ } from "./chunk-HTYHJA3B.js";
6
+ import {
7
+ getLocalPackagesDir
8
+ } from "./chunk-BCYZDID6.js";
9
+ import {
10
+ createCliExecutionContext
11
+ } from "./chunk-BROJ6OUT.js";
12
+ import {
13
+ listAllPackages,
14
+ listPackageVersions
15
+ } from "./chunk-XEPVYZO3.js";
16
+ import {
17
+ parsePackageYml
18
+ } from "./chunk-QTQYI4L5.js";
19
+ import "./chunk-VN22A7NW.js";
20
+ import {
21
+ FILE_PATTERNS
22
+ } from "./chunk-J4IFFBLP.js";
23
+ import {
24
+ exists,
25
+ listDirectories
26
+ } from "./chunk-S47F4OG4.js";
27
+ import "./chunk-ID4SVDQZ.js";
28
+ import "./chunk-5EFWGD33.js";
29
+
30
+ // ../core/src/core/search/search-pipeline.ts
31
+ import { join } from "path";
32
+ function matchesQuery(query, name, description, keywords) {
33
+ let q = query.toLowerCase();
34
+ return !!(name.toLowerCase().includes(q) || keywords?.some((kw) => kw.toLowerCase().includes(q)) || description?.toLowerCase().includes(q));
35
+ }
36
+ async function loadPackageMetadata(packageDir) {
37
+ let ymlPath = join(packageDir, FILE_PATTERNS.OPENPACKAGE_YML);
38
+ if (!await exists(ymlPath)) return null;
39
+ try {
40
+ let yml = await parsePackageYml(ymlPath);
41
+ return { description: yml.description, keywords: yml.keywords };
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+ async function scanPackagesDirectory(packagesDir, source, query) {
47
+ if (!await exists(packagesDir)) return [];
48
+ let names = (await listDirectories(packagesDir)).filter((name) => !name.startsWith(".")).sort((a, b) => a.localeCompare(b)), matches = [];
49
+ for (let name of names) {
50
+ if (!query) {
51
+ matches.push({ name, source });
52
+ continue;
53
+ }
54
+ let metadata = await loadPackageMetadata(join(packagesDir, name));
55
+ matchesQuery(query, name, metadata?.description, metadata?.keywords) && matches.push({
56
+ name,
57
+ source,
58
+ description: metadata?.description,
59
+ keywords: metadata?.keywords
60
+ });
61
+ }
62
+ return matches;
63
+ }
64
+ async function scanRegistryDirectory(query) {
65
+ let packages = await listAllPackages(), matches = [];
66
+ for (let packageName of packages) {
67
+ let versions = await listPackageVersions(packageName);
68
+ versions.length !== 0 && (!query || matchesQuery(query, packageName)) && matches.push({
69
+ name: packageName,
70
+ source: "registry",
71
+ versions
72
+ });
73
+ }
74
+ return matches.sort((a, b) => a.name.localeCompare(b.name));
75
+ }
76
+ async function runSearchPipeline(options) {
77
+ let result = { matches: [] };
78
+ if (options.showProject) {
79
+ let ctx = await options.createContext({ global: !1, cwd: options.cwd }), projectPackagesDir = getLocalPackagesDir(ctx.targetDir), projectMatches = await scanPackagesDirectory(projectPackagesDir, "project", options.query);
80
+ result.matches.push(...projectMatches);
81
+ }
82
+ if (options.showGlobal) {
83
+ let ctx = await options.createContext({ global: !0, cwd: options.cwd }), globalPackagesDir = getLocalPackagesDir(ctx.targetDir), globalMatches = await scanPackagesDirectory(globalPackagesDir, "global", options.query);
84
+ result.matches.push(...globalMatches);
85
+ }
86
+ if (options.showRegistry) {
87
+ let registryMatches = await scanRegistryDirectory(options.query);
88
+ result.matches.push(...registryMatches);
89
+ }
90
+ return result;
91
+ }
92
+
93
+ // src/commands/search-display.ts
94
+ var DIM = "\x1B[2m", CYAN = "\x1B[36m", RESET = "\x1B[0m";
95
+ function dim(text) {
96
+ return `${DIM}${text}${RESET}`;
97
+ }
98
+ function cyan(text) {
99
+ return `${CYAN}${text}${RESET}`;
100
+ }
101
+ function displaySection(title, subtitle, matches, showAll) {
102
+ if (matches.length !== 0) {
103
+ console.log(`${cyan(title)} ${dim(subtitle)}`);
104
+ for (let i = 0; i < matches.length; i++) {
105
+ let pkg = matches[i], isLast = i === matches.length - 1;
106
+ if (pkg.source === "registry" && pkg.versions)
107
+ if (showAll && pkg.versions.length > 1) {
108
+ let connector = getTreeConnector(isLast, !0);
109
+ console.log(`${connector}${pkg.name}`);
110
+ let childPfx = getChildPrefix("", isLast);
111
+ for (let vi = 0; vi < pkg.versions.length; vi++) {
112
+ let isLastVersion = vi === pkg.versions.length - 1, versionConnector = getTreeConnector(isLastVersion, !1);
113
+ console.log(`${childPfx}${versionConnector}${pkg.versions[vi]}`);
114
+ }
115
+ } else {
116
+ let connector = getTreeConnector(isLast, !1);
117
+ console.log(`${connector}${pkg.name}@${pkg.versions[0]}`);
118
+ }
119
+ else {
120
+ let connector = getTreeConnector(isLast, !1);
121
+ console.log(`${connector}${pkg.name}`);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ function displayResults(result, showAll) {
127
+ let project = result.matches.filter((m) => m.source === "project"), global = result.matches.filter((m) => m.source === "global"), registry = result.matches.filter((m) => m.source === "registry"), hasAny = !1;
128
+ project.length > 0 && (displaySection("[Project Packages]", "(./.openpackage/packages)", project, showAll), hasAny = !0), global.length > 0 && (displaySection("[Global Packages]", "(~/.openpackage/packages)", global, showAll), hasAny = !0), registry.length > 0 && (displaySection("[Local Registry]", "(~/.openpackage/registry)", registry, showAll), hasAny = !0), hasAny || console.log(dim("No packages found."));
129
+ }
130
+ function displayJson(result) {
131
+ let output = result.matches.map((m) => {
132
+ let entry = { name: m.name, source: m.source };
133
+ return m.versions && (entry.versions = m.versions), m.description && (entry.description = m.description), m.keywords && (entry.keywords = m.keywords), entry;
134
+ });
135
+ console.log(JSON.stringify(output, null, 2));
136
+ }
137
+
138
+ // src/commands/search.ts
139
+ async function searchCommand(query, options, command) {
140
+ let programOpts = command.parent?.opts() || {}, explicitSources = options.project || options.global || options.registry, result = await runSearchPipeline({
141
+ query,
142
+ showProject: options.project || !explicitSources,
143
+ showGlobal: options.global || !explicitSources,
144
+ showRegistry: options.registry || !explicitSources,
145
+ createContext: (opts) => createCliExecutionContext({ global: opts.global, cwd: opts.cwd }),
146
+ cwd: programOpts.cwd
147
+ });
148
+ return options.json ? displayJson(result) : displayResults(result, options.all || !1), { success: !0 };
149
+ }
150
+ async function setupSearchCommand(args) {
151
+ let [query, options, command] = args;
152
+ await searchCommand(query, options, command);
153
+ }
154
+ export {
155
+ setupSearchCommand
156
+ };
157
+ //# sourceMappingURL=search-ABROK3UO.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/search/search-pipeline.ts", "../src/commands/search-display.ts", "../src/commands/search.ts"],
4
+ "sourcesContent": ["/**\n * Search Pipeline\n *\n * Core logic for searching packages across project, global, and registry sources.\n * No terminal-UI dependencies \u2014 display is handled by the CLI command layer.\n */\n\nimport { join } from 'path';\nimport { listAllPackages, listPackageVersions } from '../directory.js';\nimport { getLocalPackagesDir } from '../../utils/paths.js';\nimport { exists, listDirectories } from '../../utils/fs.js';\nimport { parsePackageYml } from '../../utils/package-yml.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport type { ExecutionContext } from '../../types/execution-context.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PackageMatch {\n name: string;\n source: 'project' | 'global' | 'registry';\n versions?: string[]; // registry packages only (sorted latest first)\n description?: string;\n keywords?: string[];\n}\n\nexport interface SearchResult {\n matches: PackageMatch[];\n}\n\nexport interface SearchOptions {\n project?: boolean;\n global?: boolean;\n registry?: boolean;\n all?: boolean;\n json?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Matching\n// ---------------------------------------------------------------------------\n\n/**\n * Weighted matching against package metadata.\n * Returns true if query matches name, keywords, or description (checked in that order).\n */\nexport function matchesQuery(query: string, name: string, description?: string, keywords?: string[]): boolean {\n const q = query.toLowerCase();\n\n if (name.toLowerCase().includes(q)) return true;\n if (keywords?.some(kw => kw.toLowerCase().includes(q))) return true;\n if (description?.toLowerCase().includes(q)) return true;\n\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Scanning\n// ---------------------------------------------------------------------------\n\n/**\n * Try to load metadata from an openpackage.yml in a package directory.\n */\nasync function loadPackageMetadata(packageDir: string): Promise<{ description?: string; keywords?: string[] } | null> {\n const ymlPath = join(packageDir, FILE_PATTERNS.OPENPACKAGE_YML);\n if (!(await exists(ymlPath))) return null;\n\n try {\n const yml = await parsePackageYml(ymlPath);\n return { description: yml.description, keywords: yml.keywords };\n } catch {\n return null;\n }\n}\n\n/**\n * Scan a /packages directory and return PackageMatch entries.\n */\nexport async function scanPackagesDirectory(\n packagesDir: string,\n source: 'project' | 'global',\n query?: string\n): Promise<PackageMatch[]> {\n if (!(await exists(packagesDir))) return [];\n\n const dirs = await listDirectories(packagesDir);\n const names = dirs\n .filter(name => !name.startsWith('.'))\n .sort((a, b) => a.localeCompare(b));\n\n const matches: PackageMatch[] = [];\n\n for (const name of names) {\n if (!query) {\n matches.push({ name, source });\n continue;\n }\n\n const metadata = await loadPackageMetadata(join(packagesDir, name));\n if (matchesQuery(query, name, metadata?.description, metadata?.keywords)) {\n matches.push({\n name,\n source,\n description: metadata?.description,\n keywords: metadata?.keywords,\n });\n }\n }\n\n return matches;\n}\n\n/**\n * Scan the local registry directory and return PackageMatch entries.\n */\nexport async function scanRegistryDirectory(query?: string): Promise<PackageMatch[]> {\n const packages = await listAllPackages();\n const matches: PackageMatch[] = [];\n\n for (const packageName of packages) {\n const versions = await listPackageVersions(packageName);\n if (versions.length === 0) continue;\n\n if (!query || matchesQuery(query, packageName)) {\n matches.push({\n name: packageName,\n source: 'registry',\n versions,\n });\n }\n }\n\n return matches.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline\n// ---------------------------------------------------------------------------\n\nexport interface RunSearchOptions {\n query?: string;\n showProject: boolean;\n showGlobal: boolean;\n showRegistry: boolean;\n /** Factory to create execution contexts (injected by CLI layer) */\n createContext: (opts: { global: boolean; cwd?: string }) => Promise<ExecutionContext>;\n cwd?: string;\n}\n\n/**\n * Run the search pipeline across configured sources.\n * Returns a SearchResult with matches \u2014 display is the caller's concern.\n */\nexport async function runSearchPipeline(options: RunSearchOptions): Promise<SearchResult> {\n const result: SearchResult = { matches: [] };\n\n if (options.showProject) {\n const ctx = await options.createContext({ global: false, cwd: options.cwd });\n const projectPackagesDir = getLocalPackagesDir(ctx.targetDir);\n const projectMatches = await scanPackagesDirectory(projectPackagesDir, 'project', options.query);\n result.matches.push(...projectMatches);\n }\n\n if (options.showGlobal) {\n const ctx = await options.createContext({ global: true, cwd: options.cwd });\n const globalPackagesDir = getLocalPackagesDir(ctx.targetDir);\n const globalMatches = await scanPackagesDirectory(globalPackagesDir, 'global', options.query);\n result.matches.push(...globalMatches);\n }\n\n if (options.showRegistry) {\n const registryMatches = await scanRegistryDirectory(options.query);\n result.matches.push(...registryMatches);\n }\n\n return result;\n}\n", "/**\n * Search Display Helpers\n *\n * Terminal-specific display formatting for search results.\n * Separated from search.ts to keep the command handler thin.\n */\n\nimport type { SearchResult, PackageMatch } from '@opkg/core/core/search/search-pipeline.js';\nimport { getTreeConnector, getChildPrefix } from '@opkg/core/core/list/list-tree-renderer.js';\n\n// ---------------------------------------------------------------------------\n// ANSI helpers\n// ---------------------------------------------------------------------------\n\nconst DIM = '\\x1b[2m';\nconst CYAN = '\\x1b[36m';\nconst RESET = '\\x1b[0m';\n\nfunction dim(text: string): string {\n return `${DIM}${text}${RESET}`;\n}\n\nfunction cyan(text: string): string {\n return `${CYAN}${text}${RESET}`;\n}\n\n// ---------------------------------------------------------------------------\n// Display functions\n// ---------------------------------------------------------------------------\n\nfunction displaySection(title: string, subtitle: string, matches: PackageMatch[], showAll: boolean): void {\n if (matches.length === 0) return;\n\n console.log(`${cyan(title)} ${dim(subtitle)}`);\n\n for (let i = 0; i < matches.length; i++) {\n const pkg = matches[i];\n const isLast = i === matches.length - 1;\n\n if (pkg.source === 'registry' && pkg.versions) {\n if (showAll && pkg.versions.length > 1) {\n const connector = getTreeConnector(isLast, true);\n console.log(`${connector}${pkg.name}`);\n const childPfx = getChildPrefix('', isLast);\n for (let vi = 0; vi < pkg.versions.length; vi++) {\n const isLastVersion = vi === pkg.versions.length - 1;\n const versionConnector = getTreeConnector(isLastVersion, false);\n console.log(`${childPfx}${versionConnector}${pkg.versions[vi]}`);\n }\n } else {\n const connector = getTreeConnector(isLast, false);\n console.log(`${connector}${pkg.name}@${pkg.versions[0]}`);\n }\n } else {\n const connector = getTreeConnector(isLast, false);\n console.log(`${connector}${pkg.name}`);\n }\n }\n}\n\nexport function displayResults(result: SearchResult, showAll: boolean): void {\n const project = result.matches.filter(m => m.source === 'project');\n const global = result.matches.filter(m => m.source === 'global');\n const registry = result.matches.filter(m => m.source === 'registry');\n\n let hasAny = false;\n\n if (project.length > 0) {\n displaySection('[Project Packages]', '(./.openpackage/packages)', project, showAll);\n hasAny = true;\n }\n if (global.length > 0) {\n displaySection('[Global Packages]', '(~/.openpackage/packages)', global, showAll);\n hasAny = true;\n }\n if (registry.length > 0) {\n displaySection('[Local Registry]', '(~/.openpackage/registry)', registry, showAll);\n hasAny = true;\n }\n if (!hasAny) {\n console.log(dim('No packages found.'));\n }\n}\n\nexport function displayJson(result: SearchResult): void {\n const output = result.matches.map(m => {\n const entry: Record<string, unknown> = { name: m.name, source: m.source };\n if (m.versions) entry.versions = m.versions;\n if (m.description) entry.description = m.description;\n if (m.keywords) entry.keywords = m.keywords;\n return entry;\n });\n console.log(JSON.stringify(output, null, 2));\n}\n", "/**\n * Search Command (CLI layer)\n *\n * Thin shell over core/search/search-pipeline.ts.\n * Handles CLI arg parsing and delegates display to search-display.ts.\n */\n\nimport { Command } from 'commander';\n\nimport { CommandResult } from '@opkg/core/types/index.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { runSearchPipeline, type SearchOptions } from '@opkg/core/core/search/search-pipeline.js';\nimport { displayResults, displayJson } from './search-display.js';\n\nasync function searchCommand(\n query: string | undefined,\n options: SearchOptions,\n command: Command\n): Promise<CommandResult> {\n const programOpts = command.parent?.opts() || {};\n const explicitSources = options.project || options.global || options.registry;\n\n const result = await runSearchPipeline({\n query,\n showProject: options.project || !explicitSources,\n showGlobal: options.global || !explicitSources,\n showRegistry: options.registry || !explicitSources,\n createContext: (opts) => createCliExecutionContext({ global: opts.global, cwd: opts.cwd }),\n cwd: programOpts.cwd,\n });\n\n if (options.json) {\n displayJson(result);\n } else {\n displayResults(result, options.all || false);\n }\n\n return { success: true };\n}\n\nexport async function setupSearchCommand(args: any[]): Promise<void> {\n const [query, options, command] = args as [string | undefined, SearchOptions, Command];\n await searchCommand(query, options, command);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ resolveMutableSource
4
+ } from "./chunk-QQFDQPT3.js";
5
+ import "./chunk-IBIYIU3K.js";
6
+ import "./chunk-E2DVTD75.js";
7
+ import "./chunk-V5OW4YEB.js";
8
+ import {
9
+ formatPathForDisplay
10
+ } from "./chunk-4B5HJLP2.js";
11
+ import {
12
+ createCliExecutionContext,
13
+ resolveOutput,
14
+ resolvePrompt
15
+ } from "./chunk-BROJ6OUT.js";
16
+ import "./chunk-XEPVYZO3.js";
17
+ import {
18
+ parsePackageYml,
19
+ writePackageYml
20
+ } from "./chunk-QTQYI4L5.js";
21
+ import {
22
+ normalizePackageName,
23
+ validatePackageName
24
+ } from "./chunk-VN22A7NW.js";
25
+ import "./chunk-YMKK4XPN.js";
26
+ import {
27
+ FILE_PATTERNS
28
+ } from "./chunk-J4IFFBLP.js";
29
+ import {
30
+ exists
31
+ } from "./chunk-S47F4OG4.js";
32
+ import {
33
+ UserCancellationError,
34
+ ValidationError
35
+ } from "./chunk-ID4SVDQZ.js";
36
+ import {
37
+ logger
38
+ } from "./chunk-5EFWGD33.js";
39
+
40
+ // ../core/src/core/set/set-pipeline.ts
41
+ import path from "path";
42
+ import semver from "semver";
43
+
44
+ // ../core/src/core/set/set-output.ts
45
+ function displayConfigChanges(changes, output) {
46
+ let out = output ?? resolveOutput();
47
+ if (changes.length === 0) {
48
+ out.info(`
49
+ No changes detected.`);
50
+ return;
51
+ }
52
+ out.info(`
53
+ \u{1F4DD} Changes to apply:`);
54
+ for (let change of changes) {
55
+ let oldDisplay = formatValue(change.oldValue), newDisplay = formatValue(change.newValue);
56
+ out.info(` ${change.field}: ${oldDisplay} \u2192 ${newDisplay}`);
57
+ }
58
+ }
59
+ function formatValue(value) {
60
+ return value == null ? "(not set)" : Array.isArray(value) ? value.length === 0 ? "[]" : `[${value.join(", ")}]` : typeof value == "boolean" ? value.toString() : typeof value == "string" ? value : JSON.stringify(value);
61
+ }
62
+ function displaySetSuccess(result, cwd, output) {
63
+ let out = output ?? resolveOutput(), displayPath = formatPathForDisplay(result.packagePath, cwd);
64
+ if (out.success(`Updated ${result.packageName} manifest`), out.info(` Path: ${displayPath}`), out.info(` Type: ${result.sourceType} package`), result.updatedFields.length > 0) {
65
+ let fieldList = result.updatedFields.join(", ");
66
+ out.info(` Updated: ${fieldList}`);
67
+ }
68
+ }
69
+ function displayCurrentConfig(config, packagePath, output) {
70
+ let out = output ?? resolveOutput();
71
+ out.info(`
72
+ Current package: ${config.name}`), config.version && out.info(`Version: ${config.version}`), out.info(`Path: ${packagePath}`), out.info(`
73
+ Leave blank to keep current value, or enter new value:
74
+ `);
75
+ }
76
+ function displayNoChanges(packageName, output) {
77
+ let out = output ?? resolveOutput();
78
+ out.success(`No changes made to ${packageName}`), out.info(" Manifest unchanged");
79
+ }
80
+
81
+ // ../core/src/core/set/set-pipeline.ts
82
+ async function resolvePackageForSet(cwd, packageInput) {
83
+ if (packageInput) {
84
+ let resolved = await resolveMutableSource({
85
+ cwd,
86
+ packageName: packageInput
87
+ }), sourceType = resolved.absolutePath.includes(".openpackage/packages") ? resolved.absolutePath.includes(cwd) ? "workspace" : "global" : "cwd";
88
+ return {
89
+ packagePath: resolved.absolutePath,
90
+ packageName: resolved.packageName,
91
+ sourceType
92
+ };
93
+ }
94
+ let manifestPath = path.join(cwd, FILE_PATTERNS.OPENPACKAGE_YML);
95
+ if (!await exists(manifestPath))
96
+ throw new Error(
97
+ `No openpackage.yml found in current directory.
98
+ Either specify a package name or run from a package root:
99
+ opkg set <package-name> [options]
100
+ opkg set [options] # When in package root`
101
+ );
102
+ let manifest = await parsePackageYml(manifestPath);
103
+ return {
104
+ packagePath: cwd,
105
+ packageName: manifest.name,
106
+ sourceType: "cwd"
107
+ };
108
+ }
109
+ function validateUpdates(updates) {
110
+ if (updates.name !== void 0 && validatePackageName(updates.name), updates.version !== void 0 && !semver.valid(updates.version))
111
+ throw new ValidationError(
112
+ `Invalid version format: "${updates.version}"
113
+ Version must be valid semver (e.g., 1.0.0, 2.1.3-beta.1)`
114
+ );
115
+ if (updates.homepage !== void 0 && updates.homepage.trim().length > 0)
116
+ try {
117
+ new URL(updates.homepage);
118
+ } catch {
119
+ throw new ValidationError(
120
+ `Invalid homepage URL: "${updates.homepage}"
121
+ Must be a valid URL (e.g., https://example.com)`
122
+ );
123
+ }
124
+ }
125
+ function extractUpdatesFromOptions(options) {
126
+ let updates = {};
127
+ return options.name !== void 0 && (updates.name = normalizePackageName(options.name)), options.ver !== void 0 && (updates.version = options.ver), options.description !== void 0 && (updates.description = options.description), options.keywords !== void 0 && (updates.keywords = options.keywords.trim().split(/\s+/).filter((k) => k.length > 0)), options.author !== void 0 && (updates.author = options.author), options.license !== void 0 && (updates.license = options.license), options.homepage !== void 0 && (updates.homepage = options.homepage), options.private !== void 0 && (updates.private = options.private), updates;
128
+ }
129
+ async function promptPackageUpdates(currentConfig, prm) {
130
+ displayCurrentConfig(currentConfig, "");
131
+ let name = await prm.text("Package name:", {
132
+ initial: currentConfig.name,
133
+ validate: (value) => {
134
+ if (!value) return "Name is required";
135
+ try {
136
+ validatePackageName(value);
137
+ } catch (error) {
138
+ return error.message.replace(/^Validation error:\s*/, "");
139
+ }
140
+ return !0;
141
+ }
142
+ }), version = await prm.text("Version:", {
143
+ initial: currentConfig.version || "",
144
+ validate: (value) => value ? semver.valid(value) ? !0 : "Version must be valid semver (e.g., 1.0.0)" : !0
145
+ }), description = await prm.text("Description:", {
146
+ initial: currentConfig.description || ""
147
+ }), keywords = await prm.text("Keywords (space-separated):", {
148
+ initial: currentConfig.keywords ? currentConfig.keywords.join(" ") : ""
149
+ }), author = await prm.text("Author:", {
150
+ initial: currentConfig.author || ""
151
+ }), license = await prm.text("License:", {
152
+ initial: currentConfig.license || ""
153
+ }), homepage = await prm.text("Homepage:", {
154
+ initial: currentConfig.homepage || "",
155
+ validate: (value) => {
156
+ if (!value || value.trim().length === 0) return !0;
157
+ try {
158
+ return new URL(value), !0;
159
+ } catch {
160
+ return "Must be a valid URL";
161
+ }
162
+ }
163
+ }), isPrivate = await prm.confirm("Private package?", currentConfig.private || !1), updates = {}, normalizedName = normalizePackageName(name);
164
+ normalizedName !== currentConfig.name && (updates.name = normalizedName), version && version !== currentConfig.version && (updates.version = version), description !== (currentConfig.description || "") && (updates.description = description || void 0);
165
+ let newKeywords = keywords ? keywords.trim().split(/\s+/).filter((k) => k.length > 0) : [], currentKeywords = currentConfig.keywords || [];
166
+ return JSON.stringify(newKeywords) !== JSON.stringify(currentKeywords) && (updates.keywords = newKeywords.length > 0 ? newKeywords : void 0), author !== (currentConfig.author || "") && (updates.author = author || void 0), license !== (currentConfig.license || "") && (updates.license = license || void 0), homepage !== (currentConfig.homepage || "") && (updates.homepage = homepage || void 0), isPrivate !== (currentConfig.private || !1) && (updates.private = isPrivate), updates;
167
+ }
168
+ function detectChanges(currentConfig, updates) {
169
+ let changes = [];
170
+ for (let [field, newValue] of Object.entries(updates)) {
171
+ let oldValue = currentConfig[field];
172
+ Array.isArray(newValue) && Array.isArray(oldValue) ? JSON.stringify(oldValue) !== JSON.stringify(newValue) && changes.push({ field, oldValue, newValue }) : oldValue !== newValue && changes.push({ field, oldValue, newValue });
173
+ }
174
+ return changes;
175
+ }
176
+ function applyUpdates(currentConfig, updates) {
177
+ return {
178
+ ...currentConfig,
179
+ ...updates
180
+ };
181
+ }
182
+ async function runSetPipeline(packageInput, options = {}, prompt) {
183
+ let cwd = process.cwd(), prm = prompt ?? resolvePrompt();
184
+ try {
185
+ let hasFieldFlags = !!(options.ver || options.name || options.description !== void 0 || options.keywords !== void 0 || options.author !== void 0 || options.license !== void 0 || options.homepage !== void 0 || options.private !== void 0), isInteractive = !options.nonInteractive && !hasFieldFlags;
186
+ if (options.nonInteractive && !hasFieldFlags)
187
+ throw new ValidationError(
188
+ `Non-interactive mode requires at least one field flag.
189
+ Available flags: --ver, --name, --description, --keywords, --author, --license, --homepage, --private
190
+ Example: opkg set my-package --ver 1.0.0 --non-interactive`
191
+ );
192
+ logger.debug("Starting set pipeline", { packageInput, options, isInteractive });
193
+ let resolved = await resolvePackageForSet(cwd, packageInput);
194
+ logger.info("Package resolved for set", {
195
+ packageName: resolved.packageName,
196
+ packagePath: resolved.packagePath,
197
+ sourceType: resolved.sourceType
198
+ });
199
+ let manifestPath = path.join(resolved.packagePath, FILE_PATTERNS.OPENPACKAGE_YML), currentConfig = await parsePackageYml(manifestPath), updates;
200
+ isInteractive ? updates = await promptPackageUpdates(currentConfig, prm) : updates = extractUpdatesFromOptions(options);
201
+ let changes = detectChanges(currentConfig, updates);
202
+ if (changes.length === 0)
203
+ return displayNoChanges(resolved.packageName), {
204
+ success: !0,
205
+ data: {
206
+ packageName: resolved.packageName,
207
+ packagePath: resolved.packagePath,
208
+ sourceType: resolved.sourceType,
209
+ updatedFields: [],
210
+ manifestPath
211
+ }
212
+ };
213
+ if (validateUpdates(updates), displayConfigChanges(changes), !options.force && isInteractive && !await prm.confirm("Apply these changes?", !0))
214
+ throw new UserCancellationError();
215
+ let updatedConfig = applyUpdates(currentConfig, updates);
216
+ await writePackageYml(manifestPath, updatedConfig), logger.info("Manifest updated successfully", {
217
+ packageName: resolved.packageName,
218
+ updatedFields: changes.map((c) => c.field)
219
+ });
220
+ let result = {
221
+ packageName: resolved.packageName,
222
+ packagePath: resolved.packagePath,
223
+ sourceType: resolved.sourceType,
224
+ updatedFields: changes.map((c) => c.field),
225
+ manifestPath
226
+ };
227
+ return displaySetSuccess(result, cwd), {
228
+ success: !0,
229
+ data: result
230
+ };
231
+ } catch (error) {
232
+ if (error instanceof UserCancellationError)
233
+ throw error;
234
+ let message = error instanceof Error ? error.message : String(error);
235
+ return logger.error("Set pipeline failed", { error: message }), {
236
+ success: !1,
237
+ error: message
238
+ };
239
+ }
240
+ }
241
+
242
+ // src/commands/set.ts
243
+ async function setupSetCommand(args) {
244
+ let [packageInput, options] = args, ctx = await createCliExecutionContext({ outputMode: "rich" }), prompt = resolvePrompt(ctx), result = await runSetPipeline(packageInput, options, prompt);
245
+ if (!result.success)
246
+ throw new Error(result.error || "Set operation failed");
247
+ }
248
+ export {
249
+ setupSetCommand
250
+ };
251
+ //# sourceMappingURL=set-NGM2FIKF.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/set/set-pipeline.ts", "../../core/src/core/set/set-output.ts", "../src/commands/set.ts"],
4
+ "sourcesContent": ["/**\n * @fileoverview Main pipeline for the set command\n * \n * Orchestrates package resolution, manifest updates, and display.\n */\n\nimport path from 'path';\nimport semver from 'semver';\n\nimport type { CommandResult, PackageYml } from '../../types/index.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport { parsePackageYml, writePackageYml } from '../../utils/package-yml.js';\nimport { exists } from '../../utils/fs.js';\nimport { logger } from '../../utils/logger.js';\nimport { normalizePackageName, validatePackageName } from '../../utils/package-name.js';\nimport { ValidationError, UserCancellationError } from '../../utils/errors.js';\nimport { resolveMutableSource } from '../source-resolution/resolve-mutable-source.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { resolvePrompt } from '../ports/resolve.js';\nimport { \n displayConfigChanges, \n displaySetSuccess, \n displayCurrentConfig,\n displayNoChanges \n} from './set-output.js';\nimport type { \n SetCommandOptions, \n PackageManifestUpdates, \n SetPipelineResult,\n ConfigChange \n} from './set-types.js';\n\n/**\n * Resolve package source for set operation\n * Priority: provided package name \u2192 CWD package\n */\nasync function resolvePackageForSet(\n cwd: string,\n packageInput?: string\n): Promise<{\n packagePath: string;\n packageName: string;\n sourceType: 'workspace' | 'global' | 'cwd';\n}> {\n // If package name provided, resolve mutable source\n if (packageInput) {\n const resolved = await resolveMutableSource({\n cwd,\n packageName: packageInput\n });\n \n const sourceType = resolved.absolutePath.includes('.openpackage/packages')\n ? (resolved.absolutePath.includes(cwd) ? 'workspace' as const : 'global' as const)\n : 'cwd' as const;\n \n return {\n packagePath: resolved.absolutePath,\n packageName: resolved.packageName,\n sourceType\n };\n }\n \n // No package name - check CWD\n const manifestPath = path.join(cwd, FILE_PATTERNS.OPENPACKAGE_YML);\n if (!(await exists(manifestPath))) {\n throw new Error(\n 'No openpackage.yml found in current directory.\\n' +\n 'Either specify a package name or run from a package root:\\n' +\n ' opkg set <package-name> [options]\\n' +\n ' opkg set [options] # When in package root'\n );\n }\n \n const manifest = await parsePackageYml(manifestPath);\n \n return {\n packagePath: cwd,\n packageName: manifest.name,\n sourceType: 'cwd'\n };\n}\n\n/**\n * Validate field values before applying\n */\nfunction validateUpdates(updates: PackageManifestUpdates): void {\n // Validate name\n if (updates.name !== undefined) {\n validatePackageName(updates.name);\n }\n \n // Validate version\n if (updates.version !== undefined) {\n if (!semver.valid(updates.version)) {\n throw new ValidationError(\n `Invalid version format: \"${updates.version}\"\\n` +\n `Version must be valid semver (e.g., 1.0.0, 2.1.3-beta.1)`\n );\n }\n }\n \n // Validate homepage URL format (basic check)\n if (updates.homepage !== undefined && updates.homepage.trim().length > 0) {\n try {\n new URL(updates.homepage);\n } catch {\n throw new ValidationError(\n `Invalid homepage URL: \"${updates.homepage}\"\\n` +\n `Must be a valid URL (e.g., https://example.com)`\n );\n }\n }\n}\n\n/**\n * Extract updates from CLI options\n */\nfunction extractUpdatesFromOptions(options: SetCommandOptions): PackageManifestUpdates {\n const updates: PackageManifestUpdates = {};\n \n if (options.name !== undefined) {\n updates.name = normalizePackageName(options.name);\n }\n \n if (options.ver !== undefined) {\n updates.version = options.ver;\n }\n \n if (options.description !== undefined) {\n updates.description = options.description;\n }\n \n if (options.keywords !== undefined) {\n // Parse space-separated keywords into array\n updates.keywords = options.keywords\n .trim()\n .split(/\\s+/)\n .filter(k => k.length > 0);\n }\n \n if (options.author !== undefined) {\n updates.author = options.author;\n }\n \n if (options.license !== undefined) {\n updates.license = options.license;\n }\n \n if (options.homepage !== undefined) {\n updates.homepage = options.homepage;\n }\n \n if (options.private !== undefined) {\n updates.private = options.private;\n }\n \n return updates;\n}\n\n/**\n * Prompt user for updates interactively\n */\nasync function promptPackageUpdates(\n currentConfig: PackageYml,\n prm: PromptPort\n): Promise<PackageManifestUpdates> {\n displayCurrentConfig(currentConfig, '');\n \n const name = await prm.text('Package name:', {\n initial: currentConfig.name,\n validate: (value: string) => {\n if (!value) return 'Name is required';\n try {\n validatePackageName(value);\n } catch (error) {\n const message = (error as Error).message;\n return message.replace(/^Validation error:\\s*/, '');\n }\n return true;\n }\n });\n \n const version = await prm.text('Version:', {\n initial: currentConfig.version || '',\n validate: (value: string) => {\n if (!value) return true; // Allow empty (will keep current)\n if (!semver.valid(value)) {\n return 'Version must be valid semver (e.g., 1.0.0)';\n }\n return true;\n }\n });\n \n const description = await prm.text('Description:', {\n initial: currentConfig.description || ''\n });\n \n const keywords = await prm.text('Keywords (space-separated):', {\n initial: currentConfig.keywords ? currentConfig.keywords.join(' ') : ''\n });\n \n const author = await prm.text('Author:', {\n initial: currentConfig.author || ''\n });\n \n const license = await prm.text('License:', {\n initial: currentConfig.license || ''\n });\n \n const homepage = await prm.text('Homepage:', {\n initial: currentConfig.homepage || '',\n validate: (value: string) => {\n if (!value || value.trim().length === 0) return true;\n try {\n new URL(value);\n return true;\n } catch {\n return 'Must be a valid URL';\n }\n }\n });\n \n const isPrivate = await prm.confirm('Private package?', currentConfig.private || false);\n \n // Build updates object only for changed fields\n const updates: PackageManifestUpdates = {};\n \n // Normalize name for comparison\n const normalizedName = normalizePackageName(name);\n if (normalizedName !== currentConfig.name) {\n updates.name = normalizedName;\n }\n \n if (version && version !== currentConfig.version) {\n updates.version = version;\n }\n \n if (description !== (currentConfig.description || '')) {\n updates.description = description || undefined;\n }\n \n // Parse and compare keywords\n const newKeywords = keywords\n ? keywords.trim().split(/\\s+/).filter((k: string) => k.length > 0)\n : [];\n const currentKeywords = currentConfig.keywords || [];\n if (JSON.stringify(newKeywords) !== JSON.stringify(currentKeywords)) {\n updates.keywords = newKeywords.length > 0 ? newKeywords : undefined;\n }\n \n if (author !== (currentConfig.author || '')) {\n updates.author = author || undefined;\n }\n \n if (license !== (currentConfig.license || '')) {\n updates.license = license || undefined;\n }\n \n if (homepage !== (currentConfig.homepage || '')) {\n updates.homepage = homepage || undefined;\n }\n \n if (isPrivate !== (currentConfig.private || false)) {\n updates.private = isPrivate;\n }\n \n return updates;\n}\n\n/**\n * Detect changes between current config and updates\n */\nfunction detectChanges(\n currentConfig: PackageYml,\n updates: PackageManifestUpdates\n): ConfigChange[] {\n const changes: ConfigChange[] = [];\n \n for (const [field, newValue] of Object.entries(updates)) {\n const oldValue = currentConfig[field as keyof PackageYml];\n \n // Deep comparison for arrays\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {\n changes.push({ field, oldValue, newValue });\n }\n } else if (oldValue !== newValue) {\n changes.push({ field, oldValue, newValue });\n }\n }\n \n return changes;\n}\n\n/**\n * Apply updates to manifest configuration\n */\nfunction applyUpdates(\n currentConfig: PackageYml,\n updates: PackageManifestUpdates\n): PackageYml {\n return {\n ...currentConfig,\n ...updates\n };\n}\n\n/**\n * Run the set pipeline\n */\nexport async function runSetPipeline(\n packageInput: string | undefined,\n options: SetCommandOptions = {},\n prompt?: PromptPort\n): Promise<CommandResult<SetPipelineResult>> {\n const cwd = process.cwd();\n const prm = prompt ?? resolvePrompt();\n \n try {\n // Step 1: Validate inputs\n const hasFieldFlags = Boolean(\n options.ver || \n options.name || \n options.description !== undefined ||\n options.keywords !== undefined || \n options.author !== undefined || \n options.license !== undefined || \n options.homepage !== undefined || \n options.private !== undefined\n );\n \n const isInteractive = !options.nonInteractive && !hasFieldFlags;\n \n if (options.nonInteractive && !hasFieldFlags) {\n throw new ValidationError(\n 'Non-interactive mode requires at least one field flag.\\n' +\n 'Available flags: --ver, --name, --description, --keywords, --author, --license, --homepage, --private\\n' +\n 'Example: opkg set my-package --ver 1.0.0 --non-interactive'\n );\n }\n \n logger.debug('Starting set pipeline', { packageInput, options, isInteractive });\n \n // Step 2: Resolve package source\n const resolved = await resolvePackageForSet(cwd, packageInput);\n \n logger.info('Package resolved for set', {\n packageName: resolved.packageName,\n packagePath: resolved.packagePath,\n sourceType: resolved.sourceType\n });\n \n // Step 3: Load current manifest\n const manifestPath = path.join(resolved.packagePath, FILE_PATTERNS.OPENPACKAGE_YML);\n const currentConfig = await parsePackageYml(manifestPath);\n \n // Step 4: Determine updates\n let updates: PackageManifestUpdates;\n \n if (isInteractive) {\n updates = await promptPackageUpdates(currentConfig, prm);\n } else {\n updates = extractUpdatesFromOptions(options);\n }\n \n // Step 5: Detect changes\n const changes = detectChanges(currentConfig, updates);\n \n if (changes.length === 0) {\n displayNoChanges(resolved.packageName);\n return {\n success: true,\n data: {\n packageName: resolved.packageName,\n packagePath: resolved.packagePath,\n sourceType: resolved.sourceType,\n updatedFields: [],\n manifestPath\n }\n };\n }\n \n // Step 6: Validate updates\n validateUpdates(updates);\n \n // Step 7: Show changes and confirm (unless force mode)\n displayConfigChanges(changes);\n \n if (!options.force && isInteractive) {\n const confirmed = await prm.confirm('Apply these changes?', true);\n if (!confirmed) {\n throw new UserCancellationError();\n }\n }\n \n // Step 8: Apply updates\n const updatedConfig = applyUpdates(currentConfig, updates);\n \n // Step 9: Write manifest\n await writePackageYml(manifestPath, updatedConfig);\n \n logger.info('Manifest updated successfully', {\n packageName: resolved.packageName,\n updatedFields: changes.map(c => c.field)\n });\n \n // Step 10: Display success\n const result: SetPipelineResult = {\n packageName: resolved.packageName,\n packagePath: resolved.packagePath,\n sourceType: resolved.sourceType,\n updatedFields: changes.map(c => c.field),\n manifestPath\n };\n \n displaySetSuccess(result, cwd);\n \n return {\n success: true,\n data: result\n };\n \n } catch (error) {\n if (error instanceof UserCancellationError) {\n throw error;\n }\n \n const message = error instanceof Error ? error.message : String(error);\n logger.error('Set pipeline failed', { error: message });\n \n return {\n success: false,\n error: message\n };\n }\n}\n", "/**\n * @fileoverview Output formatting and display for the set command\n */\n\nimport { formatPathForDisplay } from '../../utils/formatters.js';\nimport type { PackageYml } from '../../types/index.js';\nimport type { ConfigChange, SetPipelineResult } from './set-types.js';\nimport type { OutputPort } from '../ports/output.js';\nimport { resolveOutput } from '../ports/resolve.js';\n\n/**\n * Display changes that will be applied to the manifest\n */\nexport function displayConfigChanges(changes: ConfigChange[], output?: OutputPort): void {\n const out = output ?? resolveOutput();\n\n if (changes.length === 0) {\n out.info('\\nNo changes detected.');\n return;\n }\n\n out.info('\\n\uD83D\uDCDD Changes to apply:');\n \n for (const change of changes) {\n const oldDisplay = formatValue(change.oldValue);\n const newDisplay = formatValue(change.newValue);\n out.info(` ${change.field}: ${oldDisplay} \u2192 ${newDisplay}`);\n }\n}\n\n/**\n * Format a value for display in change output\n */\nfunction formatValue(value: any): string {\n if (value === undefined || value === null) {\n return '(not set)';\n }\n \n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '[]';\n }\n return `[${value.join(', ')}]`;\n }\n \n if (typeof value === 'boolean') {\n return value.toString();\n }\n \n if (typeof value === 'string') {\n return value;\n }\n \n return JSON.stringify(value);\n}\n\n/**\n * Display success message after updating manifest\n */\nexport function displaySetSuccess(\n result: SetPipelineResult,\n cwd: string,\n output?: OutputPort\n): void {\n const out = output ?? resolveOutput();\n const displayPath = formatPathForDisplay(result.packagePath, cwd);\n \n out.success(`Updated ${result.packageName} manifest`);\n out.info(` Path: ${displayPath}`);\n out.info(` Type: ${result.sourceType} package`);\n \n if (result.updatedFields.length > 0) {\n const fieldList = result.updatedFields.join(', ');\n out.info(` Updated: ${fieldList}`);\n }\n}\n\n/**\n * Display current package configuration for interactive mode\n */\nexport function displayCurrentConfig(config: PackageYml, packagePath: string, output?: OutputPort): void {\n const out = output ?? resolveOutput();\n\n out.info(`\\nCurrent package: ${config.name}`);\n \n if (config.version) {\n out.info(`Version: ${config.version}`);\n }\n \n out.info(`Path: ${packagePath}`);\n out.info('\\nLeave blank to keep current value, or enter new value:\\n');\n}\n\n/**\n * Display no-changes message\n */\nexport function displayNoChanges(packageName: string, output?: OutputPort): void {\n const out = output ?? resolveOutput();\n\n out.success(`No changes made to ${packageName}`);\n out.info(' Manifest unchanged');\n}\n", "/**\n * @fileoverview Command setup for 'opkg set'\n * \n * Updates manifest fields in openpackage.yml for mutable packages.\n */\n\nimport { runSetPipeline } from '@opkg/core/core/set/set-pipeline.js';\nimport type { SetCommandOptions } from '@opkg/core/core/set/set-types.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { resolvePrompt } from '@opkg/core/core/ports/resolve.js';\n\n/**\n * Setup the 'opkg set' command\n */\nexport async function setupSetCommand(args: any[]): Promise<void> {\n const [packageInput, options] = args as [string | undefined, SetCommandOptions];\n const ctx = await createCliExecutionContext({ outputMode: 'rich' });\n const prompt = resolvePrompt(ctx);\n const result = await runSetPipeline(packageInput, options, prompt);\n if (!result.success) {\n throw new Error(result.error || 'Set operation failed');\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }