@otto-assistant/otto 0.1.0 → 0.1.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.
Files changed (72) hide show
  1. package/dist/cli.js +406 -12
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.test.js +9 -9
  4. package/dist/config.test.js.map +1 -1
  5. package/dist/detect.test.js +4 -3
  6. package/dist/detect.test.js.map +1 -1
  7. package/dist/docker.d.ts +7 -0
  8. package/dist/docker.d.ts.map +1 -0
  9. package/dist/docker.js +17 -0
  10. package/dist/docker.js.map +1 -0
  11. package/dist/docker.test.d.ts +2 -0
  12. package/dist/docker.test.d.ts.map +1 -0
  13. package/dist/docker.test.js +12 -0
  14. package/dist/docker.test.js.map +1 -0
  15. package/dist/health.d.ts +4 -0
  16. package/dist/health.d.ts.map +1 -1
  17. package/dist/health.js +40 -1
  18. package/dist/health.js.map +1 -1
  19. package/dist/health.test.js +21 -2
  20. package/dist/health.test.js.map +1 -1
  21. package/dist/index.d.ts +11 -3
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +6 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/installer.test.js +2 -2
  26. package/dist/installer.test.js.map +1 -1
  27. package/dist/lifecycle.d.ts +6 -0
  28. package/dist/lifecycle.d.ts.map +1 -1
  29. package/dist/lifecycle.js +26 -11
  30. package/dist/lifecycle.js.map +1 -1
  31. package/dist/lifecycle.test.js +5 -4
  32. package/dist/lifecycle.test.js.map +1 -1
  33. package/dist/manifest.js +4 -4
  34. package/dist/manifest.js.map +1 -1
  35. package/dist/skills-baseline.d.ts +7 -0
  36. package/dist/skills-baseline.d.ts.map +1 -0
  37. package/dist/skills-baseline.js +9 -0
  38. package/dist/skills-baseline.js.map +1 -0
  39. package/dist/skills.d.ts +110 -0
  40. package/dist/skills.d.ts.map +1 -0
  41. package/dist/skills.js +429 -0
  42. package/dist/skills.js.map +1 -0
  43. package/dist/skills.test.d.ts +2 -0
  44. package/dist/skills.test.d.ts.map +1 -0
  45. package/dist/skills.test.js +416 -0
  46. package/dist/skills.test.js.map +1 -0
  47. package/dist/tenant.d.ts +13 -0
  48. package/dist/tenant.d.ts.map +1 -0
  49. package/dist/tenant.js +105 -0
  50. package/dist/tenant.js.map +1 -0
  51. package/dist/tenant.test.d.ts +2 -0
  52. package/dist/tenant.test.d.ts.map +1 -0
  53. package/dist/tenant.test.js +37 -0
  54. package/dist/tenant.test.js.map +1 -0
  55. package/package.json +15 -5
  56. package/src/cli.ts +457 -12
  57. package/src/config.test.ts +9 -9
  58. package/src/detect.test.ts +4 -3
  59. package/src/docker.test.ts +12 -0
  60. package/src/docker.ts +23 -0
  61. package/src/health.test.ts +23 -1
  62. package/src/health.ts +45 -1
  63. package/src/index.ts +37 -3
  64. package/src/installer.test.ts +2 -2
  65. package/src/lifecycle.test.ts +6 -5
  66. package/src/lifecycle.ts +29 -10
  67. package/src/manifest.ts +4 -4
  68. package/src/skills-baseline.ts +14 -0
  69. package/src/skills.test.ts +503 -0
  70. package/src/skills.ts +512 -0
  71. package/src/tenant.test.ts +49 -0
  72. package/src/tenant.ts +120 -0
