@thiagodiogo/pscode 2.1.0 → 2.1.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/dist/core/init.js CHANGED
@@ -531,7 +531,10 @@ export class InitCommand {
531
531
  return 'exists';
532
532
  }
533
533
  try {
534
- const yamlContent = serializeConfig({ schema: DEFAULT_SCHEMA });
534
+ const globalConfig = getGlobalConfig();
535
+ const resolvedProfile = this.resolveProfileOverride() ?? (isValidProfile(globalConfig.profile ?? '') ? globalConfig.profile : DEFAULT_PROFILE);
536
+ const schema = resolvedProfile === 'dixi' ? 'pstld-workflow' : DEFAULT_SCHEMA;
537
+ const yamlContent = serializeConfig({ schema });
535
538
  await FileSystemUtils.writeFile(configPath, yamlContent);
536
539
  return 'created';
537
540
  }
@@ -589,7 +592,10 @@ export class InitCommand {
589
592
  }
590
593
  // Config status
591
594
  if (configStatus === 'created') {
592
- console.log(`Config: pscode/config.yaml (schema: ${DEFAULT_SCHEMA})`);
595
+ const globalCfgForSchema = getGlobalConfig();
596
+ const profileForSchema = this.resolveProfileOverride() ?? (isValidProfile(globalCfgForSchema.profile ?? '') ? globalCfgForSchema.profile : DEFAULT_PROFILE);
597
+ const createdSchema = profileForSchema === 'dixi' ? 'pstld-workflow' : DEFAULT_SCHEMA;
598
+ console.log(`Config: pscode/config.yaml (schema: ${createdSchema})`);
593
599
  }
594
600
  else if (configStatus === 'exists') {
595
601
  // Show actual filename (config.yaml or config.yml)
@@ -28,5 +28,6 @@ export declare function applyFeatureSlicedSkeleton(projectRoot: string): {
28
28
  skipped: number;
29
29
  };
30
30
  export declare function installEslintArchitectureTemplate(projectRoot: string): void;
31
+ export declare function copyDixiCommands(destRoot: string, srcDir: string, subdir: string): void;
31
32
  export declare function installDixiExtras(projectDir: string, stack: DixiStack | null): void;
32
33
  //# sourceMappingURL=dixi.d.ts.map
@@ -141,8 +141,6 @@ export function installDixiClaudeMd(projectDir, family) {
141
141
  fs.writeFileSync(claudeMdPath, templateContent, { encoding: 'utf-8' });
142
142
  }
143
143
  }
144
- const PSTLD_COMMANDS_SRC = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', 'pscode', 'content', 'dixi', 'claude-runtime', 'commands');
145
- const PSTLD_SKILLS_SRC = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', 'pscode', 'content', 'dixi', 'claude-runtime', 'skills');
146
144
  const HOOKS_SRC = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', 'pscode', 'content', 'dixi', 'claude-runtime', 'hooks');
147
145
  const DIXI_HOOK_ENTRIES = [
148
146
  { event: 'PreToolUse', matcher: 'Edit|Write', command: 'node .claude/hooks/arch-guard.mjs' },
@@ -296,6 +294,18 @@ export function installEslintArchitectureTemplate(projectRoot) {
296
294
  ' import architectureRules from \'./eslint-architecture.mjs\';\n' +
297
295
  ' export default [...existingConfig, ...architectureRules];\n');
298
296
  }
