@aipper/aiws 0.0.44 → 0.0.45

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 (60) hide show
  1. package/dist/cli.js +114 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/codex-prompts.d.ts +17 -0
  4. package/dist/codex-prompts.js +49 -0
  5. package/dist/codex-prompts.js.map +1 -0
  6. package/dist/codex-skills.d.ts +17 -0
  7. package/dist/codex-skills.js +75 -0
  8. package/dist/codex-skills.js.map +1 -0
  9. package/dist/commands/codex-install-prompts.d.ts +4 -0
  10. package/dist/commands/codex-install-prompts.js +68 -0
  11. package/dist/commands/codex-install-prompts.js.map +1 -0
  12. package/dist/commands/codex-install-skills.d.ts +4 -0
  13. package/dist/commands/codex-install-skills.js +74 -0
  14. package/dist/commands/codex-install-skills.js.map +1 -0
  15. package/dist/commands/codex-status-prompts.d.ts +4 -0
  16. package/dist/commands/codex-status-prompts.js +44 -0
  17. package/dist/commands/codex-status-prompts.js.map +1 -0
  18. package/dist/commands/codex-status-skills.d.ts +4 -0
  19. package/dist/commands/codex-status-skills.js +54 -0
  20. package/dist/commands/codex-status-skills.js.map +1 -0
  21. package/dist/commands/codex-uninstall-prompts.d.ts +4 -0
  22. package/dist/commands/codex-uninstall-prompts.js +51 -0
  23. package/dist/commands/codex-uninstall-prompts.js.map +1 -0
  24. package/dist/commands/codex-uninstall-skills.d.ts +4 -0
  25. package/dist/commands/codex-uninstall-skills.js +59 -0
  26. package/dist/commands/codex-uninstall-skills.js.map +1 -0
  27. package/dist/commands/memory.d.ts +35 -0
  28. package/dist/commands/memory.js +239 -0
  29. package/dist/commands/memory.js.map +1 -0
  30. package/dist/hooks/deploy-claude.d.ts +13 -0
  31. package/dist/hooks/deploy-claude.js +67 -0
  32. package/dist/hooks/deploy-claude.js.map +1 -0
  33. package/dist/memory-bank/disclosure.d.ts +24 -0
  34. package/dist/memory-bank/disclosure.js +143 -0
  35. package/dist/memory-bank/disclosure.js.map +1 -0
  36. package/dist/memory-bank/index.d.ts +24 -0
  37. package/dist/memory-bank/index.js +137 -0
  38. package/dist/memory-bank/index.js.map +1 -0
  39. package/dist/memory-bank/link.d.ts +21 -0
  40. package/dist/memory-bank/link.js +113 -0
  41. package/dist/memory-bank/link.js.map +1 -0
  42. package/dist/memory-bank/search.d.ts +6 -0
  43. package/dist/memory-bank/search.js +88 -0
  44. package/dist/memory-bank/search.js.map +1 -0
  45. package/dist/memory-bank/seed.d.ts +23 -0
  46. package/dist/memory-bank/seed.js +164 -0
  47. package/dist/memory-bank/seed.js.map +1 -0
  48. package/dist/memory-bank/store.d.ts +24 -0
  49. package/dist/memory-bank/store.js +193 -0
  50. package/dist/memory-bank/store.js.map +1 -0
  51. package/dist/memory-bank/types.d.ts +45 -0
  52. package/dist/memory-bank/types.js +2 -0
  53. package/dist/memory-bank/types.js.map +1 -0
  54. package/dist/memory-bank/uri.d.ts +16 -0
  55. package/dist/memory-bank/uri.js +52 -0
  56. package/dist/memory-bank/uri.js.map +1 -0
  57. package/dist/workspace.d.ts +1 -0
  58. package/dist/workspace.js +13 -0
  59. package/dist/workspace.js.map +1 -1
  60. package/package.json +4 -2