@@ -0,0 +1,7 @@
1
+ export interface DockerComposeCommand {
2
+ command: string;
3
+ args: string[];
4
+ }
5
+ export declare function buildComposeCommand(tenantPath: string, subArgs: string[]): DockerComposeCommand;
6
+ export declare function runCompose(tenantPath: string, subArgs: string[]): void;
7
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAM/F;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAMtE"}
package/dist/docker.js ADDED
@@ -0,0 +1,17 @@
1
+ import { execSync } from "node:child_process";
2
+ import path from "node:path";
3
+ export function buildComposeCommand(tenantPath, subArgs) {
4
+ const composeFile = path.join(path.resolve(tenantPath), "compose.yml");
5
+ return {
6
+ command: "docker",
7
+ args: ["compose", "-f", composeFile, ...subArgs],
8
+ };
9
+ }
10
+ export function runCompose(tenantPath, subArgs) {
11
+ const built = buildComposeCommand(tenantPath, subArgs);
12
+ execSync(`${built.command} ${built.args.join(" ")}`, {
13
+ stdio: "inherit",
14
+ timeout: 120_000,
15
+ });
16
+ }
17
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAA;AAO5B,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,OAAiB;IACvE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,CAAA;IACtE,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;KACjD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAkB,EAAE,OAAiB;IAC9D,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IACtD,QAAQ,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;QACnD,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=docker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.test.d.ts","sourceRoot":"","sources":["../src/docker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildComposeCommand } from "./docker.js";
3
+ describe("docker", () => {
4
+ it("builds docker compose command with tenant path", () => {
5
+ const cmd = buildComposeCommand("/tmp/tenant-a", ["up", "-d"]);
6
+ expect(cmd).toEqual({
7
+ command: "docker",
8
+ args: ["compose", "-f", "/tmp/tenant-a/compose.yml", "up", "-d"],
9
+ });
10
+ });
11
+ });
12
+ //# sourceMappingURL=docker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.test.js","sourceRoot":"","sources":["../src/docker.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAG,mBAAmB,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;YAClB,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,IAAI,CAAC;SACjE,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/dist/health.d.ts CHANGED
@@ -24,4 +24,8 @@ export interface ConfigHealth {
24
24
  }
25
25
  export declare function checkConfigHealth(): ConfigHealth;
26
26
  export declare function checkDirectoryHealth(): HealthResult[];
27
+ export interface TenantHealthInput {
28
+ tenantPath: string;
29
+ }
30
+ export declare function checkTenantHealth(input: TenantHealthInput): HealthResult[];
27
31
  //# sourceMappingURL=health.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,IAAI,GAAG,SAAS,CAAA;CACzB;AAoBD,wBAAgB,oBAAoB,IAAI,YAAY,EAAE,CAKrD;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CAAA;IACxC,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAA;IAC1B,eAAe,EAAE,IAAI,GAAG,SAAS,CAAA;IACjC,mBAAmB,EAAE,OAAO,CAAA;IAC5B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,8BAA8B,EAAE,OAAO,CAAA;IACvC,yBAAyB,EAAE,OAAO,CAAA;IAClC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,wBAAgB,iBAAiB,IAAI,YAAY,CAoChD;AAED,wBAAgB,oBAAoB,IAAI,YAAY,EAAE,CAiBrD"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,IAAI,GAAG,SAAS,CAAA;CACzB;AAoBD,wBAAgB,oBAAoB,IAAI,YAAY,EAAE,CAKrD;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CAAA;IACxC,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAA;IAC1B,eAAe,EAAE,IAAI,GAAG,SAAS,CAAA;IACjC,mBAAmB,EAAE,OAAO,CAAA;IAC5B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,8BAA8B,EAAE,OAAO,CAAA;IACvC,yBAAyB,EAAE,OAAO,CAAA;IAClC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,wBAAgB,iBAAiB,IAAI,YAAY,CAoChD;AAED,wBAAgB,oBAAoB,IAAI,YAAY,EAAE,CAiBrD;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,EAAE,CAsC1E"}
