paris-immersion 0.1.12 → 0.1.13

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.
@@ -37,15 +37,6 @@ export interface ServeHandle {
37
37
  port: number;
38
38
  close: () => void;
39
39
  }
40
- /**
41
- * Descobre o slash-command do tutor pra injetar no kickoff. O `@tostudy-ai/cli`
42
- * instala o comando com nome ESPECÍFICO do curso (`.claude/commands/tostudy-<slug>.md`),
43
- * NÃO `/tostudy` — então cravar `/tostudy` dava "Unknown command: /tostudy" e o
44
- * curso não iniciava. Aqui varremos `.claude/commands/tostudy*.md` e usamos o
45
- * comando real; com vários cursos, casamos com o `slug` ativo do
46
- * `.tostudy/workspace.json`. Override explícito via PARIS_COACH_KICKOFF.
47
- * Fallback `/tostudy` (legado / antes do `tostudy` instalar o comando).
48
- */
49
40
  export declare function resolveKickoff(cwd: string): string;
50
41
  /**
51
42
  * Spawn the coached pty (`claude '/tostudy-<curso>'` inside the provisioned
@@ -79,6 +79,21 @@ const DEFAULT_ALLOWED_ORIGINS = [
79
79
  * `.tostudy/workspace.json`. Override explícito via PARIS_COACH_KICKOFF.
80
80
  * Fallback `/tostudy` (legado / antes do `tostudy` instalar o comando).
81
81
  */
82
+ // Fallback ROBUSTO quando o slash-command `/tostudy-<slug>` não existe (o
83
+ // `@tostudy-ai/cli` não rodou `init` no workspace, ou rodou DEPOIS do Claude
84
+ // subir — slash-commands carregam no startup, então um comando criado depois dá
85
+ // "Unknown command: /tostudy"). Em vez de cravar `/tostudy` (que erra), passamos
86
+ // um prompt de tutor em TEXTO: o Claude conduz o curso direto pela tostudy CLI
87
+ // (select/next/progress), sem depender de nenhum comando instalado. Sem apóstrofo
88
+ // no texto (o kickoff vai dentro de aspas simples no shell).
89
+ const COURSE_TUTOR_PROMPT = 'Você é o tutor do curso de onboarding da imersão Paris Group, rodando no terminal do aluno. ' +
90
+ 'Comece AGORA falando primeiro, em português — o aluno ainda não digitou nada. ' +
91
+ 'Antes de ensinar, prepare o curso da ToStudy em silêncio: rode no bash "tostudy courses --json" para ver o curso matriculado; ' +
92
+ 'rode "tostudy select <id-ou-número-do-curso>" para ativá-lo; e "tostudy progress --json" para ver onde o aluno parou. ' +
93
+ 'Depois conduza lição por lição, no ritmo do aluno, usando: "tostudy next" (avançar), "tostudy lesson" e "tostudy theory" (conteúdo da lição), ' +
94
+ '"tostudy hint" (dica) e "tostudy progress" (status). ' +
95
+ 'Se o tostudy não estiver disponível ou sem curso ativo, use as ferramentas MCP get_course e complete_lesson do paris como fallback. ' +
96
+ 'Dê as boas-vindas e já comece a primeira lição.';
82
97
  export function resolveKickoff(cwd) {
83
98
  const override = process.env.PARIS_COACH_KICKOFF;
84
99
  if (override)
@@ -102,7 +117,7 @@ export function resolveKickoff(cwd) {
102
117
  }
103
118
  }
104
119
  if (names.size === 0)
105
- return '/tostudy';
120
+ return COURSE_TUTOR_PROMPT;
106
121
  const all = [...names];
107
122
  // Curso ATIVO deste workspace = fonte da verdade pra escolher entre vários cursos.
108
123
  let slug = '';
@@ -126,7 +141,7 @@ export function resolveKickoff(cwd) {
126
141
  const courseSpecific = all.filter((n) => /^tostudy-.+/i.test(n)).sort();
127
142
  if (courseSpecific.length)
128
143
  return '/' + courseSpecific[0];
129
- return '/tostudy';
144
+ return COURSE_TUTOR_PROMPT;
130
145
  }
131
146
  /**
132
147
  * Spawn the coached pty (`claude '/tostudy-<curso>'` inside the provisioned
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import { daemonCommand, restartCommand } from './commands/daemon.js';
13
13
  const program = new Command()
14
14
  .name('paris')
15
15
  .description('Paris Immersion — CLI do aluno (login, workspace, tarefas)')
16
- .version('0.1.12');
16
+ .version('0.1.13');
17
17
  program
18
18
  .command('login')
19
19
  .description('Autenticar com sua conta Paris (device-code OR --token direto)')
@@ -139,7 +139,7 @@ async function main() {
139
139
  if (inCourse) {
140
140
  lines.push('## FASE DO CURSO DE ONBOARDING')
141
141
  lines.push('O aluno está na etapa do curso **' + course.title + '** (progresso: **' + course.lessonsCompleted + '/' + course.totalLessons + '**).')
142
- lines.push('Rode a skill **/tostudy** (o tutor da ToStudy) pra conduzir o curso — o aluno já chega logado na conta dele da ToStudy (auto-login no install). NÃO trabalhe em missões da imersão enquanto o curso não terminar. (Fallback: se a ToStudy não estiver disponível, use as ferramentas MCP **get_course**/**complete_lesson** do paris.)')
142
+ lines.push('Conduza o curso da ToStudy DIRETO pela CLI (o aluno já chega logado no install): rode no bash **tostudy courses --json**, depois **tostudy select <id>** pra ativar o curso, e ensine lição por lição com **tostudy next** / **tostudy progress** / **tostudy lesson** / **tostudy hint**. Se existir um slash-command **/tostudy-<curso>**, pode usá-lo. NÃO trabalhe em missões da imersão enquanto o curso não terminar. (Fallback: ferramentas MCP **get_course**/**complete_lesson** do paris.)')
143
143
  if (PHASE === 'session-start') {
144
144
  lines.push('')
145
145
  lines.push('**Comece falando primeiro**: rode /tostudy e dê as boas-vindas. O aluno ainda não digitou nada.')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paris-immersion",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "Paris Immersion CLI — login, install workspace, status, task control. Para alunos das imersões da Paris Group.",
5
5
  "homepage": "https://parisgroup.ai",
6
6
  "repository": {