pilot-ai 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 (213) hide show
  1. package/dist/agent/claude.d.ts +45 -0
  2. package/dist/agent/claude.d.ts.map +1 -0
  3. package/dist/agent/claude.js +114 -0
  4. package/dist/agent/claude.js.map +1 -0
  5. package/dist/agent/core.d.ts +17 -0
  6. package/dist/agent/core.d.ts.map +1 -0
  7. package/dist/agent/core.js +129 -0
  8. package/dist/agent/core.js.map +1 -0
  9. package/dist/agent/heartbeat.d.ts +51 -0
  10. package/dist/agent/heartbeat.d.ts.map +1 -0
  11. package/dist/agent/heartbeat.js +253 -0
  12. package/dist/agent/heartbeat.js.map +1 -0
  13. package/dist/agent/memory-commands.d.ts +11 -0
  14. package/dist/agent/memory-commands.d.ts.map +1 -0
  15. package/dist/agent/memory-commands.js +55 -0
  16. package/dist/agent/memory-commands.js.map +1 -0
  17. package/dist/agent/memory.d.ts +11 -0
  18. package/dist/agent/memory.d.ts.map +1 -0
  19. package/dist/agent/memory.js +109 -0
  20. package/dist/agent/memory.js.map +1 -0
  21. package/dist/agent/multi-agent.d.ts +47 -0
  22. package/dist/agent/multi-agent.d.ts.map +1 -0
  23. package/dist/agent/multi-agent.js +117 -0
  24. package/dist/agent/multi-agent.js.map +1 -0
  25. package/dist/agent/pipeline.d.ts +27 -0
  26. package/dist/agent/pipeline.d.ts.map +1 -0
  27. package/dist/agent/pipeline.js +52 -0
  28. package/dist/agent/pipeline.js.map +1 -0
  29. package/dist/agent/planner.d.ts +21 -0
  30. package/dist/agent/planner.d.ts.map +1 -0
  31. package/dist/agent/planner.js +51 -0
  32. package/dist/agent/planner.js.map +1 -0
  33. package/dist/agent/preference-detector.d.ts +6 -0
  34. package/dist/agent/preference-detector.d.ts.map +1 -0
  35. package/dist/agent/preference-detector.js +50 -0
  36. package/dist/agent/preference-detector.js.map +1 -0
  37. package/dist/agent/project-analyzer.d.ts +6 -0
  38. package/dist/agent/project-analyzer.d.ts.map +1 -0
  39. package/dist/agent/project-analyzer.js +108 -0
  40. package/dist/agent/project-analyzer.js.map +1 -0
  41. package/dist/agent/project.d.ts +28 -0
  42. package/dist/agent/project.d.ts.map +1 -0
  43. package/dist/agent/project.js +121 -0
  44. package/dist/agent/project.js.map +1 -0
  45. package/dist/agent/queue.d.ts +61 -0
  46. package/dist/agent/queue.d.ts.map +1 -0
  47. package/dist/agent/queue.js +167 -0
  48. package/dist/agent/queue.js.map +1 -0
  49. package/dist/agent/safety.d.ts +25 -0
  50. package/dist/agent/safety.d.ts.map +1 -0
  51. package/dist/agent/safety.js +77 -0
  52. package/dist/agent/safety.js.map +1 -0
  53. package/dist/agent/semantic-search.d.ts +34 -0
  54. package/dist/agent/semantic-search.d.ts.map +1 -0
  55. package/dist/agent/semantic-search.js +183 -0
  56. package/dist/agent/semantic-search.js.map +1 -0
  57. package/dist/agent/skills.d.ts +59 -0
  58. package/dist/agent/skills.d.ts.map +1 -0
  59. package/dist/agent/skills.js +161 -0
  60. package/dist/agent/skills.js.map +1 -0
  61. package/dist/agent/tool-descriptions.d.ts +7 -0
  62. package/dist/agent/tool-descriptions.d.ts.map +1 -0
  63. package/dist/agent/tool-descriptions.js +51 -0
  64. package/dist/agent/tool-descriptions.js.map +1 -0
  65. package/dist/agent/worktree.d.ts +28 -0
  66. package/dist/agent/worktree.d.ts.map +1 -0
  67. package/dist/agent/worktree.js +59 -0
  68. package/dist/agent/worktree.js.map +1 -0
  69. package/dist/api/server.d.ts +30 -0
  70. package/dist/api/server.d.ts.map +1 -0
  71. package/dist/api/server.js +135 -0
  72. package/dist/api/server.js.map +1 -0
  73. package/dist/cli/connection-test.d.ts +14 -0
  74. package/dist/cli/connection-test.d.ts.map +1 -0
  75. package/dist/cli/connection-test.js +82 -0
  76. package/dist/cli/connection-test.js.map +1 -0
  77. package/dist/cli/init.d.ts +2 -0
  78. package/dist/cli/init.d.ts.map +1 -0
  79. package/dist/cli/init.js +287 -0
  80. package/dist/cli/init.js.map +1 -0
  81. package/dist/cli/logs.d.ts +5 -0
  82. package/dist/cli/logs.d.ts.map +1 -0
  83. package/dist/cli/logs.js +32 -0
  84. package/dist/cli/logs.js.map +1 -0
  85. package/dist/cli/project.d.ts +3 -0
  86. package/dist/cli/project.d.ts.map +1 -0
  87. package/dist/cli/project.js +58 -0
  88. package/dist/cli/project.js.map +1 -0
  89. package/dist/cli/start.d.ts +5 -0
  90. package/dist/cli/start.d.ts.map +1 -0
  91. package/dist/cli/start.js +82 -0
  92. package/dist/cli/start.js.map +1 -0
  93. package/dist/cli/status.d.ts +8 -0
  94. package/dist/cli/status.d.ts.map +1 -0
  95. package/dist/cli/status.js +39 -0
  96. package/dist/cli/status.js.map +1 -0
  97. package/dist/cli/stop.d.ts +2 -0
  98. package/dist/cli/stop.d.ts.map +1 -0
  99. package/dist/cli/stop.js +28 -0
  100. package/dist/cli/stop.js.map +1 -0
  101. package/dist/config/keychain.d.ts +4 -0
  102. package/dist/config/keychain.d.ts.map +1 -0
  103. package/dist/config/keychain.js +54 -0
  104. package/dist/config/keychain.js.map +1 -0
  105. package/dist/config/schema.d.ts +60 -0
  106. package/dist/config/schema.d.ts.map +1 -0
  107. package/dist/config/schema.js +88 -0
  108. package/dist/config/schema.js.map +1 -0
  109. package/dist/config/store.d.ts +8 -0
  110. package/dist/config/store.d.ts.map +1 -0
  111. package/dist/config/store.js +48 -0
  112. package/dist/config/store.js.map +1 -0
  113. package/dist/index.d.ts +3 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +47 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/messenger/adapter.d.ts +30 -0
  118. package/dist/messenger/adapter.d.ts.map +1 -0
  119. package/dist/messenger/adapter.js +2 -0
  120. package/dist/messenger/adapter.js.map +1 -0
  121. package/dist/messenger/factory.d.ts +4 -0
  122. package/dist/messenger/factory.d.ts.map +1 -0
  123. package/dist/messenger/factory.js +19 -0
  124. package/dist/messenger/factory.js.map +1 -0
  125. package/dist/messenger/slack.d.ts +21 -0
  126. package/dist/messenger/slack.d.ts.map +1 -0
  127. package/dist/messenger/slack.js +127 -0
  128. package/dist/messenger/slack.js.map +1 -0
  129. package/dist/messenger/telegram.d.ts +21 -0
  130. package/dist/messenger/telegram.d.ts.map +1 -0
  131. package/dist/messenger/telegram.js +118 -0
  132. package/dist/messenger/telegram.js.map +1 -0
  133. package/dist/security/audit.d.ts +15 -0
  134. package/dist/security/audit.d.ts.map +1 -0
  135. package/dist/security/audit.js +41 -0
  136. package/dist/security/audit.js.map +1 -0
  137. package/dist/security/auth.d.ts +8 -0
  138. package/dist/security/auth.d.ts.map +1 -0
  139. package/dist/security/auth.js +15 -0
  140. package/dist/security/auth.js.map +1 -0
  141. package/dist/security/prompt-guard.d.ts +11 -0
  142. package/dist/security/prompt-guard.d.ts.map +1 -0
  143. package/dist/security/prompt-guard.js +30 -0
  144. package/dist/security/prompt-guard.js.map +1 -0
  145. package/dist/security/sandbox.d.ts +11 -0
  146. package/dist/security/sandbox.d.ts.map +1 -0
  147. package/dist/security/sandbox.js +76 -0
  148. package/dist/security/sandbox.js.map +1 -0
  149. package/dist/tools/browser.d.ts +61 -0
  150. package/dist/tools/browser.d.ts.map +1 -0
  151. package/dist/tools/browser.js +196 -0
  152. package/dist/tools/browser.js.map +1 -0
  153. package/dist/tools/calendar.d.ts +36 -0
  154. package/dist/tools/calendar.d.ts.map +1 -0
  155. package/dist/tools/calendar.js +146 -0
  156. package/dist/tools/calendar.js.map +1 -0
  157. package/dist/tools/clipboard.d.ts +13 -0
  158. package/dist/tools/clipboard.d.ts.map +1 -0
  159. package/dist/tools/clipboard.js +47 -0
  160. package/dist/tools/clipboard.js.map +1 -0
  161. package/dist/tools/email.d.ts +52 -0
  162. package/dist/tools/email.d.ts.map +1 -0
  163. package/dist/tools/email.js +211 -0
  164. package/dist/tools/email.js.map +1 -0
  165. package/dist/tools/figma-mcp.d.ts +30 -0
  166. package/dist/tools/figma-mcp.d.ts.map +1 -0
  167. package/dist/tools/figma-mcp.js +58 -0
  168. package/dist/tools/figma-mcp.js.map +1 -0
  169. package/dist/tools/figma.d.ts +52 -0
  170. package/dist/tools/figma.d.ts.map +1 -0
  171. package/dist/tools/figma.js +62 -0
  172. package/dist/tools/figma.js.map +1 -0
  173. package/dist/tools/filesystem.d.ts +9 -0
  174. package/dist/tools/filesystem.d.ts.map +1 -0
  175. package/dist/tools/filesystem.js +62 -0
  176. package/dist/tools/filesystem.js.map +1 -0
  177. package/dist/tools/github.d.ts +36 -0
  178. package/dist/tools/github.d.ts.map +1 -0
  179. package/dist/tools/github.js +93 -0
  180. package/dist/tools/github.js.map +1 -0
  181. package/dist/tools/image.d.ts +14 -0
  182. package/dist/tools/image.d.ts.map +1 -0
  183. package/dist/tools/image.js +57 -0
  184. package/dist/tools/image.js.map +1 -0
  185. package/dist/tools/linear.d.ts +41 -0
  186. package/dist/tools/linear.d.ts.map +1 -0
  187. package/dist/tools/linear.js +87 -0
  188. package/dist/tools/linear.js.map +1 -0
  189. package/dist/tools/notification.d.ts +8 -0
  190. package/dist/tools/notification.d.ts.map +1 -0
  191. package/dist/tools/notification.js +49 -0
  192. package/dist/tools/notification.js.map +1 -0
  193. package/dist/tools/notion.d.ts +23 -0
  194. package/dist/tools/notion.d.ts.map +1 -0
  195. package/dist/tools/notion.js +91 -0
  196. package/dist/tools/notion.js.map +1 -0
  197. package/dist/tools/obsidian.d.ts +17 -0
  198. package/dist/tools/obsidian.d.ts.map +1 -0
  199. package/dist/tools/obsidian.js +100 -0
  200. package/dist/tools/obsidian.js.map +1 -0
  201. package/dist/tools/shell.d.ts +10 -0
  202. package/dist/tools/shell.d.ts.map +1 -0
  203. package/dist/tools/shell.js +37 -0
  204. package/dist/tools/shell.js.map +1 -0
  205. package/dist/tools/voice.d.ts +28 -0
  206. package/dist/tools/voice.d.ts.map +1 -0
  207. package/dist/tools/voice.js +88 -0
  208. package/dist/tools/voice.js.map +1 -0
  209. package/dist/tools/vscode.d.ts +42 -0
  210. package/dist/tools/vscode.d.ts.map +1 -0
  211. package/dist/tools/vscode.js +80 -0
  212. package/dist/tools/vscode.js.map +1 -0
  213. package/package.json +51 -0
