pi-continuous-learning 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +326 -0
  3. package/dist/active-instincts.d.ts +4 -0
  4. package/dist/active-instincts.d.ts.map +1 -0
  5. package/dist/active-instincts.js +11 -0
  6. package/dist/active-instincts.js.map +1 -0
  7. package/dist/agents-md.d.ts +12 -0
  8. package/dist/agents-md.d.ts.map +1 -0
  9. package/dist/agents-md.js +23 -0
  10. package/dist/agents-md.js.map +1 -0
  11. package/dist/cli/analyze-prompt.d.ts +2 -0
  12. package/dist/cli/analyze-prompt.d.ts.map +1 -0
  13. package/dist/cli/analyze-prompt.js +72 -0
  14. package/dist/cli/analyze-prompt.js.map +1 -0
  15. package/dist/cli/analyze.d.ts +3 -0
  16. package/dist/cli/analyze.d.ts.map +1 -0
  17. package/dist/cli/analyze.js +214 -0
  18. package/dist/cli/analyze.js.map +1 -0
  19. package/dist/confidence.d.ts +25 -0
  20. package/dist/confidence.d.ts.map +1 -0
  21. package/dist/confidence.js +77 -0
  22. package/dist/confidence.js.map +1 -0
  23. package/dist/config.d.ts +19 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +89 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/error-logger.d.ts +34 -0
  28. package/dist/error-logger.d.ts.map +1 -0
  29. package/dist/error-logger.js +102 -0
  30. package/dist/error-logger.js.map +1 -0
  31. package/dist/index.d.ts +10 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +118 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/instinct-decay.d.ts +39 -0
  36. package/dist/instinct-decay.d.ts.map +1 -0
  37. package/dist/instinct-decay.js +93 -0
  38. package/dist/instinct-decay.js.map +1 -0
  39. package/dist/instinct-evolve.d.ts +5 -0
  40. package/dist/instinct-evolve.d.ts.map +1 -0
  41. package/dist/instinct-evolve.js +24 -0
  42. package/dist/instinct-evolve.js.map +1 -0
  43. package/dist/instinct-export.d.ts +40 -0
  44. package/dist/instinct-export.d.ts.map +1 -0
  45. package/dist/instinct-export.js +94 -0
  46. package/dist/instinct-export.js.map +1 -0
  47. package/dist/instinct-import.d.ts +50 -0
  48. package/dist/instinct-import.d.ts.map +1 -0
  49. package/dist/instinct-import.js +168 -0
  50. package/dist/instinct-import.js.map +1 -0
  51. package/dist/instinct-injector.d.ts +39 -0
  52. package/dist/instinct-injector.d.ts.map +1 -0
  53. package/dist/instinct-injector.js +89 -0
  54. package/dist/instinct-injector.js.map +1 -0
  55. package/dist/instinct-loader.d.ts +37 -0
  56. package/dist/instinct-loader.d.ts.map +1 -0
  57. package/dist/instinct-loader.js +96 -0
  58. package/dist/instinct-loader.js.map +1 -0
  59. package/dist/instinct-parser.d.ts +28 -0
  60. package/dist/instinct-parser.d.ts.map +1 -0
  61. package/dist/instinct-parser.js +143 -0
  62. package/dist/instinct-parser.js.map +1 -0
  63. package/dist/instinct-projects.d.ts +32 -0
  64. package/dist/instinct-projects.d.ts.map +1 -0
  65. package/dist/instinct-projects.js +96 -0
  66. package/dist/instinct-projects.js.map +1 -0
  67. package/dist/instinct-promote.d.ts +51 -0
  68. package/dist/instinct-promote.d.ts.map +1 -0
  69. package/dist/instinct-promote.js +169 -0
  70. package/dist/instinct-promote.js.map +1 -0
  71. package/dist/instinct-status.d.ts +39 -0
  72. package/dist/instinct-status.d.ts.map +1 -0
  73. package/dist/instinct-status.js +108 -0
  74. package/dist/instinct-status.js.map +1 -0
  75. package/dist/instinct-store.d.ts +30 -0
  76. package/dist/instinct-store.d.ts.map +1 -0
  77. package/dist/instinct-store.js +118 -0
  78. package/dist/instinct-store.js.map +1 -0
  79. package/dist/instinct-tools.d.ts +161 -0
  80. package/dist/instinct-tools.d.ts.map +1 -0
  81. package/dist/instinct-tools.js +240 -0
  82. package/dist/instinct-tools.js.map +1 -0
  83. package/dist/observations.d.ts +22 -0
  84. package/dist/observations.d.ts.map +1 -0
  85. package/dist/observations.js +62 -0
  86. package/dist/observations.js.map +1 -0
  87. package/dist/observer-guard.d.ts +3 -0
  88. package/dist/observer-guard.d.ts.map +1 -0
  89. package/dist/observer-guard.js +13 -0
  90. package/dist/observer-guard.js.map +1 -0
  91. package/dist/project.d.ts +16 -0
  92. package/dist/project.d.ts.map +1 -0
  93. package/dist/project.js +59 -0
  94. package/dist/project.js.map +1 -0
  95. package/dist/prompt-observer.d.ts +25 -0
  96. package/dist/prompt-observer.d.ts.map +1 -0
  97. package/dist/prompt-observer.js +63 -0
  98. package/dist/prompt-observer.js.map +1 -0
  99. package/dist/prompts/analyzer-user.d.ts +38 -0
  100. package/dist/prompts/analyzer-user.d.ts.map +1 -0
  101. package/dist/prompts/analyzer-user.js +105 -0
  102. package/dist/prompts/analyzer-user.js.map +1 -0
  103. package/dist/prompts/evolve-prompt.d.ts +3 -0
  104. package/dist/prompts/evolve-prompt.d.ts.map +1 -0
  105. package/dist/prompts/evolve-prompt.js +51 -0
  106. package/dist/prompts/evolve-prompt.js.map +1 -0
  107. package/dist/scrubber.d.ts +9 -0
  108. package/dist/scrubber.d.ts.map +1 -0
  109. package/dist/scrubber.js +40 -0
  110. package/dist/scrubber.js.map +1 -0
  111. package/dist/storage.d.ts +22 -0
  112. package/dist/storage.d.ts.map +1 -0
  113. package/dist/storage.js +71 -0
  114. package/dist/storage.js.map +1 -0
  115. package/dist/tool-observer.d.ts +32 -0
  116. package/dist/tool-observer.d.ts.map +1 -0
  117. package/dist/tool-observer.js +77 -0
  118. package/dist/tool-observer.js.map +1 -0
  119. package/dist/types.d.ts +64 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +6 -0
  122. package/dist/types.js.map +1 -0
  123. package/package.json +66 -0
  124. package/src/active-instincts.ts +13 -0
  125. package/src/agents-md.ts +23 -0
  126. package/src/cli/analyze-prompt.ts +71 -0
  127. package/src/cli/analyze.ts +286 -0
  128. package/src/confidence.ts +103 -0
  129. package/src/config.ts +111 -0
  130. package/src/error-logger.ts +130 -0
  131. package/src/index.ts +144 -0
  132. package/src/instinct-decay.ts +117 -0
  133. package/src/instinct-evolve.ts +44 -0
  134. package/src/instinct-export.ts +138 -0
  135. package/src/instinct-import.ts +260 -0
  136. package/src/instinct-injector.ts +128 -0
  137. package/src/instinct-loader.ts +146 -0
  138. package/src/instinct-parser.ts +171 -0
  139. package/src/instinct-projects.ts +119 -0
  140. package/src/instinct-promote.ts +231 -0
  141. package/src/instinct-status.ts +135 -0
  142. package/src/instinct-store.ts +149 -0
  143. package/src/instinct-tools.ts +340 -0
  144. package/src/observations.ts +82 -0
  145. package/src/observer-guard.ts +14 -0
  146. package/src/project.ts +70 -0
  147. package/src/prompt-observer.ts +92 -0
  148. package/src/prompts/analyzer-user.ts +156 -0
  149. package/src/prompts/evolve-prompt.ts +71 -0
  150. package/src/scrubber.ts +42 -0
  151. package/src/storage.ts +91 -0
  152. package/src/tool-observer.ts +114 -0
  153. package/src/types.ts +90 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * /instinct-projects command for pi-continuous-learning.
