ac-framework 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +26 -0
  2. package/bin/postinstall.js +21 -1
  3. package/framework/.agent/skills/acfm-memory/SKILL.md +312 -0
  4. package/framework/.agent/workflows/ac-lite.md +192 -0
  5. package/framework/.agent/workflows/ac.md +40 -0
  6. package/framework/.amazonq/prompts/ac-lite.md +192 -0
  7. package/framework/.amazonq/prompts/ac.md +40 -0
  8. package/framework/.amazonq/skills/acfm-memory/SKILL.md +312 -0
  9. package/framework/.antigravity/skills/acfm-memory/SKILL.md +312 -0
  10. package/framework/.antigravity/workflows/ac-lite.md +192 -0
  11. package/framework/.antigravity/workflows/ac.md +40 -0
  12. package/framework/.augment/commands/ac-lite.md +192 -0
  13. package/framework/.augment/commands/ac.md +40 -0
  14. package/framework/.augment/skills/acfm-memory/SKILL.md +312 -0
  15. package/framework/.claude/commands/opsx/ac-lite.md +192 -0
  16. package/framework/.claude/commands/opsx/ac.md +40 -0
  17. package/framework/.claude/skills/acfm-memory/SKILL.md +312 -0
  18. package/framework/.cline/commands/opsx/ac-lite.md +192 -0
  19. package/framework/.cline/commands/opsx/ac.md +40 -0
  20. package/framework/.cline/skills/acfm-memory/SKILL.md +312 -0
  21. package/framework/.clinerules/skills/acfm-memory/SKILL.md +312 -0
  22. package/framework/.clinerules/workflows/ac-lite.md +192 -0
  23. package/framework/.clinerules/workflows/ac.md +40 -0
  24. package/framework/.codebuddy/commands/opsx/ac-lite.md +192 -0
  25. package/framework/.codebuddy/commands/opsx/ac.md +40 -0
  26. package/framework/.codebuddy/skills/acfm-memory/SKILL.md +312 -0
  27. package/framework/.codex/skills/acfm-memory/SKILL.md +312 -0
  28. package/framework/.continue/prompts/ac-lite.md +192 -0
  29. package/framework/.continue/prompts/ac.md +40 -0
  30. package/framework/.continue/skills/acfm-memory/SKILL.md +312 -0
  31. package/framework/.cospec/openspec/commands/ac-lite.md +192 -0
  32. package/framework/.cospec/openspec/commands/ac.md +40 -0
  33. package/framework/.cospec/skills/acfm-memory/SKILL.md +312 -0
  34. package/framework/.crush/commands/opsx/ac-lite.md +192 -0
  35. package/framework/.crush/commands/opsx/ac.md +40 -0
  36. package/framework/.crush/skills/acfm-memory/SKILL.md +312 -0
  37. package/framework/.cursor/commands/ac-lite.md +192 -0
  38. package/framework/.cursor/commands/ac.md +40 -0
  39. package/framework/.cursor/skills/acfm-memory/SKILL.md +312 -0
  40. package/framework/.factory/commands/ac-lite.md +192 -0
  41. package/framework/.factory/commands/ac.md +40 -0
  42. package/framework/.factory/skills/acfm-memory/SKILL.md +312 -0
  43. package/framework/.gemini/commands/opsx/ac-lite.md +192 -0
  44. package/framework/.gemini/commands/opsx/ac.md +40 -0
  45. package/framework/.gemini/skills/acfm-memory/SKILL.md +312 -0
  46. package/framework/.github/prompts/ac-lite.md +192 -0
  47. package/framework/.github/prompts/ac.md +40 -0
  48. package/framework/.github/skills/acfm-memory/SKILL.md +312 -0
  49. package/framework/.iflow/commands/ac-lite.md +192 -0
  50. package/framework/.iflow/commands/ac.md +40 -0
  51. package/framework/.iflow/skills/acfm-memory/SKILL.md +312 -0
  52. package/framework/.kilocode/skills/acfm-memory/SKILL.md +312 -0
  53. package/framework/.kilocode/workflows/ac-lite.md +192 -0
  54. package/framework/.kilocode/workflows/ac.md +40 -0
  55. package/framework/.kimi/skills/acfm-memory/SKILL.md +312 -0
  56. package/framework/.kimi/workflows/ac-lite.md +192 -0
  57. package/framework/.kimi/workflows/ac.md +40 -0
  58. package/framework/.opencode/command/ac-lite.md +192 -0
  59. package/framework/.opencode/command/ac.md +40 -0
  60. package/framework/.opencode/skills/acfm-memory/SKILL.md +312 -0
  61. package/framework/.qoder/commands/opsx/ac-lite.md +192 -0
  62. package/framework/.qoder/commands/opsx/ac.md +40 -0
  63. package/framework/.qoder/skills/acfm-memory/SKILL.md +312 -0
  64. package/framework/.qwen/commands/ac-lite.md +192 -0
  65. package/framework/.qwen/commands/ac.md +40 -0
  66. package/framework/.qwen/skills/acfm-memory/SKILL.md +312 -0
  67. package/framework/.roo/commands/ac-lite.md +192 -0
  68. package/framework/.roo/commands/ac.md +40 -0
  69. package/framework/.roo/skills/acfm-memory/SKILL.md +312 -0
  70. package/framework/.trae/skills/acfm-memory/SKILL.md +312 -0
  71. package/framework/.windsurf/skills/acfm-memory/SKILL.md +312 -0
  72. package/framework/.windsurf/workflows/ac-lite.md +192 -0
  73. package/framework/.windsurf/workflows/ac.md +40 -0
  74. package/framework/AGENTS.md +39 -0
  75. package/framework/CLAUDE.md +39 -0
  76. package/framework/GEMINI.md +39 -0
  77. package/framework/copilot-instructions.md +39 -0
  78. package/package.json +5 -2
  79. package/src/cli.js +2 -0
  80. package/src/commands/init.js +98 -0
  81. package/src/commands/memory.js +833 -0
  82. package/src/index.js +46 -0
  83. package/src/mcp/server.js +345 -0
  84. package/src/mcp/server.js.bak +727 -0
  85. package/src/memory/autosave.js +382 -0
  86. package/src/memory/database.js +178 -0
  87. package/src/memory/engine.js +727 -0
  88. package/src/memory/index.js +62 -0
  89. package/src/memory/utils.js +128 -0
  90. package/src/services/mcp-installer.js +194 -0
  91. package/src/services/spec-engine.js +69 -1
