felo-ai 0.2.41 → 0.2.42

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.
@@ -191,6 +191,7 @@ node ~/.agents/skills/felo-livedoc/scripts/run_livedoc.mjs tasks SHORT_ID --labe
191
191
  ```bash
192
192
  node ~/.agents/skills/felo-livedoc/scripts/run_livedoc.mjs create-task SHORT_ID --title "Write docs" --status 0 --sort 0
193
193
  node ~/.agents/skills/felo-livedoc/scripts/run_livedoc.mjs create-task SHORT_ID --title "Write docs" --status 0 --sort 0 --description "API docs" --labels "docs"
194
+ node ~/.agents/skills/felo-livedoc/scripts/run_livedoc.mjs create-task SHORT_ID --title "Write docs" --operated-by "claude-code"
194
195
  ```
195
196
 
196
197
  Task status values: `0`=TODO, `1`=IN_PROGRESS, `2`=DONE
@@ -199,6 +200,7 @@ Task status values: `0`=TODO, `1`=IN_PROGRESS, `2`=DONE
199
200
  ```bash
200
201
  node ~/.agents/skills/felo-livedoc/scripts/run_livedoc.mjs update-task SHORT_ID TASK_ID --status 1
201
202
  node ~/.agents/skills/felo-livedoc/scripts/run_livedoc.mjs update-task SHORT_ID TASK_ID --title "New title" --labels "docs,done"
203
+ node ~/.agents/skills/felo-livedoc/scripts/run_livedoc.mjs update-task SHORT_ID TASK_ID --status 2 --operated-by "claude-code"
202
204
  ```
203
205
 
204
206
  **Delete a task:**
@@ -215,6 +217,7 @@ node ~/.agents/skills/felo-livedoc/scripts/run_livedoc.mjs task-records SHORT_ID
215
217
  **Add a comment to a task:**
216
218
  ```bash
217
219
  node ~/.agents/skills/felo-livedoc/scripts/run_livedoc.mjs add-task-comment SHORT_ID TASK_ID --content "This is a comment."
220
+ node ~/.agents/skills/felo-livedoc/scripts/run_livedoc.mjs add-task-comment SHORT_ID TASK_ID --content "This is a comment." --operated-by "claude-code"
218
221
  ```
219
222
  ### Options
220
223
 
