@aerovato/operator-helper 1.7.1 → 1.9.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.
Files changed (3) hide show
  1. package/README.md +14 -8
  2. package/dist/index.js +157 -20
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -4,7 +4,7 @@ Operator Memory: Durable context for agent-driven development.
4
4
 
5
5
  Operator Helper installs and manages Operator Memory, an agent-driven development framework that turns agent work into lasting project knowledge through continuous documentation.
6
6
 
7
- ## Install
7
+ ### Install
8
8
 
9
9
  Operator Helper requires Node.js 20 or newer.
10
10
 
@@ -21,22 +21,27 @@ bun add --global --minimum-release-age 0 @aerovato/operator-helper@latest
21
21
  Install an adapter:
22
22
 
23
23
  ```sh
24
- # OpenCode 2
25
- operator-helper install opencode-v2
24
+ # OpenCode (V2)
25
+ operator-helper install opencode
26
26
 
27
27
  # OpenCode 1 (legacy)
28
- operator-helper install opencode
28
+ operator-helper install opencode-v1
29
29
 
30
30
  # Pi
31
31
  operator-helper install pi
32
32
 
33
33
  # DeepSeek Harness
34
34
  operator-helper install deepseek
35
+
36
+ # Kiro
37
+ operator-helper install kiro
35
38
  ```
36
39
 
40
+ OpenCode defaults to V2; `install opencode-v1` is the explicit legacy route. Existing plugin registrations are not migrated automatically.
41
+
37
42
  Restart the harness, then run `/operator:user-init` in a new conversation to begin setup.
38
43
 
39
- ## Usage
44
+ ### Usage
40
45
 
41
46
  Users interact with Operator through the harness commands `/operator:user-init`, `/operator:project-init`, `/operator:index`, and `/operator:repair`. These commands guide the working agent, which uses Operator Helper for setup, status, validation, and repair mechanics.
42
47
 
@@ -46,17 +51,18 @@ The direct user-facing Helper operation is adapter installation:
46
51
 
47
52
  ```sh
48
53
  operator-helper install opencode
49
- operator-helper install opencode-v2
54
+ operator-helper install opencode-v1
50
55
  operator-helper install pi
51
56
  operator-helper install deepseek
57
+ operator-helper install kiro
52
58
  ```
53
59
 
54
60
  Operator Helper automatically checks for and installs updates when commands run. If it cannot determine whether Bun or npm owns the global installation, it asks for a manual update using the original installation method.
55
61
 
56
- ## Documentation
62
+ ### Documentation
57
63
 