297
+ export function copyDixiCommands(destRoot, srcDir, subdir) {
298
+ if (!fs.existsSync(srcDir))
299
+ return;
300
+ const destDir = path.join(destRoot, '.claude', 'commands', subdir);
301
+ if (!fs.existsSync(destDir)) {
302
+ fs.mkdirSync(destDir, { recursive: true });
303
+ }
304
+ const files = fs.readdirSync(srcDir);
305
+ for (const file of files) {
306
+ fs.copyFileSync(path.join(srcDir, file), path.join(destDir, file));
307
+ }
308
+ }
299
309
  export function installDixiExtras(projectDir, stack) {
300
310
  const family = getDixiStackFamily(stack);
301
311
  // Resolve package content root: dist/core/presets/ → package root → pscode/content/dixi/
@@ -362,29 +372,6 @@ export function installDixiExtras(projectDir, stack) {
362
372
  else {
363
373
  console.log('[dixi] skeleton arquitetural: stack não reconhecida — skeleton não disponível para esta stack');
364
374
  }
365
- // Copy /pstld:* slash commands to .claude/commands/pstld/ (idempotent — overwrites)
366
- const pstldCommandsDir = path.join(projectDir, '.claude', 'commands', 'pstld');
367
- if (!fs.existsSync(pstldCommandsDir)) {
368
- fs.mkdirSync(pstldCommandsDir, { recursive: true });
369
- }
370
- if (fs.existsSync(PSTLD_COMMANDS_SRC)) {
371
- const files = fs.readdirSync(PSTLD_COMMANDS_SRC);
372
- for (const file of files) {
373
- fs.copyFileSync(path.join(PSTLD_COMMANDS_SRC, file), path.join(pstldCommandsDir, file));
374
- }
375
- }
376
- // Copy pstld-* skills to .claude/skills/<name>/SKILL.md (idempotent — overwrites)
377
- if (fs.existsSync(PSTLD_SKILLS_SRC)) {
378
- const skillFiles = fs.readdirSync(PSTLD_SKILLS_SRC).filter(f => f.endsWith('.md'));
379
- for (const file of skillFiles) {
380
- const skillName = file.replace(/\.md$/, '');
381
- const skillDir = path.join(projectDir, '.claude', 'skills', skillName);
382
- if (!fs.existsSync(skillDir)) {
383
- fs.mkdirSync(skillDir, { recursive: true });
384
- }
385
- fs.copyFileSync(path.join(PSTLD_SKILLS_SRC, file), path.join(skillDir, 'SKILL.md'));
386
- }
387
- }
388
375
  // Copy hooks to .claude/hooks/ (brownfield-safe: skip if file already exists)
389
376
  const hooksDestDir = path.join(projectDir, '.claude', 'hooks');
390
377
  if (!fs.existsSync(hooksDestDir)) {
@@ -401,5 +388,8 @@ export function installDixiExtras(projectDir, stack) {
401
388
  }
402
389
  // Merge .claude/settings.json with hook registrations (never overwrite existing config)
403
390
  mergeSettingsHooks(path.join(projectDir, '.claude', 'settings.json'));
391
+ // Copy Dixi-aware /ps:* overrides and exclusive /pstld:* commands (always overwrite)
392
+ const commandsBase = path.join(packageRoot, 'pscode', 'content', 'dixi', 'commands');
393
+ copyDixiCommands(projectDir, path.join(commandsBase, 'ps'), 'ps');
404
394
  }
405
395
  //# sourceMappingURL=dixi.js.map
@@ -17,8 +17,8 @@ export declare const PROFILES: {
17
17
  readonly workflows: readonly ["propose", "explore", "apply", "complete", "trello-setup", "draft"];
18
18
  };
19
19
  readonly dixi: {
20
- readonly description: "Dixi — RFC→Design→Tasks→Apply com guardrails para Java/Spring e React/Next.js";
21
- readonly workflows: readonly ["rfc", "design", "tasks", "apply", "arch-check", "adr", "jira-sync", "dod"];
20
+ readonly description: "Dixi — propose, explore, apply, complete com guardrails para Java/Spring e React/Next.js";
21
+ readonly workflows: readonly ["propose", "explore", "apply", "complete", "trello-setup", "draft"];
22
22
  };
23
23
  };
24
24
  export type ProfileName = keyof typeof PROFILES;
@@ -32,8 +32,8 @@ export const PROFILES = {
32
32
  workflows: ['propose', 'explore', 'apply', 'complete', 'trello-setup', 'draft'],
33
33
  },
34
34
  dixi: {
35
- description: 'Dixi — RFC→Design→Tasks→Apply com guardrails para Java/Spring e React/Next.js',
36
- workflows: ['rfc', 'design', 'tasks', 'apply', 'arch-check', 'adr', 'jira-sync', 'dod'],
35
+ description: 'Dixi — propose, explore, apply, complete com guardrails para Java/Spring e React/Next.js',
36
+ workflows: ['propose', 'explore', 'apply', 'complete', 'trello-setup', 'draft'],
37
37
  },
38
38
  };
39
39
  export const DEFAULT_PROFILE = 'standard';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thiagodiogo/pscode",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "AI-native system for spec-driven development",