@@ -208,6 +208,7 @@ function usage() {
208
208
  ' --sort <n> Task sort order (non-negative integer)',
209
209
  ' --labels <labels> Comma-separated labels (tasks)',
210
210
  ' --record-type <type> Record type filter: comment, edit, status_change',
211
+ ' --operated-by <sig> Operator signature, e.g. claude-code, openclaw (max 100 chars)',
211
212
  ' -j, --json Output raw JSON',
212
213
  ' -t, --timeout <ms> Timeout in ms (default: 60000)',
213
214
  ' --help Show this help',
@@ -219,7 +220,7 @@ function parseArgs(argv) {
219
220
  keyword: '', page: '', size: '', type: '', content: '', title: '',
220
221
  urls: '', file: '', convert: false, query: '', resourceIds: '', maxResources: '',
221
222
  resourceId: '', pageNumber: '', maxChunk: '', expiresIn: '', output: '',
222
- status: '', sort: '', labels: '', recordType: '',
223
+ status: '', sort: '', labels: '', recordType: '', operatedBy: '',
223
224
  json: false, timeoutMs: DEFAULT_TIMEOUT_MS, help: false,
224
225
  };
225
226
  const positional = [];
@@ -251,6 +252,7 @@ function parseArgs(argv) {
251
252
  else if (a === '--sort') out.sort = argv[++i] || '';
252
253
  else if (a === '--labels') out.labels = argv[++i] || '';
253
254
  else if (a === '--record-type') out.recordType = argv[++i] || '';
255
+ else if (a === '--operated-by') out.operatedBy = argv[++i] || '';
254
256
  else if (a === '-t' || a === '--timeout') {
255
257
  const n = parseInt(argv[++i] || '', 10);
256
258
  if (Number.isFinite(n) && n > 0) out.timeoutMs = n;
@@ -615,6 +617,7 @@ async function main() {
615
617
  const body = { title: args.title, status, sort };
616
618
  if (args.description) body.description = args.description;
617
619
  body.labels = args.labels ? args.labels.split(',').map(l => l.trim()).filter(Boolean) : [];
620
+ if (args.operatedBy) body.operated_by = args.operatedBy;
618
621
  const payload = await apiRequest('POST', `/livedocs/${shortId}/tasks`, body, apiKey, apiBase, timeoutMs);
619
622
  if (json) { console.log(JSON.stringify(payload, null, 2)); }
620
623
  else { process.stdout.write('Task created!\n\n'); process.stdout.write(formatTask(payload?.data)); }
@@ -631,6 +634,7 @@ async function main() {
631
634
  if (args.status !== '') body.status = parseInt(args.status, 10);
632
635
  if (args.sort !== '') body.sort = parseInt(args.sort, 10);
633
636
  if (args.labels !== undefined) body.labels = args.labels.split(',').map(l => l.trim()).filter(Boolean);
637
+ if (args.operatedBy) body.operated_by = args.operatedBy;
634
638
  const payload = await apiRequest('PATCH', `/livedocs/${shortId}/tasks/${resourceId}`, body, apiKey, apiBase, timeoutMs);
635
639
  if (json) { console.log(JSON.stringify(payload, null, 2)); }
636
640
  else { process.stdout.write('Task updated!\n\n'); process.stdout.write(formatTask(payload?.data)); }
@@ -674,7 +678,9 @@ async function main() {
674
678
  if (!resourceId) { console.error('ERROR: task_id is required'); break; }
675
679
  if (!args.content) { console.error('ERROR: --content is required'); break; }
676
680
  spinnerId = startSpinner('Adding comment');
677
- const payload = await apiRequest('POST', `/livedocs/${shortId}/tasks/${resourceId}/comments`, { content: args.content }, apiKey, apiBase, timeoutMs);
681
+ const body = { content: args.content };
682
+ if (args.operatedBy) body.operated_by = args.operatedBy;
683
+ const payload = await apiRequest('POST', `/livedocs/${shortId}/tasks/${resourceId}/comments`, body, apiKey, apiBase, timeoutMs);
678
684
  if (json) { console.log(JSON.stringify(payload, null, 2)); }
679
685
  else { process.stdout.write('Comment added.\n'); process.stdout.write(formatTaskRecord(payload?.data)); }
680
686
  code = 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "felo-ai",
3
- "version": "0.2.41",
3
+ "version": "0.2.42",
4
4
  "description": "Felo AI CLI - real-time search, PPT generation, SuperAgent conversation, LiveDoc management, web fetch, YouTube subtitles, LiveDoc knowledge base, and X (Twitter) search from the terminal",
5
5
  "type": "module",
6
6
  "main": "src/cli.js",
package/src/cli.js CHANGED
@@ -911,6 +911,7 @@ livedocCmd
911
911
  .option("--sort <n>", "sort order (non-negative integer, default: 0)")
912
912
  .option("--description <desc>", "task description")
913
913
  .option("--labels <labels>", "comma-separated labels (max 10)")
914
+ .option("--operated-by <signature>", "operator signature, e.g. claude-code, openclaw (max 100 characters)")
914
915
  .option("-j, --json", "output raw JSON")
915
916
  .option("-t, --timeout <seconds>", "request timeout in seconds", "60")
916
917
  .action(async (shortId, opts) => {
@@ -921,6 +922,7 @@ livedocCmd
921
922
  sort: opts.sort,
922
923
  description: opts.description,
923
924
  labels: opts.labels,
925
+ operatedBy: opts.operatedBy,
924
926
  json: opts.json,
925
927
  timeoutMs: Number.isNaN(timeoutMs) ? 60000 : timeoutMs,
926
928
  });
@@ -936,6 +938,7 @@ livedocCmd
936
938
  .option("--status <n>", "new status: 0=TODO, 1=IN_PROGRESS, 2=DONE")
937
939
  .option("--sort <n>", "new sort order")
938
940
  .option("--labels <labels>", "new comma-separated labels")
941
+ .option("--operated-by <signature>", "operator signature, e.g. claude-code, openclaw (max 100 characters)")
939
942
  .option("-j, --json", "output raw JSON")
940
943
  .option("-t, --timeout <seconds>", "request timeout in seconds", "60")
941
944
  .action(async (shortId, taskId, opts) => {
@@ -946,6 +949,7 @@ livedocCmd
946
949
  status: opts.status,
947
950
  sort: opts.sort,
948
951
  labels: opts.labels,
952
+ operatedBy: opts.operatedBy,
949
953
  json: opts.json,
950
954
  timeoutMs: Number.isNaN(timeoutMs) ? 60000 : timeoutMs,
951
955
  });
@@ -993,12 +997,14 @@ livedocCmd
993
997
  .command("add-task-comment <short_id> <task_id>")
994
998
  .description("Add a comment to a task")
995
999
  .requiredOption("--content <text>", "comment content")
1000
+ .option("--operated-by <signature>", "operator signature, e.g. claude-code, openclaw (max 100 characters)")
996
1001
  .option("-j, --json", "output raw JSON")
997
1002
  .option("-t, --timeout <seconds>", "request timeout in seconds", "60")
998
1003
  .action(async (shortId, taskId, opts) => {
999
1004
  const timeoutMs = parseInt(opts.timeout, 10) * 1000;
1000
1005
  const code = await livedoc.createTaskComment(shortId, taskId, {
1001
1006
  content: opts.content,
1007
+ operatedBy: opts.operatedBy,
1002
1008
  json: opts.json,
1003
1009
  timeoutMs: Number.isNaN(timeoutMs) ? 60000 : timeoutMs,
1004
1010
  });
package/src/livedoc.js CHANGED
@@ -711,6 +711,7 @@ export async function createTask(shortId, opts = {}) {
711
711
  const body = { title: opts.title, status, sort };
712
712
  if (opts.description) body.description = opts.description;
713
713
  body.labels = opts.labels ? opts.labels.split(',').map(l => l.trim()).filter(Boolean) : [];
714
+ if (opts.operatedBy) body.operated_by = opts.operatedBy;
714
715
  const payload = await apiRequest('POST', `/livedocs/${shortId}/tasks`, body, apiKey, apiBase, timeoutMs);
715
716
  if (opts.json) { console.log(JSON.stringify(payload, null, 2)); return 0; }
716
717
  process.stdout.write('Task created!\n\n');
@@ -738,6 +739,7 @@ export async function updateTask(shortId, taskId, opts = {}) {
738
739
  if (opts.status !== undefined && opts.status !== '') body.status = parseInt(opts.status, 10);
739
740
  if (opts.sort !== undefined && opts.sort !== '') body.sort = parseInt(opts.sort, 10);
740
741
  if (opts.labels !== undefined) body.labels = opts.labels.split(',').map(l => l.trim()).filter(Boolean);
742
+ if (opts.operatedBy) body.operated_by = opts.operatedBy;
741
743
  const payload = await apiRequest('PATCH', `/livedocs/${shortId}/tasks/${taskId}`, body, apiKey, apiBase, timeoutMs);
742
744
  if (opts.json) { console.log(JSON.stringify(payload, null, 2)); return 0; }
743
745
  process.stdout.write('Task updated!\n\n');
@@ -808,7 +810,9 @@ export async function createTaskComment(shortId, taskId, opts = {}) {
808
810
  const spinnerId = startSpinner('Adding comment');
809
811
 
810
812
  try {
811
- const payload = await apiRequest('POST', `/livedocs/${shortId}/tasks/${taskId}/comments`, { content: opts.content }, apiKey, apiBase, timeoutMs);
813
+ const body = { content: opts.content };
814
+ if (opts.operatedBy) body.operated_by = opts.operatedBy;
815
+ const payload = await apiRequest('POST', `/livedocs/${shortId}/tasks/${taskId}/comments`, body, apiKey, apiBase, timeoutMs);
812
816
  if (opts.json) { console.log(JSON.stringify(payload, null, 2)); return 0; }
813
817
  process.stdout.write('Comment added.\n');
814
818
  process.stdout.write(formatTaskRecord(payload?.data));