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 +16 -7
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +4 -3
- package/dist/cli/run.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +23 -3
- package/dist/config/schema.js.map +1 -1
- package/dist/env/build.d.ts.map +1 -1
- package/dist/env/build.js +6 -2
- package/dist/env/build.js.map +1 -1
- package/dist/env/index.d.ts +1 -0
- package/dist/env/index.d.ts.map +1 -1
- package/dist/env/index.js +1 -0
- package/dist/env/index.js.map +1 -1
- package/dist/env/metadata.d.ts +7 -0
- package/dist/env/metadata.d.ts.map +1 -0
- package/dist/env/metadata.js +22 -0
- package/dist/env/metadata.js.map +1 -0
- package/dist/env/resolve.d.ts.map +1 -1
- package/dist/env/resolve.js +6 -0
- package/dist/env/resolve.js.map +1 -1
- package/dist/env/templates.d.ts +1 -1
- package/dist/env/templates.d.ts.map +1 -1
- package/dist/env/templates.js +9 -1
- package/dist/env/templates.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
package/dist/cli/run.d.ts.map
CHANGED
|
@@ -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;
|
|
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: ${
|
|
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
|
-
//
|
|
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({
|
package/dist/cli/run.js.map
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/config/schema.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,cAAc,CAAA;AAEnD,MAAM,oBAAoB,GAAG,mBAAmB,CAAA;AAChD,MAAM,eAAe,GAAG,mBAAmB,CAAA;AAC3C,MAAM,mBAAmB,GAAG,gBAAgB,CAAA;AAC5C,MAAM,QAAQ,GAAG,CAAC,CAAA;AAClB,MAAM,QAAQ,GAAG,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/env/build.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
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;
|
package/dist/env/build.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/env/index.d.ts
CHANGED
|
@@ -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
|
package/dist/env/index.d.ts.map
CHANGED
|
@@ -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
|
package/dist/env/index.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/env/resolve.js
CHANGED
|
@@ -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);
|
package/dist/env/resolve.js.map
CHANGED
|
@@ -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"}
|
package/dist/env/templates.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/env/templates.js
CHANGED
|
@@ -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;
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|