takomi 2.1.16 → 2.1.17

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.
Files changed (3) hide show
  1. package/README.md +20 -14
  2. package/package.json +1 -1
  3. package/src/cli.js +157 -80
package/README.md CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  ```bash
22
22
  npm install -g takomi
23
- takomi install pi
23
+ takomi setup pi
24
24
  cd my-project
25
25
  takomi
26
26
  ```
@@ -28,19 +28,21 @@ takomi
28
28
  Optional global skills:
29
29
 
30
30
  ```bash
31
- takomi install skills
31
+ takomi setup skills
32
32
  ```
33
33
 
34
34
  Useful management commands:
35
35
 
36
36
  ```bash
37
+ takomi refresh # one-command update: Takomi + Pi/assets/skills
38
+ takomi status
37
39
  takomi doctor
38
- takomi sync pi # refreshes Takomi Pi assets and runs pi update for Pi-managed packages
39
- takomi sync skills
40
- takomi install all
41
- takomi init
40
+ takomi setup all
41
+ takomi setup project
42
42
  ```
43
43
 
44
+ Legacy commands like `takomi install pi`, `takomi sync pi`, `takomi upgrade`, and `takomi init` still work, but the simpler mental model is: **setup once, refresh when stale, run `takomi` to use it.**
45
+
44
46
  ### Context Manager
45
47
 
46
48
  Takomi now ships a Pi-native `takomi-context-manager` extension. It reduces prompt bloat with progressive context loading:
@@ -173,12 +175,16 @@ Takomi v2.0 introduces the **Global Skills Router** — install skills once, and
173
175
 
174
176
  | Command | What It Does |
175
177
  |---|---|
176
- | `takomi install` | One-time setup detects your IDEs, creates your toolkit, syncs everything |
177
- | `takomi sync` | Push updates from `~/.takomi/` to all linked harnesses |
178
+ | `takomi` | Launch Takomi in the current project |
179
+ | `takomi setup` | One-time guided setup detects IDEs, creates your toolkit, syncs everything |
180
+ | `takomi setup pi\|skills\|project\|all` | Targeted setup without memorizing installer internals |
181
+ | `takomi refresh` | One-command update for Takomi CLI, Pi/assets, and skills |
182
+ | `takomi refresh pi\|skills\|project\|all` | Targeted refresh when you need it |
178
183
  | `takomi add <url>` | Pull skills from any GitHub repo into your global store |
179
- | `takomi harnesses` | See what's connected and your toolkit status |
180
- | `takomi init` | Project-specific setup (works alongside global) |
181
- | `takomi update` | Refresh resources from GitHub (global store supported) |
184
+ | `takomi status` | See what's connected and your toolkit status |
185
+ | `takomi doctor` | Run detailed diagnostics |
186
+
187
+ Legacy aliases remain supported: `install` → `setup`, `sync`/`upgrade` → `refresh`, `init` → `setup project`, `harnesses` → `status`, `update` → `refresh project`.
182
188
 
183
189
  ### Example: Add Remote Skills
184
190
 
@@ -187,10 +193,10 @@ Takomi v2.0 introduces the **Global Skills Router** — install skills once, and
187
193
  pnpm dlx takomi add https://github.com/JStaRFilms/VibeCode-Protocol-Suite
188
194
 
189
195
  # See what's connected
190
- pnpm dlx takomi harnesses
196
+ pnpm dlx takomi status
191
197
 