package/dist/health.js CHANGED
@@ -36,7 +36,7 @@ export function checkConfigHealth() {
36
36
  const ottoJson = fs.existsSync(ottoJsonPath) ? "ok" : "missing";
37
37
  const config = state.status === "ok" ? state.config : {};
38
38
  const configuredPlugins = config.plugin ?? [];
39
- const memoryPluginEnabled = configuredPlugins.includes("opencode-agent-memory");
39
+ const memoryPluginEnabled = configuredPlugins.includes("mempalace");
40
40
  const subagentPolicyInjected = subagentPolicyInjectedInPrompts(config);
41
41
  // Read Otto config from otto.json (separate from opencode.json)
42
42
  const ottoConfig = readOttoConfig();
@@ -75,4 +75,43 @@ export function checkDirectoryHealth() {
75
75
  }
76
76
  return results;
77
77
  }
78
+ export function checkTenantHealth(input) {
79
+ const results = [];
80
+ const { tenantPath } = input;
81
+ if (fs.existsSync(tenantPath)) {
82
+ results.push({ name: "tenant path", status: "ok", message: `exists: ${tenantPath}` });
83
+ }
84
+ else {
85
+ results.push({ name: "tenant path", status: "error", message: `missing: ${tenantPath}` });
86
+ return results;
87
+ }
88
+ const composePath = path.join(tenantPath, "compose.yml");
89
+ if (fs.existsSync(composePath)) {
90
+ results.push({ name: "compose.yml", status: "ok", message: "present" });
91
+ }
92
+ else {
93
+ results.push({ name: "compose.yml", status: "error", message: "missing — run `otto tenant init`" });
94
+ }
95
+ const memoryPath = path.join(tenantPath, "memory");
96
+ if (fs.existsSync(memoryPath)) {
97
+ try {
98
+ fs.accessSync(memoryPath, fs.constants.W_OK);
99
+ results.push({ name: "memory root", status: "ok", message: "writable" });
100
+ }
101
+ catch {
102
+ results.push({ name: "memory root", status: "error", message: "not writable" });
103
+ }
104
+ }
105
+ else {
106
+ results.push({ name: "memory root", status: "error", message: "missing — run `otto tenant init`" });
107
+ }
108
+ const projectsPath = path.join(tenantPath, "projects");
109
+ if (fs.existsSync(projectsPath)) {
110
+ results.push({ name: "projects mount", status: "ok", message: "present" });
111
+ }
112
+ else {
113
+ results.push({ name: "projects mount", status: "warn", message: "missing — will be created on first up" });
114
+ }
115
+ return results;
116
+ }
78
117
  //# sourceMappingURL=health.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,12 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
1
4
  import { describe, expect, it } from "vitest";
2
- import { checkPackagePresence, checkConfigHealth, checkDirectoryHealth, } from "./health.js";
5
+ import { checkPackagePresence, checkConfigHealth, checkDirectoryHealth, checkTenantHealth, } from "./health.js";
3
6
  describe("health", () => {
4
7
  it("checkPackagePresence returns results for all manifest packages", { timeout: 30_000 }, () => {
5
8
  const results = checkPackagePresence();
6
- expect(results).toHaveLength(2); // opencode-ai + kimaki (not opencode-agent-memory — it's a plugin)
9
+ expect(results).toHaveLength(2); // opencode-ai + kimaki (not mempalace — it's a plugin)
7
10
  for (const r of results) {
8
11
  expect(r).toHaveProperty("name");
9
12
  expect(r).toHaveProperty("installed");
@@ -29,5 +32,21 @@ describe("health", () => {
29
32
  expect(Array.isArray(results)).toBe(true);
30
33
  expect(results.length).toBeGreaterThan(0);
31
34
  });
35
+ it("checkTenantHealth reports missing memory bind root as error", () => {
36
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "otto-health-"));
37
+ const health = checkTenantHealth({ tenantPath: tmpDir });
38
+ const memoryItem = health.find((h) => h.name === "memory root");
39
+ expect(memoryItem).toBeDefined();
40
+ expect(memoryItem.status).toBe("error");
41
+ });
42
+ it("checkTenantHealth reports ok when all paths present", () => {
43
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "otto-health-"));
44
+ fs.mkdirSync(path.join(tmpDir, "memory"));
45
+ fs.mkdirSync(path.join(tmpDir, "projects"));
46
+ fs.writeFileSync(path.join(tmpDir, "compose.yml"), "services:", "utf-8");
47
+ const health = checkTenantHealth({ tenantPath: tmpDir });
48
+ const errors = health.filter((h) => h.status === "error");
49
+ expect(errors).toHaveLength(0);
50
+ });
32
51
  });
