@dzhechkov/harness-core 0.3.12 → 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/package.json +4 -4
- package/src/index.ts +2 -0
- package/src/plugin.ts +101 -0
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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiBjC,wDAAwD;AACxD,MAAM,UAAU,cAAc,CAC5B,WAAmB,EACnB,QAAkB,EAClB,OAA0E,EAAE;IAE5E,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACtD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,sCAAsC;IACtC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,gBAAgB,GAA2B;QAC/C,eAAe,EAAE,2DAA2D;QAC5E,YAAY,EAAE,+DAA+D;QAC7E,aAAa,EAAE,yDAAyD;QACxE,WAAW,EAAE,wDAAwD;QACrE,aAAa,EAAE,iEAAiE;KACjF,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QACjC,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,SAAS;KACzD,CAAC,CAAC,CAAC;IAEJ,MAAM,UAAU,GAAG;QACjB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,gBAAgB;QAC7B,WAAW,EAAE,qCAAqC,QAAQ,CAAC,WAAW,kBAAkB,QAAQ,CAAC,UAAU,+BAA+B;QAC1I,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO;QAChC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,yCAAyC;QACxE,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,CAAC,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC;QACvG,UAAU;QACV,WAAW,EAAE,QAAQ,CAAC,WAAW;KAClC,CAAC;IAEF,MAAM,eAAe,GAAG;QACtB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;QAC3B,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,6BAA6B;gBAC1C,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,UAAU,CAAC,WAAW;gBACnC,UAAU,EAAE,UAAU,CAAC,UAAU;gBACjC,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,UAAU,CAAC,QAAQ;aAC9B;YACD,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC3B,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE;gBACvB,WAAW,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBAClF,MAAM,EAAE,8BAA8B,IAAI,CAAC,IAAI,EAAE;gBACjD,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,WAAW,EAAE;gBACvE,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;aACtB,CAAC,CAAC;SACJ;KACF,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACtD,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAEhE,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,aAAa,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7E,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;AACjD,CAAC"}
|
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,11 +26,11 @@
|
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"yaml": "^2.0.0",
|
|
28
28
|
"@dzhechkov/adapter-claude": "0.2.0",
|
|
29
|
+
"@dzhechkov/adapter-hermes": "0.2.0",
|
|
29
30
|
"@dzhechkov/adapter-openclaude": "0.1.0",
|
|
30
|
-
"@dzhechkov/adapter-opencode": "0.2.0",
|
|
31
|
-
"@dzhechkov/core": "0.2.0",
|
|
32
31
|
"@dzhechkov/adapter-codex": "0.2.0",
|
|
33
|
-
"@dzhechkov/adapter-
|
|
32
|
+
"@dzhechkov/adapter-opencode": "0.2.0",
|
|
33
|
+
"@dzhechkov/core": "0.2.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/node": "^25.6.0",
|
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
|
+
}
|