pi-continuous-learning 0.5.1 → 0.7.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 (89) hide show
  1. package/README.md +78 -0
  2. package/dist/agents-md.d.ts +23 -2
  3. package/dist/agents-md.d.ts.map +1 -1
  4. package/dist/agents-md.js +58 -3
  5. package/dist/agents-md.js.map +1 -1
  6. package/dist/cli/analyze-single-shot.d.ts +62 -0
  7. package/dist/cli/analyze-single-shot.d.ts.map +1 -0
  8. package/dist/cli/analyze-single-shot.js +105 -0
  9. package/dist/cli/analyze-single-shot.js.map +1 -0
  10. package/dist/cli/analyze.js +82 -81
  11. package/dist/cli/analyze.js.map +1 -1
  12. package/dist/command-scaffold.d.ts +25 -0
  13. package/dist/command-scaffold.d.ts.map +1 -0
  14. package/dist/command-scaffold.js +77 -0
  15. package/dist/command-scaffold.js.map +1 -0
  16. package/dist/confidence.d.ts.map +1 -1
  17. package/dist/confidence.js +2 -1
  18. package/dist/confidence.js.map +1 -1
  19. package/dist/config.d.ts +16 -0
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/config.js +31 -0
  22. package/dist/config.js.map +1 -1
  23. package/dist/graduation.d.ts +63 -0
  24. package/dist/graduation.d.ts.map +1 -0
  25. package/dist/graduation.js +155 -0
  26. package/dist/graduation.js.map +1 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +5 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/instinct-cleanup.d.ts +57 -0
  31. package/dist/instinct-cleanup.d.ts.map +1 -0
  32. package/dist/instinct-cleanup.js +150 -0
  33. package/dist/instinct-cleanup.js.map +1 -0
  34. package/dist/instinct-graduate.d.ts +43 -0
  35. package/dist/instinct-graduate.d.ts.map +1 -0
  36. package/dist/instinct-graduate.js +253 -0
  37. package/dist/instinct-graduate.js.map +1 -0
  38. package/dist/instinct-parser.d.ts.map +1 -1
  39. package/dist/instinct-parser.js +12 -0
  40. package/dist/instinct-parser.js.map +1 -1
  41. package/dist/instinct-tools.d.ts.map +1 -1
  42. package/dist/instinct-tools.js +19 -0
  43. package/dist/instinct-tools.js.map +1 -1
  44. package/dist/instinct-validator.d.ts +61 -0
  45. package/dist/instinct-validator.d.ts.map +1 -0
  46. package/dist/instinct-validator.js +235 -0
  47. package/dist/instinct-validator.js.map +1 -0
  48. package/dist/observation-preprocessor.d.ts +26 -0
  49. package/dist/observation-preprocessor.d.ts.map +1 -0
  50. package/dist/observation-preprocessor.js +31 -0
  51. package/dist/observation-preprocessor.js.map +1 -0
  52. package/dist/prompts/analyzer-system-single-shot.d.ts +6 -0
  53. package/dist/prompts/analyzer-system-single-shot.d.ts.map +1 -0
  54. package/dist/prompts/analyzer-system-single-shot.js +164 -0
  55. package/dist/prompts/analyzer-system-single-shot.js.map +1 -0
  56. package/dist/prompts/analyzer-user-single-shot.d.ts +22 -0
  57. package/dist/prompts/analyzer-user-single-shot.d.ts.map +1 -0
  58. package/dist/prompts/analyzer-user-single-shot.js +53 -0
  59. package/dist/prompts/analyzer-user-single-shot.js.map +1 -0
  60. package/dist/prompts/analyzer-user.d.ts +3 -1
  61. package/dist/prompts/analyzer-user.d.ts.map +1 -1
  62. package/dist/prompts/analyzer-user.js +20 -7
  63. package/dist/prompts/analyzer-user.js.map +1 -1
  64. package/dist/skill-scaffold.d.ts +23 -0
  65. package/dist/skill-scaffold.d.ts.map +1 -0
  66. package/dist/skill-scaffold.js +62 -0
  67. package/dist/skill-scaffold.js.map +1 -0
  68. package/dist/types.d.ts +8 -0
  69. package/dist/types.d.ts.map +1 -1
  70. package/package.json +1 -1
  71. package/src/agents-md.ts +73 -3
  72. package/src/cli/analyze-single-shot.ts +175 -0
  73. package/src/cli/analyze.ts +93 -124
  74. package/src/command-scaffold.ts +105 -0
  75. package/src/confidence.ts +2 -1
  76. package/src/config.ts +40 -0
  77. package/src/graduation.ts +243 -0
  78. package/src/index.ts +14 -0
  79. package/src/instinct-cleanup.ts +204 -0
  80. package/src/instinct-graduate.ts +377 -0
  81. package/src/instinct-parser.ts +12 -0
  82. package/src/instinct-tools.ts +26 -0
  83. package/src/instinct-validator.ts +287 -0
  84. package/src/observation-preprocessor.ts +48 -0
  85. package/src/prompts/analyzer-system-single-shot.ts +163 -0
  86. package/src/prompts/analyzer-user-single-shot.ts +94 -0
  87. package/src/prompts/analyzer-user.ts +26 -8
  88. package/src/skill-scaffold.ts +90 -0
  89. package/src/types.ts +10 -0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Auto-cleanup rules for instinct volume control.
