@codecell-germany/company-agent-wiki-skill 0.1.2 → 0.1.4

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 CHANGED
@@ -9,7 +9,9 @@
9
9
  > Context is king.
10
10
 
11
11
  `company-agent-wiki-skill` is an agent-first local company knowledge toolkit.
12
- It ships as a real CLI plus a Codex-style skill payload, so an agent can set up a private company wiki, verify the index state, search knowledge, inspect metadata and headings first, and only then load full Markdown when needed.
12
+ It ships as a real CLI plus a shared agent skill payload, so an agent can set up a private company wiki, verify the index state, search knowledge, inspect metadata and headings first, and only then load full Markdown when needed.
13
+
14
+ The shared install layout is meant to work across agent environments that understand the common `~/.agents` skill home, including Codex through a compatibility shim and other skills.sh-style runtimes such as Claude Code or OpenClaw.
13
15
 
14
16
  The product surface is the public CLI:
15
17
 
@@ -44,9 +46,19 @@ The retrieval model is deliberately inspired by Anthropic's Agent Skills model w
44
46
  The difference is the retrieval layer.
45
47
  Here, front matter is not only stored in Markdown files, but also indexed and filterable through a local SQLite search layer.
46
48
 
49
+ ## Architecture visuals
50
+
51
+ ### Agentic knowledge ingestion
52
+
53
+ ![Agentic knowledge ingestion](https://cdn.codecell.de/codecell-intern/company-agent-wiki/data-ingestion.jpg)
54
+
55
+ ### Agent-first knowledge retrieval
56
+
57
+ ![Agent-first knowledge retrieval](https://cdn.codecell.de/codecell-intern/company-agent-wiki/data-retrieval.jpg)
58
+
47
59
  ## Installation
48
60
 
49
- ### 1. Install into Codex with one command
61
+ ### 1. Install with one command
50
62
 
51
63
  The preferred install path is:
52
64
 
@@ -56,19 +68,25 @@ npx -y -p @codecell-germany/company-agent-wiki-skill company-agent-wiki-skill in
56
68
 
57
69
  That installs:
58
70
 
59
- - the skill payload into `~/.codex/skills/company-agent-wiki-cli`
60
- - the runtime into `~/.codex/tools/company-agent-wiki-cli`
61
- - the CLI shim into `~/.codex/bin/company-agent-wiki-cli`
71
+ - the shared skill payload into `~/.agents/skills/company-agent-wiki-cli`
72
+ - the shared runtime into `~/.agents/tools/company-agent-wiki-cli`
73
+ - the shared CLI shim into `~/.agents/bin/company-agent-wiki-cli`
74
+ - the Codex compatibility shim into `~/.codex/bin/company-agent-wiki-cli`
75
+
76
+ The skill payload intentionally exists only once under `~/.agents/skills`.
77
+ Codex gets a CLI compatibility shim, but not a second duplicate skill payload.
62
78
 
63
79
  ### 2. Verify the CLI
64
80
 
65
81
  ```bash
66
82
  company-agent-wiki-cli --help
83
+ "$HOME/.agents/bin/company-agent-wiki-cli" --help
67
84
  "$CODEX_HOME/bin/company-agent-wiki-cli" --help
68
85
  "$HOME/.codex/bin/company-agent-wiki-cli" --help
69
86
  ```
70
87
 
71
- In Codex, the direct shim path is often the most reliable fallback.
88
+ For agent environments that use the shared `~/.agents` home, the direct shim path is often the most reliable fallback.
89
+ In Codex, the compatibility shim under `~/.codex/bin` also works.
72
90
 
73
91
  ### 3. Optional local repo workflow
74
92
 
@@ -144,6 +162,7 @@ If a fresh agent receives this skill, the correct order is:
144
162
 
145
163
  1. Verify the CLI path:
146
164
  - `company-agent-wiki-cli --help`
165
+ - `"$HOME/.agents/bin/company-agent-wiki-cli" --help`
147
166
  - `"$CODEX_HOME/bin/company-agent-wiki-cli" --help`
148
167
  - `"$HOME/.codex/bin/company-agent-wiki-cli" --help`
149
168
  2. If no workspace exists yet, create one with `setup workspace`.
@@ -197,6 +216,7 @@ status: draft
197
216
  tags:
198
217
  - projekt
199
218
  - alpha
219
+ description: Klare Kurzbeschreibung für Agenten, bevor der Volltext geladen wird.
200
220
  summary: Roadmap und Entscheidungen für Projekt Alpha.
201
221
  project: alpha
202
222
  department: entwicklung
@@ -211,7 +231,7 @@ Recommended authoring order:
211
231
 
212
232
  1. Create the Markdown file inside `knowledge/canonical/` or another registered managed root.
213
233
  2. Use a filename that roughly describes the real content.
214
- 3. Set front matter including `id`, `summary` and the routing fields that matter.
234
+ 3. Set front matter including `id`, `description`, `summary` and the routing fields that matter.
215
235
  4. If the content depends on external sources, document provenance, date and source type.
216
236
  5. Structure the file with clear `#`, `##` and `###` headings.
217
237
  6. Rebuild the index or use an `--auto-rebuild` retrieval path.
package/dist/index.js CHANGED
@@ -1189,7 +1189,7 @@ var require_command = __commonJS({
1189
1189
  "node_modules/commander/lib/command.js"(exports2) {
1190
1190
  var EventEmitter = require("node:events").EventEmitter;
1191
1191
  var childProcess = require("node:child_process");
1192
- var path9 = require("node:path");
1192
+ var path10 = require("node:path");
1193
1193
  var fs9 = require("node:fs");
1194
1194
  var process2 = require("node:process");
1195
1195
  var { Argument: Argument2, humanReadableArgName } = require_argument();
@@ -2202,9 +2202,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
2202
2202
  let launchWithNode = false;
2203
2203
  const sourceExt = [".js", ".ts", ".tsx", ".mjs", ".cjs"];
2204
2204
  function findFile(baseDir, baseName) {
2205
- const localBin = path9.resolve(baseDir, baseName);
2205
+ const localBin = path10.resolve(baseDir, baseName);
2206
2206
  if (fs9.existsSync(localBin)) return localBin;
2207
- if (sourceExt.includes(path9.extname(baseName))) return void 0;
2207
+ if (sourceExt.includes(path10.extname(baseName))) return void 0;
2208
2208
  const foundExt = sourceExt.find(
2209
2209
  (ext) => fs9.existsSync(`${localBin}${ext}`)
2210
2210
  );
@@ -2222,17 +2222,17 @@ Expecting one of '${allowedValues.join("', '")}'`);
2222
2222
  } catch {
2223
2223
  resolvedScriptPath = this._scriptPath;
2224
2224
  }
2225
- executableDir = path9.resolve(
2226
- path9.dirname(resolvedScriptPath),
2225
+ executableDir = path10.resolve(
2226
+ path10.dirname(resolvedScriptPath),
2227
2227
  executableDir
2228
2228
  );
2229
2229
  }
2230
2230
  if (executableDir) {
2231
2231
  let localFile = findFile(executableDir, executableFile);
2232
2232
  if (!localFile && !subcommand._executableFile && this._scriptPath) {
2233
- const legacyName = path9.basename(
2233
+ const legacyName = path10.basename(
2234
2234
  this._scriptPath,
2235
- path9.extname(this._scriptPath)
2235
+ path10.extname(this._scriptPath)
2236
2236
  );
2237
2237
  if (legacyName !== this._name) {
2238
2238
  localFile = findFile(
@@ -2243,7 +2243,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
2243
2243
  }
2244
2244
  executableFile = localFile || executableFile;
2245
2245
  }
2246
- launchWithNode = sourceExt.includes(path9.extname(executableFile));
2246
+ launchWithNode = sourceExt.includes(path10.extname(executableFile));
2247
2247
  let proc;
2248
2248
  if (process2.platform !== "win32") {
2249
2249
  if (launchWithNode) {
@@ -3158,7 +3158,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
3158
3158
  * @return {Command}
3159
3159
  */
3160
3160
  nameFromFilename(filename) {
3161
- this._name = path9.basename(filename, path9.extname(filename));
3161
+ this._name = path10.basename(filename, path10.extname(filename));
3162
3162
  return this;
3163
3163
  }
3164
3164
  /**
@@ -3172,9 +3172,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
3172
3172
  * @param {string} [path]
3173
3173
  * @return {(string|null|Command)}
3174
3174
  */
3175
- executableDir(path10) {
3176
- if (path10 === void 0) return this._executableDir;
3177
- this._executableDir = path10;
3175
+ executableDir(path11) {
3176
+ if (path11 === void 0) return this._executableDir;
3177
+ this._executableDir = path11;
3178
3178
  return this;
3179
3179
  }
3180
3180
  /**
@@ -6937,7 +6937,7 @@ var require_gray_matter = __commonJS({
6937
6937
 
6938
6938
  // src/index.ts
6939
6939
  var import_node_fs8 = __toESM(require("node:fs"));
6940
- var import_node_path8 = __toESM(require("node:path"));
6940
+ var import_node_path9 = __toESM(require("node:path"));
6941
6941
 
6942
6942
  // node_modules/commander/esm.mjs
6943
6943
  var import_index = __toESM(require_commander(), 1);
@@ -6959,6 +6959,7 @@ var {
6959
6959
  // src/lib/constants.ts
6960
6960
  var PACKAGE_NAME = "@codecell-germany/company-agent-wiki-skill";
6961
6961
  var CLI_NAME = "company-agent-wiki-cli";
6962
+ var SKILL_NAME = "company-agent-wiki-cli";
6962
6963
  var WORKSPACE_INTERNAL_DIR = ".company-agent-wiki";
6963
6964
  var WORKSPACE_CONFIG_FILE = "workspace.json";
6964
6965
  var INDEX_DB_FILE = "index.sqlite";
@@ -7141,10 +7142,8 @@ function getGitDiff(filePath, baseRef, compareRef) {
7141
7142
  return runGit(args, resolved.repoRoot, true);
7142
7143
  }
7143
7144
 
7144
- // src/lib/indexer.ts
7145
- var import_node_fs5 = __toESM(require("node:fs"));
7146
- var import_node_path6 = __toESM(require("node:path"));
7147
- var import_better_sqlite3 = __toESM(require("better-sqlite3"));
7145
+ // src/lib/install.ts
7146
+ var import_node_path3 = __toESM(require("node:path"));
7148
7147
 
7149
7148
  // src/lib/fs-utils.ts
7150
7149
  var import_node_fs2 = __toESM(require("node:fs"));
@@ -7161,13 +7160,13 @@ function writeJsonFile(targetPath, value) {
7161
7160
  `);
7162
7161
  }
7163
7162
  function writeJsonAtomic(targetPath, value) {
7164
- const tempPath = `${targetPath}.tmp`;
7163
+ const tempPath = `${targetPath}.${process.pid}.${Math.random().toString(16).slice(2)}.tmp`;
7165
7164
  ensureDir(import_node_path2.default.dirname(targetPath));
7166
7165
  writeJsonFile(tempPath, value);
7167
7166
  import_node_fs2.default.renameSync(tempPath, targetPath);
7168
7167
  }
7169
7168
  function replaceFileAtomic(targetPath, content) {
7170
- const tempPath = `${targetPath}.tmp`;
7169
+ const tempPath = `${targetPath}.${process.pid}.${Math.random().toString(16).slice(2)}.tmp`;
7171
7170
  ensureDir(import_node_path2.default.dirname(targetPath));
7172
7171
  import_node_fs2.default.writeFileSync(tempPath, content);
7173
7172
  import_node_fs2.default.renameSync(tempPath, targetPath);
@@ -7204,6 +7203,25 @@ function walkMarkdownFiles(rootPath) {
7204
7203
  return files.sort();
7205
7204
  }
7206
7205
 
7206
+ // src/lib/install.ts
7207
+ function detectInstalledRuntimeHome(runtimeDir) {
7208
+ const normalized = import_node_path3.default.resolve(runtimeDir);
7209
+ const skillDir = import_node_path3.default.dirname(normalized);
7210
+ const toolsDir = import_node_path3.default.dirname(skillDir);
7211
+ if (import_node_path3.default.basename(normalized) !== "dist") {
7212
+ return void 0;
7213
+ }
7214
+ if (import_node_path3.default.basename(skillDir) !== SKILL_NAME || import_node_path3.default.basename(toolsDir) !== "tools") {
7215
+ return void 0;
7216
+ }
7217
+ return import_node_path3.default.dirname(toolsDir);
7218
+ }
7219
+
7220
+ // src/lib/indexer.ts
7221
+ var import_node_fs5 = __toESM(require("node:fs"));
7222
+ var import_node_path7 = __toESM(require("node:path"));
7223
+ var import_better_sqlite3 = __toESM(require("better-sqlite3"));
7224
+
7207
7225
  // src/lib/hash.ts
7208
7226
  var import_node_crypto = require("node:crypto");
7209
7227
  function sha256(input) {
@@ -7214,7 +7232,7 @@ function newBuildId() {
7214
7232
  }
7215
7233
 
7216
7234
  // src/lib/markdown.ts
7217
- var import_node_path3 = __toESM(require("node:path"));
7235
+ var import_node_path4 = __toESM(require("node:path"));
7218
7236
  var import_gray_matter = __toESM(require_gray_matter());
7219
7237
  function slugify(value) {
7220
7238
  return value.normalize("NFKD").replace(/[^\w\s-]/g, "").trim().toLowerCase().replace(/[\s_]+/g, "-").replace(/-+/g, "-");
@@ -7264,7 +7282,7 @@ function parseMarkdownDocument(absPath, relPath, rootId, rawContent, mtimeMs) {
7264
7282
  });
7265
7283
  };
7266
7284
  const titleFromFirstHeading = lines.find((line) => line.startsWith("# "))?.replace(/^#\s+/u, "").trim();
7267
- const title = typeof parsed.data.title === "string" && parsed.data.title.trim() || titleFromFirstHeading || import_node_path3.default.basename(relPath, ".md");
7285
+ const title = typeof parsed.data.title === "string" && parsed.data.title.trim() || titleFromFirstHeading || import_node_path4.default.basename(relPath, ".md");
7268
7286
  const documentId = typeof parsed.data.id === "string" && parsed.data.id.trim() || deriveDocId(rootId, relPath);
7269
7287
  for (const line of lines) {
7270
7288
  const match = line.match(headingPattern);
@@ -7340,52 +7358,55 @@ function parseMarkdownDocument(absPath, relPath, rootId, rawContent, mtimeMs) {
7340
7358
  // src/lib/workspace.ts
7341
7359
  var import_node_fs3 = __toESM(require("node:fs"));
7342
7360
  var import_node_os = __toESM(require("node:os"));
7343
- var import_node_path4 = __toESM(require("node:path"));
7361
+ var import_node_path5 = __toESM(require("node:path"));
7344
7362
  function getDefaultCodexHome() {
7345
- return process.env.CODEX_HOME || import_node_path4.default.join(import_node_os.default.homedir(), ".codex");
7363
+ return process.env.CODEX_HOME || import_node_path5.default.join(import_node_os.default.homedir(), ".codex");
7364
+ }
7365
+ function getDefaultAgentsHome() {
7366
+ return process.env.AGENTS_HOME || import_node_path5.default.join(import_node_os.default.homedir(), ".agents");
7346
7367
  }
7347
7368
  function getGlobalRegistryDir() {
7348
7369
  const explicit = process.env.COMPANY_AGENT_WIKI_CONFIG_HOME;
7349
7370
  if (explicit?.trim()) {
7350
- return import_node_path4.default.resolve(explicit);
7371
+ return import_node_path5.default.resolve(explicit);
7351
7372
  }
7352
7373
  if (process.env.VITEST || process.env.NODE_ENV === "test") {
7353
- return import_node_path4.default.join(import_node_os.default.tmpdir(), GLOBAL_REGISTRY_DIR_NAME, "vitest");
7374
+ return import_node_path5.default.join(import_node_os.default.tmpdir(), GLOBAL_REGISTRY_DIR_NAME, "vitest");
7354
7375
  }
7355
7376
  if (process.platform === "darwin") {
7356
- return import_node_path4.default.join(import_node_os.default.homedir(), "Library", "Application Support", GLOBAL_REGISTRY_DIR_NAME);
7377
+ return import_node_path5.default.join(import_node_os.default.homedir(), "Library", "Application Support", GLOBAL_REGISTRY_DIR_NAME);
7357
7378
  }
7358
7379
  if (process.platform === "win32") {
7359
- const roaming = process.env.APPDATA || import_node_path4.default.join(import_node_os.default.homedir(), "AppData", "Roaming");
7360
- return import_node_path4.default.join(roaming, GLOBAL_REGISTRY_DIR_NAME);
7380
+ const roaming = process.env.APPDATA || import_node_path5.default.join(import_node_os.default.homedir(), "AppData", "Roaming");
7381
+ return import_node_path5.default.join(roaming, GLOBAL_REGISTRY_DIR_NAME);
7361
7382
  }
7362
- const xdgConfig = process.env.XDG_CONFIG_HOME || import_node_path4.default.join(import_node_os.default.homedir(), ".config");
7363
- return import_node_path4.default.join(xdgConfig, GLOBAL_REGISTRY_DIR_NAME);
7383
+ const xdgConfig = process.env.XDG_CONFIG_HOME || import_node_path5.default.join(import_node_os.default.homedir(), ".config");
7384
+ return import_node_path5.default.join(xdgConfig, GLOBAL_REGISTRY_DIR_NAME);
7364
7385
  }
7365
7386
  function getGlobalRegistryPath() {
7366
- return import_node_path4.default.join(getGlobalRegistryDir(), GLOBAL_REGISTRY_FILE);
7387
+ return import_node_path5.default.join(getGlobalRegistryDir(), GLOBAL_REGISTRY_FILE);
7367
7388
  }
7368
7389
  function resolveWorkspacePaths(workspaceRoot) {
7369
7390
  const absoluteRoot = normalizeWorkspaceRootPath(workspaceRoot);
7370
- const internalDir = import_node_path4.default.join(absoluteRoot, WORKSPACE_INTERNAL_DIR);
7391
+ const internalDir = import_node_path5.default.join(absoluteRoot, WORKSPACE_INTERNAL_DIR);
7371
7392
  return {
7372
7393
  workspaceRoot: absoluteRoot,
7373
7394
  internalDir,
7374
- configPath: import_node_path4.default.join(internalDir, WORKSPACE_CONFIG_FILE),
7375
- indexDbPath: import_node_path4.default.join(internalDir, INDEX_DB_FILE),
7376
- indexManifestPath: import_node_path4.default.join(internalDir, INDEX_MANIFEST_FILE),
7377
- managedRootPath: import_node_path4.default.join(absoluteRoot, DEFAULT_MANAGED_ROOT_PATH),
7378
- archiveRootPath: import_node_path4.default.join(absoluteRoot, DEFAULT_ARCHIVE_ROOT_PATH)
7395
+ configPath: import_node_path5.default.join(internalDir, WORKSPACE_CONFIG_FILE),
7396
+ indexDbPath: import_node_path5.default.join(internalDir, INDEX_DB_FILE),
7397
+ indexManifestPath: import_node_path5.default.join(internalDir, INDEX_MANIFEST_FILE),
7398
+ managedRootPath: import_node_path5.default.join(absoluteRoot, DEFAULT_MANAGED_ROOT_PATH),
7399
+ archiveRootPath: import_node_path5.default.join(absoluteRoot, DEFAULT_ARCHIVE_ROOT_PATH)
7379
7400
  };
7380
7401
  }
7381
7402
  function detectWorkspaceRoot(startDir = process.cwd()) {
7382
- let current = import_node_path4.default.resolve(startDir);
7403
+ let current = import_node_path5.default.resolve(startDir);
7383
7404
  while (true) {
7384
- const candidate = import_node_path4.default.join(current, WORKSPACE_INTERNAL_DIR, WORKSPACE_CONFIG_FILE);
7405
+ const candidate = import_node_path5.default.join(current, WORKSPACE_INTERNAL_DIR, WORKSPACE_CONFIG_FILE);
7385
7406
  if (fileExists(candidate)) {
7386
7407
  return current;
7387
7408
  }
7388
- const parent = import_node_path4.default.dirname(current);
7409
+ const parent = import_node_path5.default.dirname(current);
7389
7410
  if (parent === current) {
7390
7411
  return void 0;
7391
7412
  }
@@ -7400,7 +7421,7 @@ function createDefaultGlobalRegistry() {
7400
7421
  };
7401
7422
  }
7402
7423
  function normalizeWorkspaceRootPath(candidatePath) {
7403
- const resolved = import_node_path4.default.resolve(candidatePath);
7424
+ const resolved = import_node_path5.default.resolve(candidatePath);
7404
7425
  try {
7405
7426
  return import_node_fs3.default.realpathSync.native ? import_node_fs3.default.realpathSync.native(resolved) : import_node_fs3.default.realpathSync(resolved);
7406
7427
  } catch {
@@ -7425,7 +7446,7 @@ function loadGlobalWorkspaceRegistry() {
7425
7446
  const normalizedEntry = {
7426
7447
  workspaceId: entry.workspaceId,
7427
7448
  path: normalizedPath,
7428
- label: entry.label || import_node_path4.default.basename(normalizedPath),
7449
+ label: entry.label || import_node_path5.default.basename(normalizedPath),
7429
7450
  registeredAt: entry.registeredAt,
7430
7451
  lastUsedAt: entry.lastUsedAt,
7431
7452
  source: entry.source
@@ -7459,14 +7480,14 @@ function buildRegisteredWorkspace(workspaceRoot, source) {
7459
7480
  return {
7460
7481
  workspaceId: config.workspaceId,
7461
7482
  path: resolvedRoot,
7462
- label: import_node_path4.default.basename(resolvedRoot),
7483
+ label: import_node_path5.default.basename(resolvedRoot),
7463
7484
  registeredAt: now,
7464
7485
  lastUsedAt: now,
7465
7486
  source
7466
7487
  };
7467
7488
  }
7468
7489
  function registerWorkspaceGlobally(workspaceRoot, options3) {
7469
- const resolvedRoot = import_node_path4.default.resolve(workspaceRoot);
7490
+ const resolvedRoot = import_node_path5.default.resolve(workspaceRoot);
7470
7491
  const nextEntry = buildRegisteredWorkspace(resolvedRoot, options3?.source || "manual");
7471
7492
  const registry = loadGlobalWorkspaceRegistry();
7472
7493
  const existing = registry.workspaces.find((item) => item.path === resolvedRoot);
@@ -7793,6 +7814,7 @@ type: process
7793
7814
  status: active
7794
7815
  tags:
7795
7816
  - example
7817
+ description: Short routing description for agents.
7796
7818
  ---
7797
7819
  \`\`\`
7798
7820
  `;
@@ -7818,8 +7840,8 @@ function createDefaultConfig() {
7818
7840
  }
7819
7841
  ],
7820
7842
  index: {
7821
- databasePath: import_node_path4.default.join(WORKSPACE_INTERNAL_DIR, INDEX_DB_FILE),
7822
- manifestPath: import_node_path4.default.join(WORKSPACE_INTERNAL_DIR, INDEX_MANIFEST_FILE)
7843
+ databasePath: import_node_path5.default.join(WORKSPACE_INTERNAL_DIR, INDEX_DB_FILE),
7844
+ manifestPath: import_node_path5.default.join(WORKSPACE_INTERNAL_DIR, INDEX_MANIFEST_FILE)
7823
7845
  },
7824
7846
  git: {
7825
7847
  enabled: true,
@@ -7847,22 +7869,22 @@ function saveWorkspaceConfig(workspaceRoot, config) {
7847
7869
  writeJsonFile(paths.configPath, config);
7848
7870
  }
7849
7871
  function normalizeStoredRootPath(workspaceRoot, candidatePath) {
7850
- const absoluteCandidate = import_node_path4.default.resolve(candidatePath);
7851
- const relative = import_node_path4.default.relative(workspaceRoot, absoluteCandidate);
7852
- if (!relative.startsWith("..") && !import_node_path4.default.isAbsolute(relative)) {
7872
+ const absoluteCandidate = import_node_path5.default.resolve(candidatePath);
7873
+ const relative = import_node_path5.default.relative(workspaceRoot, absoluteCandidate);
7874
+ if (!relative.startsWith("..") && !import_node_path5.default.isAbsolute(relative)) {
7853
7875
  return relative || ".";
7854
7876
  }
7855
7877
  return absoluteCandidate;
7856
7878
  }
7857
7879
  function isPathInsideWorkspace(workspaceRoot, candidatePath) {
7858
- const relative = import_node_path4.default.relative(import_node_path4.default.resolve(workspaceRoot), import_node_path4.default.resolve(candidatePath));
7859
- return relative === "" || !relative.startsWith("..") && !import_node_path4.default.isAbsolute(relative);
7880
+ const relative = import_node_path5.default.relative(import_node_path5.default.resolve(workspaceRoot), import_node_path5.default.resolve(candidatePath));
7881
+ return relative === "" || !relative.startsWith("..") && !import_node_path5.default.isAbsolute(relative);
7860
7882
  }
7861
7883
  function resolveRootPath(workspaceRoot, root) {
7862
- if (import_node_path4.default.isAbsolute(root.path)) {
7884
+ if (import_node_path5.default.isAbsolute(root.path)) {
7863
7885
  return root.path;
7864
7886
  }
7865
- return import_node_path4.default.join(workspaceRoot, root.path);
7887
+ return import_node_path5.default.join(workspaceRoot, root.path);
7866
7888
  }
7867
7889
  function setupWorkspace(options3) {
7868
7890
  const paths = resolveWorkspacePaths(options3.workspaceRoot);
@@ -7884,20 +7906,20 @@ function setupWorkspace(options3) {
7884
7906
  config.git.remoteConfigured = true;
7885
7907
  }
7886
7908
  saveWorkspaceConfig(paths.workspaceRoot, config);
7887
- writeTextFile(import_node_path4.default.join(paths.workspaceRoot, "README.md"), templateWorkspaceReadme());
7888
- writeTextFile(import_node_path4.default.join(paths.workspaceRoot, ".gitignore"), templateWorkspaceGitignore());
7889
- writeTextFile(import_node_path4.default.join(paths.managedRootPath, "README.md"), templateKnowledgeReadme());
7890
- writeTextFile(import_node_path4.default.join(paths.archiveRootPath, "README.md"), "# Archive\n");
7909
+ writeTextFile(import_node_path5.default.join(paths.workspaceRoot, "README.md"), templateWorkspaceReadme());
7910
+ writeTextFile(import_node_path5.default.join(paths.workspaceRoot, ".gitignore"), templateWorkspaceGitignore());
7911
+ writeTextFile(import_node_path5.default.join(paths.managedRootPath, "README.md"), templateKnowledgeReadme());
7912
+ writeTextFile(import_node_path5.default.join(paths.archiveRootPath, "README.md"), "# Archive\n");
7891
7913
  const created = [
7892
7914
  paths.configPath,
7893
- import_node_path4.default.join(paths.workspaceRoot, "README.md"),
7894
- import_node_path4.default.join(paths.workspaceRoot, ".gitignore"),
7895
- import_node_path4.default.join(paths.managedRootPath, "README.md"),
7896
- import_node_path4.default.join(paths.archiveRootPath, "README.md")
7915
+ import_node_path5.default.join(paths.workspaceRoot, "README.md"),
7916
+ import_node_path5.default.join(paths.workspaceRoot, ".gitignore"),
7917
+ import_node_path5.default.join(paths.managedRootPath, "README.md"),
7918
+ import_node_path5.default.join(paths.archiveRootPath, "README.md")
7897
7919
  ];
7898
7920
  if (options3.starterDocs !== false) {
7899
7921
  for (const document of createStarterDocuments()) {
7900
- const absPath = import_node_path4.default.join(paths.managedRootPath, document.relPath);
7922
+ const absPath = import_node_path5.default.join(paths.managedRootPath, document.relPath);
7901
7923
  writeTextFile(absPath, document.content);
7902
7924
  created.push(absPath);
7903
7925
  }
@@ -7933,7 +7955,7 @@ function addRoot(workspaceRoot, rootDefinition) {
7933
7955
  if (config.roots.some((root2) => root2.id === rootDefinition.id)) {
7934
7956
  throw new CliError("ROOT_EXISTS", `Root '${rootDefinition.id}' already exists.`, EXIT_CODES.validation);
7935
7957
  }
7936
- const absoluteRoot = import_node_path4.default.resolve(rootDefinition.rootPath);
7958
+ const absoluteRoot = import_node_path5.default.resolve(rootDefinition.rootPath);
7937
7959
  if (!isDirectory(absoluteRoot)) {
7938
7960
  throw new CliError(
7939
7961
  "ROOT_NOT_FOUND",
@@ -7975,10 +7997,13 @@ function listRoots(workspaceRoot) {
7975
7997
  function doctor(workspaceRoot) {
7976
7998
  const paths = resolveWorkspacePaths(workspaceRoot);
7977
7999
  const checks = [];
8000
+ const agentsHome = getDefaultAgentsHome();
8001
+ const agentsBinDir = import_node_path5.default.join(agentsHome, "bin");
8002
+ const agentsShimPath = import_node_path5.default.join(agentsBinDir, CLI_NAME);
7978
8003
  const codexHome = getDefaultCodexHome();
7979
- const codexBinDir = import_node_path4.default.join(codexHome, "bin");
7980
- const codexShimPath = import_node_path4.default.join(codexBinDir, CLI_NAME);
7981
- const pathEntries = (process.env.PATH || "").split(import_node_path4.default.delimiter).filter(Boolean);
8004
+ const codexBinDir = import_node_path5.default.join(codexHome, "bin");
8005
+ const codexShimPath = import_node_path5.default.join(codexBinDir, CLI_NAME);
8006
+ const pathEntries = (process.env.PATH || "").split(import_node_path5.default.delimiter).filter(Boolean);
7982
8007
  const registryPath = getGlobalRegistryPath();
7983
8008
  const registry = loadGlobalWorkspaceRegistry();
7984
8009
  checks.push({
@@ -7996,10 +8021,20 @@ function doctor(workspaceRoot) {
7996
8021
  ok: isGitAvailable(),
7997
8022
  message: isGitAvailable() ? "Git is available in PATH." : "Git is not available in PATH."
7998
8023
  });
8024
+ checks.push({
8025
+ name: "agents-cli-shim",
8026
+ ok: fileExists(agentsShimPath),
8027
+ message: fileExists(agentsShimPath) ? `Shared agent CLI shim found: ${agentsShimPath}` : `Shared agent CLI shim missing: ${agentsShimPath}`
8028
+ });
8029
+ checks.push({
8030
+ name: "agents-bin-in-path",
8031
+ ok: pathEntries.includes(agentsBinDir),
8032
+ message: pathEntries.includes(agentsBinDir) ? `Shared agent bin directory is available in PATH: ${agentsBinDir}` : `Shared agent bin directory is not in PATH: ${agentsBinDir}`
8033
+ });
7999
8034
  checks.push({
8000
8035
  name: "codex-cli-shim",
8001
8036
  ok: fileExists(codexShimPath),
8002
- message: fileExists(codexShimPath) ? `Codex CLI shim found: ${codexShimPath}` : `Codex CLI shim missing: ${codexShimPath}`
8037
+ message: fileExists(codexShimPath) ? `Codex compatibility shim found: ${codexShimPath}` : `Codex compatibility shim missing: ${codexShimPath}`
8003
8038
  });
8004
8039
  checks.push({
8005
8040
  name: "codex-bin-in-path",
@@ -8045,7 +8080,7 @@ function doctor(workspaceRoot) {
8045
8080
 
8046
8081
  // src/lib/write-lock.ts
8047
8082
  var import_node_fs4 = __toESM(require("node:fs"));
8048
- var import_node_path5 = __toESM(require("node:path"));
8083
+ var import_node_path6 = __toESM(require("node:path"));
8049
8084
  var LOCK_FILE_NAME = "write.lock";
8050
8085
  var LOCK_WAIT_TIMEOUT_MS = 6e4;
8051
8086
  var LOCK_POLL_INTERVAL_MS = 125;
@@ -8056,7 +8091,7 @@ function sleepMs(durationMs) {
8056
8091
  Atomics.wait(array, 0, 0, durationMs);
8057
8092
  }
8058
8093
  function getLockPath(workspaceRoot) {
8059
- return import_node_path5.default.join(import_node_path5.default.resolve(workspaceRoot), WORKSPACE_INTERNAL_DIR, LOCK_FILE_NAME);
8094
+ return import_node_path6.default.join(import_node_path6.default.resolve(workspaceRoot), WORKSPACE_INTERNAL_DIR, LOCK_FILE_NAME);
8060
8095
  }
8061
8096
  function readLockPayload(lockPath) {
8062
8097
  if (!fileExists(lockPath)) {
@@ -8101,7 +8136,7 @@ function createLockPayload(workspaceRoot, reason) {
8101
8136
  token: newBuildId(),
8102
8137
  pid: process.pid,
8103
8138
  reason,
8104
- workspaceRoot: import_node_path5.default.resolve(workspaceRoot),
8139
+ workspaceRoot: import_node_path6.default.resolve(workspaceRoot),
8105
8140
  acquiredAt: (/* @__PURE__ */ new Date()).toISOString()
8106
8141
  };
8107
8142
  }
@@ -8110,7 +8145,7 @@ function withWorkspaceWriteLock(workspaceRoot, reason, callback, options3) {
8110
8145
  const timeoutMs = options3?.timeoutMs ?? LOCK_WAIT_TIMEOUT_MS;
8111
8146
  const deadline = Date.now() + timeoutMs;
8112
8147
  const payload = createLockPayload(workspaceRoot, reason);
8113
- ensureDir(import_node_path5.default.dirname(lockPath));
8148
+ ensureDir(import_node_path6.default.dirname(lockPath));
8114
8149
  while (true) {
8115
8150
  try {
8116
8151
  const fileDescriptor = import_node_fs4.default.openSync(lockPath, "wx");
@@ -8190,11 +8225,11 @@ function closeDatabaseQuietly(database) {
8190
8225
  }
8191
8226
  function throwKnownDatabaseError(error, workspaceRoot) {
8192
8227
  const cliError = coerceCliError(error, {
8193
- sqliteLockHint: `Retry in a moment, serialize parallel CLI reads against ${import_node_path6.default.resolve(
8228
+ sqliteLockHint: `Retry in a moment, serialize parallel CLI reads against ${import_node_path7.default.resolve(
8194
8229
  workspaceRoot
8195
8230
  )}, or rerun with --auto-rebuild after the current write finishes.`,
8196
8231
  sqliteLockDetails: {
8197
- workspaceRoot: import_node_path6.default.resolve(workspaceRoot)
8232
+ workspaceRoot: import_node_path7.default.resolve(workspaceRoot)
8198
8233
  }
8199
8234
  });
8200
8235
  if (cliError) {
@@ -8277,7 +8312,7 @@ function collectRootSnapshot(rootId, rootPath, kind) {
8277
8312
  let latestMtimeMs = 0;
8278
8313
  for (const filePath of markdownFiles) {
8279
8314
  const stats = import_node_fs5.default.statSync(filePath);
8280
- const relPath = import_node_path6.default.relative(rootPath, filePath);
8315
+ const relPath = import_node_path7.default.relative(rootPath, filePath);
8281
8316
  latestMtimeMs = Math.max(latestMtimeMs, Math.trunc(stats.mtimeMs));
8282
8317
  entries.push(`${relPath}|${stats.size}|${Math.trunc(stats.mtimeMs)}`);
8283
8318
  }
@@ -8405,6 +8440,8 @@ function normalizeStringArrayValue(value) {
8405
8440
  function buildDocumentMetadataView(row) {
8406
8441
  const frontmatter = JSON.parse(row.frontmatterJson);
8407
8442
  const tags = JSON.parse(row.tagsJson);
8443
+ const description = normalizeStringValue(frontmatter.description) ?? normalizeStringValue(frontmatter.summary);
8444
+ const summary = normalizeStringValue(frontmatter.summary) ?? description;
8408
8445
  return {
8409
8446
  docId: row.docId,
8410
8447
  title: row.title,
@@ -8413,7 +8450,8 @@ function buildDocumentMetadataView(row) {
8413
8450
  docType: row.docType ?? void 0,
8414
8451
  status: row.status ?? void 0,
8415
8452
  tags,
8416
- summary: normalizeStringValue(frontmatter.summary),
8453
+ description,
8454
+ summary,
8417
8455
  project: normalizeStringValue(frontmatter.project),
8418
8456
  department: normalizeStringValue(frontmatter.department),
8419
8457
  owners: normalizeStringArrayValue(frontmatter.owners),
@@ -8503,7 +8541,7 @@ function rebuildIndexUnlocked(workspaceRoot) {
8503
8541
  for (const filePath of markdownFiles) {
8504
8542
  const rawContent = import_node_fs5.default.readFileSync(filePath, "utf8");
8505
8543
  const stats = import_node_fs5.default.statSync(filePath);
8506
- const relPath = import_node_path6.default.relative(rootPath, filePath);
8544
+ const relPath = import_node_path7.default.relative(rootPath, filePath);
8507
8545
  const parsed = parseMarkdownDocument(filePath, relPath, root.id, rawContent, Math.trunc(stats.mtimeMs));
8508
8546
  insertDocument(database, parsed.document);
8509
8547
  insertSections(database, parsed.document, parsed.sections);
@@ -8615,7 +8653,7 @@ function requireFreshIndex(workspaceRoot, options3) {
8615
8653
  "The workspace has not been indexed yet.",
8616
8654
  EXIT_CODES.indexMissing,
8617
8655
  {
8618
- hint: verification.hint || `Run: company-agent-wiki-cli index rebuild --workspace ${import_node_path6.default.resolve(workspaceRoot)}`
8656
+ hint: verification.hint || `Run: company-agent-wiki-cli index rebuild --workspace ${import_node_path7.default.resolve(workspaceRoot)}`
8619
8657
  }
8620
8658
  );
8621
8659
  }
@@ -8628,7 +8666,7 @@ function requireFreshIndex(workspaceRoot, options3) {
8628
8666
  "The indexed snapshot no longer matches the current roots.",
8629
8667
  EXIT_CODES.indexStale,
8630
8668
  {
8631
- hint: `Run: company-agent-wiki-cli index rebuild --workspace ${import_node_path6.default.resolve(workspaceRoot)}`,
8669
+ hint: `Run: company-agent-wiki-cli index rebuild --workspace ${import_node_path7.default.resolve(workspaceRoot)}`,
8632
8670
  details: verification.roots.filter((root) => !root.ok)
8633
8671
  }
8634
8672
  );
@@ -8938,7 +8976,7 @@ function getDocumentHeadings(workspaceRoot, docId, options3) {
8938
8976
 
8939
8977
  // src/lib/onboarding.ts
8940
8978
  var import_node_fs6 = __toESM(require("node:fs"));
8941
- var import_node_path7 = __toESM(require("node:path"));
8979
+ var import_node_path8 = __toESM(require("node:path"));
8942
8980
  var COMPANY_ONBOARDING_DE_V1 = {
8943
8981
  profileId: "de-company-v1",
8944
8982
  locale: "de-DE",
@@ -9530,8 +9568,8 @@ function ensureKnownAnswerKeys(payload) {
9530
9568
  }
9531
9569
  }
9532
9570
  function isPathInsideWorkspace2(workspaceRoot, candidatePath) {
9533
- const relative = import_node_path7.default.relative(import_node_path7.default.resolve(workspaceRoot), import_node_path7.default.resolve(candidatePath));
9534
- return relative === "" || !relative.startsWith("..") && !import_node_path7.default.isAbsolute(relative);
9571
+ const relative = import_node_path8.default.relative(import_node_path8.default.resolve(workspaceRoot), import_node_path8.default.resolve(candidatePath));
9572
+ return relative === "" || !relative.startsWith("..") && !import_node_path8.default.isAbsolute(relative);
9535
9573
  }
9536
9574
  function resolveManagedRoot(workspaceRoot) {
9537
9575
  const config = loadWorkspaceConfig(workspaceRoot);
@@ -9554,12 +9592,12 @@ function resolveManagedRoot(workspaceRoot) {
9554
9592
  return resolvedPath;
9555
9593
  }
9556
9594
  function createDocument(workspaceRoot, managedRoot, relPath, id, title, type, tags, body, answeredAt, answeredBy) {
9557
- const absPath = import_node_path7.default.join(managedRoot, relPath);
9595
+ const absPath = import_node_path8.default.join(managedRoot, relPath);
9558
9596
  return {
9559
9597
  docId: id,
9560
9598
  title,
9561
9599
  absPath,
9562
- relPath: import_node_path7.default.relative(workspaceRoot, absPath),
9600
+ relPath: import_node_path8.default.relative(workspaceRoot, absPath),
9563
9601
  existed: false,
9564
9602
  content: `${renderFrontmatter({ id, title, type, tags, answeredAt, answeredBy })}${body.trimEnd()}
9565
9603
  `
@@ -9791,8 +9829,8 @@ function previewCompanyOnboarding(workspaceRoot, answerFile) {
9791
9829
  };
9792
9830
  }
9793
9831
  function applyCompanyOnboarding(options3) {
9794
- const workspaceRoot = import_node_path7.default.resolve(options3.workspaceRoot);
9795
- const answerFile = import_node_path7.default.resolve(options3.answerFile);
9832
+ const workspaceRoot = import_node_path8.default.resolve(options3.workspaceRoot);
9833
+ const answerFile = import_node_path8.default.resolve(options3.answerFile);
9796
9834
  const preview = previewCompanyOnboarding(workspaceRoot, answerFile);
9797
9835
  const warnings = [...preview.warnings];
9798
9836
  let indexBuildId;
@@ -9818,7 +9856,7 @@ function applyCompanyOnboarding(options3) {
9818
9856
  }
9819
9857
  }
9820
9858
  for (const document of preview.documents) {
9821
- ensureDir(import_node_path7.default.dirname(document.absPath));
9859
+ ensureDir(import_node_path8.default.dirname(document.absPath));
9822
9860
  if (document.existed) {
9823
9861
  warnings.push(`Overwriting existing file: ${document.relPath}`);
9824
9862
  }
@@ -12510,7 +12548,7 @@ function startServer(workspaceRoot, port, options3) {
12510
12548
  // src/index.ts
12511
12549
  function assertWorkspace(workspacePath) {
12512
12550
  if (workspacePath?.trim()) {
12513
- const resolved = import_node_path8.default.resolve(workspacePath);
12551
+ const resolved = import_node_path9.default.resolve(workspacePath);
12514
12552
  rememberWorkspaceGlobally(resolved, { setDefault: true, source: "runtime" });
12515
12553
  return resolved;
12516
12554
  }
@@ -12577,6 +12615,10 @@ function printMetadata(metadata) {
12577
12615
  }
12578
12616
  if (metadata.systems.length > 0) {
12579
12617
  process.stdout.write(` systems: ${metadata.systems.join(", ")}
12618
+ `);
12619
+ }
12620
+ if (metadata.description) {
12621
+ process.stdout.write(` description: ${metadata.description}
12580
12622
  `);
12581
12623
  }
12582
12624
  if (metadata.summary) {
@@ -12597,14 +12639,20 @@ function printHeadings(headings) {
12597
12639
  }
12598
12640
  var program2 = new Command();
12599
12641
  program2.name(CLI_NAME).description("Agent-first local company knowledge CLI").version(CLI_SCHEMA_VERSION);
12600
- program2.command("about").description("Show CLI runtime metadata and common Codex paths").option("--json", "Emit JSON output", false).action((options3) => {
12642
+ program2.command("about").description("Show CLI runtime metadata and common shared-agent paths").option("--json", "Emit JSON output", false).action((options3) => {
12643
+ const agentsHome = getDefaultAgentsHome();
12601
12644
  const codexHome = getDefaultCodexHome();
12645
+ const runtimeHome = detectInstalledRuntimeHome(__dirname) || null;
12602
12646
  const data = {
12603
12647
  packageName: PACKAGE_NAME,
12604
12648
  cliName: CLI_NAME,
12605
12649
  schemaVersion: CLI_SCHEMA_VERSION,
12650
+ runtimeHome,
12651
+ runtimeShimPath: runtimeHome ? import_node_path9.default.join(runtimeHome, "bin", CLI_NAME) : null,
12652
+ agentsHome,
12653
+ agentsShimPath: import_node_path9.default.join(agentsHome, "bin", CLI_NAME),
12606
12654
  codexHome,
12607
- codexShimPath: import_node_path8.default.join(codexHome, "bin", CLI_NAME),
12655
+ codexShimPath: import_node_path9.default.join(codexHome, "bin", CLI_NAME),
12608
12656
  cwdWorkspace: detectWorkspaceRoot(process.cwd()) || null,
12609
12657
  globalRegistryPath: getGlobalRegistryPath(),
12610
12658
  resolvedWorkspace: resolveWorkspaceSelection(process.cwd())
@@ -12616,6 +12664,12 @@ program2.command("about").description("Show CLI runtime metadata and common Code
12616
12664
  process.stdout.write(`${CLI_NAME}
12617
12665
  `);
12618
12666
  process.stdout.write(` schema version: ${CLI_SCHEMA_VERSION}
12667
+ `);
12668
+ if (data.runtimeShimPath) {
12669
+ process.stdout.write(` runtime shim: ${data.runtimeShimPath}
12670
+ `);
12671
+ }
12672
+ process.stdout.write(` shared agent shim: ${data.agentsShimPath}
12619
12673
  `);
12620
12674
  process.stdout.write(` codex shim: ${data.codexShimPath}
12621
12675
  `);
@@ -12680,7 +12734,7 @@ workspace.command("list").description("List globally registered workspaces").opt
12680
12734
  }
12681
12735
  });
12682
12736
  workspace.command("register").description("Register an existing workspace globally for other agents").requiredOption("--workspace <path>", "Absolute or relative workspace path").option("--default", "Also mark this workspace as the global default", false).option("--json", "Emit JSON output", false).action((options3) => {
12683
- const entry = registerWorkspaceGlobally(import_node_path8.default.resolve(options3.workspace), {
12737
+ const entry = registerWorkspaceGlobally(import_node_path9.default.resolve(options3.workspace), {
12684
12738
  setDefault: Boolean(options3.default),
12685
12739
  source: "manual"
12686
12740
  });
@@ -12699,7 +12753,7 @@ workspace.command("register").description("Register an existing workspace global
12699
12753
  }
12700
12754
  });
12701
12755
  workspace.command("use").description("Set a registered workspace as the global default").requiredOption("--workspace <path>", "Absolute or relative workspace path").option("--json", "Emit JSON output", false).action((options3) => {
12702
- const entry = registerWorkspaceGlobally(import_node_path8.default.resolve(options3.workspace), {
12756
+ const entry = registerWorkspaceGlobally(import_node_path9.default.resolve(options3.workspace), {
12703
12757
  setDefault: true,
12704
12758
  source: "manual"
12705
12759
  });
@@ -12717,7 +12771,7 @@ workspace.command("use").description("Set a registered workspace as the global d
12717
12771
  program2.addCommand(workspace);
12718
12772
  program2.command("setup").description("Workspace setup commands").addCommand(
12719
12773
  new Command("workspace").requiredOption("--workspace <path>", "Absolute or relative workspace path").option("--git-init", "Initialize a local Git repository", false).option("--git-remote <url>", "Configure a Git remote URL").option("--no-starter-docs", "Skip creation of starter Markdown documents").option("--force", "Rewrite an existing scaffold", false).option("--json", "Emit JSON output", false).action((options3) => {
12720
- const workspaceRoot = import_node_path8.default.resolve(options3.workspace);
12774
+ const workspaceRoot = import_node_path9.default.resolve(options3.workspace);
12721
12775
  const result = setupWorkspace({
12722
12776
  workspaceRoot,
12723
12777
  gitInit: Boolean(options3.gitInit),
@@ -12971,8 +13025,8 @@ program2.command("read").option("--workspace <path>", "Workspace path. Optional
12971
13025
  const metadataResult = options3.docId ? getDocumentMetadataById(workspaceRoot, options3.docId, {
12972
13026
  autoRebuild: Boolean(options3.autoRebuild)
12973
13027
  }) : (() => {
12974
- const candidatePath = import_node_path8.default.isAbsolute(options3.path) ? options3.path : import_node_path8.default.join(workspaceRoot, options3.path);
12975
- return getDocumentMetadataByPath(workspaceRoot, import_node_path8.default.resolve(candidatePath), {
13028
+ const candidatePath = import_node_path9.default.isAbsolute(options3.path) ? options3.path : import_node_path9.default.join(workspaceRoot, options3.path);
13029
+ return getDocumentMetadataByPath(workspaceRoot, import_node_path9.default.resolve(candidatePath), {
12976
13030
  autoRebuild: Boolean(options3.autoRebuild)
12977
13031
  });
12978
13032
  })();
@@ -13022,7 +13076,7 @@ program2.command("read").option("--workspace <path>", "Workspace path. Optional
13022
13076
  });
13023
13077
  program2.command("history").option("--workspace <path>", "Workspace path. Optional when current directory is already inside a workspace.").option("--doc-id <id>", "Indexed document identifier").option("--path <path>", "Absolute or workspace-relative document path").option("--limit <number>", "Maximum number of commits", "20").option("--json", "Emit JSON output", false).action((options3) => {
13024
13078
  const workspaceRoot = assertWorkspace(options3.workspace);
13025
- const resolvedPath = options3.docId ? resolveDocumentById(workspaceRoot, options3.docId).absPath : import_node_path8.default.resolve(import_node_path8.default.isAbsolute(options3.path) ? options3.path : import_node_path8.default.join(workspaceRoot, options3.path));
13079
+ const resolvedPath = options3.docId ? resolveDocumentById(workspaceRoot, options3.docId).absPath : import_node_path9.default.resolve(import_node_path9.default.isAbsolute(options3.path) ? options3.path : import_node_path9.default.join(workspaceRoot, options3.path));
13026
13080
  const history = getGitHistory(resolvedPath, Number(options3.limit));
13027
13081
  if (options3.json) {
13028
13082
  printJson(envelope("history", { path: resolvedPath, history }));
@@ -13035,7 +13089,7 @@ program2.command("history").option("--workspace <path>", "Workspace path. Option
13035
13089
  });
13036
13090
  program2.command("diff").option("--workspace <path>", "Workspace path. Optional when current directory is already inside a workspace.").option("--doc-id <id>", "Indexed document identifier").option("--path <path>", "Absolute or workspace-relative document path").option("--base <ref>", "Base Git ref", "HEAD").option("--compare <ref>", "Optional compare ref").option("--json", "Emit JSON output", false).action((options3) => {
13037
13091
  const workspaceRoot = assertWorkspace(options3.workspace);
13038
- const resolvedPath = options3.docId ? resolveDocumentById(workspaceRoot, options3.docId).absPath : import_node_path8.default.resolve(import_node_path8.default.isAbsolute(options3.path) ? options3.path : import_node_path8.default.join(workspaceRoot, options3.path));
13092
+ const resolvedPath = options3.docId ? resolveDocumentById(workspaceRoot, options3.docId).absPath : import_node_path9.default.resolve(import_node_path9.default.isAbsolute(options3.path) ? options3.path : import_node_path9.default.join(workspaceRoot, options3.path));
13039
13093
  const diff = getGitDiff(resolvedPath, options3.base, options3.compare);
13040
13094
  if (options3.json) {
13041
13095
  printJson(envelope("diff", { path: resolvedPath, diff }));
package/dist/installer.js CHANGED
@@ -3470,6 +3470,7 @@ var {
3470
3470
  } = import_index.default;
3471
3471
 
3472
3472
  // src/lib/constants.ts
3473
+ var PACKAGE_NAME = "@codecell-germany/company-agent-wiki-skill";
3473
3474
  var CLI_NAME = "company-agent-wiki-cli";
3474
3475
  var INSTALLER_NAME = "company-agent-wiki-skill";
3475
3476
  var SKILL_NAME = "company-agent-wiki-cli";
@@ -3537,14 +3538,18 @@ exec "$NODE_BIN" "${runtimeScript}" "$@"
3537
3538
  `;
3538
3539
  import_node_fs2.default.writeFileSync(targetPath, content, { encoding: "utf8", mode: 493 });
3539
3540
  }
3540
- function installIntoCodexHome(options) {
3541
- const packageRoot = resolvePackageRoot(__dirname);
3542
- const codexHome = options?.codexHome || process.env.CODEX_HOME || import_node_path.default.join(import_node_os.default.homedir(), ".codex");
3543
- const runtimeDir = import_node_path.default.join(codexHome, "tools", SKILL_NAME);
3544
- const skillDir = import_node_path.default.join(codexHome, "skills", SKILL_NAME);
3545
- const binDir = import_node_path.default.join(codexHome, "bin");
3541
+ function getDefaultAgentsHome() {
3542
+ return process.env.AGENTS_HOME || import_node_path.default.join(import_node_os.default.homedir(), ".agents");
3543
+ }
3544
+ function getDefaultCodexHome() {
3545
+ return process.env.CODEX_HOME || import_node_path.default.join(import_node_os.default.homedir(), ".codex");
3546
+ }
3547
+ function installIntoHome(target, home, packageRoot, force = false) {
3548
+ const runtimeDir = import_node_path.default.join(home, "tools", SKILL_NAME);
3549
+ const skillDir = import_node_path.default.join(home, "skills", SKILL_NAME);
3550
+ const binDir = import_node_path.default.join(home, "bin");
3546
3551
  const shimPath = import_node_path.default.join(binDir, CLI_NAME);
3547
- if (options?.force) {
3552
+ if (force) {
3548
3553
  import_node_fs2.default.rmSync(runtimeDir, { recursive: true, force: true });
3549
3554
  import_node_fs2.default.rmSync(skillDir, { recursive: true, force: true });
3550
3555
  import_node_fs2.default.rmSync(shimPath, { force: true });
@@ -3564,7 +3569,9 @@ function installIntoCodexHome(options) {
3564
3569
  const runtimeScript = import_node_path.default.join(runtimeDir, "dist", "index.js");
3565
3570
  writeShim(shimPath, runtimeScript);
3566
3571
  return {
3567
- codexHome,
3572
+ target,
3573
+ mode: "full",
3574
+ home,
3568
3575
  binDir,
3569
3576
  runtimeDir,
3570
3577
  skillDir,
@@ -3573,6 +3580,63 @@ function installIntoCodexHome(options) {
3573
3580
  pathHint: (process.env.PATH || "").split(import_node_path.default.delimiter).includes(binDir) ? void 0 : `The shim exists, but ${binDir} is not in PATH. Use "${shimPath}" directly or add ${binDir} to PATH.`
3574
3581
  };
3575
3582
  }
3583
+ function installCompatibilityShim(target, home, runtimeHome, force = false) {
3584
+ const runtimeDir = import_node_path.default.join(runtimeHome, "tools", SKILL_NAME);
3585
+ const runtimeScript = import_node_path.default.join(runtimeDir, "dist", "index.js");
3586
+ if (!import_node_fs2.default.existsSync(runtimeScript)) {
3587
+ throw new Error(`Cannot create compatibility shim because runtime is missing: ${runtimeScript}`);
3588
+ }
3589
+ const binDir = import_node_path.default.join(home, "bin");
3590
+ const shimPath = import_node_path.default.join(binDir, CLI_NAME);
3591
+ const legacyRuntimeDir = import_node_path.default.join(home, "tools", SKILL_NAME);
3592
+ const legacySkillDir = import_node_path.default.join(home, "skills", SKILL_NAME);
3593
+ if (force) {
3594
+ import_node_fs2.default.rmSync(legacyRuntimeDir, { recursive: true, force: true });
3595
+ import_node_fs2.default.rmSync(legacySkillDir, { recursive: true, force: true });
3596
+ import_node_fs2.default.rmSync(shimPath, { force: true });
3597
+ }
3598
+ ensureDir(binDir);
3599
+ writeShim(shimPath, runtimeScript);
3600
+ return {
3601
+ target,
3602
+ mode: "shim-only",
3603
+ home,
3604
+ binDir,
3605
+ runtimeDir,
3606
+ shimPath,
3607
+ shimInPath: (process.env.PATH || "").split(import_node_path.default.delimiter).includes(binDir),
3608
+ pathHint: (process.env.PATH || "").split(import_node_path.default.delimiter).includes(binDir) ? void 0 : `The shim exists, but ${binDir} is not in PATH. Use "${shimPath}" directly or add ${binDir} to PATH.`
3609
+ };
3610
+ }
3611
+ function installIntoAgentHomes(options) {
3612
+ const packageRoot = resolvePackageRoot(__dirname);
3613
+ const agentsHome = options?.agentsHome || getDefaultAgentsHome();
3614
+ const codexHome = options?.codexHome || getDefaultCodexHome();
3615
+ const target = options?.target || "all";
3616
+ if (!["agents", "codex", "all"].includes(target)) {
3617
+ throw new Error(`Unsupported install target "${target}". Use agents, codex or all.`);
3618
+ }
3619
+ const installs = [];
3620
+ if (target === "agents" || target === "all") {
3621
+ installs.push(installIntoHome("agents", agentsHome, packageRoot, options?.force));
3622
+ }
3623
+ if (target === "codex" || target === "all") {
3624
+ const shouldSkipCodex = installs.some((entry) => entry.home === codexHome);
3625
+ if (!shouldSkipCodex) {
3626
+ if (target === "codex") {
3627
+ installs.push(installIntoHome("codex", codexHome, packageRoot, options?.force));
3628
+ } else {
3629
+ installs.push(installCompatibilityShim("codex", codexHome, agentsHome, options?.force));
3630
+ }
3631
+ }
3632
+ }
3633
+ return {
3634
+ packageName: PACKAGE_NAME,
3635
+ installerName: INSTALLER_NAME,
3636
+ cliName: CLI_NAME,
3637
+ installs
3638
+ };
3639
+ }
3576
3640
 
3577
3641
  // src/lib/errors.ts
3578
3642
  var CliError = class extends Error {
@@ -3653,23 +3717,40 @@ function printJson(value) {
3653
3717
 
3654
3718
  // src/installer.ts
3655
3719
  var program2 = new Command();
3656
- program2.name(INSTALLER_NAME).description("Install the Company Agent Wiki skill and CLI into Codex");
3657
- program2.command("install").option("--codex-home <path>", "Target Codex home directory").option("--force", "Replace an existing install", false).option("--json", "Emit JSON output", false).action((options) => {
3658
- const result = installIntoCodexHome({
3720
+ program2.name(INSTALLER_NAME).description("Install the Company Agent Wiki skill and CLI for shared agent homes and Codex compatibility");
3721
+ program2.command("install").option("--agents-home <path>", "Target shared agents home directory").option("--codex-home <path>", "Target Codex home directory").option("--target <target>", "Install target: agents, codex or all", "all").option("--force", "Replace an existing install", false).option("--json", "Emit JSON output", false).action((options) => {
3722
+ const result = installIntoAgentHomes({
3723
+ agentsHome: options.agentsHome,
3659
3724
  codexHome: options.codexHome,
3660
- force: Boolean(options.force)
3725
+ force: Boolean(options.force),
3726
+ target: options.target
3661
3727
  });
3662
3728
  if (options.json) {
3663
3729
  printJson(envelope("install", result));
3664
3730
  return;
3665
3731
  }
3666
- process.stdout.write(`Installed into ${result.codexHome}
3732
+ for (const install of result.installs) {
3733
+ process.stdout.write(`Installed ${install.target} target (${install.mode}) into ${install.home}
3734
+ `);
3735
+ process.stdout.write(`CLI shim: ${install.shimPath}
3736
+ `);
3737
+ if (install.mode === "full") {
3738
+ if (install.skillDir) {
3739
+ process.stdout.write(`Skill payload: ${install.skillDir}
3740
+ `);
3741
+ }
3742
+ if (install.runtimeDir) {
3743
+ process.stdout.write(`Runtime: ${install.runtimeDir}
3667
3744
  `);
3668
- process.stdout.write(`CLI shim: ${result.shimPath}
3745
+ }
3746
+ } else if (install.runtimeDir) {
3747
+ process.stdout.write(`Runtime source: ${install.runtimeDir}
3669
3748
  `);
3670
- if (result.pathHint) {
3671
- process.stdout.write(`warning: ${result.pathHint}
3749
+ }
3750
+ if (install.pathHint) {
3751
+ process.stdout.write(`warning: ${install.pathHint}
3672
3752
  `);
3753
+ }
3673
3754
  }
3674
3755
  });
3675
3756
  async function main() {
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Scope
4
4
 
5
- Phase 1 delivers a publishable CLI and Codex skill for a private, local company knowledge workspace.
5
+ Phase 1 delivers a publishable CLI and a shared agent skill for a private, local company knowledge workspace.
6
6
 
7
7
  The implementation is intentionally limited to:
8
8
 
@@ -46,7 +46,8 @@ The index and manifest are derived artifacts and should stay ignored in the priv
46
46
  8. `search`, `route` and `read` either enforce a fresh index or can explicitly auto-rebuild when `--auto-rebuild` is set.
47
47
  9. Runtime commands may detect the current workspace automatically when the shell is already inside a private workspace.
48
48
  10. A global per-user workspace registry stores known workspace paths and a default workspace so other agents can resolve the knowledge location automatically on macOS, Windows and Linux.
49
- 11. `serve` exposes the same read-only data through a local web view and now distinguishes `missing`, `stale` and `ok` states with a rebuild action.
49
+ 11. The installer now targets a shared `~/.agents` home as the primary skill/runtime location and adds a Codex compatibility shim under `~/.codex/bin`.
50
+ 12. `serve` exposes the same read-only data through a local web view and now distinguishes `missing`, `stale` and `ok` states with a rebuild action.
50
51
 
51
52
  ## Onboarding Model
52
53
 
@@ -85,6 +86,8 @@ Phase 1 now explicitly supports a two-step retrieval model:
85
86
 
86
87
  This keeps the agent loop lighter and encourages stronger filenames plus front matter without forcing a rigid folder taxonomy.
87
88
 
89
+ The preferred front-matter contract now includes both `description` and `summary`, so agents can inspect a short routing description before deciding whether to load full Markdown content.
90
+
88
91
  ## Global Workspace Discovery
89
92
 
90
93
  Phase 1 now persists workspace discovery outside the private workspace itself:
@@ -30,3 +30,4 @@
30
30
  - The CLI can initialize a private Git remote URL, but it does not validate remote policy or access controls.
31
31
  - The package does not enforce OS-level filesystem permissions; the workspace owner must place the private workspace in a properly protected location.
32
32
  - The global workspace registry is only a discovery layer, not an access-control boundary. Any agent running as the same local user can read the registered workspace path.
33
+ - The installer now targets a shared `~/.agents` home first and adds a Codex compatibility shim, but it does not manage every agent product's own skill-indexing or refresh logic automatically.
@@ -66,7 +66,8 @@ Installer aus lokalem Tarball:
66
66
  ```bash
67
67
  TMP="$(mktemp -d)"
68
68
  cd "$TMP"
69
- npx -y -p /absolute/path/to/codecell-germany-company-agent-wiki-skill-0.1.0.tgz company-agent-wiki-skill install --codex-home "$TMP/codex" --force
69
+ npx -y -p /absolute/path/to/codecell-germany-company-agent-wiki-skill-0.1.0.tgz company-agent-wiki-skill install --agents-home "$TMP/agents" --codex-home "$TMP/codex" --force
70
+ "$TMP/agents/bin/company-agent-wiki-cli" --help
70
71
  "$TMP/codex/bin/company-agent-wiki-cli" --help
71
72
  ```
72
73
 
@@ -114,7 +115,8 @@ TMP="$(mktemp -d)"
114
115
  CACHE="$(mktemp -d)"
115
116
  cd "$TMP"
116
117
  npm_config_cache="$CACHE" npx -y @codecell-germany/company-agent-wiki-skill@0.1.0 company-agent-wiki-cli --help
117
- npm_config_cache="$CACHE" npx -y @codecell-germany/company-agent-wiki-skill@0.1.0 company-agent-wiki-skill install --codex-home "$TMP/codex" --force
118
+ npm_config_cache="$CACHE" npx -y @codecell-germany/company-agent-wiki-skill@0.1.0 company-agent-wiki-skill install --agents-home "$TMP/agents" --codex-home "$TMP/codex" --force
119
+ "$TMP/agents/bin/company-agent-wiki-cli" --help
118
120
  "$TMP/codex/bin/company-agent-wiki-cli" --help
119
121
  ```
120
122
 
@@ -155,6 +157,8 @@ npx -y skills add codecell-germany/company-agent-wiki-skill -g --skill company-a
155
157
 
156
158
  - CLI läuft über `company-agent-wiki-cli`
157
159
  - Installer läuft über `company-agent-wiki-skill`
160
+ - Shared agent install unter `~/.agents` funktioniert
161
+ - Codex-Kompatibilitätsinstall unter `~/.codex` funktioniert
158
162
  - README, Skill, Referenzen und Knowledge sind synchron
159
163
  - `npm pack` enthält nur gewollte Dateien
160
164
  - lokaler Tarball-Smoketest ist grün
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@codecell-germany/company-agent-wiki-skill",
3
- "version": "0.1.2",
4
- "description": "Context is king: agent-first local company knowledge workspace with metadata-first retrieval, Markdown as truth, SQLite-indexed front matter, Git-aware verification, and a Codex skill installer.",
3
+ "version": "0.1.4",
4
+ "description": "Context is king: agent-first local company knowledge workspace with metadata-first retrieval, Markdown as truth, SQLite-indexed front matter, Git-aware verification, and a shared agent skill installer.",
5
5
  "private": false,
6
6
  "license": "MIT",
7
7
  "type": "commonjs",
@@ -12,6 +12,8 @@ Use this skill when the task is about a private company knowledge workspace buil
12
12
  - Git-backed history
13
13
  - a read-only local browsing view
14
14
 
15
+ This package now targets a shared `~/.agents` home first so the same published package can work across multiple agent runtimes, not only Codex.
16
+
15
17
  ## Preconditions
16
18
 
17
19
  - The public CLI binary is `company-agent-wiki-cli`.
@@ -19,22 +21,37 @@ Use this skill when the task is about a private company knowledge workspace buil
19
21
  - The private workspace may be the current dedicated local folder; it just must not be the public skill/CLI repo.
20
22
  - The human should provide the workspace path at least once and, if desired, the private Git remote URL. After setup or manual registration, the CLI stores the workspace path in a global per-user registry so later agents can resolve it automatically.
21
23
  - Runtime discovery matters. Before relying on the CLI, verify which path is actually available.
22
- - In Codex, the most reliable fallback is usually the installed shim under `$CODEX_HOME/bin` or `~/.codex/bin`.
24
+ - The primary shared install target is `~/.agents`. Codex should only need the compatibility shim under `~/.codex/bin`, not a duplicate second skill payload.
23
25
  - The preferred one-command installer path is `npx -y -p @codecell-germany/company-agent-wiki-skill company-agent-wiki-skill install --force`. This only works after the npm package is really published.
24
- - `node dist/index.js` only works inside the public implementation repo after `npm run build`, not inside an arbitrary private workspace.
25
26
  - If the binary is not already installed in PATH, use these fallbacks in this order:
26
27
 
27
28
  ```bash
29
+ "$HOME/.agents/bin/company-agent-wiki-cli" --help
30
+ "$AGENTS_HOME/bin/company-agent-wiki-cli" --help
28
31
  "$CODEX_HOME/bin/company-agent-wiki-cli" --help
29
32
  "$HOME/.codex/bin/company-agent-wiki-cli" --help
30
33
  company-agent-wiki-cli --help
31
34
  npx -y -p @codecell-germany/company-agent-wiki-skill company-agent-wiki-skill install --force
35
+ ```
36
+
37
+ If you are actively developing inside the public implementation repo, the repo-local fallback also exists:
38
+
39
+ ```bash
40
+ "$HOME/.agents/bin/company-agent-wiki-cli" --help
41
+ "$CODEX_HOME/bin/company-agent-wiki-cli" --help
32
42
  node dist/index.js --help
33
43
  ```
34
44
 
35
45
  ## First Run
36
46
 
37
- 1. In Codex, start with the explicit shim paths:
47
+ 1. Start with the shared agent shim path:
48
+
49
+ ```bash
50
+ "$HOME/.agents/bin/company-agent-wiki-cli" --help
51
+ "$AGENTS_HOME/bin/company-agent-wiki-cli" --help
52
+ ```
53
+
54
+ If you are in Codex, the compatibility shim also works:
38
55
 
39
56
  ```bash
40
57
  "$CODEX_HOME/bin/company-agent-wiki-cli" --help
@@ -140,6 +157,7 @@ status: draft
140
157
  tags:
141
158
  - projekt
142
159
  - alpha
160
+ description: Klare Kurzbeschreibung für Agenten, bevor der Volltext geladen wird.
143
161
  summary: Roadmap und Entscheidungen für Projekt Alpha.
144
162
  project: alpha
145
163
  department: entwicklung
@@ -156,7 +174,7 @@ Empfohlener Ablauf:
156
174
 
157
175
  1. Datei unter `knowledge/canonical/` oder einem anderen registrierten Managed Root anlegen.
158
176
  2. Dateiname so wählen, dass er den Inhalt grob repräsentiert, etwa `projekt-alpha-roadmap.md`.
159
- 3. Front Matter inklusive `id`, `summary` und passenden Routing-Feldern setzen.
177
+ 3. Front Matter inklusive `id`, `description`, `summary` und passenden Routing-Feldern setzen.
160
178
  4. Wenn der Inhalt auf externer Recherche basiert, Provenienz ergänzen:
161
179
  - Quellenstand oder Prüfdokumentation im Dokument
162
180
  - Datum der Prüfung
@@ -200,6 +218,7 @@ tags:
200
218
  - crm
201
219
  - partner
202
220
  - netzwerk
221
+ description: Kurzbeschreibung der Beziehung und ihrer Relevanz für Agenten.
203
222
  summary: Rolle, Status und Relevanz des Partners im CodeCell-Netzwerk.
204
223
  department: vertrieb
205
224
  owners:
@@ -4,6 +4,8 @@
4
4
 
5
5
  ```bash
6
6
  npx -y -p @codecell-germany/company-agent-wiki-skill company-agent-wiki-skill install --force
7
+ "$HOME/.agents/bin/company-agent-wiki-cli" --help
8
+ "$AGENTS_HOME/bin/company-agent-wiki-cli" --help
7
9
  "$CODEX_HOME/bin/company-agent-wiki-cli" --help
8
10
  "$HOME/.codex/bin/company-agent-wiki-cli" --help
9
11
  company-agent-wiki-cli --help
@@ -34,6 +34,7 @@ status: draft
34
34
  tags:
35
35
  - projekt
36
36
  - alpha
37
+ description: Klare Kurzbeschreibung für Agenten, bevor der Volltext geladen wird.
37
38
  summary: Roadmap und Entscheidungen für Projekt Alpha.
38
39
  project: alpha
39
40
  department: entwicklung
@@ -52,6 +53,7 @@ systems:
52
53
  - `type`: z. B. `project`, `process`, `policy`, `guide`, `note`
53
54
  - `status`: z. B. `draft`, `active`, `archived`
54
55
  - `tags`: freie Schlagwörter
56
+ - `description`: kurze Pflichtbeschreibung für Agenten-Routing und Metadata-First-Reads
55
57
  - `summary`: kurze 1-Zeilen-Zusammenfassung für Agenten-Routing
56
58
  - `project`: Projektkennung oder Projektslug
57
59
  - `department`: Abteilung oder Verantwortungsbereich
@@ -65,6 +67,7 @@ Wenn Wissen aus Webrecherche, Nutzerangaben, E-Mails oder anderen externen Quell
65
67
 
66
68
  Empfohlen:
67
69
 
70
+ - `description` im Front Matter als sofort sichtbare Kurzbeschreibung
68
71
  - `summary` im Front Matter für die Kurzbeschreibung
69
72
  - im Dokument ein Abschnitt `## Quellenstand`
70
73
  - Prüfdaten oder Prüfdatum
@@ -92,7 +95,7 @@ Beispiel:
92
95
 
93
96
  1. Dokument im passenden Managed Root anlegen, meist unter `knowledge/canonical/`.
94
97
  2. Dateinamen so wählen, dass er `title` und Inhalt grob repräsentiert.
95
- 3. Front Matter setzen, idealerweise inklusive `id`.
98
+ 3. Front Matter setzen, idealerweise inklusive `id`, `description` und `summary`.
96
99
  4. Bei externem Wissen Provenienz ergänzen.
97
100
  5. Abschnitte schreiben.
98
101
  6. `company-agent-wiki-cli index rebuild --workspace /absolute/path --json` ausführen.
@@ -147,6 +150,7 @@ tags:
147
150
  - crm
148
151
  - partner
149
152
  - netzwerk
153
+ description: Kurzbeschreibung der Beziehung und ihrer Relevanz für Agenten.
150
154
  summary: Rolle, Status und Relevanz des Partners im CodeCell-Netzwerk.
151
155
  department: vertrieb
152
156
  owners:
@@ -4,6 +4,8 @@
4
4
 
5
5
  ```bash
6
6
  npx -y -p @codecell-germany/company-agent-wiki-skill company-agent-wiki-skill install --force
7
+ "$HOME/.agents/bin/company-agent-wiki-cli" --help
8
+ "$AGENTS_HOME/bin/company-agent-wiki-cli" --help
7
9
  "$CODEX_HOME/bin/company-agent-wiki-cli" --help
8
10
  "$HOME/.codex/bin/company-agent-wiki-cli" --help
9
11
  company-agent-wiki-cli about --json
@@ -59,7 +59,7 @@ If target files already exist, the CLI refuses the write unless `--force` is add
59
59
 
60
60
  ```json
61
61
  {
62
- "answeredBy": "Codex Agent",
62
+ "answeredBy": "AI Agent",
63
63
  "notes": ["Buchhaltung zuerst priorisieren"],
64
64
  "answers": {
65
65
  "official_legal_name": "Beispiel GmbH",
@@ -1,6 +1,7 @@
1
1
  # Overview
2
2
 
3
3
  `company-agent-wiki-cli` is the public interface for a private, local company knowledge workspace.
4
+ The published package now installs into a shared `~/.agents` home first and adds a Codex compatibility shim under `~/.codex/bin`.
4
5
 
5
6
  ## Source of Truth
6
7
 
@@ -26,6 +26,8 @@ Before relying on the CLI, verify a real executable path:
26
26
 
27
27
  ```bash
28
28
  npx -y -p @codecell-germany/company-agent-wiki-skill company-agent-wiki-skill install --force
29
+ "$HOME/.agents/bin/company-agent-wiki-cli" --help
30
+ "$AGENTS_HOME/bin/company-agent-wiki-cli" --help
29
31
  "$CODEX_HOME/bin/company-agent-wiki-cli" --help
30
32
  "$HOME/.codex/bin/company-agent-wiki-cli" --help
31
33
  company-agent-wiki-cli --help