@dzhechkov/harness-core 0.3.11 → 0.3.13

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/dist/index.d.ts CHANGED
@@ -19,6 +19,8 @@ export { buildRegistry, searchRegistry, filterByCategory } from './registry.js';
19
19
  export { recommend } from './recommend.js';
20
20
  export { pretrain } from './pretrain.js';
21
21
  export { runSetup } from './setup.js';
22
+ export { generatePlugin } from './plugin.js';
23
+ export type { PluginManifest } from './plugin.js';
22
24
  export type { SetupOptions, SetupResult, SetupStep } from './setup.js';
23
25
  export type { PretrainResult, DetectedTech } from './pretrain.js';
24
26
  export type { RecommendationReport, SkillRecommendation } from './recommend.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAE5C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAClH,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,UAAU,CAAC;AAE5C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAClH,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -17,6 +17,7 @@ export { buildRegistry, searchRegistry, filterByCategory } from './registry.js';
17
17
  export { recommend } from './recommend.js';
18
18
  export { pretrain } from './pretrain.js';
19
19
  export { runSetup } from './setup.js';
20
+ export { generatePlugin } from './plugin.js';
20
21
  export { discoverPackages, publishPackages } from './publish.js';
21
22
  export { fetchAllDownloads } from './downloads.js';
22
23
  export { discoverInstalled, checkUpgrades } from './upgrade.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE5C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE5C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAK7C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Claude Plugin format generator — creates .claude-plugin/ from harness inventory.