33
52
  //# sourceMappingURL=health.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.test.js","sourceRoot":"","sources":["../src/health.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,aAAa,CAAA;AAEpB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,gEAAgE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE;QAC7F,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAA;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA,CAAC,mEAAmE;QACnG,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;YAChC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;YACrC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QACpC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAA;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAA;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,gCAAgC,CAAC,CAAA;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAA;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;QAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAA;QACtC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"health.test.js","sourceRoot":"","sources":["../src/health.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,7 +6,15 @@ export { mergePlugins, readOttoConfig, writeOttoConfig, OTTO_DEFAULTS, buildSuba
6
6
  export type { OpenCodeConfig, OttoConfig, OttoSubagentThreads, OttoConfigReadStatus, OpenCodeConfigReadStatus } from "./config.js";
7
7
  export { installPackage, upgradePackage, installMissingPackages, planStableUpgrades } from "./installer.js";
8
8
  export type { UpgradeMode } from "./installer.js";
9
- export { hasKimakiBinary, isKimakiRunning, restartKimaki } from "./lifecycle.js";
10
- export { checkPackagePresence, checkConfigHealth, checkDirectoryHealth } from "./health.js";
11
- export type { HealthResult, PackageCheck, ConfigHealth } from "./health.js";
9
+ export { hasKimakiBinary, isKimakiRunning, restartKimaki, detectBinary } from "./lifecycle.js";
10
+ export { checkPackagePresence, checkConfigHealth, checkDirectoryHealth, checkTenantHealth } from "./health.js";
11
+ export type { HealthResult, PackageCheck, ConfigHealth, TenantHealthInput } from "./health.js";
12
+ export { OPENCODE_SKILLS_DIR, SKILLS_INDEX_PATH, DEFAULT_SKILL_REPOS, parseSkillMd, loadSkillsIndex, saveSkillsIndex, isIndexStale, ensureSkillsIndex, searchSkills, getAllIndexedSkills, fetchRepoSkillsIndex, ghApi, fetchRepoDir, fetchRepoFile, listInstalledSkills, installSkillFromIndex, installSkillsBaseline, removeSkill, getConfiguredRepos, } from "./skills.js";
13
+ export type { SkillMeta, SkillIndexEntry, SkillsIndex, RepoSyncResult } from "./skills.js";
14
+ export { GENTLEMAN_SKILLS_BASELINE } from "./skills-baseline.js";
15
+ export type { SkillsBootstrapReport } from "./skills-baseline.js";
16
+ export { deriveComposeProjectName, resolveTenantImage, resolveTenantMode, ensureTenantMemoryLayout, ensureTenantScaffold, } from "./tenant.js";
17
+ export type { TenantMode, TenantInitResult } from "./tenant.js";
18
+ export { buildComposeCommand, runCompose } from "./docker.js";
19
+ export type { DockerComposeCommand } from "./docker.js";
12
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAClI,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC3G,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAC3F,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAClI,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC3G,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC9F,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC9G,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC9F,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EACX,kBAAkB,GACnB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChE,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7D,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA"}
package/dist/index.js CHANGED
@@ -6,6 +6,10 @@ export { MANIFEST, OPENCODE_CONFIG_DIR, KIMAKI_DATA_DIR } from "./manifest.js";
6
6
  export { getInstalledVersion, detectPackage } from "./detect.js";
7
7
  export { mergePlugins, readOttoConfig, writeOttoConfig, OTTO_DEFAULTS, buildSubagentThreadPolicy, mergeAgentPrompts, ensureSubagentThreadSkill, readOpenCodeConfig, readOpenCodeConfigState, writeOpenCodeConfig, ensureAgentMemoryConfig, } from "./config.js";
