codifier 2.1.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 (45) hide show
  1. package/README.md +543 -0
  2. package/commands/codify.md +7 -0
  3. package/commands/onboard.md +7 -0
  4. package/commands/push-memory.md +7 -0
  5. package/commands/recall.md +41 -0
  6. package/commands/remember.md +7 -0
  7. package/commands/research.md +7 -0
  8. package/dist/cli/add.d.ts +5 -0
  9. package/dist/cli/add.d.ts.map +1 -0
  10. package/dist/cli/add.js +25 -0
  11. package/dist/cli/add.js.map +1 -0
  12. package/dist/cli/bin/codifier.d.ts +7 -0
  13. package/dist/cli/bin/codifier.d.ts.map +1 -0
  14. package/dist/cli/bin/codifier.js +47 -0
  15. package/dist/cli/bin/codifier.js.map +1 -0
  16. package/dist/cli/detect.d.ts +15 -0
  17. package/dist/cli/detect.d.ts.map +1 -0
  18. package/dist/cli/detect.js +69 -0
  19. package/dist/cli/detect.js.map +1 -0
  20. package/dist/cli/doctor.d.ts +6 -0
  21. package/dist/cli/doctor.d.ts.map +1 -0
  22. package/dist/cli/doctor.js +71 -0
  23. package/dist/cli/doctor.js.map +1 -0
  24. package/dist/cli/init.d.ts +7 -0
  25. package/dist/cli/init.d.ts.map +1 -0
  26. package/dist/cli/init.js +144 -0
  27. package/dist/cli/init.js.map +1 -0
  28. package/dist/cli/update.d.ts +5 -0
  29. package/dist/cli/update.d.ts.map +1 -0
  30. package/dist/cli/update.js +38 -0
  31. package/dist/cli/update.js.map +1 -0
  32. package/dist/index.js +87 -0
  33. package/package.json +40 -0
  34. package/skills/brownfield-onboard/SKILL.md +142 -0
  35. package/skills/capture-session/SKILL.md +111 -0
  36. package/skills/initialize-project/SKILL.md +185 -0
  37. package/skills/initialize-project/templates/evals-prompt.md +39 -0
  38. package/skills/initialize-project/templates/requirements-prompt.md +44 -0
  39. package/skills/initialize-project/templates/roadmap-prompt.md +44 -0
  40. package/skills/initialize-project/templates/rules-prompt.md +34 -0
  41. package/skills/push-memory/SKILL.md +131 -0
  42. package/skills/research-analyze/SKILL.md +149 -0
  43. package/skills/research-analyze/templates/query-generation-prompt.md +61 -0
  44. package/skills/research-analyze/templates/synthesis-prompt.md +67 -0
  45. package/skills/shared/codifier-tools.md +187 -0
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Codifier CLI entry point
4
+ * Usage: npx codifier <command>
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=codifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codifier.d.ts","sourceRoot":"","sources":["../../../cli/bin/codifier.ts"],"names":[],"mappings":";AACA;;;GAGG"}
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Codifier CLI entry point
4
+ * Usage: npx codifier <command>
5
+ */
6
+ import { program } from 'commander';
7
+ import { runInit } from '../init.js';
8
+ import { runUpdate } from '../update.js';
9
+ import { runAdd } from '../add.js';
10
+ import { runDoctor } from '../doctor.js';
11
+ program
12
+ .name('codifier')
13
+ .description('Codifier MCP — install and manage AI skills for your project')
14
+ .version('2.0.0');
15
+ program
16
+ .command('init')
17
+ .description('Scaffold Codifier skills, slash commands, and MCP config into this project')
18
+ .option('--client <type>', 'Override client detection (claude-code, cowork, cursor, windsurf)')
19
+ .option('--url <serverUrl>', 'MCP server URL (skips interactive prompt)')
20
+ .option('--key <apiKey>', 'Codifier API key (skips interactive prompt)')
21
+ .action(async (opts) => {
22
+ await runInit(opts.client, opts.url, opts.key);
23
+ });
24
+ program
25
+ .command('update')
26
+ .description('Pull the latest skills from the npm package into .codifier/skills/')
27
+ .action(async () => {
28
+ await runUpdate();
29
+ });
30
+ program
31
+ .command('add <skill>')
32
+ .description('Install a single skill by name (e.g., research-analyze)')
33
+ .action(async (skill) => {
34
+ await runAdd(skill);
35
+ });
36
+ program
37
+ .command('doctor')
38
+ .description('Verify MCP connectivity and check installed skill files')
39
+ .option('--client <type>', 'Override client detection (claude-code, cowork, cursor, windsurf)')
40
+ .action(async (opts) => {
41
+ await runDoctor(opts.client);
42
+ });
43
+ program.parseAsync(process.argv).catch((err) => {
44
+ console.error('Error:', err.message);
45
+ process.exit(1);
46
+ });
47
+ //# sourceMappingURL=codifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codifier.js","sourceRoot":"","sources":["../../../cli/bin/codifier.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4EAA4E,CAAC;KACzF,MAAM,CAAC,iBAAiB,EAAE,mEAAmE,CAAC;KAC9F,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;KACxE,MAAM,CAAC,gBAAgB,EAAE,6CAA6C,CAAC;KACvE,MAAM,CAAC,KAAK,EAAE,IAAqD,EAAE,EAAE;IACtE,MAAM,OAAO,CAAC,IAAI,CAAC,MAAgC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oEAAoE,CAAC;KACjF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,SAAS,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;IAC9B,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,iBAAiB,EAAE,mEAAmE,CAAC;KAC9F,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;IAC1C,MAAM,SAAS,CAAC,IAAI,CAAC,MAAgC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IACpD,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Environment detection — identifies which LLM client is in use
3
+ * by checking for client-specific directories.
4
+ * Accepts an optional override for cases where auto-detection fails
5
+ * (e.g., Cowork has no pre-existing directory before init).
6
+ */
7
+ export type ClientType = 'claude-code' | 'cowork' | 'cursor' | 'windsurf' | 'generic';
8
+ export interface DetectedEnvironment {
9
+ clientType: ClientType;
10
+ commandsDir: string;
11
+ skillsDir: string;
12
+ mcpConfigPath: string;
13
+ }
14
+ export declare function detectEnvironment(cwd?: string, clientOverride?: ClientType): DetectedEnvironment;
15
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../cli/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAEtF,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,EAAE,cAAc,CAAC,EAAE,UAAU,GAAG,mBAAmB,CAuB/G"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Environment detection — identifies which LLM client is in use
3
+ * by checking for client-specific directories.
4
+ * Accepts an optional override for cases where auto-detection fails
5
+ * (e.g., Cowork has no pre-existing directory before init).
6
+ */
7
+ import { existsSync } from 'fs';
8
+ import { join } from 'path';
9
+ export function detectEnvironment(cwd = process.cwd(), clientOverride) {
10
+ if (clientOverride) {
11
+ return buildEnvironment(cwd, clientOverride);
12
+ }
13
+ // Cowork: .claude-plugin/ exists (re-init or manually created)
14
+ if (existsSync(join(cwd, '.claude-plugin'))) {
15
+ return buildEnvironment(cwd, 'cowork');
16
+ }
17
+ if (existsSync(join(cwd, '.claude'))) {
18
+ return buildEnvironment(cwd, 'claude-code');
19
+ }
20
+ if (existsSync(join(cwd, '.cursor'))) {
21
+ return buildEnvironment(cwd, 'cursor');
22
+ }
23
+ if (existsSync(join(cwd, '.windsurf'))) {
24
+ return buildEnvironment(cwd, 'windsurf');
25
+ }
26
+ return buildEnvironment(cwd, 'generic');
27
+ }
28
+ function buildEnvironment(cwd, clientType) {
29
+ switch (clientType) {
30
+ case 'cowork':
31
+ // Cowork plugin spec: commands/ and skills/ at project root,
32
+ // only plugin.json inside .claude-plugin/
33
+ return {
34
+ clientType,
35
+ commandsDir: join(cwd, 'commands'),
36
+ skillsDir: join(cwd, 'skills'),
37
+ mcpConfigPath: join(cwd, '.mcp.json'),
38
+ };
39
+ case 'claude-code':
40
+ return {
41
+ clientType,
42
+ commandsDir: join(cwd, '.claude', 'commands'),
43
+ skillsDir: join(cwd, '.codifier', 'skills'),
44
+ mcpConfigPath: join(cwd, '.mcp.json'),
45
+ };
46
+ case 'cursor':
47
+ return {
48
+ clientType,
49
+ commandsDir: join(cwd, '.cursor', 'rules'),
50
+ skillsDir: join(cwd, '.codifier', 'skills'),
51
+ mcpConfigPath: join(cwd, '.cursor', 'mcp.json'),
52
+ };
53
+ case 'windsurf':
54
+ return {
55
+ clientType,
56
+ commandsDir: join(cwd, '.windsurf', 'commands'),
57
+ skillsDir: join(cwd, '.codifier', 'skills'),
58
+ mcpConfigPath: join(cwd, '.windsurf', 'mcp.json'),
59
+ };
60
+ default:
61
+ return {
62
+ clientType,
63
+ commandsDir: join(cwd, '.codifier', 'commands'),
64
+ skillsDir: join(cwd, '.codifier', 'skills'),
65
+ mcpConfigPath: join(cwd, '.codifier', 'mcp.json'),
66
+ };
67
+ }
68
+ }
69
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../cli/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,MAAM,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE,EAAE,cAA2B;IACxF,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,gBAAgB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,CAAC;IAED,+DAA+D;IAC/D,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,UAAsB;IAC3D,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,6DAA6D;YAC7D,0CAA0C;YAC1C,OAAO;gBACL,UAAU;gBACV,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC;gBAClC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;gBAC9B,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC;aACtC,CAAC;QACJ,KAAK,aAAa;YAChB,OAAO;gBACL,UAAU;gBACV,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC;gBAC7C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC;gBAC3C,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC;aACtC,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,UAAU;gBACV,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC;gBAC1C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC;gBAC3C,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC;aAChD,CAAC;QACJ,KAAK,UAAU;YACb,OAAO;gBACL,UAAU;gBACV,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC;gBAC/C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC;gBAC3C,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC;aAClD,CAAC;QACJ;YACE,OAAO;gBACL,UAAU;gBACV,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC;gBAC/C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC;gBAC3C,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC;aAClD,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `codifier doctor` — verify installation health.
3
+ */
4
+ import { type ClientType } from './detect.js';
5
+ export declare function runDoctor(clientOverride?: ClientType): Promise<void>;
6
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../cli/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAQjE,wBAAsB,SAAS,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D1E"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * `codifier doctor` — verify installation health.
3
+ */
4
+ import { existsSync, readFileSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { detectEnvironment } from './detect.js';
7
+ const REQUIRED_SKILLS = [
8
+ 'initialize-project/SKILL.md',
9
+ 'brownfield-onboard/SKILL.md',
10
+ 'research-analyze/SKILL.md',
11
+ ];
12
+ export async function runDoctor(clientOverride) {
13
+ const cwd = process.cwd();
14
+ const env = detectEnvironment(cwd, clientOverride);
15
+ const configPath = join(cwd, '.codifier', 'config.json');
16
+ let allGood = true;
17
+ console.log(`\nCodifier Doctor (client: ${env.clientType})\n`);
18
+ // Check config
19
+ if (!existsSync(configPath)) {
20
+ console.error('✗ .codifier/config.json not found — run `codifier init` first');
21
+ allGood = false;
22
+ }
23
+ else {
24
+ console.log('✓ .codifier/config.json found');
25
+ }
26
+ // Check skill files in the client-appropriate location
27
+ for (const skillFile of REQUIRED_SKILLS) {
28
+ const fullPath = join(env.skillsDir, skillFile);
29
+ if (!existsSync(fullPath) || readFileSync(fullPath, 'utf8').trim().length === 0) {
30
+ console.error(`✗ Missing or empty: ${skillFile} in ${env.skillsDir}`);
31
+ allGood = false;
32
+ }
33
+ else {
34
+ console.log(`✓ ${skillFile}`);
35
+ }
36
+ }
37
+ // Check Cowork-specific files
38
+ if (env.clientType === 'cowork') {
39
+ const manifestPath = join(cwd, '.claude-plugin', 'plugin.json');
40
+ if (!existsSync(manifestPath)) {
41
+ console.error('✗ .claude-plugin/plugin.json not found — run `codifier init --client cowork` to regenerate');
42
+ allGood = false;
43
+ }
44
+ else {
45
+ console.log('✓ .claude-plugin/plugin.json found');
46
+ }
47
+ }
48
+ // Check MCP connectivity
49
+ if (existsSync(configPath)) {
50
+ try {
51
+ const config = JSON.parse(readFileSync(configPath, 'utf8'));
52
+ console.log('\nChecking MCP connectivity...');
53
+ const response = await fetch(`${config.serverUrl}/health`);
54
+ if (response.ok) {
55
+ console.log('✓ MCP server reachable');
56
+ }
57
+ else {
58
+ console.warn(`⚠ Health check returned ${response.status}`);
59
+ allGood = false;
60
+ }
61
+ }
62
+ catch {
63
+ console.warn('⚠ Could not reach MCP server');
64
+ allGood = false;
65
+ }
66
+ }
67
+ console.log(allGood ? '\n✅ All checks passed\n' : '\n⚠ Some checks failed — see above\n');
68
+ if (!allGood)
69
+ process.exit(1);
70
+ }
71
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../cli/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `codifier init` — one-time scaffolder.
3
+ * Copies skills, slash commands, and writes MCP config.
4
+ */
5
+ import { type ClientType } from './detect.js';
6
+ export declare function runInit(clientOverride?: ClientType, urlFlag?: string, keyFlag?: string): Promise<void>;
7
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../cli/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAoBjE,wBAAsB,OAAO,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G5G"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * `codifier init` — one-time scaffolder.
3
+ * Copies skills, slash commands, and writes MCP config.
4
+ */
5
+ import { mkdirSync, cpSync, writeFileSync, existsSync, readFileSync } from 'fs';
6
+ import { join, dirname } from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ import * as readline from 'readline';
9
+ import { detectEnvironment } from './detect.js';
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ // In the published npm package, skills/ is at the package root (sibling of dist/)
12
+ // When running from dist/cli/, the package root is two levels up
13
+ const PACKAGE_ROOT = join(__dirname, '..', '..');
14
+ const SKILLS_SOURCE = join(PACKAGE_ROOT, 'skills');
15
+ const COMMANDS_SOURCE = join(PACKAGE_ROOT, 'commands');
16
+ function prompt(question) {
17
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
18
+ return new Promise((resolve) => {
19
+ rl.question(question, (answer) => {
20
+ rl.close();
21
+ resolve(answer.trim());
22
+ });
23
+ });
24
+ }
25
+ export async function runInit(clientOverride, urlFlag, keyFlag) {
26
+ const cwd = process.cwd();
27
+ const env = detectEnvironment(cwd, clientOverride);
28
+ console.log(`\nCodifier Init — detected client: ${env.clientType}\n`);
29
+ // 1. Copy skills to the client-appropriate location
30
+ mkdirSync(env.skillsDir, { recursive: true });
31
+ if (existsSync(SKILLS_SOURCE)) {
32
+ cpSync(SKILLS_SOURCE, env.skillsDir, { recursive: true });
33
+ console.log(`✓ Skills copied to ${env.skillsDir}`);
34
+ }
35
+ else {
36
+ console.warn(`⚠ Skills source not found at ${SKILLS_SOURCE} — skipping`);
37
+ }
38
+ // 2. Copy slash commands to client-specific location
39
+ mkdirSync(env.commandsDir, { recursive: true });
40
+ if (existsSync(COMMANDS_SOURCE)) {
41
+ cpSync(COMMANDS_SOURCE, env.commandsDir, { recursive: true });
42
+ console.log(`✓ Commands copied to ${env.commandsDir}`);
43
+ }
44
+ else {
45
+ console.warn(`⚠ Commands source not found at ${COMMANDS_SOURCE} — skipping`);
46
+ }
47
+ // 2b. Cowork: write plugin.json manifest
48
+ if (env.clientType === 'cowork') {
49
+ const pluginDir = join(cwd, '.claude-plugin');
50
+ mkdirSync(pluginDir, { recursive: true });
51
+ const version = getPackageVersion();
52
+ const manifest = {
53
+ name: 'codifier',
54
+ description: 'Institutional memory for AI-driven development',
55
+ version,
56
+ };
57
+ writeFileSync(join(pluginDir, 'plugin.json'), JSON.stringify(manifest, null, 2));
58
+ console.log('✓ Cowork plugin manifest written to .claude-plugin/plugin.json');
59
+ }
60
+ // 3. Resolve server URL and API key: flags → env vars → interactive prompt → default/error
61
+ const DEFAULT_SERVER_URL = 'https://codifier-mcp.fly.dev';
62
+ const serverUrl = urlFlag
63
+ || process.env.CODIFIER_SERVER_URL
64
+ || (process.stdin.isTTY ? await prompt(`Codifier MCP server URL [${DEFAULT_SERVER_URL}]: `) : '')
65
+ || DEFAULT_SERVER_URL;
66
+ const apiKey = keyFlag
67
+ || process.env.CODIFIER_API_KEY
68
+ || (process.stdin.isTTY ? await prompt('Codifier API key: ') : '');
69
+ if (!apiKey) {
70
+ console.error('Error: No API key provided. Use --key <key> or set CODIFIER_API_KEY.');
71
+ process.exit(1);
72
+ }
73
+ // 4. Write .codifier/config.json
74
+ const configDir = join(cwd, '.codifier');
75
+ mkdirSync(configDir, { recursive: true });
76
+ const config = { serverUrl, apiKey, installedAt: new Date().toISOString() };
77
+ writeFileSync(join(configDir, 'config.json'), JSON.stringify(config, null, 2));
78
+ console.log('✓ Config saved to .codifier/config.json');
79
+ // 4b. Create docs/ directory for local artifact copies
80
+ const docsDir = join(cwd, 'docs');
81
+ mkdirSync(docsDir, { recursive: true });
82
+ console.log('✓ Created docs/ for local artifact storage');
83
+ // 4c. Create docs/MEMORY.md placeholder if it doesn't exist
84
+ const memoryFile = join(docsDir, 'MEMORY.md');
85
+ if (!existsSync(memoryFile)) {
86
+ const memoryPlaceholder = `# Project Memory
87
+ _Last updated: ${new Date().toISOString().split('T')[0]}_
88
+
89
+ `;
90
+ writeFileSync(memoryFile, memoryPlaceholder);
91
+ console.log('✓ Created docs/MEMORY.md for session memory capture');
92
+ }
93
+ // 5. Write MCP config (client-specific format)
94
+ const mcpConfig = buildMcpConfig(serverUrl, apiKey);
95
+ writeFileSync(env.mcpConfigPath, JSON.stringify(mcpConfig, null, 2));
96
+ console.log(`✓ MCP config written to ${env.mcpConfigPath}`);
97
+ // 6. Verify connectivity (best-effort)
98
+ console.log('\nVerifying MCP connectivity...');
99
+ try {
100
+ const response = await fetch(`${serverUrl}/health`);
101
+ if (response.ok) {
102
+ console.log('✓ MCP server reachable');
103
+ }
104
+ else {
105
+ console.warn(`⚠ Health check returned ${response.status} — check your server URL`);
106
+ }
107
+ }
108
+ catch {
109
+ console.warn('⚠ Could not reach MCP server — check the URL and ensure the server is running');
110
+ }
111
+ // 7. Print summary
112
+ console.log('\n✅ Codifier installed successfully!\n');
113
+ console.log('Available skills:');
114
+ console.log(' • Initialize Project → /codify');
115
+ console.log(' • Brownfield Onboard → /onboard');
116
+ console.log(' • Research & Analyze → /research');
117
+ console.log('\nMemory capture:');
118
+ console.log(' • Capture learnings → /remember');
119
+ console.log(' • Push to shared KB → /push-memory');
120
+ console.log(' • Recall learnings → /recall');
121
+ console.log('\n Artifacts and memories saved locally to docs/');
122
+ console.log('\nRun /codify in your LLM client to start your first project.\n');
123
+ }
124
+ function buildMcpConfig(serverUrl, apiKey) {
125
+ return {
126
+ mcpServers: {
127
+ codifier: {
128
+ url: `${serverUrl}/sse`,
129
+ headers: { Authorization: `Bearer ${apiKey}` },
130
+ },
131
+ },
132
+ };
133
+ }
134
+ function getPackageVersion() {
135
+ try {
136
+ const pkgPath = join(PACKAGE_ROOT, 'package.json');
137
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
138
+ return pkg.version;
139
+ }
140
+ catch {
141
+ return '2.0.0';
142
+ }
143
+ }
144
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * `codifier update` — pull latest skills from the npm package.
3
+ */
4
+ export declare function runUpdate(): Promise<void>;
5
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../cli/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA8B/C"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `codifier update` — pull latest skills from the npm package.
3
+ */
4
+ import { cpSync, existsSync, mkdirSync, writeFileSync } from 'fs';
5
+ import { join, dirname } from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ import { detectEnvironment } from './detect.js';
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ const PACKAGE_ROOT = join(__dirname, '..', '..');
10
+ const SKILLS_SOURCE = join(PACKAGE_ROOT, 'skills');
11
+ export async function runUpdate() {
12
+ const cwd = process.cwd();
13
+ const env = detectEnvironment(cwd);
14
+ if (!existsSync(env.skillsDir)) {
15
+ console.error(`Error: ${env.skillsDir} not found. Run \`codifier init\` first.`);
16
+ process.exit(1);
17
+ }
18
+ if (!existsSync(SKILLS_SOURCE)) {
19
+ console.error(`Error: Skills source not found at ${SKILLS_SOURCE}`);
20
+ process.exit(1);
21
+ }
22
+ cpSync(SKILLS_SOURCE, env.skillsDir, { recursive: true });
23
+ console.log(`✓ Skills updated in ${env.skillsDir}`);
24
+ console.log('Note: .codifier/config.json was preserved.');
25
+ // Backfill docs/MEMORY.md for users upgrading from a previous install
26
+ const docsDir = join(cwd, 'docs');
27
+ mkdirSync(docsDir, { recursive: true });
28
+ const memoryFile = join(docsDir, 'MEMORY.md');
29
+ if (!existsSync(memoryFile)) {
30
+ const memoryPlaceholder = `# Project Memory
31
+ _Last updated: ${new Date().toISOString().split('T')[0]}_
32
+
33
+ `;
34
+ writeFileSync(memoryFile, memoryPlaceholder);
35
+ console.log('✓ Created docs/MEMORY.md for session memory capture');
36
+ }
37
+ }
38
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../cli/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACjD,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAEnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,SAAS,0CAA0C,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,qCAAqC,aAAa,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAE1D,sEAAsE;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,iBAAiB,GAAG;iBACb,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;CAEtD,CAAC;QACE,aAAa,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,87 @@
1
+ /**
2
+ * CodifierMcp - MCP Server Entry Point
3
+ *
4
+ * Institutional memory system for AI-driven development.
5
+ * Provides fetch_context and update_memory tools via MCP protocol.
6
+ */
7
+ import { getConfig } from './config/env.js';
8
+ import { logger } from './utils/logger.js';
9
+ import { createDataStore } from './datastore/factory.js';
10
+ import { initializeMcpServer, connectStdioTransport } from './mcp/server.js';
11
+ import { startHttpServer } from './http/server.js';
12
+ /**
13
+ * Main entry point
14
+ */
15
+ async function main() {
16
+ try {
17
+ logger.info('Starting CodifierMcp server');
18
+ // Load and validate configuration
19
+ const config = getConfig();
20
+ logger.info('Configuration loaded', {
21
+ dataStore: config.DATA_STORE,
22
+ transportMode: config.TRANSPORT_MODE,
23
+ httpPort: config.TRANSPORT_MODE === 'http' ? config.HTTP_PORT : undefined,
24
+ logLevel: config.LOG_LEVEL,
25
+ });
26
+ // Create data store instance via factory
27
+ const dataStore = createDataStore(config);
28
+ logger.debug('Data store instance created', { backend: config.DATA_STORE });
29
+ // Initialize MCP server (transport-agnostic)
30
+ const server = await initializeMcpServer({
31
+ name: 'codifier-mcp',
32
+ version: '0.1.0',
33
+ dataStore,
34
+ });
35
+ // Connect appropriate transport based on configuration
36
+ if (config.TRANSPORT_MODE === 'stdio') {
37
+ logger.info('Starting server in stdio mode');
38
+ await connectStdioTransport(server);
39
+ logger.info('CodifierMcp server is ready (stdio transport)');
40
+ }
41
+ else if (config.TRANSPORT_MODE === 'http') {
42
+ logger.info('Starting server in HTTP mode');
43
+ await startHttpServer(server, {
44
+ port: config.HTTP_PORT,
45
+ apiAuthToken: config.API_AUTH_TOKEN,
46
+ dataStore,
47
+ });
48
+ logger.info('CodifierMcp server is ready (HTTP transport)');
49
+ }
50
+ logger.info('Tools available: fetch_context, update_memory');
51
+ // Handle graceful shutdown
52
+ process.on('SIGINT', async () => {
53
+ logger.info('Received SIGINT, shutting down gracefully');
54
+ try {
55
+ await server.close();
56
+ logger.info('Server closed successfully');
57
+ process.exit(0);
58
+ }
59
+ catch (error) {
60
+ logger.error('Error during shutdown', error);
61
+ process.exit(1);
62
+ }
63
+ });
64
+ process.on('SIGTERM', async () => {
65
+ logger.info('Received SIGTERM, shutting down gracefully');
66
+ try {
67
+ await server.close();
68
+ logger.info('Server closed successfully');
69
+ process.exit(0);
70
+ }
71
+ catch (error) {
72
+ logger.error('Error during shutdown', error);
73
+ process.exit(1);
74
+ }
75
+ });
76
+ }
77
+ catch (error) {
78
+ logger.error('Fatal error during startup', {
79
+ error: error instanceof Error ? error.message : 'Unknown error',
80
+ stack: error instanceof Error ? error.stack : undefined,
81
+ });
82
+ process.exit(1);
83
+ }
84
+ }
85
+ // Start the server
86
+ main();
87
+ //# sourceMappingURL=index.js.map
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "codifier",
3
+ "version": "2.1.0",
4
+ "description": "MCP server for institutional memory management",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "codifier": "dist/cli/bin/codifier.js"
8
+ },
9
+ "type": "module",
10
+ "files": [
11
+ "dist/cli/",
12
+ "skills/",
13
+ "commands/"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc && node dist/index.js",
18
+ "watch": "tsc --watch",
19
+ "start": "node dist/index.js",
20
+ "test": "node --test tests/http-server.test.js",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "dependencies": {
24
+ "@modelcontextprotocol/sdk": "^1.21.1",
25
+ "@supabase/supabase-js": "^2.95.3",
26
+ "commander": "^14.0.3",
27
+ "cors": "^2.8.5",
28
+ "express": "^5.0.0",
29
+ "js-yaml": "^4.1.0",
30
+ "repomix": "^0.3.0",
31
+ "zod": "^3.23.8"
32
+ },
33
+ "devDependencies": {
34
+ "@types/cors": "^2.8.17",
35
+ "@types/express": "^5.0.0",
36
+ "@types/js-yaml": "^4.0.9",
37
+ "@types/node": "^20.12.7",
38
+ "typescript": "^5.5.3"
39
+ }
40
+ }