forgeos 0.1.0-alpha.36 → 0.1.0-alpha.37

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/AGENTS.md CHANGED
@@ -1,4 +1,4 @@
1
- // @forge-generated generator=0.1.0-alpha.36 input=fed0c5202e23edeb9d4d7f31d0de594194b8a898741da3c1a74b8c2d54758aa5 content=721818a6f9a664aa898092d4aa5cd68cbbd8ad6e150c7d3ad3ef785a2e3fcf53
1
+ // @forge-generated generator=0.1.0-alpha.37 input=055c7d65fca3d6d8b05af2899c233ff69d377edf0f46f719e2d164ee0574309a content=721818a6f9a664aa898092d4aa5cd68cbbd8ad6e150c7d3ad3ef785a2e3fcf53
2
2
  # AGENTS.md
3
3
 
4
4
  <!-- forge-generated:start -->
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # forgeos
2
2
 
3
+ ## 0.1.0-alpha.37
4
+
5
+ ### Patch Changes
6
+
7
+ - Fix `forge deps upgrade-plan` for npm alias installs used by ForgeOS apps.
8
+
9
+ - Record the real package name from package metadata in the generated package graph when a dependency is installed through an alias such as `forge: npm:forgeos@...`.
10
+ - Resolve upgrade plans by either the real package name (`forgeos`) or the dependency alias (`forge`) while preserving install specs like `forge@npm:forgeos@0.1.0-alpha.37`.
11
+ - Avoid attempting to resolve the unrelated public `forge@alpha` package when an app asks to upgrade its ForgeOS alias dependency.
12
+ - Add regression coverage for aliased package graph entries where the import name and real npm package name differ.
13
+
3
14
  ## 0.1.0-alpha.36
4
15
 
5
16
  ### Patch Changes
package/docs/changelog.md CHANGED
@@ -6,6 +6,20 @@ The canonical source file in the repository is `CHANGELOG.md`.
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.1.0-alpha.37
10
+
11
+ - Fixed `forge deps upgrade-plan` for npm alias installs used by ForgeOS apps.
12
+ - Recorded the real package name from package metadata in generated package
13
+ graph entries when a dependency is installed through an alias such as
14
+ `forge: npm:forgeos@...`.
15
+ - Resolved upgrade plans by either the real package name (`forgeos`) or the
16
+ dependency alias (`forge`) while preserving install specs like
17
+ `forge@npm:forgeos@0.1.0-alpha.37`.
18
+ - Avoided attempting to resolve the unrelated public `forge@alpha` package when
19
+ an app asks to upgrade its ForgeOS alias dependency.
20
+ - Added regression coverage for aliased package graph entries where the import
21
+ name and real npm package name differ.
22
+
9
23
  ## 0.1.0-alpha.36
10
24
 
11
25
  - Smoothed the alpha field-test loop after the Vendor Access app exercise.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forgeos",
3
- "version": "0.1.0-alpha.36",
3
+ "version": "0.1.0-alpha.37",
4
4
  "description": "Agent-native application framework and compiler for building Forge apps without a mandatory dashboard.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1 +1 @@