5
5
  "keywords": [
6
6
  "pscode",
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: "PS: Apply (Dixi)"
3
+ description: Implement tasks with Dixi stack-aware context
4
+ category: Workflow
5
+ tags: [workflow, apply, dixi]
6
+ ---
7
+
8
+ Implement tasks with Dixi architectural awareness.
9
+
10
+ **Dixi preamble** (execute before starting implementation):
11
+ 1. Read `.pscode-dixi.yaml` (if present) to identify `stack` and `family`.
12
+ 2. Read `pastelsdd/context/architecture.md` (if present) to load architectural constraints — use them as guardrails during implementation.
13
+ 3. Read `pastelsdd/context/testing.md` (if present) to load testing conventions.
14
+
15
+ Then execute the standard `pscode-apply-change` skill instructions in full.
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: "PS: Archive (Dixi)"
3
+ description: Complete a change with Dixi stack-aware context
4
+ category: Workflow
5
+ tags: [workflow, archive, dixi]
6
+ ---
7
+
8
+ Complete and archive a change with Dixi awareness.
9
+
10
+ **Dixi preamble** (execute before archiving):
11
+ 1. Read `.pscode-dixi.yaml` (if present) to identify `stack` and `family`.
12
+ 2. Run `/pstld:dod` (or prompt the user to run it) to verify the Definition of Done before archiving.
13
+
14
+ Then execute the standard `pscode-archive-change` skill instructions in full.
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: "PS: Complete (Dixi)"
3
+ description: Complete a change with Dixi DoD verification
4
+ category: Workflow
5
+ tags: [workflow, complete, dixi]
6
+ ---
7
+
8
+ Complete a change with Dixi awareness.
9
+
10
+ **Dixi preamble** (execute before archiving):
11
+ 1. Read `.pscode-dixi.yaml` (if present) to identify `stack` and `family`.
12
+ 2. Read `pastelsdd/context/dod.md` (if present) and verify the Definition of Done before proceeding. If DoD criteria are not met, warn the user and ask whether to continue.
13
+
14
+ Then execute the standard `pscode-archive-change` skill instructions in full.
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: "PS: Draft (Dixi)"
3
+ description: "Capture a raw idea into the Backlog Trello list — frictionless, no refinement required"
4
+ category: Workflow
5
+ tags: [trello, draft, ideias, backlog, workflow, dixi]
6
+ ---
7
+
8
+ Capture uma ideia ou conceito bruto diretamente no Backlog do Trello.
9
+
10
+ **Input**: Texto após `/ps:draft` é a descrição da ideia (pode ser bem rascunho — palavras soltas, fragmentos, intuições vagas).
11
+ Se omitido, perguntar ao usuário.
12
+
13
+ Este comando é intencionalmente sem atrito. Diferente de `/ps:propose`, faz estruturação mínima — o objetivo é velocidade de captura, não clareza.
14
+
15
+ Then execute the standard `pscode-trello-draft` skill instructions in full.
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: "PS: Explore (Dixi)"
3
+ description: Explore mode with Dixi stack-aware context
4
+ category: Workflow
5
+ tags: [workflow, explore, dixi]
6
+ ---
7
+
8
+ Enter explore mode with Dixi architectural awareness.
9
+
10
+ **Dixi preamble** (execute before entering explore mode):
11
+ 1. Read `.pscode-dixi.yaml` (if present) to identify `stack` and `family`.
12
+ 2. Read `pastelsdd/context/architecture.md` (if present) to load architectural constraints — reference them when evaluating options and trade-offs.
13
+
14
+ Then execute the standard `pscode-explore` skill instructions in full.
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: "PS: Propose (Dixi)"
3
+ description: Propose a new change with Dixi stack-aware context
4
+ category: Workflow
5
+ tags: [workflow, artifacts, propose, dixi]
6
+ ---
7
+
8
+ Propose a new change with Dixi architectural awareness.
9
+
10
+ **Dixi preamble** (execute before generating any artifact):
11
+ 1. Read `.pscode-dixi.yaml` (if present) to identify `stack` and `family`.
12
+ 2. Read `pastelsdd/context/architecture.md` (if present) to load architectural constraints — use them as guardrails when writing the proposal and design.
13
+
14
+ Then execute the standard `pscode-propose` skill instructions in full.
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: "PS: Trello Setup (Dixi)"
3
+ description: "Configure Trello integration for your Pscode workflow — checks MCP, reads or creates a board, and writes pscode/trello.yaml"
4
+ category: Setup
5
+ tags: [trello, setup, integration, config, dixi]
6
+ ---
7
+
8
+ Configure Trello integration for your Pscode workflow.
9
+
10
+ This skill writes `pscode/trello.yaml` — a small config file that all Trello-aware commands
11
+ (`/ps:draft`, `/ps:propose`, `/ps:apply`, `/ps:complete`) read at runtime to know which
12
+ Trello list corresponds to each workflow stage and which labels are available.
13
+
14
+ Then execute the standard `pscode-trello-setup` skill instructions in full.
@@ -0,0 +1,75 @@
1
+ # /pstld:adr — Geração de Architecture Decision Record
2
+
3
+ Você é um arquiteto técnico criando um ADR (Architecture Decision Record) formal para documentar uma decisão arquitetural.
4
+
5
+ ## Passos
6
+
7
+ 1. **Colete a decisão**
8
+
9
+ Se o usuário descreveu a decisão como argumento, use-a. Caso contrário, pergunte:
10
+ - Qual decisão arquitetural precisa ser documentada?
11
+ - Por que essa decisão está sendo tomada agora?
12
+ - Quais alternativas foram ou poderiam ser consideradas?
13
+
14
+ 2. **Contextualize com o projeto** (opcional)
15
+
16
+ - Leia `.pscode-dixi.yaml` se existir para identificar stack e família do projeto.
17
+ - Isso ajuda a formatar o ADR com referências corretas à arquitetura do projeto.
18
+
19
+ 3. **Gere o ADR**
20
+
21
+ Crie o documento no seguinte formato:
22
+
23
+ ```markdown
24
+ # ADR-NNN: <título descritivo e conciso>
25
+
26
+ **Status:** Aceita | Proposta | Obsoleta | Substituída por ADR-XXX
27
+ **Data:** <data atual>
28
+ **Contexto:** <stack/módulo afetado, se aplicável>
29
+
30
+ ## Contexto
31
+
32
+ <Descreve a situação atual, o problema a resolver e as forças em jogo.
33
+ Inclui restrições técnicas, de negócio ou operacionais relevantes.>
34
+
35
+ ## Decisão
36
+
37
+ <Enuncia a decisão tomada de forma afirmativa e clara.
38
+ Ex: "Usaremos X para Y porque Z.">
39
+
40
+ ## Alternativas Consideradas
41
+
42
+ ### Opção A: <nome>
43
+ - **Prós:** ...
44
+ - **Contras:** ...
45
+
46
+ ### Opção B: <nome>
47
+ - **Prós:** ...
48
+ - **Contras:** ...
49
+
50
+ ## Consequências
51
+
52
+ ### Positivas
53
+ - ...
54
+
55
+ ### Negativas / Trade-offs
56
+ - ...
57
+
58
+ ### Neutras / Observações
59
+ - ...
60
+
61
+ ## Referências
62
+ - <links, docs, issues relacionadas>
63
+ ```
64
+
65
+ 4. **Numbering**
66
+
67
+ Pergunte ao usuário qual número usar para o ADR (ADR-001, ADR-002, etc.) ou sugira verificar o diretório `docs/adr/` para o próximo número disponível.
68
+
69
+ 5. **Salvar o arquivo**
70
+
71
+ Pergunte se o usuário quer salvar o ADR em:
72
+ - `docs/adr/ADR-NNN-<slug>.md` (padrão recomendado)
73
+ - Outro local preferido pelo time
74
+
75
+ Se o usuário confirmar, crie o arquivo no local indicado.
@@ -0,0 +1,64 @@
1
+ # /pstld:arch-check — Verificação de conformidade arquitetural
2
+
3
+ Você é um guardião de arquitetura verificando se o código atual respeita as regras definidas para o projeto.
4
+
5
+ ## Passos
6
+
7
+ 1. **Leia o contexto do projeto**
8
+
9
+ - Leia `.pscode-dixi.yaml` na raiz do projeto para determinar `stack` e `family`.
10
+ - Leia `pastelsdd/context/architecture.md` para carregar as regras arquiteturais vigentes.
11
+ - Se `pastelsdd/context/architecture.md` não existir, informe o usuário e sugira `pscode init --profile dixi` para instalar os context docs.
12
+
13
+ 2. **Determine o escopo da verificação**
14
+
15
+ Se o usuário especificou um escopo (arquivo, módulo, camada), foque nele.
16
+ Caso contrário, pergunte: verificação pontual (mudança atual) ou varredura ampla (módulo/serviço)?
17
+
18
+ 3. **Execute a verificação de acordo com a stack**
19
+
20
+ ### Java / Spring (Arquitetura Hexagonal)
21
+
22
+ Verifique as seguintes regras (conforme `pastelsdd/context/architecture.md`):
23
+
24
+ - **Regra de dependência:** `infrastructure → application → domain`. Imports proibidos:
25
+ - `domain.*` importando `application.*` ou `infrastructure.*`
26
+ - `application.*` importando `infrastructure.*`
27
+ - **Nomenclatura por camada:** entidades sem sufixo em `domain/entity/`, use cases em `application/usecase/`, ports em `application/port/in/` e `application/port/out/`, adapters em `infrastructure/adapter/`
28
+ - **Pureza do domínio:** `domain/` sem anotações de framework (Spring, JPA, etc.)
29
+ - **Acesso via interfaces:** adapters acessam `application` somente via ports
30
+
31
+ ### React / Next.js (Feature-Sliced Design)
32
+
33
+ Verifique as seguintes regras (conforme `pastelsdd/context/architecture.md`):
34
+
35
+ - **Isolamento de features:** imports cruzados entre features são proibidos (feature A não importa de feature B)
36
+ - **Camadas permitidas:** `app → pages → widgets → features → entities → shared`
37
+ - **Shared é agnóstico:** `shared/` não importa de nenhuma outra camada
38
+ - **Lógica em pages/app:** lógica de negócio inline em `pages/` ou `app/` é um warning
39
+
40
+ ### Stack não detectada
41
+
42
+ Execute verificações genéricas: acoplamento excessivo, imports circulares, violações de separação de responsabilidades visíveis no código.
43
+
44
+ 4. **Reporte os resultados**
45
+
46
+ ```markdown
47
+ ## Resultado da Verificação Arquitetural
48
+
49
+ **Stack:** <detectada>
50
+ **Escopo:** <arquivos/módulos analisados>
51
+
52
+ ### Violações Encontradas
53
+ | Arquivo | Linha | Regra Violada | Severidade |
54
+ |---------|-------|---------------|------------|
55
+ | ... | ... | ... | ERRO/WARN |
56
+
57
+ ### Conformidades Verificadas ✅
58
+ - <regra OK>
59
+
60
+ ### Recomendações
61
+ - <ação corretiva para cada violação>
62
+ ```
63
+
64
+ 5. **Se não houver violações**, confirme que o código está em conformidade com `pastelsdd/context/architecture.md`.
@@ -0,0 +1,66 @@
1
+ # /pstld:dod — Verificação de Definition of Done
2
+
3
+ Você é um quality gate verificando se o item de trabalho corrente atende todos os critérios de Definition of Done do projeto.
4
+
5
+ ## Passos
6
+
7
+ 1. **Leia os critérios de DoD**
8
+
9
+ - Leia `pastelsdd/context/dod.md` para carregar os critérios oficiais de DoD do projeto.
10
+ - Se `pastelsdd/context/dod.md` não existir, informe o usuário:
11
+ ```
12
+ ℹ️ Arquivo pastelsdd/context/dod.md não encontrado.
13
+ Execute pscode init --profile dixi para instalar os context docs da Dixi.
14
+ Enquanto isso, usarei critérios genéricos de DoD.
15
+ ```
16
+ Use os critérios genéricos listados no passo 3.
17
+
18
+ 2. **Identifique o item em progresso**
19
+
20
+ Pergunte ao usuário (se não fornecido como argumento):
21
+ - Qual é o item sendo avaliado? (nome da feature, ticket JIRA, change do pscode)
22
+ - Há contexto adicional relevante (PR aberto, branch, change name)?
23
+
24
+ 3. **Verifique cada critério**
25
+
26
+ Para cada critério em `pastelsdd/context/dod.md` (ou os genéricos abaixo), avalie o estado atual:
27
+
28
+ **Critérios genéricos (usados quando dod.md não existe):**
29
+ - Código implementado e funcionando
30
+ - Testes unitários escritos e passando
31
+ - Testes de integração cobrindo o fluxo principal
32
+ - Code review realizado ou solicitado
33
+ - Documentação atualizada (se aplicável)
34
+ - Sem violações de arquitetura detectadas
35
+ - Build passando sem erros
36
+ - Deploy em ambiente de testes validado
37
+
38
+ 4. **Produza o relatório de DoD**
39
+
40
+ ```markdown
41
+ ## Definition of Done — <nome do item>
42
+
43
+ **Data:** <data atual>
44
+ **Fonte dos critérios:** pastelsdd/context/dod.md | critérios genéricos
45
+
46
+ | Critério | Status | Observação |
47
+ |----------|--------|------------|
48
+ | <critério 1> | ✅ Atendido | ... |
49
+ | <critério 2> | ❌ Pendente | <o que falta> |
50
+ | <critério 3> | ⚠️ Parcial | <o que está incompleto> |
51
+
52
+ ### Resumo
53
+ - ✅ Atendidos: N
54
+ - ❌ Pendentes: N
55
+ - ⚠️ Parciais: N
56
+
57
+ ### Próximos Passos
58
+ <lista das ações necessárias para completar os critérios pendentes>
59
+
60
+ **Conclusão:** ✅ Pronto para entrega | ❌ Não está pronto — N critérios pendentes
61
+ ```
62
+
63
+ 5. **Orientação final**
64
+
65
+ - Se todos os critérios estiverem atendidos: sugira `/ps:complete` para arquivar a change.
66
+ - Se houver pendências: liste as ações prioritárias para concluir o item.
@@ -0,0 +1,80 @@
1
+ # /pstld:jira-draft — Criar rascunho de issue JIRA
2
+
3
+ Você é um assistente de integração JIRA criando uma issue a partir do contexto da change atual.
4
+
5
+ ## Passos
6
+
7
+ 1. **Leia a configuração JIRA local**
8
+
9
+ Leia o arquivo `pastelsdd/jira.yaml` na raiz do projeto.
10
+
11
+ - **Se o arquivo não existir ou `configured: false`:**
12
+ ```
13
+ ℹ️ Integração JIRA não configurada.
14
+ Execute /pstld:jira-setup para configurar o projeto, tipo de issue e transição "done".
15
+ ```
16
+ Encerre aqui.
17
+
18
+ 2. **Identifique a change ativa**
19
+
20
+ Verifique se há uma change ativa em `pscode/changes/`. Se houver exatamente uma, use-a. Se houver várias, peça ao usuário para especificar. Se não houver nenhuma, solicite título e descrição manualmente.
21
+
22
+ - **Se a change for identificada:** leia `proposal.md` e `.pscode.yaml` para extrair título e contexto.
23
+ - **Se não houver change:** solicite título e descrição ao usuário antes de continuar.
24
+
25
+ 3. **Verifique disponibilidade do MCP Atlassian**
26
+
27
+ Tente obter informações do usuário autenticado:
28
+
29
+ ```tool
30
+ mcp__atlassian__get_current_user
31
+ ```
32
+
33
+ - **Se falhar:**
34
+ ```
35
+ ⚠️ MCP Atlassian não está disponível nesta sessão.
36
+ Verifique se o servidor MCP está configurado em .mcp.json e reinicie o Claude Code.
37
+ ```
38
+ Encerre aqui.
39
+
40
+ 4. **Crie a issue JIRA**
41
+
42
+ Use os dados de `jira.yaml` (`projectKey`, `defaultIssueType`) e o contexto da change para criar a issue:
43
+
44
+ ```tool
45
+ mcp__atlassian__create_issue
46
+ project: <projectKey de jira.yaml>
47
+ summary: <título da change>
48
+ description: <descrição derivada do proposal.md ou fornecida pelo usuário>
49
+ issuetype: <defaultIssueType de jira.yaml>
50
+ ```
51
+
52
+ 5. **Vincule a issue à change**
53
+
54
+ Se a issue for criada com sucesso e a change for identificada, grave o `jiraIssueKey` no `.pscode.yaml` da change:
55
+
56
+ - Leia o `.pscode.yaml` atual
57
+ - Adicione ou atualize o campo `jiraIssueKey` com a chave retornada (ex: `PROJ-123`)
58
+ - Salve o arquivo
59
+
60
+ 6. **Exiba o resultado**
61
+
62
+ ```markdown
63
+ ## Issue JIRA Criada ✅
64
+
65
+ **Issue:** <jiraIssueKey>
66
+ **Título:** <summary>
67
+ **Projeto:** <projectKey>
68
+ **Tipo:** <defaultIssueType>
69
+ **Link:** <url da issue>
70
+
71
+ O campo `jiraIssueKey` foi gravado em `.pscode.yaml`.
72
+ Ao executar `pscode complete`, a issue será transitada para "done" automaticamente.
73
+ ```
74
+
75
+ 7. **Tratamento de erros**
76
+
77
+ Para qualquer falha não coberta acima, exiba uma mensagem descritiva e sugira:
78
+ - Verificar conectividade de rede
79
+ - Confirmar permissões do token Atlassian
80
+ - Verificar `projectKey` e `defaultIssueType` em `pastelsdd/jira.yaml`