prompt-language-shell 0.7.4 → 0.7.6

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/README.md CHANGED
@@ -28,7 +28,7 @@ $ pls list skills
28
28
  Here's what I can help with:
29
29
 
30
30
  - Introspect - list available capabilities and skills
31
- - Config - manage and configure system settings
31
+ - Configure - manage and configure system settings
32
32
  - Answer - respond to questions and provide information
33
33
  - Execute - run shell commands and process operations
34
34
  ```
@@ -74,10 +74,10 @@ Run `pls` without arguments to see the welcome screen.
74
74
  ## How It Works
75
75
 
76
76
  When you make a request, `pls` interprets your intent and creates a structured
77
- plan breaking down the work into individual tasks. You'll see this plan
77
+ plan breaking down the work into individual tasks. You'll see this schedule
78
78
  displayed in your terminal before anything executes.
79
79
 
80
- After reviewing the plan, you can confirm to proceed or cancel if something
80
+ After reviewing the schedule, you can confirm to proceed or cancel if something
81
81
  doesn't look right. Once confirmed, `pls` executes each task sequentially and
82
82
  shows real-time progress and results.
83
83
 
@@ -74,8 +74,8 @@ export class AnthropicService {
74
74
  const skillsSection = formatSkillsForPrompt(skills);
75
75
  systemPrompt += skillsSection;
76
76
  }
77
- // Add config structure for config tool only
78
- if (toolName === 'config') {
77
+ // Add config structure for configure tool only
78
+ if (toolName === 'configure') {
79
79
  const configStructure = getAvailableConfigStructure();
80
80
  const configuredKeys = getConfiguredKeys();
81
81
  const configSection = '\n## Available Configuration\n\n' +
@@ -97,99 +97,121 @@ function executeTasksAfterConfirm(tasks, service, userRequest, handlers) {
97
97
  handlers.onError(error instanceof Error ? error.message : String(error));
98
98
  return;
99
99
  }
100
- // Flatten Group tasks to get actual executable subtasks
101
- const flattenedTasks = [];
102
100
  const scheduledTasks = tasks;
101
+ // Process tasks in order, preserving Group boundaries
102
+ // Track consecutive standalone tasks to group them by type
103
+ let consecutiveStandaloneTasks = [];
104
+ const processStandaloneTasks = () => {
105
+ if (consecutiveStandaloneTasks.length === 0)
106
+ return;
107
+ // Group consecutive standalone tasks by type
108
+ const tasksByType = {};
109
+ for (const type of Object.values(TaskType)) {
110
+ tasksByType[type] = [];
111
+ }
112
+ for (const task of consecutiveStandaloneTasks) {
113
+ tasksByType[task.type].push(task);
114
+ }
115
+ // Route each type group
116
+ for (const [type, typeTasks] of Object.entries(tasksByType)) {
117
+ const taskType = type;
118
+ if (typeTasks.length === 0)
119
+ continue;
120
+ routeTasksByType(taskType, typeTasks, service, userRequest, handlers);
121
+ }
122
+ consecutiveStandaloneTasks = [];
123
+ };
124
+ // Process tasks in original order
103
125
  for (const task of scheduledTasks) {
104
126
  if (task.type === TaskType.Group && task.subtasks) {
105
- // Add all subtasks from the group
106
- flattenedTasks.push(...task.subtasks);
127
+ // Process any accumulated standalone tasks first
128
+ processStandaloneTasks();
129
+ // Process Group as separate component
130
+ if (task.subtasks.length > 0) {
131
+ const subtasks = task.subtasks;
132
+ const taskType = subtasks[0].type;
133
+ routeTasksByType(taskType, subtasks, service, userRequest, handlers);
134
+ }
107
135
  }
108
136
  else {
109
- // Add non-group tasks as-is
110
- flattenedTasks.push(task);
137
+ // Accumulate standalone task
138
+ consecutiveStandaloneTasks.push(task);
111
139
  }
112
140
  }
113
- // Group flattened tasks by type - initialize all TaskType keys with empty arrays
114
- const tasksByType = {};
115
- for (const type of Object.values(TaskType)) {
116
- tasksByType[type] = [];
141
+ // Process any remaining standalone tasks
142
+ processStandaloneTasks();
143
+ }
144
+ /**
145
+ * Route tasks by type to appropriate components
146
+ * Extracted to allow reuse for both Groups and standalone tasks
147
+ */
148
+ function routeTasksByType(taskType, typeTasks, service, userRequest, handlers) {
149
+ if (taskType === TaskType.Answer) {
150
+ // Create separate Answer component for each question
151
+ for (const task of typeTasks) {
152
+ handlers.addToQueue(createAnswerDefinition(task.action, service));
153
+ }
117
154
  }
118
- for (const task of flattenedTasks) {
119
- tasksByType[task.type].push(task);
155
+ else if (taskType === TaskType.Introspect) {
156
+ handlers.addToQueue(createIntrospectDefinition(typeTasks, service));
120
157
  }
121
- // Route each type group appropriately
122
- for (const [type, typeTasks] of Object.entries(tasksByType)) {
123
- const taskType = type;
124
- // Skip empty task groups (pre-initialized but unused)
125
- if (typeTasks.length === 0) {
126
- continue;
127
- }
128
- if (taskType === TaskType.Answer) {
129
- const question = typeTasks[0].action;
130
- handlers.addToQueue(createAnswerDefinition(question, service));
131
- }
132
- else if (taskType === TaskType.Introspect) {
133
- handlers.addToQueue(createIntrospectDefinition(typeTasks, service));
134
- }
135
- else if (taskType === TaskType.Config) {
136
- // Route to Config flow - extract keys from task params
137
- const configKeys = typeTasks
138
- .map((task) => task.params?.key)
139
- .filter((key) => key !== undefined);
140
- handlers.addToQueue(createConfigDefinitionWithKeys(configKeys, (config) => {
141
- // Save config - Config component will handle completion and feedback
142
- try {
143
- // Convert flat dotted keys to nested structure grouped by section
144
- const configBySection = unflattenConfig(config);
145
- // Save each section
146
- for (const [section, sectionConfig] of Object.entries(configBySection)) {
147
- saveConfig(section, sectionConfig);
148
- }
149
- }
150
- catch (error) {
151
- const errorMessage = error instanceof Error
152
- ? error.message
153
- : 'Failed to save configuration';
154
- throw new Error(errorMessage);
155
- }
156
- }, (operation) => {
157
- handlers.onAborted(operation);
158
- }));
159
- }
160
- else if (taskType === TaskType.Execute) {
161
- // Execute tasks with validation
158
+ else if (taskType === TaskType.Config) {
159
+ // Route to Config flow - extract keys from task params
160
+ const configKeys = typeTasks
161
+ .map((task) => task.params?.key)
162
+ .filter((key) => key !== undefined);
163
+ handlers.addToQueue(createConfigDefinitionWithKeys(configKeys, (config) => {
164
+ // Save config - Config component will handle completion and feedback
162
165
  try {
163
- const validation = validateExecuteTasks(typeTasks);
164
- if (validation.validationErrors.length > 0) {
165
- // Show error feedback for invalid skills
166
- const errorMessages = validation.validationErrors.map((error) => {
167
- const issuesList = error.issues
168
- .map((issue) => ` - ${issue}`)
169
- .join('\n');
170
- return `Invalid skill definition "${error.skill}":\n\n${issuesList}`;
171
- });
172
- handlers.addToQueue(createFeedback(FeedbackType.Failed, errorMessages.join('\n\n')));
173
- }
174
- else if (validation.missingConfig.length > 0) {
175
- handlers.addToQueue(createValidateDefinition(validation.missingConfig, userRequest, service, (error) => {
176
- handlers.onError(error);
177
- }, () => {
178
- handlers.addToQueue(createExecuteDefinition(typeTasks, service));
179
- }, (operation) => {
180
- handlers.onAborted(operation);
181
- }));
182
- }
183
- else {
184
- handlers.addToQueue(createExecuteDefinition(typeTasks, service));
166
+ // Convert flat dotted keys to nested structure grouped by section
167
+ const configBySection = unflattenConfig(config);
168
+ // Save each section
169
+ for (const [section, sectionConfig] of Object.entries(configBySection)) {
170
+ saveConfig(section, sectionConfig);
185
171
  }
186
172
  }
187
173
  catch (error) {
188
- // Handle skill reference errors (e.g., unknown skills)
189
- const errorMessage = error instanceof Error ? error.message : String(error);
190
- const message = createMessage(errorMessage);
191
- handlers.addToQueue(message);
174
+ const errorMessage = error instanceof Error
175
+ ? error.message
176
+ : 'Failed to save configuration';
177
+ throw new Error(errorMessage);
192
178
  }
179
+ }, (operation) => {
180
+ handlers.onAborted(operation);
181
+ }));
182
+ }
183
+ else if (taskType === TaskType.Execute) {
184
+ // Execute tasks with validation
185
+ try {
186
+ const validation = validateExecuteTasks(typeTasks);
187
+ if (validation.validationErrors.length > 0) {
188
+ // Show error feedback for invalid skills
189
+ const errorMessages = validation.validationErrors.map((error) => {
190
+ const issuesList = error.issues
191
+ .map((issue) => ` - ${issue}`)
192
+ .join('\n');
193
+ return `Invalid skill definition "${error.skill}":\n\n${issuesList}`;
194
+ });
195
+ handlers.addToQueue(createFeedback(FeedbackType.Failed, errorMessages.join('\n\n')));
196
+ }
197
+ else if (validation.missingConfig.length > 0) {
198
+ handlers.addToQueue(createValidateDefinition(validation.missingConfig, userRequest, service, (error) => {
199
+ handlers.onError(error);
200
+ }, () => {
201
+ handlers.addToQueue(createExecuteDefinition(typeTasks, service));
202
+ }, (operation) => {
203
+ handlers.onAborted(operation);
204
+ }));
205
+ }
206
+ else {
207
+ handlers.addToQueue(createExecuteDefinition(typeTasks, service));
208
+ }
209
+ }
210
+ catch (error) {
211
+ // Handle skill reference errors (e.g., unknown skills)
212
+ const errorMessage = error instanceof Error ? error.message : String(error);
213
+ const message = createMessage(errorMessage);
214
+ handlers.addToQueue(message);
193
215
  }
194
216
  }
195
217
  }
@@ -7,10 +7,10 @@ import { parseSkillMarkdown, displayNameToKey } from './parser.js';
7
7
  * Built-in skill names that user skills cannot override
8
8
  */
9
9
  const BUILT_IN_SKILLS = new Set([
10
- 'plan',
10
+ 'schedule',
11
11
  'execute',
12
12
  'answer',
13
- 'config',
13
+ 'configure',
14
14
  'validate',
15
15
  'introspect',
16
16
  ]);
@@ -13,8 +13,8 @@ training data.
13
13
  ## Execution Flow
14
14
 
15
15
  This tool is invoked AFTER:
16
- 1. PLAN detected an information request and created a task with type "answer"
17
- 2. User reviewed and confirmed the plan
16
+ 1. SCHEDULE detected an information request and created a task with type "answer"
17
+ 2. User reviewed and confirmed the schedule
18
18
  3. The answer task is now being executed
19
19
 
20
20
  Your task is to provide a clear, concise answer to the user's question.
@@ -7,11 +7,11 @@ operations when tasks with type "execute" have been planned and confirmed.
7
7
  ## Execution Flow
8
8
 
9
9
  This tool is invoked AFTER:
10
- 1. PLAN created tasks with type "execute" describing operations to perform
11
- 2. User reviewed and confirmed the plan
10
+ 1. SCHEDULE created tasks with type "execute" describing operations to perform
11
+ 2. User reviewed and confirmed the schedule
12
12
  3. The execute tasks are now being executed
13
13
 
14
- Your task is to translate the planned actions into specific shell commands
14
+ Your task is to translate the scheduled actions into specific shell commands
15
15
  that can be run in the terminal.
16
16
 
17
17
  ## Input
@@ -82,7 +82,7 @@ NON-NEGOTIABLE and applies to EVERY response.
82
82
  These MUST appear FIRST, in this EXACT sequence:
83
83
 
84
84
  1. **Introspect** ← ALWAYS FIRST
85
- 2. **Config** ← ALWAYS SECOND
85
+ 2. **Configure** ← ALWAYS SECOND
86
86
  3. **Answer** ← ALWAYS THIRD
87
87
  4. **Execute** ← ALWAYS FOURTH
88
88
 
@@ -149,7 +149,7 @@ Examples:
149
149
 
150
150
  When user asks "list your skills", create an introductory message like
151
151
  "here are my capabilities:" followed by tasks for built-in capabilities
152
- (Introspect, Config, Answer, Execute), then indirect workflow capabilities
152
+ (Introspect, Configure, Answer, Execute), then indirect workflow capabilities
153
153
  (Schedule, Validate, Report).
154
154
 
155
155
  Each task uses type "introspect" with an action describing the
@@ -167,7 +167,7 @@ deploy app skill with its description.
167
167
  When user asks "what can you do" and user-defined skills like "process
168
168
  data" and "backup files" exist, create an introductory message like "i can
169
169
  help with these operations:" followed by all built-in capabilities
170
- (Introspect, Config, Answer, Execute, Validate, Schedule, Report) plus the
170
+ (Introspect, Configure, Answer, Execute, Validate, Schedule, Report) plus the
171
171
  user-defined skills. Each capability and skill becomes a task with type
172
172
  "introspect".
173
173
 
@@ -56,6 +56,14 @@ Every task MUST have a type field. Use the appropriate type:
56
56
  a matching skill in the "Available Skills" section. DO NOT create
57
57
  `execute` tasks without a corresponding skill.
58
58
 
59
+ **Define task params**: When creating a `define` type task, include:
60
+ - `skill`: the skill name that needs variant selection (REQUIRED)
61
+ - `options`: array of option strings describing each variant (REQUIRED)
62
+
63
+ Example: User "build" without variant → Task with type "define",
64
+ params { skill: "Build Project", options: ["Build project Alpha, the
65
+ main variant", "Build project Beta, the experimental variant"] }
66
+
59
67
  ## Configuration Requests
60
68
 
61
69
  When user wants to configure or change settings (e.g., "config",
@@ -130,12 +138,15 @@ components (e.g., {project.VARIANT.path}, {env.TYPE.config},
130
138
 
131
139
  5. **Extract config expressions**: All leaf tasks must include a
132
140
  `config` array listing resolved configuration paths:
133
- - After resolving variant placeholders, extract all config
134
- expressions from the task's execution commands
141
+ - After resolving variant placeholders, extract **ALL** config
142
+ expressions from the task's execution commands (every single
143
+ placeholder in curly braces)
135
144
  - List them in dot notation (e.g., "project.beta.repo",
136
145
  "env.production.url")
137
146
  - The app will check if these exist in ~/.plsrc and prompt for
138
147
  missing values
148
+ - **CRITICAL**: If a task has multiple config placeholders, ALL
149
+ must be included in the config array
139
150
  - Example: Task with `cd {project.beta.repo}` and `cat