@@ -0,0 +1,44 @@
1
+ import path from "node:path";
2
+ import { loadTemplate } from "../spec.js";
3
+ import { normalizeNewlines } from "../hash.js";
4
+ import { findManagedBlock } from "../managed-blocks.js";
5
+ import { pathExists, readText } from "../fs.js";
6
+ import { listTemplateCodexPrompts, resolveCodexPromptsDir } from "../codex-prompts.js";
7
+ /**
8
+ * @param {{ templateId: string, promptsDir?: string }} options
9
+ */
10
+ export async function codexStatusPromptsCommand(options) {
11
+ const templateId = String(options.templateId || "workspace");
12
+ const tpl = await loadTemplate(templateId);
13
+ const promptsDir = resolveCodexPromptsDir(options.promptsDir);
14
+ const promptFiles = await listTemplateCodexPrompts(tpl);
15
+ /** @type {Array<{ filename: string, status: "ok" | "missing" | "unmanaged" | "outdated" }>} */
16
+ const rows = [];
17
+ for (const pf of promptFiles) {
18
+ const destAbs = path.join(promptsDir, pf.filename);
19
+ if (!(await pathExists(destAbs))) {
20
+ rows.push({ filename: pf.filename, status: "missing" });
21
+ continue;
22
+ }
23
+ const currentText = normalizeNewlines(await readText(destAbs));
24
+ const block = findManagedBlock(currentText, pf.blockId);
25
+ if (!block) {
26
+ rows.push({ filename: pf.filename, status: "unmanaged" });
27
+ continue;
28
+ }
29
+ rows.push({ filename: pf.filename, status: block.innerText === pf.innerText ? "ok" : "outdated" });
30
+ }
31
+ const counts = rows.reduce((acc, r) => {
32
+ acc[r.status] = (acc[r.status] || 0) + 1;
33
+ return acc;
34
+ }, { ok: 0, missing: 0, unmanaged: 0, outdated: 0 });
35
+ console.log(`✓ aiws codex status: ${promptsDir}`);
36
+ console.log(`ok=${counts.ok} missing=${counts.missing} unmanaged=${counts.unmanaged} outdated=${counts.outdated}`);
37
+ for (const r of rows) {
38
+ console.log(`${r.status}\t${r.filename}`);
39
+ }
40
+ if (counts.missing > 0 || counts.outdated > 0) {
41
+ console.log("Next: aiws codex install-prompts");
42
+ }
43
+ }
44
+ //# sourceMappingURL=codex-status-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-status-prompts.js","sourceRoot":"","sources":["../../src/commands/codex-status-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @param {{ templateId: string, skillsDir?: string }} options
3
+ */
4
+ export declare function codexStatusSkillsCommand(options: any): Promise<void>;
@@ -0,0 +1,54 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { loadTemplate } from "../spec.js";
4
+ import { normalizeNewlines } from "../hash.js";
5
+ import { findManagedBlock } from "../managed-blocks.js";
6
+ import { pathExists, readText } from "../fs.js";
7
+ import { listTemplateCodexSkills, resolveCodexSkillsDir } from "../codex-skills.js";
8
+ /**
9
+ * @param {{ templateId: string, skillsDir?: string }} options
10
+ */
11
+ export async function codexStatusSkillsCommand(options) {
12
+ const templateId = String(options.templateId || "workspace");
13
+ const tpl = await loadTemplate(templateId);
14
+ const skillsDir = resolveCodexSkillsDir(options.skillsDir);
15
+ const skillsDirIsSymlink = await fs
16
+ .lstat(skillsDir)
17
+ .then((st) => st.isSymbolicLink())
18
+ .catch(() => false);
19
+ const skillsDirReal = skillsDirIsSymlink ? await fs.realpath(skillsDir).catch(() => skillsDir) : skillsDir;
20
+ const skillFiles = await listTemplateCodexSkills(tpl);
21
+ /** @type {Array<{ name: string, status: "ok" | "missing" | "unmanaged" | "outdated" }>} */
22
+ const rows = [];
23
+ for (const sf of skillFiles) {
24
+ const destAbs = path.join(skillsDir, sf.skillName, "SKILL.md");
25
+ if (!(await pathExists(destAbs))) {
26
+ rows.push({ name: sf.skillName, status: "missing" });
27
+ continue;
28
+ }
29
+ const currentText = normalizeNewlines(await readText(destAbs));
30
+ const block = findManagedBlock(currentText, sf.blockId);
31
+ if (!block) {
32
+ rows.push({ name: sf.skillName, status: "unmanaged" });
33
+ continue;
34
+ }
35
+ rows.push({ name: sf.skillName, status: block.innerText === sf.innerText ? "ok" : "outdated" });
36
+ }
37
+ const counts = rows.reduce((acc, r) => {
38
+ acc[r.status] = (acc[r.status] || 0) + 1;
39
+ return acc;
40
+ }, { ok: 0, missing: 0, unmanaged: 0, outdated: 0 });
41
+ const header = skillsDirIsSymlink && skillsDirReal !== skillsDir ? `${skillsDir} -> ${skillsDirReal}` : skillsDir;
42
+ console.log(`✓ aiws codex status-skills: ${header}`);
43
+ console.log(`ok=${counts.ok} missing=${counts.missing} unmanaged=${counts.unmanaged} outdated=${counts.outdated}`);
44
+ for (const r of rows) {
45
+ console.log(`${r.status}\t${r.name}`);
46
+ }
47
+ if (counts.ok === 0 && counts.missing === rows.length && skillsDirIsSymlink) {
48
+ console.log("Note: skills dir is a symlink; if you installed to a different dir, pass --dir (or set CODEX_HOME).");
49
+ }
50
+ if (counts.missing > 0 || counts.outdated > 0) {
51
+ console.log("Next: aiws codex install-skills");
52
+ }
53
+ }
54
+ //# sourceMappingURL=codex-status-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-status-skills.js","sourceRoot":"","sources":["../../src/commands/codex-status-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @param {{ templateId: string, promptsDir?: string }} options
3
+ */
4
+ export declare function codexUninstallPromptsCommand(options: any): Promise<void>;
@@ -0,0 +1,51 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ import { loadTemplate } from "../spec.js";
4
+ import { normalizeNewlines } from "../hash.js";
5
+ import { findManagedBlock } from "../managed-blocks.js";
6
+ import { copyFile, pathExists, readText } from "../fs.js";
7
+ import { codexBackupPathFor, codexBackupStamp, listTemplateCodexPrompts, resolveCodexPromptsDir } from "../codex-prompts.js";
8
+ /**
9
+ * @param {{ templateId: string, promptsDir?: string }} options
10
+ */
11
+ export async function codexUninstallPromptsCommand(options) {
12
+ const templateId = String(options.templateId || "workspace");
13
+ const tpl = await loadTemplate(templateId);
14
+ const promptsDir = resolveCodexPromptsDir(options.promptsDir);
15
+ const promptFiles = await listTemplateCodexPrompts(tpl);
16
+ const backupStamp = codexBackupStamp();
17
+ const backupDir = path.join(promptsDir, ".aiws", "backups", "codex-prompts", backupStamp);
18
+ /** @type {string[]} */
19
+ const removed = [];
20
+ /** @type {string[]} */
21
+ const skippedUnmanaged = [];
22
+ /** @type {string[]} */
23
+ const missing = [];
24
+ for (const pf of promptFiles) {
25
+ const destAbs = path.join(promptsDir, pf.filename);
26
+ if (!(await pathExists(destAbs))) {
27
+ missing.push(pf.filename);
28
+ continue;
29
+ }
30
+ const currentText = normalizeNewlines(await readText(destAbs));
31
+ const block = findManagedBlock(currentText, pf.blockId);
32
+ if (!block) {
33
+ skippedUnmanaged.push(pf.filename);
34
+ continue;
35
+ }
36
+ const backup = codexBackupPathFor(promptsDir, pf.filename, backupStamp);
37
+ await copyFile(destAbs, backup);
38
+ await fs.unlink(destAbs);
39
+ removed.push(pf.filename);
40
+ }
41
+ console.log(`✓ aiws codex uninstall-prompts: ${promptsDir}`);
42
+ if (removed.length > 0)
43
+ console.log(`removed: ${removed.join(", ")}`);
44
+ if (removed.length > 0)
45
+ console.log(`backup: ${backupDir}`);
46
+ if (skippedUnmanaged.length > 0)
47
+ console.log(`skipped (unmanaged): ${skippedUnmanaged.join(", ")}`);
48
+ if (missing.length > 0)
49
+ console.log(`missing: ${missing.join(", ")}`);
50
+ }
51
+ //# sourceMappingURL=codex-uninstall-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-uninstall-prompts.js","sourceRoot":"","sources":["../../src/commands/codex-uninstall-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @param {{ templateId: string, skillsDir?: string }} options
3
+ */
4
+ export declare function codexUninstallSkillsCommand(options: any): Promise<void>;
@@ -0,0 +1,59 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ import { loadTemplate } from "../spec.js";
4
+ import { normalizeNewlines } from "../hash.js";
5
+ import { findManagedBlock } from "../managed-blocks.js";
6
+ import { copyFile, pathExists, readText } from "../fs.js";
7
+ import { codexSkillsBackupPathFor, codexSkillsBackupStamp, listTemplateCodexSkills, resolveCodexSkillsDir } from "../codex-skills.js";
8
+ /**
9
+ * @param {{ templateId: string, skillsDir?: string }} options
10
+ */
11
+ export async function codexUninstallSkillsCommand(options) {
12
+ const templateId = String(options.templateId || "workspace");
13
+ const tpl = await loadTemplate(templateId);
14
+ const skillsDir = resolveCodexSkillsDir(options.skillsDir);
15
+ const skillFiles = await listTemplateCodexSkills(tpl);
16
+ const backupStamp = codexSkillsBackupStamp();
17
+ const backupDir = path.join(skillsDir, ".aiws", "backups", "codex-skills", backupStamp);
18
+ /** @type {string[]} */
19
+ const removed = [];
20
+ /** @type {string[]} */
21
+ const skippedUnmanaged = [];
22
+ /** @type {string[]} */
23
+ const missing = [];
24
+ for (const sf of skillFiles) {
25
+ const destDir = path.join(skillsDir, sf.skillName);
26
+ const destAbs = path.join(destDir, "SKILL.md");
27
+ if (!(await pathExists(destAbs))) {
28
+ missing.push(sf.skillName);
29
+ continue;
30
+ }
31
+ const currentText = normalizeNewlines(await readText(destAbs));
32
+ const block = findManagedBlock(currentText, sf.blockId);
33
+ if (!block) {
34
+ skippedUnmanaged.push(sf.skillName);
35
+ continue;
36
+ }
37
+ const backup = codexSkillsBackupPathFor(skillsDir, sf.skillName, backupStamp);
38
+ await copyFile(destAbs, backup);
39
+ await fs.unlink(destAbs);
40
+ // Only remove the directory if it's empty after removing SKILL.md.
41
+ try {
42
+ await fs.rmdir(destDir);
43
+ }
44
+ catch {
45
+ // ignore
46
+ }
47
+ removed.push(sf.skillName);
48
+ }
49
+ console.log(`✓ aiws codex uninstall-skills: ${skillsDir}`);
50
+ if (removed.length > 0)
51
+ console.log(`removed: ${removed.join(", ")}`);
52
+ if (removed.length > 0)
53
+ console.log(`backup: ${backupDir}`);
54
+ if (skippedUnmanaged.length > 0)
55
+ console.log(`skipped (unmanaged): ${skippedUnmanaged.join(", ")}`);
56
+ if (missing.length > 0)
57
+ console.log(`missing: ${missing.join(", ")}`);
58
+ }
59
+ //# sourceMappingURL=codex-uninstall-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-uninstall-skills.js","sourceRoot":"","sources":["../../src/commands/codex-uninstall-skills.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEtI;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAAY;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,WAAW,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAEtD,MAAM,WAAW,GAAG,sBAAsB,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IAExF,uBAAuB;IACvB,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,uBAAuB;IACvB,MAAM,gBAAgB,GAAG,EAAE,CAAC;IAC5B,uBAAuB;IACvB,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9E,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzB,mEAAmE;QACnE,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;IAC5D,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * aiws memory read <uri>
3
+ */
4
+ export declare function memoryReadCommand(args: Record<string, unknown>): Promise<void>;
5
+ /**
6
+ * aiws memory write <uri> <text> [--title <title>] [--tags <tags>] [--disclosure <level>]
7
+ */
8
+ export declare function memoryWriteCommand(args: Record<string, unknown>): Promise<void>;
9
+ /**
10
+ * aiws memory search <query>
11
+ */
12
+ export declare function memorySearchCommand(args: Record<string, unknown>): Promise<void>;
13
+ /**
14
+ * aiws memory list [domain]
15
+ */
16
+ export declare function memoryListCommand(args: Record<string, unknown>): Promise<void>;
17
+ /**
18
+ * aiws memory link add|list|rm
19
+ */
20
+ export declare function memoryLinkCommand(args: Record<string, unknown>): Promise<void>;
21
+ /**
22
+ * aiws memory boot
23
+ * Lists memories marked with disclosure: boot (or always).
24
+ * Scans index only — reads files only for snippet.
25
+ */
26
+ export declare function memoryBootCommand(_args: Record<string, unknown>): Promise<void>;
27
+ /**
28
+ * aiws memory seed [--dry-run] [--force]
29
+ * Seeds memory entries from project truth files and artifacts.
30
+ */
31
+ export declare function memorySeedCommand(args: Record<string, unknown>): Promise<void>;
32
+ /**
33
+ * aiws memory rebuild-index
34
+ */
35
+ export declare function memoryRebuildIndexCommand(_args: Record<string, unknown>): Promise<void>;
@@ -0,0 +1,239 @@
1
+ import { UserError } from "../errors.js";
2
+ import { getWorkspaceRoot } from "../workspace.js";
3
+ import { parseUri } from "../memory-bank/uri.js";
4
+ import { readMemory, writeMemory } from "../memory-bank/store.js";
5
+ import { loadIndex, saveIndex, rebuildIndex, updateIndex, } from "../memory-bank/index.js";
6
+ import { searchMemories } from "../memory-bank/search.js";
7
+ import { addLink, listLinks, removeLink } from "../memory-bank/link.js";
8
+ import { listBootMemories } from "../memory-bank/disclosure.js";
9
+ import { seedMemories } from "../memory-bank/seed.js";
10
+ /**
11
+ * aiws memory read <uri>
12
+ */
13
+ export async function memoryReadCommand(args) {
14
+ const uri = String(args.uri ?? "");
15
+ if (!uri)
16
+ throw new UserError("memory read requires <uri>", { details: "Usage: aiws memory read <uri>" });
17
+ const wsRoot = await getWorkspaceRoot();
18
+ const entry = await readMemory(wsRoot, uri);
19
+ console.log(`Title: ${entry.title}`);
20
+ console.log(`URI: ${entry.uri}`);
21
+ console.log(`Path: ${entry.path}`);
22
+ console.log(`Created: ${entry.created}`);
23
+ console.log(`Updated: ${entry.updated}`);
24
+ if (entry.disclosure)
25
+ console.log(`Disclosure: ${entry.disclosure}`);
26
+ if (entry.tags.length > 0)
27
+ console.log(`Tags: ${entry.tags.join(", ")}`);
28
+ console.log("");
29
+ console.log(entry.body);
30
+ }
31
+ /**
32
+ * aiws memory write <uri> <text> [--title <title>] [--tags <tags>] [--disclosure <level>]
33
+ */
34
+ export async function memoryWriteCommand(args) {
35
+ const uri = String(args.uri ?? "");
36
+ const text = String(args.text ?? "");
37
+ if (!uri || !text) {
38
+ throw new UserError("memory write requires <uri> <text>", {
39
+ details: "Usage: aiws memory write <uri> <text> [--title <title>] [--tags <tags>] [--disclosure <level>]",
40
+ });
41
+ }
42
+ const title = args.title ? String(args.title) : undefined;
43
+ const rawTags = args.tags ? String(args.tags) : undefined;
44
+ const tags = rawTags
45
+ ? rawTags.split(",").map((t) => t.trim()).filter(Boolean)
46
+ : undefined;
47
+ const disclosure = args.disclosure ? String(args.disclosure) : undefined;
48
+ const wsRoot = await getWorkspaceRoot();
49
+ await writeMemory(wsRoot, uri, text, { title, tags, disclosure });
50
+ // Update index
51
+ const parsed = parseUri(uri);
52
+ const entry = await readMemory(wsRoot, uri);
53
+ await updateIndex(wsRoot, uri, {
54
+ title: entry.title,
55
+ domain: entry.domain,
56
+ path: entry.path,
57
+ created: entry.created,
58
+ updated: entry.updated,
59
+ tags: entry.tags,
60
+ disclosure: entry.disclosure,
61
+ });
62
+ console.log(`✓ Memory written: ${uri}`);
63
+ }
64
+ /**
65
+ * aiws memory search <query>
66
+ */
67
+ export async function memorySearchCommand(args) {
68
+ const query = String(args.query ?? "");
69
+ if (!query)
70
+ throw new UserError("memory search requires <query>", { details: "Usage: aiws memory search <query>" });
71
+ const wsRoot = await getWorkspaceRoot();
72
+ const results = await searchMemories(wsRoot, query);
73
+ if (results.length === 0) {
74
+ console.log("No results found.");
75
+ return;
76
+ }
77
+ for (const r of results) {
78
+ console.log(`\n${r.uri}`);
79
+ console.log(` Title: ${r.title}`);
80
+ console.log(` Snippet: ${r.snippet}`);
81
+ }
82
+ console.log(`\n${results.length} result(s)`);
83
+ }
84
+ /**
85
+ * aiws memory list [domain]
86
+ */
87
+ export async function memoryListCommand(args) {
88
+ const domainFilter = args.domain ? String(args.domain).trim() : undefined;
89
+ const wsRoot = await getWorkspaceRoot();
90
+ const index = await loadIndex(wsRoot);
91
+ const entries = Object.entries(index.memories)
92
+ .filter(([, entry]) => !domainFilter || entry.domain === domainFilter)
93
+ .sort(([a], [b]) => a.localeCompare(b));
94
+ if (entries.length === 0) {
95
+ console.log("No memories found.");
96
+ return;
97
+ }
98
+ // Determine column widths
99
+ let maxUri = 4; // "URI"
100
+ let maxTitle = 5; // "Title"
101
+ let maxTags = 4; // "Tags"
102
+ for (const [uri, entry] of entries) {
103
+ if (uri.length > maxUri)
104
+ maxUri = uri.length;
105
+ if (entry.title.length > maxTitle)
106
+ maxTitle = entry.title.length;
107
+ const tagsStr = entry.tags.join(", ");
108
+ if (tagsStr.length > maxTags)
109
+ maxTags = tagsStr.length;
110
+ }
111
+ // Clamp widths
112
+ if (maxUri > 50)
113
+ maxUri = 50;
114
+ if (maxTitle > 40)
115
+ maxTitle = 40;
116
+ if (maxTags > 30)
117
+ maxTags = 30;
118
+ const headerUri = "URI".padEnd(maxUri);
119
+ const headerTitle = "Title".padEnd(maxTitle);
120
+ const headerCreated = "Created";
121
+ const headerTags = "Tags".padEnd(maxTags);
122
+ const sep = " ";
123
+ console.log(`${headerUri}${sep}${headerTitle}${sep}${headerCreated}${sep}${headerTags}`);
124
+ console.log(`${"-".repeat(maxUri)}${sep}${"-".repeat(maxTitle)}${sep}${"-".repeat(24)}${sep}${"-".repeat(maxTags)}`);
125
+ for (const [uri, entry] of entries) {
126
+ const dispUri = uri.length > 50 ? uri.slice(0, 47) + "..." : uri.padEnd(maxUri);
127
+ const dispTitle = entry.title.length > 40 ? entry.title.slice(0, 37) + "..." : entry.title.padEnd(maxTitle);
128
+ const dispCreated = (entry.created.slice(0, 10) ?? "").padEnd(24);
129
+ const dispTags = entry.tags.join(", ").length > 30
130
+ ? entry.tags.join(", ").slice(0, 27) + "..."
131
+ : entry.tags.join(", ").padEnd(maxTags);
132
+ console.log(`${dispUri}${sep}${dispTitle}${sep}${dispCreated}${sep}${dispTags}`);
133
+ }
134
+ }
135
+ /**
136
+ * aiws memory link add|list|rm
137
+ */
138
+ export async function memoryLinkCommand(args) {
139
+ const action = String(args.action ?? "");
140
+ const wsRoot = await getWorkspaceRoot();
141
+ if (action === "add") {
142
+ const from = String(args.from ?? "");
143
+ const to = String(args.to ?? "");
144
+ if (!from || !to) {
145
+ throw new UserError("memory link add requires <from> <to>", {
146
+ details: "Usage: aiws memory link add <from-uri> <to-uri>",
147
+ });
148
+ }
149
+ await addLink(wsRoot, from, to);
150
+ console.log(`Link added: ${from} -> ${to}`);
151
+ }
152
+ else if (action === "list") {
153
+ const uri = String(args.uri ?? "");
154
+ if (!uri) {
155
+ throw new UserError("memory link list requires <uri>", {
156
+ details: "Usage: aiws memory link list <uri>",
157
+ });
158
+ }
159
+ const result = await listLinks(wsRoot, uri);
160
+ console.log(`Links for: ${uri}`);
161
+ if (result.outgoing.length > 0) {
162
+ console.log(" Outgoing:");
163
+ for (const link of result.outgoing) {
164
+ console.log(` ${link.from} -> ${link.to} (${link.created.slice(0, 10)})`);
165
+ }
166
+ }
167
+ if (result.incoming.length > 0) {
168
+ console.log(" Incoming:");
169
+ for (const link of result.incoming) {
170
+ console.log(` ${link.from} -> ${link.to} (${link.created.slice(0, 10)})`);
171
+ }
172
+ }
173
+ if (result.outgoing.length === 0 && result.incoming.length === 0) {
174
+ console.log(" (no links)");
175
+ }
176
+ }
177
+ else if (action === "rm") {
178
+ const from = String(args.from ?? "");
179
+ const to = String(args.to ?? "");
180
+ if (!from || !to) {
181
+ throw new UserError("memory link rm requires <from> <to>", {
182
+ details: "Usage: aiws memory link rm <from-uri> <to-uri>",
183
+ });
184
+ }
185
+ await removeLink(wsRoot, from, to);
186
+ console.log(`Link removed: ${from} -> ${to}`);
187
+ }
188
+ }
189
+ /**
190
+ * aiws memory boot
191
+ * Lists memories marked with disclosure: boot (or always).
192
+ * Scans index only — reads files only for snippet.
193
+ */
194
+ export async function memoryBootCommand(_args) {
195
+ const wsRoot = await getWorkspaceRoot();
196
+ const entries = await listBootMemories(wsRoot);
197
+ if (entries.length === 0) {
198
+ console.log("No boot memories found. (Mark memories with --disclosure boot)");
199
+ return;
200
+ }
201
+ console.log(`Boot memories (${entries.length}):\n`);
202
+ for (const e of entries) {
203
+ console.log(`${e.uri}`);
204
+ console.log(` Title: ${e.title}`);
205
+ console.log(` Disclosure: ${e.disclosure}`);
206
+ console.log(` Snippet: ${e.snippet}`);
207
+ console.log();
208
+ }
209
+ }
210
+ /**
211
+ * aiws memory seed [--dry-run] [--force]
212
+ * Seeds memory entries from project truth files and artifacts.
213
+ */
214
+ export async function memorySeedCommand(args) {
215
+ const dryRun = args["dry-run"] === true || args.dryRun === true;
216
+ const force = args.force === true;
217
+ const wsRoot = await getWorkspaceRoot();
218
+ const result = await seedMemories(wsRoot, { dryRun, force });
219
+ if (dryRun) {
220
+ console.log(`Would seed ${result.uris.length} memories:`);
221
+ for (const uri of result.uris) {
222
+ console.log(` ${uri}`);
223
+ }
224
+ }
225
+ else {
226
+ console.log(`Seeded ${result.written} memories (${result.skipped} skipped)`);
227
+ }
228
+ }
229
+ /**
230
+ * aiws memory rebuild-index
231
+ */
232
+ export async function memoryRebuildIndexCommand(_args) {
233
+ const wsRoot = await getWorkspaceRoot();
234
+ const data = await rebuildIndex(wsRoot);
235
+ await saveIndex(wsRoot, data);
236
+ const count = Object.keys(data.memories).length;
237
+ console.log(`Index rebuilt: ${count} memory file(s) indexed`);
238
+ }
239
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ interface DeployOptions {
2
+ /** When true, overwrite existing hook scripts even if already deployed. */
3
+ force?: boolean;
4
+ }
5
+ /**
6
+ * Deploy aiws Claude Code session hooks to ~/.claude/settings.json.
7
+ *
8
+ * In init mode (`force=false`): only adds missing hooks, keeps existing ones.
9
+ * In update mode (`force=true`): overwrites hook scripts and ensures all hooks
10
+ * are registered in settings.json (updates existing entries if present).
11
+ */
12
+ export declare function deployClaudeHooks(options?: DeployOptions): Promise<void>;
13
+ export {};
@@ -0,0 +1,67 @@
1
+ import path from "node:path";
2
+ import os from "node:os";
3
+ import fs from "node:fs/promises";
4
+ const HOOK_DEFINITIONS = [
5
+ { name: "session-start", event: "SessionStart", id: "aiws-session-start" },
6
+ { name: "workflow-state", event: "UserPromptSubmit", id: "aiws-workflow-state" },
7
+ { name: "subagent-context", event: "PreToolUse", id: "aiws-subagent-context" },
8
+ ];
9
+ /**
10
+ * Deploy aiws Claude Code session hooks to ~/.claude/settings.json.
11
+ *
12
+ * In init mode (`force=false`): only adds missing hooks, keeps existing ones.
13
+ * In update mode (`force=true`): overwrites hook scripts and ensures all hooks
14
+ * are registered in settings.json (updates existing entries if present).
15
+ */
16
+ export async function deployClaudeHooks(options = {}) {
17
+ const { force = false } = options;
18
+ const settingsPath = path.join(os.homedir(), ".claude", "settings.json");
19
+ const hooksDir = path.join(os.homedir(), ".claude", "hooks", "aiws");
20
+ try {
21
+ await fs.mkdir(hooksDir, { recursive: true });
22
+ for (const hook of HOOK_DEFINITIONS) {
23
+ const src = path.join(__dirname, "..", "hooks", "claude", `${hook.name}.js`);
24
+ const dest = path.join(hooksDir, `${hook.name}.js`);
25
+ try {
26
+ await fs.copyFile(src, dest);
27
+ }
28
+ catch {
29
+ console.warn(`[aiws] warn: could not copy hook ${hook.name}.js to ${dest}`);
30
+ }
31
+ }
32
+ let settings = {};
33
+ try {
34
+ const raw = await fs.readFile(settingsPath, "utf-8");
35
+ settings = JSON.parse(raw);
36
+ }
37
+ catch { }
38
+ const existingHooks = Array.isArray(settings.hooks) ? settings.hooks : [];
39
+ const existingById = new Map();
40
+ for (const h of existingHooks) {
41
+ if (h.id)
42
+ existingById.set(h.id, h);
43
+ }
44
+ for (const hook of HOOK_DEFINITIONS) {
45
+ const entry = {
46
+ id: hook.id,
47
+ matcher: hook.event,
48
+ hooks: [{ type: "command", command: `node ${path.join(hooksDir, `${hook.name}.js`)}` }],
49
+ };
50
+ if (existingById.has(hook.id)) {
51
+ if (force) {
52
+ const existing = existingById.get(hook.id);
53
+ existing.hooks = entry.hooks;
54
+ }
55
+ }
56
+ else {
57
+ existingById.set(hook.id, entry);
58
+ }
59
+ }
60
+ settings.hooks = [...existingById.values()];
61
+ await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
62
+ }
63
+ catch (err) {
64
+ console.warn(`[aiws] warn: Claude Code hook deployment failed: ${err.message}`);
65
+ }
66
+ }
67
+ //# sourceMappingURL=deploy-claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-claude.js","sourceRoot":"","sources":["../../src/hooks/deploy-claude.ts"],"names":[],"mappings":"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"}