8
8
  export { installPackage, upgradePackage, installMissingPackages, planStableUpgrades } from "./installer.js";
9
- export { hasKimakiBinary, isKimakiRunning, restartKimaki } from "./lifecycle.js";
10
- export { checkPackagePresence, checkConfigHealth, checkDirectoryHealth } from "./health.js";
9
+ export { hasKimakiBinary, isKimakiRunning, restartKimaki, detectBinary } from "./lifecycle.js";
10
+ export { checkPackagePresence, checkConfigHealth, checkDirectoryHealth, checkTenantHealth } from "./health.js";
11
+ export { OPENCODE_SKILLS_DIR, SKILLS_INDEX_PATH, DEFAULT_SKILL_REPOS, parseSkillMd, loadSkillsIndex, saveSkillsIndex, isIndexStale, ensureSkillsIndex, searchSkills, getAllIndexedSkills, fetchRepoSkillsIndex, ghApi, fetchRepoDir, fetchRepoFile, listInstalledSkills, installSkillFromIndex, installSkillsBaseline, removeSkill, getConfiguredRepos, } from "./skills.js";
12
+ export { GENTLEMAN_SKILLS_BASELINE } from "./skills-baseline.js";
13
+ export { deriveComposeProjectName, resolveTenantImage, resolveTenantMode, ensureTenantMemoryLayout, ensureTenantScaffold, } from "./tenant.js";
14
+ export { buildComposeCommand, runCompose } from "./docker.js";
11
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,CAAC,OAAO,CAAA;AACzB,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAE3G,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,CAAC,OAAO,CAAA;AACzB,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAE3G,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC9F,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE9G,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EACX,kBAAkB,GACnB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAEhE,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA"}
@@ -13,8 +13,8 @@ describe("installer", () => {
13
13
  const result = installMissingPackages(getInstalled, install);
14
14
  expect(result).toContain("opencode-ai");
15
15
  expect(result).not.toContain("kimaki");
16
- // opencode-agent-memory is a plugin, not a global npm package
17
- expect(result).not.toContain("opencode-agent-memory");
16
+ // mempalace is a plugin, not a global npm package
17
+ expect(result).not.toContain("mempalace");
18
18
  });
