codeep 2.3.0 → 2.3.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/README.md CHANGED
@@ -257,7 +257,7 @@ Commands:
257
257
  - `/me learn project` — one-off learn scoped to this repo
258
258
  - `/me forget` — clear the auto-learned profile(s)
259
259
 
260
- Sync your global profile across machines (and edit it on the web) from the [dashboard](https://codeep.dev/dashboard) with `codeep account sync`. In VS Code: **Codeep: Edit Profile** and **Codeep: Toggle Profile Auto-Learn**.
260
+ Sync your global profile across machines (and edit it on the web) from the [dashboard](https://codeep.dev/dashboard): `/me sync` (or `codeep account sync`, which now carries the profile too). In VS Code: **Codeep: Edit Profile**, **Codeep: Toggle Profile Auto-Learn**, **Codeep: Sync Profile to Dashboard**.
261
261
 
262
262
  ### Sub-agents (delegation)
263
263
  The agent can delegate a self-contained sub-task to a specialist **sub-agent** that runs in its own fresh context window and returns only a summary — keeping the main context small and letting each sub-task run with a tuned persona and scoped tools.
@@ -697,6 +697,22 @@ Anything else the agent should know — edge cases, gotchas, things to double-ch
697
697
  ? 'Cleared the auto-learned profile(s).'
698
698
  : 'No learned profile to clear.' };
699
699
  }
700
+ if (sub === 'sync') {
701
+ const { getSyncToken } = await import('../config/index.js');
702
+ if (!getSyncToken())
703
+ return { handled: true, response: 'Not linked to codeep.dev. Run `codeep account` in a terminal first.' };
704
+ const { pushUserProfile, pullUserProfile } = await import('../utils/codeepCloud.js');
705
+ const pushed = await pushUserProfile();
706
+ const pulled = await pullUserProfile();
707
+ const lines = [];
708
+ if (pushed)
709
+ lines.push('✓ Profile pushed to the dashboard');
710
+ if (pulled === 1)
711
+ lines.push('✓ Profile pulled to this machine');
712
+ if (lines.length === 0)
713
+ lines.push('Nothing to sync yet — run `/me init` and fill in your profile first.');
714
+ return { handled: true, response: lines.join('\n') };
715
+ }
700
716
  return { handled: true, response: formatProfileView(session.workspaceRoot) };
701
717
  }
