@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 +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +34 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +73 -0
- package/dist/plugin.js.map +1 -0
- package/dist/setup.d.ts +3 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +119 -20
- package/dist/setup.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +2 -0
- package/src/plugin.ts +101 -0
- package/src/setup.ts +120 -20
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -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;
|
package/dist/setup.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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 =
|
|
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":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
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.
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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 =
|
|
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')) {
|