portweave 0.1.0 → 0.2.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 CHANGED
@@ -167,21 +167,30 @@ Portweave looks for `portweave.config.json`, starting in the working directory a
167
167
 
168
168
  Field reference:
169
169
 
170
- | Field | Required | Rules |
171
- | ------------------------------ | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
172
- | `$schema` | optional | A schema URL string. Ignored at runtime; useful for editor autocompletion. |
173
- | `services` | **required** | An object with at least one entry. Each key is a service name in kebab-case (`^[a-z][a-z0-9-]*$`). |
174
- | `services.<name>.envVar` | **required** | The environment-variable name the allocated port is exposed as. Must match `^[A-Z][A-Z0-9_]*$`. Must be unique across all services. |
175
- | `services.<name>.group` | optional | A group label. Services sharing a group are allocated as a contiguous block, so they move together (handy when a tool expects two adjacent ports). |
176
- | `services.<name>.discoveryEnv` | optional | A map of additional environment variables to derived values. Each value is a template; `${serviceName}` is replaced with that service's allocated port. Keys must be valid env-var names and unique across the whole config. A `${name}` that does not match a declared service is a configuration error. |
170
+ | Field | Required | Rules |
171
+ | ------------------------------ | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
172
+ | `$schema` | optional | A schema URL string. Ignored at runtime; useful for editor autocompletion. |
173
+ | `services` | **required** | An object with at least one entry. Each key is a service name in kebab-case (`^[a-z][a-z0-9-]*$`). |
174
+ | `services.<name>.envVar` | **required** | The environment-variable name the allocated port is exposed as. Must match `^[A-Z][A-Z0-9_]*$`. Must be unique across all services. |
175
+ | `services.<name>.group` | optional | A group label. Services sharing a group are allocated as a contiguous block, so they move together (handy when a tool expects two adjacent ports). |
176
+ | `services.<name>.discoveryEnv` | optional | A map of additional environment variables to derived values. Each value is a template; `${serviceName}` is replaced with that service's allocated port, and `${pw:<field>}` with worktree metadata (see below). Keys must be valid env-var names, unique across the whole config, and must not start with the reserved `PORTWEAVE_` prefix. A `${name}` that matches neither a declared service nor a known metadata field is a configuration error. |
177
177
 
178
178
  A copyable starting point lives at [`examples/web-app.config.json`](examples/web-app.config.json).
179
179
 
180
180
  Notes that affect how you write templates:
181
181
 
182
182
  - `${serviceName}` always resolves to the **allocated** port for that service, even if you override the service's own `envVar` through a project `.env` file. Derived URLs stay internally consistent.
183
+ - `${pw:<field>}` resolves Portweave metadata for the current worktree. Available fields: `namespace` (`main` or `<slug>-<hash>`), `worktreeRoot` (absolute path), and `gitCommonDir` (the shared `.git` directory, or empty string outside a git repo). Compose them freely, e.g. `"OTEL_SERVICE_NAME": "gw-${pw:namespace}"`.
183
184
  - The configuration file is strict: unknown top-level keys and unknown service fields are rejected with a `PW0102` error that names the offending path.
184
185
 
186
+ ### Injected metadata: `PORTWEAVE_NAMESPACE`
187
+
188
+ Every `portweave run` injects `PORTWEAVE_NAMESPACE` into the child process (and writes it to `.portweave/current.env`) with no configuration required. Its value is the worktree namespace Portweave allocated under — `main` for the primary worktree, `<slug>-<hash>` for others.
189
+
190
+ This is the primitive for keeping worktrees from colliding in shared, single-instance daemons. The canonical case is PM2: name each app `<service>-${process.env.PORTWEAVE_NAMESPACE}` (e.g. in `ecosystem.config.cjs`) so two worktrees running the same stack register distinct process names in the one PM2 daemon. Portweave allocates the ports and hands you the namespace; it never manages processes itself.
191
+
192
+ `PORTWEAVE_NAMESPACE` is authoritative: it always reports the namespace Portweave used, so a value set in your project `.env` or parent environment does not change what the child observes (an explicit value is still honored as an _override of which namespace gets derived_ — set it before invoking `portweave run`).
193
+
185
194
  ## CLI reference