702
718
  case 'insights': {
@@ -58,7 +58,7 @@ const AVAILABLE_COMMANDS = [
58
58
  { name: 'go', description: 'Execute the pending plan from /plan' },
59
59
  // Personalities + insights (2.0.3)
60
60
  { name: 'personality', description: 'List or switch agent tone preset', input: { hint: '[name | off]' } },
61
- { name: 'me', description: 'Your user profile — adapts the agent to you (reply language, style, stack)', input: { hint: '[init [project] | on | off | learn [on|off|project] | forget]' } },
61
+ { name: 'me', description: 'Your user profile — adapts the agent to you (reply language, style, stack)', input: { hint: '[init [project] | on | off | learn [on|off|project] | forget | sync]' } },
62
62
  { name: 'agents', description: 'List sub-agents the agent can delegate self-contained tasks to' },
63
63
  { name: 'insights', description: 'Activity summary over the last N days (default 7)', input: { hint: '[--days N]' } },
64
64
  // Project intelligence
@@ -94,7 +94,7 @@ const COMMAND_DESCRIPTIONS = {
94
94
  'plan': 'Generate a numbered plan for a task — review before /go executes it',
95
95
  'go': 'Execute the pending plan from /plan',
96
96
  'personality': 'Switch agent tone: concise / verbose / security / senior-reviewer / etc',
97
- 'me': 'Your user profile (reply language, style, stack) — adapts the agent to you. /me init, /me learn',
97
+ 'me': 'Your user profile (reply language, style, stack) — adapts the agent to you. /me init, /me learn, /me sync',
98
98
  'agents': 'List sub-agents the agent can delegate self-contained tasks to (researcher / reviewer / tester / custom)',
99
99
  'insights': 'Activity summary over the last N days (default 7): runs, files, tools, projects',
100
100
  'recall': 'Search across ALL saved sessions (cross-session; /search is current-session only)',
@@ -375,6 +375,26 @@ export async function handleCommand(command, args, ctx) {
375
375
  : 'No learned profile to clear.');
376
376
  break;
377
377
  }
378
+ if (sub === 'sync') {
379
+ const { getSyncToken } = await import('../config/index.js');
380
+ if (!getSyncToken()) {
381
+ ctx.app.notify('Not linked to codeep.dev. Run: codeep account');
382
+ break;
383
+ }
384
+ const { pushUserProfile, pullUserProfile } = await import('../utils/codeepCloud.js');
385
+ ctx.app.notify('Syncing your profile with codeep.dev…');
386
+ const pushed = await pushUserProfile();
387
+ const pulled = await pullUserProfile();
388
+ const lines = [];
389
+ if (pushed)
390
+ lines.push('✓ Profile pushed to the dashboard');
391
+ if (pulled === 1)
392
+ lines.push('✓ Profile pulled to this machine');
393
+ if (lines.length === 0)
394
+ lines.push('Nothing to sync yet — run `/me init` and fill in your profile first.');
395
+ ctx.app.addMessage({ role: 'system', content: `## Profile sync\n\n${lines.join('\n')}` });
396
+ break;
397
+ }
378
398
  if (sub === 'init') {
379
399
  const scope = args[1]?.toLowerCase() === 'project' ? 'project' : 'global';
380
400
  if (scope === 'project' && !ctx.projectPath) {
@@ -131,6 +131,7 @@ export const helpCategories = [
131
131
  { key: '/me', description: 'Your user profile (reply language, style, stack) — adapts the agent to you' },
132
132
  { key: '/me init [project]', description: 'Scaffold a profile template (global, or for this project). /me off to disable' },
133
133
  { key: '/me learn [on|off]', description: 'Learn durable prefs from this session now; on/off toggles auto-learn. /me forget clears it' },
134
+ { key: '/me sync', description: 'Push your profile to the codeep.dev dashboard (and pull on a fresh machine)' },
134
135
  { key: '/agents', description: 'List sub-agents the agent can delegate to (researcher / reviewer / tester / your own)' },
135
136
  { key: '/insights [--days N]', description: 'Activity summary — runs, files, tools, projects over the last N days (default 7)' },
136
137
  ],
@@ -386,8 +386,8 @@ Codeep - AI-powered coding assistant TUI
386
386
  Usage:
387
387
  codeep Start interactive chat
388
388
  codeep account Link CLI to your codeep.dev dashboard
389
- codeep account sync Pull keys + personalities + commands from codeep.dev
390
- codeep account push Push local keys + personalities + commands to codeep.dev
389
+ codeep account sync Pull keys + personalities + commands + profile from codeep.dev
390
+ codeep account push Push local keys + personalities + commands + profile to codeep.dev
391
391
  codeep acp Start ACP server (for Zed editor integration)
392
392
  codeep --version Show version
393
393
  codeep --help Show this help
@@ -427,9 +427,9 @@ Commands (in chat):
427
427
  }
428
428
  console.log(` synced ${count} key${count !== 1 ? 's' : ''}.`);
429
429
  }
430
- // Also pull portable personal config — personalities + custom
431
- // commands. Additive merge (never clobbers local files).
432
- const { pullPersonalities, pullCommands } = await import('../utils/codeepCloud.js');
430
+ // Also pull portable personal config — personalities + custom commands +
431
+ // the user profile. Additive merge (never clobbers local files).
432
+ const { pullPersonalities, pullCommands, pullUserProfile } = await import('../utils/codeepCloud.js');
433
433
  const pCount = await pullPersonalities();
434
434
  if (typeof pCount === 'number' && pCount > 0) {
435
435
  console.log(` Pulled ${pCount} personalit${pCount === 1 ? 'y' : 'ies'}.`);
@@ -438,6 +438,10 @@ Commands (in chat):
438
438
  if (typeof cCount === 'number' && cCount > 0) {
439
439
  console.log(` Pulled ${cCount} custom command${cCount === 1 ? '' : 's'}.`);
440
440
  }
441
+ const profPulled = await pullUserProfile();
442
+ if (profPulled === 1) {
443
+ console.log(' Pulled your profile (about you).');
444
+ }
441
445
  console.log('');
442
446
  process.exit(0);
443
447
  }
@@ -465,8 +469,8 @@ Commands (in chat):
465
469
  process.stdout.write(` Pushing ${count} key${count !== 1 ? 's' : ''} to codeep.dev...`);
466
470
  const ok = await pushKeys(keys);
467
471
  console.log(ok ? ' done.' : ' failed.');
468
- // Also push portable personal config.
469
- const { pushPersonalities, pushCommands } = await import('../utils/codeepCloud.js');
472
+ // Also push portable personal config — personalities + commands + profile.
473
+ const { pushPersonalities, pushCommands, pushUserProfile } = await import('../utils/codeepCloud.js');
470
474
  const pCount = await pushPersonalities();
471
475
  if (typeof pCount === 'number' && pCount > 0) {
472
476
  console.log(` Pushed ${pCount} personalit${pCount === 1 ? 'y' : 'ies'}.`);
@@ -475,6 +479,9 @@ Commands (in chat):
475
479
  if (typeof cCount === 'number' && cCount > 0) {
476
480
  console.log(` Pushed ${cCount} custom command${cCount === 1 ? '' : 's'}.`);
477
481
  }
482
+ if (await pushUserProfile()) {
483
+ console.log(' Pushed your profile (about you).');
484
+ }
478
485
  console.log('');
479
486
  process.exit(ok ? 0 : 1);
480
487
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeep",
3
- "version": "2.3.0",
3
+ "version": "2.3.1",
4
4
  "description": "AI-powered coding assistant built for the terminal. Multiple LLM providers, project-aware context, and a seamless development workflow.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",