3
+ *
4
+ * Cleanup is run at the start of each analysis pass, before decay.
5
+ * Rules (all thresholds are config-driven):
6
+ * 1. Delete flagged_for_removal instincts older than `flagged_cleanup_days`.
7
+ * 2. Delete zero-confirmation instincts older than `instinct_ttl_days`.
8
+ * 3. Enforce per-dir hard caps by deleting lowest-confidence instincts.
9
+ */
10
+ import type { Config } from "./types.js";
11
+ /**
12
+ * Deletes instincts marked `flagged_for_removal` whose `updated_at` is older
13
+ * than `flaggedCleanupDays`. `updated_at` is set when the flag is applied,
14
+ * so it serves as a proxy for when the instinct was flagged.
15
+ *
16
+ * @returns Number of instincts deleted.
17
+ */
18
+ export declare function cleanupFlaggedInstincts(dir: string, flaggedCleanupDays: number): number;
19
+ /**
20
+ * Deletes instincts with `confirmed_count === 0` whose `created_at` is older
21
+ * than `ttlDays`. These instincts were never validated by the agent and have
22
+ * aged out of relevance.
23
+ *
24
+ * @returns Number of instincts deleted.
25
+ */
26
+ export declare function cleanupZeroConfirmedInstincts(dir: string, ttlDays: number): number;
27
+ /**
28
+ * Enforces a hard cap on the number of instincts in a directory.
29
+ * When the count exceeds `maxCount`, deletes the lowest-confidence instincts
30
+ * until the count is at or below the cap.
31
+ *
32
+ * @returns Number of instincts deleted.
33
+ */
34
+ export declare function enforceInstinctCap(dir: string, maxCount: number): number;
35
+ export interface CleanupResult {
36
+ flaggedDeleted: number;
37
+ zeroConfirmedDeleted: number;
38
+ capDeleted: number;
39
+ total: number;
40
+ }
41
+ /**
42
+ * Runs all cleanup rules against a single directory.
43
+ * Order: flagged → zero-confirmed → cap enforcement (cap runs last so it
44
+ * accounts for deletions made by the earlier rules).
45
+ */
46
+ export declare function cleanupDir(dir: string, config: Config, maxCount: number): CleanupResult;
47
+ /**
48
+ * Runs a full cleanup pass over project and global instinct directories.
49
+ * Called at the start of each analysis run, before decay.
50
+ *
51
+ * @param projectId - Project ID to clean up (skipped when null/undefined)
52
+ * @param config - Runtime config (provides all thresholds)
53
+ * @param baseDir - Base storage directory (defaults to ~/.pi/continuous-learning/)
54
+ * @returns Aggregated cleanup result across both scopes
55
+ */
56
+ export declare function runCleanupPass(projectId: string | null | undefined, config: Config, baseDir?: string): CleanupResult;
57
+ //# sourceMappingURL=instinct-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-cleanup.d.ts","sourceRoot":"","sources":["../src/instinct-cleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAY,MAAM,EAAE,MAAM,YAAY,CAAC;AA+BnD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,kBAAkB,EAAE,MAAM,GACzB,MAAM,CAeR;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,MAAM,CAeR;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBxE;AAMD,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,aAAa,CASf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,MAAM,EAAE,MAAM,EACd,OAAO,SAAe,GACrB,aAAa,CAiCf"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Auto-cleanup rules for instinct volume control.
3
+ *
4
+ * Cleanup is run at the start of each analysis pass, before decay.
5
+ * Rules (all thresholds are config-driven):
6
+ * 1. Delete flagged_for_removal instincts older than `flagged_cleanup_days`.
7
+ * 2. Delete zero-confirmation instincts older than `instinct_ttl_days`.
8
+ * 3. Enforce per-dir hard caps by deleting lowest-confidence instincts.
9
+ */
10
+ import { unlinkSync, existsSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { listInstincts, invalidateCache } from "./instinct-store.js";
13
+ import { getBaseDir, getProjectInstinctsDir, getGlobalInstinctsDir, } from "./storage.js";
14
+ // ---------------------------------------------------------------------------
15
+ // Helpers
16
+ // ---------------------------------------------------------------------------
17
+ function ageInDays(isoDate) {
18
+ return (Date.now() - new Date(isoDate).getTime()) / (24 * 60 * 60 * 1000);
19
+ }
20
+ function deleteInstinctFile(instinct, dir) {
21
+ const filePath = join(dir, `${instinct.id}.md`);
22
+ if (!existsSync(filePath))
23
+ return false;
24
+ try {
25
+ unlinkSync(filePath);
26
+ return true;
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // Cleanup rules
34
+ // ---------------------------------------------------------------------------
35
+ /**
36
+ * Deletes instincts marked `flagged_for_removal` whose `updated_at` is older
37
+ * than `flaggedCleanupDays`. `updated_at` is set when the flag is applied,
38
+ * so it serves as a proxy for when the instinct was flagged.
39
+ *
40
+ * @returns Number of instincts deleted.
41
+ */
42
+ export function cleanupFlaggedInstincts(dir, flaggedCleanupDays) {
43
+ const instincts = listInstincts(dir);
44
+ let deleted = 0;
45
+ for (const instinct of instincts) {
46
+ if (instinct.flagged_for_removal &&
47
+ ageInDays(instinct.updated_at) >= flaggedCleanupDays) {
48
+ if (deleteInstinctFile(instinct, dir)) {
49
+ deleted++;
50
+ }
51
+ }
52
+ }
53
+ if (deleted > 0)
54
+ invalidateCache(dir);
55
+ return deleted;
56
+ }
57
+ /**
58
+ * Deletes instincts with `confirmed_count === 0` whose `created_at` is older
59
+ * than `ttlDays`. These instincts were never validated by the agent and have
60
+ * aged out of relevance.
61
+ *
62
+ * @returns Number of instincts deleted.
63
+ */
64
+ export function cleanupZeroConfirmedInstincts(dir, ttlDays) {
65
+ const instincts = listInstincts(dir);
66
+ let deleted = 0;
67
+ for (const instinct of instincts) {
68
+ if (instinct.confirmed_count === 0 &&
69
+ ageInDays(instinct.created_at) >= ttlDays) {
70
+ if (deleteInstinctFile(instinct, dir)) {
71
+ deleted++;
72
+ }
73
+ }
74
+ }
75
+ if (deleted > 0)
76
+ invalidateCache(dir);
77
+ return deleted;
78
+ }
79
+ /**
80
+ * Enforces a hard cap on the number of instincts in a directory.
81
+ * When the count exceeds `maxCount`, deletes the lowest-confidence instincts
82
+ * until the count is at or below the cap.
83
+ *
84
+ * @returns Number of instincts deleted.
85
+ */
86
+ export function enforceInstinctCap(dir, maxCount) {
87
+ const instincts = listInstincts(dir);
88
+ if (instincts.length <= maxCount)
89
+ return 0;
90
+ // Sort ascending by confidence - lowest confidence deleted first
91
+ const sorted = [...instincts].sort((a, b) => a.confidence - b.confidence);
92
+ const toDelete = sorted.slice(0, instincts.length - maxCount);
93
+ let deleted = 0;
94
+ for (const instinct of toDelete) {
95
+ if (deleteInstinctFile(instinct, dir)) {
96
+ deleted++;
97
+ }
98
+ }
99
+ if (deleted > 0)
100
+ invalidateCache(dir);
101
+ return deleted;
102
+ }
103
+ // ---------------------------------------------------------------------------
104
+ // Orchestrator
105
+ // ---------------------------------------------------------------------------
106
+ /**
107
+ * Runs all cleanup rules against a single directory.
108
+ * Order: flagged → zero-confirmed → cap enforcement (cap runs last so it
109
+ * accounts for deletions made by the earlier rules).
110
+ */
111
+ export function cleanupDir(dir, config, maxCount) {
112
+ const flaggedDeleted = cleanupFlaggedInstincts(dir, config.flagged_cleanup_days);
113
+ const zeroConfirmedDeleted = cleanupZeroConfirmedInstincts(dir, config.instinct_ttl_days);
114
+ const capDeleted = enforceInstinctCap(dir, maxCount);
115
+ const total = flaggedDeleted + zeroConfirmedDeleted + capDeleted;
116
+ return { flaggedDeleted, zeroConfirmedDeleted, capDeleted, total };
117
+ }
118
+ /**
119
+ * Runs a full cleanup pass over project and global instinct directories.
120
+ * Called at the start of each analysis run, before decay.
121
+ *
122
+ * @param projectId - Project ID to clean up (skipped when null/undefined)
123
+ * @param config - Runtime config (provides all thresholds)
124
+ * @param baseDir - Base storage directory (defaults to ~/.pi/continuous-learning/)
125
+ * @returns Aggregated cleanup result across both scopes
126
+ */
127
+ export function runCleanupPass(projectId, config, baseDir = getBaseDir()) {
128
+ const result = {
129
+ flaggedDeleted: 0,
130
+ zeroConfirmedDeleted: 0,
131
+ capDeleted: 0,
132
+ total: 0,
133
+ };
134
+ if (projectId) {
135
+ const projectDir = getProjectInstinctsDir(projectId, "personal", baseDir);
136
+ const projectResult = cleanupDir(projectDir, config, config.max_total_instincts_per_project);
137
+ result.flaggedDeleted += projectResult.flaggedDeleted;
138
+ result.zeroConfirmedDeleted += projectResult.zeroConfirmedDeleted;
139
+ result.capDeleted += projectResult.capDeleted;
140
+ result.total += projectResult.total;
141
+ }
142
+ const globalDir = getGlobalInstinctsDir("personal", baseDir);
143
+ const globalResult = cleanupDir(globalDir, config, config.max_total_instincts_global);
144
+ result.flaggedDeleted += globalResult.flaggedDeleted;
145
+ result.zeroConfirmedDeleted += globalResult.zeroConfirmedDeleted;
146
+ result.capDeleted += globalResult.capDeleted;
147
+ result.total += globalResult.total;
148
+ return result;
149
+ }
150
+ //# sourceMappingURL=instinct-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-cleanup.js","sourceRoot":"","sources":["../src/instinct-cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * /instinct-graduate command for pi-continuous-learning.
3
+ *
4
+ * Scans instincts for graduation candidates, presents proposals to the user,
5
+ * and writes to AGENTS.md / scaffolds skills / scaffolds commands on approval.
6
+ * Also enforces TTL - culling or decaying stale instincts.
7
+ */
8
+ import type { ExtensionAPI, ExtensionCommandContext } from "@mariozechner/pi-coding-agent";
9
+ import type { Instinct } from "./types.js";
10
+ import type { GraduationCandidate, DomainCluster, TtlResult } from "./graduation.js";
11
+ import type { SkillScaffold } from "./skill-scaffold.js";
12
+ import type { CommandScaffold } from "./command-scaffold.js";
13
+ export declare const COMMAND_NAME = "instinct-graduate";
14
+ /**
15
+ * Builds the full graduation prompt to send to the LLM for user-facing review.
16
+ */
17
+ export declare function buildGraduationPrompt(agentsMdCandidates: GraduationCandidate[], skillClusters: DomainCluster[], commandClusters: DomainCluster[], ttl: TtlResult): string;
18
+ /**
19
+ * Graduates instincts to AGENTS.md. Writes entries and marks instincts as graduated.
20
+ */
21
+ export declare function graduateToAgentsMd(instincts: Instinct[], agentsMdPath: string, baseDir: string): Instinct[];
22
+ /**
23
+ * Graduates instincts to a skill scaffold. Writes SKILL.md and marks instincts.
24
+ */
25
+ export declare function graduateToSkill(cluster: DomainCluster, outputDir: string, baseDir: string): SkillScaffold;
26
+ /**
27
+ * Graduates instincts to a command scaffold. Writes command doc and marks instincts.
28
+ */
29
+ export declare function graduateToCommand(cluster: DomainCluster, outputDir: string, baseDir: string): CommandScaffold;
30
+ /**
31
+ * Deletes TTL-expired instincts from disk.
32
+ */
33
+ export declare function cullExpiredInstincts(instincts: Instinct[], baseDir: string): number;
34
+ /**
35
+ * Aggressively decays TTL-expired instincts by halving their confidence.
36
+ */
37
+ export declare function decayExpiredInstincts(instincts: Instinct[], baseDir: string): number;
38
+ /**
39
+ * Command handler for /instinct-graduate.
40
+ * Scans for graduation candidates and sends a prompt for user review.
41
+ */
42
+ export declare function handleInstinctGraduate(_args: string, ctx: ExtensionCommandContext, pi: ExtensionAPI, projectId?: string | null, baseDir?: string, projectRoot?: string | null): Promise<void>;
43
+ //# sourceMappingURL=instinct-graduate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-graduate.d.ts","sourceRoot":"","sources":["../src/instinct-graduate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAW3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAErF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAsGhD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,kBAAkB,EAAE,mBAAmB,EAAE,EACzC,aAAa,EAAE,aAAa,EAAE,EAC9B,eAAe,EAAE,aAAa,EAAE,EAChC,GAAG,EAAE,SAAS,GACb,MAAM,CAqBR;AAgBD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,QAAQ,EAAE,EACrB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,QAAQ,EAAE,CAcZ;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,aAAa,CAaf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,eAAe,CAajB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,QAAQ,EAAE,EACrB,OAAO,EAAE,MAAM,GACd,MAAM,CAaR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,QAAQ,EAAE,EACrB,OAAO,EAAE,MAAM,GACd,MAAM,CAcR;AAMD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,uBAAuB,EAC5B,EAAE,EAAE,YAAY,EAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,OAAO,CAAC,IAAI,CAAC,CAsEf"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * /instinct-graduate command for pi-continuous-learning.
3
+ *
4
+ * Scans instincts for graduation candidates, presents proposals to the user,
5
+ * and writes to AGENTS.md / scaffolds skills / scaffolds commands on approval.
6
+ * Also enforces TTL - culling or decaying stale instincts.
7
+ */
8
+ import { join } from "node:path";
9
+ import { homedir } from "node:os";
10
+ import { unlinkSync } from "node:fs";
11
+ import { writeFileSync, mkdirSync } from "node:fs";
12
+ import { getBaseDir, getProjectInstinctsDir, getGlobalInstinctsDir } from "./storage.js";
13
+ import { loadProjectInstincts, loadGlobalInstincts, saveInstinct } from "./instinct-store.js";
14
+ import { readAgentsMd, appendToAgentsMd } from "./agents-md.js";
15
+ import { findAgentsMdCandidates, findSkillCandidates, findCommandCandidates, enforceTtl, markGraduated, } from "./graduation.js";
16
+ import { generateSkillScaffold } from "./skill-scaffold.js";
17
+ import { generateCommandScaffold } from "./command-scaffold.js";
18
+ // ---------------------------------------------------------------------------
19
+ // Constants
20
+ // ---------------------------------------------------------------------------
21
+ export const COMMAND_NAME = "instinct-graduate";
22
+ // ---------------------------------------------------------------------------
23
+ // Prompt building
24
+ // ---------------------------------------------------------------------------
25
+ function formatAgentsMdCandidates(candidates) {
26
+ if (candidates.length === 0)
27
+ return "";
28
+ const lines = [
29
+ "## AGENTS.md Graduation Candidates",
30
+ "",
31
+ `Found ${candidates.length} instinct${candidates.length !== 1 ? "s" : ""} ready for AGENTS.md:`,
32
+ "",
33
+ ];
34
+ for (const candidate of candidates) {
35
+ const inst = candidate.instinct;
36
+ lines.push(`- **${inst.id}** - "${inst.title}" (${inst.confidence.toFixed(2)} confidence, ${inst.confirmed_count} confirmations)`, ` Trigger: ${inst.trigger}`, ` ${candidate.reason}`, "");
37
+ }
38
+ return lines.join("\n");
39
+ }
40
+ function formatSkillClusters(clusters) {
41
+ if (clusters.length === 0)
42
+ return "";
43
+ const lines = [
44
+ "## Skill Scaffold Candidates",
45
+ "",
46
+ `Found ${clusters.length} domain cluster${clusters.length !== 1 ? "s" : ""} that could become skills:`,
47
+ "",
48
+ ];
49
+ for (const cluster of clusters) {
50
+ lines.push(`- **${cluster.domain}** domain (${cluster.instincts.length} instincts):`, ...cluster.instincts.map((i) => ` - ${i.id}: "${i.title}"`), "");
51
+ }
52
+ return lines.join("\n");
53
+ }
54
+ function formatCommandClusters(clusters) {
55
+ if (clusters.length === 0)
56
+ return "";
57
+ // Filter out clusters already covered by skill candidates (same domain)
58
+ const lines = [
59
+ "## Command Scaffold Candidates",
60
+ "",
61
+ `Found ${clusters.length} domain cluster${clusters.length !== 1 ? "s" : ""} that could become commands:`,
62
+ "",
63
+ ];
64
+ for (const cluster of clusters) {
65
+ lines.push(`- **/${cluster.domain}** command (${cluster.instincts.length} instincts):`, ...cluster.instincts.map((i) => ` - ${i.id}: "${i.title}"`), "");
66
+ }
67
+ return lines.join("\n");
68
+ }
69
+ function formatTtlResults(ttl) {
70
+ if (ttl.toCull.length === 0 && ttl.toDecay.length === 0)
71
+ return "";
72
+ const lines = ["## TTL Enforcement", ""];
73
+ if (ttl.toCull.length > 0) {
74
+ lines.push(`${ttl.toCull.length} instinct${ttl.toCull.length !== 1 ? "s" : ""} exceeded TTL with low confidence (will be deleted):`, "");
75
+ for (const inst of ttl.toCull) {
76
+ lines.push(`- ${inst.id}: "${inst.title}" (${inst.confidence.toFixed(2)})`);
77
+ }
78
+ lines.push("");
79
+ }
80
+ if (ttl.toDecay.length > 0) {
81
+ lines.push(`${ttl.toDecay.length} instinct${ttl.toDecay.length !== 1 ? "s" : ""} exceeded TTL but still have moderate confidence (will be aggressively decayed):`, "");
82
+ for (const inst of ttl.toDecay) {
83
+ lines.push(`- ${inst.id}: "${inst.title}" (${inst.confidence.toFixed(2)})`);
84
+ }
85
+ lines.push("");
86
+ }
87
+ return lines.join("\n");
88
+ }
89
+ /**
90
+ * Builds the full graduation prompt to send to the LLM for user-facing review.
91
+ */
92
+ export function buildGraduationPrompt(agentsMdCandidates, skillClusters, commandClusters, ttl) {
93
+ const sections = [
94
+ "I've analyzed your instincts for graduation readiness. Here's what I found:",
95
+ "",
96
+ formatAgentsMdCandidates(agentsMdCandidates),
97
+ formatSkillClusters(skillClusters),
98
+ formatCommandClusters(commandClusters),
99
+ formatTtlResults(ttl),
100
+ "## Next Steps",
101
+ "",
102
+ "For each category above, I can:",
103
+ "1. **Graduate to AGENTS.md** - Write approved instincts as permanent guidelines",
104
+ "2. **Scaffold a skill** - Generate a SKILL.md for a domain cluster",
105
+ "3. **Scaffold a command** - Generate a slash command for a workflow cluster",
106
+ "4. **Enforce TTL** - Delete or decay stale instincts",
107
+ "",
108
+ "Tell me which actions you'd like me to take. I'll use the instinct tools to execute.",
109
+ "You can approve all, pick specific instincts, or skip any category.",
110
+ ].filter((s) => s.length > 0);
111
+ return sections.join("\n");
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // Action helpers (called by LLM via tools, or directly)
115
+ // ---------------------------------------------------------------------------
116
+ /**
117
+ * Resolves the instinct directory for a given instinct.
118
+ */
119
+ function getInstinctDir(instinct, baseDir) {
120
+ if (instinct.scope === "project" && instinct.project_id) {
121
+ return getProjectInstinctsDir(instinct.project_id, "personal", baseDir);
122
+ }
123
+ return getGlobalInstinctsDir("personal", baseDir);
124
+ }
125
+ /**
126
+ * Graduates instincts to AGENTS.md. Writes entries and marks instincts as graduated.
127
+ */
128
+ export function graduateToAgentsMd(instincts, agentsMdPath, baseDir) {
129
+ if (instincts.length === 0)
130
+ return [];
131
+ appendToAgentsMd(agentsMdPath, instincts);
132
+ const graduated = [];
133
+ for (const instinct of instincts) {
134
+ const updated = markGraduated(instinct, "agents-md");
135
+ const dir = getInstinctDir(instinct, baseDir);
136
+ saveInstinct(updated, dir);
137
+ graduated.push(updated);
138
+ }
139
+ return graduated;
140
+ }
141
+ /**
142
+ * Graduates instincts to a skill scaffold. Writes SKILL.md and marks instincts.
143
+ */
144
+ export function graduateToSkill(cluster, outputDir, baseDir) {
145
+ const scaffold = generateSkillScaffold(cluster);
146
+ mkdirSync(outputDir, { recursive: true });
147
+ writeFileSync(join(outputDir, "SKILL.md"), scaffold.content, "utf-8");
148
+ for (const instinct of cluster.instincts) {
149
+ const updated = markGraduated(instinct, "skill");
150
+ const dir = getInstinctDir(instinct, baseDir);
151
+ saveInstinct(updated, dir);
152
+ }
153
+ return scaffold;
154
+ }
155
+ /**
156
+ * Graduates instincts to a command scaffold. Writes command doc and marks instincts.
157
+ */
158
+ export function graduateToCommand(cluster, outputDir, baseDir) {
159
+ const scaffold = generateCommandScaffold(cluster);
160
+ mkdirSync(outputDir, { recursive: true });
161
+ writeFileSync(join(outputDir, `${scaffold.name}-command.md`), scaffold.content, "utf-8");
162
+ for (const instinct of cluster.instincts) {
163
+ const updated = markGraduated(instinct, "command");
164
+ const dir = getInstinctDir(instinct, baseDir);
165
+ saveInstinct(updated, dir);
166
+ }
167
+ return scaffold;
168
+ }
169
+ /**
170
+ * Deletes TTL-expired instincts from disk.
171
+ */
172
+ export function cullExpiredInstincts(instincts, baseDir) {
173
+ let deleted = 0;
174
+ for (const instinct of instincts) {
175
+ const dir = getInstinctDir(instinct, baseDir);
176
+ const filePath = join(dir, `${instinct.id}.md`);
177
+ try {
178
+ unlinkSync(filePath);
179
+ deleted++;
180
+ }
181
+ catch {
182
+ // File may already be gone
183
+ }
184
+ }
185
+ return deleted;
186
+ }
187
+ /**
188
+ * Aggressively decays TTL-expired instincts by halving their confidence.
189
+ */
190
+ export function decayExpiredInstincts(instincts, baseDir) {
191
+ let decayed = 0;
192
+ for (const instinct of instincts) {
193
+ const updated = {
194
+ ...instinct,
195
+ confidence: Math.max(0.1, instinct.confidence * 0.5),
196
+ updated_at: new Date().toISOString(),
197
+ flagged_for_removal: true,
198
+ };
199
+ const dir = getInstinctDir(instinct, baseDir);
200
+ saveInstinct(updated, dir);
201
+ decayed++;
202
+ }
203
+ return decayed;
204
+ }
205
+ // ---------------------------------------------------------------------------
206
+ // handleInstinctGraduate
207
+ // ---------------------------------------------------------------------------
208
+ /**
209
+ * Command handler for /instinct-graduate.
210
+ * Scans for graduation candidates and sends a prompt for user review.
211
+ */
212
+ export async function handleInstinctGraduate(_args, ctx, pi, projectId, baseDir, projectRoot) {
213
+ const effectiveBase = baseDir ?? getBaseDir();
214
+ // Load all instincts
215
+ const projectInstincts = projectId
216
+ ? loadProjectInstincts(projectId, effectiveBase)
217
+ : [];
218
+ const globalInstincts = loadGlobalInstincts(effectiveBase);
219
+ const allInstincts = [...projectInstincts, ...globalInstincts];
220
+ if (allInstincts.length === 0) {
221
+ ctx.ui.notify("No instincts to analyze. Keep using pi to accumulate instincts first.", "info");
222
+ return;
223
+ }
224
+ // Read AGENTS.md for dedup
225
+ const agentsMdProject = projectRoot != null ? readAgentsMd(join(projectRoot, "AGENTS.md")) : null;
226
+ const agentsMdGlobal = readAgentsMd(join(homedir(), ".pi", "agent", "AGENTS.md"));
227
+ const combinedAgentsMd = [agentsMdProject, agentsMdGlobal]
228
+ .filter(Boolean)
229
+ .join("\n");
230
+ // Find candidates
231
+ const agentsMdCandidates = findAgentsMdCandidates(allInstincts, combinedAgentsMd.length > 0 ? combinedAgentsMd : null);
232
+ // Find clusters for skills and commands
233
+ // Only consider non-graduated, non-flagged instincts
234
+ const activeInstincts = allInstincts.filter((i) => i.graduated_to === undefined && !i.flagged_for_removal);
235
+ const skillClusters = findSkillCandidates(activeInstincts);
236
+ const commandClusters = findCommandCandidates(activeInstincts);
237
+ // Enforce TTL
238
+ const ttl = enforceTtl(allInstincts);
239
+ // Check if there's anything to report
240
+ const hasWork = agentsMdCandidates.length > 0 ||
241
+ skillClusters.length > 0 ||
242
+ commandClusters.length > 0 ||
243
+ ttl.toCull.length > 0 ||
244
+ ttl.toDecay.length > 0;
245
+ if (!hasWork) {
246
+ ctx.ui.notify("No instincts are ready for graduation and no TTL violations found. " +
247
+ "Instincts need >= 7 days age, >= 0.75 confidence, and >= 3 confirmations.", "info");
248
+ return;
249
+ }
250
+ const prompt = buildGraduationPrompt(agentsMdCandidates, skillClusters, commandClusters, ttl);
251
+ pi.sendUserMessage(prompt, { deliverAs: "followUp" });
252
+ }
253
+ //# sourceMappingURL=instinct-graduate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instinct-graduate.js","sourceRoot":"","sources":["../src/instinct-graduate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"instinct-parser.d.ts","sourceRoot":"","sources":["../src/instinct-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAyD3C;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAmDvD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAkC5D"}
1
+ {"version":3,"file":"instinct-parser.d.ts","sourceRoot":"","sources":["../src/instinct-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAyD3C;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAyDvD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAwC5D"}
@@ -102,6 +102,12 @@ export function parseInstinct(content) {
102
102
  if (fm["flagged_for_removal"] !== undefined && fm["flagged_for_removal"] !== null) {
103
103
  instinct.flagged_for_removal = Boolean(fm["flagged_for_removal"]);
104
104
  }
105
+ if (fm["graduated_to"] !== undefined && fm["graduated_to"] !== null) {
106
+ instinct.graduated_to = String(fm["graduated_to"]);
107
+ }
108
+ if (fm["graduated_at"] !== undefined && fm["graduated_at"] !== null) {
109
+ instinct.graduated_at = String(fm["graduated_at"]);
110
+ }
105
111
  return instinct;
106
112
  }
107
113
  /**
@@ -137,6 +143,12 @@ export function serializeInstinct(instinct) {
137
143
  if (instinct.flagged_for_removal !== undefined) {
138
144
  frontmatter["flagged_for_removal"] = instinct.flagged_for_removal;
139
145
  }
146
+ if (instinct.graduated_to !== undefined) {
147
+ frontmatter["graduated_to"] = instinct.graduated_to;
148
+ }
149
+ if (instinct.graduated_at !== undefined) {
150
+ frontmatter["graduated_at"] = instinct.graduated_at;
151
+ }
140
152
  const yamlStr = stringifyYaml(frontmatter);
141
153
  return `---\n${yamlStr}---\n\n${instinct.action}\n`;
142
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"instinct-parser.js","sourceRoot":"","sources":["../src/instinct-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instinct-parser.js","sourceRoot":"","sources":["../src/instinct-parser.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"instinct-tools.d.ts","sourceRoot":"","sources":["../src/instinct-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAItD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA2C3C,QAAA,MAAM,UAAU;;;EAGd,CAAC;AAEH,QAAA,MAAM,UAAU;;EAEd,CAAC;AAEH,QAAA,MAAM,WAAW;;;;;;;;;;;;;EAaf,CAAC;AAEH,QAAA,MAAM,YAAY;;;EAKhB,CAAC;AAEH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;EAmBf,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAC1D,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAE5D,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;yBASC,MAAM,UACX,kBAAkB,WACjB,WAAW,GAAG,SAAS,aACrB,OAAO,QACZ,OAAO;;;;;;;;;;EAsClB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,MAAM;;;;;;;;yBASC,MAAM,UACX,iBAAiB,WAChB,WAAW,GAAG,SAAS,aACrB,OAAO,QACZ,OAAO;;;;;;;EAalB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,MAAM;;;;;;;;;yBASC,MAAM,UACX,iBAAiB,WAChB,WAAW,GAAG,SAAS,aACrB,OAAO,QACZ,OAAO;;;;;;;;;EAiClB;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,MAAM;;;;;;;;;yBASC,MAAM,UACX,mBAAmB,WAClB,WAAW,GAAG,SAAS,aACrB,OAAO,QACZ,OAAO;;;;;;;;;;EA6BlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;yBASC,MAAM,UACX,kBAAkB,WACjB,WAAW,GAAG,SAAS,aACrB,OAAO,QACZ,OAAO;;;;;;;;;;EA2DlB;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAUN"}
1
+ {"version":3,"file":"instinct-tools.d.ts","sourceRoot":"","sources":["../src/instinct-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAItD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA4C3C,QAAA,MAAM,UAAU;;;EAGd,CAAC;AAEH,QAAA,MAAM,UAAU;;EAEd,CAAC;AAEH,QAAA,MAAM,WAAW;;;;;;;;;;;;;EAaf,CAAC;AAEH,QAAA,MAAM,YAAY;;;EAKhB,CAAC;AAEH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;EAmBf,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAC1D,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAE5D,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;yBASC,MAAM,UACX,kBAAkB,WACjB,WAAW,GAAG,SAAS,aACrB,OAAO,QACZ,OAAO;;;;;;;;;;EA+DlB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,MAAM;;;;;;;;yBASC,MAAM,UACX,iBAAiB,WAChB,WAAW,GAAG,SAAS,aACrB,OAAO,QACZ,OAAO;;;;;;;EAalB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,MAAM;;;;;;;;;yBASC,MAAM,UACX,iBAAiB,WAChB,WAAW,GAAG,SAAS,aACrB,OAAO,QACZ,OAAO;;;;;;;;;EAiClB;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,MAAM;;;;;;;;;yBASC,MAAM,UACX,mBAAmB,WAClB,WAAW,GAAG,SAAS,aACrB,OAAO,QACZ,OAAO;;;;;;;;;;EA6BlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;yBASC,MAAM,UACX,kBAAkB,WACjB,WAAW,GAAG,SAAS,aACrB,OAAO,QACZ,OAAO;;;;;;;;;;EA2DlB;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAUN"}
@@ -4,6 +4,7 @@ import { unlinkSync, existsSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { loadProjectInstincts, loadGlobalInstincts, saveInstinct, loadInstinct, } from "./instinct-store.js";
6
6
  import { getProjectInstinctsDir, getGlobalInstinctsDir, } from "./storage.js";
7
+ import { validateInstinct, findSimilarInstinct } from "./instinct-validator.js";
7
8
  function getInstinctsDir(scope, projectId, baseDir) {
8
9
  if (scope === "project") {
9
10
  return projectId ? getProjectInstinctsDir(projectId, "personal", baseDir) : null;
@@ -78,10 +79,28 @@ export function createInstinctWriteTool(projectId, projectName, baseDir) {
78
79
  promptSnippet: "Create or update a learned behavior instinct (trigger + action pattern)",
79
80
  parameters: WriteParams,
80
81
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
82
+ const validation = validateInstinct({
83
+ action: params.action,
84
+ trigger: params.trigger,
85
+ domain: params.domain,
86
+ });
87
+ if (!validation.valid) {
88
+ throw new Error(`Invalid instinct: ${validation.reason}`);
89
+ }
81
90
  const dir = getInstinctsDir(params.scope, projectId, baseDir);
82
91
  if (!dir) {
83
92
  throw new Error("Cannot write project-scoped instinct: no project detected");
84
93
  }
94
+ // Dedup check: reject if semantically similar to an existing instinct
95
+ const allInstincts = [
96
+ ...(projectId ? loadProjectInstincts(projectId, baseDir) : []),
97
+ ...loadGlobalInstincts(baseDir),
98
+ ];
99
+ const similar = findSimilarInstinct({ trigger: params.trigger, action: params.action }, allInstincts, params.id // skip self on updates
100
+ );
101
+ if (similar) {
102
+ throw new Error(`Similar instinct already exists: "${similar.instinct.id}" (similarity: ${(similar.similarity * 100).toFixed(0)}%). Update that instinct instead of creating a duplicate.`);
103
+ }
85
104
  const now = new Date().toISOString();
86
105
  const existing = findInstinctFile(params.id, projectId, baseDir);
87
106
  const instinct = {