3
+ * Displays all known projects with their instinct counts and last seen dates.
4
+ */
5
+ import type { ExtensionCommandContext } from "@mariozechner/pi-coding-agent";
6
+ import type { ProjectEntry } from "./types.js";
7
+ export declare const COMMAND_NAME = "instinct-projects";
8
+ /**
9
+ * Reads the projects.json registry. Returns an empty record on missing/invalid file.
10
+ */
11
+ export declare function readProjectsRegistry(baseDir?: string): Record<string, ProjectEntry>;
12
+ /**
13
+ * Counts .md files in a project's personal instincts directory.
14
+ * Returns 0 if the directory does not exist.
15
+ */
16
+ export declare function countProjectInstincts(projectId: string, baseDir?: string): number;
17
+ /**
18
+ * Formats an ISO 8601 date string as a human-readable local date.
19
+ * Falls back to the raw string on parse failure.
20
+ */
21
+ export declare function formatDate(isoDate: string): string;
22
+ /**
23
+ * Formats the full projects output string from a registry.
24
+ * Returns a fallback message when no projects exist.
25
+ */
26
+ export declare function formatProjectsOutput(registry: Record<string, ProjectEntry>, baseDir?: string): string;
27
+ /**
28
+ * Command handler for /instinct-projects.
29
+ * Reads the project registry, counts instincts per project, and displays results.
30
+ */
31
+ export declare function handleInstinctProjects(_args: string, ctx: ExtensionCommandContext, baseDir?: string): Promise<void>;
32
+ //# sourceMappingURL=instinct-projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-projects.d.ts","sourceRoot":"","sources":["../src/instinct-projects.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAOhD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAUnF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAWjF;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EACtC,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAwBR;AAMD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,uBAAuB,EAC5B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * /instinct-projects command for pi-continuous-learning.
3
+ * Displays all known projects with their instinct counts and last seen dates.
4
+ */
5
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
6
+ import { getProjectsRegistryPath, getProjectInstinctsDir, getBaseDir } from "./storage.js";
7
+ // ---------------------------------------------------------------------------
8
+ // Constants
9
+ // ---------------------------------------------------------------------------
10
+ export const COMMAND_NAME = "instinct-projects";
11
+ const NO_PROJECTS_MSG = "No projects found.";
12
+ // ---------------------------------------------------------------------------
13
+ // Data loading helpers
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * Reads the projects.json registry. Returns an empty record on missing/invalid file.
17
+ */
18
+ export function readProjectsRegistry(baseDir) {
19
+ const registryPath = getProjectsRegistryPath(baseDir ?? getBaseDir());
20
+ if (!existsSync(registryPath)) {
21
+ return {};
22
+ }
23
+ try {
24
+ return JSON.parse(readFileSync(registryPath, "utf-8"));
25
+ }
26
+ catch {
27
+ return {};
28
+ }
29
+ }
30
+ /**
31
+ * Counts .md files in a project's personal instincts directory.
32
+ * Returns 0 if the directory does not exist.
33
+ */
34
+ export function countProjectInstincts(projectId, baseDir) {
35
+ const dir = getProjectInstinctsDir(projectId, "personal", baseDir ?? getBaseDir());
36
+ if (!existsSync(dir)) {
37
+ return 0;
38
+ }
39
+ try {
40
+ const entries = readdirSync(dir);
41
+ return entries.filter((f) => f.endsWith(".md")).length;
42
+ }
43
+ catch {
44
+ return 0;
45
+ }
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Formatting helpers
49
+ // ---------------------------------------------------------------------------
50
+ /**
51
+ * Formats an ISO 8601 date string as a human-readable local date.
52
+ * Falls back to the raw string on parse failure.
53
+ */
54
+ export function formatDate(isoDate) {
55
+ try {
56
+ return new Date(isoDate).toLocaleDateString();
57
+ }
58
+ catch {
59
+ return isoDate;
60
+ }
61
+ }
62
+ /**
63
+ * Formats the full projects output string from a registry.
64
+ * Returns a fallback message when no projects exist.
65
+ */
66
+ export function formatProjectsOutput(registry, baseDir) {
67
+ const entries = Object.values(registry);
68
+ if (entries.length === 0) {
69
+ return NO_PROJECTS_MSG;
70
+ }
71
+ const sorted = [...entries].sort((a, b) => b.last_seen.localeCompare(a.last_seen));
72
+ const lines = ["=== Known Projects ===", ""];
73
+ for (const project of sorted) {
74
+ const count = countProjectInstincts(project.id, baseDir);
75
+ const lastSeen = formatDate(project.last_seen);
76
+ lines.push(`${project.name} (${project.id})`);
77
+ lines.push(` Instincts: ${count} | Last seen: ${lastSeen}`);
78
+ lines.push("");
79
+ }
80
+ const total = entries.length;
81
+ lines.push(`Total: ${total} project${total !== 1 ? "s" : ""}`);
82
+ return lines.join("\n");
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // Command handler
86
+ // ---------------------------------------------------------------------------
87
+ /**
88
+ * Command handler for /instinct-projects.
89
+ * Reads the project registry, counts instincts per project, and displays results.
90
+ */
91
+ export async function handleInstinctProjects(_args, ctx, baseDir) {
92
+ const registry = readProjectsRegistry(baseDir);
93
+ const output = formatProjectsOutput(registry, baseDir);
94
+ ctx.ui.notify(output, "info");
95
+ }
96
+ //# sourceMappingURL=instinct-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-projects.js","sourceRoot":"","sources":["../src/instinct-projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * /instinct-promote command for pi-continuous-learning.
3
+ * Promotes project-scoped instincts to global scope.
4
+ *
5
+ * With an ID argument: promotes that specific project instinct to global.
6
+ * Without an ID: auto-promotes all qualifying instincts
7
+ * (confidence >= 0.8, present in 2+ projects).
8
+ */
9
+ import type { ExtensionCommandContext } from "@mariozechner/pi-coding-agent";
10
+ import type { Instinct } from "./types.js";
11
+ export declare const COMMAND_NAME = "instinct-promote";
12
+ /** Minimum confidence to qualify for auto-promotion. */
13
+ export declare const AUTO_PROMOTE_MIN_CONFIDENCE = 0.8;
14
+ /** Minimum number of distinct projects an instinct must appear in for auto-promotion. */
15
+ export declare const AUTO_PROMOTE_MIN_PROJECTS = 2;
16
+ /**
17
+ * Builds a promoted copy of the instinct with scope set to global and
18
+ * project-specific fields removed.
19
+ * Does NOT mutate the original.
20
+ */
21
+ export declare function toGlobalInstinct(instinct: Instinct): Instinct;
22
+ /**
23
+ * Returns all known project IDs from the projects.json registry.
24
+ */
25
+ export declare function getKnownProjectIds(baseDir: string): string[];
26
+ /**
27
+ * Promotes a single project instinct to global personal/ by ID.
28
+ * Returns the promoted instinct, or null if not found.
29
+ */
30
+ export declare function promoteById(id: string, projectId: string, baseDir: string): Instinct | null;
31
+ /**
32
+ * Finds instinct IDs that appear in at least minProjects distinct projects.
33
+ * Returns a map of id -> array of matching instincts across projects.
34
+ */
35
+ export declare function findCrossProjectInstincts(projectIds: string[], baseDir: string): Map<string, Instinct[]>;
36
+ /**
37
+ * Auto-promotes all qualifying instincts:
38
+ * - confidence >= AUTO_PROMOTE_MIN_CONFIDENCE
39
+ * - present in >= AUTO_PROMOTE_MIN_PROJECTS distinct projects
40
+ * Already-global instincts (same ID in global personal/) are skipped.
41
+ *
42
+ * Returns the list of promoted instincts.
43
+ */
44
+ export declare function autoPromoteInstincts(baseDir: string): Instinct[];
45
+ /**
46
+ * Command handler for /instinct-promote.
47
+ * With an ID arg: promotes that specific instinct.
48
+ * Without an ID: auto-promotes qualifying instincts.
49
+ */
50
+ export declare function handleInstinctPromote(args: string, ctx: ExtensionCommandContext, projectId?: string | null, baseDir?: string): Promise<void>;
51
+ //# sourceMappingURL=instinct-promote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-promote.d.ts","sourceRoot":"","sources":["../src/instinct-promote.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmB3C,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAE/C,wDAAwD;AACxD,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,yFAAyF;AACzF,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAM3C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAU7D;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAU5D;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,QAAQ,GAAG,IAAI,CAWjB;AAMD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,GACd,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAazB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CA+BhE;AAMD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,uBAAuB,EAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA8Cf"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * /instinct-promote command for pi-continuous-learning.
3
+ * Promotes project-scoped instincts to global scope.
4
+ *
5
+ * With an ID argument: promotes that specific project instinct to global.
6
+ * Without an ID: auto-promotes all qualifying instincts
7
+ * (confidence >= 0.8, present in 2+ projects).
8
+ */
9
+ import { mkdirSync } from "node:fs";
10
+ import { loadProjectInstincts, loadGlobalInstincts, saveInstinct, listInstincts, } from "./instinct-store.js";
11
+ import { getGlobalInstinctsDir, getProjectInstinctsDir, getProjectsRegistryPath, getBaseDir, } from "./storage.js";
12
+ import { readFileSync, existsSync } from "node:fs";
13
+ // ---------------------------------------------------------------------------
14
+ // Constants
15
+ // ---------------------------------------------------------------------------
16
+ export const COMMAND_NAME = "instinct-promote";
17
+ /** Minimum confidence to qualify for auto-promotion. */
18
+ export const AUTO_PROMOTE_MIN_CONFIDENCE = 0.8;
19
+ /** Minimum number of distinct projects an instinct must appear in for auto-promotion. */
20
+ export const AUTO_PROMOTE_MIN_PROJECTS = 2;
21
+ // ---------------------------------------------------------------------------
22
+ // Pure helpers
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Builds a promoted copy of the instinct with scope set to global and
26
+ * project-specific fields removed.
27
+ * Does NOT mutate the original.
28
+ */
29
+ export function toGlobalInstinct(instinct) {
30
+ const promoted = {
31
+ ...instinct,
32
+ scope: "global",
33
+ updated_at: new Date().toISOString(),
34
+ };
35
+ // Remove project-specific fields
36
+ delete promoted.project_id;
37
+ delete promoted.project_name;
38
+ return promoted;
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Project registry reading
42
+ // ---------------------------------------------------------------------------
43
+ /**
44
+ * Returns all known project IDs from the projects.json registry.
45
+ */
46
+ export function getKnownProjectIds(baseDir) {
47
+ const registryPath = getProjectsRegistryPath(baseDir);
48
+ if (!existsSync(registryPath))
49
+ return [];
50
+ try {
51
+ const raw = readFileSync(registryPath, "utf-8");
52
+ const parsed = JSON.parse(raw);
53
+ return Object.keys(parsed);
54
+ }
55
+ catch {
56
+ return [];
57
+ }
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // Manual promotion
61
+ // ---------------------------------------------------------------------------
62
+ /**
63
+ * Promotes a single project instinct to global personal/ by ID.
64
+ * Returns the promoted instinct, or null if not found.
65
+ */
66
+ export function promoteById(id, projectId, baseDir) {
67
+ const projectInstincts = loadProjectInstincts(projectId, baseDir);
68
+ const found = projectInstincts.find((i) => i.id === id);
69
+ if (!found)
70
+ return null;
71
+ const globalDir = getGlobalInstinctsDir("personal", baseDir);
72
+ mkdirSync(globalDir, { recursive: true });
73
+ const promoted = toGlobalInstinct(found);
74
+ saveInstinct(promoted, globalDir);
75
+ return promoted;
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Auto-promotion
79
+ // ---------------------------------------------------------------------------
80
+ /**
81
+ * Finds instinct IDs that appear in at least minProjects distinct projects.
82
+ * Returns a map of id -> array of matching instincts across projects.
83
+ */
84
+ export function findCrossProjectInstincts(projectIds, baseDir) {
85
+ const byId = new Map();
86
+ for (const projectId of projectIds) {
87
+ const personalDir = getProjectInstinctsDir(projectId, "personal", baseDir);
88
+ const instincts = listInstincts(personalDir);
89
+ for (const instinct of instincts) {
90
+ const existing = byId.get(instinct.id) ?? [];
91
+ byId.set(instinct.id, [...existing, instinct]);
92
+ }
93
+ }
94
+ return byId;
95
+ }
96
+ /**
97
+ * Auto-promotes all qualifying instincts:
98
+ * - confidence >= AUTO_PROMOTE_MIN_CONFIDENCE
99
+ * - present in >= AUTO_PROMOTE_MIN_PROJECTS distinct projects
100
+ * Already-global instincts (same ID in global personal/) are skipped.
101
+ *
102
+ * Returns the list of promoted instincts.
103
+ */
104
+ export function autoPromoteInstincts(baseDir) {
105
+ const projectIds = getKnownProjectIds(baseDir);
106
+ if (projectIds.length < AUTO_PROMOTE_MIN_PROJECTS)
107
+ return [];
108
+ const crossProject = findCrossProjectInstincts(projectIds, baseDir);
109
+ const existingGlobal = loadGlobalInstincts(baseDir);
110
+ const existingGlobalIds = new Set(existingGlobal.map((i) => i.id));
111
+ const globalDir = getGlobalInstinctsDir("personal", baseDir);
112
+ mkdirSync(globalDir, { recursive: true });
113
+ const promoted = [];
114
+ for (const [id, instances] of crossProject) {
115
+ if (instances.length < AUTO_PROMOTE_MIN_PROJECTS)
116
+ continue;
117
+ // Use the highest-confidence instance as the canonical one
118
+ const sorted = [...instances].sort((a, b) => b.confidence - a.confidence);
119
+ const best = sorted[0];
120
+ if (!best)
121
+ continue;
122
+ if (best.confidence < AUTO_PROMOTE_MIN_CONFIDENCE)
123
+ continue;
124
+ if (existingGlobalIds.has(id))
125
+ continue;
126
+ const globalInstinct = toGlobalInstinct(best);
127
+ saveInstinct(globalInstinct, globalDir);
128
+ promoted.push(globalInstinct);
129
+ }
130
+ return promoted;
131
+ }
132
+ // ---------------------------------------------------------------------------
133
+ // handleInstinctPromote
134
+ // ---------------------------------------------------------------------------
135
+ /**
136
+ * Command handler for /instinct-promote.
137
+ * With an ID arg: promotes that specific instinct.
138
+ * Without an ID: auto-promotes qualifying instincts.
139
+ */
140
+ export async function handleInstinctPromote(args, ctx, projectId, baseDir) {
141
+ const effectiveBase = baseDir ?? getBaseDir();
142
+ const id = args.trim();
143
+ if (id.length > 0) {
144
+ // Manual promotion by ID
145
+ if (projectId == null) {
146
+ ctx.ui.notify("Cannot promote by ID: no active project detected.", "error");
147
+ return;
148
+ }
149
+ const promoted = promoteById(id, projectId, effectiveBase);
150
+ if (!promoted) {
151
+ ctx.ui.notify(`Instinct "${id}" not found in project instincts.`, "error");
152
+ return;
153
+ }
154
+ ctx.ui.notify(`Promoted instinct "${promoted.id}" ("${promoted.title}") to global scope.`, "info");
155
+ return;
156
+ }
157
+ // Auto-promotion
158
+ const promoted = autoPromoteInstincts(effectiveBase);
159
+ if (promoted.length === 0) {
160
+ ctx.ui.notify(`No instincts qualify for auto-promotion (confidence >= ${AUTO_PROMOTE_MIN_CONFIDENCE}, present in ${AUTO_PROMOTE_MIN_PROJECTS}+ projects).`, "info");
161
+ return;
162
+ }
163
+ const lines = [
164
+ `Auto-promoted ${promoted.length} instinct${promoted.length !== 1 ? "s" : ""} to global scope:`,
165
+ ...promoted.map((i) => ` - ${i.id} (${i.confidence.toFixed(2)}): ${i.title}`),
166
+ ];
167
+ ctx.ui.notify(lines.join("\n"), "info");
168
+ }
169
+ //# sourceMappingURL=instinct-promote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-promote.js","sourceRoot":"","sources":["../src/instinct-promote.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACZ,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEnD,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,wDAAwD;AACxD,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,yFAAyF;AACzF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAkB;IACjD,MAAM,QAAQ,GAAa;QACzB,GAAG,QAAQ;QACX,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;IACF,iCAAiC;IACjC,OAAQ,QAA8B,CAAC,UAAU,CAAC;IAClD,OAAQ,QAA8B,CAAC,YAAY,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,EAAU,EACV,SAAiB,EACjB,OAAe;IAEf,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,SAAS,GAAG,qBAAqB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7D,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACzC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,UAAoB,EACpB,OAAe;IAEf,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE3C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,sBAAsB,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAC3E,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC7C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,MAAM,GAAG,yBAAyB;QAAE,OAAO,EAAE,CAAC;IAE7D,MAAM,YAAY,GAAG,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEpE,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnE,MAAM,SAAS,GAAG,qBAAqB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7D,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAe,EAAE,CAAC;IAEhC,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,YAAY,EAAE,CAAC;QAC3C,IAAI,SAAS,CAAC,MAAM,GAAG,yBAAyB;YAAE,SAAS;QAE3D,2DAA2D;QAC3D,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,IAAI,IAAI,CAAC,UAAU,GAAG,2BAA2B;YAAE,SAAS;QAC5D,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAExC,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC9C,YAAY,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,GAA4B,EAC5B,SAAyB,EACzB,OAAgB;IAEhB,MAAM,aAAa,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC;IAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEvB,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClB,yBAAyB;QACzB,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,mDAAmD,EACnD,OAAO,CACR,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,aAAa,EAAE,mCAAmC,EAClD,OAAO,CACR,CAAC;YACF,OAAO;QACT,CAAC;QAED,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,sBAAsB,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC,KAAK,qBAAqB,EAC3E,MAAM,CACP,CAAC;QACF,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAErD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,0DAA0D,2BAA2B,gBAAgB,yBAAyB,cAAc,EAC5I,MAAM,CACP,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,iBAAiB,QAAQ,CAAC,MAAM,YAAY,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,mBAAmB;QAC/F,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;KAC/E,CAAC;IACF,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * /instinct-status command for pi-continuous-learning.
3
+ * Displays all instincts grouped by domain with confidence scores,
4
+ * trend arrows, and feedback ratios.
5
+ */
6
+ import type { ExtensionCommandContext } from "@mariozechner/pi-coding-agent";
7
+ import type { Instinct } from "./types.js";
8
+ declare const COMMAND_NAME = "instinct-status";
9
+ /**
10
+ * Returns a trend arrow based on confirmed vs contradicted counts.
11
+ * ↑ when confirmed > contradicted, ↓ when contradicted > confirmed, → when equal.
12
+ */
13
+ export declare function getTrendArrow(instinct: Instinct): string;
14
+ /**
15
+ * Formats a single instinct line for display.
16
+ * Format: [confidence] title trend feedback_ratio [⚠ FLAGGED FOR REMOVAL]
17
+ */
18
+ export declare function formatInstinct(instinct: Instinct): string;
19
+ /**
20
+ * Groups instincts by domain. Returns a sorted record (sorted by domain name).
21
+ */
22
+ export declare function groupByDomain(instincts: Instinct[]): Record<string, Instinct[]>;
23
+ /**
24
+ * Formats the full status output string from a list of instincts.
25
+ * Returns a header message when no instincts exist.
26
+ */
27
+ export declare function formatStatusOutput(instincts: Instinct[]): string;
28
+ /**
29
+ * Loads all instincts from disk (project + global), including flagged ones.
30
+ * Does NOT apply confidence filtering - status command shows everything.
31
+ */
32
+ export declare function loadAllInstincts(projectId?: string | null, baseDir?: string): Instinct[];
33
+ /**
34
+ * Command handler for /instinct-status.
35
+ * Loads all instincts, formats them grouped by domain, and notifies the user.
36
+ */
37
+ export declare function handleInstinctStatus(_args: string, ctx: ExtensionCommandContext, projectId?: string | null, baseDir?: string): Promise<void>;
38
+ export { COMMAND_NAME };
39
+ //# sourceMappingURL=instinct-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-status.d.ts","sourceRoot":"","sources":["../src/instinct-status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAW3C,QAAA,MAAM,YAAY,oBAAoB,CAAC;AAOvC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAIxD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAWzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAU/E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAwBhE;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,QAAQ,EAAE,CAKZ;AAMD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,uBAAuB,EAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * /instinct-status command for pi-continuous-learning.
3
+ * Displays all instincts grouped by domain with confidence scores,
4
+ * trend arrows, and feedback ratios.
5
+ */
6
+ import { loadProjectInstincts, loadGlobalInstincts } from "./instinct-store.js";
7
+ // ---------------------------------------------------------------------------
8
+ // Constants
9
+ // ---------------------------------------------------------------------------
10
+ const TREND_UP = "↑";
11
+ const TREND_DOWN = "↓";
12
+ const TREND_STABLE = "→";
13
+ const FLAG_REMOVAL = "⚠ FLAGGED FOR REMOVAL";
14
+ const COMMAND_NAME = "instinct-status";
15
+ const NO_INSTINCTS_MSG = "No instincts found.";
16
+ // ---------------------------------------------------------------------------
17
+ // Trend and formatting helpers
18
+ // ---------------------------------------------------------------------------
19
+ /**
20
+ * Returns a trend arrow based on confirmed vs contradicted counts.
21
+ * ↑ when confirmed > contradicted, ↓ when contradicted > confirmed, → when equal.
22
+ */
23
+ export function getTrendArrow(instinct) {
24
+ if (instinct.confirmed_count > instinct.contradicted_count)
25
+ return TREND_UP;
26
+ if (instinct.contradicted_count > instinct.confirmed_count)
27
+ return TREND_DOWN;
28
+ return TREND_STABLE;
29
+ }
30
+ /**
31
+ * Formats a single instinct line for display.
32
+ * Format: [confidence] title trend feedback_ratio [⚠ FLAGGED FOR REMOVAL]
33
+ */
34
+ export function formatInstinct(instinct) {
35
+ const confidence = `[${instinct.confidence.toFixed(2)}]`;
36
+ const trend = getTrendArrow(instinct);
37
+ const feedbackRatio = `✓${instinct.confirmed_count} ✗${instinct.contradicted_count} ○${instinct.inactive_count}`;
38
+ const parts = [` ${confidence} ${instinct.title} ${trend} (${feedbackRatio})`];
39
+ if (instinct.flagged_for_removal) {
40
+ parts.push(` ${FLAG_REMOVAL}`);
41
+ }
42
+ return parts.join("\n");
43
+ }
44
+ /**
45
+ * Groups instincts by domain. Returns a sorted record (sorted by domain name).
46
+ */
47
+ export function groupByDomain(instincts) {
48
+ const groups = {};
49
+ for (const instinct of instincts) {
50
+ const domain = instinct.domain || "uncategorized";
51
+ if (!groups[domain]) {
52
+ groups[domain] = [];
53
+ }
54
+ groups[domain].push(instinct);
55
+ }
56
+ return groups;
57
+ }
58
+ /**
59
+ * Formats the full status output string from a list of instincts.
60
+ * Returns a header message when no instincts exist.
61
+ */
62
+ export function formatStatusOutput(instincts) {
63
+ if (instincts.length === 0)
64
+ return NO_INSTINCTS_MSG;
65
+ const groups = groupByDomain(instincts);
66
+ const sortedDomains = Object.keys(groups).sort();
67
+ const lines = ["=== Instinct Status ===", ""];
68
+ for (const domain of sortedDomains) {
69
+ const domainInstincts = groups[domain];
70
+ if (!domainInstincts || domainInstincts.length === 0)
71
+ continue;
72
+ lines.push(`## ${domain}`);
73
+ for (const instinct of domainInstincts) {
74
+ lines.push(formatInstinct(instinct));
75
+ }
76
+ lines.push("");
77
+ }
78
+ const total = instincts.length;
79
+ const flagged = instincts.filter((i) => i.flagged_for_removal).length;
80
+ lines.push(`Total: ${total} instinct${total !== 1 ? "s" : ""} (${flagged} flagged for removal)`);
81
+ return lines.join("\n");
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // loadAllInstincts
85
+ // ---------------------------------------------------------------------------
86
+ /**
87
+ * Loads all instincts from disk (project + global), including flagged ones.
88
+ * Does NOT apply confidence filtering - status command shows everything.
89
+ */
90
+ export function loadAllInstincts(projectId, baseDir) {
91
+ const projectInstincts = projectId != null ? loadProjectInstincts(projectId, baseDir) : [];
92
+ const globalInstincts = loadGlobalInstincts(baseDir);
93
+ return [...projectInstincts, ...globalInstincts];
94
+ }
95
+ // ---------------------------------------------------------------------------
96
+ // handleInstinctStatus
97
+ // ---------------------------------------------------------------------------
98
+ /**
99
+ * Command handler for /instinct-status.
100
+ * Loads all instincts, formats them grouped by domain, and notifies the user.
101
+ */
102
+ export async function handleInstinctStatus(_args, ctx, projectId, baseDir) {
103
+ const instincts = loadAllInstincts(projectId, baseDir);
104
+ const output = formatStatusOutput(instincts);
105
+ ctx.ui.notify(output, "info");
106
+ }
107
+ export { COMMAND_NAME };
108
+ //# sourceMappingURL=instinct-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-status.js","sourceRoot":"","sources":["../src/instinct-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Instinct CRUD operations.
3
+ * Provides functions to load, save, list, and delete instinct files from disk.
4
+ * Path traversal prevention: instinct IDs must be kebab-case (no ".." possible).
5
+ */
6
+ import type { Instinct } from "./types.js";
7
+ export declare function invalidateCache(dir?: string): void;
8
+ /**
9
+ * Load a single instinct from a .md file path.
10
+ */
11
+ export declare function loadInstinct(filePath: string): Instinct;
12
+ /**
13
+ * Save an instinct to <dir>/<id>.md.
14
+ * Validates the instinct ID against path traversal before writing.
15
+ */
16
+ export declare function saveInstinct(instinct: Instinct, dir: string): void;
17
+ /**
18
+ * List and load all instincts from a directory.
19
+ * Silently skips files that fail to parse (malformed instinct files).
20
+ */
21
+ export declare function listInstincts(dir: string): Instinct[];
22
+ /**
23
+ * Load all personal instincts for a specific project.
24
+ */
25
+ export declare function loadProjectInstincts(projectId: string, baseDir?: string): Instinct[];
26
+ /**
27
+ * Load all global personal instincts.
28
+ */
29
+ export declare function loadGlobalInstincts(baseDir?: string): Instinct[];
30
+ //# sourceMappingURL=instinct-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-store.d.ts","sourceRoot":"","sources":["../src/instinct-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAwB3C,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAMlD;AAkDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAGvD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAKlE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAkBrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,SAAe,GACrB,QAAQ,EAAE,CAGZ;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,SAAe,GAAG,QAAQ,EAAE,CAGtE"}