192
- # Push updates everywhere
193
- pnpm dlx takomi sync
198
+ # Refresh everything
199
+ pnpm dlx takomi refresh
194
200
  ```
195
201
 
196
202
  ### KiloCode YAML Auto-Sync
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "takomi",
3
- "version": "2.1.16",
3
+ "version": "2.1.17",
4
4
  "description": "🎯 Stop wrestling with AI. Start building with purpose. The artisan's toolkit for agent workflows, Codex skills, and original Takomi capabilities like 21st.dev integration.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/cli.js CHANGED
@@ -307,6 +307,58 @@ async function syncAllTargets() {
307
307
  await syncSkillsTarget();
308
308
  }
309
309
 
310
+ async function setup(target) {
311
+ await install(target);
312
+ }
313
+
314
+ async function refresh(target = 'all') {
315
+ const normalizedTarget = target || 'all';
316
+
317
+ if (normalizedTarget === 'project') {
318
+ await updateProjectResources();
319
+ return;
320
+ }
321
+
322
+ await upgrade(normalizedTarget);
323
+ }
324
+
325
+ async function upgrade(target = 'all') {
326
+ const normalizedTarget = target || 'all';
327
+ const supportedTargets = new Set(['all', 'pi', 'skills', 'cli']);
328
+
329
+ if (!supportedTargets.has(normalizedTarget)) {
330
+ console.log(pc.yellow(`Unsupported upgrade target: ${normalizedTarget}`));
331
+ console.log(pc.dim('Supported targets: all, cli, pi, skills'));
332
+ console.log(pc.dim('Use plain "takomi upgrade" for the one-command upgrade path.\n'));
333
+ return;
334
+ }
335
+
336
+ console.log(pc.magenta('⬆ Takomi One-Command Upgrade\n'));
337
+
338
+ const upgradeExitCode = upgradeTakomiPackage();
339
+ if (upgradeExitCode !== 0) {
340
+ process.exitCode = upgradeExitCode;
341
+ return;
342
+ }
343
+
344
+ if (normalizedTarget === 'cli') {
345
+ return;
346
+ }
347
+
348
+ if (normalizedTarget === 'pi') {
349
+ await installPiTarget();
350
+ return;
351
+ }
352
+
353
+ if (normalizedTarget === 'skills') {
354
+ await installSkillsTarget();
355
+ return;
356
+ }
357
+
358
+ await installAllTargets();
359
+ console.log(pc.magenta('\n✨ Fully upgraded. Next: run `takomi` from your project.\n'));
360
+ }
361
+
310
362
  function printUnsupportedInstallTarget(target) {
311
363
  console.log(pc.yellow(`Unsupported install target: ${target}`));
312
364
  console.log(pc.dim('Supported targets right now: pi, skills, all'));
@@ -674,6 +726,75 @@ async function harnesses() {
674
726
  }
675
727
  }
676
728
 
729
+ async function status() {
730
+ await harnesses();
731
+ }
732
+
733
+ async function updateProjectResources() {
734
+ console.log(pc.magenta('📡 Updating your toolkit from GitHub...\n'));
735
+
736
+ const storeExists = await isStoreInitialized();
737
+
738
+ const response = await prompts([
739
+ {
740
+ type: 'multiselect',
741
+ name: 'components',
742
+ message: 'What components do you want to update from GitHub?',
743
+ choices: [
744
+ { title: '.agent (Workflows & Skills)', value: 'agent', selected: true },
745
+ { title: 'Agent YAMLs', value: 'yamls' },
746
+ { title: 'Legacy Protocols', value: 'legacy' },
747
+ ...(storeExists ? [{ title: 'Global Store', value: 'global', description: 'Update ~/.takomi/' }] : []),
748
+ ],
749
+ hint: '- Space to select. Return to submit'
750
+ }
751
+ ]);
752
+
753
+ if (!response.components || response.components.length === 0) return;
754
+
755
+ const destRoot = process.cwd();
756
+
757
+ if (response.components.includes('agent')) {
758
+ const agentDest = path.join(destRoot, '.agent');
759
+ await updateWorkflows(path.join(agentDest, 'workflows'));
760
+ await updateSkills(path.join(agentDest, 'skills'));
761
+ }
762
+
763
+ if (response.components.includes('yamls')) {
764
+ await updateAgentYamls(path.join(destRoot, 'Takomi-Agents'));
765
+ }
766
+
767
+ if (response.components.includes('legacy')) {
768
+ await updateLegacyManual(path.join(destRoot, 'Legacy-Protocols'));
769
+ }
770
+
771
+ // Update global store if selected
772
+ if (response.components.includes('global')) {
773
+ console.log(pc.cyan('\n📡 Updating global store from package assets...\n'));
774
+ const skills = await populateSkills('all');
775
+ const workflows = await populateWorkflows('all');
776
+ const yamls = await populateAgentYamls();
777
+ console.log(pc.green(` ✔ ${skills.length} skills, ${workflows.length} workflows, ${yamls.length} YAMLs updated`));
778
+
779
+ // Auto-sync to linked harnesses
780
+ const manifest = await getManifest();
781
+ if (manifest.linkedHarnesses.length > 0) {
782
+ const detected = detectHarnesses();
783
+ const linked = detected.filter(h => manifest.linkedHarnesses.includes(h.id));
784
+ if (linked.length > 0) {
785
+ console.log(pc.cyan('\n📡 Auto-syncing to linked harnesses...\n'));
786
+ await syncToAllHarnesses(linked, STORE_PATH);
787
+ }
788
+ }
789
+
790
+ manifest.installed.skills = await getStoreSkills();
791
+ manifest.installed.workflows = await getStoreWorkflows();
792
+ await writeManifest(manifest);
793
+ }
794
+
795
+ console.log(pc.magenta('\n✨ Your toolkit is fresh and ready to ship.'));
796
+ }
797
+
677
798
  // ─────────────────────────────────────────────────────────────────────────────
678
799
  // Command Registration
679
800
  // ─────────────────────────────────────────────────────────────────────────────
@@ -683,23 +804,44 @@ program
683
804
  .description('Your AI team. Activated. 🎯')
684
805
  .version(packageJson.version);
685
806
 
686
- // Per-project setup (backward compatible)
807
+ program
808
+ .command('setup [target]')
809
+ .description('Set up Takomi: guided setup, or setup pi|skills|project|all')
810
+ .action(async (target) => {
811
+ if (target === 'project') {
812
+ await init();
813
+ return;
814
+ }
815
+ await setup(target);
816
+ });
817
+
818
+ program
819
+ .command('refresh [target]')
820
+ .description('One-command refresh: update Takomi plus Pi/assets/skills, or refresh pi|skills|project|all')
821
+ .action(refresh);
822
+
823
+ program
824
+ .command('status')
825
+ .description('Show connected IDEs and Takomi toolkit status')
826
+ .action(status);
827
+
828
+ // Per-project setup (legacy alias)
687
829
  program
688
830
  .command('init')
689
- .description('Drop Takomi into this project')
831
+ .description('Legacy alias: use "takomi setup project"')
690
832
  .action(init);
691
833
 
692
- // Global installer (NEW)
834
+ // Global installer (legacy alias)
693
835
  program
694
836
  .command('install [target]')
695
- .description('Build your global command center or run a target-specific installer')
696
- .action(install);
837
+ .description('Legacy alias: use "takomi setup [target]"')
838
+ .action(setup);
697
839
 
698
- // Re-sync (NEW)
840
+ // Re-sync (legacy alias)
699
841
  program
700
842
  .command('sync [target]')
701
- .description('Push updates to all connected IDEs or sync a target-specific install')
702
- .action(sync);
843
+ .description('Legacy alias: use "takomi refresh [target]"')
844
+ .action(refresh);
703
845
 
704
846
  // Add remote skills (NEW)
705
847
  program
@@ -710,7 +852,7 @@ program
710
852
  // Show harness status (NEW)
711
853
  program
712
854
  .command('harnesses')
713
- .description('See your toolkit status and connected IDEs')
855
+ .description('Legacy alias: use "takomi status"')
714
856
  .action(harnesses);
715
857
 
716
858
  program
@@ -724,80 +866,15 @@ program
724
866
  .action(() => printTakomiUpdateStatus(program.version()));
725
867
 
726
868
  program
727
- .command('upgrade')
728
- .description('Manually update the global Takomi CLI package from npm')
729
- .action(() => {
730
- process.exitCode = upgradeTakomiPackage();
731
- });
869
+ .command('upgrade [target]')
870
+ .description('Legacy alias: use "takomi refresh [target]"')
871
+ .action(refresh);
732
872
 
733
- // Update from GitHub (EXISTING — enhanced)
873
+ // Update from GitHub (legacy alias)
734
874
  program
735
875
  .command('update')
736
- .description('Pull fresh resources from GitHub')
737
- .action(async () => {
738
- console.log(pc.magenta('📡 Updating your toolkit from GitHub...\n'));
739
-
740
- const storeExists = await isStoreInitialized();
741
-
742
- const response = await prompts([
743
- {
744
- type: 'multiselect',
745
- name: 'components',
746
- message: 'What components do you want to update from GitHub?',
747
- choices: [
748
- { title: '.agent (Workflows & Skills)', value: 'agent', selected: true },
749
- { title: 'Agent YAMLs', value: 'yamls' },
750
- { title: 'Legacy Protocols', value: 'legacy' },
751
- ...(storeExists ? [{ title: 'Global Store', value: 'global', description: 'Update ~/.takomi/' }] : []),
752
- ],
753
- hint: '- Space to select. Return to submit'
754
- }
755
- ]);
756
-
757
- if (!response.components || response.components.length === 0) return;
758
-
759
- const destRoot = process.cwd();
760
-
761
- if (response.components.includes('agent')) {
762
- const agentDest = path.join(destRoot, '.agent');
763
- await updateWorkflows(path.join(agentDest, 'workflows'));
764
- await updateSkills(path.join(agentDest, 'skills'));
765
- }
766
-
767
- if (response.components.includes('yamls')) {
768
- await updateAgentYamls(path.join(destRoot, 'Takomi-Agents'));
769
- }
770
-
771
- if (response.components.includes('legacy')) {
772
- await updateLegacyManual(path.join(destRoot, 'Legacy-Protocols'));
773
- }
774
-
775
- // Update global store if selected
776
- if (response.components.includes('global')) {
777
- console.log(pc.cyan('\n📡 Updating global store from package assets...\n'));
778
- const skills = await populateSkills('all');
779
- const workflows = await populateWorkflows('all');
780
- const yamls = await populateAgentYamls();
781
- console.log(pc.green(` ✔ ${skills.length} skills, ${workflows.length} workflows, ${yamls.length} YAMLs updated`));
782
-
783
- // Auto-sync to linked harnesses
784
- const manifest = await getManifest();
785
- if (manifest.linkedHarnesses.length > 0) {
786
- const detected = detectHarnesses();
787
- const linked = detected.filter(h => manifest.linkedHarnesses.includes(h.id));
788
- if (linked.length > 0) {
789
- console.log(pc.cyan('\n📡 Auto-syncing to linked harnesses...\n'));
790
- await syncToAllHarnesses(linked, STORE_PATH);
791
- }
792
- }
793
-
794
- manifest.installed.skills = await getStoreSkills();
795
- manifest.installed.workflows = await getStoreWorkflows();
796
- await writeManifest(manifest);
797
- }
798
-
799
- console.log(pc.magenta('\n✨ Your toolkit is fresh and ready to ship.'));
800
- });
876
+ .description('Legacy alias: use "takomi refresh project"')
877
+ .action(updateProjectResources);
801
878
 
802
879
  if (process.argv.length <= 2) {
803
880
  notifyIfTakomiUpdateAvailable(program.version());