@@ -42,6 +42,45 @@ If you attempt to proceed without completing a required step, you MUST STOP and
42
42
  | Skill | Description | Primary Use | Required Before |
43
43
  |-------|-------------|-------------|-----------------|
44
44
  | `acfm-spec-workflow` | **START HERE - MANDATORY** - Understand the spec-driven workflow, directory structure (.acfm/ vs openspec/), and CLI commands. Essential before using any OpenSpec skills. | Foundation | **ANYTHING ELSE** |
45
+ | `acfm-memory` | **AUTONOMOUS MEMORY SYSTEM** - Persistent learning system that automatically saves important decisions, patterns, bugfixes. Use to recall context from previous changes and maintain knowledge across sessions. | Knowledge persistence | **AFTER ANY SIGNIFICANT WORK** |
46
+
47
+ ### Memory System (Automatic)
48
+
49
+ The AC Framework includes an **autonomous memory system** that learns from your work:
50
+
51
+ **What gets saved automatically:**
52
+ - Architectural decisions from proposals/designs
53
+ - Bugfix patterns and solutions
54
+ - Performance optimizations
55
+ - Refactoring techniques
56
+ - Security fixes
57
+ - API patterns and conventions
58
+
59
+ **How to use memory:**
60
+ ```bash
61
+ # Recall relevant context before starting work
62
+ acfm memory recall "implementing authentication"
63
+
64
+ # Search for specific patterns
65
+ acfm memory search "JWT token refresh"
66
+
67
+ # Get full context for current project
68
+ acfm memory recall
69
+
70
+ # View statistics
71
+ acfm memory stats
72
+ ```
73
+
74
+ **When the agent saves memory (automatic):**
75
+ 1. After completing proposal.md (saves architectural decisions)
76
+ 2. After fixing bugs (solutions are stored)
77
+ 3. After refactoring (techniques are recorded)
78
+ 4. After optimizations (performance insights)
79
+ 5. After any significant decision with confidence > 0.7
80
+
81
+ **The agent will inform you:** "💾 Memory saved: [brief description]" when auto-saving occurs.
82
+
83
+ **Privacy:** Content between `<private>...</private>` tags is automatically redacted before saving.
45
84
 
