palmier 0.1.5 → 0.1.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.
@@ -75,25 +75,30 @@ export async function serveCommand() {
75
75
  msg.respond(sc.encode(JSON.stringify(response)));
76
76
  }
77
77
  }
78
+ function toKebab(str) {
79
+ return str.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
80
+ }
81
+ function flattenTask(task, status) {
82
+ return { ...task.frontmatter, body: task.body, ...(status != null ? { status } : {}) };
83
+ }
78
84
  async function handleRpc(request) {
79
85
  switch (request.method) {
80
86
  case "task.list": {
81
87
  const tasks = listTasks(config.projectRoot);
82
- const tasksWithStatus = tasks.map((task) => ({
83
- ...task,
84
- status: getTaskStatus(task.frontmatter.id),
85
- }));
86
- return { tasks: tasksWithStatus };
88
+ return {
89
+ tasks: tasks.map((task) => flattenTask(task, getTaskStatus(task.frontmatter.id))),
90
+ };
87
91
  }
88
92
  case "task.create": {
89
93
  const params = request.params;
90
- const taskDir = getTaskDir(config.projectRoot, params.id);
94
+ const id = toKebab(params.name);
95
+ const taskDir = getTaskDir(config.projectRoot, id);
91
96
  const task = {
92
97
  frontmatter: {
93
- id: params.id,
98
+ id,
94
99
  name: params.name,
95
100
  user_prompt: params.user_prompt,
96
- triggers: params.triggers || [],
101
+ triggers: params.triggers ?? [],
97
102
  requires_confirmation: params.requires_confirmation ?? true,
98
103
  suppress_permissions: params.suppress_permissions ?? false,
99
104
  enabled: params.enabled ?? true,
@@ -102,7 +107,7 @@ export async function serveCommand() {
102
107
  };
103
108
  writeTaskFile(taskDir, task);
104
109
  installTaskTimer(config, task);
105
- return { ok: true, task_id: params.id };
110
+ return flattenTask(task);
106
111
  }
107
112
  case "task.update": {
108
113
  const params = request.params;
@@ -127,7 +132,7 @@ export async function serveCommand() {
127
132
  // Reinstall timer with updated config
128
133
  removeTaskTimer(params.id);
129
134
  installTaskTimer(config, existing);
130
- return { ok: true, task_id: params.id };
135
+ return flattenTask(existing, getTaskStatus(params.id));
131
136
  }
132
137
  case "task.delete": {
133
138
  const params = request.params;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "palmier",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Palmier agent CLI - provisions, executes tasks, and serves NATS RPC",
5
5
  "license": "ISC",
6
6
  "author": "Hongxu Cai",
@@ -5,7 +5,7 @@ import { loadConfig } from "../config.js";
5
5
  import { connectNats } from "../nats-client.js";
6
6
  import { listTasks, parseTaskFile, writeTaskFile, getTaskDir } from "../task.js";
7
7
  import { installTaskTimer, removeTaskTimer, getTaskStatus } from "../systemd.js";
8
- import type { RpcMessage, TaskWithStatus } from "../types.js";
8
+ import type { ParsedTask, RpcMessage } from "../types.js";
9
9
 
10
10
  /**
11
11
  * Start the persistent NATS RPC handler.
@@ -86,36 +86,44 @@ export async function serveCommand(): Promise<void> {
86
86
  }
87
87
  }
88
88
 
89
+ function toKebab(str: string): string {
90
+ return str.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
91
+ }
92
+
93
+ function flattenTask(task: ParsedTask, status?: unknown) {
94
+ return { ...task.frontmatter, body: task.body, ...(status != null ? { status } : {}) };
95
+ }
96
+
89
97
  async function handleRpc(request: RpcMessage): Promise<unknown> {
90
98
  switch (request.method) {
91
99
  case "task.list": {
92
100
  const tasks = listTasks(config.projectRoot);
93
- const tasksWithStatus: TaskWithStatus[] = tasks.map((task) => ({
94
- ...task,
95
- status: getTaskStatus(task.frontmatter.id),
96
- }));
97
- return { tasks: tasksWithStatus };
101
+ return {
102
+ tasks: tasks.map((task) =>
103
+ flattenTask(task, getTaskStatus(task.frontmatter.id))
104
+ ),
105
+ };
98
106
  }
99
107
 
100
108
  case "task.create": {
101
109
  const params = request.params as {
102
- id: string;
103
110
  name: string;
104
111
  user_prompt: string;
105
- triggers: Array<{ type: "cron" | "once"; value: string }>;
106
- requires_confirmation: boolean;
107
- suppress_permissions: boolean;
108
- enabled: boolean;
109
- body: string;
112
+ triggers?: Array<{ type: "cron" | "once"; value: string }>;
113
+ requires_confirmation?: boolean;
114
+ suppress_permissions?: boolean;
115
+ enabled?: boolean;
116
+ body?: string;
110
117
  };
111
118
 
112
- const taskDir = getTaskDir(config.projectRoot, params.id);
119
+ const id = toKebab(params.name);
120
+ const taskDir = getTaskDir(config.projectRoot, id);
113
121
  const task = {
114
122
  frontmatter: {
115
- id: params.id,
123
+ id,
116
124
  name: params.name,
117
125
  user_prompt: params.user_prompt,
118
- triggers: params.triggers || [],
126
+ triggers: params.triggers ?? [],
119
127
  requires_confirmation: params.requires_confirmation ?? true,
120
128
  suppress_permissions: params.suppress_permissions ?? false,
121
129
  enabled: params.enabled ?? true,
@@ -126,7 +134,7 @@ export async function serveCommand(): Promise<void> {
126
134
  writeTaskFile(taskDir, task);
127
135
  installTaskTimer(config, task);
128
136
 
129
- return { ok: true, task_id: params.id };
137
+ return flattenTask(task);
130
138
  }
131
139
 
132
140
  case "task.update": {
@@ -161,7 +169,7 @@ export async function serveCommand(): Promise<void> {
161
169
  removeTaskTimer(params.id);
162
170
  installTaskTimer(config, existing);
163
171
 
164
- return { ok: true, task_id: params.id };
172
+ return flattenTask(existing, getTaskStatus(params.id));
165
173
  }
166
174
 
167
175
  case "task.delete": {