taskmonkey-cli 0.9.1 → 0.10.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taskmonkey-cli",
3
- "version": "0.9.1",
3
+ "version": "0.10.1",
4
4
  "description": "TaskMonkey CLI — Remote dev tools for tenant config editing and tool testing",
5
5
  "bin": {
6
6
  "tm": "./bin/tm.js",
@@ -36,27 +36,41 @@ export async function pull() {
36
36
  written++;
37
37
  }
38
38
 
39
- // Write docs if available
39
+ // Write docs if available. The server returns relative paths that may
40
+ // contain subdirectories (e.g. cms/contao.md), so we need to mkdir -p
41
+ // the dirname of each full target path, not just the top-level folder.
40
42
  if (docs?.files) {
41
43
  for (const [name, content] of Object.entries(docs.files)) {
42
- // shared/ files go to shared/, docs go to docs/
43
- const targetDir = name.startsWith('shared/')
44
+ // shared/ files go to shared/, everything else to docs/
45
+ const isShared = name.startsWith('shared/');
46
+ const baseDir = isShared
44
47
  ? join(config._configDir, 'shared')
45
48
  : join(config._configDir, 'docs');
46
- const fileName = name.startsWith('shared/') ? name.substring(7) : name;
47
- mkdirSync(targetDir, { recursive: true });
48
- writeFileSync(join(targetDir, fileName), content);
49
- console.log(chalk.gray(` ${name.startsWith('shared/') ? 'shared' : 'docs'}/${fileName}`));
49
+ const relName = isShared ? name.substring(7) : name;
50
+ const fullPath = join(baseDir, relName);
51
+ mkdirSync(dirname(fullPath), { recursive: true });
52
+ writeFileSync(fullPath, content);
53
+ console.log(chalk.gray(` ${isShared ? 'shared' : 'docs'}/${relName}`));
50
54
  written++;
51
55
  }
52
56
  }
53
57
 
54
- // Create CLAUDE.md if it doesn't exist
58
+ // Create CLAUDE.md if it doesn't exist, otherwise append missing notice blocks.
59
+ // Each block is identified by a marker line so we never duplicate content.
55
60
  const claudeMdPath = join(config._configDir, 'CLAUDE.md');
56
61
  if (!existsSync(claudeMdPath)) {
57
62
  writeFileSync(claudeMdPath, generateClaudeMd(config.tenant));
58
63
  console.log(chalk.cyan(` CLAUDE.md (created)`));
59
64
  written++;
65
+ } else {
66
+ const existing = readFileSync(claudeMdPath, 'utf8');
67
+ const cmsMarker = '<!-- tm:cms-docs-notice -->';
68
+ if (!existing.includes(cmsMarker)) {
69
+ const block = `\n\n${cmsMarker}\n## CMS-Wissen (Datenbank)\n\nIm Ordner \`docs/cms/\` liegen Wissens-Dokumentationen für die wichtigsten CMS:\n\n- \`contao.md\` — Contao 4.x/5.x (vollständig)\n- \`wordpress.md\` — WordPress (Core, vollständig)\n- \`typo3.md\`, \`drupal.md\`, \`joomla.md\` — Stubs\n\nWenn dein Tenant eines dieser CMS einsetzt, lies die passende Datei und kopiere die nötigen Tabellen-/Pattern-Sektionen direkt in das System-Prompt oder den passenden Monkey-Task-Prompt. Die Dateien werden **nicht** automatisch geladen.\n`;
70
+ writeFileSync(claudeMdPath, existing + block);
71
+ console.log(chalk.cyan(` CLAUDE.md (updated: cms-docs notice)`));
72
+ written++;
73
+ }
60
74
  }
61
75
 
62
76
  // Create AGENTS.md (for Codex, Copilot, etc.) if it doesn't exist
@@ -418,24 +432,32 @@ Key konvertieren: \`ssh-keygen -p -m PEM -P "passphrase" -N "" -f key\`
418
432
 
419
433
  Siehe \`docs/DatabaseGateway.md\` für Troubleshooting und vollständige Feld-Referenz.
420
434
 
421
- ## Shared Prompts (CMS-Wissen)
435
+ ## CMS-Wissen (Datenbank)
422
436
 
423
- Im \`shared/\` Ordner liegen vorgefertigte Prompt-Fragmente mit CMS-Wissen (Tabellenstrukturen, Serialisierungsformate etc.).
437
+ Im Ordner \`docs/cms/\` liegen Wissens-Dokumentationen für die wichtigsten CMS:
424
438
 
425
- Einbinden im Task-Prompt per PHP:
426
- \`\`\`php
427
- 'monkey_tasks.website.prompt' => file_get_contents(__DIR__ . '/../../_shared/tools/database/prompts_contao.php')
428
- . <<<'PROMPT'
429
- Zusätzliche Anweisungen für diesen spezifischen Task...
430
- PROMPT,
431
- \`\`\`
439
+ - \`contao.md\` Contao 4.x/5.x (vollständig)
440
+ - \`wordpress.md\` — WordPress (Core, vollständig)
441
+ - \`typo3.md\` Stub
442
+ - \`drupal.md\` — Stub
443
+ - \`joomla.md\` Stub
444
+
445
+ **Wenn dein Tenant eines dieser CMS einsetzt:**
432
446
 
433
- Oder den Inhalt aus \`shared/prompts_contao.php\` manuell in den Prompt kopieren.
447
+ 1. Lies die passende \`docs/cms/<cms>.md\` Datei
448
+ 2. Identifiziere die Tabellen, Felder und Patterns, die der konkrete Use-Case braucht
449
+ 3. **Kopiere die nötigen Abschnitte direkt in das Tenant-Prompt** —
450
+ meist nach \`prompts/system.php\` oder \`monkey_tasks/<task>.prompt\`
451
+ 4. Kürze: nicht alle Tabellen müssen rein, nur was wirklich gebraucht wird
434
452
 
435
- Verfügbare Shared Prompts (nach \`tm pull\` in \`shared/\`):
436
- - \`prompts_contao.php\` Contao 4.x Tabellenstrukturen (tl_page, tl_article, tl_content, tl_news, tl_calendar_events, tl_files) + PHP-Serialisierung
453
+ Die Dateien werden **nicht** automatisch in den Prompt geladen. Sie sind reine
454
+ Dokudu entscheidest, was für deinen Tenant relevant ist.
437
455
 
438
- Siehe \`docs/DatabaseGateway.md\` für die vollständige Dokumentation inkl. SQL-Beispiele und CMS-Tabellen.
456
+ > **Niemals raten**: Wenn du einen Stub ergänzt, hole dir das Schema aus einer
457
+ > echten Installation (\`SHOW CREATE TABLE\`) und teste alle SQL-Patterns gegen
458
+ > eine reale Datenbank.
459
+
460
+ Siehe \`docs/DatabaseGateway.md\` für die Database-Gateway-Dokumentation.
439
461
 
440
462
  ## Conversation Tests
441
463
 
@@ -469,6 +491,26 @@ Optimieren: \`tm optimize-prompt\`
469
491
  - Handler-Signatur: \`function(array \\$results, array \\$args, array \\$ctx): array\`
470
492
  - Immer \`['success' => true/false]\` im Return-Array
471
493
  - \`\\$ctx['tool']('name', \\$args)\` für verschachtelte Tool-Aufrufe
494
+
495
+ ## SICHERHEITSREGELN FÜR HANDLER-CODE
496
+
497
+ Handler-Code wird auf dem Server validiert. Folgende Funktionen sind **VERBOTEN**:
498
+
499
+ **Shell/Code-Ausführung:** \`shell_exec\`, \`exec\`, \`system\`, \`passthru\`, \`eval\`, \`assert\`
500
+ **Dateisystem direkt:** \`file_get_contents\`, \`file_put_contents\`, \`fopen\`, \`unlink\`, \`glob\`, \`scandir\`
501
+ **Netzwerk direkt:** \`curl_init\`, \`fsockopen\`, \`new Cake\\Http\\Client\`
502
+ **Includes:** \`include\`, \`require\`, \`include_once\`, \`require_once\`
503
+ **Datenbank direkt:** \`new PDO\`, \`new mysqli\`, \`Configure::read('Tenants.')\`
504
+ **Backticks:** \\\`command\\\`
505
+
506
+ **Stattdessen nutzen:**
507
+ - \`\\$ctx['tool']('toolName', \\$args)\` — für API-Calls, DB-Zugriff, alles externe
508
+ - \`\\$ctx['tmp_path']\` — für temporäre Dateien (tenant-isoliert)
509
+ - \`\\$ctx['log_path']\` — für Log-Dateien (tenant-isoliert)
510
+ - \`\\$ctx['tool']('logMessage', ['message' => '...'])\` — zum Loggen/Debuggen
511
+
512
+ **Warum?** Jeder Handler läuft im Server-Kontext. Direkter Dateizugriff könnte andere Tenants lesen.
513
+ Alle externen Operationen MÜSSEN über \`\\$ctx['tool']()\` laufen — das ist tenant-isoliert und geloggt.
472
514
  `;
473
515
  }
474
516
 
package/.tmrc DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "server": "https://gpt.meco-media.com",
3
- "tenant": "bloomify",
4
- "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJtZWNvZ3B0Iiwic3ViIjoiYzAyZWYyMjItMDU1MC00OTgwLTg0ODYtNzIzOTJmZDI2ZjY5IiwiZW1haWwiOiJtYXJjdXMuZ29lZGVAbWVjby1tZWRpYS5jb20iLCJyb2xlIjoiYWRtaW4iLCJpYXQiOjE3NzUxNTY4NDksImV4cCI6MTc3NTI0MzI0OX0.bpfHNBOuq1un8Psc89Xevn-Ibo4YVAYNNwDRYe6fb4A",
5
- "refresh_token": "5c9eb7bacec249d2aacb57402f3f5fedee2faf2796d721be6c02970653e9186b",
6
- "tenant_path": "."
7
- }