58
64
  - [Overview and setup](https://github.com/aerovato/operator-memory#readme)
59
- - [Workflow](https://github.com/aerovato/operator-memory/blob/main/docs/workflow.md)
65
+ - [Getting Started](https://github.com/aerovato/operator-memory/blob/main/docs/getting-started.md)
60
66
  - [Architecture](https://github.com/aerovato/operator-memory/blob/main/docs/architecture.md)
61
67
  - [Troubleshooting](https://github.com/aerovato/operator-memory/blob/main/docs/troubleshooting.md)
62
68
 
package/dist/index.js CHANGED
@@ -15319,7 +15319,7 @@ var log = (...args) => consoleWith((console2) => sync(() => {
15319
15319
  // package.json
15320
15320
  var package_default = {
15321
15321
  name: "@aerovato/operator-helper",
15322
- version: "1.7.1",
15322
+ version: "1.9.0",
15323
15323
  description: "Installation and setup CLI for Operator Memory",
15324
15324
  license: "BSD-3-Clause",
15325
15325
  author: "Aerovato Research",
@@ -15882,17 +15882,20 @@ operator-helper install claude-code
15882
15882
  # Install Codex plugin
15883
15883
  operator-helper install codex
15884
15884
 
15885
- # Install OpenCode V2 plugin
15886
- operator-helper install opencode-v2
15887
-
15888
15885
  # Install OpenCode plugin
15889
15886
  operator-helper install opencode
15890
15887
 
15888
+ # Install legacy OpenCode V1 plugin
15889
+ operator-helper install opencode-v1
15890
+
15891
15891
  # Install Pi plugin
15892
15892
  operator-helper install pi
15893
15893
 
15894
15894
  # Install DeepSeek Harness plugin
15895
15895
  operator-helper install deepseek
15896
+
15897
+ # Install Kiro adapter
15898
+ operator-helper install kiro
15896
15899
  \`\`\`
15897
15900
  `;
15898
15901
 
@@ -16674,6 +16677,136 @@ function profileResult(profile, result) {
16674
16677
  return { exitCode: 0, output: `✓ ${label}: ${result.output || "Plugin installed"}` };
16675
16678
  }
16676
16679
 
16680
+ // src/commands/install/kiro.ts
16681
+ import { mkdir as mkdir3, writeFile as writeFile4 } from "node:fs/promises";
16682
+ import { dirname as dirname2, join as join3 } from "node:path";
16683
+
16684
+ // src/templates/kiro.ts
16685
+ var HOOK = `${JSON.stringify({
16686
+ version: "v1",
16687
+ hooks: [
16688
+ {
16689
+ name: "Operator Memory preamble",
16690
+ trigger: "SessionStart",
16691
+ action: { type: "command", command: "operator-helper preamble" },
16692
+ timeout: 120,
16693
+ enabled: true
16694
+ }
16695
+ ]
16696
+ }, null, 2)}
16697
+ `;
16698
+ var STEERING = `---
16699
+ inclusion: always
16700
+ ---
16701
+
16702
+ # Operator Memory
16703
+
16704
+ Operator Memory is installed for Kiro. If you do not see Operator's preamble guidance above wrapped within \`<operator-guidance>\`, manually run the \`operator-helper preamble\` command once from the workspace root and follow all instructions from the command output. If the command fails, report to the user and stop. Do not run if the preamble is already available.
16705
+ `;
16706
+ var RECOVERY = (command) => `## Recovery
16707
+
16708
+ - If Helper cannot start, install or repair the npm package \`@aerovato/operator-helper\` globally and retry the failed command.
16709
+ - If the version check or upgrade fails, diagnose the error and retry.
16710
+ - If \`operator-helper ${command}\` reports a failure, use its output to resolve it and rerun it as needed.
16711
+ - If you cannot resolve a problem, report the blocker.
16712
+
16713
+ Use Helper output as working context. Do not reproduce it wholesale or reimplement Helper logic.
16714
+ `;
16715
+ var USER_INIT = `---
16716
+ name: operator-user-init
16717
+ description: Initialize and configure the Operator User Partition. Use only when the user invokes /operator-user-init.
16718
+ ---
16719
+
16720
+ # Operator User Setup
16721
+
16722
+ 1. Run \`operator-helper version\`. If an update is available, run \`operator-helper upgrade\` before continuing.
16723
+ 2. Run \`operator-helper user init\` and follow the emitted User Setup guide, including when initialization reports failures.
16724
+
16725
+ ${RECOVERY("user init")}`;
16726
+ var PROJECT_INIT = `---
16727
+ name: operator-project-init
16728
+ description: Initialize and configure the Operator Project Brain. Use only when the user invokes /operator-project-init.
16729
+ ---
16730
+
16731
+ # Operator Project Setup
16732
+
16733
+ 1. Run \`operator-helper version\`. If an update is available, run \`operator-helper upgrade\` before continuing.
16734
+ 2. Run \`operator-helper project init\` and follow the emitted Project Setup guide, including when initialization reports failures.
16735
+
16736
+ For a new conversation to set up the Project Index, tell the user to invoke \`/operator-index\`.
16737
+
16738
+ ${RECOVERY("project init")}`;
16739
+ var INDEX = `---
16740
+ name: operator-index
16741
+ description: Build or refresh the Operator Project Index. Use only when the user invokes /operator-index.
16742
+ ---
16743
+
16744
+ # Operator Project Index Setup
16745
+
16746
+ 1. Run \`operator-helper version\`. If an update is available, run \`operator-helper upgrade\` before continuing.
16747
+ 2. Run \`operator-helper index init\` and follow the emitted Project Index Setup guide, including when inspection reports failures.
16748
+
16749
+ If the Project Brain is missing, tell the user to invoke \`/operator-project-init\` to set it up.
16750
+
16751
+ ${RECOVERY("index init")}`;
16752
+ var REPAIR = `---
16753
+ name: operator-repair
16754
+ description: Diagnose and repair Operator memory load failures. Use only when the user invokes /operator-repair.
16755
+ ---
16756
+
16757
+ # Operator Memory Repair
16758
+
16759
+ 1. Run \`operator-helper version\`. If an update is available, run \`operator-helper upgrade\` before continuing.
16760
+ 2. Run \`operator-helper memory check\`. If no issues are detected, stop. Otherwise, repair only the reported load failures without initializing absent partitions. Rerun \`operator-helper memory check\` to confirm the repair, then read the applicable Operator memory documents.
16761
+
16762
+ If \`~/.kiro/hooks/operator-memory.json\` or \`~/.kiro/steering/operator-memory.md\` is missing, tell the user to run \`operator-helper install kiro\` and start a new session.
16763
+
16764
+ ${RECOVERY("memory check")}`;
16765
+ var KIRO_FILES = [
16766
+ { path: "hooks/operator-memory.json", content: HOOK },
16767
+ { path: "steering/operator-memory.md", content: STEERING },
16768
+ { path: "skills/operator-user-init/SKILL.md", content: USER_INIT },
16769
+ { path: "skills/operator-project-init/SKILL.md", content: PROJECT_INIT },
16770
+ { path: "skills/operator-index/SKILL.md", content: INDEX },
16771
+ { path: "skills/operator-repair/SKILL.md", content: REPAIR }
16772
+ ];
16773
+
16774
+ // src/commands/install/kiro.ts
16775
+ var installKiro = fn2("installKiro")(function* (context) {
16776
+ const helper = yield* runProcess("operator-helper", ["help"], context.cwd, null);
16777
+ if (!helper.ok) {
16778
+ return { exitCode: 1, output: `✗ Operator Helper must be available on PATH: ${helper.error}` };
16779
+ }
16780
+ if (helper.exitCode !== 0) {
16781
+ return {
16782
+ exitCode: helper.exitCode,
16783
+ output: helper.output || "Operator Helper must be available on PATH"
16784
+ };
16785
+ }
16786
+ return yield* writeKiroFiles(join3(context.home, ".kiro"));
16787
+ });
16788
+ function writeKiroFiles(kiroHome) {
16789
+ return promise2(async () => {
16790
+ try {
16791
+ for (const file of KIRO_FILES) {
16792
+ const path = join3(kiroHome, file.path);
16793
+ await mkdir3(dirname2(path), { recursive: true });
16794
+ await writeFile4(path, file.content);
16795
+ }
16796
+ } catch (error) {
16797
+ return {
16798
+ exitCode: 1,
16799
+ output: `✗ Could not install the Kiro adapter: ${getErrorMessage(error)}`
16800
+ };
16801
+ }
16802
+ return {
16803
+ exitCode: 0,
16804
+ output: `✓ Kiro adapter installed in ${kiroHome}
16805
+ Start a new Kiro session.`
16806
+ };
16807
+ });
16808
+ }
16809
+
16677
16810
  // src/commands/install/opencode.ts
16678
16811
  var OPENCODE_PLUGIN = "@aerovato/operator-opencode@latest";
16679
16812
  var installOpenCode = fn2("installOpenCode")(function* (context) {
@@ -16730,7 +16863,7 @@ var installPi = fn2("installPi")(function* (context) {
16730
16863
  import { resolve as resolve2 } from "node:path";
16731
16864
 
16732
16865
  // ../core/src/memory/project.ts
16733
- import { extname, join as join3, relative, sep } from "node:path";
16866
+ import { extname, join as join4, relative, sep } from "node:path";
16734
16867
 
16735
16868
  // ../core/src/utils.ts
16736
16869
  function success(value) {
@@ -16844,13 +16977,13 @@ async function loadProjectPartition(root, loadFiles) {
16844
16977
  return hasNodeErrorCode(directory.error.cause, "ENOENT") ? success(loadFiles ? { exists: false, operatorInstructions: null, catalog: null, indexes: [] } : { exists: false }) : directory;
16845
16978
  }
16846
16979
  if (!loadFiles) {
16847
- for (const path of [join3(root, "operator.md"), join3(root, "catalog.md")]) {
16980
+ for (const path of [join4(root, "operator.md"), join4(root, "catalog.md")]) {
16848
16981
  const file = await checkOptionalReadableFile(path);
16849
16982
  if (!file.ok) {
16850
16983
  return file;
16851
16984
  }
16852
16985
  }
16853
- const indexRoot = join3(root, "index");
16986
+ const indexRoot = join4(root, "index");
16854
16987
  const indexPaths = await listMarkdownFiles(indexRoot, indexRoot);
16855
16988
  if (!indexPaths.ok) {
16856
16989
  return indexPaths;
@@ -16863,15 +16996,15 @@ async function loadProjectPartition(root, loadFiles) {
16863
16996
  }
16864
16997
  return success({ exists: true });
16865
16998
  }
16866
- const operatorInstructions = await readOptionalContent(join3(root, "operator.md"));
16999
+ const operatorInstructions = await readOptionalContent(join4(root, "operator.md"));
16867
17000
  if (!operatorInstructions.ok) {
16868
17001
  return operatorInstructions;
16869
17002
  }
16870
- const catalog = await readOptionalContent(join3(root, "catalog.md"));
17003
+ const catalog = await readOptionalContent(join4(root, "catalog.md"));
16871
17004
  if (!catalog.ok) {
16872
17005
  return catalog;
16873
17006
  }
16874
- const indexes = await readIndexes(join3(root, "index"));
17007
+ const indexes = await readIndexes(join4(root, "index"));
16875
17008
  if (!indexes.ok) {
16876
17009
  return indexes;
16877
17010
  }
@@ -16909,7 +17042,7 @@ async function listMarkdownFiles(root, directory) {
16909
17042
  }
16910
17043
  const paths = [];
16911
17044
  for (const entry of entries.value) {
16912
- const path = join3(directory, entry.name);
17045
+ const path = join4(directory, entry.name);
16913
17046
  if (entry.isDirectory()) {
16914
17047
  const nestedPaths = await listMarkdownFiles(root, path);
16915
17048
  if (!nestedPaths.ok) {
@@ -16930,14 +17063,14 @@ function compareStrings2(left, right) {
16930
17063
  }
16931
17064
 
16932
17065
  // ../core/src/memory/user.ts
16933
- import { join as join4 } from "node:path";
17066
+ import { join as join5 } from "node:path";
16934
17067
  async function loadUserPartition(root, loadFiles) {
16935
17068
  if (!loadFiles) {
16936
17069
  const directory = await readDirectory2(root);
16937
17070
  if (!directory.ok) {
16938
17071
  return hasNodeErrorCode(directory.error.cause, "ENOENT") ? success({ exists: false }) : directory;
16939
17072
  }
16940
- for (const path of [join4(root, "operator.md"), join4(root, "catalog.md")]) {
17073
+ for (const path of [join5(root, "operator.md"), join5(root, "catalog.md")]) {
16941
17074
  const file = await checkOptionalReadableFile(path);
16942
17075
  if (!file.ok) {
16943
17076
  return file;
@@ -16945,11 +17078,11 @@ async function loadUserPartition(root, loadFiles) {
16945
17078
  }
16946
17079
  return success({ exists: true });
16947
17080
  }
16948
- const operatorInstructions = await readOptionalContent(join4(root, "operator.md"));
17081
+ const operatorInstructions = await readOptionalContent(join5(root, "operator.md"));
16949
17082
  if (!operatorInstructions.ok) {
16950
17083
  return operatorInstructions;
16951
17084
  }
16952
- const catalog = await readOptionalContent(join4(root, "catalog.md"));
17085
+ const catalog = await readOptionalContent(join5(root, "catalog.md"));
16953
17086
  if (!catalog.ok) {
16954
17087
  return catalog;
16955
17088
  }
@@ -17904,11 +18037,12 @@ ${renderTable([
17904
18037
  ["version", "Show the installed version and check for updates"],
17905
18038
  ["upgrade", "Update Operator Helper to the latest release"],
17906
18039
  ["install codex", "Install or update the Codex plugin"],
17907
- ["install opencode", "Install or update the OpenCode plugin"],
17908
- ["install opencode-v2", "Install or update the OpenCode V2 plugin"],
18040
+ ["install opencode", "Install or update the OpenCode plugin (V2)"],
18041
+ ["install opencode-v1", "Install or update the legacy OpenCode V1 plugin"],
17909
18042
  ["install deepseek", "Install or update the DeepSeek Harness plugin"],
17910
18043
  ["install pi", "Install or update the Pi plugin"],
17911
- ["install claude-code", "Install or update the Claude Code plugin"]
18044
+ ["install claude-code", "Install or update the Claude Code plugin"],
18045
+ ["install kiro", "Install or update the Kiro adapter"]
17912
18046
  ])}
17913
18047
 
17914
18048
  AGENT COMMANDS
@@ -17962,13 +18096,16 @@ function runCli(arguments_, context) {
17962
18096
  case "install claude-code":
17963
18097
  return yield* installClaudeCode(context);
17964
18098
  case "install opencode":
17965
- return yield* installOpenCode(context);
17966
18099
  case "install opencode-v2":
17967
18100
  return yield* installOpenCodeV2(context);
18101
+ case "install opencode-v1":
18102
+ return yield* installOpenCode(context);
17968
18103
  case "install deepseek":
17969
18104
  return yield* installDeepSeek(context);
17970
18105
  case "install pi":
17971
18106
  return yield* installPi(context);
18107
+ case "install kiro":
18108
+ return yield* installKiro(context);
17972
18109
  case "user guide":
17973
18110
  case "project guide":
17974
18111
  case "index guide":
@@ -18007,4 +18144,4 @@ var main = gen2(function* () {
18007
18144
  }).pipe(provide4(LiveLayers));
18008
18145
  runMain2(main);
18009
18146
 
18010
- //# debugId=BD7F91EF8CB96E6A64756E2164756E21
18147
+ //# debugId=EFA6C78B3DF809B164756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aerovato/operator-helper",
3
- "version": "1.7.1",
3
+ "version": "1.9.0",
4
4
  "description": "Installation and setup CLI for Operator Memory",
5
5
  "license": "BSD-3-Clause",
6
6
  "author": "Aerovato Research",