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.
- package/README.md +26 -0
- package/bin/postinstall.js +21 -1
- package/framework/.agent/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.agent/workflows/ac-lite.md +192 -0
- package/framework/.agent/workflows/ac.md +40 -0
- package/framework/.amazonq/prompts/ac-lite.md +192 -0
- package/framework/.amazonq/prompts/ac.md +40 -0
- package/framework/.amazonq/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.antigravity/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.antigravity/workflows/ac-lite.md +192 -0
- package/framework/.antigravity/workflows/ac.md +40 -0
- package/framework/.augment/commands/ac-lite.md +192 -0
- package/framework/.augment/commands/ac.md +40 -0
- package/framework/.augment/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.claude/commands/opsx/ac-lite.md +192 -0
- package/framework/.claude/commands/opsx/ac.md +40 -0
- package/framework/.claude/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.cline/commands/opsx/ac-lite.md +192 -0
- package/framework/.cline/commands/opsx/ac.md +40 -0
- package/framework/.cline/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.clinerules/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.clinerules/workflows/ac-lite.md +192 -0
- package/framework/.clinerules/workflows/ac.md +40 -0
- package/framework/.codebuddy/commands/opsx/ac-lite.md +192 -0
- package/framework/.codebuddy/commands/opsx/ac.md +40 -0
- package/framework/.codebuddy/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.codex/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.continue/prompts/ac-lite.md +192 -0
- package/framework/.continue/prompts/ac.md +40 -0
- package/framework/.continue/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.cospec/openspec/commands/ac-lite.md +192 -0
- package/framework/.cospec/openspec/commands/ac.md +40 -0
- package/framework/.cospec/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.crush/commands/opsx/ac-lite.md +192 -0
- package/framework/.crush/commands/opsx/ac.md +40 -0
- package/framework/.crush/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.cursor/commands/ac-lite.md +192 -0
- package/framework/.cursor/commands/ac.md +40 -0
- package/framework/.cursor/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.factory/commands/ac-lite.md +192 -0
- package/framework/.factory/commands/ac.md +40 -0
- package/framework/.factory/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.gemini/commands/opsx/ac-lite.md +192 -0
- package/framework/.gemini/commands/opsx/ac.md +40 -0
- package/framework/.gemini/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.github/prompts/ac-lite.md +192 -0
- package/framework/.github/prompts/ac.md +40 -0
- package/framework/.github/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.iflow/commands/ac-lite.md +192 -0
- package/framework/.iflow/commands/ac.md +40 -0
- package/framework/.iflow/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.kilocode/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.kilocode/workflows/ac-lite.md +192 -0
- package/framework/.kilocode/workflows/ac.md +40 -0
- package/framework/.kimi/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.kimi/workflows/ac-lite.md +192 -0
- package/framework/.kimi/workflows/ac.md +40 -0
- package/framework/.opencode/command/ac-lite.md +192 -0
- package/framework/.opencode/command/ac.md +40 -0
- package/framework/.opencode/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.qoder/commands/opsx/ac-lite.md +192 -0
- package/framework/.qoder/commands/opsx/ac.md +40 -0
- package/framework/.qoder/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.qwen/commands/ac-lite.md +192 -0
- package/framework/.qwen/commands/ac.md +40 -0
- package/framework/.qwen/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.roo/commands/ac-lite.md +192 -0
- package/framework/.roo/commands/ac.md +40 -0
- package/framework/.roo/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.trae/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.windsurf/skills/acfm-memory/SKILL.md +312 -0
- package/framework/.windsurf/workflows/ac-lite.md +192 -0
- package/framework/.windsurf/workflows/ac.md +40 -0
- package/framework/AGENTS.md +39 -0
- package/framework/CLAUDE.md +39 -0
- package/framework/GEMINI.md +39 -0
- package/framework/copilot-instructions.md +39 -0
- package/package.json +5 -2
- package/src/cli.js +2 -0
- package/src/commands/init.js +98 -0
- package/src/commands/memory.js +833 -0
- package/src/index.js +46 -0
- package/src/mcp/server.js +345 -0
- package/src/mcp/server.js.bak +727 -0
- package/src/memory/autosave.js +382 -0
- package/src/memory/database.js +178 -0
- package/src/memory/engine.js +727 -0
- package/src/memory/index.js +62 -0
- package/src/memory/utils.js +128 -0
- package/src/services/mcp-installer.js +194 -0
- 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.
|
|
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();
|
package/src/commands/init.js
CHANGED
|
@@ -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
|
}
|