46
85
  ### OpenSpec Skills (The heart of the framework)
47
86
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ac-framework",
3
- "version": "1.7.0",
3
+ "version": "1.9.0",
4
4
  "description": "Agentic Coding Framework - Multi-assistant configuration system with OpenSpec workflows",
5
5
  "main": "src/index.js",
6
6
  "exports": {
@@ -42,13 +42,16 @@
42
42
  },
43
43
  "homepage": "https://github.com/b4san/AC-framework#readme",
44
44
  "dependencies": {
45
+ "@modelcontextprotocol/sdk": "^1.27.1",
46
+ "better-sqlite3": "^11.8.1",
45
47
  "chalk": "^5.3.0",
46
48
  "commander": "^12.1.0",
47
49
  "gradient-string": "^3.0.0",
48
50
  "inquirer": "^12.3.2",
49
51
  "js-yaml": "^4.1.1",
50
52
  "nanospinner": "^1.2.2",
51
- "tar": "^7.5.7"
53
+ "tar": "^7.5.7",
54
+ "zod": "^4.3.6"
52
55
  },
53
56
  "type": "module",
54
57
  "engines": {
package/src/cli.js CHANGED
@@ -7,6 +7,7 @@ import { fileURLToPath } from 'node:url';
7
7
  import { initCommand } from './commands/init.js';
8
8
  import { updateCommand } from './commands/update.js';
9
9
  import { specCommand } from './commands/spec.js';
10
+ import { memoryCommand } from './commands/memory.js';
10
11
  import { showBanner } from './ui/banner.js';
11
12
 
12
13
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -38,5 +39,6 @@ program
38
39
  });
39
40
 
40
41
  program.addCommand(specCommand());
42
+ program.addCommand(memoryCommand());
41
43
 
42
44
  program.parse();
@@ -14,6 +14,9 @@
14
14
  import chalk from 'chalk';
15
15
  import gradient from 'gradient-string';
16
16
  import inquirer from 'inquirer';
17
+ import { existsSync } from 'node:fs';
18
+ import { homedir } from 'node:os';
19
+ import { join } from 'node:path';
17
20
  import { DESCRIPTIONS, ASSISTANT_ICONS, BUNDLED } from '../config/constants.js';
18
21
  import { IDE_MD_MAP, AVAILABLE_MD_FILES, MD_DESCRIPTIONS } from '../config/ide-mapping.js';
19
22
  import { formatFolderName, sleep } from '../utils/helpers.js';
