conectese 0.1.14
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 +265 -0
- package/_conectese/.conectese-version +1 -0
- package/_conectese/config/playwright.config.json +11 -0
- package/_conectese/core/architect.agent.yaml +110 -0
- package/_conectese/core/best-practices/_catalog.yaml +116 -0
- package/_conectese/core/best-practices/blog-post.md +132 -0
- package/_conectese/core/best-practices/blog-seo.md +127 -0
- package/_conectese/core/best-practices/copywriting.md +426 -0
- package/_conectese/core/best-practices/data-analysis.md +401 -0
- package/_conectese/core/best-practices/email-newsletter.md +118 -0
- package/_conectese/core/best-practices/email-sales.md +110 -0
- package/_conectese/core/best-practices/image-design.md +348 -0
- package/_conectese/core/best-practices/instagram-feed.md +235 -0
- package/_conectese/core/best-practices/instagram-reels.md +112 -0
- package/_conectese/core/best-practices/instagram-stories.md +107 -0
- package/_conectese/core/best-practices/linkedin-article.md +116 -0
- package/_conectese/core/best-practices/linkedin-post.md +121 -0
- package/_conectese/core/best-practices/researching.md +349 -0
- package/_conectese/core/best-practices/review.md +269 -0
- package/_conectese/core/best-practices/social-networks-publishing.md +294 -0
- package/_conectese/core/best-practices/strategist.md +344 -0
- package/_conectese/core/best-practices/technical-writing.md +365 -0
- package/_conectese/core/best-practices/twitter-post.md +105 -0
- package/_conectese/core/best-practices/twitter-thread.md +122 -0
- package/_conectese/core/best-practices/whatsapp-broadcast.md +107 -0
- package/_conectese/core/best-practices/youtube-script.md +122 -0
- package/_conectese/core/best-practices/youtube-shorts.md +112 -0
- package/_conectese/core/prompts/build.prompt.md +547 -0
- package/_conectese/core/prompts/design.prompt.md +469 -0
- package/_conectese/core/prompts/discovery.prompt.md +269 -0
- package/_conectese/core/prompts/sherlock-instagram.md +123 -0
- package/_conectese/core/prompts/sherlock-linkedin.md +73 -0
- package/_conectese/core/prompts/sherlock-shared.md +684 -0
- package/_conectese/core/prompts/sherlock-twitter.md +78 -0
- package/_conectese/core/prompts/sherlock-youtube.md +85 -0
- package/_conectese/core/runner.pipeline.md +535 -0
- package/_conectese/core/skills.engine.md +381 -0
- package/agents/data-extractor/AGENT.md +13 -0
- package/agents/direito-adaneiro/AGENT.md +18 -0
- package/agents/direito-administrativo/AGENT.md +18 -0
- package/agents/direito-aeroporta-rio/AGENT.md +18 -0
- package/agents/direito-agra-rio/AGENT.md +18 -0
- package/agents/direito-ambiental/AGENT.md +18 -0
- package/agents/direito-banca-rio/AGENT.md +18 -0
- package/agents/direito-civil/AGENT.md +18 -0
- package/agents/direito-constitcional/AGENT.md +18 -0
- package/agents/direito-da-crianc-a-e-do-adolescente-eca/AGENT.md +18 -0
- package/agents/direito-da-propriedade-intelectal/AGENT.md +18 -0
- package/agents/direito-de-ami-lia/AGENT.md +18 -0
- package/agents/direito-de-tra-nsito/AGENT.md +18 -0
- package/agents/direito-desportivo/AGENT.md +18 -0
- package/agents/direito-digital/AGENT.md +18 -0
- package/agents/direito-do-consmidor/AGENT.md +18 -0
- package/agents/direito-do-trabalho/AGENT.md +18 -0
- package/agents/direito-econo-mico/AGENT.md +18 -0
- package/agents/direito-eleitoral/AGENT.md +18 -0
- package/agents/direito-empresarial/AGENT.md +18 -0
- package/agents/direito-imobilia-rio/AGENT.md +18 -0
- package/agents/direito-inanceiro/AGENT.md +18 -0
- package/agents/direito-internacional/AGENT.md +18 -0
- package/agents/direito-mari-timo/AGENT.md +18 -0
- package/agents/direito-me-dico-e-da-sa-de/AGENT.md +18 -0
- package/agents/direito-militar/AGENT.md +18 -0
- package/agents/direito-ndia-rio/AGENT.md +18 -0
- package/agents/direito-notarial-e-registral/AGENT.md +18 -0
- package/agents/direito-penal/AGENT.md +18 -0
- package/agents/direito-previdencia-rio/AGENT.md +18 -0
- package/agents/direito-processal-civil/AGENT.md +18 -0
- package/agents/direito-processal-do-trabalho/AGENT.md +18 -0
- package/agents/direito-processal-militar/AGENT.md +18 -0
- package/agents/direito-processal-penal/AGENT.md +18 -0
- package/agents/direito-rbani-stico/AGENT.md +18 -0
- package/agents/direito-secrita-rio/AGENT.md +18 -0
- package/agents/direito-sindical/AGENT.md +18 -0
- package/agents/direito-societa-rio/AGENT.md +18 -0
- package/agents/direito-tribta-rio/AGENT.md +18 -0
- package/agents/direitos-hmanos/AGENT.md +18 -0
- package/agents/legal-analyst/AGENT.md +16 -0
- package/agents/legal-synthesizer/AGENT.md +13 -0
- package/agents/lgpd-anonymizer/AGENT.md +14 -0
- package/agents/lgpd-restorer/AGENT.md +14 -0
- package/agents/task-router/AGENT.md +13 -0
- package/bin/conectese.js +73 -0
- package/dashboard/index.html +12 -0
- package/dashboard/package-lock.json +1971 -0
- package/dashboard/package.json +28 -0
- package/dashboard/public/assets/avatars/Female1_1wave.png +0 -0
- package/dashboard/public/assets/avatars/Female1_2wave.png +0 -0
- package/dashboard/public/assets/avatars/Female1_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female1_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female2_1wave.png +0 -0
- package/dashboard/public/assets/avatars/Female2_2wave.png +0 -0
- package/dashboard/public/assets/avatars/Female2_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female2_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female3_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female3_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female3_wave.png +0 -0
- package/dashboard/public/assets/avatars/Female4_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female4_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female4_wave.png +0 -0
- package/dashboard/public/assets/avatars/Female5_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female5_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female5_wave.png +0 -0
- package/dashboard/public/assets/avatars/Female6_blink.png +0 -0
- package/dashboard/public/assets/avatars/Female6_talk.png +0 -0
- package/dashboard/public/assets/avatars/Female6_wave.png +0 -0
- package/dashboard/public/assets/avatars/Male1_1wave.png +0 -0
- package/dashboard/public/assets/avatars/Male1_2wave.png +0 -0
- package/dashboard/public/assets/avatars/Male1_blink.png +0 -0
- package/dashboard/public/assets/avatars/Male1_talk.png +0 -0
- package/dashboard/public/assets/avatars/Male2_1wave.png +0 -0
- package/dashboard/public/assets/avatars/Male2_2wave.png +0 -0
- package/dashboard/public/assets/avatars/Male2_blink.png +0 -0
- package/dashboard/public/assets/avatars/Male2_talk.png +0 -0
- package/dashboard/public/assets/avatars/Male3_blink.png +0 -0
- package/dashboard/public/assets/avatars/Male3_talk.png +0 -0
- package/dashboard/public/assets/avatars/Male3_wave.png +0 -0
- package/dashboard/public/assets/avatars/Male4_blink.png +0 -0
- package/dashboard/public/assets/avatars/Male4_talk.png +0 -0
- package/dashboard/public/assets/avatars/Male4_wave.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_black_down.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_black_down_coding-1.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_black_down_coding.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_black_up.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_white_down.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_white_down_coding-1.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_white_down_coding.png +0 -0
- package/dashboard/public/assets/desks/desktop_set_white_up.png +0 -0
- package/dashboard/public/assets/furniture/armchair_tan.png +0 -0
- package/dashboard/public/assets/furniture/armchair_tan_down.png +0 -0
- package/dashboard/public/assets/furniture/backpack_blue.png +0 -0
- package/dashboard/public/assets/furniture/backpack_red.png +0 -0
- package/dashboard/public/assets/furniture/blinds.png +0 -0
- package/dashboard/public/assets/furniture/blinds_large_closed_white.png +0 -0
- package/dashboard/public/assets/furniture/bookshelf.png +0 -0
- package/dashboard/public/assets/furniture/bookshelf_purple_tall.png +0 -0
- package/dashboard/public/assets/furniture/bulletin_board.png +0 -0
- package/dashboard/public/assets/furniture/clock.png +0 -0
- package/dashboard/public/assets/furniture/coffee_mug.png +0 -0
- package/dashboard/public/assets/furniture/coffee_mug_blue.png +0 -0
- package/dashboard/public/assets/furniture/coffee_table.png +0 -0
- package/dashboard/public/assets/furniture/coffeepot_right.png +0 -0
- package/dashboard/public/assets/furniture/coffeetable_black_horizontal.png +0 -0
- package/dashboard/public/assets/furniture/couch.png +0 -0
- package/dashboard/public/assets/furniture/couch_tan_down.png +0 -0
- package/dashboard/public/assets/furniture/cushion_blue.png +0 -0
- package/dashboard/public/assets/furniture/cushion_tan.png +0 -0
- package/dashboard/public/assets/furniture/desk_wood.png +0 -0
- package/dashboard/public/assets/furniture/fancy_rug.png +0 -0
- package/dashboard/public/assets/furniture/fancy_rug_wide.png +0 -0
- package/dashboard/public/assets/furniture/flowers1.png +0 -0
- package/dashboard/public/assets/furniture/flowers2.png +0 -0
- package/dashboard/public/assets/furniture/lamp_tan.png +0 -0
- package/dashboard/public/assets/furniture/lantern.png +0 -0
- package/dashboard/public/assets/furniture/monstera.png +0 -0
- package/dashboard/public/assets/furniture/monstera_small.png +0 -0
- package/dashboard/public/assets/furniture/picture_frame.png +0 -0
- package/dashboard/public/assets/furniture/plant1.png +0 -0
- package/dashboard/public/assets/furniture/plant2.png +0 -0
- package/dashboard/public/assets/furniture/plant3.png +0 -0
- package/dashboard/public/assets/furniture/plant_poof.png +0 -0
- package/dashboard/public/assets/furniture/plant_spindly.png +0 -0
- package/dashboard/public/assets/furniture/poster_blue.png +0 -0
- package/dashboard/public/assets/furniture/rug.png +0 -0
- package/dashboard/public/assets/furniture/succulent_blue.png +0 -0
- package/dashboard/public/assets/furniture/succulent_green.png +0 -0
- package/dashboard/public/assets/furniture/treasurechest_closed_gold.png +0 -0
- package/dashboard/public/assets/furniture/water_cooler_better.png +0 -0
- package/dashboard/public/assets/furniture/whiteboard.png +0 -0
- package/dashboard/public/assets/furniture/whiteboard_stand_graph.png +0 -0
- package/dashboard/public/assets/furniture/window_blinds_open.png +0 -0
- package/dashboard/src/App.tsx +46 -0
- package/dashboard/src/components/SquadCard.tsx +47 -0
- package/dashboard/src/components/SquadSelector.tsx +61 -0
- package/dashboard/src/components/StatusBadge.tsx +32 -0
- package/dashboard/src/components/StatusBar.tsx +97 -0
- package/dashboard/src/hooks/useSquadSocket.ts +135 -0
- package/dashboard/src/lib/formatTime.ts +16 -0
- package/dashboard/src/lib/normalizeState.ts +25 -0
- package/dashboard/src/main.tsx +10 -0
- package/dashboard/src/office/AgentSprite.ts +241 -0
- package/dashboard/src/office/OfficeScene.ts +153 -0
- package/dashboard/src/office/PhaserGame.tsx +80 -0
- package/dashboard/src/office/RoomBuilder.ts +190 -0
- package/dashboard/src/office/assetKeys.ts +150 -0
- package/dashboard/src/office/palette.ts +32 -0
- package/dashboard/src/plugin/squadWatcher.ts +233 -0
- package/dashboard/src/store/useSquadStore.ts +56 -0
- package/dashboard/src/styles/globals.css +36 -0
- package/dashboard/src/types/state.ts +63 -0
- package/dashboard/src/vite-env.d.ts +1 -0
- package/dashboard/test-results/.last-run.json +4 -0
- package/dashboard/tsconfig.json +24 -0
- package/dashboard/tsconfig.tsbuildinfo +1 -0
- package/dashboard/vite.config.ts +13 -0
- package/package.json +53 -0
- package/skills/README.md +63 -0
- package/skills/apify/SKILL.md +55 -0
- package/skills/blotato/SKILL.md +63 -0
- package/skills/canva/SKILL.md +60 -0
- package/skills/conectese-agent-creator/SKILL.md +192 -0
- package/skills/conectese-skill-creator/SKILL.md +407 -0
- package/skills/conectese-skill-creator/agents/analyzer.md +274 -0
- package/skills/conectese-skill-creator/agents/comparator.md +202 -0
- package/skills/conectese-skill-creator/agents/grader.md +223 -0
- package/skills/conectese-skill-creator/assets/eval_review.html +146 -0
- package/skills/conectese-skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/conectese-skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/conectese-skill-creator/references/schemas.md +430 -0
- package/skills/conectese-skill-creator/references/skill-format.md +235 -0
- package/skills/conectese-skill-creator/scripts/__init__.py +0 -0
- package/skills/conectese-skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/conectese-skill-creator/scripts/quick_validate.py +103 -0
- package/skills/conectese-skill-creator/scripts/run_eval.py +310 -0
- package/skills/conectese-skill-creator/scripts/utils.py +47 -0
- package/skills/image-ai-generator/SKILL.md +124 -0
- package/skills/image-ai-generator/scripts/generate.py +175 -0
- package/skills/image-creator/SKILL.md +155 -0
- package/skills/image-fetcher/SKILL.md +91 -0
- package/skills/instagram-publisher/SKILL.md +119 -0
- package/skills/instagram-publisher/scripts/publish.js +165 -0
- package/skills/resend/SKILL.md +80 -0
- package/skills/template-designer/SKILL.md +201 -0
- package/skills/template-designer/base-templates/model-a.html +27 -0
- package/skills/template-designer/base-templates/model-b.html +31 -0
- package/skills/template-designer/base-templates/model-c.html +42 -0
- package/src/agents-cli.js +158 -0
- package/src/agents.js +134 -0
- package/src/i18n.js +48 -0
- package/src/init.js +341 -0
- package/src/locales/en.json +73 -0
- package/src/locales/es.json +72 -0
- package/src/locales/pt-BR.json +72 -0
- package/src/logger.js +38 -0
- package/src/prompt.js +46 -0
- package/src/readme/README.md +119 -0
- package/src/runs.js +90 -0
- package/src/skills-cli.js +157 -0
- package/src/skills.js +146 -0
- package/src/update.js +169 -0
- package/templates/_conectese/.conectese-version +1 -0
- package/templates/_conectese/_investigations/.gitkeep +0 -0
- package/templates/ide-templates/antigravity/.agent/rules/conectese.md +55 -0
- package/templates/ide-templates/antigravity/.agent/workflows/conectese.md +102 -0
- package/templates/ide-templates/claude-code/.claude/skills/conectese/SKILL.md +182 -0
- package/templates/ide-templates/claude-code/.mcp.json +8 -0
- package/templates/ide-templates/claude-code/CLAUDE.md +43 -0
- package/templates/ide-templates/codex/.agents/skills/conectese/SKILL.md +6 -0
- package/templates/ide-templates/codex/AGENTS.md +105 -0
- package/templates/ide-templates/cursor/.cursor/commands/conectese.md +9 -0
- package/templates/ide-templates/cursor/.cursor/mcp.json +8 -0
- package/templates/ide-templates/cursor/.cursor/rules/conectese.mdc +48 -0
- package/templates/ide-templates/cursor/.cursorignore +3 -0
- package/templates/ide-templates/opencode/.opencode/commands/conectese.md +9 -0
- package/templates/ide-templates/opencode/AGENTS.md +105 -0
- package/templates/ide-templates/vscode-copilot/.github/prompts/conectese.prompt.md +201 -0
- package/templates/ide-templates/vscode-copilot/.vscode/mcp.json +8 -0
- package/templates/ide-templates/vscode-copilot/.vscode/settings.json +3 -0
- package/templates/package.json +8 -0
- package/templates/squads/.gitkeep +0 -0
package/src/init.js
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { cp, mkdir, readdir, readFile, writeFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
5
|
+
import { createPrompt } from './prompt.js';
|
|
6
|
+
import { loadLocale, t } from './i18n.js';
|
|
7
|
+
import { listAvailable, installSkill } from './skills.js';
|
|
8
|
+
import { logEvent } from './logger.js';
|
|
9
|
+
|
|
10
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const TEMPLATES_DIR = join(__dirname, '..', 'templates');
|
|
12
|
+
|
|
13
|
+
const PACKAGE_ROOT = join(__dirname, '..');
|
|
14
|
+
|
|
15
|
+
const CANONICAL_SOURCES = [
|
|
16
|
+
{ src: join(PACKAGE_ROOT, '_conectese', 'core'), dest: join('_conectese', 'core') },
|
|
17
|
+
{ src: join(PACKAGE_ROOT, '_conectese', 'config'), dest: join('_conectese', 'config') },
|
|
18
|
+
{ src: join(PACKAGE_ROOT, 'dashboard'), dest: 'dashboard' },
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const DASHBOARD_EXCLUDES = ['node_modules', 'tsconfig.tsbuildinfo', 'squads'];
|
|
22
|
+
|
|
23
|
+
const LANGUAGES = [
|
|
24
|
+
{ label: 'Português (Brasil)', value: 'Português (Brasil)' },
|
|
25
|
+
{ label: 'English', value: 'English' },
|
|
26
|
+
{ label: 'Español', value: 'Español' },
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const IDES = [
|
|
30
|
+
{ label: 'Antigravity', value: 'antigravity', checked: true },
|
|
31
|
+
{ label: 'Claude Code', value: 'claude-code' },
|
|
32
|
+
{ label: 'Codex (OpenAI)', value: 'codex' },
|
|
33
|
+
{ label: 'Cursor', value: 'cursor' },
|
|
34
|
+
{ label: 'OpenCode', value: 'opencode' },
|
|
35
|
+
{ label: 'VS Code + Copilot', value: 'vscode-copilot' },
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
export async function init(targetDir, options = {}) {
|
|
39
|
+
|
|
40
|
+
// Check if already initialized
|
|
41
|
+
let isReInit = false;
|
|
42
|
+
try {
|
|
43
|
+
await stat(join(targetDir, '_conectese'));
|
|
44
|
+
isReInit = true;
|
|
45
|
+
} catch {
|
|
46
|
+
// Not initialized yet — continue
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
console.log(isReInit ? '\n 🔄 Conectese — Re-configure\n' : '\n 🟢 Conectese — Setup\n');
|
|
50
|
+
|
|
51
|
+
// Guided installation (skip in test mode)
|
|
52
|
+
let language = options._language || 'English';
|
|
53
|
+
let ides = options._ides ?? ['claude-code'];
|
|
54
|
+
let userName = '';
|
|
55
|
+
|
|
56
|
+
if (!options._skipPrompts) {
|
|
57
|
+
const prompt = createPrompt();
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
// Language is asked FIRST (in English, before locale is loaded)
|
|
61
|
+
const langChoice = await prompt.choose('What language do you prefer for outputs?', LANGUAGES);
|
|
62
|
+
language = langChoice.value;
|
|
63
|
+
|
|
64
|
+
// Load locale — all messages from here are translated
|
|
65
|
+
await loadLocale(language);
|
|
66
|
+
|
|
67
|
+
console.log(`\n ${t('welcome')}\n`);
|
|
68
|
+
|
|
69
|
+
userName = (await prompt.ask(` ${t('askName')}`)).trim();
|
|
70
|
+
|
|
71
|
+
ides = await prompt.multiChoose(t('chooseIdes'), IDES);
|
|
72
|
+
} finally {
|
|
73
|
+
prompt.close();
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
await loadLocale(language);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Copy template files
|
|
80
|
+
await copyCommonTemplates(targetDir);
|
|
81
|
+
await copyCanonicalSources(targetDir);
|
|
82
|
+
await copyIdeTemplates(ides, targetDir);
|
|
83
|
+
await installAllSkills(targetDir);
|
|
84
|
+
if (!options._skipPrompts) {
|
|
85
|
+
await installDependencies(targetDir);
|
|
86
|
+
}
|
|
87
|
+
await writeProjectReadme(targetDir);
|
|
88
|
+
|
|
89
|
+
// Write user preferences
|
|
90
|
+
const prefsPath = join(targetDir, '_conectese', '_memory', 'preferences.md');
|
|
91
|
+
await mkdir(dirname(prefsPath), { recursive: true });
|
|
92
|
+
const prefsContent = `# Conectese Preferences
|
|
93
|
+
|
|
94
|
+
- **User Name:** ${userName}
|
|
95
|
+
- **Output Language:** ${language}
|
|
96
|
+
- **IDEs:** ${ides.join(', ')}
|
|
97
|
+
- **Date Format:** YYYY-MM-DD
|
|
98
|
+
`;
|
|
99
|
+
await writeFile(prefsPath, prefsContent, 'utf-8');
|
|
100
|
+
|
|
101
|
+
await logEvent('init', { language, ides: ides.join(',') }, targetDir);
|
|
102
|
+
|
|
103
|
+
console.log(`\n ${t('success')}\n`);
|
|
104
|
+
console.log(` ⚠️ ${t('tokenCostWarning')}\n`);
|
|
105
|
+
console.log(` ${t('nextSteps')}`);
|
|
106
|
+
for (const ide of ides) {
|
|
107
|
+
if (ide === 'claude-code') {
|
|
108
|
+
console.log(` ${t('step1ClaudeCode')}`);
|
|
109
|
+
console.log(` ${t('step2ClaudeCode')}`);
|
|
110
|
+
console.log(` ${t('step3ClaudeCode')}\n`);
|
|
111
|
+
} else if (ide === 'codex') {
|
|
112
|
+
console.log(` ${t('step1Codex')}\n`);
|
|
113
|
+
} else if (ide === 'antigravity') {
|
|
114
|
+
console.log(` ${t('step1Antigravity')}\n`);
|
|
115
|
+
} else if (ide === 'cursor') {
|
|
116
|
+
console.log(` ${t('step1Cursor')}\n`);
|
|
117
|
+
} else if (ide === 'opencode') {
|
|
118
|
+
console.log(` ${t('step1Opencode')}\n`);
|
|
119
|
+
} else if (ide === 'vscode-copilot') {
|
|
120
|
+
console.log(` ${t('step1VsCodeCopilot')}`);
|
|
121
|
+
console.log(` ${t('step2VsCodeCopilot')}`);
|
|
122
|
+
console.log(` ${t('step3VsCodeCopilot')}\n`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export async function loadSavedLocale(targetDir) {
|
|
128
|
+
try {
|
|
129
|
+
const prefsPath = join(targetDir, '_conectese', '_memory', 'preferences.md');
|
|
130
|
+
const content = await readFile(prefsPath, 'utf-8');
|
|
131
|
+
const match = content.match(/\*\*Output Language:\*\*\s*(.+)/);
|
|
132
|
+
if (match) {
|
|
133
|
+
await loadLocale(match[1].trim());
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
} catch {
|
|
137
|
+
// No preferences file yet
|
|
138
|
+
}
|
|
139
|
+
await loadLocale('English');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function installAllSkills(targetDir) {
|
|
143
|
+
const available = await listAvailable();
|
|
144
|
+
for (const id of available) {
|
|
145
|
+
await installSkill(id, targetDir);
|
|
146
|
+
console.log(` ${t('createdFile', { path: `skills/${id}/SKILL.md` })}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function installDependencies(targetDir) {
|
|
151
|
+
console.log(`\n Installing dependencies...`);
|
|
152
|
+
execSync('npm install', { cwd: targetDir, stdio: 'inherit' });
|
|
153
|
+
console.log(`\n Installing dashboard dependencies...`);
|
|
154
|
+
execSync('npm install', { cwd: join(targetDir, 'dashboard'), stdio: 'inherit' });
|
|
155
|
+
console.log(`\n Installing Playwright browsers...`);
|
|
156
|
+
execSync('npx playwright install chromium', { cwd: targetDir, stdio: 'inherit' });
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async function writeProjectReadme(targetDir) {
|
|
160
|
+
const destPath = join(targetDir, 'README.md');
|
|
161
|
+
try {
|
|
162
|
+
await stat(destPath);
|
|
163
|
+
// README already exists — skip to avoid overwriting user content
|
|
164
|
+
return;
|
|
165
|
+
} catch {
|
|
166
|
+
// does not exist — write it
|
|
167
|
+
}
|
|
168
|
+
const readmePath = join(__dirname, 'readme', 'README.md');
|
|
169
|
+
const content = await readFile(readmePath, 'utf-8');
|
|
170
|
+
await writeFile(destPath, content, 'utf-8');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async function copyCommonTemplates(targetDir) {
|
|
174
|
+
const entries = await getTemplateEntries(TEMPLATES_DIR);
|
|
175
|
+
|
|
176
|
+
for (const entry of entries) {
|
|
177
|
+
// Skip anything inside ide-templates/ — handled by copyIdeTemplates
|
|
178
|
+
if (entry.replace(/\\/g, '/').includes('/ide-templates/')) continue;
|
|
179
|
+
|
|
180
|
+
const relativePath = entry.slice(TEMPLATES_DIR.length + 1);
|
|
181
|
+
const destPath = join(targetDir, relativePath);
|
|
182
|
+
const destDir = dirname(destPath);
|
|
183
|
+
await mkdir(destDir, { recursive: true });
|
|
184
|
+
try {
|
|
185
|
+
await stat(destPath);
|
|
186
|
+
continue; // file already exists — skip
|
|
187
|
+
} catch {
|
|
188
|
+
// does not exist — copy it
|
|
189
|
+
}
|
|
190
|
+
await cp(entry, destPath);
|
|
191
|
+
console.log(` ${t('createdFile', { path: relativePath })}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async function copyIdeTemplates(ides, targetDir) {
|
|
196
|
+
const ideTemplatesDir = join(TEMPLATES_DIR, 'ide-templates');
|
|
197
|
+
const writtenPaths = new Set();
|
|
198
|
+
|
|
199
|
+
for (const ide of ides) {
|
|
200
|
+
const ideSrcDir = join(ideTemplatesDir, ide);
|
|
201
|
+
let entries;
|
|
202
|
+
try {
|
|
203
|
+
entries = await getTemplateEntries(ideSrcDir);
|
|
204
|
+
} catch {
|
|
205
|
+
continue; // no template dir for this IDE yet
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
for (const entry of entries) {
|
|
209
|
+
const relativePath = entry.slice(ideSrcDir.length + 1);
|
|
210
|
+
// settings.json for vscode-copilot is handled by mergeVsCodeSettings — skip here
|
|
211
|
+
if (ide === 'vscode-copilot' && relativePath.replace(/\\/g, '/') === '.vscode/settings.json') continue;
|
|
212
|
+
if (writtenPaths.has(relativePath)) continue;
|
|
213
|
+
writtenPaths.add(relativePath);
|
|
214
|
+
|
|
215
|
+
const destPath = join(targetDir, relativePath);
|
|
216
|
+
const destDir = dirname(destPath);
|
|
217
|
+
await mkdir(destDir, { recursive: true });
|
|
218
|
+
try {
|
|
219
|
+
await stat(destPath);
|
|
220
|
+
continue; // file already exists — skip
|
|
221
|
+
} catch {
|
|
222
|
+
// does not exist — copy it
|
|
223
|
+
}
|
|
224
|
+
await cp(entry, destPath);
|
|
225
|
+
console.log(` ${t('createdFile', { path: relativePath })}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (ides.includes('vscode-copilot')) {
|
|
230
|
+
await mergeVsCodeSettings(targetDir);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
async function mergeVsCodeSettings(targetDir) {
|
|
235
|
+
const settingsPath = join(targetDir, '.vscode', 'settings.json');
|
|
236
|
+
|
|
237
|
+
let exists = false;
|
|
238
|
+
try {
|
|
239
|
+
await stat(settingsPath);
|
|
240
|
+
exists = true;
|
|
241
|
+
} catch {
|
|
242
|
+
// doesn't exist
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (!exists) {
|
|
246
|
+
const templateBase = join(TEMPLATES_DIR, 'ide-templates', 'vscode-copilot', '.vscode', 'settings.json');
|
|
247
|
+
await mkdir(join(targetDir, '.vscode'), { recursive: true });
|
|
248
|
+
await cp(templateBase, settingsPath);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const raw = await readFile(settingsPath, 'utf-8');
|
|
253
|
+
let parsed;
|
|
254
|
+
try {
|
|
255
|
+
parsed = JSON.parse(raw);
|
|
256
|
+
} catch {
|
|
257
|
+
console.log(` ⚠️ .vscode/settings.json has invalid JSON — skipping merge. Add manually: "chat.promptFilesLocations": [".github/prompts"]`);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (!parsed['chat.promptFilesLocations']) {
|
|
262
|
+
parsed['chat.promptFilesLocations'] = ['.github/prompts'];
|
|
263
|
+
} else if (!parsed['chat.promptFilesLocations'].includes('.github/prompts')) {
|
|
264
|
+
parsed['chat.promptFilesLocations'].push('.github/prompts');
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
await writeFile(settingsPath, JSON.stringify(parsed, null, 2), 'utf-8');
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export async function getTemplateEntries(dir) {
|
|
271
|
+
const results = [];
|
|
272
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
273
|
+
|
|
274
|
+
for (const entry of entries) {
|
|
275
|
+
const fullPath = join(dir, entry.name);
|
|
276
|
+
if (entry.isDirectory()) {
|
|
277
|
+
results.push(...await getTemplateEntries(fullPath));
|
|
278
|
+
} else {
|
|
279
|
+
results.push(fullPath);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return results;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export async function copyCanonicalSources(targetDir, { overwrite = false, backupFn = null, protectedFn = null } = {}) {
|
|
287
|
+
let count = 0;
|
|
288
|
+
|
|
289
|
+
for (const { src, dest } of CANONICAL_SOURCES) {
|
|
290
|
+
const isDashboard = dest === 'dashboard';
|
|
291
|
+
let entries;
|
|
292
|
+
try {
|
|
293
|
+
entries = await getTemplateEntries(src);
|
|
294
|
+
} catch {
|
|
295
|
+
continue; // source dir doesn't exist (e.g., running from a partial install)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
for (const entry of entries) {
|
|
299
|
+
const relativeToSrc = entry.slice(src.length + 1);
|
|
300
|
+
const normalizedRel = relativeToSrc.replace(/\\/g, '/');
|
|
301
|
+
|
|
302
|
+
// Skip dashboard-local artifacts
|
|
303
|
+
if (isDashboard && DASHBOARD_EXCLUDES.some(ex => normalizedRel === ex || normalizedRel.startsWith(ex + '/'))) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const relativePath = join(dest, relativeToSrc);
|
|
308
|
+
const normalizedPath = relativePath.replace(/\\/g, '/');
|
|
309
|
+
|
|
310
|
+
// Skip protected paths (update mode)
|
|
311
|
+
if (protectedFn && protectedFn(normalizedPath)) continue;
|
|
312
|
+
|
|
313
|
+
const destPath = join(targetDir, relativePath);
|
|
314
|
+
await mkdir(dirname(destPath), { recursive: true });
|
|
315
|
+
|
|
316
|
+
if (!overwrite) {
|
|
317
|
+
// Init mode: skip existing files
|
|
318
|
+
try {
|
|
319
|
+
await stat(destPath);
|
|
320
|
+
continue;
|
|
321
|
+
} catch {
|
|
322
|
+
// does not exist — copy it
|
|
323
|
+
}
|
|
324
|
+
await cp(entry, destPath);
|
|
325
|
+
console.log(` ${t('createdFile', { path: normalizedPath })}`);
|
|
326
|
+
} else {
|
|
327
|
+
// Update mode: backup then overwrite
|
|
328
|
+
const backed = backupFn ? await backupFn(destPath) : false;
|
|
329
|
+
await cp(entry, destPath);
|
|
330
|
+
if (backed) {
|
|
331
|
+
console.log(` ${t('updatedFile', { path: normalizedPath })} (backup: ${normalizedPath}.bak)`);
|
|
332
|
+
} else {
|
|
333
|
+
console.log(` ${t('updatedFile', { path: normalizedPath })}`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
count++;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return count;
|
|
341
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"welcome": "Welcome! Let's set up Conectese for your project.",
|
|
3
|
+
"askName": "What's your name? → ",
|
|
4
|
+
"atLeastOneIde": "Please select at least one IDE.",
|
|
5
|
+
"chooseIdes": "Which IDEs/tools do you use? (select all that apply)",
|
|
6
|
+
"step1Codex": "1. See AGENTS.md in your project root for Codex instructions",
|
|
7
|
+
"step1Antigravity": "1. Open Antigravity, type / in the chat and select conectese to get started.",
|
|
8
|
+
"step1Cursor": "1. Open Cursor, type / in the chat and select conectese to get started.",
|
|
9
|
+
"step1Opencode": "1. Open OpenCode and type /conectese to get started.",
|
|
10
|
+
"ideNotAvailable": "⚠️ \"{label}\" is not available yet. Choose another option.",
|
|
11
|
+
"enterNumber": "Please enter a number between 1 and {max}.",
|
|
12
|
+
"alreadyInitialized": "⚠️ Conectese is already initialized in this directory.",
|
|
13
|
+
"alreadyInitializedHint": "Use Claude Code and type /conectese to get started.",
|
|
14
|
+
"createdFile": "📄 Created {path}",
|
|
15
|
+
"success": "✅ Conectese initialized successfully!",
|
|
16
|
+
"nextSteps": "Next steps:",
|
|
17
|
+
"step1ClaudeCode": "1. Open this directory in Claude Code",
|
|
18
|
+
"step2ClaudeCode": "2. Type /conectese to start the onboarding wizard",
|
|
19
|
+
"step3ClaudeCode": "3. Follow the prompts to set up your company profile",
|
|
20
|
+
"comingSoon": "coming soon",
|
|
21
|
+
"_test_fallback_only": "English fallback works",
|
|
22
|
+
"updateNotInitialized": "No Conectese installation found. Run 'init' first.",
|
|
23
|
+
"updateStarting": "Updating Conectese {old} → {new}...",
|
|
24
|
+
"updateStartingUnknown": "Updating Conectese (unknown version) → {new}...",
|
|
25
|
+
"updatedFile": "📄 Updated {path}",
|
|
26
|
+
"updateSuccess": "✅ Conectese {version} installed successfully!",
|
|
27
|
+
"updatePreserved": "✓ Preserved: _memory/, _investigations/, squads/",
|
|
28
|
+
"updateFileCount": "✓ Updated: {count} system files",
|
|
29
|
+
"updateLatestHint": "💡 Tip: Use 'npx conectese@latest update' to always get the newest version.",
|
|
30
|
+
"skillsNotInitialized": "No Conectese installation found. Run 'init' first.",
|
|
31
|
+
"skillsFetching": "Fetching skills registry...",
|
|
32
|
+
"skillsInstalledHeader": "Installed:",
|
|
33
|
+
"skillsAvailableHeader": "Available:",
|
|
34
|
+
"skillsNoneInstalled": "No skills installed yet.",
|
|
35
|
+
"skillsNoneAvailable": "No skills available in registry.",
|
|
36
|
+
"skillsInstallHint": "Install with: npx conectese install <id>",
|
|
37
|
+
"skillsInstalling": "Installing {id}...",
|
|
38
|
+
"skillsInstalled": "✅ Installed: {id}",
|
|
39
|
+
"skillsAlreadyInstalled": "⚠️ {id} is already installed. Reinstall? (y/n) ",
|
|
40
|
+
"skillsReinstalled": "✅ Reinstalled: {id}",
|
|
41
|
+
"skillsRemoving": "Removing {id}...",
|
|
42
|
+
"skillsRemoved": "✅ Removed: {id}",
|
|
43
|
+
"skillsNotInstalled": "⚠️ {id} is not installed.",
|
|
44
|
+
"skillsUpdating": "Updating all installed skills...",
|
|
45
|
+
"skillsUpdateDone": "✅ Updated {count} skill(s).",
|
|
46
|
+
"skillsUpdateNone": "No skills installed to update.",
|
|
47
|
+
"skillsError": "❌ Error: {message}",
|
|
48
|
+
"skillsUnknownCommand": "Unknown skills command: {cmd}\n Usage: conectese skills list|install|remove|update",
|
|
49
|
+
"chooseSkills": "Which skills do you want to install? (optional)",
|
|
50
|
+
"skillsEnvWarning": " Requires: {vars}",
|
|
51
|
+
"skillsSkipped": "You can install skills later with: npx conectese install <name>",
|
|
52
|
+
"skillsInstalledCount": "Installed {count} skill(s).",
|
|
53
|
+
"agentsNotInitialized": "No Conectese installation found. Run 'init' first.",
|
|
54
|
+
"agentsInstalledHeader": "Installed:",
|
|
55
|
+
"agentsNoneInstalled": "No agents installed yet.",
|
|
56
|
+
"agentsInstallHint": "Install with: npx conectese agents install <id>",
|
|
57
|
+
"agentsInstalling": "Installing {id}...",
|
|
58
|
+
"agentsInstalled": "✅ Installed: {id}",
|
|
59
|
+
"agentsAlreadyInstalled": "⚠️ {id} is already installed. Reinstall? (y/n) ",
|
|
60
|
+
"agentsReinstalled": "✅ Reinstalled: {id}",
|
|
61
|
+
"agentsRemoving": "Removing {id}...",
|
|
62
|
+
"agentsRemoved": "✅ Removed: {id}",
|
|
63
|
+
"agentsNotInstalled": "⚠️ {id} is not installed.",
|
|
64
|
+
"agentsUpdating": "Updating all installed agents...",
|
|
65
|
+
"agentsUpdateDone": "✅ Updated {count} agent(s).",
|
|
66
|
+
"agentsUpdateNone": "No agents installed to update.",
|
|
67
|
+
"agentsError": "❌ Error: {message}",
|
|
68
|
+
"agentsUnknownCommand": "Unknown agents command: {cmd}\n Usage: conectese agents list|install|remove|update",
|
|
69
|
+
"step1VsCodeCopilot": "1. Open this directory in VS Code",
|
|
70
|
+
"step2VsCodeCopilot": "2. Open Copilot Chat (Ctrl+Alt+I)",
|
|
71
|
+
"step3VsCodeCopilot": "3. Type /conectese to get started",
|
|
72
|
+
"tokenCostWarning": "Running squads consumes AI tokens (paid). Monitor your usage in your IDE or AI provider dashboard."
|
|
73
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"welcome": "¡Bienvenido! Vamos a configurar Conectese para tu proyecto.",
|
|
3
|
+
"askName": "¿Cuál es tu nombre? → ",
|
|
4
|
+
"atLeastOneIde": "Por favor selecciona al menos una IDE.",
|
|
5
|
+
"chooseIdes": "¿Qué IDEs/herramientas usas? (selecciona todas las que uses)",
|
|
6
|
+
"step1Codex": "1. Consulta AGENTS.md en la raíz del proyecto para instrucciones de Codex",
|
|
7
|
+
"step1Antigravity": "1. Abre Antigravity, escribe / en el chat y selecciona conectese para comenzar.",
|
|
8
|
+
"step1Cursor": "1. Abre Cursor, escribe / en el chat y selecciona conectese para comenzar.",
|
|
9
|
+
"step1Opencode": "1. Abre OpenCode y escribe /conectese para comenzar.",
|
|
10
|
+
"ideNotAvailable": "⚠️ \"{label}\" aún no está disponible. Elige otra opción.",
|
|
11
|
+
"enterNumber": "Por favor, ingresa un número entre 1 y {max}.",
|
|
12
|
+
"alreadyInitialized": "⚠️ Conectese ya está inicializado en este directorio.",
|
|
13
|
+
"alreadyInitializedHint": "Usa Claude Code y escribe /conectese para comenzar.",
|
|
14
|
+
"createdFile": "📄 Creado {path}",
|
|
15
|
+
"success": "✅ ¡Conectese inicializado con éxito!",
|
|
16
|
+
"nextSteps": "Próximos pasos:",
|
|
17
|
+
"step1ClaudeCode": "1. Abre este directorio en Claude Code",
|
|
18
|
+
"step2ClaudeCode": "2. Escribe /conectese para iniciar el asistente",
|
|
19
|
+
"step3ClaudeCode": "3. Sigue las instrucciones para configurar el perfil de tu empresa",
|
|
20
|
+
"comingSoon": "próximamente",
|
|
21
|
+
"updateNotInitialized": "No se encontró ninguna instalación de Conectese. Ejecute 'init' primero.",
|
|
22
|
+
"updateStarting": "Actualizando Conectese {old} → {new}...",
|
|
23
|
+
"updateStartingUnknown": "Actualizando Conectese (versión desconocida) → {new}...",
|
|
24
|
+
"updatedFile": "📄 Actualizado {path}",
|
|
25
|
+
"updateSuccess": "✅ ¡Conectese {version} instalado correctamente!",
|
|
26
|
+
"updatePreserved": "✓ Preservado: _memory/, _investigations/, squads/",
|
|
27
|
+
"updateFileCount": "✓ Actualizados: {count} archivos del sistema",
|
|
28
|
+
"updateLatestHint": "💡 Consejo: Use 'npx conectese@latest update' para obtener siempre la versión más reciente.",
|
|
29
|
+
"skillsNotInitialized": "Instalación de Conectese no encontrada. Ejecuta 'init' primero.",
|
|
30
|
+
"skillsFetching": "Obteniendo registro de skills...",
|
|
31
|
+
"skillsInstalledHeader": "Instaladas:",
|
|
32
|
+
"skillsAvailableHeader": "Disponibles:",
|
|
33
|
+
"skillsNoneInstalled": "No hay skills instaladas todavía.",
|
|
34
|
+
"skillsNoneAvailable": "No hay skills disponibles en el registro.",
|
|
35
|
+
"skillsInstallHint": "Instala con: npx conectese install <id>",
|
|
36
|
+
"skillsInstalling": "Instalando {id}...",
|
|
37
|
+
"skillsInstalled": "✅ Instalada: {id}",
|
|
38
|
+
"skillsAlreadyInstalled": "⚠️ {id} ya está instalada. ¿Reinstalar? (s/n) ",
|
|
39
|
+
"skillsReinstalled": "✅ Reinstalada: {id}",
|
|
40
|
+
"skillsRemoving": "Eliminando {id}...",
|
|
41
|
+
"skillsRemoved": "✅ Eliminada: {id}",
|
|
42
|
+
"skillsNotInstalled": "⚠️ {id} no está instalada.",
|
|
43
|
+
"skillsUpdating": "Actualizando todas las skills instaladas...",
|
|
44
|
+
"skillsUpdateDone": "✅ {count} skill(s) actualizada(s).",
|
|
45
|
+
"skillsUpdateNone": "No hay skills instaladas para actualizar.",
|
|
46
|
+
"skillsError": "❌ Error: {message}",
|
|
47
|
+
"skillsUnknownCommand": "Comando desconocido: {cmd}\n Uso: conectese skills list|install|remove|update",
|
|
48
|
+
"chooseSkills": "¿Qué skills quieres instalar? (opcional)",
|
|
49
|
+
"skillsEnvWarning": " Requiere: {vars}",
|
|
50
|
+
"skillsSkipped": "Puedes instalar skills después con: npx conectese install <nombre>",
|
|
51
|
+
"skillsInstalledCount": "{count} skill(s) instalada(s).",
|
|
52
|
+
"agentsNotInitialized": "Instalación de Conectese no encontrada. Ejecuta 'init' primero.",
|
|
53
|
+
"agentsInstalledHeader": "Instalados:",
|
|
54
|
+
"agentsNoneInstalled": "No hay agents instalados todavía.",
|
|
55
|
+
"agentsInstallHint": "Instala con: npx conectese agents install <id>",
|
|
56
|
+
"agentsInstalling": "Instalando {id}...",
|
|
57
|
+
"agentsInstalled": "✅ Instalado: {id}",
|
|
58
|
+
"agentsAlreadyInstalled": "⚠️ {id} ya está instalado. ¿Reinstalar? (s/n) ",
|
|
59
|
+
"agentsReinstalled": "✅ Reinstalado: {id}",
|
|
60
|
+
"agentsRemoving": "Eliminando {id}...",
|
|
61
|
+
"agentsRemoved": "✅ Eliminado: {id}",
|
|
62
|
+
"agentsNotInstalled": "⚠️ {id} no está instalado.",
|
|
63
|
+
"agentsUpdating": "Actualizando todos los agents instalados...",
|
|
64
|
+
"agentsUpdateDone": "✅ {count} agent(s) actualizado(s).",
|
|
65
|
+
"agentsUpdateNone": "No hay agents instalados para actualizar.",
|
|
66
|
+
"agentsError": "❌ Error: {message}",
|
|
67
|
+
"agentsUnknownCommand": "Comando desconocido: {cmd}\n Uso: conectese agents list|install|remove|update",
|
|
68
|
+
"step1VsCodeCopilot": "1. Abre este directorio en VS Code",
|
|
69
|
+
"step2VsCodeCopilot": "2. Abre el Copilot Chat (Ctrl+Alt+I)",
|
|
70
|
+
"step3VsCodeCopilot": "3. Escribe /conectese para empezar",
|
|
71
|
+
"tokenCostWarning": "Ejecutar squads consume tokens de IA (de pago). Monitorea tu consumo en tu IDE o en el dashboard de tu proveedor de IA."
|
|
72
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"welcome": "Bem-vindo! Vamos configurar o Conectese para o seu projeto.",
|
|
3
|
+
"askName": "Qual é o seu nome? → ",
|
|
4
|
+
"atLeastOneIde": "Selecione pelo menos uma IDE.",
|
|
5
|
+
"chooseIdes": "Quais IDEs/ferramentas você usa? (selecione todas que usa)",
|
|
6
|
+
"step1Codex": "1. Veja AGENTS.md na raiz do projeto para instruções do Codex",
|
|
7
|
+
"step1Antigravity": "1. Abra o Antigravity, digite / no chat e selecione conectese para começar.",
|
|
8
|
+
"step1Cursor": "1. Abra o Cursor, digite / no chat e selecione conectese para começar.",
|
|
9
|
+
"step1Opencode": "1. Abra o OpenCode e digite /conectese para começar.",
|
|
10
|
+
"ideNotAvailable": "⚠️ \"{label}\" ainda não está disponível. Escolha outra opção.",
|
|
11
|
+
"enterNumber": "Por favor, digite um número entre 1 e {max}.",
|
|
12
|
+
"alreadyInitialized": "⚠️ Conectese já está inicializado neste diretório.",
|
|
13
|
+
"alreadyInitializedHint": "Use o Claude Code e digite /conectese para começar.",
|
|
14
|
+
"createdFile": "📄 Criado {path}",
|
|
15
|
+
"success": "✅ Conectese inicializado com sucesso!",
|
|
16
|
+
"nextSteps": "Próximos passos:",
|
|
17
|
+
"step1ClaudeCode": "1. Abra este diretório no Claude Code",
|
|
18
|
+
"step2ClaudeCode": "2. Digite /conectese para iniciar o assistente",
|
|
19
|
+
"step3ClaudeCode": "3. Siga as instruções para configurar o perfil da sua empresa",
|
|
20
|
+
"comingSoon": "em breve",
|
|
21
|
+
"updateNotInitialized": "Nenhuma instalação do Conectese encontrada. Execute 'init' primeiro.",
|
|
22
|
+
"updateStarting": "Atualizando Conectese {old} → {new}...",
|
|
23
|
+
"updateStartingUnknown": "Atualizando Conectese (versão desconhecida) → {new}...",
|
|
24
|
+
"updatedFile": "📄 Atualizado {path}",
|
|
25
|
+
"updateSuccess": "✅ Conectese {version} instalado com sucesso!",
|
|
26
|
+
"updatePreserved": "✓ Preservado: _memory/, _investigations/, squads/",
|
|
27
|
+
"updateFileCount": "✓ Atualizados: {count} arquivos do sistema",
|
|
28
|
+
"updateLatestHint": "💡 Dica: Use 'npx conectese@latest update' para sempre obter a versão mais recente.",
|
|
29
|
+
"skillsNotInitialized": "Instalação Conectese não encontrada. Execute 'init' primeiro.",
|
|
30
|
+
"skillsFetching": "Buscando registro de skills...",
|
|
31
|
+
"skillsInstalledHeader": "Instaladas:",
|
|
32
|
+
"skillsAvailableHeader": "Disponíveis:",
|
|
33
|
+
"skillsNoneInstalled": "Nenhuma skill instalada ainda.",
|
|
34
|
+
"skillsNoneAvailable": "Nenhuma skill disponível no registro.",
|
|
35
|
+
"skillsInstallHint": "Instale com: npx conectese install <id>",
|
|
36
|
+
"skillsInstalling": "Instalando {id}...",
|
|
37
|
+
"skillsInstalled": "✅ Instalada: {id}",
|
|
38
|
+
"skillsAlreadyInstalled": "⚠️ {id} já está instalada. Reinstalar? (s/n) ",
|
|
39
|
+
"skillsReinstalled": "✅ Reinstalada: {id}",
|
|
40
|
+
"skillsRemoving": "Removendo {id}...",
|
|
41
|
+
"skillsRemoved": "✅ Removida: {id}",
|
|
42
|
+
"skillsNotInstalled": "⚠️ {id} não está instalada.",
|
|
43
|
+
"skillsUpdating": "Atualizando todas as skills instaladas...",
|
|
44
|
+
"skillsUpdateDone": "✅ {count} skill(s) atualizada(s).",
|
|
45
|
+
"skillsUpdateNone": "Nenhuma skill instalada para atualizar.",
|
|
46
|
+
"skillsError": "❌ Erro: {message}",
|
|
47
|
+
"skillsUnknownCommand": "Comando desconhecido: {cmd}\n Uso: conectese skills list|install|remove|update",
|
|
48
|
+
"chooseSkills": "Quais skills você quer instalar? (opcional)",
|
|
49
|
+
"skillsEnvWarning": " Requer: {vars}",
|
|
50
|
+
"skillsSkipped": "Você pode instalar skills depois com: npx conectese install <nome>",
|
|
51
|
+
"skillsInstalledCount": "{count} skill(s) instalada(s).",
|
|
52
|
+
"agentsNotInitialized": "Instalação Conectese não encontrada. Execute 'init' primeiro.",
|
|
53
|
+
"agentsInstalledHeader": "Instalados:",
|
|
54
|
+
"agentsNoneInstalled": "Nenhum agent instalado ainda.",
|
|
55
|
+
"agentsInstallHint": "Instale com: npx conectese agents install <id>",
|
|
56
|
+
"agentsInstalling": "Instalando {id}...",
|
|
57
|
+
"agentsInstalled": "✅ Instalado: {id}",
|
|
58
|
+
"agentsAlreadyInstalled": "⚠️ {id} já está instalado. Reinstalar? (s/n) ",
|
|
59
|
+
"agentsReinstalled": "✅ Reinstalado: {id}",
|
|
60
|
+
"agentsRemoving": "Removendo {id}...",
|
|
61
|
+
"agentsRemoved": "✅ Removido: {id}",
|
|
62
|
+
"agentsNotInstalled": "⚠️ {id} não está instalado.",
|
|
63
|
+
"agentsUpdating": "Atualizando todos os agents instalados...",
|
|
64
|
+
"agentsUpdateDone": "✅ {count} agent(s) atualizado(s).",
|
|
65
|
+
"agentsUpdateNone": "Nenhum agent instalado para atualizar.",
|
|
66
|
+
"agentsError": "❌ Erro: {message}",
|
|
67
|
+
"agentsUnknownCommand": "Comando desconhecido: {cmd}\n Uso: conectese agents list|install|remove|update",
|
|
68
|
+
"step1VsCodeCopilot": "1. Abra este diretório no VS Code",
|
|
69
|
+
"step2VsCodeCopilot": "2. Abra o Copilot Chat (Ctrl+Alt+I)",
|
|
70
|
+
"step3VsCodeCopilot": "3. Digite /conectese para começar",
|
|
71
|
+
"tokenCostWarning": "Executar squads consome tokens de IA (pagos). Monitore seu consumo na sua IDE ou no dashboard do provedor de IA."
|
|
72
|
+
}
|
package/src/logger.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { appendFile, mkdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
|
|
4
|
+
export async function logEvent(action, details = {}, targetDir = process.cwd()) {
|
|
5
|
+
try {
|
|
6
|
+
const logDir = join(targetDir, '_conectese', 'logs');
|
|
7
|
+
await mkdir(logDir, { recursive: true });
|
|
8
|
+
const entry = JSON.stringify({
|
|
9
|
+
timestamp: new Date().toISOString(),
|
|
10
|
+
action,
|
|
11
|
+
details,
|
|
12
|
+
});
|
|
13
|
+
await appendFile(join(logDir, 'cli.log'), entry + '\n', 'utf-8');
|
|
14
|
+
} catch {
|
|
15
|
+
// Silent — logging must never break the operation
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function readCliLogs({ action, limit } = {}, targetDir = process.cwd()) {
|
|
20
|
+
try {
|
|
21
|
+
const raw = await readFile(join(targetDir, '_conectese', 'logs', 'cli.log'), 'utf-8');
|
|
22
|
+
const lines = raw.trim().split('\n');
|
|
23
|
+
let entries = [];
|
|
24
|
+
for (const line of lines) {
|
|
25
|
+
try {
|
|
26
|
+
entries.push(JSON.parse(line));
|
|
27
|
+
} catch {
|
|
28
|
+
// Skip malformed lines
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
entries.reverse(); // newest first
|
|
32
|
+
if (action) entries = entries.filter((e) => e.action === action);
|
|
33
|
+
if (limit) entries = entries.slice(0, limit);
|
|
34
|
+
return entries;
|
|
35
|
+
} catch {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
}
|
package/src/prompt.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { t } from './i18n.js';
|
|
2
|
+
|
|
3
|
+
export function createPrompt() {
|
|
4
|
+
return {
|
|
5
|
+
async ask(question) {
|
|
6
|
+
const { default: input } = await import('@inquirer/input');
|
|
7
|
+
return input({ message: question });
|
|
8
|
+
},
|
|
9
|
+
async choose(question, options) {
|
|
10
|
+
const { default: select } = await import('@inquirer/select');
|
|
11
|
+
|
|
12
|
+
const choices = options.map(opt => ({
|
|
13
|
+
name: opt.label,
|
|
14
|
+
value: opt,
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
return select({
|
|
18
|
+
message: ` ${question}`,
|
|
19
|
+
choices,
|
|
20
|
+
loop: false,
|
|
21
|
+
});
|
|
22
|
+
},
|
|
23
|
+
async multiChoose(question, options, { validate } = {}) {
|
|
24
|
+
const { default: checkbox, Separator } = await import('@inquirer/checkbox');
|
|
25
|
+
|
|
26
|
+
const choices = options.map(opt => {
|
|
27
|
+
if (opt.separator) return new Separator(opt.label);
|
|
28
|
+
return {
|
|
29
|
+
name: opt.label,
|
|
30
|
+
value: opt.value,
|
|
31
|
+
checked: opt.checked ?? false,
|
|
32
|
+
disabled: opt.disabled ? t('comingSoon') : false,
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
return checkbox({
|
|
37
|
+
message: ` ${question}`,
|
|
38
|
+
choices,
|
|
39
|
+
loop: false,
|
|
40
|
+
validate: validate ?? ((selected) =>
|
|
41
|
+
selected.length > 0 || t('atLeastOneIde')),
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
close() {},
|
|
45
|
+
};
|
|
46
|
+
}
|