@michelj/context-guard 0.4.3 → 0.6.1
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/Coordinator.md +88 -0
- package/Executor.md +53 -0
- package/README.md +89 -224
- package/README.zh-CN.md +89 -224
- package/SKILL.md +26 -684
- package/THIRD_PARTY_NOTICES.md +47 -0
- package/Tester.md +53 -0
- package/agents/openai.yaml +2 -2
- package/bin/build-runtime.mjs +96 -0
- package/bin/context-guard-skill.js +399 -78
- package/bin/postinstall.js +2 -2
- package/hooks.json +89 -13
- package/licenses/JSONParse-MIT.txt +24 -0
- package/licenses/Marked-MIT.txt +44 -0
- package/licenses/Portless-Apache-2.0.txt +201 -0
- package/package.json +35 -6
- package/prototype/LICENSES/Marked-MIT.txt +44 -0
- package/prototype/LICENSES/Ready-redistribution.txt +14 -0
- package/prototype/attachments.mjs +75 -0
- package/prototype/coordinator-markdown.mjs +283 -0
- package/prototype/coordinator-working-blot.mjs +124 -0
- package/prototype/vendor/marked.mjs +2189 -0
- package/prototype/workbench-app.js +5197 -0
- package/prototype/workbench-data.js +33 -0
- package/prototype/workbench-sync.mjs +898 -0
- package/prototype/workbench.css +1050 -0
- package/prototype/workbench.html +211 -0
- package/prototype/working-blot-atlas.png +0 -0
- package/references/agent-handoff.md +40 -0
- package/references/claude-runtime.md +120 -0
- package/references/cloud-sync-interface.md +66 -0
- package/references/design-current.md +14 -0
- package/references/map-mount.md +41 -0
- package/references/map-read.md +50 -0
- package/references/memory-definition.md +120 -0
- package/references/memory-filesystem-v2/Bug.en.md +162 -0
- package/references/memory-filesystem-v2/Bug.md +162 -0
- package/references/memory-filesystem-v2/Bug_Coordinater.md +8 -0
- package/references/memory-filesystem-v2/Bug_Executor.md +8 -0
- package/references/memory-filesystem-v2/Bug_Tester.md +7 -0
- package/references/memory-filesystem-v2/Idea.en.md +36 -0
- package/references/memory-filesystem-v2/Idea.md +36 -0
- package/references/memory-filesystem-v2/Node_Module_Index.en.md +88 -0
- package/references/memory-filesystem-v2/Node_Module_Index.md +88 -0
- package/references/memory-filesystem-v2/README.md +60 -0
- package/references/memory-filesystem-v2/Todo.en.md +137 -0
- package/references/memory-filesystem-v2/Todo.md +137 -0
- package/references/memory-filesystem-v2/Todo_Coordinater.md +7 -0
- package/references/memory-filesystem-v2/Todo_Executor.md +7 -0
- package/references/memory-filesystem-v2/Todo_Tester.md +7 -0
- package/references/named-workbench.md +124 -0
- package/references/plan-review.md +12 -0
- package/references/server-memory.md +276 -0
- package/references/test-check.md +7 -0
- package/references/user-reply.md +38 -0
- package/references/workbench-interface.md +531 -0
- package/roles.md +13 -0
- package/scripts/context_guard.py +1366 -7602
- package/scripts/context_guard_hook.py +1960 -711
- package/scripts/map_owns.py +699 -0
- package/scripts/shared/LICENSES/JSONParse-MIT.txt +24 -0
- package/scripts/shared/filesystem-v2.mjs +430 -0
- package/scripts/shared/io.mjs +117 -0
- package/scripts/shared/map-model.mjs +506 -0
- package/scripts/shared/memory-schema.mjs +13 -0
- package/scripts/shared/protocol-blobs.mjs +112 -0
- package/scripts/shared/protocol-map.mjs +146 -0
- package/scripts/shared/protocol-snapshots.mjs +84 -0
- package/scripts/shared/protocol-store.mjs +624 -0
- package/scripts/shared/protocol-workflow.mjs +226 -0
- package/scripts/shared/protocol.mjs +125 -0
- package/scripts/shared/vendor/jsonparse.cjs +413 -0
- package/scripts/workbench/access.mjs +496 -0
- package/scripts/workbench/attachments.mjs +92 -0
- package/scripts/workbench/browser-login.mjs +78 -0
- package/scripts/workbench/claude-runtime.mjs +372 -0
- package/scripts/workbench/cli.mjs +980 -0
- package/scripts/workbench/device-heartbeat.mjs +72 -0
- package/scripts/workbench/hook-status.mjs +38 -0
- package/scripts/workbench/inbox.mjs +155 -0
- package/scripts/workbench/journal.mjs +56 -0
- package/scripts/workbench/memory-merge.mjs +65 -0
- package/scripts/workbench/memory.mjs +252 -0
- package/scripts/workbench/named-proxy.mjs +108 -0
- package/scripts/workbench/named.mjs +152 -0
- package/scripts/workbench/portless-routes.mjs +51 -0
- package/scripts/workbench/project.mjs +327 -0
- package/scripts/workbench/projections.mjs +68 -0
- package/scripts/workbench/protocol-client.mjs +165 -0
- package/scripts/workbench/protocol-delivery.mjs +133 -0
- package/scripts/workbench/protocol-device.mjs +316 -0
- package/scripts/workbench/protocol-events.mjs +53 -0
- package/scripts/workbench/protocol-repository.mjs +58 -0
- package/scripts/workbench/reconcile.mjs +244 -0
- package/scripts/workbench/registry.mjs +111 -0
- package/scripts/workbench/runtime.mjs +54 -0
- package/scripts/workbench/server.mjs +1171 -0
- package/scripts/workbench/store.mjs +243 -0
- package/scripts/workbench/sync-coordinator.mjs +518 -0
- package/scripts/workbench/sync.mjs +86 -0
- package/references/context-template.md +0 -341
- package/references/feature-chain-methodology.md +0 -228
- package/references/register-template.md +0 -85
- package/references/task-case-template.md +0 -63
- package/tests/BC-20260618-063.sh +0 -116
- package/tests/BC-20260618-065.sh +0 -66
- package/tests/BC-20260626-080.sh +0 -48
- package/tests/BC-20260626-081.sh +0 -40
- package/tests/BC-20260626-082.sh +0 -32
- package/tests/BC-20260626-083.sh +0 -66
- package/tests/BC-20260627-084.sh +0 -74
- package/tests/BC-20260630-086.sh +0 -50
- package/tests/BC-20260630-087.sh +0 -103
- package/tests/BC-20260630-088.sh +0 -32
- package/tests/BC-20260630-089.sh +0 -63
- package/tests/BC-20260701-090.sh +0 -84
- package/tests/BC-20260702-096.sh +0 -48
- package/tests/BC-20260706-098.sh +0 -66
- package/tests/BC-20260707-099.sh +0 -47
- package/tests/BC-20260707-100.sh +0 -46
- package/tests/BC-20260707-101.sh +0 -47
- package/tests/BC-20260707-102.sh +0 -68
- package/tests/BC-20260707-103.sh +0 -59
- package/tests/BC-20260707-104.sh +0 -103
- package/tests/BC-20260707-105.sh +0 -109
- package/tests/BC-20260707-106.sh +0 -80
- package/tests/BC-20260707-107.sh +0 -74
- package/tests/BC-20260707-108.sh +0 -48
- package/tests/BC-20260707-109.sh +0 -56
- package/tests/BC-20260707-110.sh +0 -71
- package/tests/BC-20260707-111.sh +0 -70
- package/tests/BC-20260707-112.sh +0 -45
- package/tests/BC-20260707-113.sh +0 -73
- package/tests/BC-20260707-115.sh +0 -77
- package/tests/BC-20260707-116.sh +0 -77
- package/tests/BC-20260707-118.sh +0 -115
- package/tests/BC-20260707-119.sh +0 -47
- package/tests/BC-20260707-120.sh +0 -60
- package/tests/BC-20260707-121.sh +0 -66
- package/tests/BC-20260707-122.sh +0 -48
- package/tests/BC-20260707-123.sh +0 -43
- package/tests/BC-20260707-124.sh +0 -56
- package/tests/BC-20260707-125.sh +0 -64
- package/tests/BC-20260707-126.sh +0 -80
- package/tests/BC-20260707-127.sh +0 -88
- package/tests/BC-20260707-129.sh +0 -59
- package/tests/BC-20260707-130.sh +0 -69
- package/tests/BC-20260707-131.sh +0 -140
- package/tests/BC-20260707-132.sh +0 -150
- package/tests/BC-20260707-133.sh +0 -70
- package/tests/BC-20260708-136.sh +0 -210
- package/tests/BC-20260708-137.sh +0 -106
- package/tests/BC-20260708-138.sh +0 -168
- package/tests/BC-20260708-139.sh +0 -79
- package/tests/BC-20260709-002.sh +0 -63
- package/tests/BC-20260709-003.sh +0 -239
- package/tests/BC-20260709-006.sh +0 -76
- package/tests/BC-20260709-008.sh +0 -168
- package/tests/BC-20260710-001.sh +0 -61
- package/tests/BC-20260710-002.sh +0 -111
- package/tests/npm-install-smoke.sh +0 -53
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
## JSONParse
|
|
4
|
+
|
|
5
|
+
- Upstream: https://github.com/creationix/jsonparse
|
|
6
|
+
- Vendored version: `jsonparse@1.3.1` in `scripts/shared/vendor/jsonparse.cjs`.
|
|
7
|
+
- Changes: legacy `Buffer()` constructors use the Node 18+ `Buffer.alloc/from`
|
|
8
|
+
equivalents; parser behavior is unchanged.
|
|
9
|
+
- MIT license and upstream copyright notices:
|
|
10
|
+
[licenses/JSONParse-MIT.txt](licenses/JSONParse-MIT.txt).
|
|
11
|
+
- Used to parse production-scale Cloud memory JSON incrementally without creating
|
|
12
|
+
a JavaScript string for the complete file.
|
|
13
|
+
|
|
14
|
+
## Marked
|
|
15
|
+
|
|
16
|
+
- Upstream: https://github.com/markedjs/marked
|
|
17
|
+
- Pinned version: npm `marked@15.0.12` (Node 18 compatible); integrity is recorded in package-lock.json.
|
|
18
|
+
- Distributed browser module: `prototype/vendor/marked.mjs`, copied from `lib/marked.esm.js` without behavioral changes.
|
|
19
|
+
- MIT license and upstream copyright notices: [licenses/Marked-MIT.txt](licenses/Marked-MIT.txt).
|
|
20
|
+
- Used only as a Markdown lexer. Context Guard builds restricted DOM nodes instead of inserting generated HTML; remote images are not fetched.
|
|
21
|
+
|
|
22
|
+
## Ready-derived loading animation
|
|
23
|
+
|
|
24
|
+
- Source: `Michel-Johnson/Ready@d0771a1c8dc8086f49fbe924c2b5cbb621d0fd8b`,
|
|
25
|
+
`platform/frontend/src/components/WorkingBlot.tsx` and its atlas asset.
|
|
26
|
+
- Distributed files: `prototype/coordinator-working-blot.mjs` and
|
|
27
|
+
`prototype/working-blot-atlas.png`, materialized from the fixed Cloud UI package.
|
|
28
|
+
- Public redistribution was explicitly authorized by the project maintainer;
|
|
29
|
+
see [prototype/LICENSES/Ready-redistribution.txt](prototype/LICENSES/Ready-redistribution.txt).
|
|
30
|
+
|
|
31
|
+
## Portless
|
|
32
|
+
|
|
33
|
+
- Upstream: https://github.com/vercel-labs/portless
|
|
34
|
+
- Referenced version: npm `portless@0.15.6`, source module `src/routes.ts`.
|
|
35
|
+
- Copyright 2025 Vercel Inc.
|
|
36
|
+
- License: Apache License 2.0; full text is distributed in
|
|
37
|
+
[licenses/Portless-Apache-2.0.txt](licenses/Portless-Apache-2.0.txt).
|
|
38
|
+
- Derived file: `scripts/workbench/portless-routes.mjs`.
|
|
39
|
+
- Changes: reduced to local HTTP route storage and name ownership; replaced
|
|
40
|
+
writes with atomic private-file replacement; added strict project/instance
|
|
41
|
+
validation; removed force termination, tunnel metadata, stale PID pruning and
|
|
42
|
+
route-file locks (writes are serialized by one Context Guard proxy process).
|
|
43
|
+
|
|
44
|
+
The workbench proxy, startup adapter and project-binding code are Context Guard
|
|
45
|
+
implementations, not the full Portless CLI. TLS, certificate installation, LAN
|
|
46
|
+
access, tunnels and framework launching are not included. This notice identifies
|
|
47
|
+
the code's origin and does not imply endorsement by Vercel.
|
package/Tester.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Tester
|
|
2
|
+
|
|
3
|
+
你负责独立判断 Executor 的产物是否满足验收条件,并向 Coordinator 提供可核对的测试结论。技术验证由你完成,最终业务验收由用户决定。
|
|
4
|
+
|
|
5
|
+
## 职责与输入
|
|
6
|
+
|
|
7
|
+
接收 Coordinator 的测试请求,核对任务验收条件、准确的 `sourceSha`、本模块单测引用和 `CI_todo` 引用。测试结果必须对应这份提交和范围。
|
|
8
|
+
|
|
9
|
+
你不修改业务代码,也不提交或审核开发 Plan。需要修复的问题回报 Coordinator,由其协调原 Executor 处理;不直接向用户索取确认或验收。
|
|
10
|
+
|
|
11
|
+
## 开始工作
|
|
12
|
+
|
|
13
|
+
在指定的独立测试环境中核对源码版本,按需阅读相关 Main 节点、验收条件和执行证据。Executor 的自测是待核对的输入,不能代替你的独立验证。
|
|
14
|
+
|
|
15
|
+
缺少源码、权限、环境或证据时,先说明缺失项及其影响,不在另一个版本上继续并沿用原提交的结论。
|
|
16
|
+
|
|
17
|
+
## 工作流程
|
|
18
|
+
|
|
19
|
+
### 1. 执行检查
|
|
20
|
+
|
|
21
|
+
根据验收条件运行要求的功能检查和回归测试。任务要求 GitHub 等外部检查时,主动查询对应提交的实际结果。
|
|
22
|
+
|
|
23
|
+
保留检查名称、测试编号、运行标识和证据。某项无法执行时,明确哪些结论因此不能确认。
|
|
24
|
+
|
|
25
|
+
### 2. 回报结论
|
|
26
|
+
|
|
27
|
+
将结果绑定到准确的提交,使用以下结论:
|
|
28
|
+
|
|
29
|
+
| 结论 | 表示什么 |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| `passed` | 本次要求的检查已完成且通过 |
|
|
32
|
+
| `failed` | 检查发现不符合预期的结果 |
|
|
33
|
+
| `incomplete` | 缺少结果、仍在运行或存在无法完成的检查 |
|
|
34
|
+
|
|
35
|
+
有失败和未完成项时,分别列明,不用一个总状态掩盖未验证范围。测试失败回报复现条件、实际结果和预期结果;无法完成则说明阻塞。
|
|
36
|
+
|
|
37
|
+
### 3. 交回协调
|
|
38
|
+
|
|
39
|
+
把结论与证据交给 Coordinator。返工后按新的指定提交重新验证,保留此前失败记录;原提交的通过结果不能沿用到新提交。
|
|
40
|
+
|
|
41
|
+
测试通过表示技术检查通过,不表示用户已验收或任务已关闭。任务推进与 Session 状态由 Coordinator 和协议处理,你不自行释放执行占用。
|
|
42
|
+
|
|
43
|
+
## 按需资料
|
|
44
|
+
|
|
45
|
+
首次处理对应操作前阅读,后续需要或版本变化时重读,不在启动时通读全部资料。
|
|
46
|
+
|
|
47
|
+
| 当前要做什么 | 阅读哪份规范 |
|
|
48
|
+
| --- | --- |
|
|
49
|
+
| 读取项目与节点背景 | [map-read.md](references/map-read.md) |
|
|
50
|
+
| 核对交接范围和原任务关系 | [agent-handoff.md](references/agent-handoff.md) |
|
|
51
|
+
| 执行结果记录与结论回报 | [test-check.md](references/test-check.md) |
|
|
52
|
+
|
|
53
|
+
产品契约以 [当前设计版本](references/design-current.md) 为准。执行中的测试记录不改写 Main。
|
package/agents/openai.yaml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: "Context Guard"
|
|
3
|
-
short_description: "Keep
|
|
4
|
-
default_prompt: "Use $context-guard
|
|
3
|
+
short_description: "Keep folder-scoped project memory"
|
|
4
|
+
default_prompt: "Use $context-guard. Four stores: sessions, bugs, tasks, map. Jump with FIND.md."
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
|
|
8
|
+
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
9
|
+
const require = createRequire(path.join(root, 'package.json'));
|
|
10
|
+
const hash = data => createHash('sha256').update(data).digest('hex');
|
|
11
|
+
const manifestFile = path.join(root, '.runtime-generated.json');
|
|
12
|
+
const generatedPath = file => /^(?:scripts\/shared\/|prototype\/|references\/)[^\\]+$/.test(file) || /^(?:roles|Coordinator|Executor|Tester)\.md$/.test(file);
|
|
13
|
+
const mappings = [
|
|
14
|
+
['@michelj/context-guard-core', 'scripts/shared', file => !file.startsWith('roles/') && !file.startsWith('references/')],
|
|
15
|
+
['@michelj/context-guard-core', '', file => file.startsWith('roles/'), file => file.slice('roles/'.length)],
|
|
16
|
+
['@michelj/context-guard-core', '', file => file.startsWith('references/')],
|
|
17
|
+
['@michelj/context-guard-workbench', 'prototype', () => true],
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
async function assertDestination(file) {
|
|
21
|
+
const target = path.resolve(root, file);
|
|
22
|
+
if (!target.startsWith(root + path.sep)) throw new Error(`Invalid generated destination: ${file}`);
|
|
23
|
+
let current = root;
|
|
24
|
+
for (const component of ['', ...path.relative(root, target).split(path.sep)]) {
|
|
25
|
+
if (component) current = path.join(current, component);
|
|
26
|
+
const stat = await fs.lstat(current).catch(error => { if (error.code === 'ENOENT') return null; throw error; });
|
|
27
|
+
if (stat?.isSymbolicLink()) throw new Error(`Generated destination must not contain symlinks or junctions: ${file}`);
|
|
28
|
+
if (stat && current !== target && !stat.isDirectory()) throw new Error(`Generated destination parent is not a directory: ${file}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function walk(directory, prefix = '') {
|
|
33
|
+
const result = [];
|
|
34
|
+
for (const entry of await fs.readdir(path.join(directory, prefix), { withFileTypes: true })) {
|
|
35
|
+
const relative = path.posix.join(prefix, entry.name);
|
|
36
|
+
if (entry.isSymbolicLink()) throw new Error(`Runtime package must not contain symlinks: ${relative}`);
|
|
37
|
+
if (entry.isDirectory()) result.push(...await walk(directory, relative));
|
|
38
|
+
else if (entry.isFile()) result.push(relative);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function buildRuntime() {
|
|
44
|
+
await assertDestination('.runtime-generated.json');
|
|
45
|
+
const packageManifest = JSON.parse(await fs.readFile(path.join(root, 'package.json'), 'utf8'));
|
|
46
|
+
const outputs = new Map(), packages = {};
|
|
47
|
+
for (const [name, destination, accepts, rename = file => file] of mappings) {
|
|
48
|
+
const source = path.dirname(require.resolve(`${name}/package.json`));
|
|
49
|
+
const descriptor = JSON.parse(await fs.readFile(path.join(source, 'package.json'), 'utf8'));
|
|
50
|
+
const expected = packageManifest.devDependencies?.[name];
|
|
51
|
+
const releaseURL = `https://github.com/Michel-Johnson/Context-Guard-Cloud/releases/download/shared-v${descriptor.version}/michelj-${name.split('/')[1]}-${descriptor.version}.tgz`;
|
|
52
|
+
if (descriptor.name !== name || !/^\d+\.\d+\.\d+$/.test(descriptor.version) || expected !== releaseURL) throw new Error(`Unexpected runtime dependency: ${name}`);
|
|
53
|
+
packages[name] = { version: descriptor.version, dependency: expected };
|
|
54
|
+
for (const file of await walk(source)) {
|
|
55
|
+
if (file === 'package.json' || !accepts(file)) continue;
|
|
56
|
+
const relative = path.posix.join(destination, rename(file));
|
|
57
|
+
if (!generatedPath(relative) || relative.split('/').some(part => part === '..' || part === '.')) throw new Error(`Unexpected generated path: ${relative}`);
|
|
58
|
+
if (outputs.has(relative)) throw new Error(`Duplicate generated runtime path: ${relative}`);
|
|
59
|
+
outputs.set(relative, await fs.readFile(path.join(source, file)));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
let previous = { files: {} };
|
|
63
|
+
try { previous = JSON.parse(await fs.readFile(manifestFile, 'utf8')); }
|
|
64
|
+
catch (error) { if (error.code !== 'ENOENT') throw error; }
|
|
65
|
+
// Validate every output before making any change, including stale files
|
|
66
|
+
// listed by the previous manifest. Junctions must never escape the checkout.
|
|
67
|
+
for (const file of new Set([...outputs.keys(), ...Object.keys(previous.files)])) await assertDestination(file);
|
|
68
|
+
// Never overwrite edits in generated runtime files. Source changes belong in
|
|
69
|
+
// the Cloud package and must be released before this dependency is updated.
|
|
70
|
+
for (const [file, digest] of Object.entries(previous.files)) {
|
|
71
|
+
const target = path.resolve(root, file);
|
|
72
|
+
if (!target.startsWith(root + path.sep) || !generatedPath(file) || file.split('/').some(part => part === '..' || part === '.')) throw new Error('Invalid generated runtime manifest path');
|
|
73
|
+
const current = await fs.readFile(target).catch(error => { if (error.code === 'ENOENT') return null; throw error; });
|
|
74
|
+
if (current && hash(current) !== digest) throw new Error(`Generated runtime was edited: ${file}`);
|
|
75
|
+
}
|
|
76
|
+
for (const [file, data] of outputs) {
|
|
77
|
+
const target = path.join(root, file);
|
|
78
|
+
if (!previous.files[file]) {
|
|
79
|
+
const current = await fs.readFile(target).catch(error => { if (error.code === 'ENOENT') return null; throw error; });
|
|
80
|
+
if (current && !current.equals(data)) throw new Error(`Refusing to overwrite an existing source: ${file}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
for (const file of Object.keys(previous.files)) if (!outputs.has(file)) await fs.unlink(path.join(root, file)).catch(error => { if (error.code !== 'ENOENT') throw error; });
|
|
84
|
+
const files = {};
|
|
85
|
+
for (const [file, data] of outputs) {
|
|
86
|
+
await fs.mkdir(path.dirname(path.join(root, file)), { recursive: true });
|
|
87
|
+
await fs.writeFile(path.join(root, file), data);
|
|
88
|
+
files[file] = hash(data);
|
|
89
|
+
}
|
|
90
|
+
await fs.writeFile(manifestFile, JSON.stringify({ schemaVersion: 1, packages, files }, null, 2) + '\n');
|
|
91
|
+
console.log(`Materialized ${outputs.size} runtime files from fixed Cloud package versions.`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
95
|
+
buildRuntime().catch(error => { console.error(error.message); process.exitCode = 1; });
|
|
96
|
+
}
|