1
- {"defaultProvider":"local","diagnostics":[],"env":{"deployEnv":"FORGE_DEPLOY_ENV","deployId":"FORGE_DEPLOY_ID","publicReleaseId":"NEXT_PUBLIC_FORGE_RELEASE_ID","releaseId":"FORGE_RELEASE_ID"},"gitSha":"unknown","optionalProviders":["local","sentry-compatible","sentry","glitchtip","bugsink","otel","custom"],"packageName":"forgeos","packageVersion":"0.1.0-alpha.36","releaseId":"forgeos@0.1.0-alpha.36+unknown","schemaVersion":"0.1.0"}
1
+ {"defaultProvider":"local","diagnostics":[],"env":{"deployEnv":"FORGE_DEPLOY_ENV","deployId":"FORGE_DEPLOY_ID","publicReleaseId":"NEXT_PUBLIC_FORGE_RELEASE_ID","releaseId":"FORGE_RELEASE_ID"},"gitSha":"unknown","optionalProviders":["local","sentry-compatible","sentry","glitchtip","bugsink","otel","custom"],"packageName":"forgeos","packageVersion":"0.1.0-alpha.37","releaseId":"forgeos@0.1.0-alpha.37+unknown","schemaVersion":"0.1.0"}
@@ -1,4 +1,4 @@
1
- // @forge-generated generator=0.1.0-alpha.36 input=fed0c5202e23edeb9d4d7f31d0de594194b8a898741da3c1a74b8c2d54758aa5 content=55e1e8090cce3a057473a21fe3382f8f159581327fa98ecee1a489f8de6965d0
1
+ // @forge-generated generator=0.1.0-alpha.37 input=055c7d65fca3d6d8b05af2899c233ff69d377edf0f46f719e2d164ee0574309a content=1e26c5249853569091c1b295aab06bd2b9546462328fe8126eda099222430b61
2
2
  export const releaseManifest = {
3
3
  "defaultProvider": "local",
4
4
  "diagnostics": [],
@@ -19,7 +19,7 @@ export const releaseManifest = {
19
19
  "custom"
20
20
  ],
21
21
  "packageName": "forgeos",
22
- "packageVersion": "0.1.0-alpha.36",
23
- "releaseId": "forgeos@0.1.0-alpha.36+unknown",
22
+ "packageVersion": "0.1.0-alpha.37",
23
+ "releaseId": "forgeos@0.1.0-alpha.37+unknown",
24
24
  "schemaVersion": "0.1.0"
25
25
  } as const;
@@ -93,7 +93,9 @@ function findPackage(workspaceRoot: string, packageName: string): {
93
93
  const lock = nodeFileSystem.exists(join(workspaceRoot, "forge.lock"))
94
94
  ? (JSON.parse((nodeFileSystem.readText(join(workspaceRoot, "forge.lock")) ?? "")) as ForgeLock)
95
95
  : null;
96
- const pkg = graph?.packages.find((candidate) => candidate.name === packageName);
96
+ const pkg = graph?.packages.find((candidate) =>
97
+ candidate.name === packageName || candidate.packageName === packageName
98
+ );
97
99
  return { graph, pkg, lock };
98
100
  }
99
101
 
