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.
Files changed (156) hide show
  1. package/.dockerignore +53 -0
  2. package/.gcloudignore +49 -0
  3. package/CONTRIBUTING.md +92 -0
  4. package/Dockerfile +63 -0
  5. package/LICENSE +21 -0
  6. package/README.md +248 -102
  7. package/cloud-run-deploy.yaml +135 -0
  8. package/cloud-run.yaml +135 -0
  9. package/cloud-run.yaml.template +143 -0
  10. package/deploy.sh +107 -0
  11. package/dist/core/agent-spawner.d.ts +89 -0
  12. package/dist/core/agent-spawner.d.ts.map +1 -0
  13. package/dist/core/agent-spawner.js +195 -0
  14. package/dist/core/agent-spawner.js.map +1 -0
  15. package/dist/core/client-agent.d.ts +82 -0
  16. package/dist/core/client-agent.d.ts.map +1 -0
  17. package/dist/core/client-agent.js +406 -0
  18. package/dist/core/client-agent.js.map +1 -0
  19. package/dist/core/config.d.ts +59 -10
  20. package/dist/core/config.d.ts.map +1 -1
  21. package/dist/core/config.js +19 -2
  22. package/dist/core/config.js.map +1 -1
  23. package/dist/core/conversation-manager.d.ts +10 -18
  24. package/dist/core/conversation-manager.d.ts.map +1 -1
  25. package/dist/core/conversation-manager.js +28 -60
  26. package/dist/core/conversation-manager.js.map +1 -1
  27. package/dist/core/dual-agent.d.ts +24 -3
  28. package/dist/core/dual-agent.d.ts.map +1 -1
  29. package/dist/core/dual-agent.js +112 -19
  30. package/dist/core/dual-agent.js.map +1 -1
  31. package/dist/core/manager-agent.d.ts +3 -1
  32. package/dist/core/manager-agent.d.ts.map +1 -1
  33. package/dist/core/manager-agent.js +66 -14
  34. package/dist/core/manager-agent.js.map +1 -1
  35. package/dist/core/worker-agent.d.ts +15 -1
  36. package/dist/core/worker-agent.d.ts.map +1 -1
  37. package/dist/core/worker-agent.js +244 -11
  38. package/dist/core/worker-agent.js.map +1 -1
  39. package/dist/core/workspace.d.ts +5 -0
  40. package/dist/core/workspace.d.ts.map +1 -1
  41. package/dist/core/workspace.js +47 -7
  42. package/dist/core/workspace.js.map +1 -1
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +4 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/interfaces/cli/index.js +376 -44
  48. package/dist/interfaces/cli/index.js.map +1 -1
  49. package/dist/interfaces/cli/repl.d.ts.map +1 -1
  50. package/dist/interfaces/cli/repl.js +6 -0
  51. package/dist/interfaces/cli/repl.js.map +1 -1
  52. package/dist/interfaces/http/index.d.ts +22 -0
  53. package/dist/interfaces/http/index.d.ts.map +1 -0
  54. package/dist/interfaces/http/index.js +135 -0
  55. package/dist/interfaces/http/index.js.map +1 -0
  56. package/dist/interfaces/http/middleware/auth.d.ts +32 -0
  57. package/dist/interfaces/http/middleware/auth.d.ts.map +1 -0
  58. package/dist/interfaces/http/middleware/auth.js +176 -0
  59. package/dist/interfaces/http/middleware/auth.js.map +1 -0
  60. package/dist/interfaces/http/routes/chat.d.ts +7 -0
  61. package/dist/interfaces/http/routes/chat.d.ts.map +1 -0
  62. package/dist/interfaces/http/routes/chat.js +144 -0
  63. package/dist/interfaces/http/routes/chat.js.map +1 -0
  64. package/dist/interfaces/http/routes/health.d.ts +6 -0
  65. package/dist/interfaces/http/routes/health.d.ts.map +1 -0
  66. package/dist/interfaces/http/routes/health.js +25 -0
  67. package/dist/interfaces/http/routes/health.js.map +1 -0
  68. package/dist/interfaces/http/routes/session.d.ts +7 -0
  69. package/dist/interfaces/http/routes/session.d.ts.map +1 -0
  70. package/dist/interfaces/http/routes/session.js +114 -0
  71. package/dist/interfaces/http/routes/session.js.map +1 -0
  72. package/dist/interfaces/http/session-manager.d.ts +76 -0
  73. package/dist/interfaces/http/session-manager.d.ts.map +1 -0
  74. package/dist/interfaces/http/session-manager.js +339 -0
  75. package/dist/interfaces/http/session-manager.js.map +1 -0
  76. package/dist/interfaces/http/websocket-handler.d.ts +18 -0
  77. package/dist/interfaces/http/websocket-handler.d.ts.map +1 -0
  78. package/dist/interfaces/http/websocket-handler.js +146 -0
  79. package/dist/interfaces/http/websocket-handler.js.map +1 -0
  80. package/dist/mcp/client.d.ts +11 -2
  81. package/dist/mcp/client.d.ts.map +1 -1
  82. package/dist/mcp/client.js +44 -19
  83. package/dist/mcp/client.js.map +1 -1
  84. package/dist/mcp/server-manager.d.ts +1 -1
  85. package/dist/mcp/server-manager.d.ts.map +1 -1
  86. package/dist/mcp/server-manager.js +12 -2
  87. package/dist/mcp/server-manager.js.map +1 -1
  88. package/dist/personas/index.d.ts +13 -0
  89. package/dist/personas/index.d.ts.map +1 -0
  90. package/dist/personas/index.js +13 -0
  91. package/dist/personas/index.js.map +1 -0
  92. package/dist/personas/persona-loader.d.ts +30 -0
  93. package/dist/personas/persona-loader.d.ts.map +1 -0
  94. package/dist/personas/persona-loader.js +246 -0
  95. package/dist/personas/persona-loader.js.map +1 -0
  96. package/dist/personas/persona-manager.d.ts +82 -0
  97. package/dist/personas/persona-manager.d.ts.map +1 -0
  98. package/dist/personas/persona-manager.js +211 -0
  99. package/dist/personas/persona-manager.js.map +1 -0
  100. package/dist/personas/skill-loader.d.ts +35 -0
  101. package/dist/personas/skill-loader.d.ts.map +1 -0
  102. package/dist/personas/skill-loader.js +144 -0
  103. package/dist/personas/skill-loader.js.map +1 -0
  104. package/dist/personas/skill-packager.d.ts +25 -0
  105. package/dist/personas/skill-packager.d.ts.map +1 -0
  106. package/dist/personas/skill-packager.js +233 -0
  107. package/dist/personas/skill-packager.js.map +1 -0
  108. package/dist/personas/types.d.ts +134 -0
  109. package/dist/personas/types.d.ts.map +1 -0
  110. package/dist/personas/types.js +7 -0
  111. package/dist/personas/types.js.map +1 -0
  112. package/dist/personas/validator.d.ts +22 -0
  113. package/dist/personas/validator.d.ts.map +1 -0
  114. package/dist/personas/validator.js +144 -0
  115. package/dist/personas/validator.js.map +1 -0
  116. package/dist/storage/factory.d.ts +51 -0
  117. package/dist/storage/factory.d.ts.map +1 -0
  118. package/dist/storage/factory.js +154 -0
  119. package/dist/storage/factory.js.map +1 -0
  120. package/dist/storage/gcp-bucket-provider.d.ts +59 -0
  121. package/dist/storage/gcp-bucket-provider.d.ts.map +1 -0
  122. package/dist/storage/gcp-bucket-provider.js +275 -0
  123. package/dist/storage/gcp-bucket-provider.js.map +1 -0
  124. package/dist/storage/index.d.ts +33 -0
  125. package/dist/storage/index.d.ts.map +1 -0
  126. package/dist/storage/index.js +37 -0
  127. package/dist/storage/index.js.map +1 -0
  128. package/dist/storage/local-provider.d.ts +36 -0
  129. package/dist/storage/local-provider.d.ts.map +1 -0
  130. package/dist/storage/local-provider.js +219 -0
  131. package/dist/storage/local-provider.js.map +1 -0
  132. package/dist/storage/provider.d.ts +137 -0
  133. package/dist/storage/provider.d.ts.map +1 -0
  134. package/dist/storage/provider.js +136 -0
  135. package/dist/storage/provider.js.map +1 -0
  136. package/dist/storage/types.d.ts +78 -0
  137. package/dist/storage/types.d.ts.map +1 -0
  138. package/dist/storage/types.js +14 -0
  139. package/dist/storage/types.js.map +1 -0
  140. package/dist/utils/orchestration-logger.d.ts +36 -0
  141. package/dist/utils/orchestration-logger.d.ts.map +1 -0
  142. package/dist/utils/orchestration-logger.js +224 -0
  143. package/dist/utils/orchestration-logger.js.map +1 -0
  144. package/jiva-new-demo.gif +0 -0
  145. package/package.json +30 -2
  146. package/.fluen/cache/state.json +0 -7
  147. package/actions/action_registry.py +0 -75
  148. package/actions/python_coder.py +0 -470
  149. package/api/main.py +0 -269
  150. package/downloaded_image.avif +0 -0
  151. package/downloads/snipping_tool.avif +0 -0
  152. package/image.avif +0 -0
  153. package/ms_image.avif +0 -0
  154. package/screenshot.png +0 -0
  155. package/snipping_tool.avif +0 -0
  156. 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,7 @@
1
+ /**
2
+ * Type definitions for Jiva Skills and Personas (Plugins)
3
+ *
4
+ * 100% compatible with Claude's Skills/Plugins system
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -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"}