186
195
 
187
196
  ```text
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAaxC,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAA;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;CACjB;AAsJD,wBAAsB,UAAU,CAC9B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,OAAO,EAAE,UAAU,EACnB,EAAE,GAAE,KAAoB,GACvB,OAAO,CAAC,MAAM,CAAC,CAgDjB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoBzD"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcxC,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAA;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;CACjB;AAsJD,wBAAsB,UAAU,CAC9B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,OAAO,EAAE,UAAU,EACnB,EAAE,GAAE,KAAoB,GACvB,OAAO,CAAC,MAAM,CAAC,CAgDjB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoBzD"}
package/dist/cli/run.js CHANGED
@@ -2,6 +2,7 @@ import { allocate } from "../allocator/allocate.js";
2
2
  import { synthesizeAnonymousConfig } from "../config/anonymous.js";
3
3
  import { loadConfig } from "../config/loader.js";
4
4
  import { resolveEnv } from "../env/index.js";
5
+ import { PORTWEAVE_NAMESPACE_VAR } from "../env/metadata.js";
5
6
  import { PortweaveError, PW_ERROR_CODES } from "../errors.js";
6
7
  import { resolveRegistryPath } from "../registry/paths.js";
7
8
  import { err } from "../result.js";
@@ -59,12 +60,11 @@ async function resolveConfig(cwd, options, io) {
59
60
  return result.value;
60
61
  }
61
62
  function buildVerboseLines(config, key, env) {
62
- const registryPaths = resolveRegistryPath(env);
63
63
  const configLabel = config.sourcePath ??
64
64
  (config.source === 'anonymous' ? '<anonymous-mode>' : '<unknown>');
65
65
  return [
66
66
  `[portweave] config: ${configLabel}`,
67
- `[portweave] registry: ${registryPaths.registryFile}`,
67
+ `[portweave] registry: ${resolveRegistryPath(env).registryFile}`,
68
68
  `[portweave] key: ${JSON.stringify({ gitCommonDir: key.gitCommonDir, namespace: key.namespace, worktreeRoot: key.worktreeRoot })}`,
69
69
  ];
70
70
  }
@@ -82,8 +82,9 @@ async function spawnWithBanner(ctx) {
82
82
  verboseLines,
83
83
  wroteEnvFile: true,
84
84
  }) + '\n');
85
- // Parent env spread last → io.env wins on conflict (DESIGN.md §7.2 row 9: process > .env > computed). Spec step-7 example is inverted.
85
+ // io.env wins (DESIGN.md §7.2 row 9), except PORTWEAVE_NAMESPACE re-asserted below.
86
86
  const mergedEnv = { ...resolvedEnv.env, ...io.env };
87
+ mergedEnv[PORTWEAVE_NAMESPACE_VAR] = resolvedEnv.env[PORTWEAVE_NAMESPACE_VAR];
87
88
  const spawnResult = await spawnChild(childArgs, { env: mergedEnv, io });
88
89
  if (!spawnResult.ok) {
89
90
  writeError({
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAkB,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,cAAc,CAAA;AA0CnD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,MAAM,EAAE,WAAW,GAAG,MAAM,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAiHD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,oBAAoB,GACxB,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAoBhC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAkB,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,cAAc,CAAA;AA6CnD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,MAAM,EAAE,WAAW,GAAG,MAAM,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AA4ID,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,oBAAoB,GACxB,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAoBhC"}
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { PW_METADATA_FIELDS, PW_METADATA_PREFIX } from "../env/metadata.js";
2
3
  import { PortweaveError, PW_ERROR_CODES } from "../errors.js";
3
4
  import { err, ok } from "../result.js";
4
5
  const SERVICE_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
@@ -6,6 +7,9 @@ const ENV_VAR_PATTERN = /^[A-Z][A-Z0-9_]*$/;
6
7
  const PLACEHOLDER_PATTERN = /\$\{([^}]+)\}/g;
7
8
  const PORT_MIN = 1;
8
9
  const PORT_MAX = 65535;
10
+ // Reserved for Portweave's own injected output vars (e.g. PORTWEAVE_NAMESPACE);
11
+ // a user envVar/discoveryEnv key here would collide with what `run` injects.
12
+ const RESERVED_ENV_PREFIX = 'PORTWEAVE_';
9
13
  const envVarSchema = z
10
14
  .string()
11
15
  .regex(ENV_VAR_PATTERN, 'envVar must match /^[A-Z][A-Z0-9_]*$/');
@@ -58,6 +62,9 @@ function checkCrossFieldRules(raw) {
58
62
  }
59
63
  function recordEnvVar(name, entry, ctx) {
60
64
  const owner = `services.${name}.envVar`;
65
+ if (entry.envVar.startsWith(RESERVED_ENV_PREFIX)) {
66
+ ctx.errors.push(`${owner}: env var "${entry.envVar}" uses the reserved "${RESERVED_ENV_PREFIX}" prefix`);
67
+ }
61
68
  const prior = ctx.seen.get(entry.envVar);
62
69
  if (prior !== undefined) {
63
70
  ctx.errors.push(`${owner}: duplicate identifier "${entry.envVar}" already declared at ${prior}`);
@@ -71,6 +78,9 @@ function checkDiscoveryEnv(name, entry, ctx) {
71
78
  }
72
79
  for (const [envKey, template] of Object.entries(entry.discoveryEnv)) {
73
80
  const owner = `services.${name}.discoveryEnv.${envKey}`;
81
+ if (envKey.startsWith(RESERVED_ENV_PREFIX)) {
82
+ ctx.errors.push(`${owner}: env var "${envKey}" uses the reserved "${RESERVED_ENV_PREFIX}" prefix`);
83
+ }
74
84
  const prior = ctx.seen.get(envKey);
75
85
  if (prior !== undefined) {
76
86
  ctx.errors.push(`${owner}: duplicate identifier "${envKey}" already declared at ${prior}`);
@@ -79,12 +89,22 @@ function checkDiscoveryEnv(name, entry, ctx) {
79
89
  ctx.seen.set(envKey, owner);
80
90
  }
81
91
  for (const placeholder of collectPlaceholders(template)) {
82
- if (!ctx.serviceNames.has(placeholder)) {
83
- ctx.errors.push(`${owner}: template references unknown service "${placeholder}"`);
84
- }
92
+ checkPlaceholder(placeholder, owner, ctx);
85
93
  }
86
94
  }
87
95
  }
96
+ function checkPlaceholder(placeholder, owner, ctx) {
97
+ if (placeholder.startsWith(PW_METADATA_PREFIX)) {
98
+ const field = placeholder.slice(PW_METADATA_PREFIX.length);
99
+ if (!PW_METADATA_FIELDS.includes(field)) {
100
+ ctx.errors.push(`${owner}: template references unknown metadata field "${field}"`);
101
+ }
102
+ return;
103
+ }
104
+ if (!ctx.serviceNames.has(placeholder)) {
105
+ ctx.errors.push(`${owner}: template references unknown service "${placeholder}"`);
106
+ }
107
+ }
88
108
  // SERVICE_NAME_PATTERN (^[a-z][a-z0-9-]*$) is load-bearing for stable service
89
109
  // ordering: V8 reorders purely-numeric keys ahead of other keys, so requiring
90
110
  // names to start with [a-z] ensures JSON.parse insertion-order is preserved.
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/env/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAG1D,wBAAgB,WAAW,CACzB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBxB"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/env/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAI1D,wBAAgB,WAAW,CACzB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4BxB"}
package/dist/env/build.js CHANGED
@@ -1,7 +1,11 @@
1
1
  import { PortweaveError, PW_ERROR_CODES } from "../errors.js";
2
+ import { buildMetadata, PORTWEAVE_NAMESPACE_VAR } from "./metadata.js";
2
3
  import { evaluateTemplate } from "./templates.js";
3
4
  export function buildEnvMap(allocation, config) {
4
- const result = {};
5
+ const metadata = buildMetadata(allocation);
6
+ const result = {
7
+ [PORTWEAVE_NAMESPACE_VAR]: metadata.namespace,
8
+ };
5
9
  for (const service of config.services) {
6
10
  if (!Object.hasOwn(allocation.ports, service.name)) {
7
11
  throw new PortweaveError(PW_ERROR_CODES.ENV_BUILD_INVALID, `service "${service.name}" has no port in the allocation — config/allocation drift detected`);
@@ -9,7 +13,7 @@ export function buildEnvMap(allocation, config) {
9
13
  const port = allocation.ports[service.name];
10
14
  result[service.envVar] = String(port);
11
15
  for (const [discoveryKey, template] of Object.entries(service.discoveryEnv)) {
12
- result[discoveryKey] = evaluateTemplate(template, allocation.ports);
16
+ result[discoveryKey] = evaluateTemplate(template, allocation.ports, metadata);
13
17
  }
14
18
  }
15
19
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/env/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD,MAAM,UAAU,WAAW,CACzB,UAAsB,EACtB,MAAc;IAEd,MAAM,MAAM,GAA2B,EAAE,CAAA;IAEzC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,cAAc,CACtB,cAAc,CAAC,iBAAiB,EAChC,YAAY,OAAO,CAAC,IAAI,oEAAoE,CAC7F,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAErC,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CACnD,OAAO,CAAC,YAAY,CACrB,EAAE,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,GAAG,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;QACrE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/env/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7D,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD,MAAM,UAAU,WAAW,CACzB,UAAsB,EACtB,MAAc;IAEd,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;IAC1C,MAAM,MAAM,GAA2B;QACrC,CAAC,uBAAuB,CAAC,EAAE,QAAQ,CAAC,SAAS;KAC9C,CAAA;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,cAAc,CACtB,cAAc,CAAC,iBAAiB,EAChC,YAAY,OAAO,CAAC,IAAI,oEAAoE,CAC7F,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAErC,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CACnD,OAAO,CAAC,YAAY,CACrB,EAAE,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,GAAG,gBAAgB,CACrC,QAAQ,EACR,UAAU,CAAC,KAAK,EAChB,QAAQ,CACT,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { buildEnvMap } from './build.ts';
2
+ export { buildMetadata, PORTWEAVE_NAMESPACE_VAR, PW_METADATA_FIELDS, PW_METADATA_PREFIX, type PwMetadataField, } from './metadata.ts';
2
3
  export { type ResolvedEnv, resolveEnv } from './resolve.ts';
3
4
  export { evaluateTemplate } from './templates.ts';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/env/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,KAAK,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/env/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,KAAK,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/env/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { buildEnvMap } from "./build.js";
2
+ export { buildMetadata, PORTWEAVE_NAMESPACE_VAR, PW_METADATA_FIELDS, PW_METADATA_PREFIX, } from "./metadata.js";
2
3
  export { resolveEnv } from "./resolve.js";
3
4
  export { evaluateTemplate } from "./templates.js";
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/env/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAoB,UAAU,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/env/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAoB,UAAU,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { Allocation } from '../allocator/allocate.ts';
2
+ export declare const PORTWEAVE_NAMESPACE_VAR = "PORTWEAVE_NAMESPACE";
3
+ export declare const PW_METADATA_PREFIX = "pw:";
4
+ export type PwMetadataField = 'gitCommonDir' | 'namespace' | 'worktreeRoot';
5
+ export declare const PW_METADATA_FIELDS: readonly ["gitCommonDir", "namespace", "worktreeRoot"];
6
+ export declare function buildMetadata(allocation: Allocation): Record<PwMetadataField, string>;
7
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/env/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAK1D,eAAO,MAAM,uBAAuB,wBAAwB,CAAA;AAK5D,eAAO,MAAM,kBAAkB,QAAQ,CAAA;AAIvC,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,WAAW,GAAG,cAAc,CAAA;AAE3E,eAAO,MAAM,kBAAkB,wDAIgB,CAAA;AAE/C,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,GACrB,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAOjC"}
@@ -0,0 +1,22 @@
1
+ // Reserved output env var: the namespace Portweave used to allocate. Always
2
+ // injected by `buildEnvMap` and re-asserted authoritatively (see resolve.ts /
3
+ // run.ts) so both consumption modes report the same value.
4
+ export const PORTWEAVE_NAMESPACE_VAR = 'PORTWEAVE_NAMESPACE';
5
+ // Sigil prefix for portweave metadata placeholders inside discoveryEnv
6
+ // templates (e.g. `${pw:namespace}`). The colon cannot appear in a service
7
+ // name (kebab-case), so `pw:` can never collide with a `${serviceName}` ref.
8
+ export const PW_METADATA_PREFIX = 'pw:';
9
+ export const PW_METADATA_FIELDS = [
10
+ 'gitCommonDir',
11
+ 'namespace',
12
+ 'worktreeRoot',
13
+ ];
14
+ export function buildMetadata(allocation) {
15
+ return {
16
+ // null outside a git repo → empty string (documented, never throws)
17
+ gitCommonDir: allocation.key.gitCommonDir ?? '',
18
+ namespace: allocation.namespace,
19
+ worktreeRoot: allocation.key.worktreeRoot,
20
+ };
21
+ }
22
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/env/metadata.ts"],"names":[],"mappings":"AAEA,4EAA4E;AAC5E,8EAA8E;AAC9E,2DAA2D;AAC3D,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAA;AAE5D,uEAAuE;AACvE,2EAA2E;AAC3E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAA;AAMvC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,cAAc;IACd,WAAW;IACX,cAAc;CAC+B,CAAA;AAE/C,MAAM,UAAU,aAAa,CAC3B,UAAsB;IAEtB,OAAO;QACL,oEAAoE;QACpE,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE;QAC/C,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,YAAY;KAC1C,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/env/resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAEL,KAAK,cAAc,IAAI,kBAAkB,EAC1C,MAAM,cAAc,CAAA;AACrB,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,cAAc,CAAA;AAKnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAC/C;AAED,wBAAsB,UAAU,CAC9B,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAuBlD"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/env/resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAEL,KAAK,cAAc,IAAI,kBAAkB,EAC1C,MAAM,cAAc,CAAA;AACrB,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,cAAc,CAAA;AAMnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAC/C;AAED,wBAAsB,UAAU,CAC9B,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,CA4BlD"}
@@ -3,6 +3,7 @@ import { PortweaveError, } from "../errors.js";
3
3
  import { err, ok } from "../result.js";
4
4
  import { buildEnvMap } from "./build.js";
5
5
  import { applyDotenvOverrides, readDotenvFile } from "./dotenv-merge.js";
6
+ import { PORTWEAVE_NAMESPACE_VAR } from "./metadata.js";
6
7
  import { atomicWriteDotenv, ensurePortweaveDir } from "./writer.js";
7
8
  export async function resolveEnv(allocation, config, projectRoot) {
8
9
  let computed;
@@ -21,6 +22,11 @@ export async function resolveEnv(allocation, config, projectRoot) {
21
22
  return dotenvResult;
22
23
  }
23
24
  const final = applyDotenvOverrides(computed, dotenvResult.value);
25
+ // PORTWEAVE_NAMESPACE is an authoritative report of the namespace Portweave
26
+ // used to allocate — not a user-tunable default. Re-assert it past the .env
27
+ // override so a `.env` entry can't make the reported value diverge from the
28
+ // value the registry was keyed under. (run.ts does the same past process env.)
29
+ final[PORTWEAVE_NAMESPACE_VAR] = allocation.namespace;
24
30
  const { created } = await ensurePortweaveDir(projectRoot);
25
31
  const currentEnvPath = resolve(projectRoot, '.portweave/current.env');
26
32
  await atomicWriteDotenv(currentEnvPath, final);
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/env/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EACL,cAAc,GAEf,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAQnE,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAAsB,EACtB,MAAc,EACd,WAAmB;IAEnB,IAAI,QAAgC,CAAA;IACpC,IAAI,CAAC;QACH,QAAQ,GAAG,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAC5C,CAAC;IAAC,OAAO,MAAe,EAAE,CAAC;QACzB,IAAI,MAAM,YAAY,cAAc,EAAE,CAAC;YACrC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAA;QACpB,CAAC;QACD,MAAM,MAAM,CAAA;IACd,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAC/C,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAA;IACrD,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACrB,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IAChE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAA;IACzD,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAA;IACrE,MAAM,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IAE9C,OAAO,EAAE,CAAC,EAAE,mBAAmB,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;AACzE,CAAC"}
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/env/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EACL,cAAc,GAEf,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAQnE,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAAsB,EACtB,MAAc,EACd,WAAmB;IAEnB,IAAI,QAAgC,CAAA;IACpC,IAAI,CAAC;QACH,QAAQ,GAAG,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAC5C,CAAC;IAAC,OAAO,MAAe,EAAE,CAAC;QACzB,IAAI,MAAM,YAAY,cAAc,EAAE,CAAC;YACrC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAA;QACpB,CAAC;QACD,MAAM,MAAM,CAAA;IACd,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAC/C,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAA;IACrD,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACrB,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IAChE,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,+EAA+E;IAC/E,KAAK,CAAC,uBAAuB,CAAC,GAAG,UAAU,CAAC,SAAS,CAAA;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAA;IACzD,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAA;IACrE,MAAM,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IAE9C,OAAO,EAAE,CAAC,EAAE,mBAAmB,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;AACzE,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare function evaluateTemplate(template: string, ports: Readonly<Record<string, number>>): string;
1
+ export declare function evaluateTemplate(template: string, ports: Readonly<Record<string, number>>, metadata: Readonly<Record<string, string>>): string;
2
2
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/env/templates.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACtC,MAAM,CAUR"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/env/templates.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACvC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACzC,MAAM,CAoBR"}
@@ -1,7 +1,15 @@
1
1
  import { PortweaveError, PW_ERROR_CODES } from "../errors.js";
2
+ import { PW_METADATA_PREFIX } from "./metadata.js";
2
3
  const PLACEHOLDER_PATTERN = /\$\{([^}]+)\}/g;
3
- export function evaluateTemplate(template, ports) {
4
+ export function evaluateTemplate(template, ports, metadata) {
4
5
  return template.replaceAll(PLACEHOLDER_PATTERN, (_, name) => {
6
+ if (name.startsWith(PW_METADATA_PREFIX)) {
7
+ const field = name.slice(PW_METADATA_PREFIX.length);
8
+ if (!Object.hasOwn(metadata, field)) {
9
+ throw new PortweaveError(PW_ERROR_CODES.ENV_BUILD_INVALID, `discoveryEnv template references unknown metadata field "${field}"`);
10
+ }
11
+ return metadata[field];
12
+ }
5
13
  if (!Object.hasOwn(ports, name)) {
6
14
  throw new PortweaveError(PW_ERROR_CODES.ENV_BUILD_INVALID, `discoveryEnv template references unknown service "${name}"`);
7
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/env/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7D,MAAM,mBAAmB,GAAG,gBAAgB,CAAA;AAE5C,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,KAAuC;IAEvC,OAAO,QAAQ,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;QAClE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,cAAc,CACtB,cAAc,CAAC,iBAAiB,EAChC,qDAAqD,IAAI,GAAG,CAC7D,CAAA;QACH,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/env/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAElD,MAAM,mBAAmB,GAAG,gBAAgB,CAAA;AAE5C,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,KAAuC,EACvC,QAA0C;IAE1C,OAAO,QAAQ,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;QAClE,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;YACnD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,cAAc,CACtB,cAAc,CAAC,iBAAiB,EAChC,4DAA4D,KAAK,GAAG,CACrE,CAAA;YACH,CAAC;YACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,cAAc,CACtB,cAAc,CAAC,iBAAiB,EAChC,qDAAqD,IAAI,GAAG,CAC7D,CAAA;QACH,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { allocate, type Allocation, type AllocationResult, MAX_PROBE_RETRIES, or
2
2
  export { findFreeBlock, resolvePoolRange } from './allocator/pool.ts';
3
3
  export { probeBlock, probePort } from './allocator/probe.ts';
4
4
  export { type Config, loadConfig, type LoadConfigOptions, type ServiceSpec, synthesizeAnonymousConfig, } from './config/index.ts';
5
- export { buildEnvMap, evaluateTemplate, type ResolvedEnv, resolveEnv, } from './env/index.ts';
5
+ export { buildEnvMap, buildMetadata, evaluateTemplate, PORTWEAVE_NAMESPACE_VAR, PW_METADATA_FIELDS, PW_METADATA_PREFIX, type PwMetadataField, type ResolvedEnv, resolveEnv, } from './env/index.ts';
6
6
  export { PortweaveError, type PortweaveErrorCode, PW_ERROR_CODES, } from './errors.ts';
7
7
  export { andThen, err, ok, type Result } from './result.ts';
8
8
  export { detectGitWorktreeContext, type GitWorktreeContext, } from './worktree/git.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EACL,KAAK,MAAM,EACX,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,KAAK,WAAW,EAChB,UAAU,GACX,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,cAAc,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,KAAK,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,yBAAyB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EACL,KAAK,MAAM,EACX,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,yBAAyB,GAC1B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,UAAU,GACX,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,cAAc,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,KAAK,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,yBAAyB,CAAA"}
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ export { allocate, MAX_PROBE_RETRIES, orderServicesForAllocation, } from "./allo
2
2
  export { findFreeBlock, resolvePoolRange } from "./allocator/pool.js";
3
3
  export { probeBlock, probePort } from "./allocator/probe.js";
4
4
  export { loadConfig, synthesizeAnonymousConfig, } from "./config/index.js";
5
- export { buildEnvMap, evaluateTemplate, resolveEnv, } from "./env/index.js";
5
+ export { buildEnvMap, buildMetadata, evaluateTemplate, PORTWEAVE_NAMESPACE_VAR, PW_METADATA_FIELDS, PW_METADATA_PREFIX, resolveEnv, } from "./env/index.js";
6
6
  export { PortweaveError, PW_ERROR_CODES, } from "./errors.js";
7
7
  export { andThen, err, ok } from "./result.js";
8
8
  export { detectGitWorktreeContext, } from "./worktree/git.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAGR,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAEL,UAAU,EAGV,yBAAyB,GAC1B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,WAAW,EACX,gBAAgB,EAEhB,UAAU,GACX,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,cAAc,EAEd,cAAc,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,aAAa,CAAA;AAC3D,OAAO,EACL,wBAAwB,GAEzB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAsB,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,yBAAyB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAGR,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAEL,UAAU,EAGV,yBAAyB,GAC1B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAGlB,UAAU,GACX,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,cAAc,EAEd,cAAc,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,aAAa,CAAA;AAC3D,OAAO,EACL,wBAAwB,GAEzB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAsB,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,yBAAyB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "portweave",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Zero-thought, conflict-free local-dev port allocation across projects and git worktrees.",
5
5
  "license": "MIT",
6
6
  "author": "Gameweave",