3
+ *
4
+ * Generates plugin.json and marketplace.json compatible with the Claude
5
+ * plugin ecosystem (pi-claude-marketplace, skill-hub, anthropics/claude-plugins-official).
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import type { Registry } from './registry.js';
10
+ /** Plugin manifest. */
11
+ export interface PluginManifest {
12
+ readonly name: string;
13
+ readonly displayName: string;
14
+ readonly description: string;
15
+ readonly version: string;
16
+ readonly repository: string;
17
+ readonly license: string;
18
+ readonly keywords: readonly string[];
19
+ readonly skillPacks: readonly {
20
+ name: string;
21
+ skills: number;
22
+ description: string;
23
+ }[];
24
+ readonly totalSkills: number;
25
+ }
26
+ /** Generate .claude-plugin/ directory from registry. */
27
+ export declare function generatePlugin(projectRoot: string, registry: Registry, opts?: {
28
+ version?: string | undefined;
29
+ repository?: string | undefined;
30
+ }): {
31
+ pluginJsonPath: string;
32
+ marketplaceJsonPath: string;
33
+ };
34
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,uBAAuB;AACvB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wDAAwD;AACxD,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAO,GAC3E;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAoEzD"}
package/dist/plugin.js ADDED
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Claude Plugin format generator — creates .claude-plugin/ from harness inventory.
3
+ *
4
+ * Generates plugin.json and marketplace.json compatible with the Claude
5
+ * plugin ecosystem (pi-claude-marketplace, skill-hub, anthropics/claude-plugins-official).
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { existsSync, mkdirSync, writeFileSync, readdirSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ /** Generate .claude-plugin/ directory from registry. */
12
+ export function generatePlugin(projectRoot, registry, opts = {}) {
13
+ const pluginDir = join(projectRoot, '.claude-plugin');
14
+ mkdirSync(pluginDir, { recursive: true });
15
+ // Build skill pack info from registry
16
+ const packMap = new Map();
17
+ for (const entry of registry.entries) {
18
+ const count = packMap.get(entry.pack) ?? 0;
19
+ packMap.set(entry.pack, count + 1);
20
+ }
21
+ const packDescriptions = {
22
+ 'skills-devops': 'Infrastructure, CI/CD, security, testing, APIs, databases',
23
+ 'skills-mcp': 'MCP server integrations — search, email, productivity, memory',
24
+ 'skills-web3': 'DeFi, blockchain, crypto — quicknode, zerion, symbiosis',
25
+ 'skills-qe': 'Quality engineering — test generation, coverage, chaos',
26
+ 'skills-meta': 'Development process — explore, feature-adr, knowledge-extractor',
27
+ };
28
+ const skillPacks = [...packMap.entries()].map(([name, count]) => ({
29
+ name: name.replace('skills-', ''),
30
+ skills: count,
31
+ description: packDescriptions[name] ?? `${count} skills`,
32
+ }));
33
+ const pluginJson = {
34
+ name: 'dz-harness-hub',
35
+ displayName: 'DZ Harness Hub',
36
+ description: `Cross-platform AI skill harness — ${registry.totalSkills} skills across ${registry.totalPacks} packs for 5 agent platforms.`,
37
+ version: opts.version ?? '0.1.0',
38
+ repository: opts.repository ?? 'https://github.com/djd1m/dz-harness-hub',
39
+ license: 'MIT',
40
+ keywords: ['agent-skills', 'agentskills.io', 'cross-platform', 'claude-plugin', ...registry.categories],
41
+ skillPacks,
42
+ totalSkills: registry.totalSkills,
43
+ };
44
+ const marketplaceJson = {
45
+ name: 'dz-harness-hub',
46
+ description: pluginJson.description,
47
+ owner: { name: 'dzhechko' },
48
+ plugins: [
49
+ {
50
+ name: 'dz-harness-hub',
51
+ displayName: 'DZ Harness Hub — Full Suite',
52
+ source: './',
53
+ description: pluginJson.description,
54
+ repository: pluginJson.repository,
55
+ license: 'MIT',
56
+ keywords: pluginJson.keywords,
57
+ },
58
+ ...skillPacks.map((pack) => ({
59
+ name: `dz-${pack.name}`,
60
+ displayName: `DZ ${pack.name.charAt(0).toUpperCase() + pack.name.slice(1)} Skills`,
61
+ source: `packages/@dzhechkov/skills-${pack.name}`,
62
+ description: `${pack.skills} ${pack.name} skills — ${pack.description}`,
63
+ keywords: [pack.name],
64
+ })),
65
+ ],
66
+ };
67
+ const pluginJsonPath = join(pluginDir, 'plugin.json');
68
+ const marketplaceJsonPath = join(pluginDir, 'marketplace.json');
69
+ writeFileSync(pluginJsonPath, JSON.stringify(pluginJson, null, 2));
70
+ writeFileSync(marketplaceJsonPath, JSON.stringify(marketplaceJson, null, 2));
71
+ return { pluginJsonPath, marketplaceJsonPath };
72
+ }
73
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/dist/setup.d.ts CHANGED
@@ -12,11 +12,14 @@
12
12
  *
13
13
  * @packageDocumentation
14
14
  */
15
+ /** Memory backend type. */
16
+ export type MemoryBackend = 'jsonl' | 'agentdb';
15
17
  /** Setup options. */
16
18
  export interface SetupOptions {
17
19
  readonly projectRoot: string;
18
20
  readonly target: string;
19
21
  readonly preset?: string | undefined;
22
+ readonly memory?: MemoryBackend | undefined;
20
23
  readonly noHooks?: boolean | undefined;
21
24
  readonly noMemory?: boolean | undefined;
22
25
  readonly noPretrain?: boolean | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,qBAAqB;AACrB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED,oBAAoB;AACpB,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,2BAA2B;AAC3B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AA2CD,kCAAkC;AAClC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CA0FxD"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,2BAA2B;AAC3B,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhD,qBAAqB;AACrB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED,oBAAoB;AACpB,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,2BAA2B;AAC3B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AA6ED,kCAAkC;AAClC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CAwJxD"}
package/dist/setup.js CHANGED
@@ -15,13 +15,30 @@
15
15
  import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs';
16
16
  import { join } from 'node:path';
17
17
  /** Generate Claude Code hooks configuration for self-learning. */
18
- function generateHooksConfig(projectRoot) {
18
+ function generateHooksConfig(projectRoot, backend) {
19
19
  const dzDir = join(projectRoot, '.dz');
20
+ if (backend === 'agentdb') {
21
+ // agentdb backend: hooks use agentdb CLI to store patterns
22
+ const rvfPath = join(dzDir, 'memory.rvf');
23
+ return JSON.stringify({
24
+ hooks: {
25
+ SessionStart: [{
26
+ type: 'command',
27
+ command: `node -e "const fs=require('fs');const d=new Date().toISOString();try{require('child_process').execSync('npx agentdb add \\'${rvfPath}\\' \\'session-start: '+d+'\\'',{stdio:'pipe'})}catch{fs.appendFileSync('${dzDir}/sessions.jsonl',JSON.stringify({event:'start',ts:d,backend:'agentdb'})+'\\n')}"`,
28
+ }],
29
+ SessionEnd: [{
30
+ type: 'command',
31
+ command: `node -e "const fs=require('fs');const d=new Date().toISOString();try{require('child_process').execSync('npx agentdb add \\'${rvfPath}\\' \\'session-end: '+d+'\\'',{stdio:'pipe'})}catch{fs.appendFileSync('${dzDir}/sessions.jsonl',JSON.stringify({event:'end',ts:d,backend:'agentdb'})+'\\n')}"`,
32
+ }],
33
+ },
34
+ }, null, 2);
35
+ }
36
+ // JSONL backend (default)
20
37
  return JSON.stringify({
21
38
  hooks: {
22
39
  SessionStart: [{
23
40
  type: 'command',
24
- command: `node -e "const fs=require('fs');const p='${dzDir}/memory.db';const d=new Date().toISOString();fs.appendFileSync('${dzDir}/sessions.jsonl',JSON.stringify({event:'start',ts:d})+'\\n')"`,
41
+ command: `node -e "const fs=require('fs');const d=new Date().toISOString();fs.appendFileSync('${dzDir}/sessions.jsonl',JSON.stringify({event:'start',ts:d})+'\\n')"`,
25
42
  }],
26
43
  SessionEnd: [{
27
44
  type: 'command',
@@ -31,7 +48,7 @@ function generateHooksConfig(projectRoot) {
31
48
  }, null, 2);
32
49
  }
33
50
  /** Generate .dz/config.json with learning settings. */
34
- function generateDzConfig(target, preset) {
51
+ function generateDzConfig(target, preset, backend) {
35
52
  return JSON.stringify({
36
53
  version: '1.0.0',
37
54
  target,
@@ -43,9 +60,14 @@ function generateDzConfig(target, preset) {
43
60
  retentionDays: 90,
44
61
  },
45
62
  memory: {
46
- backend: 'jsonl',
47
- path: '.dz/sessions.jsonl',
48
- maxSizeMb: 10,
63
+ backend,
64
+ path: backend === 'agentdb' ? '.dz/memory.rvf' : '.dz/sessions.jsonl',
65
+ maxSizeMb: backend === 'agentdb' ? 100 : 10,
66
+ agentdb: backend === 'agentdb' ? {
67
+ learning: true,
68
+ vectorDim: 384,
69
+ mcpServer: 'agentdb',
70
+ } : undefined,
49
71
  },
50
72
  hooks: {
51
73
  sessionStart: true,
@@ -53,10 +75,32 @@ function generateDzConfig(target, preset) {
53
75
  },
54
76
  }, null, 2);
55
77
  }
78
+ /** Check if agentdb is available. */
79
+ function isAgentdbAvailable() {
80
+ try {
81
+ require('child_process').execSync('npx agentdb --version', { stdio: 'pipe', timeout: 10000 });
82
+ return true;
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
56
88
  /** Run full environment setup. */
57
89
  export function runSetup(opts) {
58
90
  const steps = [];
59
91
  const dzDir = join(opts.projectRoot, '.dz');
92
+ const backend = opts.memory ?? 'jsonl';
93
+ // Step 0: Check agentdb availability if requested
94
+ if (backend === 'agentdb') {
95
+ const available = isAgentdbAvailable();
96
+ if (available) {
97
+ steps.push({ name: 'AgentDB check', status: 'done', detail: 'agentdb available' });
98
+ }
99
+ else {
100
+ steps.push({ name: 'AgentDB check', status: 'error', detail: 'not found — install: npm i -g agentdb' });
101
+ // Fall through — will still create config, hooks will fallback to JSONL
102
+ }
103
+ }
60
104
  // Step 1: Create .dz directory
61
105
  if (!existsSync(dzDir)) {
62
106
  mkdirSync(dzDir, { recursive: true });
@@ -68,8 +112,8 @@ export function runSetup(opts) {
68
112
  // Step 2: Write .dz/config.json
69
113
  const configPath = join(dzDir, 'config.json');
70
114
  if (!existsSync(configPath) || opts.force) {
71
- writeFileSync(configPath, generateDzConfig(opts.target, opts.preset));
72
- steps.push({ name: 'Write .dz/config.json', status: 'done', detail: 'learning + memory config' });
115
+ writeFileSync(configPath, generateDzConfig(opts.target, opts.preset, backend));
116
+ steps.push({ name: 'Write .dz/config.json', status: 'done', detail: `${backend} backend` });
73
117
  }
74
118
  else {
75
119
  steps.push({ name: 'Write .dz/config.json', status: 'skipped', detail: 'already exists (use --force)' });
@@ -83,14 +127,48 @@ export function runSetup(opts) {
83
127
  else {
84
128
  steps.push({ name: 'Initialize sessions.jsonl', status: 'skipped', detail: 'already exists' });
85
129
  }
86
- // Step 4: Initialize patterns store
87
- const patternsPath = join(dzDir, 'patterns.jsonl');
88
- if (!existsSync(patternsPath)) {
89
- writeFileSync(patternsPath, '');
90
- steps.push({ name: 'Initialize patterns.jsonl', status: 'done', detail: 'pattern learning ready' });
130
+ // Step 4: Initialize memory store
131
+ if (backend === 'agentdb') {
132
+ // Initialize .rvf via agentdb CLI
133
+ const rvfPath = join(dzDir, 'memory.rvf');
134
+ if (!existsSync(rvfPath)) {
135
+ try {
136
+ const { execSync } = require('child_process');
137
+ execSync(`npx agentdb init "${rvfPath}"`, { stdio: 'pipe', timeout: 30000 });
138
+ steps.push({ name: 'Initialize memory.rvf', status: 'done', detail: 'agentdb vector memory' });
139
+ }
140
+ catch {
141
+ // Fallback: create empty file, agentdb will init on first use
142
+ writeFileSync(rvfPath, '');
143
+ steps.push({ name: 'Initialize memory.rvf', status: 'done', detail: 'placeholder (agentdb will init on first use)' });
144
+ }
145
+ }
146
+ else {
147
+ steps.push({ name: 'Initialize memory.rvf', status: 'skipped', detail: 'already exists' });
148
+ }
149
+ // Also create JSONL fallback
150
+ const sessionsPath = join(dzDir, 'sessions.jsonl');
151
+ if (!existsSync(sessionsPath))
152
+ writeFileSync(sessionsPath, '');
91
153
  }
92
154
  else {
93
- steps.push({ name: 'Initialize patterns.jsonl', status: 'skipped', detail: 'already exists' });
155
+ // JSONL backend
156
+ const sessionsPath = join(dzDir, 'sessions.jsonl');
157
+ if (!existsSync(sessionsPath)) {
158
+ writeFileSync(sessionsPath, '');
159
+ steps.push({ name: 'Initialize sessions.jsonl', status: 'done', detail: 'session tracking ready' });
160
+ }
161
+ else {
162
+ steps.push({ name: 'Initialize sessions.jsonl', status: 'skipped', detail: 'already exists' });
163
+ }
164
+ const patternsPath = join(dzDir, 'patterns.jsonl');
165
+ if (!existsSync(patternsPath)) {
166
+ writeFileSync(patternsPath, '');
167
+ steps.push({ name: 'Initialize patterns.jsonl', status: 'done', detail: 'pattern learning ready' });
168
+ }
169
+ else {
170
+ steps.push({ name: 'Initialize patterns.jsonl', status: 'skipped', detail: 'already exists' });
171
+ }
94
172
  }
95
173
  // Step 5: Configure hooks (write to .claude/settings.json)
96
174
  if (!opts.noHooks) {
@@ -98,18 +176,17 @@ export function runSetup(opts) {
98
176
  const settingsPath = join(settingsDir, 'settings.json');
99
177
  if (!existsSync(settingsPath) || opts.force) {
100
178
  mkdirSync(settingsDir, { recursive: true });
101
- writeFileSync(settingsPath, generateHooksConfig(opts.projectRoot));
102
- steps.push({ name: 'Configure hooks', status: 'done', detail: 'session-start + session-end hooks' });
179
+ writeFileSync(settingsPath, generateHooksConfig(opts.projectRoot, backend));
180
+ steps.push({ name: 'Configure hooks', status: 'done', detail: `${backend} session hooks` });
103
181
  }
104
182
  else {
105
- // Merge hooks into existing settings
106
183
  try {
107
184
  const existing = JSON.parse(readFileSync(settingsPath, 'utf-8'));
108
185
  if (!existing['hooks']) {
109
- const hooks = JSON.parse(generateHooksConfig(opts.projectRoot));
186
+ const hooks = JSON.parse(generateHooksConfig(opts.projectRoot, backend));
110
187
  existing['hooks'] = hooks.hooks;
111
188
  writeFileSync(settingsPath, JSON.stringify(existing, null, 2));
112
- steps.push({ name: 'Configure hooks', status: 'done', detail: 'merged into existing settings' });
189
+ steps.push({ name: 'Configure hooks', status: 'done', detail: `merged ${backend} hooks` });
113
190
  }
114
191
  else {
115
192
  steps.push({ name: 'Configure hooks', status: 'skipped', detail: 'hooks already configured' });
@@ -123,9 +200,31 @@ export function runSetup(opts) {
123
200
  else {
124
201
  steps.push({ name: 'Configure hooks', status: 'skipped', detail: '--no-hooks' });
125
202
  }
203
+ // Step 5.5: Register agentdb MCP server (if agentdb backend)
204
+ if (backend === 'agentdb') {
205
+ const mcpConfigPath = join(opts.projectRoot, '.claude', 'mcp.json');
206
+ if (!existsSync(mcpConfigPath) || opts.force) {
207
+ const mcpConfig = {
208
+ mcpServers: {
209
+ agentdb: {
210
+ command: 'npx',
211
+ args: ['agentdb@latest', 'mcp', 'start'],
212
+ },
213
+ },
214
+ };
215
+ mkdirSync(join(opts.projectRoot, '.claude'), { recursive: true });
216
+ writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2));
217
+ steps.push({ name: 'Register agentdb MCP', status: 'done', detail: '41 tools available' });
218
+ }
219
+ else {
220
+ steps.push({ name: 'Register agentdb MCP', status: 'skipped', detail: 'mcp.json already exists' });
221
+ }
222
+ }
126
223
  // Step 6: Update .gitignore
127
224
  const gitignorePath = join(opts.projectRoot, '.gitignore');
128
- const dzIgnoreEntry = '\n# DZ Harness learning data\n.dz/sessions.jsonl\n.dz/patterns.jsonl\n';
225
+ const dzIgnoreEntry = backend === 'agentdb'
226
+ ? '\n# DZ Harness learning data\n.dz/memory.rvf\n.dz/sessions.jsonl\n'
227
+ : '\n# DZ Harness learning data\n.dz/sessions.jsonl\n.dz/patterns.jsonl\n';
129
228
  if (existsSync(gitignorePath)) {
130
229
  const content = readFileSync(gitignorePath, 'utf-8');
131
230
  if (!content.includes('.dz/sessions.jsonl')) {
package/dist/setup.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/harness-core",
3
- "version": "0.3.11",
3
+ "version": "0.3.13",
4
4
  "description": "Shared harness logic - skill loading, additive apply, and the init/sync/verify/doctor operations.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -26,10 +26,10 @@
26
26
  "dependencies": {
27
27
  "yaml": "^2.0.0",
28
28
  "@dzhechkov/adapter-claude": "0.2.0",
29
- "@dzhechkov/adapter-opencode": "0.2.0",
30
- "@dzhechkov/adapter-codex": "0.2.0",
31
29
  "@dzhechkov/adapter-hermes": "0.2.0",
32
30
  "@dzhechkov/adapter-openclaude": "0.1.0",
31
+ "@dzhechkov/adapter-codex": "0.2.0",
32
+ "@dzhechkov/adapter-opencode": "0.2.0",
33
33
  "@dzhechkov/core": "0.2.0"
34
34
  },
35
35
  "devDependencies": {
package/src/index.ts CHANGED
@@ -21,6 +21,8 @@ export { buildRegistry, searchRegistry, filterByCategory } from './registry.js';
21
21
  export { recommend } from './recommend.js';
22
22
  export { pretrain } from './pretrain.js';
23
23
  export { runSetup } from './setup.js';
24
+ export { generatePlugin } from './plugin.js';
25
+ export type { PluginManifest } from './plugin.js';
24
26
  export type { SetupOptions, SetupResult, SetupStep } from './setup.js';
25
27
  export type { PretrainResult, DetectedTech } from './pretrain.js';
26
28
  export type { RecommendationReport, SkillRecommendation } from './recommend.js';
package/src/plugin.ts ADDED
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Claude Plugin format generator — creates .claude-plugin/ from harness inventory.
3
+ *
4
+ * Generates plugin.json and marketplace.json compatible with the Claude
5
+ * plugin ecosystem (pi-claude-marketplace, skill-hub, anthropics/claude-plugins-official).
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+
10
+ import { existsSync, mkdirSync, writeFileSync, readdirSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+
13
+ import type { Registry } from './registry.js';
14
+
15
+ /** Plugin manifest. */
16
+ export interface PluginManifest {
17
+ readonly name: string;
18
+ readonly displayName: string;
19
+ readonly description: string;
20
+ readonly version: string;
21
+ readonly repository: string;
22
+ readonly license: string;
23
+ readonly keywords: readonly string[];
24
+ readonly skillPacks: readonly { name: string; skills: number; description: string }[];
25
+ readonly totalSkills: number;
26
+ }
27
+
28
+ /** Generate .claude-plugin/ directory from registry. */
29
+ export function generatePlugin(
30
+ projectRoot: string,
31
+ registry: Registry,
32
+ opts: { version?: string | undefined; repository?: string | undefined } = {},
33
+ ): { pluginJsonPath: string; marketplaceJsonPath: string } {
34
+ const pluginDir = join(projectRoot, '.claude-plugin');
35
+ mkdirSync(pluginDir, { recursive: true });
36
+
37
+ // Build skill pack info from registry
38
+ const packMap = new Map<string, number>();
39
+ for (const entry of registry.entries) {
40
+ const count = packMap.get(entry.pack) ?? 0;
41
+ packMap.set(entry.pack, count + 1);
42
+ }
43
+
44
+ const packDescriptions: Record<string, string> = {
45
+ 'skills-devops': 'Infrastructure, CI/CD, security, testing, APIs, databases',
46
+ 'skills-mcp': 'MCP server integrations — search, email, productivity, memory',
47
+ 'skills-web3': 'DeFi, blockchain, crypto — quicknode, zerion, symbiosis',
48
+ 'skills-qe': 'Quality engineering — test generation, coverage, chaos',
49
+ 'skills-meta': 'Development process — explore, feature-adr, knowledge-extractor',
50
+ };
51
+
52
+ const skillPacks = [...packMap.entries()].map(([name, count]) => ({
53
+ name: name.replace('skills-', ''),
54
+ skills: count,
55
+ description: packDescriptions[name] ?? `${count} skills`,
56
+ }));
57
+
58
+ const pluginJson = {
59
+ name: 'dz-harness-hub',
60
+ displayName: 'DZ Harness Hub',
61
+ description: `Cross-platform AI skill harness — ${registry.totalSkills} skills across ${registry.totalPacks} packs for 5 agent platforms.`,
62
+ version: opts.version ?? '0.1.0',
63
+ repository: opts.repository ?? 'https://github.com/djd1m/dz-harness-hub',
64
+ license: 'MIT',
65
+ keywords: ['agent-skills', 'agentskills.io', 'cross-platform', 'claude-plugin', ...registry.categories],
66
+ skillPacks,
67
+ totalSkills: registry.totalSkills,
68
+ };
69
+
70
+ const marketplaceJson = {
71
+ name: 'dz-harness-hub',
72
+ description: pluginJson.description,
73
+ owner: { name: 'dzhechko' },
74
+ plugins: [
75
+ {
76
+ name: 'dz-harness-hub',
77
+ displayName: 'DZ Harness Hub — Full Suite',
78
+ source: './',
79
+ description: pluginJson.description,
80
+ repository: pluginJson.repository,
81
+ license: 'MIT',
82
+ keywords: pluginJson.keywords,
83
+ },
84
+ ...skillPacks.map((pack) => ({
85
+ name: `dz-${pack.name}`,
86
+ displayName: `DZ ${pack.name.charAt(0).toUpperCase() + pack.name.slice(1)} Skills`,
87
+ source: `packages/@dzhechkov/skills-${pack.name}`,
88
+ description: `${pack.skills} ${pack.name} skills — ${pack.description}`,
89
+ keywords: [pack.name],
90
+ })),
91
+ ],
92
+ };
93
+
94
+ const pluginJsonPath = join(pluginDir, 'plugin.json');
95
+ const marketplaceJsonPath = join(pluginDir, 'marketplace.json');
96
+
97
+ writeFileSync(pluginJsonPath, JSON.stringify(pluginJson, null, 2));
98
+ writeFileSync(marketplaceJsonPath, JSON.stringify(marketplaceJson, null, 2));
99
+
100
+ return { pluginJsonPath, marketplaceJsonPath };
101
+ }
package/src/setup.ts CHANGED
@@ -16,11 +16,15 @@
16
16
  import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs';
17
17
  import { join } from 'node:path';
18
18
 
19
+ /** Memory backend type. */
20
+ export type MemoryBackend = 'jsonl' | 'agentdb';
21
+
19
22
  /** Setup options. */
20
23
  export interface SetupOptions {
21
24
  readonly projectRoot: string;
22
25
  readonly target: string;
23
26
  readonly preset?: string | undefined;
27
+ readonly memory?: MemoryBackend | undefined;
24
28
  readonly noHooks?: boolean | undefined;
25
29
  readonly noMemory?: boolean | undefined;
26
30
  readonly noPretrain?: boolean | undefined;
@@ -43,13 +47,32 @@ export interface SetupStep {
43
47
  }
44
48
 
45
49
  /** Generate Claude Code hooks configuration for self-learning. */
46
- function generateHooksConfig(projectRoot: string): string {
50
+ function generateHooksConfig(projectRoot: string, backend: MemoryBackend): string {
47
51
  const dzDir = join(projectRoot, '.dz');
52
+
53
+ if (backend === 'agentdb') {
54
+ // agentdb backend: hooks use agentdb CLI to store patterns
55
+ const rvfPath = join(dzDir, 'memory.rvf');
56
+ return JSON.stringify({
57
+ hooks: {
58
+ SessionStart: [{
59
+ type: 'command',
60
+ command: `node -e "const fs=require('fs');const d=new Date().toISOString();try{require('child_process').execSync('npx agentdb add \\'${rvfPath}\\' \\'session-start: '+d+'\\'',{stdio:'pipe'})}catch{fs.appendFileSync('${dzDir}/sessions.jsonl',JSON.stringify({event:'start',ts:d,backend:'agentdb'})+'\\n')}"`,
61
+ }],
62
+ SessionEnd: [{
63
+ type: 'command',
64
+ command: `node -e "const fs=require('fs');const d=new Date().toISOString();try{require('child_process').execSync('npx agentdb add \\'${rvfPath}\\' \\'session-end: '+d+'\\'',{stdio:'pipe'})}catch{fs.appendFileSync('${dzDir}/sessions.jsonl',JSON.stringify({event:'end',ts:d,backend:'agentdb'})+'\\n')}"`,
65
+ }],
66
+ },
67
+ }, null, 2);
68
+ }
69
+
70
+ // JSONL backend (default)
48
71
  return JSON.stringify({
49
72
  hooks: {
50
73
  SessionStart: [{
51
74
  type: 'command',
52
- command: `node -e "const fs=require('fs');const p='${dzDir}/memory.db';const d=new Date().toISOString();fs.appendFileSync('${dzDir}/sessions.jsonl',JSON.stringify({event:'start',ts:d})+'\\n')"`,
75
+ command: `node -e "const fs=require('fs');const d=new Date().toISOString();fs.appendFileSync('${dzDir}/sessions.jsonl',JSON.stringify({event:'start',ts:d})+'\\n')"`,
53
76
  }],
54
77
  SessionEnd: [{
55
78
  type: 'command',
@@ -60,7 +83,7 @@ function generateHooksConfig(projectRoot: string): string {
60
83
  }
61
84
 
62
85
  /** Generate .dz/config.json with learning settings. */
63
- function generateDzConfig(target: string, preset: string | undefined): string {
86
+ function generateDzConfig(target: string, preset: string | undefined, backend: MemoryBackend): string {
64
87
  return JSON.stringify({
65
88
  version: '1.0.0',
66
89
  target,
@@ -72,9 +95,14 @@ function generateDzConfig(target: string, preset: string | undefined): string {
72
95
  retentionDays: 90,
73
96
  },
74
97
  memory: {
75
- backend: 'jsonl',
76
- path: '.dz/sessions.jsonl',
77
- maxSizeMb: 10,
98
+ backend,
99
+ path: backend === 'agentdb' ? '.dz/memory.rvf' : '.dz/sessions.jsonl',
100
+ maxSizeMb: backend === 'agentdb' ? 100 : 10,
101
+ agentdb: backend === 'agentdb' ? {
102
+ learning: true,
103
+ vectorDim: 384,
104
+ mcpServer: 'agentdb',
105
+ } : undefined,
78
106
  },
79
107
  hooks: {
80
108
  sessionStart: true,
@@ -83,10 +111,32 @@ function generateDzConfig(target: string, preset: string | undefined): string {
83
111
  }, null, 2);
84
112
  }
85
113
 
114
+ /** Check if agentdb is available. */
115
+ function isAgentdbAvailable(): boolean {
116
+ try {
117
+ require('child_process').execSync('npx agentdb --version', { stdio: 'pipe', timeout: 10000 });
118
+ return true;
119
+ } catch {
120
+ return false;
121
+ }
122
+ }
123
+
86
124
  /** Run full environment setup. */
87
125
  export function runSetup(opts: SetupOptions): SetupResult {
88
126
  const steps: SetupStep[] = [];
89
127
  const dzDir = join(opts.projectRoot, '.dz');
128
+ const backend: MemoryBackend = opts.memory ?? 'jsonl';
129
+
130
+ // Step 0: Check agentdb availability if requested
131
+ if (backend === 'agentdb') {
132
+ const available = isAgentdbAvailable();
133
+ if (available) {
134
+ steps.push({ name: 'AgentDB check', status: 'done', detail: 'agentdb available' });
135
+ } else {
136
+ steps.push({ name: 'AgentDB check', status: 'error', detail: 'not found — install: npm i -g agentdb' });
137
+ // Fall through — will still create config, hooks will fallback to JSONL
138
+ }
139
+ }
90
140
 
91
141
  // Step 1: Create .dz directory
92
142
  if (!existsSync(dzDir)) {
@@ -99,8 +149,8 @@ export function runSetup(opts: SetupOptions): SetupResult {
99
149
  // Step 2: Write .dz/config.json
100
150
  const configPath = join(dzDir, 'config.json');
101
151
  if (!existsSync(configPath) || opts.force) {
102
- writeFileSync(configPath, generateDzConfig(opts.target, opts.preset));
103
- steps.push({ name: 'Write .dz/config.json', status: 'done', detail: 'learning + memory config' });
152
+ writeFileSync(configPath, generateDzConfig(opts.target, opts.preset, backend));
153
+ steps.push({ name: 'Write .dz/config.json', status: 'done', detail: `${backend} backend` });
104
154
  } else {
105
155
  steps.push({ name: 'Write .dz/config.json', status: 'skipped', detail: 'already exists (use --force)' });
106
156
  }
@@ -114,13 +164,42 @@ export function runSetup(opts: SetupOptions): SetupResult {
114
164
  steps.push({ name: 'Initialize sessions.jsonl', status: 'skipped', detail: 'already exists' });
115
165
  }
116
166
 
117
- // Step 4: Initialize patterns store
118
- const patternsPath = join(dzDir, 'patterns.jsonl');
119
- if (!existsSync(patternsPath)) {
120
- writeFileSync(patternsPath, '');
121
- steps.push({ name: 'Initialize patterns.jsonl', status: 'done', detail: 'pattern learning ready' });
167
+ // Step 4: Initialize memory store
168
+ if (backend === 'agentdb') {
169
+ // Initialize .rvf via agentdb CLI
170
+ const rvfPath = join(dzDir, 'memory.rvf');
171
+ if (!existsSync(rvfPath)) {
172
+ try {
173
+ const { execSync } = require('child_process') as typeof import('child_process');
174
+ execSync(`npx agentdb init "${rvfPath}"`, { stdio: 'pipe', timeout: 30000 });
175
+ steps.push({ name: 'Initialize memory.rvf', status: 'done', detail: 'agentdb vector memory' });
176
+ } catch {
177
+ // Fallback: create empty file, agentdb will init on first use
178
+ writeFileSync(rvfPath, '');
179
+ steps.push({ name: 'Initialize memory.rvf', status: 'done', detail: 'placeholder (agentdb will init on first use)' });
180
+ }
181
+ } else {
182
+ steps.push({ name: 'Initialize memory.rvf', status: 'skipped', detail: 'already exists' });
183
+ }
184
+ // Also create JSONL fallback
185
+ const sessionsPath = join(dzDir, 'sessions.jsonl');
186
+ if (!existsSync(sessionsPath)) writeFileSync(sessionsPath, '');
122
187
  } else {
123
- steps.push({ name: 'Initialize patterns.jsonl', status: 'skipped', detail: 'already exists' });
188
+ // JSONL backend
189
+ const sessionsPath = join(dzDir, 'sessions.jsonl');
190
+ if (!existsSync(sessionsPath)) {
191
+ writeFileSync(sessionsPath, '');
192
+ steps.push({ name: 'Initialize sessions.jsonl', status: 'done', detail: 'session tracking ready' });
193
+ } else {
194
+ steps.push({ name: 'Initialize sessions.jsonl', status: 'skipped', detail: 'already exists' });
195
+ }
196
+ const patternsPath = join(dzDir, 'patterns.jsonl');
197
+ if (!existsSync(patternsPath)) {
198
+ writeFileSync(patternsPath, '');
199
+ steps.push({ name: 'Initialize patterns.jsonl', status: 'done', detail: 'pattern learning ready' });
200
+ } else {
201
+ steps.push({ name: 'Initialize patterns.jsonl', status: 'skipped', detail: 'already exists' });
202
+ }
124
203
  }
125
204
 
126
205
  // Step 5: Configure hooks (write to .claude/settings.json)
@@ -130,17 +209,16 @@ export function runSetup(opts: SetupOptions): SetupResult {
130
209
 
131
210
  if (!existsSync(settingsPath) || opts.force) {
132
211
  mkdirSync(settingsDir, { recursive: true });
133
- writeFileSync(settingsPath, generateHooksConfig(opts.projectRoot));
134
- steps.push({ name: 'Configure hooks', status: 'done', detail: 'session-start + session-end hooks' });
212
+ writeFileSync(settingsPath, generateHooksConfig(opts.projectRoot, backend));
213
+ steps.push({ name: 'Configure hooks', status: 'done', detail: `${backend} session hooks` });
135
214
  } else {
136
- // Merge hooks into existing settings
137
215
  try {
138
216
  const existing = JSON.parse(readFileSync(settingsPath, 'utf-8')) as Record<string, unknown>;
139
217
  if (!existing['hooks']) {
140
- const hooks = JSON.parse(generateHooksConfig(opts.projectRoot));
218
+ const hooks = JSON.parse(generateHooksConfig(opts.projectRoot, backend));
141
219
  existing['hooks'] = hooks.hooks;
142
220
  writeFileSync(settingsPath, JSON.stringify(existing, null, 2));
143
- steps.push({ name: 'Configure hooks', status: 'done', detail: 'merged into existing settings' });
221
+ steps.push({ name: 'Configure hooks', status: 'done', detail: `merged ${backend} hooks` });
144
222
  } else {
145
223
  steps.push({ name: 'Configure hooks', status: 'skipped', detail: 'hooks already configured' });
146
224
  }
@@ -152,9 +230,31 @@ export function runSetup(opts: SetupOptions): SetupResult {
152
230
  steps.push({ name: 'Configure hooks', status: 'skipped', detail: '--no-hooks' });
153
231
  }
154
232
 
233
+ // Step 5.5: Register agentdb MCP server (if agentdb backend)
234
+ if (backend === 'agentdb') {
235
+ const mcpConfigPath = join(opts.projectRoot, '.claude', 'mcp.json');
236
+ if (!existsSync(mcpConfigPath) || opts.force) {
237
+ const mcpConfig = {
238
+ mcpServers: {
239
+ agentdb: {
240
+ command: 'npx',
241
+ args: ['agentdb@latest', 'mcp', 'start'],
242
+ },
243
+ },
244
+ };
245
+ mkdirSync(join(opts.projectRoot, '.claude'), { recursive: true });
246
+ writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2));
247
+ steps.push({ name: 'Register agentdb MCP', status: 'done', detail: '41 tools available' });
248
+ } else {
249
+ steps.push({ name: 'Register agentdb MCP', status: 'skipped', detail: 'mcp.json already exists' });
250
+ }
251
+ }
252
+
155
253
  // Step 6: Update .gitignore
156
254
  const gitignorePath = join(opts.projectRoot, '.gitignore');
157
- const dzIgnoreEntry = '\n# DZ Harness learning data\n.dz/sessions.jsonl\n.dz/patterns.jsonl\n';
255
+ const dzIgnoreEntry = backend === 'agentdb'
256
+ ? '\n# DZ Harness learning data\n.dz/memory.rvf\n.dz/sessions.jsonl\n'
257
+ : '\n# DZ Harness learning data\n.dz/sessions.jsonl\n.dz/patterns.jsonl\n';
158
258
  if (existsSync(gitignorePath)) {
159
259
  const content = readFileSync(gitignorePath, 'utf-8');
160
260
  if (!content.includes('.dz/sessions.jsonl')) {