19
19
  it("planStableUpgrades returns empty when all packages match pinned", () => {
20
20
  const pinned = { a: "1.0.0", b: "2.0.0" };
@@ -1 +1 @@
1
- {"version":3,"file":"installer.test.js","sourceRoot":"","sources":["../src/installer.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installer.test.js","sourceRoot":"","sources":["../src/installer.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Detect the first available binary name from BIN_NAMES.
3
+ * Returns the binary name ("bridge" | "kimaki") or null if none found.
4
+ */
5
+ export declare function detectBinary(): string | null;
6
+ /** @deprecated Use detectBinary() instead. Returns true if any known binary exists. */
1
7
  export declare function hasKimakiBinary(): boolean;
2
8
  export declare function isKimakiRunning(): boolean;
3
9
  export declare function restartKimaki(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAED,wBAAgB,aAAa,IAAI,IAAI,CASpC"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAU5C;AAED,uFAAuF;AACvF,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAQzC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAYpC"}
package/dist/lifecycle.js CHANGED
@@ -1,16 +1,30 @@
1
1
  import { execSync } from "node:child_process";
2
- export function hasKimakiBinary() {
3
- try {
4
- execSync("which kimaki", { encoding: "utf-8", stdio: "pipe" });
5
- return true;
6
- }
7
- catch {
8
- return false;
2
+ /** Ordered list of binary names to try — bridge is the otto fork, kimaki is upstream. */
3
+ const BIN_NAMES = ["bridge", "kimaki"];
4
+ /**
5
+ * Detect the first available binary name from BIN_NAMES.
6
+ * Returns the binary name ("bridge" | "kimaki") or null if none found.
7
+ */
8
+ export function detectBinary() {
9
+ for (const name of BIN_NAMES) {
10
+ try {
11
+ execSync(`which ${name}`, { encoding: "utf-8", stdio: "pipe" });
12
+ return name;
13
+ }
14
+ catch {
15
+ continue;
16
+ }
9
17
  }
18
+ return null;
19
+ }
20
+ /** @deprecated Use detectBinary() instead. Returns true if any known binary exists. */
21
+ export function hasKimakiBinary() {
22
+ return detectBinary() !== null;
10
23
  }
11
24
  export function isKimakiRunning() {
25
+ // Check for both process names — "bridge" (otto fork) and "kimaki" (upstream)
12
26
  try {
13
- const output = execSync("pgrep -f kimaki", { encoding: "utf-8", stdio: "pipe" });
27
+ const output = execSync("pgrep -f 'kimaki|bridge'", { encoding: "utf-8", stdio: "pipe" });
14
28
  return output.trim().length > 0;
15
29
  }
16
30
  catch {
@@ -18,10 +32,11 @@ export function isKimakiRunning() {
18
32
  }
19
33
  }
20
34
  export function restartKimaki() {
21
- if (!hasKimakiBinary()) {
22
- throw new Error("kimaki is not installed. Install it first with: npm install -g kimaki");
35
+ const bin = detectBinary();
36
+ if (!bin) {
37
+ throw new Error("Neither 'bridge' nor 'kimaki' binary found. Install with: npm install -g @otto-assistant/bridge");
23
38
  }
24
- execSync("kimaki restart", {
39
+ execSync(`${bin} restart`, {
25
40
  encoding: "utf-8",
26
41
  stdio: "pipe",
27
42
  timeout: 30_000,
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9D,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAChF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;IAC1F,CAAC;IACD,QAAQ,CAAC,gBAAgB,EAAE;QACzB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,MAAM;KAChB,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,yFAAyF;AACzF,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAU,CAAA;AAE/C;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAC/D,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,EAAE,KAAK,IAAI,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACzF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAA;IAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAA;IACH,CAAC;IACD,QAAQ,CAAC,GAAG,GAAG,UAAU,EAAE;QACzB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,MAAM;KAChB,CAAC,CAAA;AACJ,CAAC"}
@@ -1,6 +1,10 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { hasKimakiBinary, isKimakiRunning, restartKimaki } from "./lifecycle.js";
2
+ import { hasKimakiBinary, isKimakiRunning, restartKimaki, detectBinary } from "./lifecycle.js";
3
3
  describe("lifecycle", () => {
4
+ it("detectBinary returns string or null", () => {
5
+ const result = detectBinary();
6
+ expect(result === null || typeof result === "string").toBe(true);
7
+ });
4
8
  it("hasKimakiBinary returns boolean", () => {
5
9
  const result = hasKimakiBinary();
6
10
  expect(typeof result).toBe("boolean");
@@ -12,8 +16,5 @@ describe("lifecycle", () => {
12
16
  it("restartKimaki is a function", () => {
13
17
  expect(typeof restartKimaki).toBe("function");
14
18
  });
15
- it("restartKimaki throws descriptive error when kimaki not found", () => {
16
- expect(typeof restartKimaki).toBe("function");
17
- });
18
19
  });
19
20
  //# sourceMappingURL=lifecycle.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.test.js","sourceRoot":"","sources":["../src/lifecycle.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEhF,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;QAChC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;QAChC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"lifecycle.test.js","sourceRoot":"","sources":["../src/lifecycle.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE9F,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;QAC7B,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;QAChC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;QAChC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/dist/manifest.js CHANGED
@@ -1,15 +1,15 @@
1
1
  export const MANIFEST = {
2
- version: "0.1.0",
2
+ version: "0.1.1",
3
3
  packages: {
4
4
  "opencode-ai": ">=1.0.115",
5
- "@otto-assistant/bridge": ">=0.4.90",
5
+ "@otto-assistant/bridge": ">=0.6.0",
6
6
  },
7
7
  pinned: {
8
8
  "opencode-ai": "1.2.20",
9
- "@otto-assistant/bridge": "0.4.90",
9
+ "@otto-assistant/bridge": "0.6.2",
10
10
  },
11
11
  plugins: [
12
- "opencode-agent-memory",
12
+ "mempalace",
13
13
  ],
14
14
  };
15
15
  /** Upstream repositories for sync tracking */
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,QAAQ,GAAa;IAChC,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE;QACR,aAAa,EAAE,WAAW;QAC1B,wBAAwB,EAAE,UAAU;KACrC;IACD,MAAM,EAAE;QACN,aAAa,EAAE,QAAQ;QACvB,wBAAwB,EAAE,QAAQ;KACnC;IACD,OAAO,EAAE;QACP,uBAAuB;KACxB;CACF,CAAA;AAED,8CAA8C;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAuD;IAChF,wBAAwB,EAAE;QACxB,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,iBAAiB;KAC5B;CACF,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAW,EAAE;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAA;IACnE,OAAO,GAAG,IAAI,mBAAmB,CAAA;AACnC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,GAAW,EAAE;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAA;IACnE,OAAO,GAAG,IAAI,UAAU,CAAA;AAC1B,CAAC,CAAA"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,QAAQ,GAAa;IAChC,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE;QACR,aAAa,EAAE,WAAW;QAC1B,wBAAwB,EAAE,SAAS;KACpC;IACD,MAAM,EAAE;QACN,aAAa,EAAE,QAAQ;QACvB,wBAAwB,EAAE,OAAO;KAClC;IACD,OAAO,EAAE;QACP,WAAW;KACZ;CACF,CAAA;AAED,8CAA8C;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAuD;IAChF,wBAAwB,EAAE;QACxB,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,iBAAiB;KAC5B;CACF,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAW,EAAE;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAA;IACnE,OAAO,GAAG,IAAI,mBAAmB,CAAA;AACnC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,GAAW,EAAE;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAA;IACnE,OAAO,GAAG,IAAI,UAAU,CAAA;AAC1B,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ export declare const GENTLEMAN_SKILLS_BASELINE: string[];
2
+ export interface SkillsBootstrapReport {
3
+ installed: string[];
4
+ alreadyPresent: string[];
5
+ failed: string[];
6
+ }
7
+ //# sourceMappingURL=skills-baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-baseline.d.ts","sourceRoot":"","sources":["../src/skills-baseline.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,EAAE,MAAM,EAO7C,CAAA;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB"}
@@ -0,0 +1,9 @@
1
+ export const GENTLEMAN_SKILLS_BASELINE = [
2
+ "critique",
3
+ "security-review",
4
+ "simplify",
5
+ "opensrc",
6
+ "playwriter",
7
+ "tuistory",
8
+ ];
9
+ //# sourceMappingURL=skills-baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-baseline.js","sourceRoot":"","sources":["../src/skills-baseline.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAa;IACjD,UAAU;IACV,iBAAiB;IACjB,UAAU;IACV,SAAS;IACT,YAAY;IACZ,UAAU;CACX,CAAA"}
@@ -0,0 +1,110 @@
1
+ /** Where the JSON index lives */
2
+ export declare const SKILLS_INDEX_PATH: () => string;
3
+ /** Where installed skills go */
4
+ export declare const OPENCODE_SKILLS_DIR: () => string;
5
+ /** Default skill repos — curated, known to have quality skills */
6
+ export declare const DEFAULT_SKILL_REPOS: string[];
7
+ export interface SkillMeta {
8
+ name: string;
9
+ description: string;
10
+ metadata?: Record<string, string>;
11
+ }
12
+ /** One entry in the skills index */
13
+ export interface SkillIndexEntry {
14
+ name: string;
15
+ description: string;
16
+ metadata?: Record<string, string>;
17
+ source: string;
18
+ path: string;
19
+ }
20
+ /** The full on-disk index */
21
+ export interface SkillsIndex {
22
+ version: number;
23
+ updated: string;
24
+ repos: Record<string, {
25
+ fetched: string;
26
+ skills: SkillIndexEntry[];
27
+ }>;
28
+ }
29
+ export type RepoSyncResult = "updated" | "cached" | "offline";
30
+ /**
31
+ * Parses YAML frontmatter from skill markdown content.
32
+ * Returns null if no valid frontmatter or missing required fields (name, description).
33
+ */
34
+ export declare function parseSkillMd(content: string): SkillMeta | null;
35
+ /** Lists installed skills from OPENCODE_SKILLS_DIR. */
36
+ export declare function listInstalledSkills(baseDir?: string): SkillMeta[];
37
+ /**
38
+ * Removes an installed skill directory.
39
+ * Returns true if removed, false if not found.
40
+ */
41
+ export declare function removeSkill(name: string, targetDir?: string): boolean;
42
+ /**
43
+ * Call GitHub API using `gh api`. Returns parsed JSON.
44
+ * Throws on network/auth errors or non-2xx responses.
45
+ */
46
+ export declare function ghApi(endpoint: string): unknown;
47
+ /**
48
+ * Fetch directory listing from a GitHub repo path.
49
+ * Returns array of {name, type, path} entries, or empty array on error.
50
+ */
51
+ export declare function fetchRepoDir(ownerRepo: string, dirPath: string): Array<{
52
+ name: string;
53
+ type: string;
54
+ path: string;
55
+ }>;
56
+ /**
57
+ * Fetch a single file content from a GitHub repo.
58
+ * Returns decoded UTF-8 string, or null on error.
59
+ */
60
+ export declare function fetchRepoFile(ownerRepo: string, filePath: string): string | null;
61
+ /** Load index from disk. Returns empty index if file doesn't exist. */
62
+ export declare function loadSkillsIndex(indexPath?: string): SkillsIndex;
63
+ /** Save index to disk. */
64
+ export declare function saveSkillsIndex(index: SkillsIndex, indexPath?: string): void;
65
+ /** Check if a fetched timestamp is older than maxAgeHours. */
66
+ export declare function isIndexStale(fetchedAt: string, maxAgeHours?: number): boolean;
67
+ /**
68
+ * Index all skills from a single GitHub repo by fetching directory listings + SKILL.md frontmatter.
69
+ * Works with repos that have skills at `skills/<name>/SKILL.md` (flat or nested one level).
70
+ * Returns array of SkillIndexEntry.
71
+ */
72
+ export declare function fetchRepoSkillsIndex(ownerRepo: string): SkillIndexEntry[];
73
+ /**
74
+ * Search indexed skills by query. Matches against name and description (case-insensitive).
75
+ */
76
+ export declare function searchSkills(query: string, indexPath?: string): SkillIndexEntry[];
77
+ /**
78
+ * Get all indexed skills across all repos.
79
+ */
80
+ export declare function getAllIndexedSkills(indexPath?: string): SkillIndexEntry[];
81
+ /**
82
+ * Get configured repos: DEFAULT_SKILL_REPOS + any user-added repos.
83
+ */
84
+ export declare function getConfiguredRepos(): string[];
85
+ /**
86
+ * Refresh the skills index by fetching all configured repos.
87
+ * Skips repos that were fetched recently (within maxAgeHours).
88
+ * Returns the number of repos refreshed.
89
+ */
90
+ export declare function ensureSkillsIndex(maxAgeHours?: number, indexPath?: string): {
91
+ refreshed: number;
92
+ total: number;
93
+ };
94
+ /**
95
+ * Install a skill from the index by fetching its files from GitHub API.
96
+ * Looks up the skill in the index, fetches SKILL.md (and any supporting files),
97
+ * writes them to the target directory.
98
+ *
99
+ * Returns true if installed, false if not found in index or fetch failed.
100
+ */
101
+ export declare function installSkillFromIndex(skillName: string, targetDir?: string, indexPath?: string): boolean;
102
+ /**
103
+ * Install a baseline list of skills without removing user-installed ones.
104
+ */
105
+ export declare function installSkillsBaseline(skillNames: string[], targetDir?: string, indexPath?: string): {
106
+ installed: string[];
107
+ alreadyPresent: string[];
108
+ failed: string[];
109
+ };
110
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}