@@ -40,6 +43,100 @@ import {
40
43
 
41
44
  const acGradient = gradient(['#6C5CE7', '#00CEC9', '#0984E3']);
42
45
 
46
+ // ── Persistent Memory Setup ───────────────────────────────────────
47
+
48
+ /**
49
+ * First-time persistent memory setup.
50
+ * Only shown when ~/.acfm/memory.db does not yet exist.
51
+ *
52
+ * The memory store is named "NexusVault" — a unique, memorable name
53
+ * for the embedded knowledge base that persists context across sessions.
54
+ */
55
+ async function setupPersistentMemory() {
56
+ const memoryDbPath = join(homedir(), '.acfm', 'memory.db');
57
+
58
+ // Only ask on first run
59
+ if (existsSync(memoryDbPath)) return;
60
+
61
+ console.log();
62
+ await animatedSeparator(60);
63
+ console.log();
64
+
65
+ const vaultBadge = chalk.hex('#2D3436').bgHex('#6C5CE7').bold(' NexusVault ');
66
+ console.log(` ${vaultBadge} ${chalk.hex('#B2BEC3').bold('Persistent Memory System')}`);
67
+ console.log();
68
+ console.log(
69
+ chalk.hex('#636E72')(
70
+ ' NexusVault is an embedded SQLite knowledge base that lives at\n' +
71
+ ` ${chalk.hex('#DFE6E9')('~/.acfm/memory.db')} on your machine.\n\n` +
72
+ ' When enabled, your AI assistants will automatically:\n' +
73
+ ` ${chalk.hex('#00CEC9')('◆')} Remember architectural decisions, bugfixes & patterns\n` +
74
+ ` ${chalk.hex('#00CEC9')('◆')} Recall relevant context when you start a new task\n` +
75
+ ` ${chalk.hex('#00CEC9')('◆')} Connect to assistants via MCP (Model Context Protocol)\n\n` +
76
+ ' Your data never leaves your machine — fully offline & private.'
77
+ )
78
+ );
79
+ console.log();
80
+
81
+ const { enableMemory } = await inquirer.prompt([{
82
+ type: 'confirm',
83
+ name: 'enableMemory',
84
+ message: chalk.hex('#B2BEC3')('Enable NexusVault persistent memory?'),
85
+ default: true,
86
+ }]);
87
+
88
+ if (!enableMemory) {
89
+ console.log();
90
+ console.log(chalk.hex('#636E72')(' Skipped. You can enable it later with: acfm memory init'));
91
+ console.log();
92
+ return;
93
+ }
94
+
95
+ console.log();
96
+ console.log(chalk.hex('#B2BEC3')(' Initializing NexusVault...'));
97
+
98
+ // Init the SQLite database
99
+ const { initDatabase, isDatabaseInitialized } = await import('../memory/database.js');
100
+ if (!isDatabaseInitialized()) {
101
+ initDatabase();
102
+ }
103
+ console.log(
104
+ chalk.hex('#00CEC9')(' ◆ ') +
105
+ chalk.hex('#DFE6E9')('NexusVault database created at ~/.acfm/memory.db')
106
+ );
107
+
108
+ // Install MCP server into detected assistants
109
+ console.log();
110
+ console.log(chalk.hex('#B2BEC3')(' Connecting NexusVault to your AI assistants via MCP...'));
111
+ console.log();
112
+
113
+ const { detectAndInstallMCPs, ASSISTANTS, isAssistantInstalled } = await import('../services/mcp-installer.js');
114
+ const { installed, success } = detectAndInstallMCPs();
115
+
116
+ if (installed === 0) {
117
+ console.log(chalk.hex('#636E72')(' No AI assistants detected yet.'));
118
+ console.log(chalk.hex('#636E72')(' Run ' + chalk.hex('#DFE6E9')('acfm memory install-mcps') + ' after installing an assistant.'));
119
+ } else {
120
+ for (const assistant of ASSISTANTS) {
121
+ if (isAssistantInstalled(assistant)) {
122
+ console.log(
123
+ chalk.hex('#00CEC9')(' ◆ ') +
124
+ chalk.hex('#DFE6E9').bold(assistant.name) +
125
+ chalk.hex('#636E72')(` · MCP config → ${assistant.configPath}`)
126
+ );
127
+ }
128
+ }
129
+ console.log();
130
+ const successBadge = chalk.hex('#2D3436').bgHex('#00CEC9').bold(` ${success}/${installed} `);
131
+ console.log(` ${successBadge} ${chalk.hex('#B2BEC3')('assistants connected to NexusVault')}`);
132
+ }
133
+
134
+ console.log();
135
+ console.log(chalk.hex('#6C5CE7').bold(' NexusVault is active.'));
136
+ console.log(chalk.hex('#636E72')(' Use acfm memory --help to manage your knowledge base.'));
137
+ console.log();
138
+ }
139
+
43
140
  // ── Helpers ──────────────────────────────────────────────────────
44
141
 
45
142
  function buildChoices(folders) {
@@ -423,6 +520,7 @@ export async function initCommand(options = {}) {
423
520
  // ── Final result ──────────────────────────────────────────────
424
521
  if (errors.length === 0) {
425
522
  await celebrateSuccess(installed, targetDir);
523
+ await setupPersistentMemory();
426
524
  } else {
427
525
  await showFailureSummary(installed, errors);
428
526
  }