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.
- package/README.md +20 -14
- package/package.json +1 -1
- 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
|
|
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
|
|
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
|
|
39
|
-
takomi
|
|
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
|
|
177
|
-
| `takomi
|
|
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
|
|
180
|
-
| `takomi
|
|
181
|
-
|
|
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
|
|
196
|
+
pnpm dlx takomi status
|
|
191
197
|
|
|
192
|
-
#
|
|
193
|
-
pnpm dlx takomi
|
|
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.
|
|
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
|
-
|
|
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('
|
|
831
|
+
.description('Legacy alias: use "takomi setup project"')
|
|
690
832
|
.action(init);
|
|
691
833
|
|
|
692
|
-
// Global installer (
|
|
834
|
+
// Global installer (legacy alias)
|
|
693
835
|
program
|
|
694
836
|
.command('install [target]')
|
|
695
|
-
.description('
|
|
696
|
-
.action(
|
|
837
|
+
.description('Legacy alias: use "takomi setup [target]"')
|
|
838
|
+
.action(setup);
|
|
697
839
|
|
|
698
|
-
// Re-sync (
|
|
840
|
+
// Re-sync (legacy alias)
|
|
699
841
|
program
|
|
700
842
|
.command('sync [target]')
|
|
701
|
-
.description('
|
|
702
|
-
.action(
|
|
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('
|
|
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('
|
|
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 (
|
|
873
|
+
// Update from GitHub (legacy alias)
|
|
734
874
|
program
|
|
735
875
|
.command('update')
|
|
736
|
-
.description('
|
|
737
|
-
.action(
|
|
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());
|