jiva-core 0.2.2 → 0.3.1
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/.dockerignore +53 -0
- package/.gcloudignore +49 -0
- package/CONTRIBUTING.md +92 -0
- package/Dockerfile +63 -0
- package/LICENSE +21 -0
- package/README.md +248 -102
- package/cloud-run-deploy.yaml +135 -0
- package/cloud-run.yaml +135 -0
- package/cloud-run.yaml.template +143 -0
- package/deploy.sh +107 -0
- package/dist/core/agent-spawner.d.ts +89 -0
- package/dist/core/agent-spawner.d.ts.map +1 -0
- package/dist/core/agent-spawner.js +195 -0
- package/dist/core/agent-spawner.js.map +1 -0
- package/dist/core/client-agent.d.ts +82 -0
- package/dist/core/client-agent.d.ts.map +1 -0
- package/dist/core/client-agent.js +406 -0
- package/dist/core/client-agent.js.map +1 -0
- package/dist/core/config.d.ts +59 -10
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +19 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/conversation-manager.d.ts +10 -18
- package/dist/core/conversation-manager.d.ts.map +1 -1
- package/dist/core/conversation-manager.js +28 -60
- package/dist/core/conversation-manager.js.map +1 -1
- package/dist/core/dual-agent.d.ts +24 -3
- package/dist/core/dual-agent.d.ts.map +1 -1
- package/dist/core/dual-agent.js +112 -19
- package/dist/core/dual-agent.js.map +1 -1
- package/dist/core/manager-agent.d.ts +3 -1
- package/dist/core/manager-agent.d.ts.map +1 -1
- package/dist/core/manager-agent.js +66 -14
- package/dist/core/manager-agent.js.map +1 -1
- package/dist/core/worker-agent.d.ts +15 -1
- package/dist/core/worker-agent.d.ts.map +1 -1
- package/dist/core/worker-agent.js +244 -11
- package/dist/core/worker-agent.js.map +1 -1
- package/dist/core/workspace.d.ts +5 -0
- package/dist/core/workspace.d.ts.map +1 -1
- package/dist/core/workspace.js +47 -7
- package/dist/core/workspace.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/cli/index.js +376 -44
- package/dist/interfaces/cli/index.js.map +1 -1
- package/dist/interfaces/cli/repl.d.ts.map +1 -1
- package/dist/interfaces/cli/repl.js +6 -0
- package/dist/interfaces/cli/repl.js.map +1 -1
- package/dist/interfaces/http/index.d.ts +22 -0
- package/dist/interfaces/http/index.d.ts.map +1 -0
- package/dist/interfaces/http/index.js +135 -0
- package/dist/interfaces/http/index.js.map +1 -0
- package/dist/interfaces/http/middleware/auth.d.ts +32 -0
- package/dist/interfaces/http/middleware/auth.d.ts.map +1 -0
- package/dist/interfaces/http/middleware/auth.js +176 -0
- package/dist/interfaces/http/middleware/auth.js.map +1 -0
- package/dist/interfaces/http/routes/chat.d.ts +7 -0
- package/dist/interfaces/http/routes/chat.d.ts.map +1 -0
- package/dist/interfaces/http/routes/chat.js +144 -0
- package/dist/interfaces/http/routes/chat.js.map +1 -0
- package/dist/interfaces/http/routes/health.d.ts +6 -0
- package/dist/interfaces/http/routes/health.d.ts.map +1 -0
- package/dist/interfaces/http/routes/health.js +25 -0
- package/dist/interfaces/http/routes/health.js.map +1 -0
- package/dist/interfaces/http/routes/session.d.ts +7 -0
- package/dist/interfaces/http/routes/session.d.ts.map +1 -0
- package/dist/interfaces/http/routes/session.js +114 -0
- package/dist/interfaces/http/routes/session.js.map +1 -0
- package/dist/interfaces/http/session-manager.d.ts +76 -0
- package/dist/interfaces/http/session-manager.d.ts.map +1 -0
- package/dist/interfaces/http/session-manager.js +339 -0
- package/dist/interfaces/http/session-manager.js.map +1 -0
- package/dist/interfaces/http/websocket-handler.d.ts +18 -0
- package/dist/interfaces/http/websocket-handler.d.ts.map +1 -0
- package/dist/interfaces/http/websocket-handler.js +146 -0
- package/dist/interfaces/http/websocket-handler.js.map +1 -0
- package/dist/mcp/client.d.ts +11 -2
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +44 -19
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/server-manager.d.ts +1 -1
- package/dist/mcp/server-manager.d.ts.map +1 -1
- package/dist/mcp/server-manager.js +12 -2
- package/dist/mcp/server-manager.js.map +1 -1
- package/dist/personas/index.d.ts +13 -0
- package/dist/personas/index.d.ts.map +1 -0
- package/dist/personas/index.js +13 -0
- package/dist/personas/index.js.map +1 -0
- package/dist/personas/persona-loader.d.ts +30 -0
- package/dist/personas/persona-loader.d.ts.map +1 -0
- package/dist/personas/persona-loader.js +246 -0
- package/dist/personas/persona-loader.js.map +1 -0
- package/dist/personas/persona-manager.d.ts +82 -0
- package/dist/personas/persona-manager.d.ts.map +1 -0
- package/dist/personas/persona-manager.js +211 -0
- package/dist/personas/persona-manager.js.map +1 -0
- package/dist/personas/skill-loader.d.ts +35 -0
- package/dist/personas/skill-loader.d.ts.map +1 -0
- package/dist/personas/skill-loader.js +144 -0
- package/dist/personas/skill-loader.js.map +1 -0
- package/dist/personas/skill-packager.d.ts +25 -0
- package/dist/personas/skill-packager.d.ts.map +1 -0
- package/dist/personas/skill-packager.js +233 -0
- package/dist/personas/skill-packager.js.map +1 -0
- package/dist/personas/types.d.ts +134 -0
- package/dist/personas/types.d.ts.map +1 -0
- package/dist/personas/types.js +7 -0
- package/dist/personas/types.js.map +1 -0
- package/dist/personas/validator.d.ts +22 -0
- package/dist/personas/validator.d.ts.map +1 -0
- package/dist/personas/validator.js +144 -0
- package/dist/personas/validator.js.map +1 -0
- package/dist/storage/factory.d.ts +51 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +154 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/gcp-bucket-provider.d.ts +59 -0
- package/dist/storage/gcp-bucket-provider.d.ts.map +1 -0
- package/dist/storage/gcp-bucket-provider.js +275 -0
- package/dist/storage/gcp-bucket-provider.js.map +1 -0
- package/dist/storage/index.d.ts +33 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +37 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local-provider.d.ts +36 -0
- package/dist/storage/local-provider.d.ts.map +1 -0
- package/dist/storage/local-provider.js +219 -0
- package/dist/storage/local-provider.js.map +1 -0
- package/dist/storage/provider.d.ts +137 -0
- package/dist/storage/provider.d.ts.map +1 -0
- package/dist/storage/provider.js +136 -0
- package/dist/storage/provider.js.map +1 -0
- package/dist/storage/types.d.ts +78 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +14 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/utils/orchestration-logger.d.ts +36 -0
- package/dist/utils/orchestration-logger.d.ts.map +1 -0
- package/dist/utils/orchestration-logger.js +224 -0
- package/dist/utils/orchestration-logger.js.map +1 -0
- package/jiva-new-demo.gif +0 -0
- package/package.json +30 -2
- package/.fluen/cache/state.json +0 -7
- package/actions/action_registry.py +0 -75
- package/actions/python_coder.py +0 -470
- package/api/main.py +0 -269
- package/downloaded_image.avif +0 -0
- package/downloads/snipping_tool.avif +0 -0
- package/image.avif +0 -0
- package/ms_image.avif +0 -0
- package/screenshot.png +0 -0
- package/snipping_tool.avif +0 -0
- package/tmp_image.avif +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill loader - parses SKILL.md files with YAML frontmatter
|
|
3
|
+
* Implements progressive disclosure: L1 (metadata) → L2 (body) → L3 (references)
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as yaml from 'yaml';
|
|
8
|
+
import { validateSkillMetadata, validateFrontmatterKeys, validateSkillBodyLength, normalizeFrontmatter, } from './validator.js';
|
|
9
|
+
import { logger } from '../utils/logger.js';
|
|
10
|
+
const FRONTMATTER_REGEX = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/;
|
|
11
|
+
/**
|
|
12
|
+
* Parse SKILL.md file and extract frontmatter + body
|
|
13
|
+
*/
|
|
14
|
+
export async function parseSkillFile(filePath) {
|
|
15
|
+
try {
|
|
16
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
17
|
+
const match = content.match(FRONTMATTER_REGEX);
|
|
18
|
+
if (!match) {
|
|
19
|
+
throw new Error(`No YAML frontmatter found in ${filePath}. Skills must have --- delimited frontmatter.`);
|
|
20
|
+
}
|
|
21
|
+
const [, frontmatterStr, body] = match;
|
|
22
|
+
// Parse YAML frontmatter
|
|
23
|
+
let rawFrontmatter;
|
|
24
|
+
try {
|
|
25
|
+
rawFrontmatter = yaml.parse(frontmatterStr);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
throw new Error(`Invalid YAML in ${filePath}: ${error instanceof Error ? error.message : error}`);
|
|
29
|
+
}
|
|
30
|
+
// Validate frontmatter keys
|
|
31
|
+
const keyErrors = validateFrontmatterKeys(rawFrontmatter);
|
|
32
|
+
if (keyErrors.length > 0) {
|
|
33
|
+
logger.warn(`Skill ${filePath} has validation warnings:`, keyErrors);
|
|
34
|
+
}
|
|
35
|
+
// Normalize and validate metadata
|
|
36
|
+
const metadata = normalizeFrontmatter(rawFrontmatter);
|
|
37
|
+
const metadataErrors = validateSkillMetadata(metadata);
|
|
38
|
+
if (metadataErrors.length > 0) {
|
|
39
|
+
throw new Error(`Skill metadata validation failed for ${filePath}:\n` +
|
|
40
|
+
metadataErrors.map((e) => ` - ${e.field}: ${e.message}`).join('\n'));
|
|
41
|
+
}
|
|
42
|
+
// Validate body length (warning only)
|
|
43
|
+
const bodyErrors = validateSkillBodyLength(body);
|
|
44
|
+
if (bodyErrors.length > 0) {
|
|
45
|
+
logger.warn(`Skill ${metadata.name}:`, bodyErrors[0].message);
|
|
46
|
+
}
|
|
47
|
+
return { metadata, body: body.trim(), fullContent: content };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error.code === 'ENOENT') {
|
|
51
|
+
throw new Error(`SKILL.md not found at ${filePath}`);
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Discover all skills in a directory (L1 only - metadata)
|
|
58
|
+
* Each subdirectory with a SKILL.md is a skill
|
|
59
|
+
*/
|
|
60
|
+
export async function discoverSkills(skillsDir, personaName) {
|
|
61
|
+
const skills = [];
|
|
62
|
+
try {
|
|
63
|
+
const entries = await fs.readdir(skillsDir, { withFileTypes: true });
|
|
64
|
+
for (const entry of entries) {
|
|
65
|
+
if (!entry.isDirectory())
|
|
66
|
+
continue;
|
|
67
|
+
const skillPath = path.join(skillsDir, entry.name);
|
|
68
|
+
const skillFilePath = path.join(skillPath, 'SKILL.md');
|
|
69
|
+
try {
|
|
70
|
+
// Check if SKILL.md exists
|
|
71
|
+
await fs.access(skillFilePath);
|
|
72
|
+
// Parse L1 only (metadata)
|
|
73
|
+
const { metadata } = await parseSkillFile(skillFilePath);
|
|
74
|
+
skills.push({
|
|
75
|
+
metadata,
|
|
76
|
+
path: skillPath,
|
|
77
|
+
loaded: false, // L2 not yet loaded
|
|
78
|
+
personaName,
|
|
79
|
+
});
|
|
80
|
+
logger.debug(`Discovered skill: ${personaName}:${metadata.name}`);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
// Skip directories without valid SKILL.md
|
|
84
|
+
logger.debug(`Skipping ${skillPath}: ${error instanceof Error ? error.message : error}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (error.code === 'ENOENT') {
|
|
90
|
+
// Skills directory doesn't exist - that's ok
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
return skills;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Load L2 (full SKILL.md body) for a skill
|
|
99
|
+
*/
|
|
100
|
+
export async function loadSkillContent(skill) {
|
|
101
|
+
if (skill.loaded)
|
|
102
|
+
return;
|
|
103
|
+
const skillFilePath = path.join(skill.path, 'SKILL.md');
|
|
104
|
+
const { fullContent } = await parseSkillFile(skillFilePath);
|
|
105
|
+
skill.content = fullContent;
|
|
106
|
+
skill.loaded = true;
|
|
107
|
+
logger.debug(`Loaded L2 content for skill: ${skill.personaName}:${skill.metadata.name}`);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get path to a skill resource (L3 - references, scripts, assets)
|
|
111
|
+
*/
|
|
112
|
+
export function getSkillResourcePath(skill, resourceType, filename) {
|
|
113
|
+
return path.join(skill.path, resourceType, filename);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if a skill has a specific resource
|
|
117
|
+
*/
|
|
118
|
+
export async function hasSkillResource(skill, resourceType, filename) {
|
|
119
|
+
const resourcePath = getSkillResourcePath(skill, resourceType, filename);
|
|
120
|
+
try {
|
|
121
|
+
await fs.access(resourcePath);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* List all resources of a type in a skill
|
|
130
|
+
*/
|
|
131
|
+
export async function listSkillResources(skill, resourceType) {
|
|
132
|
+
const resourceDir = path.join(skill.path, resourceType);
|
|
133
|
+
try {
|
|
134
|
+
const entries = await fs.readdir(resourceDir, { withFileTypes: true });
|
|
135
|
+
return entries.filter((e) => e.isFile()).map((e) => e.name);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
if (error.code === 'ENOENT') {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=skill-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/personas/skill-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill packaging and installation utilities
|
|
3
|
+
* Handles .skill files (ZIP archives) and directory structures
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Package a skill directory into a .skill file (ZIP archive)
|
|
7
|
+
*/
|
|
8
|
+
export declare function packageSkill(skillDir: string, outputPath?: string): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Install a .skill file into a persona's skills directory
|
|
11
|
+
*/
|
|
12
|
+
export declare function installSkillFile(skillFile: string, personaName: string, personaPath?: string): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Uninstall a skill from a persona
|
|
15
|
+
*/
|
|
16
|
+
export declare function uninstallSkill(skillName: string, personaName: string, personaPath?: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Create a new empty skill directory structure
|
|
19
|
+
*/
|
|
20
|
+
export declare function createSkill(skillName: string, outputDir: string, options?: {
|
|
21
|
+
description?: string;
|
|
22
|
+
license?: string;
|
|
23
|
+
author?: string;
|
|
24
|
+
}): Promise<string>;
|
|
25
|
+
//# sourceMappingURL=skill-packager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-packager.d.ts","sourceRoot":"","sources":["../../src/personas/skill-packager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAgEjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAmFjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GACL,OAAO,CAAC,MAAM,CAAC,CA6EjB"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill packaging and installation utilities
|
|
3
|
+
* Handles .skill files (ZIP archives) and directory structures
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as os from 'os';
|
|
8
|
+
import { createReadStream, createWriteStream } from 'fs';
|
|
9
|
+
import { pipeline } from 'stream/promises';
|
|
10
|
+
import archiver from 'archiver';
|
|
11
|
+
import unzipper from 'unzipper';
|
|
12
|
+
import { parseSkillFile } from './skill-loader.js';
|
|
13
|
+
import { logger } from '../utils/logger.js';
|
|
14
|
+
/**
|
|
15
|
+
* Package a skill directory into a .skill file (ZIP archive)
|
|
16
|
+
*/
|
|
17
|
+
export async function packageSkill(skillDir, outputPath) {
|
|
18
|
+
// Validate that this is a skill directory
|
|
19
|
+
const skillMdPath = path.join(skillDir, 'SKILL.md');
|
|
20
|
+
try {
|
|
21
|
+
await fs.access(skillMdPath);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
throw new Error(`Not a valid skill directory: ${skillDir} (missing SKILL.md)`);
|
|
25
|
+
}
|
|
26
|
+
// Parse skill to get name
|
|
27
|
+
const { metadata } = await parseSkillFile(skillMdPath);
|
|
28
|
+
const skillName = metadata.name;
|
|
29
|
+
// Determine output path
|
|
30
|
+
const finalOutputPath = outputPath || path.join(process.cwd(), `${skillName}.skill`);
|
|
31
|
+
// Create archive
|
|
32
|
+
const output = createWriteStream(finalOutputPath);
|
|
33
|
+
const archive = archiver('zip', { zlib: { level: 9 } });
|
|
34
|
+
archive.on('warning', (err) => {
|
|
35
|
+
if (err.code === 'ENOENT') {
|
|
36
|
+
logger.warn('Archive warning:', err);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
archive.on('error', (err) => {
|
|
43
|
+
throw err;
|
|
44
|
+
});
|
|
45
|
+
archive.pipe(output);
|
|
46
|
+
// Add skill directory to archive
|
|
47
|
+
// Exclude common development files
|
|
48
|
+
archive.glob('**/*', {
|
|
49
|
+
cwd: skillDir,
|
|
50
|
+
ignore: [
|
|
51
|
+
'**/node_modules/**',
|
|
52
|
+
'**/__pycache__/**',
|
|
53
|
+
'**/evals/**',
|
|
54
|
+
'**/.git/**',
|
|
55
|
+
'**/.DS_Store',
|
|
56
|
+
'**/Thumbs.db',
|
|
57
|
+
'**/*.pyc',
|
|
58
|
+
'**/.env',
|
|
59
|
+
'**/.venv/**',
|
|
60
|
+
],
|
|
61
|
+
}, { prefix: path.basename(skillDir) });
|
|
62
|
+
await archive.finalize();
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
output.on('close', () => {
|
|
65
|
+
logger.info(`Packaged skill: ${finalOutputPath} (${archive.pointer()} bytes)`);
|
|
66
|
+
resolve(finalOutputPath);
|
|
67
|
+
});
|
|
68
|
+
output.on('error', reject);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Install a .skill file into a persona's skills directory
|
|
73
|
+
*/
|
|
74
|
+
export async function installSkillFile(skillFile, personaName, personaPath) {
|
|
75
|
+
// Verify file exists
|
|
76
|
+
try {
|
|
77
|
+
await fs.access(skillFile);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
throw new Error(`Skill file not found: ${skillFile}`);
|
|
81
|
+
}
|
|
82
|
+
// Determine target persona path
|
|
83
|
+
let targetPersonaPath;
|
|
84
|
+
if (personaPath) {
|
|
85
|
+
targetPersonaPath = personaPath;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Install to user-level persona
|
|
89
|
+
const home = os.homedir();
|
|
90
|
+
targetPersonaPath = path.join(home, '.jiva', 'personas', personaName);
|
|
91
|
+
}
|
|
92
|
+
const skillsDir = path.join(targetPersonaPath, 'skills');
|
|
93
|
+
// Ensure skills directory exists
|
|
94
|
+
await fs.mkdir(skillsDir, { recursive: true });
|
|
95
|
+
// Create temporary extraction directory
|
|
96
|
+
const tempDir = path.join(os.tmpdir(), `jiva-skill-${Date.now()}`);
|
|
97
|
+
await fs.mkdir(tempDir, { recursive: true });
|
|
98
|
+
try {
|
|
99
|
+
// Extract to temp directory
|
|
100
|
+
await pipeline(createReadStream(skillFile), unzipper.Extract({ path: tempDir }));
|
|
101
|
+
// Find the skill directory (should be the only top-level directory)
|
|
102
|
+
const entries = await fs.readdir(tempDir, { withFileTypes: true });
|
|
103
|
+
const skillDirs = entries.filter((e) => e.isDirectory());
|
|
104
|
+
if (skillDirs.length === 0) {
|
|
105
|
+
throw new Error('Invalid .skill file: no skill directory found');
|
|
106
|
+
}
|
|
107
|
+
if (skillDirs.length > 1) {
|
|
108
|
+
throw new Error('Invalid .skill file: multiple top-level directories found');
|
|
109
|
+
}
|
|
110
|
+
const extractedSkillDir = path.join(tempDir, skillDirs[0].name);
|
|
111
|
+
// Validate it's a proper skill
|
|
112
|
+
const skillMdPath = path.join(extractedSkillDir, 'SKILL.md');
|
|
113
|
+
const { metadata } = await parseSkillFile(skillMdPath);
|
|
114
|
+
// Move to final location
|
|
115
|
+
const finalSkillPath = path.join(skillsDir, metadata.name);
|
|
116
|
+
// Check if skill already exists
|
|
117
|
+
try {
|
|
118
|
+
await fs.access(finalSkillPath);
|
|
119
|
+
throw new Error(`Skill ${metadata.name} already exists in ${personaName}. Remove it first or use --force.`);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error.code !== 'ENOENT') {
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Move skill to final location
|
|
127
|
+
await fs.rename(extractedSkillDir, finalSkillPath);
|
|
128
|
+
logger.info(`Installed skill: ${metadata.name} → ${personaName} (${finalSkillPath})`);
|
|
129
|
+
return finalSkillPath;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
// Cleanup temp directory
|
|
133
|
+
try {
|
|
134
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
logger.warn(`Failed to cleanup temp directory: ${tempDir}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Uninstall a skill from a persona
|
|
143
|
+
*/
|
|
144
|
+
export async function uninstallSkill(skillName, personaName, personaPath) {
|
|
145
|
+
// Determine persona path
|
|
146
|
+
let targetPersonaPath;
|
|
147
|
+
if (personaPath) {
|
|
148
|
+
targetPersonaPath = personaPath;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const home = os.homedir();
|
|
152
|
+
targetPersonaPath = path.join(home, '.jiva', 'personas', personaName);
|
|
153
|
+
}
|
|
154
|
+
const skillPath = path.join(targetPersonaPath, 'skills', skillName);
|
|
155
|
+
// Verify skill exists
|
|
156
|
+
try {
|
|
157
|
+
await fs.access(skillPath);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
throw new Error(`Skill not found: ${skillName} in persona ${personaName}`);
|
|
161
|
+
}
|
|
162
|
+
// Remove skill directory
|
|
163
|
+
await fs.rm(skillPath, { recursive: true, force: true });
|
|
164
|
+
logger.info(`Uninstalled skill: ${skillName} from ${personaName}`);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Create a new empty skill directory structure
|
|
168
|
+
*/
|
|
169
|
+
export async function createSkill(skillName, outputDir, options = {}) {
|
|
170
|
+
const skillPath = path.join(outputDir, skillName);
|
|
171
|
+
// Check if directory already exists
|
|
172
|
+
try {
|
|
173
|
+
await fs.access(skillPath);
|
|
174
|
+
throw new Error(`Skill directory already exists: ${skillPath}`);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (error.code !== 'ENOENT') {
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Create directory structure
|
|
182
|
+
await fs.mkdir(skillPath, { recursive: true });
|
|
183
|
+
await fs.mkdir(path.join(skillPath, 'scripts'), { recursive: true });
|
|
184
|
+
await fs.mkdir(path.join(skillPath, 'references'), { recursive: true });
|
|
185
|
+
await fs.mkdir(path.join(skillPath, 'assets'), { recursive: true });
|
|
186
|
+
// Create SKILL.md template
|
|
187
|
+
const skillMdContent = `---
|
|
188
|
+
name: ${skillName}
|
|
189
|
+
description: >
|
|
190
|
+
${options.description || 'Add a detailed description here that explains when this skill should be used.'}
|
|
191
|
+
List all trigger phrases and keywords that would indicate this skill is relevant.
|
|
192
|
+
${options.license ? `license: ${options.license}\n` : ''}${options.author
|
|
193
|
+
? `metadata:\n author: ${options.author}\n version: 1.0.0\n`
|
|
194
|
+
: ''}---
|
|
195
|
+
|
|
196
|
+
# ${skillName.split('-').map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')}
|
|
197
|
+
|
|
198
|
+
## Overview
|
|
199
|
+
One-liner of what this skill does.
|
|
200
|
+
|
|
201
|
+
## Workflow
|
|
202
|
+
Step-by-step instructions the agent follows:
|
|
203
|
+
|
|
204
|
+
1. First, do this
|
|
205
|
+
2. Then do that
|
|
206
|
+
3. Finally, output in this format
|
|
207
|
+
|
|
208
|
+
## Resources
|
|
209
|
+
- Use \`scripts/example.sh\` for basic operations
|
|
210
|
+
- Read \`references/api.md\` when integrating with external services
|
|
211
|
+
- Refer to \`assets/template.txt\` for output formatting
|
|
212
|
+
`;
|
|
213
|
+
await fs.writeFile(path.join(skillPath, 'SKILL.md'), skillMdContent);
|
|
214
|
+
// Create example script
|
|
215
|
+
const exampleScript = `#!/bin/bash
|
|
216
|
+
# Example script for ${skillName}
|
|
217
|
+
# Add your script logic here
|
|
218
|
+
echo "Hello from ${skillName}"
|
|
219
|
+
`;
|
|
220
|
+
await fs.writeFile(path.join(skillPath, 'scripts', 'example.sh'), exampleScript);
|
|
221
|
+
await fs.chmod(path.join(skillPath, 'scripts', 'example.sh'), 0o755);
|
|
222
|
+
// Create example reference
|
|
223
|
+
const exampleReference = `# ${skillName} Reference
|
|
224
|
+
|
|
225
|
+
Add detailed documentation, API references, or other reference material here.
|
|
226
|
+
|
|
227
|
+
This content is loaded on-demand (L3) when the agent needs it during execution.
|
|
228
|
+
`;
|
|
229
|
+
await fs.writeFile(path.join(skillPath, 'references', 'api.md'), exampleReference);
|
|
230
|
+
logger.info(`Created skill: ${skillPath}`);
|
|
231
|
+
return skillPath;
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=skill-packager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-packager.js","sourceRoot":"","sources":["../../src/personas/skill-packager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for Jiva Skills and Personas (Plugins)
|
|
3
|
+
*
|
|
4
|
+
* 100% compatible with Claude's Skills/Plugins system
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Skill metadata from YAML frontmatter (L1 - always loaded)
|
|
8
|
+
*/
|
|
9
|
+
export interface SkillMetadata {
|
|
10
|
+
/** Skill name: kebab-case, max 64 chars, no leading/trailing/consecutive hyphens */
|
|
11
|
+
name: string;
|
|
12
|
+
/** Description: max 1024 chars, no angle brackets. This is the TRIGGER for routing. */
|
|
13
|
+
description: string;
|
|
14
|
+
/** Optional license identifier (e.g., MIT, Apache-2.0) */
|
|
15
|
+
license?: string;
|
|
16
|
+
/** Optional compatibility notes (max 500 chars) */
|
|
17
|
+
compatibility?: string;
|
|
18
|
+
/** Optional list of allowed tools this skill can use */
|
|
19
|
+
allowedTools?: string[];
|
|
20
|
+
/** Optional arbitrary metadata */
|
|
21
|
+
metadata?: Record<string, any>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Full skill with path and loading state
|
|
25
|
+
*/
|
|
26
|
+
export interface Skill {
|
|
27
|
+
/** Skill metadata from frontmatter */
|
|
28
|
+
metadata: SkillMetadata;
|
|
29
|
+
/** Absolute path to the skill directory */
|
|
30
|
+
path: string;
|
|
31
|
+
/** Whether L2 (SKILL.md body) has been loaded */
|
|
32
|
+
loaded: boolean;
|
|
33
|
+
/** Full SKILL.md content (undefined until L2 load) */
|
|
34
|
+
content?: string;
|
|
35
|
+
/** Parent persona name (for namespacing) */
|
|
36
|
+
personaName: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Plugin/Persona manifest (.claude-plugin/plugin.json)
|
|
40
|
+
*/
|
|
41
|
+
export interface PersonaManifest {
|
|
42
|
+
/** Persona name: kebab-case identifier */
|
|
43
|
+
name: string;
|
|
44
|
+
/** Short description of persona capabilities */
|
|
45
|
+
description: string;
|
|
46
|
+
/** Semantic version (e.g., "1.0.0") */
|
|
47
|
+
version: string;
|
|
48
|
+
/** Author information */
|
|
49
|
+
author?: {
|
|
50
|
+
name: string;
|
|
51
|
+
email?: string;
|
|
52
|
+
url?: string;
|
|
53
|
+
};
|
|
54
|
+
/** License identifier */
|
|
55
|
+
license?: string;
|
|
56
|
+
/** Homepage or repository URL */
|
|
57
|
+
homepage?: string;
|
|
58
|
+
/** Minimum required Jiva version */
|
|
59
|
+
jivaVersion?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Command definition (user-invoked via slash commands)
|
|
63
|
+
*/
|
|
64
|
+
export interface PersonaCommand {
|
|
65
|
+
/** Command name */
|
|
66
|
+
name: string;
|
|
67
|
+
/** Full path to command definition markdown */
|
|
68
|
+
path: string;
|
|
69
|
+
/** Command description */
|
|
70
|
+
description?: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Agent definition (spawned as subagents)
|
|
74
|
+
*/
|
|
75
|
+
export interface PersonaAgent {
|
|
76
|
+
/** Agent name */
|
|
77
|
+
name: string;
|
|
78
|
+
/** Full path to agent definition markdown */
|
|
79
|
+
path: string;
|
|
80
|
+
/** Agent description */
|
|
81
|
+
description?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Hook definition (event handlers)
|
|
85
|
+
*/
|
|
86
|
+
export interface PersonaHook {
|
|
87
|
+
/** Event name (e.g., "beforeMessage", "afterResponse") */
|
|
88
|
+
event: string;
|
|
89
|
+
/** Hook handler script path */
|
|
90
|
+
handler: string;
|
|
91
|
+
/** Hook priority (higher = runs first) */
|
|
92
|
+
priority?: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Full persona with all components loaded
|
|
96
|
+
*/
|
|
97
|
+
export interface Persona {
|
|
98
|
+
/** Persona manifest */
|
|
99
|
+
manifest: PersonaManifest;
|
|
100
|
+
/** Root directory path */
|
|
101
|
+
path: string;
|
|
102
|
+
/** All discovered skills (L1 metadata only initially) */
|
|
103
|
+
skills: Skill[];
|
|
104
|
+
/** All discovered commands */
|
|
105
|
+
commands: PersonaCommand[];
|
|
106
|
+
/** All discovered agents */
|
|
107
|
+
agents: PersonaAgent[];
|
|
108
|
+
/** All discovered hooks */
|
|
109
|
+
hooks: PersonaHook[];
|
|
110
|
+
/** MCP server configurations from .mcp.json */
|
|
111
|
+
mcpServers?: Record<string, any>;
|
|
112
|
+
/** Whether persona is currently active */
|
|
113
|
+
active: boolean;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Skill validation error
|
|
117
|
+
*/
|
|
118
|
+
export interface SkillValidationError {
|
|
119
|
+
field: string;
|
|
120
|
+
message: string;
|
|
121
|
+
value?: any;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Skill package metadata (.skill file)
|
|
125
|
+
*/
|
|
126
|
+
export interface SkillPackageMetadata {
|
|
127
|
+
name: string;
|
|
128
|
+
version: string;
|
|
129
|
+
description: string;
|
|
130
|
+
author?: string;
|
|
131
|
+
license?: string;
|
|
132
|
+
dependencies?: Record<string, string>;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/personas/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/personas/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill and Persona validation logic
|
|
3
|
+
* Enforces frontmatter rules as specified in the implementation guide
|
|
4
|
+
*/
|
|
5
|
+
import { SkillMetadata, SkillValidationError } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Validate skill metadata from frontmatter
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateSkillMetadata(metadata: Partial<SkillMetadata>): SkillValidationError[];
|
|
10
|
+
/**
|
|
11
|
+
* Validate that only allowed frontmatter keys are present
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateFrontmatterKeys(frontmatter: Record<string, any>): SkillValidationError[];
|
|
14
|
+
/**
|
|
15
|
+
* Validate SKILL.md body length (L2 should be < 500 lines)
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateSkillBodyLength(content: string): SkillValidationError[];
|
|
18
|
+
/**
|
|
19
|
+
* Normalize frontmatter keys (handle kebab-case variants)
|
|
20
|
+
*/
|
|
21
|
+
export declare function normalizeFrontmatter(frontmatter: Record<string, any>): SkillMetadata;
|
|
22
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/personas/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAiBjE;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,GAC/B,oBAAoB,EAAE,CAmFxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,oBAAoB,EAAE,CAehG;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAa/E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,aAAa,CASpF"}
|