@@ -271,6 +271,7 @@ export class PackageGraphCompiler {
271
271
 
272
272
  const partialApi = {
273
273
  name: dep.name,
274
+ ...(packageJson.name && packageJson.name !== dep.name ? { packageName: packageJson.name } : {}),
274
275
  version: dep.version,
275
276
  packageManager: dep.packageManager,
276
277
  resolutionMode: opts.resolutionMode,
@@ -454,10 +455,11 @@ function portableDtsPath(dtsPath: string, dep: Pick<Dependency, "installPath" |
454
455
  }
455
456
 
456
457
  function readPackageJson(installPath: string): {
458
+ name?: string;
457
459
  exports?: unknown;
458
460
  } {
459
461
  const raw = readTextFile(join(installPath, "package.json"));
460
- return JSON.parse(raw) as { exports?: unknown };
462
+ return JSON.parse(raw) as { name?: string; exports?: unknown };
461
463
  }
462
464
 
463
465
  function resolveSandboxBackend(
@@ -1,4 +1,4 @@
1
1
  export const PACKAGE_GRAPH_SCHEMA_VERSION = "1.0.0";
2
- export const PACKAGE_ANALYZER_VERSION = "0.2.0";
2
+ export const PACKAGE_ANALYZER_VERSION = "0.2.1";
3
3
  export { GENERATOR_VERSION } from "../../version.ts";
4
4
  export const DEFAULT_PATTERN_EXPANSION_LIMIT = 50;
@@ -119,6 +119,10 @@ interface PackageResolution {
119
119
  current: PackageApi;
120
120
  }
121
121
 
122
+ function matchesPackageName(candidate: PackageApi, packageName: string): boolean {
123
+ return candidate.name === packageName || candidate.packageName === packageName;
124
+ }
125
+
122
126
  function parseNpmAliasSpec(spec: string): NpmAliasSpec | null {
123
127
  if (!spec.startsWith("npm:")) {
124
128
  return null;
@@ -162,6 +166,12 @@ function dependencyType(workspaceRoot: string, packageName: string): DependencyT
162
166
  if (packageName in (pkg.devDependencies ?? {})) {
163
167
  return "devDependency";
164
168
  }
169
+ for (const entry of dependencyEntries(pkg)) {
170
+ const alias = parseNpmAliasSpec(entry.spec);
171
+ if (alias?.packageName === packageName) {
172
+ return entry.type;
173
+ }
174
+ }
165
175
  return "dependency";
166
176
  }
167
177
 
@@ -180,7 +190,8 @@ function resolvePackageForUpgrade(workspaceRoot: string, requestedName: string):
180
190
  if (aliasEntry) {
181
191
  const alias = parseNpmAliasSpec(aliasEntry.spec);
182
192
  const packageName = alias?.packageName ?? aliasEntry.name;
183
- const current = graph.packages.find((candidate) => candidate.name === packageName);
193
+ const current = graph.packages.find((candidate) => matchesPackageName(candidate, packageName)) ??
194
+ graph.packages.find((candidate) => candidate.name === aliasEntry.name);
184
195
  if (current) {
185
196
  return {
186
197
  requestedName,
@@ -194,18 +205,23 @@ function resolvePackageForUpgrade(workspaceRoot: string, requestedName: string):
194
205
  }
195
206
  }
196
207
 
197
- const current = graph.packages.find((candidate) => candidate.name === requestedName);
208
+ const current = graph.packages.find((candidate) => matchesPackageName(candidate, requestedName));
198
209
  if (!current) {
199
210
  return null;
200
211
  }
201
- const directEntry = entries.find((entry) => entry.name === requestedName);
212
+ const directEntry = entries.find((entry) => {
213
+ const alias = parseNpmAliasSpec(entry.spec);
214
+ return entry.name === requestedName || alias?.packageName === requestedName;
215
+ });
216
+ const alias = directEntry ? parseNpmAliasSpec(directEntry.spec) : null;
217
+ const packageName = alias?.packageName ?? current.packageName ?? requestedName;
202
218
  return {
203
219
  requestedName,
204
- packageName: requestedName,
205
- dependencyName: requestedName,
220
+ packageName,
221
+ dependencyName: directEntry?.name ?? requestedName,
206
222
  dependencySpec: directEntry?.spec,
207
223
  dependencyType: directEntry?.type ?? dependencyType(workspaceRoot, requestedName),
208
- isNpmAlias: false,
224
+ isNpmAlias: Boolean(alias),
209
225
  current,
210
226
  };
211
227
  }
@@ -632,18 +648,19 @@ export function listOutdatedFromFixture(options: {
632
648
 
633
649
  return graph.packages
634
650
  .flatMap((pkg) => {
635
- const metadata = fixtureMetadata(registryDir, pkg.name);
651
+ const packageName = pkg.packageName ?? pkg.name;
652
+ const metadata = fixtureMetadata(registryDir, packageName);
636
653
  const latest = metadata?.["dist-tags"]?.latest;
637
654
  if (!latest || latest === pkg.version) {
638
655
  return [];
639
656
  }
640
- const recipe = resolveByPackageName(pkg.name);
657
+ const recipe = resolveByPackageName(packageName);
641
658
  return [{
642
- name: pkg.name,
659
+ name: packageName,
643
660
  current: pkg.version,
644
661
  wanted: latest,
645
662
  latest,
646
- type: dependencyType(options.workspaceRoot, pkg.name),
663
+ type: dependencyType(options.workspaceRoot, packageName),
647
664
  managedByRecipe: Boolean(recipe),
648
665
  ...(recipe?.alias ? { recipe: recipe.alias } : {}),
649
666
  }];
@@ -92,7 +92,13 @@ export interface Entrypoint {
92
92
  }
93
93
 
94
94
  export interface PackageApi {
95
+ /**
96
+ * Import/dependency name used by the app, which may be an npm alias such as
97
+ * "forge" for "npm:forgeos@...".
98
+ */
95
99
  name: string;
100
+ /** Real package.json name when it differs from the dependency/import name. */
101
+ packageName?: string;
96
102
  version: string;
97
103
  packageManager: PackageManager;
98
104
  resolutionMode: ResolutionMode;
@@ -1,3 +1,3 @@
1
- export const FORGEOS_VERSION = "0.1.0-alpha.36";
1
+ export const FORGEOS_VERSION = "0.1.0-alpha.37";
2
2
  export const GENERATOR_VERSION = FORGEOS_VERSION;
3
3
  export const CLI_VERSION = FORGEOS_VERSION;