@@ -0,0 +1,34 @@
1
+ export interface Chunk {
2
+ id: string;
3
+ source: string;
4
+ content: string;
5
+ tokens: string[];
6
+ }
7
+ export interface SearchIndex {
8
+ chunks: Chunk[];
9
+ idf: Record<string, number>;
10
+ updatedAt: string;
11
+ }
12
+ export declare function splitIntoChunks(content: string, source: string, maxLines?: number): Chunk[];
13
+ export declare function loadIndex(): Promise<SearchIndex>;
14
+ export declare function saveIndex(index: SearchIndex): Promise<void>;
15
+ /**
16
+ * Rebuilds the search index from memory and history files.
17
+ */
18
+ export declare function rebuildIndex(): Promise<SearchIndex>;
19
+ /**
20
+ * Searches the index for chunks relevant to the query.
21
+ * Returns top-k results sorted by similarity.
22
+ */
23
+ export declare function search(query: string, topK?: number): Promise<Array<{
24
+ chunk: Chunk;
25
+ score: number;
26
+ }>>;
27
+ /**
28
+ * Formats search results for display or prompt injection.
29
+ */
30
+ export declare function formatSearchResults(results: Array<{
31
+ chunk: Chunk;
32
+ score: number;
33
+ }>): string;
34
+ //# sourceMappingURL=semantic-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-search.d.ts","sourceRoot":"","sources":["../../src/agent/semantic-search.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAkBD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,KAAK,EAAE,CAmB/F;AA6DD,wBAAsB,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,CAOtD;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAyCzD;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAqB7G;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAU3F"}
@@ -0,0 +1,183 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { getPilotDir } from '../config/store.js';
4
+ function getIndexPath() {
5
+ return path.join(getPilotDir(), 'search-index.json');
6
+ }
7
+ // --- Tokenization ---
8
+ function tokenize(text) {
9
+ return text
10
+ .toLowerCase()
11
+ .replace(/[^a-z0-9가-힣\s]/g, ' ')
12
+ .split(/\s+/)
13
+ .filter((t) => t.length > 1);
14
+ }
15
+ // --- Chunking ---
16
+ export function splitIntoChunks(content, source, maxLines = 20) {
17
+ const lines = content.split('\n');
18
+ const chunks = [];
19
+ let idx = 0;
20
+ for (let i = 0; i < lines.length; i += maxLines) {
21
+ const slice = lines.slice(i, i + maxLines).join('\n').trim();
22
+ if (!slice)
23
+ continue;
24
+ const tokens = tokenize(slice);
25
+ if (tokens.length === 0)
26
+ continue;
27
+ chunks.push({
28
+ id: `${source}:${idx++}`,
29
+ source,
30
+ content: slice,
31
+ tokens,
32
+ });
33
+ }
34
+ return chunks;
35
+ }
36
+ // --- TF-IDF ---
37
+ function computeTf(tokens) {
38
+ const tf = {};
39
+ for (const t of tokens) {
40
+ tf[t] = (tf[t] ?? 0) + 1;
41
+ }
42
+ const max = Math.max(...Object.values(tf));
43
+ for (const t of Object.keys(tf)) {
44
+ tf[t] /= max;
45
+ }
46
+ return tf;
47
+ }
48
+ function computeIdf(chunks) {
49
+ const df = {};
50
+ for (const chunk of chunks) {
51
+ const seen = new Set(chunk.tokens);
52
+ for (const t of seen) {
53
+ df[t] = (df[t] ?? 0) + 1;
54
+ }
55
+ }
56
+ const N = chunks.length;
57
+ const idf = {};
58
+ for (const [term, count] of Object.entries(df)) {
59
+ idf[term] = Math.log(N / count);
60
+ }
61
+ return idf;
62
+ }
63
+ function tfidfVector(tokens, idf) {
64
+ const tf = computeTf(tokens);
65
+ const vec = {};
66
+ for (const [term, tfVal] of Object.entries(tf)) {
67
+ vec[term] = tfVal * (idf[term] ?? 0);
68
+ }
69
+ return vec;
70
+ }
71
+ function cosineSimilarity(a, b) {
72
+ let dot = 0;
73
+ let magA = 0;
74
+ let magB = 0;
75
+ const allKeys = new Set([...Object.keys(a), ...Object.keys(b)]);
76
+ for (const key of allKeys) {
77
+ const va = a[key] ?? 0;
78
+ const vb = b[key] ?? 0;
79
+ dot += va * vb;
80
+ magA += va * va;
81
+ magB += vb * vb;
82
+ }
83
+ if (magA === 0 || magB === 0)
84
+ return 0;
85
+ return dot / (Math.sqrt(magA) * Math.sqrt(magB));
86
+ }
87
+ // --- Index management ---
88
+ export async function loadIndex() {
89
+ try {
90
+ const data = await fs.readFile(getIndexPath(), 'utf-8');
91
+ return JSON.parse(data);
92
+ }
93
+ catch {
94
+ return { chunks: [], idf: {}, updatedAt: '' };
95
+ }
96
+ }
97
+ export async function saveIndex(index) {
98
+ await fs.writeFile(getIndexPath(), JSON.stringify(index), 'utf-8');
99
+ }
100
+ /**
101
+ * Rebuilds the search index from memory and history files.
102
+ */
103
+ export async function rebuildIndex() {
104
+ const memoryDir = path.join(getPilotDir(), 'memory');
105
+ const allChunks = [];
106
+ // Index MEMORY.md
107
+ try {
108
+ const content = await fs.readFile(path.join(memoryDir, 'MEMORY.md'), 'utf-8');
109
+ allChunks.push(...splitIntoChunks(content, 'MEMORY.md'));
110
+ }
111
+ catch { }
112
+ // Index project memories
113
+ const projectsDir = path.join(memoryDir, 'projects');
114
+ try {
115
+ const files = await fs.readdir(projectsDir);
116
+ for (const file of files) {
117
+ if (!file.endsWith('.md'))
118
+ continue;
119
+ const content = await fs.readFile(path.join(projectsDir, file), 'utf-8');
120
+ allChunks.push(...splitIntoChunks(content, `projects/${file}`));
121
+ }
122
+ }
123
+ catch { }
124
+ // Index history
125
+ const historyDir = path.join(memoryDir, 'history');
126
+ try {
127
+ const files = await fs.readdir(historyDir);
128
+ for (const file of files.slice(-30)) { // Last 30 days
129
+ if (!file.endsWith('.md'))
130
+ continue;
131
+ const content = await fs.readFile(path.join(historyDir, file), 'utf-8');
132
+ allChunks.push(...splitIntoChunks(content, `history/${file}`));
133
+ }
134
+ }
135
+ catch { }
136
+ const idf = computeIdf(allChunks);
137
+ const index = {
138
+ chunks: allChunks,
139
+ idf,
140
+ updatedAt: new Date().toISOString(),
141
+ };
142
+ await saveIndex(index);
143
+ return index;
144
+ }
145
+ /**
146
+ * Searches the index for chunks relevant to the query.
147
+ * Returns top-k results sorted by similarity.
148
+ */
149
+ export async function search(query, topK = 5) {
150
+ let index = await loadIndex();
151
+ if (index.chunks.length === 0) {
152
+ index = await rebuildIndex();
153
+ }
154
+ const queryTokens = tokenize(query);
155
+ if (queryTokens.length === 0)
156
+ return [];
157
+ const queryVec = tfidfVector(queryTokens, index.idf);
158
+ const results = index.chunks.map((chunk) => {
159
+ const chunkVec = tfidfVector(chunk.tokens, index.idf);
160
+ const score = cosineSimilarity(queryVec, chunkVec);
161
+ return { chunk, score };
162
+ });
163
+ return results
164
+ .filter((r) => r.score > 0)
165
+ .sort((a, b) => b.score - a.score)
166
+ .slice(0, topK);
167
+ }
168
+ /**
169
+ * Formats search results for display or prompt injection.
170
+ */
171
+ export function formatSearchResults(results) {
172
+ if (results.length === 0)
173
+ return '';
174
+ const lines = ['<RELEVANT_MEMORY>'];
175
+ for (const { chunk, score } of results) {
176
+ lines.push(`<memory source="${chunk.source}" relevance="${score.toFixed(2)}">`);
177
+ lines.push(chunk.content);
178
+ lines.push('</memory>');
179
+ }
180
+ lines.push('</RELEVANT_MEMORY>');
181
+ return lines.join('\n');
182
+ }
183
+ //# sourceMappingURL=semantic-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../src/agent/semantic-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ export interface Skill {
2
+ name: string;
3
+ filename: string;
4
+ trigger: string;
5
+ steps: string;
6
+ reference?: string;
7
+ raw: string;
8
+ }
9
+ /**
10
+ * Parses a skill Markdown file.
11
+ *
12
+ * Expected format:
13
+ * ```
14
+ * # Skill Name
15
+ *
16
+ * ## Trigger
17
+ * When the user asks to deploy, release, or ship code.
18
+ *
19
+ * ## Steps
20
+ * 1. Run tests
21
+ * 2. Build the project
22
+ * 3. Deploy to production
23
+ *
24
+ * ## Reference (optional)
25
+ * - Only deploy from main branch
26
+ * ```
27
+ */
28
+ export declare function parseSkill(content: string, filename: string): Skill | null;
29
+ /**
30
+ * Scans ~/.pilot/skills/ and returns all parsed skills.
31
+ */
32
+ export declare function listSkills(): Promise<Skill[]>;
33
+ /**
34
+ * Gets a single skill by name (case-insensitive).
35
+ */
36
+ export declare function getSkill(name: string): Promise<Skill | null>;
37
+ /**
38
+ * Creates a new skill file.
39
+ */
40
+ export declare function createSkill(params: {
41
+ name: string;
42
+ trigger: string;
43
+ steps: string;
44
+ reference?: string;
45
+ }): Promise<string>;
46
+ /**
47
+ * Deletes a skill file by name.
48
+ */
49
+ export declare function deleteSkill(name: string): Promise<boolean>;
50
+ /**
51
+ * Builds a prompt snippet with all skills for LLM context injection.
52
+ * The LLM decides which skill to apply based on trigger descriptions.
53
+ */
54
+ export declare function buildSkillsContext(): Promise<string | null>;
55
+ /**
56
+ * Formats skill list for display.
57
+ */
58
+ export declare function formatSkillList(skills: Skill[]): string;
59
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAc1E;AA4BD;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAmBnD;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAIlE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBlB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAQvD"}
@@ -0,0 +1,161 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { getPilotDir } from '../config/store.js';
4
+ function getSkillsDir() {
5
+ return path.join(getPilotDir(), 'skills');
6
+ }
7
+ /**
8
+ * Parses a skill Markdown file.
9
+ *
10
+ * Expected format:
11
+ * ```
12
+ * # Skill Name
13
+ *
14
+ * ## Trigger
15
+ * When the user asks to deploy, release, or ship code.
16
+ *
17
+ * ## Steps
18
+ * 1. Run tests
19
+ * 2. Build the project
20
+ * 3. Deploy to production
21
+ *
22
+ * ## Reference (optional)
23
+ * - Only deploy from main branch
24
+ * ```
25
+ */
26
+ export function parseSkill(content, filename) {
27
+ const nameMatch = content.match(/^#\s+(.+)/m);
28
+ if (!nameMatch)
29
+ return null;
30
+ const sections = extractSections(content);
31
+ return {
32
+ name: nameMatch[1].trim(),
33
+ filename,
34
+ trigger: sections['trigger'] ?? '',
35
+ steps: sections['steps'] ?? '',
36
+ reference: sections['reference'],
37
+ raw: content,
38
+ };
39
+ }
40
+ function extractSections(content) {
41
+ const sections = {};
42
+ const lines = content.split('\n');
43
+ let currentSection = null;
44
+ let currentLines = [];
45
+ for (const line of lines) {
46
+ const sectionMatch = line.match(/^##\s+(.+)/);
47
+ if (sectionMatch) {
48
+ if (currentSection) {
49
+ sections[currentSection] = currentLines.join('\n').trim();
50
+ }
51
+ currentSection = sectionMatch[1].trim().toLowerCase();
52
+ currentLines = [];
53
+ }
54
+ else if (currentSection) {
55
+ currentLines.push(line);
56
+ }
57
+ }
58
+ if (currentSection) {
59
+ sections[currentSection] = currentLines.join('\n').trim();
60
+ }
61
+ return sections;
62
+ }
63
+ /**
64
+ * Scans ~/.pilot/skills/ and returns all parsed skills.
65
+ */
66
+ export async function listSkills() {
67
+ const dir = getSkillsDir();
68
+ try {
69
+ await fs.access(dir);
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ const files = await fs.readdir(dir);
75
+ const skills = [];
76
+ for (const file of files) {
77
+ if (!file.endsWith('.md'))
78
+ continue;
79
+ const content = await fs.readFile(path.join(dir, file), 'utf-8');
80
+ const skill = parseSkill(content, file);
81
+ if (skill)
82
+ skills.push(skill);
83
+ }
84
+ return skills;
85
+ }
86
+ /**
87
+ * Gets a single skill by name (case-insensitive).
88
+ */
89
+ export async function getSkill(name) {
90
+ const skills = await listSkills();
91
+ const lower = name.toLowerCase();
92
+ return skills.find((s) => s.name.toLowerCase() === lower) ?? null;
93
+ }
94
+ /**
95
+ * Creates a new skill file.
96
+ */
97
+ export async function createSkill(params) {
98
+ const dir = getSkillsDir();
99
+ await fs.mkdir(dir, { recursive: true });
100
+ const filename = params.name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '') + '.md';
101
+ const filepath = path.join(dir, filename);
102
+ const lines = [
103
+ `# ${params.name}`,
104
+ '',
105
+ '## Trigger',
106
+ params.trigger,
107
+ '',
108
+ '## Steps',
109
+ params.steps,
110
+ ];
111
+ if (params.reference) {
112
+ lines.push('', '## Reference', params.reference);
113
+ }
114
+ await fs.writeFile(filepath, lines.join('\n') + '\n', 'utf-8');
115
+ return filename;
116
+ }
117
+ /**
118
+ * Deletes a skill file by name.
119
+ */
120
+ export async function deleteSkill(name) {
121
+ const skill = await getSkill(name);
122
+ if (!skill)
123
+ return false;
124
+ const filepath = path.join(getSkillsDir(), skill.filename);
125
+ await fs.unlink(filepath);
126
+ return true;
127
+ }
128
+ /**
129
+ * Builds a prompt snippet with all skills for LLM context injection.
130
+ * The LLM decides which skill to apply based on trigger descriptions.
131
+ */
132
+ export async function buildSkillsContext() {
133
+ const skills = await listSkills();
134
+ if (skills.length === 0)
135
+ return null;
136
+ const lines = ['<SKILLS>'];
137
+ for (const skill of skills) {
138
+ lines.push(`<skill name="${skill.name}">`);
139
+ lines.push(`<trigger>${skill.trigger}</trigger>`);
140
+ lines.push(`<steps>${skill.steps}</steps>`);
141
+ if (skill.reference) {
142
+ lines.push(`<reference>${skill.reference}</reference>`);
143
+ }
144
+ lines.push('</skill>');
145
+ }
146
+ lines.push('</SKILLS>');
147
+ return lines.join('\n');
148
+ }
149
+ /**
150
+ * Formats skill list for display.
151
+ */
152
+ export function formatSkillList(skills) {
153
+ if (skills.length === 0)
154
+ return 'No skills registered.';
155
+ const lines = ['Skills:'];
156
+ for (const skill of skills) {
157
+ lines.push(` - ${skill.name} (${skill.filename}): ${skill.trigger.slice(0, 60)}...`);
158
+ }
159
+ return lines.join('\n');
160
+ }
161
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Builds an XML block describing available tools for the LLM.
3
+ * The LLM can interpret natural language commands and decide which
4
+ * tool/function to invoke. These descriptions are injected into the prompt.
5
+ */
6
+ export declare function buildToolDescriptions(): string;
7
+ //# sourceMappingURL=tool-descriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-descriptions.d.ts","sourceRoot":"","sources":["../../src/agent/tool-descriptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA4C9C"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Builds an XML block describing available tools for the LLM.
3
+ * The LLM can interpret natural language commands and decide which
4
+ * tool/function to invoke. These descriptions are injected into the prompt.
5
+ */
6
+ export function buildToolDescriptions() {
7
+ return `<AVAILABLE_TOOLS>
8
+ <tool name="addCronJob">
9
+ <description>Add a new scheduled (cron) job. The LLM should parse natural language schedule requests into cron expressions.</description>
10
+ <params>
11
+ <param name="cron" type="string">5-field cron expression (min hour dom mon dow)</param>
12
+ <param name="command" type="string">Command or task to execute</param>
13
+ <param name="project" type="string" optional="true">Project name</param>
14
+ </params>
15
+ </tool>
16
+ <tool name="removeCronJob">
17
+ <description>Remove a scheduled job by ID.</description>
18
+ <params>
19
+ <param name="id" type="number">Job ID</param>
20
+ </params>
21
+ </tool>
22
+ <tool name="toggleCronJob">
23
+ <description>Enable or disable a scheduled job by ID.</description>
24
+ <params>
25
+ <param name="id" type="number">Job ID</param>
26
+ </params>
27
+ </tool>
28
+ <tool name="listCronJobs">
29
+ <description>List all scheduled jobs.</description>
30
+ </tool>
31
+ <tool name="createSkill">
32
+ <description>Create a new skill (reusable procedure the agent can follow).</description>
33
+ <params>
34
+ <param name="name" type="string">Skill name</param>
35
+ <param name="trigger" type="string">When to trigger this skill (natural language description)</param>
36
+ <param name="steps" type="string">Step-by-step procedure</param>
37
+ <param name="reference" type="string" optional="true">Additional notes or constraints</param>
38
+ </params>
39
+ </tool>
40
+ <tool name="deleteSkill">
41
+ <description>Delete a skill by name.</description>
42
+ <params>
43
+ <param name="name" type="string">Skill name</param>
44
+ </params>
45
+ </tool>
46
+ <tool name="listSkills">
47
+ <description>List all registered skills.</description>
48
+ </tool>
49
+ </AVAILABLE_TOOLS>`;
50
+ }
51
+ //# sourceMappingURL=tool-descriptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-descriptions.js","sourceRoot":"","sources":["../../src/agent/tool-descriptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA0CU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,28 @@
1
+ export interface WorktreeInfo {
2
+ path: string;
3
+ branch: string;
4
+ }
5
+ /**
6
+ * Creates a git worktree for parallel work on the same project.
7
+ * Returns the worktree path and branch name.
8
+ */
9
+ export declare function createWorktree(projectPath: string, taskId: string): Promise<WorktreeInfo>;
10
+ /**
11
+ * Removes a git worktree and optionally its branch.
12
+ */
13
+ export declare function removeWorktree(projectPath: string, worktreePath: string, branch?: string): Promise<void>;
14
+ /**
15
+ * Lists existing worktrees for a project.
16
+ */
17
+ export declare function listWorktrees(projectPath: string): Promise<string[]>;
18
+ /**
19
+ * Creates a PR from a worktree branch back to the base branch.
20
+ */
21
+ export declare function createWorktreePr(params: {
22
+ projectPath: string;
23
+ worktreePath: string;
24
+ branch: string;
25
+ title: string;
26
+ body?: string;
27
+ }): Promise<string>;
28
+ //# sourceMappingURL=worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/agent/worktree.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAe/F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9G;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ1E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBlB"}
@@ -0,0 +1,59 @@
1
+ import { executeShell } from '../tools/shell.js';
2
+ import crypto from 'node:crypto';
3
+ import path from 'node:path';
4
+ /**
5
+ * Creates a git worktree for parallel work on the same project.
6
+ * Returns the worktree path and branch name.
7
+ */
8
+ export async function createWorktree(projectPath, taskId) {
9
+ const suffix = crypto.randomUUID().slice(0, 8);
10
+ const branch = `pilot-worktree-${taskId}-${suffix}`;
11
+ const worktreePath = path.join(projectPath, '..', `.pilot-worktree-${suffix}`);
12
+ // Create a new branch and worktree from current HEAD
13
+ const result = await executeShell(`git worktree add -b "${branch}" "${worktreePath}"`, { cwd: projectPath });
14
+ if (result.exitCode !== 0) {
15
+ throw new Error(`Failed to create worktree: ${result.stderr}`);
16
+ }
17
+ return { path: worktreePath, branch };
18
+ }
19
+ /**
20
+ * Removes a git worktree and optionally its branch.
21
+ */
22
+ export async function removeWorktree(projectPath, worktreePath, branch) {
23
+ await executeShell(`git worktree remove "${worktreePath}" --force`, { cwd: projectPath });
24
+ if (branch) {
25
+ await executeShell(`git branch -D "${branch}"`, { cwd: projectPath });
26
+ }
27
+ }
28
+ /**
29
+ * Lists existing worktrees for a project.
30
+ */
31
+ export async function listWorktrees(projectPath) {
32
+ const result = await executeShell('git worktree list --porcelain', { cwd: projectPath });
33
+ if (result.exitCode !== 0)
34
+ return [];
35
+ return result.stdout
36
+ .split('\n')
37
+ .filter((line) => line.startsWith('worktree '))
38
+ .map((line) => line.replace('worktree ', ''));
39
+ }
40
+ /**
41
+ * Creates a PR from a worktree branch back to the base branch.
42
+ */
43
+ export async function createWorktreePr(params) {
44
+ // Push the worktree branch
45
+ const pushResult = await executeShell(`git push -u origin "${params.branch}"`, { cwd: params.worktreePath });
46
+ if (pushResult.exitCode !== 0) {
47
+ throw new Error(`Failed to push worktree branch: ${pushResult.stderr}`);
48
+ }
49
+ // Create PR
50
+ const prArgs = [`gh pr create --title "${params.title.replace(/"/g, '\\"')}" --head "${params.branch}"`];
51
+ if (params.body)
52
+ prArgs.push(`--body "${params.body.replace(/"/g, '\\"')}"`);
53
+ const prResult = await executeShell(prArgs.join(' '), { cwd: params.worktreePath });
54
+ if (prResult.exitCode !== 0) {
55
+ throw new Error(`Failed to create PR: ${prResult.stderr}`);
56
+ }
57
+ return prResult.stdout;
58
+ }
59
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/agent/worktree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface CommandRequest {
2
+ command: string;
3
+ project?: string;
4
+ }
5
+ export interface CommandResponse {
6
+ ok: boolean;
7
+ taskId?: string;
8
+ error?: string;
9
+ }
10
+ export type CommandHandler = (req: CommandRequest) => Promise<CommandResponse>;
11
+ export declare class ApiServer {
12
+ private server;
13
+ private token;
14
+ private handler;
15
+ private port;
16
+ private rateLimitMap;
17
+ constructor(token: string, port?: number);
18
+ onCommand(handler: CommandHandler): void;
19
+ start(): Promise<void>;
20
+ stop(): Promise<void>;
21
+ isRunning(): boolean;
22
+ getPort(): number;
23
+ static generateToken(): string;
24
+ private handleRequest;
25
+ private handleCommand;
26
+ private isRateLimited;
27
+ private readBody;
28
+ private sendJson;
29
+ }
30
+ //# sourceMappingURL=server.d.ts.map