140
151
  {project.beta.config}` should include config:
141
152
  ["project.beta.repo", "project.beta.config"]
@@ -193,27 +204,51 @@ structure.
193
204
 
194
205
  ## Sequential and Multiple Requests
195
206
 
196
- When the user provides multiple requests separated by commas,
197
- semicolons, or the word "and":
207
+ **CRITICAL**: When the user provides multiple requests separated by
208
+ commas, semicolons, or the word "and", EVERY request must be
209
+ represented as a separate task. DO NOT skip or merge any requests,
210
+ even if they use the same action verb.
211
+
212
+ **Sequential Processing Rules:**
213
+
214
+ 1. **Preserve ALL requests**: Each operation in the sequence creates a
215
+ separate task, in the exact order specified. Count the requests
216
+ carefully and verify each one is represented.
217
+
218
+ 2. **Same action, different subjects = separate tasks**: Multiple
219
+ requests using the same verb with different subjects are NOT
220
+ duplicates:
221
+ - "explain X, explain Y" → TWO separate answer tasks
222
+ - "process A, process B" → TWO separate task groups
223
+ - "show X, show Y" → TWO separate report/answer tasks
198
224
 
199
- 1. **Preserve the sequence**: Each operation should be represented as a
200
- separate task in the order specified
201
- 2. **Independent skill matching**: For each operation, independently
225
+ 3. **Independent skill matching**: For each operation, independently
202
226
  check if it matches a skill:
203
227
  - If operation matches a skill → extract skill steps as subtasks
204
228
  - If operation does NOT match a skill → create "ignore" type task
205
229
  - **CRITICAL: Do NOT infer context or create generic execute tasks
206
230
  for unmatched operations**
207
- 3. **No merging**: Keep operations separate even if they seem related.
208
- The user's sequence is intentional.
231
+
232
+ 4. **No merging**: Keep operations separate even if they seem related.
233
+ The user's sequence is intentional and must be preserved exactly.
234
+
235
+ 5. **Verify completeness**: Before finalizing, count your tasks and
236
+ verify the count matches the number of distinct requests in the
237
+ user's input.
209
238
 
210
239
  **Examples:**
211
240
 
212
- - "explain docker, build production, then list the changes" → Three
213
- separate task groups:
241
+ - "explain docker, process data, explain kubernetes" → THREE
242
+ separate task groups (not two):
214
243
  - Task 1: "Explain Docker" (type: answer)
215
- - Task 2: "Build production" (skill-based with subtasks)
216
- - Task 3: "List the changes" (type: answer or report)
244
+ - Task 2: "Process data" (skill-based with subtasks)
245
+ - Task 3: "Explain Kubernetes" (type: answer)
246
+
247
+ - "explain tdd, process files, explain tbd" → THREE separate task
248
+ groups:
249
+ - Task 1: "Explain Test-Driven Development" (type: answer)
250
+ - Task 2: "Process files" (skill-based with subtasks)
251
+ - Task 3: "Explain TBD" (type: answer)
217
252
 
218
253
  - "process files and validate" where only "process" has a skill →
219
254
  - Task 1: "Process files" (skill-based with subtasks)
@@ -270,14 +305,20 @@ Before finalizing, verify there are no duplicates.
270
305
  simple terms")
271
306
  - "list X completely" = ONE task (not "list X" + "be complete")
272
307
 
273
- 2. **Synonymous verbs are duplicates**: Different verbs meaning the
274
- same thing are duplicates
308
+ 2. **Synonymous verbs with SAME subject are duplicates**: Different
309
+ verbs meaning the same thing on the SAME subject are duplicates
275
310
  - "explain X" + "describe X" = DUPLICATE (choose one)
276
311
  - "show X" + "display X" = DUPLICATE (choose one)
277
312
  - "check X" + "verify X" = DUPLICATE (choose one)
278
313
 
279
- 3. **Redundant operations are duplicates**: If two tasks would perform
280
- the same operation
314
+ 3. **Same verb with DIFFERENT subjects are NOT duplicates**: This is
315
+ a sequential request and each must be preserved
316
+ - "explain X" + "explain Y" = TWO SEPARATE TASKS
317
+ - "process A" + "process B" = TWO SEPARATE TASKS
318
+ - "show X" + "show Y" = TWO SEPARATE TASKS
319
+
320
+ 4. **Redundant operations are duplicates**: If two tasks would perform
321
+ the same operation on the same target
281
322
  - "install and set up dependencies" = ONE task (setup is part of
282
323
  install)
283
324
  - "check and verify disk space" = ONE task (verify means check)
@@ -286,17 +327,22 @@ Before finalizing, verify there are no duplicates.
286
327
 
287
328
  Before finalizing the schedule, perform strict validation:
288
329
 
289
- 1. Each task represents a distinct step in the user's request
290
- 2. Tasks are ordered in the logical sequence they should execute
291
- 3. Each task is clearly defined with specific action and parameters
292
- 4. Tasks are NOT merged - preserve the user's intended sequence
293
- 5. All operations from the user's request are represented
294
- 6. No semantic duplicates exist (same operation with different words)
295
- 7. For skill-based tasks, verify all required params are included
330
+ 1. **Count verification**: Count the distinct requests in the user's
331
+ input and verify your task list has the same number of top-level
332
+ tasks. If counts don't match, you've skipped or merged requests.
333
+ 2. Each task represents a distinct step in the user's request
334
+ 3. Tasks are ordered in the logical sequence they should execute
335
+ 4. Each task is clearly defined with specific action and parameters
336
+ 5. Tasks are NOT merged - preserve the user's intended sequence
337
+ 6. All operations from the user's request are represented (check each
338
+ one individually)
339
+ 7. No semantic duplicates exist (same verb on same subject), but same
340
+ verb on different subjects creates separate tasks
341
+ 8. For skill-based tasks, verify all required params are included
296
342
  (skill name, variant if applicable)
297
- 8. For leaf tasks, verify type field is present
298
- 9. For leaf tasks with config placeholders, verify config array is
299
- populated
343
+ 9. For leaf tasks, verify type field is present
344
+ 10. For leaf tasks with config placeholders, verify config array is
345
+ populated
300
346
 
301
347
  ## Critical Guidelines
302
348
 
@@ -1,6 +1,6 @@
1
1
  export const answerTool = {
2
2
  name: 'answer',
3
- description: 'Answer questions and provide up-to-date information using web search. Called after PLAN has identified an answer request and user has confirmed. Searches the web for current data and provides concise, helpful responses formatted for terminal display.',
3
+ description: 'Answer questions and provide up-to-date information using web search. Called after SCHEDULE has identified an answer request and user has confirmed. Searches the web for current data and provides concise, helpful responses formatted for terminal display.',
4
4
  input_schema: {
5
5
  type: 'object',
6
6
  properties: {
@@ -1,6 +1,6 @@
1
1
  export const configureTool = {
2
2
  name: 'configure',
3
- description: 'Determine which configuration settings to show based on user query. Receives available config keys with descriptions and returns which keys the user wants to configure.',
3
+ description: 'Determine which configuration settings to show based on user query. Receives available configuration keys with descriptions and returns which keys the user wants to configure.',
4
4
  input_schema: {
5
5
  type: 'object',
6
6
  properties: {
@@ -1,6 +1,6 @@
1
1
  export const executeTool = {
2
2
  name: 'execute',
3
- description: 'Execute shell commands from planned tasks. Translates task descriptions into specific shell commands that can be run in the terminal. Called after PLAN has created execute tasks and user has confirmed.',
3
+ description: 'Execute shell commands from scheduled tasks. Translates task descriptions into specific shell commands that can be run in the terminal. Called after SCHEDULE has created execute tasks and user has confirmed.',
4
4
  input_schema: {
5
5
  type: 'object',
6
6
  properties: {
@@ -1,6 +1,6 @@
1
1
  export const introspectTool = {
2
2
  name: 'introspect',
3
- description: 'Execute a task with type "introspect" to list available capabilities and skills. Called after PLAN has identified an introspection request and user has confirmed. Takes the task action and optional filter parameter to present built-in capabilities and user-defined skills.',
3
+ description: 'Execute a task with type "introspect" to list available capabilities and skills. Called after SCHEDULE has identified an introspection request and user has confirmed. Takes the task action and optional filter parameter to present built-in capabilities and user-defined skills.',
4
4
  input_schema: {
5
5
  type: 'object',
6
6
  properties: {
@@ -10,13 +10,13 @@ export const introspectTool = {
10
10
  },
11
11
  tasks: {
12
12
  type: 'array',
13
- description: 'Array of capabilities, each with type "introspect". Include built-in capabilities (PLAN, INTROSPECT, ANSWER, EXECUTE, REPORT, CONFIG) and user-defined skills from the Available Skills section.',
13
+ description: 'Array of capabilities, each with type "introspect". Include built-in capabilities (SCHEDULE, INTROSPECT, ANSWER, EXECUTE, REPORT, CONFIGURE) and user-defined skills from the Available Skills section.',
14
14
  items: {
15
15
  type: 'object',
16
16
  properties: {
17
17
  action: {
18
18
  type: 'string',
19
- description: 'Capability name and description. Format: "NAME: Brief description". Maximum 64 characters. Examples: "PLAN: Break down requests into steps", "Deploy App: Build and deploy application".',
19
+ description: 'Capability name and description. Format: "NAME: Brief description". Maximum 64 characters. Examples: "SCHEDULE: Break down requests into steps", "Deploy App: Build and deploy application".',
20
20
  },
21
21
  type: {
22
22
  type: 'string',
@@ -27,7 +27,7 @@ export const scheduleTool = {
27
27
  },
28
28
  type: {
29
29
  type: 'string',
30
- description: 'Type: "group" for parent tasks with subtasks. For leaf tasks: "config", "execute", "answer", "introspect", "report", "define", "ignore"',
30
+ description: 'Type: "group" for parent tasks with subtasks. For leaf tasks: "configure", "execute", "answer", "introspect", "report", "define", "ignore"',
31
31
  },
32
32
  params: {
33
33
  type: 'object',
@@ -11,7 +11,7 @@ import { ensureMinimumTime } from '../services/timing.js';
11
11
  import { Spinner } from './Spinner.js';
12
12
  const MIN_PROCESSING_TIME = 1000;
13
13
  const BUILT_IN_CAPABILITIES = new Set([
14
- 'CONFIG',
14
+ 'CONFIGURE',
15
15
  'SCHEDULE',
16
16
  'INTROSPECT',
17
17
  'ANSWER',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prompt-language-shell",
3
- "version": "0.7.4",
3
+ "version": "0.7.6",
4
4
  "description": "Your personal command-line concierge. Ask politely, and it gets things done.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -17,8 +17,9 @@
17
17
  "dev": "npm run build && tsc --watch",
18
18
  "prepare": "husky",
19
19
  "prepublishOnly": "npm run check",
20
- "test": "vitest run",
21
- "test:watch": "vitest",
20
+ "test": "vitest run --exclude 'tests/integration/*.test.tsx'",
21
+ "test:watch": "vitest --exclude 'tests/integration/*.test.tsx'",
22
+ "test:llm": "vitest run tests/integration/schedule*.test.tsx",
22
23
  "format": "prettier --write '**/*.{ts,tsx}'",
23
24
  "format:check": "prettier --check '**/*.{ts,tsx}'",
24
25
  "lint": "eslint .",