claudecto 0.1.0

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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +275 -0
  3. package/dist/__tests__/package.test.d.ts +2 -0
  4. package/dist/__tests__/package.test.d.ts.map +1 -0
  5. package/dist/__tests__/package.test.js +53 -0
  6. package/dist/__tests__/package.test.js.map +1 -0
  7. package/dist/cli.d.ts +6 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +200 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/index.d.ts +12 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +12 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/server/index.d.ts +11 -0
  16. package/dist/server/index.d.ts.map +1 -0
  17. package/dist/server/index.js +1207 -0
  18. package/dist/server/index.js.map +1 -0
  19. package/dist/services/advisor.d.ts +117 -0
  20. package/dist/services/advisor.d.ts.map +1 -0
  21. package/dist/services/advisor.js +2636 -0
  22. package/dist/services/advisor.js.map +1 -0
  23. package/dist/services/agent-generator.d.ts +71 -0
  24. package/dist/services/agent-generator.d.ts.map +1 -0
  25. package/dist/services/agent-generator.js +295 -0
  26. package/dist/services/agent-generator.js.map +1 -0
  27. package/dist/services/agents.d.ts +67 -0
  28. package/dist/services/agents.d.ts.map +1 -0
  29. package/dist/services/agents.js +405 -0
  30. package/dist/services/agents.js.map +1 -0
  31. package/dist/services/analytics.d.ts +145 -0
  32. package/dist/services/analytics.d.ts.map +1 -0
  33. package/dist/services/analytics.js +609 -0
  34. package/dist/services/analytics.js.map +1 -0
  35. package/dist/services/blueprints.d.ts +31 -0
  36. package/dist/services/blueprints.d.ts.map +1 -0
  37. package/dist/services/blueprints.js +317 -0
  38. package/dist/services/blueprints.js.map +1 -0
  39. package/dist/services/claude-dir.d.ts +50 -0
  40. package/dist/services/claude-dir.d.ts.map +1 -0
  41. package/dist/services/claude-dir.js +193 -0
  42. package/dist/services/claude-dir.js.map +1 -0
  43. package/dist/services/hooks.d.ts +38 -0
  44. package/dist/services/hooks.d.ts.map +1 -0
  45. package/dist/services/hooks.js +165 -0
  46. package/dist/services/hooks.js.map +1 -0
  47. package/dist/services/insights.d.ts +52 -0
  48. package/dist/services/insights.d.ts.map +1 -0
  49. package/dist/services/insights.js +1035 -0
  50. package/dist/services/insights.js.map +1 -0
  51. package/dist/services/memory.d.ts +14 -0
  52. package/dist/services/memory.d.ts.map +1 -0
  53. package/dist/services/memory.js +25 -0
  54. package/dist/services/memory.js.map +1 -0
  55. package/dist/services/plans.d.ts +20 -0
  56. package/dist/services/plans.d.ts.map +1 -0
  57. package/dist/services/plans.js +149 -0
  58. package/dist/services/plans.js.map +1 -0
  59. package/dist/services/project-intelligence.d.ts +75 -0
  60. package/dist/services/project-intelligence.d.ts.map +1 -0
  61. package/dist/services/project-intelligence.js +731 -0
  62. package/dist/services/project-intelligence.js.map +1 -0
  63. package/dist/services/search.d.ts +32 -0
  64. package/dist/services/search.d.ts.map +1 -0
  65. package/dist/services/search.js +203 -0
  66. package/dist/services/search.js.map +1 -0
  67. package/dist/services/sessions.d.ts +25 -0
  68. package/dist/services/sessions.d.ts.map +1 -0
  69. package/dist/services/sessions.js +248 -0
  70. package/dist/services/sessions.js.map +1 -0
  71. package/dist/services/skills.d.ts +30 -0
  72. package/dist/services/skills.d.ts.map +1 -0
  73. package/dist/services/skills.js +197 -0
  74. package/dist/services/skills.js.map +1 -0
  75. package/dist/services/stats.d.ts +23 -0
  76. package/dist/services/stats.d.ts.map +1 -0
  77. package/dist/services/stats.js +88 -0
  78. package/dist/services/stats.js.map +1 -0
  79. package/dist/services/teams.d.ts +115 -0
  80. package/dist/services/teams.d.ts.map +1 -0
  81. package/dist/services/teams.js +421 -0
  82. package/dist/services/teams.js.map +1 -0
  83. package/dist/services/tech-stack.d.ts +98 -0
  84. package/dist/services/tech-stack.d.ts.map +1 -0
  85. package/dist/services/tech-stack.js +1088 -0
  86. package/dist/services/tech-stack.js.map +1 -0
  87. package/dist/services/terminal.d.ts +75 -0
  88. package/dist/services/terminal.d.ts.map +1 -0
  89. package/dist/services/terminal.js +224 -0
  90. package/dist/services/terminal.js.map +1 -0
  91. package/dist/types.d.ts +1095 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +18 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/ui/assets/index-BiH4Nhdk.css +1 -0
  96. package/dist/ui/assets/index-Brv-K8bd.css +1 -0
  97. package/dist/ui/assets/index-BwMBEdQz.js +3108 -0
  98. package/dist/ui/assets/index-BwMBEdQz.js.map +1 -0
  99. package/dist/ui/assets/index-CEWz7ABD.js +3108 -0
  100. package/dist/ui/assets/index-CEWz7ABD.js.map +1 -0
  101. package/dist/ui/assets/index-CIZ3vvc-.css +1 -0
  102. package/dist/ui/assets/index-CsU3cI0n.js +3108 -0
  103. package/dist/ui/assets/index-CsU3cI0n.js.map +1 -0
  104. package/dist/ui/assets/index-D3AY6iCS.js +3133 -0
  105. package/dist/ui/assets/index-D3AY6iCS.js.map +1 -0
  106. package/dist/ui/assets/index-D8lNZ0Ye.css +1 -0
  107. package/dist/ui/assets/index-DmgeppSA.js +3108 -0
  108. package/dist/ui/assets/index-DmgeppSA.js.map +1 -0
  109. package/dist/ui/favicon.svg +43 -0
  110. package/dist/ui/index.html +23 -0
  111. package/dist/utils/jsonl.d.ts +16 -0
  112. package/dist/utils/jsonl.d.ts.map +1 -0
  113. package/dist/utils/jsonl.js +51 -0
  114. package/dist/utils/jsonl.js.map +1 -0
  115. package/package.json +106 -0
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Skills service - reads and manages skills from ~/.claude/skills/
3
+ */
4
+ import path from 'node:path';
5
+ import { parse as parseYaml } from 'yaml';
6
+ export class SkillsService {
7
+ claudeDir;
8
+ constructor(claudeDir) {
9
+ this.claudeDir = claudeDir;
10
+ }
11
+ async listSkills() {
12
+ const skillFiles = await this.claudeDir.listSkills();
13
+ const skills = [];
14
+ for (const filePath of skillFiles) {
15
+ const skill = await this.parseSkill(filePath, 'user');
16
+ if (skill) {
17
+ skills.push(skill);
18
+ }
19
+ }
20
+ // Sort by name
21
+ skills.sort((a, b) => a.name.localeCompare(b.name));
22
+ return skills;
23
+ }
24
+ async getSkill(skillPath) {
25
+ const fullPath = path.join(this.claudeDir.skillsDir, skillPath, 'SKILL.md');
26
+ if (!(await this.claudeDir.fileExists(fullPath))) {
27
+ return null;
28
+ }
29
+ return this.parseSkill(fullPath, 'user');
30
+ }
31
+ async createSkill(name, content) {
32
+ const validation = this.validateSkill(content);
33
+ if (!validation.valid) {
34
+ return { success: false, error: validation.errors.join(', ') };
35
+ }
36
+ const skillDir = path.join(this.claudeDir.skillsDir, name);
37
+ const skillFile = path.join(skillDir, 'SKILL.md');
38
+ try {
39
+ await this.claudeDir.writeFile(skillFile, content);
40
+ return { success: true };
41
+ }
42
+ catch (e) {
43
+ return { success: false, error: String(e) };
44
+ }
45
+ }
46
+ async updateSkill(skillPath, content) {
47
+ const validation = this.validateSkill(content);
48
+ if (!validation.valid) {
49
+ return { success: false, error: validation.errors.join(', ') };
50
+ }
51
+ const fullPath = path.join(this.claudeDir.skillsDir, skillPath, 'SKILL.md');
52
+ if (!(await this.claudeDir.fileExists(fullPath))) {
53
+ return { success: false, error: 'Skill not found' };
54
+ }
55
+ try {
56
+ await this.claudeDir.writeFile(fullPath, content);
57
+ return { success: true };
58
+ }
59
+ catch (e) {
60
+ return { success: false, error: String(e) };
61
+ }
62
+ }
63
+ async deleteSkill(skillPath) {
64
+ const fullPath = path.join(this.claudeDir.skillsDir, skillPath, 'SKILL.md');
65
+ if (!(await this.claudeDir.fileExists(fullPath))) {
66
+ return { success: false, error: 'Skill not found' };
67
+ }
68
+ try {
69
+ const fs = await import('node:fs/promises');
70
+ await fs.rm(path.dirname(fullPath), { recursive: true });
71
+ return { success: true };
72
+ }
73
+ catch (e) {
74
+ return { success: false, error: String(e) };
75
+ }
76
+ }
77
+ validateSkill(content) {
78
+ const errors = [];
79
+ // Check frontmatter exists
80
+ if (!content.startsWith('---')) {
81
+ errors.push('Missing YAML frontmatter (must start with ---)');
82
+ return { valid: false, errors };
83
+ }
84
+ // Find end of frontmatter
85
+ const endIndex = content.indexOf('---', 3);
86
+ if (endIndex === -1) {
87
+ errors.push('Unclosed frontmatter (missing closing ---)');
88
+ return { valid: false, errors };
89
+ }
90
+ const frontmatterStr = content.slice(3, endIndex).trim();
91
+ try {
92
+ const frontmatter = parseYaml(frontmatterStr);
93
+ // Validate name if present
94
+ if (frontmatter.name) {
95
+ if (!/^[a-z0-9-]+$/.test(frontmatter.name)) {
96
+ errors.push('name must contain only lowercase letters, numbers, and hyphens');
97
+ }
98
+ if (frontmatter.name.length > 64) {
99
+ errors.push('name must be 64 characters or less');
100
+ }
101
+ }
102
+ // Validate context if present
103
+ if (frontmatter.context && frontmatter.context !== 'fork') {
104
+ errors.push('context must be "fork" if specified');
105
+ }
106
+ // Validate user-invocable is boolean
107
+ if (frontmatter['user-invocable'] !== undefined &&
108
+ typeof frontmatter['user-invocable'] !== 'boolean') {
109
+ errors.push('user-invocable must be a boolean');
110
+ }
111
+ // Validate disable-model-invocation is boolean
112
+ if (frontmatter['disable-model-invocation'] !== undefined &&
113
+ typeof frontmatter['disable-model-invocation'] !== 'boolean') {
114
+ errors.push('disable-model-invocation must be a boolean');
115
+ }
116
+ }
117
+ catch (e) {
118
+ errors.push(`Invalid YAML: ${e}`);
119
+ }
120
+ // Check markdown content exists
121
+ const markdownContent = content.slice(endIndex + 3).trim();
122
+ if (!markdownContent) {
123
+ errors.push('Skill must have markdown content after frontmatter');
124
+ }
125
+ return { valid: errors.length === 0, errors };
126
+ }
127
+ getSkillTemplate() {
128
+ return `---
129
+ name: my-skill
130
+ description: A brief description of what this skill does
131
+ # Optional fields:
132
+ # disable-model-invocation: true # Only allow manual /my-skill invocation
133
+ # user-invocable: false # Only allow Claude to invoke
134
+ # allowed-tools: Read, Grep, Glob # Tools Claude can use without permission
135
+ # context: fork # Run in a subagent
136
+ # agent: Explore # Which agent to use (if context: fork)
137
+ ---
138
+
139
+ # My Skill
140
+
141
+ Instructions for Claude when this skill is invoked.
142
+
143
+ ## Usage
144
+
145
+ Describe how to use this skill and what arguments it accepts.
146
+
147
+ ## Examples
148
+
149
+ Show example invocations and expected behavior.
150
+ `;
151
+ }
152
+ async parseSkill(filePath, scope) {
153
+ try {
154
+ const content = await this.claudeDir.readFile(filePath);
155
+ const validation = this.validateSkill(content);
156
+ // Extract frontmatter
157
+ const endIndex = content.indexOf('---', 3);
158
+ const frontmatterStr = content.slice(3, endIndex).trim();
159
+ let frontmatter = {};
160
+ try {
161
+ frontmatter = parseYaml(frontmatterStr) || {};
162
+ }
163
+ catch {
164
+ // Keep empty frontmatter
165
+ }
166
+ // Get name from frontmatter or directory name
167
+ const dirName = path.basename(path.dirname(filePath));
168
+ const name = frontmatter.name || dirName;
169
+ // Get description from frontmatter or first paragraph
170
+ let description = frontmatter.description || '';
171
+ if (!description) {
172
+ const markdownContent = content.slice(endIndex + 3).trim();
173
+ const lines = markdownContent.split('\n');
174
+ for (const line of lines) {
175
+ if (line.trim() && !line.startsWith('#')) {
176
+ description = line.trim().slice(0, 200);
177
+ break;
178
+ }
179
+ }
180
+ }
181
+ return {
182
+ name,
183
+ path: dirName,
184
+ scope,
185
+ frontmatter,
186
+ content,
187
+ description,
188
+ isValid: validation.valid,
189
+ errors: validation.errors,
190
+ };
191
+ }
192
+ catch {
193
+ return null;
194
+ }
195
+ }
196
+ }
197
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/services/skills.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAI1C,MAAM,OAAO,aAAa;IAChB,SAAS,CAAY;IAE7B,YAAY,SAAoB;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QACrD,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACtD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,eAAe;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAE5E,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,OAAe;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CACf,SAAiB,EACjB,OAAe;QAEf,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAE5E,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;QACtD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAE5E,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;QACtD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC5C,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,aAAa,CAAC,OAAe;QAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,2BAA2B;QAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC9D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;QAED,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,CAAqB,CAAC;YAElE,2BAA2B;YAC3B,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3C,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;gBAChF,CAAC;gBACD,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;oBACjC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACrD,CAAC;YAED,qCAAqC;YACrC,IACE,WAAW,CAAC,gBAAgB,CAAC,KAAK,SAAS;gBAC3C,OAAO,WAAW,CAAC,gBAAgB,CAAC,KAAK,SAAS,EAClD,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAClD,CAAC;YAED,+CAA+C;YAC/C,IACE,WAAW,CAAC,0BAA0B,CAAC,KAAK,SAAS;gBACrD,OAAO,WAAW,CAAC,0BAA0B,CAAC,KAAK,SAAS,EAC5D,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,gCAAgC;QAChC,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,gBAAgB;QACd,OAAO;;;;;;;;;;;;;;;;;;;;;;CAsBV,CAAC;IACA,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAyB;QAClE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAE/C,sBAAsB;YACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC3C,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,WAAW,GAAqB,EAAE,CAAC;YAEvC,IAAI,CAAC;gBACH,WAAW,GAAI,SAAS,CAAC,cAAc,CAAsB,IAAI,EAAE,CAAC;YACtE,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;YAED,8CAA8C;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,IAAI,OAAO,CAAC;YAEzC,sDAAsD;YACtD,IAAI,WAAW,GAAG,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBACzC,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBACxC,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,IAAI;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK;gBACL,WAAW;gBACX,OAAO;gBACP,WAAW;gBACX,OAAO,EAAE,UAAU,CAAC,KAAK;gBACzB,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Stats service - reads usage statistics from stats-cache.json
3
+ */
4
+ import type { StatsCache, DailyActivity } from '../types.js';
5
+ import { ClaudeDir } from './claude-dir.js';
6
+ export declare class StatsService {
7
+ private claudeDir;
8
+ private cache;
9
+ constructor(claudeDir: ClaudeDir);
10
+ getStats(): Promise<StatsCache | null>;
11
+ getDailyActivity(days?: number): Promise<DailyActivity[]>;
12
+ getSummary(): Promise<{
13
+ totalMessages: number;
14
+ totalSessions: number;
15
+ totalToolCalls: number;
16
+ totalTokens: number;
17
+ activeDays: number;
18
+ streakDays: number;
19
+ averageMessagesPerDay: number;
20
+ }>;
21
+ invalidateCache(): void;
22
+ }
23
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/services/stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,KAAK,CAA2B;gBAE5B,SAAS,EAAE,SAAS;IAI1B,QAAQ,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQtC,gBAAgB,CAAC,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAc7D,UAAU,IAAI,OAAO,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,qBAAqB,EAAE,MAAM,CAAC;KAC/B,CAAC;IAgEF,eAAe,IAAI,IAAI;CAGxB"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Stats service - reads usage statistics from stats-cache.json
3
+ */
4
+ export class StatsService {
5
+ claudeDir;
6
+ cache = null;
7
+ constructor(claudeDir) {
8
+ this.claudeDir = claudeDir;
9
+ }
10
+ async getStats() {
11
+ if (this.cache)
12
+ return this.cache;
13
+ const stats = await this.claudeDir.readJSON(this.claudeDir.statsFile);
14
+ this.cache = stats;
15
+ return stats;
16
+ }
17
+ async getDailyActivity(days = 30) {
18
+ const stats = await this.getStats();
19
+ if (!stats?.dailyActivity)
20
+ return [];
21
+ // Get last N days
22
+ const cutoff = new Date();
23
+ cutoff.setDate(cutoff.getDate() - days);
24
+ const cutoffStr = cutoff.toISOString().split('T')[0];
25
+ return stats.dailyActivity
26
+ .filter((d) => d.date >= cutoffStr)
27
+ .sort((a, b) => a.date.localeCompare(b.date));
28
+ }
29
+ async getSummary() {
30
+ const stats = await this.getStats();
31
+ if (!stats?.dailyActivity) {
32
+ return {
33
+ totalMessages: 0,
34
+ totalSessions: 0,
35
+ totalToolCalls: 0,
36
+ totalTokens: 0,
37
+ activeDays: 0,
38
+ streakDays: 0,
39
+ averageMessagesPerDay: 0,
40
+ };
41
+ }
42
+ const activity = stats.dailyActivity;
43
+ const totalMessages = activity.reduce((sum, d) => sum + d.messageCount, 0);
44
+ const totalSessions = activity.reduce((sum, d) => sum + d.sessionCount, 0);
45
+ const totalToolCalls = activity.reduce((sum, d) => sum + d.toolCallCount, 0);
46
+ const activeDays = activity.length;
47
+ // Calculate streak (consecutive days ending today or yesterday)
48
+ let streakDays = 0;
49
+ const today = new Date().toISOString().split('T')[0];
50
+ const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0];
51
+ const sortedDates = activity
52
+ .map((d) => d.date)
53
+ .sort((a, b) => b.localeCompare(a)); // Most recent first
54
+ if (sortedDates.length > 0) {
55
+ const mostRecent = sortedDates[0];
56
+ if (mostRecent === today || mostRecent === yesterday) {
57
+ streakDays = 1;
58
+ let expectedDate = new Date(mostRecent);
59
+ for (let i = 1; i < sortedDates.length; i++) {
60
+ expectedDate.setDate(expectedDate.getDate() - 1);
61
+ const expectedStr = expectedDate.toISOString().split('T')[0];
62
+ if (sortedDates[i] === expectedStr) {
63
+ streakDays++;
64
+ }
65
+ else {
66
+ break;
67
+ }
68
+ }
69
+ }
70
+ }
71
+ const averageMessagesPerDay = activeDays > 0 ? Math.round(totalMessages / activeDays) : 0;
72
+ // Estimate tokens based on messages (rough approximation)
73
+ const totalTokens = totalMessages * 150; // ~150 tokens per message average
74
+ return {
75
+ totalMessages,
76
+ totalSessions,
77
+ totalToolCalls,
78
+ totalTokens,
79
+ activeDays,
80
+ streakDays,
81
+ averageMessagesPerDay,
82
+ };
83
+ }
84
+ invalidateCache() {
85
+ this.cache = null;
86
+ }
87
+ }
88
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/services/stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Teams service - Manages multi-agent team configurations
3
+ * Teams are stored in ~/.claude/teams/{name}/config.json
4
+ */
5
+ import type { TeamConfig, TeamMember } from '../types.js';
6
+ import { ClaudeDir } from './claude-dir.js';
7
+ export declare class TeamsService {
8
+ private claudeDir;
9
+ constructor(claudeDir: ClaudeDir);
10
+ /**
11
+ * Get the teams directory path
12
+ */
13
+ get teamsDir(): string;
14
+ /**
15
+ * List all teams
16
+ */
17
+ listTeams(): Promise<TeamConfig[]>;
18
+ /**
19
+ * Get a specific team by name/id
20
+ */
21
+ getTeam(teamId: string): Promise<TeamConfig | null>;
22
+ /**
23
+ * Create a new team
24
+ */
25
+ createTeam(name: string, config: {
26
+ description?: string;
27
+ leader?: TeamMember;
28
+ teammates?: TeamMember[];
29
+ planFile?: string;
30
+ }): Promise<{
31
+ success: boolean;
32
+ error?: string;
33
+ }>;
34
+ /**
35
+ * Update an existing team
36
+ */
37
+ updateTeam(teamId: string, updates: {
38
+ description?: string;
39
+ leader?: TeamMember;
40
+ teammates?: TeamMember[];
41
+ planFile?: string;
42
+ }): Promise<{
43
+ success: boolean;
44
+ error?: string;
45
+ }>;
46
+ /**
47
+ * Delete a team
48
+ */
49
+ deleteTeam(teamId: string): Promise<{
50
+ success: boolean;
51
+ error?: string;
52
+ }>;
53
+ /**
54
+ * Export team as a shareable blueprint
55
+ */
56
+ exportTeam(teamId: string): Promise<{
57
+ success: boolean;
58
+ blueprint?: string;
59
+ error?: string;
60
+ }>;
61
+ /**
62
+ * Validate team name
63
+ */
64
+ private validateTeamName;
65
+ /**
66
+ * Get team templates with pre-configured structures
67
+ */
68
+ getTeamTemplates(): Array<{
69
+ id: string;
70
+ name: string;
71
+ description: string;
72
+ config: Partial<TeamConfig>;
73
+ }>;
74
+ /**
75
+ * List available agents that can be linked to team members
76
+ */
77
+ listAvailableAgents(): Promise<Array<{
78
+ name: string;
79
+ path: string;
80
+ description: string;
81
+ }>>;
82
+ /**
83
+ * Validate that referenced agents exist
84
+ */
85
+ validateAgentRefs(teammates: TeamMember[]): Promise<{
86
+ valid: boolean;
87
+ missing: string[];
88
+ }>;
89
+ /**
90
+ * Generate CLAUDE.md snippet for team invocation
91
+ * This creates instructions that can be added to a project's CLAUDE.md
92
+ */
93
+ generateClaudeMdSnippet(team: TeamConfig): string;
94
+ /**
95
+ * Generate setup script that creates all necessary agent files for a team
96
+ */
97
+ generateSetupScript(teamId: string): Promise<{
98
+ success: boolean;
99
+ script?: string;
100
+ error?: string;
101
+ }>;
102
+ /**
103
+ * Get invocation instructions for a team
104
+ */
105
+ getInvocationInstructions(teamId: string): Promise<{
106
+ slashCommand: string;
107
+ claudeMdSnippet: string;
108
+ agentCommands: Array<{
109
+ agent: string;
110
+ command: string;
111
+ }>;
112
+ projectSetup: string;
113
+ } | null>;
114
+ }
115
+ //# sourceMappingURL=teams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/services/teams.ts"],"names":[],"mappings":"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"}