@thiagodiogo/pscode 2.2.0 → 2.2.2

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 (32) hide show
  1. package/dist/core/complete.js +2 -1
  2. package/dist/core/init.js +6 -5
  3. package/dist/core/jira-transition.js +2 -1
  4. package/dist/core/presets/dixi.d.ts +8 -1
  5. package/dist/core/presets/dixi.js +33 -4
  6. package/dist/core/templates/workflows/apply-change.js +3 -1
  7. package/dist/core/templates/workflows/propose.js +4 -1
  8. package/dist/core/templates/workflows/trello-draft.js +0 -4
  9. package/dist/core/templates/workflows/trello-next-step-comment.d.ts +10 -0
  10. package/dist/core/templates/workflows/trello-next-step-comment.js +18 -3
  11. package/package.json +1 -1
  12. package/pscode/content/dixi/claude-runtime/CLAUDE.md.java.template +7 -7
  13. package/pscode/content/dixi/claude-runtime/CLAUDE.md.react.template +7 -7
  14. package/pscode/content/dixi/claude-runtime/commands/arch-check.md +5 -5
  15. package/pscode/content/dixi/claude-runtime/commands/dod.md +5 -5
  16. package/pscode/content/dixi/claude-runtime/commands/jira-draft.md +2 -2
  17. package/pscode/content/dixi/claude-runtime/commands/jira-setup.md +3 -3
  18. package/pscode/content/dixi/claude-runtime/commands/jira-sync.md +8 -8
  19. package/pscode/content/dixi/claude-runtime/commands/rfc.md +3 -3
  20. package/pscode/content/dixi/claude-runtime/hooks/arch-guard.mjs +2 -2
  21. package/pscode/content/dixi/claude-runtime/hooks/jira-context.mjs +1 -1
  22. package/pscode/content/dixi/claude-runtime/skills/pstld-arch-guardian.md +3 -3
  23. package/pscode/content/dixi/claude-runtime/skills/pstld-commit-crafter.md +2 -2
  24. package/pscode/content/dixi/claude-runtime/skills/pstld-jira-context.md +2 -2
  25. package/pscode/content/dixi/commands/ps/apply.md +2 -2
  26. package/pscode/content/dixi/commands/ps/complete.md +1 -1
  27. package/pscode/content/dixi/commands/ps/explore.md +1 -1
  28. package/pscode/content/dixi/commands/ps/propose.md +1 -1
  29. package/pscode/content/dixi/commands/pstld/arch-check.md +5 -5
  30. package/pscode/content/dixi/commands/pstld/dod.md +5 -5
  31. package/pscode/content/dixi/commands/pstld/jira-draft.md +2 -2
  32. package/LICENSE +0 -22
@@ -6,6 +6,7 @@ import chalk from 'chalk';
6
6
  import { findSpecUpdates, buildUpdatedSpec, writeUpdatedSpec, } from './specs-apply.js';
7
7
  import { readChangeMetadata } from '../utils/change-metadata.js';
8
8
  import { readJiraConfig, tryTransitionJiraIssue } from './jira-transition.js';
9
+ import { PSCODE_DIR_NAME } from './config.js';
9
10
  /**
10
11
  * Recursively copy a directory. Used when fs.rename fails (e.g. EPERM on Windows).
11
12
  */
@@ -254,7 +255,7 @@ export class CompleteCommand {
254
255
  }
255
256
  }
