@bluewombat/runtime 0.1.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 +473 -0
- package/SPECS.md +303 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +172 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +17 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +17 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/find-config.d.ts +9 -0
- package/dist/config/find-config.d.ts.map +1 -0
- package/dist/config/find-config.js +25 -0
- package/dist/config/find-config.js.map +1 -0
- package/dist/config/home.d.ts +17 -0
- package/dist/config/home.d.ts.map +1 -0
- package/dist/config/home.js +23 -0
- package/dist/config/home.js.map +1 -0
- package/dist/config/load-config.d.ts +13 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +537 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/parse-args.d.ts +25 -0
- package/dist/config/parse-args.d.ts.map +1 -0
- package/dist/config/parse-args.js +478 -0
- package/dist/config/parse-args.js.map +1 -0
- package/dist/config/types.d.ts +144 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/loop/authority.d.ts +51 -0
- package/dist/loop/authority.d.ts.map +1 -0
- package/dist/loop/authority.js +166 -0
- package/dist/loop/authority.js.map +1 -0
- package/dist/loop/context.d.ts +44 -0
- package/dist/loop/context.d.ts.map +1 -0
- package/dist/loop/context.js +2 -0
- package/dist/loop/context.js.map +1 -0
- package/dist/loop/cursor.d.ts +4 -0
- package/dist/loop/cursor.d.ts.map +1 -0
- package/dist/loop/cursor.js +20 -0
- package/dist/loop/cursor.js.map +1 -0
- package/dist/loop/deliveries.d.ts +22 -0
- package/dist/loop/deliveries.d.ts.map +1 -0
- package/dist/loop/deliveries.js +240 -0
- package/dist/loop/deliveries.js.map +1 -0
- package/dist/loop/describe.d.ts +40 -0
- package/dist/loop/describe.d.ts.map +1 -0
- package/dist/loop/describe.js +48 -0
- package/dist/loop/describe.js.map +1 -0
- package/dist/loop/drive.d.ts +15 -0
- package/dist/loop/drive.d.ts.map +1 -0
- package/dist/loop/drive.js +42 -0
- package/dist/loop/drive.js.map +1 -0
- package/dist/loop/journal.d.ts +22 -0
- package/dist/loop/journal.d.ts.map +1 -0
- package/dist/loop/journal.js +49 -0
- package/dist/loop/journal.js.map +1 -0
- package/dist/loop/lock.d.ts +11 -0
- package/dist/loop/lock.d.ts.map +1 -0
- package/dist/loop/lock.js +60 -0
- package/dist/loop/lock.js.map +1 -0
- package/dist/loop/message.d.ts +34 -0
- package/dist/loop/message.d.ts.map +1 -0
- package/dist/loop/message.js +48 -0
- package/dist/loop/message.js.map +1 -0
- package/dist/loop/open-host.d.ts +13 -0
- package/dist/loop/open-host.d.ts.map +1 -0
- package/dist/loop/open-host.js +180 -0
- package/dist/loop/open-host.js.map +1 -0
- package/dist/loop/probe.d.ts +9 -0
- package/dist/loop/probe.d.ts.map +1 -0
- package/dist/loop/probe.js +57 -0
- package/dist/loop/probe.js.map +1 -0
- package/dist/loop/report.d.ts +26 -0
- package/dist/loop/report.d.ts.map +1 -0
- package/dist/loop/report.js +328 -0
- package/dist/loop/report.js.map +1 -0
- package/dist/loop/tick.d.ts +24 -0
- package/dist/loop/tick.d.ts.map +1 -0
- package/dist/loop/tick.js +169 -0
- package/dist/loop/tick.js.map +1 -0
- package/dist/loop/trace.d.ts +16 -0
- package/dist/loop/trace.d.ts.map +1 -0
- package/dist/loop/trace.js +49 -0
- package/dist/loop/trace.js.map +1 -0
- package/dist/loop/transformers.d.ts +27 -0
- package/dist/loop/transformers.d.ts.map +1 -0
- package/dist/loop/transformers.js +229 -0
- package/dist/loop/transformers.js.map +1 -0
- package/dist/loop/work-line.d.ts +73 -0
- package/dist/loop/work-line.d.ts.map +1 -0
- package/dist/loop/work-line.js +109 -0
- package/dist/loop/work-line.js.map +1 -0
- package/dist/operator/board.d.ts +31 -0
- package/dist/operator/board.d.ts.map +1 -0
- package/dist/operator/board.js +67 -0
- package/dist/operator/board.js.map +1 -0
- package/dist/operator/cancel.d.ts +19 -0
- package/dist/operator/cancel.d.ts.map +1 -0
- package/dist/operator/cancel.js +70 -0
- package/dist/operator/cancel.js.map +1 -0
- package/dist/operator/doctor.d.ts +15 -0
- package/dist/operator/doctor.d.ts.map +1 -0
- package/dist/operator/doctor.js +416 -0
- package/dist/operator/doctor.js.map +1 -0
- package/dist/operator/git-remote.d.ts +39 -0
- package/dist/operator/git-remote.d.ts.map +1 -0
- package/dist/operator/git-remote.js +78 -0
- package/dist/operator/git-remote.js.map +1 -0
- package/dist/operator/init.d.ts +28 -0
- package/dist/operator/init.d.ts.map +1 -0
- package/dist/operator/init.js +522 -0
- package/dist/operator/init.js.map +1 -0
- package/dist/operator/live.d.ts +19 -0
- package/dist/operator/live.d.ts.map +1 -0
- package/dist/operator/live.js +149 -0
- package/dist/operator/live.js.map +1 -0
- package/dist/operator/prompt.d.ts +35 -0
- package/dist/operator/prompt.d.ts.map +1 -0
- package/dist/operator/prompt.js +125 -0
- package/dist/operator/prompt.js.map +1 -0
- package/dist/operator/setup.d.ts +18 -0
- package/dist/operator/setup.d.ts.map +1 -0
- package/dist/operator/setup.js +62 -0
- package/dist/operator/setup.js.map +1 -0
- package/dist/plugins/discover.d.ts +13 -0
- package/dist/plugins/discover.d.ts.map +1 -0
- package/dist/plugins/discover.js +81 -0
- package/dist/plugins/discover.js.map +1 -0
- package/dist/plugins/isolation.d.ts +78 -0
- package/dist/plugins/isolation.d.ts.map +1 -0
- package/dist/plugins/isolation.js +64 -0
- package/dist/plugins/isolation.js.map +1 -0
- package/dist/plugins/load.d.ts +35 -0
- package/dist/plugins/load.d.ts.map +1 -0
- package/dist/plugins/load.js +109 -0
- package/dist/plugins/load.js.map +1 -0
- package/dist/plugins/manager.d.ts +43 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +47 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/persist.d.ts +33 -0
- package/dist/plugins/persist.d.ts.map +1 -0
- package/dist/plugins/persist.js +26 -0
- package/dist/plugins/persist.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { loadPlugin } from "./load.js";
|
|
2
|
+
/**
|
|
3
|
+
* The module must export `strategy` with `isolation` and `fold` backends;
|
|
4
|
+
* `reference`, when present, must be a backend with `parse`, and `refOf` a
|
|
5
|
+
* function. `createStrategy`, when present, must be a function: it is what
|
|
6
|
+
* `workLine.isolationOptions` is handed to.
|
|
7
|
+
*/
|
|
8
|
+
const strategyShape = {
|
|
9
|
+
kind: "Isolation strategy",
|
|
10
|
+
check(loaded) {
|
|
11
|
+
const strategy = loaded?.strategy;
|
|
12
|
+
if (strategy === null ||
|
|
13
|
+
typeof strategy !== "object" ||
|
|
14
|
+
typeof strategy.isolation !== "object" ||
|
|
15
|
+
typeof strategy.fold !== "object") {
|
|
16
|
+
return { ok: false, reason: "does not export strategy" };
|
|
17
|
+
}
|
|
18
|
+
const reference = strategy.reference;
|
|
19
|
+
if (reference !== undefined &&
|
|
20
|
+
(reference === null ||
|
|
21
|
+
typeof reference !== "object" ||
|
|
22
|
+
typeof reference.parse !== "function")) {
|
|
23
|
+
return { ok: false, reason: "exports a reference without parse" };
|
|
24
|
+
}
|
|
25
|
+
const refOf = strategy.refOf;
|
|
26
|
+
if (refOf !== undefined && typeof refOf !== "function") {
|
|
27
|
+
return { ok: false, reason: "exports a refOf that is not a function" };
|
|
28
|
+
}
|
|
29
|
+
const createStrategy = loaded.createStrategy;
|
|
30
|
+
if (createStrategy !== undefined && typeof createStrategy !== "function") {
|
|
31
|
+
return { ok: false, reason: "exports a createStrategy that is not a function" };
|
|
32
|
+
}
|
|
33
|
+
const value = { strategy: strategy };
|
|
34
|
+
if (createStrategy !== undefined) {
|
|
35
|
+
value.createStrategy = createStrategy;
|
|
36
|
+
}
|
|
37
|
+
return { ok: true, value };
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Load the isolation strategy package named by `workLine.isolation`, shaped
|
|
42
|
+
* by `workLine.isolationOptions` when the config has any. Options handed to
|
|
43
|
+
* a package that takes none are a mistake to stop on, not to ignore: the
|
|
44
|
+
* operator meant them.
|
|
45
|
+
*/
|
|
46
|
+
export async function resolveIsolationStrategy(name, fromDir, options) {
|
|
47
|
+
const loaded = await loadPlugin(name, fromDir, strategyShape);
|
|
48
|
+
if (!loaded.ok) {
|
|
49
|
+
return loaded;
|
|
50
|
+
}
|
|
51
|
+
const { specifier } = loaded;
|
|
52
|
+
if (options === undefined) {
|
|
53
|
+
return { ok: true, strategy: loaded.value.strategy, specifier };
|
|
54
|
+
}
|
|
55
|
+
if (loaded.value.createStrategy === undefined) {
|
|
56
|
+
return {
|
|
57
|
+
ok: false,
|
|
58
|
+
reason: `${specifier} takes no isolationOptions; remove "workLine.isolationOptions" from the config.`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const made = loaded.value.createStrategy(options);
|
|
62
|
+
return made.ok ? { ok: true, strategy: made.strategy, specifier } : made;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=isolation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolation.js","sourceRoot":"","sources":["../../src/plugins/isolation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAc,MAAM,WAAW,CAAC;AAkEnD;;;;;GAKG;AACH,MAAM,aAAa,GAA0B;IAC3C,IAAI,EAAE,oBAAoB;IAC1B,KAAK,CAAC,MAAM;QACV,MAAM,QAAQ,GAAI,MAAwC,EAAE,QAAQ,CAAC;QACrE,IACE,QAAQ,KAAK,IAAI;YACjB,OAAO,QAAQ,KAAK,QAAQ;YAC5B,OAAQ,QAAoC,CAAC,SAAS,KAAK,QAAQ;YACnE,OAAQ,QAA+B,CAAC,IAAI,KAAK,QAAQ,EACzD,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;QAC3D,CAAC;QACD,MAAM,SAAS,GAAI,QAAoC,CAAC,SAAS,CAAC;QAClE,IACE,SAAS,KAAK,SAAS;YACvB,CAAC,SAAS,KAAK,IAAI;gBACjB,OAAO,SAAS,KAAK,QAAQ;gBAC7B,OAAQ,SAAiC,CAAC,KAAK,KAAK,UAAU,CAAC,EACjE,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;QACpE,CAAC;QACD,MAAM,KAAK,GAAI,QAAgC,CAAC,KAAK,CAAC;QACtD,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YACvD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wCAAwC,EAAE,CAAC;QACzE,CAAC;QACD,MAAM,cAAc,GAAI,MAAuC,CAAC,cAAc,CAAC;QAC/E,IAAI,cAAc,KAAK,SAAS,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;YACzE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iDAAiD,EAAE,CAAC;QAClF,CAAC;QACD,MAAM,KAAK,GAAmB,EAAE,QAAQ,EAAE,QAA6B,EAAE,CAAC;QAC1E,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,CAAC,cAAc,GAAG,cAA+D,CAAC;QACzF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAY,EACZ,OAAe,EACf,OAAiC;IAEjC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG,SAAS,iFAAiF;SACtG,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How Host loads anything a Project names in its config: a manager, an
|
|
3
|
+
* isolation strategy, whatever comes next. One loader, one set of resolution
|
|
4
|
+
* rules, one wording for a package that is missing. What differs per kind is
|
|
5
|
+
* only the shape the module must have, and that is the `Shape` handed in.
|
|
6
|
+
*
|
|
7
|
+
* Resolution: a relative or absolute name is a file. A bare name is imported
|
|
8
|
+
* the normal way first — mason and its plugins installed side by side in one
|
|
9
|
+
* project — then looked for by walking `node_modules` up from `fromDir`, which
|
|
10
|
+
* covers a globally installed `mason` driving a plugin installed next to the
|
|
11
|
+
* config file.
|
|
12
|
+
*/
|
|
13
|
+
/** What one kind of plugin must look like once imported. */
|
|
14
|
+
export type Shape<T> = {
|
|
15
|
+
/** How the kind is called in a refusal: `Manager`, `Isolation strategy`. */
|
|
16
|
+
kind: string;
|
|
17
|
+
/** Read the module; `reason` says what is missing, without naming the file. */
|
|
18
|
+
check(loaded: unknown): {
|
|
19
|
+
ok: true;
|
|
20
|
+
value: T;
|
|
21
|
+
} | {
|
|
22
|
+
ok: false;
|
|
23
|
+
reason: string;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export type Loaded<T> = {
|
|
27
|
+
ok: true;
|
|
28
|
+
value: T;
|
|
29
|
+
specifier: string;
|
|
30
|
+
} | {
|
|
31
|
+
ok: false;
|
|
32
|
+
reason: string;
|
|
33
|
+
};
|
|
34
|
+
export declare function loadPlugin<T>(name: string, fromDir: string, shape: Shape<T>): Promise<Loaded<T>>;
|
|
35
|
+
//# sourceMappingURL=load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/plugins/load.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AAEH,4DAA4D;AAC5D,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI;IACrB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElG,wBAAsB,UAAU,CAAC,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GACd,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAyBpB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { PRODUCT } from "@bluewombat/manager-kit";
|
|
5
|
+
export async function loadPlugin(name, fromDir, shape) {
|
|
6
|
+
const attempts = [];
|
|
7
|
+
if (name.startsWith(".") || isAbsolute(name)) {
|
|
8
|
+
const path = resolve(fromDir, name);
|
|
9
|
+
if (!existsSync(path)) {
|
|
10
|
+
return { ok: false, reason: `${shape.kind} "${name}" is not a file: ${path}` };
|
|
11
|
+
}
|
|
12
|
+
return await importFrom(pathToFileURL(path).href, name, shape, attempts);
|
|
13
|
+
}
|
|
14
|
+
const direct = await importFrom(name, name, shape, attempts);
|
|
15
|
+
if (direct.ok) {
|
|
16
|
+
return direct;
|
|
17
|
+
}
|
|
18
|
+
const nearby = findInNodeModules(name, fromDir);
|
|
19
|
+
if (nearby === undefined) {
|
|
20
|
+
return {
|
|
21
|
+
ok: false,
|
|
22
|
+
reason: `${shape.kind} "${name}" could not be loaded. Install it next to ${PRODUCT} ` +
|
|
23
|
+
`(npm install ${name}).\n${attempts.join("\n")}`,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return await importFrom(pathToFileURL(nearby).href, name, shape, attempts);
|
|
27
|
+
}
|
|
28
|
+
async function importFrom(url, name, shape, attempts) {
|
|
29
|
+
let loaded;
|
|
30
|
+
try {
|
|
31
|
+
loaded = await import(url);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
attempts.push(` ${url}: ${error instanceof Error ? error.message : String(error)}`);
|
|
35
|
+
return { ok: false, reason: attempts.join("\n") };
|
|
36
|
+
}
|
|
37
|
+
const checked = shape.check(loaded);
|
|
38
|
+
if (!checked.ok) {
|
|
39
|
+
return { ok: false, reason: `${shape.kind} "${name}" ${checked.reason} (${name}).` };
|
|
40
|
+
}
|
|
41
|
+
return { ok: true, value: checked.value, specifier: name };
|
|
42
|
+
}
|
|
43
|
+
/** The entry file of `<dir>/node_modules/<specifier>`, walking up from `from`. */
|
|
44
|
+
function findInNodeModules(specifier, from) {
|
|
45
|
+
let dir = resolve(from);
|
|
46
|
+
for (;;) {
|
|
47
|
+
const packageRoot = join(dir, "node_modules", specifier);
|
|
48
|
+
const manifest = join(packageRoot, "package.json");
|
|
49
|
+
if (existsSync(manifest)) {
|
|
50
|
+
const entry = entryOf(manifest);
|
|
51
|
+
if (entry !== undefined) {
|
|
52
|
+
const path = resolve(packageRoot, entry);
|
|
53
|
+
if (existsSync(path)) {
|
|
54
|
+
return path;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const parent = dirname(dir);
|
|
59
|
+
if (parent === dir) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
dir = parent;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function entryOf(manifest) {
|
|
66
|
+
let parsed;
|
|
67
|
+
try {
|
|
68
|
+
parsed = JSON.parse(readFileSync(manifest, "utf8"));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
if (parsed === null || typeof parsed !== "object") {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
const object = parsed;
|
|
77
|
+
const root = readExports(object.exports);
|
|
78
|
+
if (root !== undefined) {
|
|
79
|
+
return root;
|
|
80
|
+
}
|
|
81
|
+
if (typeof object.module === "string") {
|
|
82
|
+
return object.module;
|
|
83
|
+
}
|
|
84
|
+
return typeof object.main === "string" ? object.main : undefined;
|
|
85
|
+
}
|
|
86
|
+
function readExports(value) {
|
|
87
|
+
if (typeof value === "string") {
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
if (value === null || typeof value !== "object") {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const root = value["."] ?? value;
|
|
94
|
+
if (typeof root === "string") {
|
|
95
|
+
return root;
|
|
96
|
+
}
|
|
97
|
+
if (root === null || typeof root !== "object") {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
const conditions = root;
|
|
101
|
+
for (const key of ["import", "module", "default"]) {
|
|
102
|
+
const candidate = conditions[key];
|
|
103
|
+
if (typeof candidate === "string") {
|
|
104
|
+
return candidate;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/plugins/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ManagerContext, ManagerModule, ManagerPort } from "@bluewombat/manager-kit";
|
|
2
|
+
export type ResolveResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
module: ManagerModule;
|
|
5
|
+
specifier: string;
|
|
6
|
+
} | {
|
|
7
|
+
ok: false;
|
|
8
|
+
reason: string;
|
|
9
|
+
};
|
|
10
|
+
/** Load the manager package named by the config. */
|
|
11
|
+
export declare function resolveManagerModule(name: string, fromDir: string): Promise<ResolveResult>;
|
|
12
|
+
export type ManagerRequest = {
|
|
13
|
+
manager: string | ManagerModule;
|
|
14
|
+
managerOptions: Record<string, unknown>;
|
|
15
|
+
configDir: string;
|
|
16
|
+
durationMs: number;
|
|
17
|
+
interruptFlag: {
|
|
18
|
+
interrupted: boolean;
|
|
19
|
+
};
|
|
20
|
+
env: Record<string, string | undefined>;
|
|
21
|
+
};
|
|
22
|
+
export type LoadedModule = {
|
|
23
|
+
ok: true;
|
|
24
|
+
module: ManagerModule;
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
reason: string;
|
|
28
|
+
};
|
|
29
|
+
export declare function contextOf(request: ManagerRequest): ManagerContext;
|
|
30
|
+
/** The module face, so `mason doctor` can ask a manager to check itself. */
|
|
31
|
+
export declare function loadManagerModule(request: ManagerRequest): Promise<LoadedModule>;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the manager package, then let it build its own Port. Host reads
|
|
34
|
+
* neither the options nor the environment on its behalf.
|
|
35
|
+
*/
|
|
36
|
+
export declare function openManager(request: ManagerRequest): Promise<{
|
|
37
|
+
ok: true;
|
|
38
|
+
manager: ManagerPort;
|
|
39
|
+
} | {
|
|
40
|
+
ok: false;
|
|
41
|
+
reason: string;
|
|
42
|
+
}>;
|
|
43
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/plugins/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAkB1F,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,oDAAoD;AACpD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAGhG;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;IACxC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CAQjE;AAED,4EAA4E;AAC5E,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAMtF;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAM7E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { loadPlugin } from "./load.js";
|
|
2
|
+
/** The module face a manager package must export. Contract: `@bluewombat/manager-kit`. */
|
|
3
|
+
const managerShape = {
|
|
4
|
+
kind: "Manager",
|
|
5
|
+
check(loaded) {
|
|
6
|
+
if (loaded === null ||
|
|
7
|
+
typeof loaded !== "object" ||
|
|
8
|
+
typeof loaded.createManager !== "function") {
|
|
9
|
+
return { ok: false, reason: "does not export createManager" };
|
|
10
|
+
}
|
|
11
|
+
return { ok: true, value: loaded };
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
/** Load the manager package named by the config. */
|
|
15
|
+
export async function resolveManagerModule(name, fromDir) {
|
|
16
|
+
const loaded = await loadPlugin(name, fromDir, managerShape);
|
|
17
|
+
return loaded.ok ? { ok: true, module: loaded.value, specifier: loaded.specifier } : loaded;
|
|
18
|
+
}
|
|
19
|
+
export function contextOf(request) {
|
|
20
|
+
return {
|
|
21
|
+
options: request.managerOptions,
|
|
22
|
+
durationMs: request.durationMs,
|
|
23
|
+
interruptFlag: request.interruptFlag,
|
|
24
|
+
configDir: request.configDir,
|
|
25
|
+
env: request.env,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** The module face, so `mason doctor` can ask a manager to check itself. */
|
|
29
|
+
export async function loadManagerModule(request) {
|
|
30
|
+
if (typeof request.manager !== "string") {
|
|
31
|
+
return { ok: true, module: request.manager };
|
|
32
|
+
}
|
|
33
|
+
const resolved = await resolveManagerModule(request.manager, request.configDir);
|
|
34
|
+
return resolved.ok ? { ok: true, module: resolved.module } : resolved;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the manager package, then let it build its own Port. Host reads
|
|
38
|
+
* neither the options nor the environment on its behalf.
|
|
39
|
+
*/
|
|
40
|
+
export async function openManager(request) {
|
|
41
|
+
const loaded = await loadManagerModule(request);
|
|
42
|
+
if (!loaded.ok) {
|
|
43
|
+
return loaded;
|
|
44
|
+
}
|
|
45
|
+
return await loaded.module.createManager(contextOf(request));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/plugins/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAc,MAAM,WAAW,CAAC;AAEnD,0FAA0F;AAC1F,MAAM,YAAY,GAAyB;IACzC,IAAI,EAAE,SAAS;IACf,KAAK,CAAC,MAAM;QACV,IACE,MAAM,KAAK,IAAI;YACf,OAAO,MAAM,KAAK,QAAQ;YAC1B,OAAQ,MAAsC,CAAC,aAAa,KAAK,UAAU,EAC3E,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;QAChE,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAuB,EAAE,CAAC;IACtD,CAAC;CACF,CAAC;AAMF,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAY,EAAE,OAAe;IACtE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAC9F,CAAC;AAaD,MAAM,UAAU,SAAS,CAAC,OAAuB;IAC/C,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,cAAc;QAC/B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAuB;IAC7D,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAChF,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { PersistencePort } from "@bluewombat/work-ledger";
|
|
2
|
+
/**
|
|
3
|
+
* How the ledger is stored. The Port is `@bluewombat/work-ledger`'s; what a
|
|
4
|
+
* backend package exports to hand one over is fixed here: `openPersist`,
|
|
5
|
+
* given the directory Host keeps its ledger in. Where inside that directory
|
|
6
|
+
* the bytes go — one file per key, one SQLite file — is the backend's.
|
|
7
|
+
*/
|
|
8
|
+
export type PersistContext = {
|
|
9
|
+
/** Absolute. Host's own; the backend writes under it. */
|
|
10
|
+
ledgerRoot: string;
|
|
11
|
+
};
|
|
12
|
+
export type PersistModule = {
|
|
13
|
+
openPersist(context: PersistContext): Promise<PersistencePort>;
|
|
14
|
+
};
|
|
15
|
+
export type ResolvePersistResult = {
|
|
16
|
+
ok: true;
|
|
17
|
+
module: PersistModule;
|
|
18
|
+
specifier: string;
|
|
19
|
+
} | {
|
|
20
|
+
ok: false;
|
|
21
|
+
reason: string;
|
|
22
|
+
};
|
|
23
|
+
/** Load the persistence backend named by `persist`. */
|
|
24
|
+
export declare function resolvePersistModule(name: string, fromDir: string): Promise<ResolvePersistResult>;
|
|
25
|
+
/** Resolve the backend, then open the Port under `ledgerRoot`. */
|
|
26
|
+
export declare function openPersist(name: string, fromDir: string, ledgerRoot: string): Promise<{
|
|
27
|
+
ok: true;
|
|
28
|
+
persist: PersistencePort;
|
|
29
|
+
} | {
|
|
30
|
+
ok: false;
|
|
31
|
+
reason: string;
|
|
32
|
+
}>;
|
|
33
|
+
//# sourceMappingURL=persist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../src/plugins/persist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAChE,CAAC;AAgBF,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,uDAAuD;AACvD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,CAAC,CAG/B;AAED,kEAAkE;AAClE,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAMjF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { loadPlugin } from "./load.js";
|
|
2
|
+
const persistShape = {
|
|
3
|
+
kind: "Persistence backend",
|
|
4
|
+
check(loaded) {
|
|
5
|
+
if (loaded === null ||
|
|
6
|
+
typeof loaded !== "object" ||
|
|
7
|
+
typeof loaded.openPersist !== "function") {
|
|
8
|
+
return { ok: false, reason: "does not export openPersist" };
|
|
9
|
+
}
|
|
10
|
+
return { ok: true, value: loaded };
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
/** Load the persistence backend named by `persist`. */
|
|
14
|
+
export async function resolvePersistModule(name, fromDir) {
|
|
15
|
+
const loaded = await loadPlugin(name, fromDir, persistShape);
|
|
16
|
+
return loaded.ok ? { ok: true, module: loaded.value, specifier: loaded.specifier } : loaded;
|
|
17
|
+
}
|
|
18
|
+
/** Resolve the backend, then open the Port under `ledgerRoot`. */
|
|
19
|
+
export async function openPersist(name, fromDir, ledgerRoot) {
|
|
20
|
+
const resolved = await resolvePersistModule(name, fromDir);
|
|
21
|
+
if (!resolved.ok) {
|
|
22
|
+
return resolved;
|
|
23
|
+
}
|
|
24
|
+
return { ok: true, persist: await resolved.module.openPersist({ ledgerRoot }) };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=persist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist.js","sourceRoot":"","sources":["../../src/plugins/persist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAc,MAAM,WAAW,CAAC;AAiBnD,MAAM,YAAY,GAAyB;IACzC,IAAI,EAAE,qBAAqB;IAC3B,KAAK,CAAC,MAAM;QACV,IACE,MAAM,KAAK,IAAI;YACf,OAAO,MAAM,KAAK,QAAQ;YAC1B,OAAQ,MAAoC,CAAC,WAAW,KAAK,UAAU,EACvE,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;QAC9D,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAuB,EAAE,CAAC;IACtD,CAAC;CACF,CAAC;AAMF,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAY,EACZ,OAAe;IAEf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAC9F,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,OAAe,EACf,UAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;AAClF,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bluewombat/runtime",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "The mason process: listen, admit, run Conductor, report. Loads one FeatureManager plugin.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"mason",
|
|
8
|
+
"bluewombat",
|
|
9
|
+
"cli",
|
|
10
|
+
"automation"
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"homepage": "https://github.com/tilap/bluewombat/tree/main/packages/host/runtime#readme",
|
|
14
|
+
"bugs": "https://github.com/tilap/bluewombat/issues",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/tilap/bluewombat.git",
|
|
18
|
+
"directory": "packages/host/runtime"
|
|
19
|
+
},
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"import": "./dist/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"bin": {
|
|
28
|
+
"mason": "./dist/cli.js"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"README.md",
|
|
33
|
+
"SPECS.md"
|
|
34
|
+
],
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=24.20.0"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"lint": "biome check .",
|
|
43
|
+
"format": "biome check --write .",
|
|
44
|
+
"tsc": "tsc --noEmit",
|
|
45
|
+
"test": "tsx --test $(find src -name '*.test.ts')",
|
|
46
|
+
"build": "tsc -p tsconfig.build.json"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@bluewombat/conductor": "^0.1.0",
|
|
50
|
+
"@bluewombat/feature-breakdown": "^0.1.0",
|
|
51
|
+
"@bluewombat/manager-kit": "^0.1.0",
|
|
52
|
+
"@bluewombat/implementer": "^0.1.0",
|
|
53
|
+
"@bluewombat/integrator": "^0.1.0",
|
|
54
|
+
"@bluewombat/isolation-copy": "^0.1.0",
|
|
55
|
+
"@bluewombat/isolation-git": "^0.1.0",
|
|
56
|
+
"@bluewombat/isolator": "^0.1.0",
|
|
57
|
+
"@bluewombat/slots": "^0.1.0",
|
|
58
|
+
"@bluewombat/work-ledger": "^0.1.0",
|
|
59
|
+
"@bluewombat/persist-fs": "^0.1.0"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@bluewombat/manager-fake": "^0.1.0",
|
|
63
|
+
"@bluewombat/manager-github": "^0.1.0",
|
|
64
|
+
"@bluewombat/persist-sqlite": "^0.1.0"
|
|
65
|
+
}
|
|
66
|
+
}
|