256
257
  else {
257
- console.log(chalk.yellow(`JIRA: jiraIssueKey "${changeMetadata.jiraIssueKey}" encontrado, mas transitions.done não está configurado em pastelsdd/jira.yaml. ` +
258
+ console.log(chalk.yellow(`JIRA: jiraIssueKey "${changeMetadata.jiraIssueKey}" encontrado, mas transitions.done não está configurado em ${PSCODE_DIR_NAME}/jira.yaml. ` +
258
259
  `Execute /pstld:jira-setup para configurar.`));
259
260
  }
260
261
  }
package/dist/core/init.js CHANGED
@@ -22,7 +22,7 @@ import { runTrelloInitPrompt } from './trello-init-prompt.js';
22
22
  import { getToolsWithSkillsDir, getToolStates, getSkillTemplates, getCommandContents, generateSkillContent, } from './shared/index.js';
23
23
  import { getGlobalConfig } from './global-config.js';
24
24
  import { getProfileWorkflows, isValidProfile, DEFAULT_PROFILE, PROFILES, ALL_WORKFLOWS } from './profiles.js';
25
- import { detectDixiStack, getDixiStackFamily, getDixiStackLabel, installDixiExtras } from './presets/dixi.js';
25
+ import { detectDixiStack, getDixiStackFamily, getDixiStackLabel, installDixiExtras, migrateLegacyPastelsddDir } from './presets/dixi.js';
26
26
  import { stringify as stringifyYaml } from 'yaml';
27
27
  import { parse as parseYaml } from 'yaml';
28
28
  import { getAvailableTools } from './available-tools.js';
@@ -715,9 +715,10 @@ export class InitCommand {
715
715
  console.log();
716
716
  }
717
717
  async generateJiraFiles(projectPath) {
718
- const pastelsddPath = path.join(projectPath, 'pastelsdd');
719
- await FileSystemUtils.createDirectory(pastelsddPath);
720
- const jiraYamlPath = path.join(pastelsddPath, 'jira.yaml');
718
+ migrateLegacyPastelsddDir(projectPath);
719
+ const pscodeDirPath = path.join(projectPath, PSCODE_DIR_NAME);
720
+ await FileSystemUtils.createDirectory(pscodeDirPath);
721
+ const jiraYamlPath = path.join(pscodeDirPath, 'jira.yaml');
721
722
  if (!fs.existsSync(jiraYamlPath)) {
722
723
  const content = `project_key: ""\nboard_url: ""\nconfigured: false\ntransitions:\n done: ""\n`;
723
724
  await FileSystemUtils.writeFile(jiraYamlPath, content);
@@ -743,7 +744,7 @@ export class InitCommand {
743
744
  mcpConfig.mcpServers = mcpServers;
744
745
  await FileSystemUtils.writeFile(mcpJsonPath, JSON.stringify(mcpConfig, null, 2) + '\n');
745
746
  }
746
- console.log('JIRA: edite pastelsdd/jira.yaml com project_key e board_url, depois use /pstld:jira-sync para testar a conexão.');
747
+ console.log(`JIRA: edite ${PSCODE_DIR_NAME}/jira.yaml com project_key e board_url, depois use /pstld:jira-sync para testar a conexão.`);
747
748
  }
748
749
  async handleDixiExtras(projectPath) {
749
750
  const globalConfig = getGlobalConfig();
@@ -1,8 +1,9 @@
1
1
  import { promises as fs } from 'fs';
2
2
  import path from 'path';
3
3
  import { parse as parseYaml } from 'yaml';
4
+ import { PSCODE_DIR_NAME } from './config.js';
4
5
  export async function readJiraConfig(projectDir) {
5
- const jiraYamlPath = path.join(projectDir, 'pastelsdd', 'jira.yaml');
6
+ const jiraYamlPath = path.join(projectDir, PSCODE_DIR_NAME, 'jira.yaml');
6
7
  try {
7
8
  const content = await fs.readFile(jiraYamlPath, 'utf-8');
8
9
  return parseYaml(content);
@@ -12,7 +12,14 @@ export declare function copyKitFiles(sourceDir: string, targetDir: string, optio
12
12
  overwrite?: string[];
13
13
  }): void;
14
14
  /**
15
- * Copies all files from srcDir into <destRoot>/pastelsdd/context/, skipping files that already exist.
15
+ * Best-effort, non-destructive migration of the legacy `pastelsdd/` output dir
16
+ * to the canonical `pscode/` dir. Moves `pastelsdd/jira.yaml` and
17
+ * `pastelsdd/context/` to their `pscode/` equivalents only when the destination
18
+ * does not already exist (never overwrites). No-op when there is nothing to move.
19
+ */
20
+ export declare function migrateLegacyPastelsddDir(projectDir: string): void;
21
+ /**
22
+ * Copies all files from srcDir into <destRoot>/<PSCODE_DIR_NAME>/context/, skipping files that already exist.
16
23
  * Creates the destination directory if needed.
17
24
  */
18
25
  export declare function copyContextDocs(destRoot: string, srcDir: string): void;
@@ -2,6 +2,7 @@ import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import { fileURLToPath } from 'url';
4
4
  import { parse as parseYaml } from 'yaml';
5
+ import { PSCODE_DIR_NAME } from '../config.js';
5
6
  export function detectDixiStack(projectDir) {
6
7
  if (fs.existsSync(path.join(projectDir, 'pom.xml')))
7
8
  return 'java-maven';
@@ -88,13 +89,39 @@ export function copyKitFiles(sourceDir, targetDir, options = {}) {
88
89
  copyDir(sourceDir, targetDir);
89
90
  }
90
91
  /**
91
- * Copies all files from srcDir into <destRoot>/pastelsdd/context/, skipping files that already exist.
92
+ * Best-effort, non-destructive migration of the legacy `pastelsdd/` output dir
93
+ * to the canonical `pscode/` dir. Moves `pastelsdd/jira.yaml` and
94
+ * `pastelsdd/context/` to their `pscode/` equivalents only when the destination
95
+ * does not already exist (never overwrites). No-op when there is nothing to move.
96
+ */
97
+ export function migrateLegacyPastelsddDir(projectDir) {
98
+ const legacyDir = path.join(projectDir, 'pastelsdd');
99
+ if (!fs.existsSync(legacyDir))
100
+ return;
101
+ const targets = ['jira.yaml', 'context'];
102
+ let moved = false;
103
+ for (const entry of targets) {
104
+ const legacyPath = path.join(legacyDir, entry);
105
+ const destPath = path.join(projectDir, PSCODE_DIR_NAME, entry);
106
+ if (fs.existsSync(legacyPath) && !fs.existsSync(destPath)) {
107
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
108
+ fs.renameSync(legacyPath, destPath);
109
+ moved = true;
110
+ }
111
+ }
112
+ if (moved) {
113
+ console.log(`Dixi: conteúdo legado migrado de pastelsdd/ para ${PSCODE_DIR_NAME}/. ` +
114
+ `Você pode remover o diretório pastelsdd/ manualmente após conferir.`);
115
+ }
116
+ }
117
+ /**
118
+ * Copies all files from srcDir into <destRoot>/<PSCODE_DIR_NAME>/context/, skipping files that already exist.
92
119
  * Creates the destination directory if needed.
93
120
  */
94
121
  export function copyContextDocs(destRoot, srcDir) {
95
122
  if (!fs.existsSync(srcDir))
96
123
  return;
97
- const contextDir = path.join(destRoot, 'pastelsdd', 'context');
124
+ const contextDir = path.join(destRoot, PSCODE_DIR_NAME, 'context');
98
125
  if (!fs.existsSync(contextDir)) {
99
126
  fs.mkdirSync(contextDir, { recursive: true });
100
127
  }
@@ -313,8 +340,10 @@ export function installDixiExtras(projectDir, stack) {
313
340
  const packageRoot = path.join(path.dirname(currentFile), '..', '..', '..');
314
341
  const contentBase = path.join(packageRoot, 'pscode', 'content', 'dixi', 'context');
315
342
  const kitBase = path.join(packageRoot, 'pscode', 'content', 'dixi', 'kit');
316
- // Task 4.5: Ensure pastelsdd/context/ exists in the client repo
317
- const contextDir = path.join(projectDir, 'pastelsdd', 'context');
343
+ // Best-effort migration of the legacy pastelsdd/ dir before writing context
344
+ migrateLegacyPastelsddDir(projectDir);
345
+ // Task 4.5: Ensure <PSCODE_DIR_NAME>/context/ exists in the client repo
346
+ const contextDir = path.join(projectDir, PSCODE_DIR_NAME, 'context');
318
347
  if (!fs.existsSync(contextDir)) {
319
348
  fs.mkdirSync(contextDir, { recursive: true });
320
349
  }
@@ -1,4 +1,4 @@
1
- import { buildNextStepComment } from './trello-next-step-comment.js';
1
+ import { buildNextStepComment, buildNextStepReminder } from './trello-next-step-comment.js';
2
2
  export function getApplyChangeSkillTemplate() {
3
3
  return {
4
4
  name: 'pscode-apply-change',
@@ -25,6 +25,7 @@ function getApplyInstructions() {
25
25
  .split('\n')
26
26
  .map((line) => (line.length > 0 ? ` ${line}` : ''))
27
27
  .join('\n');
28
+ const completeReminder = buildNextStepReminder('<card title>', '/ps:complete');
28
29
  return `Implement tasks from a Pscode change.
29
30
 
30
31
  **Input**: Optionally specify a change name (e.g., \`/ps:apply add-auth\`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes.
@@ -197,6 +198,7 @@ function getApplyInstructions() {
197
198
  mcp__claude_ai_Trello_Custom__update_card { card_id: "<cardId>", list_id: "<lists.deploy.id>" }
198
199
  \`\`\`
199
200
  b. Add a comment in Portuguese:
201
+ ${completeReminder}
200
202
  \`\`\`tool
201
203
  mcp__claude_ai_Trello_Custom__add_comment
202
204
  card_id: "<cardId>"
@@ -1,4 +1,4 @@
1
- import { buildNextStepComment } from './trello-next-step-comment.js';
1
+ import { buildNextStepComment, buildNextStepReminder } from './trello-next-step-comment.js';
2
2
  export function getProposeSkillTemplate() {
3
3
  return {
4
4
  name: 'pscode-propose',
@@ -25,6 +25,7 @@ function getProposeInstructions() {
25
25
  .split('\n')
26
26
  .map((line) => (line.length > 0 ? ` ${line}` : ''))
27
27
  .join('\n');
28
+ const applyReminder = buildNextStepReminder('<card title>', '/ps:apply');
28
29
  return `Propose a new change - create the change and generate all artifacts in one step.
29
30
 
30
31
  I'll create a change with artifacts:
@@ -233,6 +234,7 @@ update the card with the refinement content **before** asking for approval.
233
234
  \`\`\`
234
235
 
235
236
  2. **Add a refinement comment** in Portuguese (if \`cardId\` exists):
237
+ ${applyReminder}
236
238
  \`\`\`tool
237
239
  mcp__claude_ai_Trello_Custom__add_comment
238
240
  card_id: "<cardId>"
@@ -283,6 +285,7 @@ Now just move the card and register the explicit approval.
283
285
  \`\`\`
284
286
 
285
287
  2. **Add a final Trello comment** (if cardId exists):
288
+ ${applyReminder}
286
289
  \`\`\`tool
287
290
  mcp__claude_ai_Trello_Custom__add_comment
288
291
  card_id: "<cardId>"
@@ -140,10 +140,6 @@ Save the returned card \`id\` as \`cardId\` and \`url\` as \`cardUrl\`.
140
140
 
141
141
  ## Step 7 — Add next-step comment
142
142
 
143
- Add a comment to the card with the command to take this task to the next stage,
144
- with the card title (\`<title>\` from Step 3) pre-filled as the quoted argument so
145
- it is ready to copy and paste.
146
-
147
143
  ${getNextStepCommentInstructionBlock('<title>', '/ps:propose')}
148
144
 
149
145
  ---
@@ -20,6 +20,16 @@
20
20
  * is null, undefined or empty.
21
21
  */
22
22
  export declare function buildNextStepComment(cardName: string, nextCommand: string, fallbackChangeName?: string): string;
23
+ /**
24
+ * Returns a one-line reminder telling the agent to substitute the placeholder
25
+ * title with the real card title before posting, so the embedded next-step
26
+ * command is never left without its quoted argument. Use it right before tool
27
+ * blocks that interpolate `buildNextStepComment` output directly (propose, apply).
28
+ *
29
+ * @param cardName The placeholder shown in the generated command (e.g. "<card title>").
30
+ * @param nextCommand The command to advance the workflow (e.g. "/ps:apply").
31
+ */
32
+ export declare function buildNextStepReminder(cardName: string, nextCommand: string): string;
23
33
  /**
24
34
  * Returns the instruction block embedded inside a workflow skill template. It
25
35
  * tells the AI agent to post a next-step comment built via `buildNextStepComment`,
@@ -64,6 +64,19 @@ ${label}, rode:
64
64
  ${command} "${argument}"
65
65
  \`\`\``;
66
66
  }
67
+ /**
68
+ * Returns a one-line reminder telling the agent to substitute the placeholder
69
+ * title with the real card title before posting, so the embedded next-step
70
+ * command is never left without its quoted argument. Use it right before tool
71
+ * blocks that interpolate `buildNextStepComment` output directly (propose, apply).
72
+ *
73
+ * @param cardName The placeholder shown in the generated command (e.g. "<card title>").
74
+ * @param nextCommand The command to advance the workflow (e.g. "/ps:apply").
75
+ */
76
+ export function buildNextStepReminder(cardName, nextCommand) {
77
+ const command = normalizeCommand(nextCommand);
78
+ return `**IMPORTANT**: Replace \`${cardName}\` below with the actual card title — the command **must always** include the quoted title argument, never post \`${command}\` by itself.`;
79
+ }
67
80
  /**
68
81
  * Returns the instruction block embedded inside a workflow skill template. It
69
82
  * tells the AI agent to post a next-step comment built via `buildNextStepComment`,
@@ -74,15 +87,17 @@ ${command} "${argument}"
74
87
  * @param nextCommand The command to advance the workflow (e.g. "/ps:apply").
75
88
  */
76
89
  export function getNextStepCommentInstructionBlock(cardName, nextCommand) {
90
+ const command = normalizeCommand(nextCommand);
77
91
  const comment = buildNextStepComment(cardName, nextCommand);
78
92
  const indented = comment
79
93
  .split('\n')
80
94
  .map((line) => (line.length > 0 ? ` ${line}` : ''))
81
95
  .join('\n');
82
- return `## Step Add next-step comment
96
+ return `Post a comment on the card with the ready-to-paste command for the next stage,
97
+ using \`buildNextStepComment\` so the card title is pre-filled as the quoted argument.
83
98
 
84
- Post a comment on the card with the ready-to-paste command for the next stage,
85
- using \`buildNextStepComment\` so the card title is pre-filled as the quoted argument:
99
+ **IMPORTANT**: Replace \`${cardName}\` with the actual card title from Step 3. The command
100
+ **must always** include the quoted title argument never post \`${command}\` by itself.
86
101
 
87
102
  \`\`\`tool
88
103
  mcp__claude_ai_Trello_Custom__add_comment
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thiagodiogo/pscode",
3
- "version": "2.2.0",
3
+ "version": "2.2.2",
4
4
  "description": "AI-native system for spec-driven development",
5
5
  "keywords": [
6
6
  "pscode",
@@ -2,7 +2,7 @@
2
2
  # Regras Constitucionais — Java/Spring (Arquitetura Hexagonal)
3
3
 
4
4
  > Regras invioláveis. Não negocie sem motivo documentado.
5
- > Detalhes completos em `pastelsdd/context/`.
5
+ > Detalhes completos em `pscode/context/`.
6
6
 
7
7
  ## Arquitetura Hexagonal
8
8
 
@@ -53,10 +53,10 @@ fix(infra): correct JPA mapping for OrderStatus [PROJ-55]
53
53
 
54
54
  ## Referências
55
55
 
56
- Docs completos em `pastelsdd/context/`:
57
- - `pastelsdd/context/java/architecture.md` — guia completo de arquitetura hexagonal
58
- - `pastelsdd/context/java/naming.md` — convenções de nomenclatura por camada
59
- - `pastelsdd/context/shared/commits.md` — convenção completa de commits
60
- - `pastelsdd/context/shared/dev-flow.md` — fluxo de desenvolvimento e PR
56
+ Docs completos em `pscode/context/`:
57
+ - `pscode/context/java/architecture.md` — guia completo de arquitetura hexagonal
58
+ - `pscode/context/java/naming.md` — convenções de nomenclatura por camada
59
+ - `pscode/context/shared/commits.md` — convenção completa de commits
60
+ - `pscode/context/shared/dev-flow.md` — fluxo de desenvolvimento e PR
61
61
 
62
- > Se `pastelsdd/context/` não existe, rode `pscode init --profile dixi` para instalar.
62
+ > Se `pscode/context/` não existe, rode `pscode init --profile dixi` para instalar.
@@ -2,7 +2,7 @@
2
2
  # Regras Constitucionais — React/Next.js + TypeScript (Feature-Sliced Design)
3
3
 
4
4
  > Regras invioláveis. Não negocie sem motivo documentado.
5
- > Detalhes completos em `pastelsdd/context/`.
5
+ > Detalhes completos em `pscode/context/`.
6
6
 
7
7
  ## Feature-Sliced Design
8
8
 
@@ -65,10 +65,10 @@ fix(cart): correct item count on empty cart [PROJ-23]
65
65
 
66
66
  ## Referências
67
67
 
68
- Docs completos em `pastelsdd/context/`:
69
- - `pastelsdd/context/react/architecture.md` — guia completo de feature-sliced design
70
- - `pastelsdd/context/react/naming.md` — convenções de nomenclatura
71
- - `pastelsdd/context/shared/commits.md` — convenção completa de commits
72
- - `pastelsdd/context/shared/dev-flow.md` — fluxo de desenvolvimento e PR
68
+ Docs completos em `pscode/context/`:
69
+ - `pscode/context/react/architecture.md` — guia completo de feature-sliced design
70
+ - `pscode/context/react/naming.md` — convenções de nomenclatura
71
+ - `pscode/context/shared/commits.md` — convenção completa de commits
72
+ - `pscode/context/shared/dev-flow.md` — fluxo de desenvolvimento e PR
73
73
 
74
- > Se `pastelsdd/context/` não existe, rode `pscode init --profile dixi` para instalar.
74
+ > Se `pscode/context/` não existe, rode `pscode init --profile dixi` para instalar.
@@ -7,8 +7,8 @@ Você é um guardião de arquitetura verificando se o código atual respeita as
7
7
  1. **Leia o contexto do projeto**
8
8
 
9
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.
10
+ - Leia `pscode/context/architecture.md` para carregar as regras arquiteturais vigentes.
11
+ - Se `pscode/context/architecture.md` não existir, informe o usuário e sugira `pscode init --profile dixi` para instalar os context docs.
12
12
 
13
13
  2. **Determine o escopo da verificação**
14
14
 
@@ -19,7 +19,7 @@ Você é um guardião de arquitetura verificando se o código atual respeita as
19
19
 
20
20
  ### Java / Spring (Arquitetura Hexagonal)
21
21
 
22
- Verifique as seguintes regras (conforme `pastelsdd/context/architecture.md`):
22
+ Verifique as seguintes regras (conforme `pscode/context/architecture.md`):
23
23
 
24
24
  - **Regra de dependência:** `infrastructure → application → domain`. Imports proibidos:
25
25
  - `domain.*` importando `application.*` ou `infrastructure.*`
@@ -30,7 +30,7 @@ Você é um guardião de arquitetura verificando se o código atual respeita as
30
30
 
31
31
  ### React / Next.js (Feature-Sliced Design)
32
32
 
33
- Verifique as seguintes regras (conforme `pastelsdd/context/architecture.md`):
33
+ Verifique as seguintes regras (conforme `pscode/context/architecture.md`):
34
34
 
35
35
  - **Isolamento de features:** imports cruzados entre features são proibidos (feature A não importa de feature B)
36
36
  - **Camadas permitidas:** `app → pages → widgets → features → entities → shared`
@@ -61,4 +61,4 @@ Você é um guardião de arquitetura verificando se o código atual respeita as
61
61
  - <ação corretiva para cada violação>
62
62
  ```
63
63
 
64
- 5. **Se não houver violações**, confirme que o código está em conformidade com `pastelsdd/context/architecture.md`.
64
+ 5. **Se não houver violações**, confirme que o código está em conformidade com `pscode/context/architecture.md`.
@@ -6,10 +6,10 @@ Você é um quality gate verificando se o item de trabalho corrente atende todos
6
6
 
7
7
  1. **Leia os critérios de DoD**
8
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:
9
+ - Leia `pscode/context/dod.md` para carregar os critérios oficiais de DoD do projeto.
10
+ - Se `pscode/context/dod.md` não existir, informe o usuário:
11
11
  ```
12
- ℹ️ Arquivo pastelsdd/context/dod.md não encontrado.
12
+ ℹ️ Arquivo pscode/context/dod.md não encontrado.
13
13
  Execute pscode init --profile dixi para instalar os context docs da Dixi.
14
14
  Enquanto isso, usarei critérios genéricos de DoD.
15
15
  ```
@@ -23,7 +23,7 @@ Você é um quality gate verificando se o item de trabalho corrente atende todos
23
23
 
24
24
  3. **Verifique cada critério**
25
25
 
26
- Para cada critério em `pastelsdd/context/dod.md` (ou os genéricos abaixo), avalie o estado atual:
26
+ Para cada critério em `pscode/context/dod.md` (ou os genéricos abaixo), avalie o estado atual:
27
27
 
28
28
  **Critérios genéricos (usados quando dod.md não existe):**
29
29
  - Código implementado e funcionando
@@ -41,7 +41,7 @@ Você é um quality gate verificando se o item de trabalho corrente atende todos
41
41
  ## Definition of Done — <nome do item>
42
42
 
43
43
  **Data:** <data atual>
44
- **Fonte dos critérios:** pastelsdd/context/dod.md | critérios genéricos
44
+ **Fonte dos critérios:** pscode/context/dod.md | critérios genéricos
45
45
 
46
46
  | Critério | Status | Observação |
47
47
  |----------|--------|------------|
@@ -6,7 +6,7 @@ Você é um assistente de integração JIRA criando uma issue a partir do contex
6
6
 
7
7
  1. **Leia a configuração JIRA local**
8
8
 
9
- Leia o arquivo `pastelsdd/jira.yaml` na raiz do projeto.
9
+ Leia o arquivo `pscode/jira.yaml` na raiz do projeto.
10
10
 
11
11
  - **Se o arquivo não existir ou `configured: false`:**
12
12
  ```
@@ -77,4 +77,4 @@ Você é um assistente de integração JIRA criando uma issue a partir do contex
77
77
  Para qualquer falha não coberta acima, exiba uma mensagem descritiva e sugira:
78
78
  - Verificar conectividade de rede
79
79
  - Confirmar permissões do token Atlassian
80
- - Verificar `projectKey` e `defaultIssueType` em `pastelsdd/jira.yaml`
80
+ - Verificar `projectKey` e `defaultIssueType` em `pscode/jira.yaml`
@@ -1,6 +1,6 @@
1
1
  # /pstld:jira-setup — Configurar integração JIRA
2
2
 
3
- Você é um assistente de configuração JIRA guiando o desenvolvedor na criação ou atualização de `pastelsdd/jira.yaml`.
3
+ Você é um assistente de configuração JIRA guiando o desenvolvedor na criação ou atualização de `pscode/jira.yaml`.
4
4
 
5
5
  ## Passos
6
6
 
@@ -32,7 +32,7 @@ Você é um assistente de configuração JIRA guiando o desenvolvedor na criaç
32
32
 
33
33
  2. **Leia configuração existente (se houver)**
34
34
 
35
- Tente ler `pastelsdd/jira.yaml`. Se existir e tiver valores, exiba-os como ponto de partida:
35
+ Tente ler `pscode/jira.yaml`. Se existir e tiver valores, exiba-os como ponto de partida:
36
36
  ```
37
37
  Configuração atual encontrada:
38
38
  Projeto: <projectKey>
@@ -74,7 +74,7 @@ Você é um assistente de configuração JIRA guiando o desenvolvedor na criaç
74
74
  Apresente as transições e peça ao usuário para identificar qual representa "concluído/done".
75
75
  Grave o **ID numérico** da transição escolhida (não o nome, pois IDs são estáveis).
76
76
 
77
- 6. **Grave pastelsdd/jira.yaml**
77
+ 6. **Grave pscode/jira.yaml**
78
78
 
79
79
  Crie ou sobrescreva o arquivo com as escolhas:
80
80
 
@@ -6,20 +6,20 @@ Você é um assistente de integração JIRA verificando a configuração e conex
6
6
 
7
7
  1. **Leia a configuração JIRA local**
8
8
 
9
- Leia o arquivo `pastelsdd/jira.yaml` na raiz do projeto.
9
+ Leia o arquivo `pscode/jira.yaml` na raiz do projeto.
10
10
 
11
11
  - **Se o arquivo não existir:** informe o usuário de forma amigável:
12
12
  ```
13
13
  ℹ️ Integração JIRA não configurada.
14
14
  Para configurar, rode: /pstld:jira-setup
15
- O arquivo pastelsdd/jira.yaml será criado com suas preferências.
15
+ O arquivo pscode/jira.yaml será criado com suas preferências.
16
16
  ```
17
17
  Encerre aqui.
18
18
 
19
19
  - **Se `configured: false`:** informe:
20
20
  ```
21
21
  ⚠️ Integração JIRA presente mas não ativada (configured: false).
22
- Edite pastelsdd/jira.yaml e defina configured: true após preencher os campos.
22
+ Edite pscode/jira.yaml e defina configured: true após preencher os campos.
23
23
  ```
24
24
  Mostre o conteúdo atual do arquivo para o usuário revisar. Encerre aqui.
25
25
 
@@ -35,7 +35,7 @@ Você é um assistente de integração JIRA verificando a configuração e conex
35
35
  ```
36
36
  ⚠️ MCP Atlassian não está disponível nesta sessão.
37
37
  Verifique se o MCP está configurado em .mcp.json e reinicie o Claude Code.
38
- Configuração esperada: pastelsdd/jira.yaml → cloudId: <seu-cloud-id>
38
+ Configuração esperada: pscode/jira.yaml → cloudId: <seu-cloud-id>
39
39
  ```
40
40
  Encerre aqui.
41
41
 
@@ -47,12 +47,12 @@ Você é um assistente de integração JIRA verificando a configuração e conex
47
47
  ## Status da Integração JIRA ✅
48
48
 
49
49
  **Usuário autenticado:** <nome do usuário>
50
- **Cloud ID:** <cloudId de pastelsdd/jira.yaml>
51
- **Projeto padrão:** <projectKey de pastelsdd/jira.yaml>
50
+ **Cloud ID:** <cloudId de pscode/jira.yaml>
51
+ **Projeto padrão:** <projectKey de pscode/jira.yaml>
52
52
  **Tipo de issue padrão:** <defaultIssueType>
53
53
 
54
54
  ### Verificações
55
- - ✅ pastelsdd/jira.yaml encontrado e configurado
55
+ - ✅ pscode/jira.yaml encontrado e configurado
56
56
  - ✅ MCP Atlassian disponível e autenticado
57
57
  - ✅ Conexão com JIRA estabelecida
58
58
 
@@ -66,4 +66,4 @@ Você é um assistente de integração JIRA verificando a configuração e conex
66
66
  Para qualquer falha não coberta acima, mostre uma mensagem descritiva e sugira verificar:
67
67
  - A conectividade de rede
68
68
  - As permissões do token Atlassian
69
- - O `cloudId` em `pastelsdd/jira.yaml`
69
+ - O `cloudId` em `pscode/jira.yaml`
@@ -7,8 +7,8 @@ Você é um arquiteto técnico conduzindo um processo de RFC (Request for Commen
7
7
  1. **Leia o contexto do projeto**
8
8
 
9
9
  - Leia `.pscode-dixi.yaml` na raiz do projeto para determinar `stack` e `family` (java | react | null).
10
- - Leia `pastelsdd/context/dev-flow.md` para entender o fluxo de desenvolvimento e as etapas do RFC.
11
- - Se `pastelsdd/context/` não existir, continue com orientações genéricas e informe o usuário que os context docs não estão instalados (sugira `pscode init --profile dixi`).
10
+ - Leia `pscode/context/dev-flow.md` para entender o fluxo de desenvolvimento e as etapas do RFC.
11
+ - Se `pscode/context/` não existir, continue com orientações genéricas e informe o usuário que os context docs não estão instalados (sugira `pscode init --profile dixi`).
12
12
 
13
13
  2. **Colete o escopo da mudança**
14
14
 
@@ -59,7 +59,7 @@ Você é um arquiteto técnico conduzindo um processo de RFC (Request for Commen
59
59
  | ... | ... | ... |
60
60
 
61
61
  ## Referências
62
- - pastelsdd/context/dev-flow.md
62
+ - pscode/context/dev-flow.md
63
63
  ```
64
64
 
65
65
  4. **Adapte por stack**
@@ -53,7 +53,7 @@ if (family === 'java') {
53
53
  );
54
54
  if (hasDirectDomainImport) {
55
55
  process.stdout.write(
56
- `Violação hexagonal: ${rawFilePath} importa diretamente de domain sem porta. Consulte pastelsdd/context/architecture.md\n`
56
+ `Violação hexagonal: ${rawFilePath} importa diretamente de domain sem porta. Consulte pscode/context/architecture.md\n`
57
57
  );
58
58
  process.exit(2);
59
59
  }
@@ -73,7 +73,7 @@ if (family === 'react') {
73
73
  const featureInImport = importPath.match(/features\/([^/']+)/);
74
74
  if (featureInImport && featureInImport[1] !== currentFeature) {
75
75
  process.stdout.write(
76
- `Violação feature-sliced: importação cruzada entre features. Consulte pastelsdd/context/architecture.md\n`
76
+ `Violação feature-sliced: importação cruzada entre features. Consulte pscode/context/architecture.md\n`
77
77
  );
78
78
  process.exit(2);
79
79
  }
@@ -25,7 +25,7 @@ if (!ticketMatch) {
25
25
  process.exit(0);
26
26
  }
27
27
 
28
- const jiraYamlPath = join(cwd, 'pastelsdd', 'jira.yaml');
28
+ const jiraYamlPath = join(cwd, 'pscode', 'jira.yaml');
29
29
  if (!existsSync(jiraYamlPath)) {
30
30
  process.exit(0);
31
31
  }
@@ -41,7 +41,7 @@ Se detectar esta violação:
41
41
  > O arquivo `[caminho do arquivo]` importa diretamente de `domain/` sem usar uma porta.
42
42
  > A regra de dependência exige que `infrastructure` acesse `domain` apenas via interfaces de porta.
43
43
  >
44
- > Consulte `pastelsdd/context/architecture.md` para a lista de imports permitidos.
44
+ > Consulte `pscode/context/architecture.md` para a lista de imports permitidos.
45
45
  >
46
46
  > **A edição foi bloqueada.** Refatore para usar a porta adequada antes de continuar.
47
47
 
@@ -69,7 +69,7 @@ Se o arquivo editado está em `src/features/<feature-a>/` e o novo conteúdo imp
69
69
  > Features devem ser independentes entre si — imports cruzados criam acoplamento proibido.
70
70
  >
71
71
  > Use `src/shared/` para código reutilizado entre features.
72
- > Consulte `pastelsdd/context/architecture.md`.
72
+ > Consulte `pscode/context/architecture.md`.
73
73
  >
74
74
  > **A edição foi bloqueada.**
75
75
 
@@ -88,7 +88,7 @@ Emita aviso (não bloqueie):
88
88
  > O componente em `[caminho]` parece conter lógica de negócio inline.
89
89
  > Considere extrair para um custom hook em `src/features/` ou `src/shared/hooks/`.
90
90
  >
91
- > Consulte `pastelsdd/context/architecture.md` para o padrão recomendado.
91
+ > Consulte `pscode/context/architecture.md` para o padrão recomendado.
92
92
  >
93
93
  > A edição foi aplicada, mas revise antes de finalizar.
94
94
 
@@ -36,7 +36,7 @@ Leia `.pscode-dixi.yaml` na raiz do projeto e extraia `family`.
36
36
 
37
37
  ### 2. Verificar ticket JIRA
38
38
 
39
- Leia `pastelsdd/jira.yaml` na raiz do projeto.
39
+ Leia `pscode/jira.yaml` na raiz do projeto.
40
40
 
41
41
  - Se o arquivo **não existir** ou tiver `configured: false`: mensagem sem ticket JIRA (vá para seção 3).
42
42
  - Se tiver `project_key` configurado: o ticket **é obrigatório**.
@@ -71,7 +71,7 @@ Gere a mensagem no formato:
71
71
  tipo(escopo): descrição concisa em português ou inglês [PROJECT_KEY-NNN]
72
72
  ```
73
73
 
74
- Sem ticket quando `pastelsdd/jira.yaml` não configurado:
74
+ Sem ticket quando `pscode/jira.yaml` não configurado:
75
75
 
76
76
  ```
77
77
  tipo(escopo): descrição concisa
@@ -15,13 +15,13 @@ Se o prompt não contém nenhum padrão `[A-Z]+-\d+`, a skill não é ativada.
15
15
 
16
16
  ### 1. Verificar configuração JIRA
17
17
 
18
- Leia `pastelsdd/jira.yaml` na raiz do projeto.
18
+ Leia `pscode/jira.yaml` na raiz do projeto.
19
19
 
20
20
  **Se o arquivo não existir ou tiver `configured: false`:**
21
21
 
22
22
  Exiba o seguinte aviso **uma única vez por sessão** (não repita em prompts subsequentes):
23
23
 
24
- > ℹ️ Integração JIRA não configurada — edite `pastelsdd/jira.yaml` para habilitar.
24
+ > ℹ️ Integração JIRA não configurada — edite `pscode/jira.yaml` para habilitar.
25
25
 
26
26
  Prossiga sem buscar contexto do ticket.
27
27
 
@@ -9,7 +9,7 @@ Implement tasks with Dixi architectural awareness.
9
9
 
10
10
  **Dixi preamble** (execute before starting implementation):
11
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.
12
+ 2. Read `pscode/context/architecture.md` (if present) to load architectural constraints — use them as guardrails during implementation.
13
+ 3. Read `pscode/context/testing.md` (if present) to load testing conventions.
14
14
 
15
15
  Then execute the standard `pscode-apply-change` skill instructions in full.
@@ -9,6 +9,6 @@ Complete a change with Dixi awareness.
9
9
 
10
10
  **Dixi preamble** (execute before archiving):
11
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.
12
+ 2. Read `pscode/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
13
 
14
14
  Then execute the standard `pscode-archive-change` skill instructions in full.
@@ -9,6 +9,6 @@ Enter explore mode with Dixi architectural awareness.
9
9
 
10
10
  **Dixi preamble** (execute before entering explore mode):
11
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.
12
+ 2. Read `pscode/context/architecture.md` (if present) to load architectural constraints — reference them when evaluating options and trade-offs.
13
13
 
14
14
  Then execute the standard `pscode-explore` skill instructions in full.
@@ -9,6 +9,6 @@ Propose a new change with Dixi architectural awareness.
9
9
 
10
10
  **Dixi preamble** (execute before generating any artifact):
11
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.
12
+ 2. Read `pscode/context/architecture.md` (if present) to load architectural constraints — use them as guardrails when writing the proposal and design.
13
13
 
14
14
  Then execute the standard `pscode-propose` skill instructions in full.
@@ -7,8 +7,8 @@ Você é um guardião de arquitetura verificando se o código atual respeita as
7
7
  1. **Leia o contexto do projeto**
8
8
 
9
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.
10
+ - Leia `pscode/context/architecture.md` para carregar as regras arquiteturais vigentes.
11
+ - Se `pscode/context/architecture.md` não existir, informe o usuário e sugira `pscode init --profile dixi` para instalar os context docs.
12
12
 
13
13
  2. **Determine o escopo da verificação**
14
14
 
@@ -19,7 +19,7 @@ Você é um guardião de arquitetura verificando se o código atual respeita as
19
19
 
20
20
  ### Java / Spring (Arquitetura Hexagonal)
21
21
 
22
- Verifique as seguintes regras (conforme `pastelsdd/context/architecture.md`):
22
+ Verifique as seguintes regras (conforme `pscode/context/architecture.md`):
23
23
 
24
24
  - **Regra de dependência:** `infrastructure → application → domain`. Imports proibidos:
25
25
  - `domain.*` importando `application.*` ou `infrastructure.*`
@@ -30,7 +30,7 @@ Você é um guardião de arquitetura verificando se o código atual respeita as
30
30
 
31
31
  ### React / Next.js (Feature-Sliced Design)
32
32
 
33
- Verifique as seguintes regras (conforme `pastelsdd/context/architecture.md`):
33
+ Verifique as seguintes regras (conforme `pscode/context/architecture.md`):
34
34
 
35
35
  - **Isolamento de features:** imports cruzados entre features são proibidos (feature A não importa de feature B)
36
36
  - **Camadas permitidas:** `app → pages → widgets → features → entities → shared`
@@ -61,4 +61,4 @@ Você é um guardião de arquitetura verificando se o código atual respeita as
61
61
  - <ação corretiva para cada violação>
62
62
  ```
63
63
 
64
- 5. **Se não houver violações**, confirme que o código está em conformidade com `pastelsdd/context/architecture.md`.
64
+ 5. **Se não houver violações**, confirme que o código está em conformidade com `pscode/context/architecture.md`.
@@ -6,10 +6,10 @@ Você é um quality gate verificando se o item de trabalho corrente atende todos
6
6
 
7
7
  1. **Leia os critérios de DoD**
8
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:
9
+ - Leia `pscode/context/dod.md` para carregar os critérios oficiais de DoD do projeto.
10
+ - Se `pscode/context/dod.md` não existir, informe o usuário:
11
11
  ```
12
- ℹ️ Arquivo pastelsdd/context/dod.md não encontrado.
12
+ ℹ️ Arquivo pscode/context/dod.md não encontrado.
13
13
  Execute pscode init --profile dixi para instalar os context docs da Dixi.
14
14
  Enquanto isso, usarei critérios genéricos de DoD.
15
15
  ```
@@ -23,7 +23,7 @@ Você é um quality gate verificando se o item de trabalho corrente atende todos
23
23
 
24
24
  3. **Verifique cada critério**
25
25
 
26
- Para cada critério em `pastelsdd/context/dod.md` (ou os genéricos abaixo), avalie o estado atual:
26
+ Para cada critério em `pscode/context/dod.md` (ou os genéricos abaixo), avalie o estado atual:
27
27
 
28
28
  **Critérios genéricos (usados quando dod.md não existe):**
29
29
  - Código implementado e funcionando
@@ -41,7 +41,7 @@ Você é um quality gate verificando se o item de trabalho corrente atende todos
41
41
  ## Definition of Done — <nome do item>
42
42
 
43
43
  **Data:** <data atual>
44
- **Fonte dos critérios:** pastelsdd/context/dod.md | critérios genéricos
44
+ **Fonte dos critérios:** pscode/context/dod.md | critérios genéricos
45
45
 
46
46
  | Critério | Status | Observação |
47
47
  |----------|--------|------------|
@@ -6,7 +6,7 @@ Você é um assistente de integração JIRA criando uma issue a partir do contex
6
6
 
7
7
  1. **Leia a configuração JIRA local**
8
8
 
9
- Leia o arquivo `pastelsdd/jira.yaml` na raiz do projeto.
9
+ Leia o arquivo `pscode/jira.yaml` na raiz do projeto.
10
10
 
11
11
  - **Se o arquivo não existir ou `configured: false`:**
12
12
  ```
@@ -77,4 +77,4 @@ Você é um assistente de integração JIRA criando uma issue a partir do contex
77
77
  Para qualquer falha não coberta acima, exiba uma mensagem descritiva e sugira:
78
78
  - Verificar conectividade de rede
79
79
  - Confirmar permissões do token Atlassian
80
- - Verificar `projectKey` e `defaultIssueType` em `pastelsdd/jira.yaml`
80
+ - Verificar `projectKey` e `defaultIssueType` em `pscode/jira.yaml`
package/LICENSE DELETED
@@ -1,22 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 OpenSpec Contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
22
-