@thiagodiogo/pscode 2.2.1 → 2.3.0
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/complete.js +2 -1
- package/dist/core/init.js +6 -5
- package/dist/core/jira-transition.js +2 -1
- package/dist/core/presets/dixi.d.ts +8 -1
- package/dist/core/presets/dixi.js +33 -4
- package/dist/core/profile-sync-drift.js +1 -0
- package/dist/core/profiles.d.ts +3 -3
- package/dist/core/profiles.js +3 -2
- package/dist/core/shared/skill-generation.js +3 -1
- package/dist/core/templates/skill-templates.d.ts +1 -0
- package/dist/core/templates/skill-templates.js +1 -0
- package/dist/core/templates/workflows/grill-me.d.ts +13 -0
- package/dist/core/templates/workflows/grill-me.js +64 -0
- package/dist/core/templates/workflows/propose.js +12 -0
- package/package.json +1 -1
- package/pscode/content/dixi/claude-runtime/CLAUDE.md.java.template +7 -7
- package/pscode/content/dixi/claude-runtime/CLAUDE.md.react.template +7 -7
- package/pscode/content/dixi/claude-runtime/commands/arch-check.md +5 -5
- package/pscode/content/dixi/claude-runtime/commands/dod.md +5 -5
- package/pscode/content/dixi/claude-runtime/commands/jira-draft.md +2 -2
- package/pscode/content/dixi/claude-runtime/commands/jira-setup.md +3 -3
- package/pscode/content/dixi/claude-runtime/commands/jira-sync.md +8 -8
- package/pscode/content/dixi/claude-runtime/commands/rfc.md +3 -3
- package/pscode/content/dixi/claude-runtime/hooks/arch-guard.mjs +2 -2
- package/pscode/content/dixi/claude-runtime/hooks/jira-context.mjs +1 -1
- package/pscode/content/dixi/claude-runtime/skills/pstld-arch-guardian.md +3 -3
- package/pscode/content/dixi/claude-runtime/skills/pstld-commit-crafter.md +2 -2
- package/pscode/content/dixi/claude-runtime/skills/pstld-jira-context.md +2 -2
- package/pscode/content/dixi/commands/ps/apply.md +2 -2
- package/pscode/content/dixi/commands/ps/complete.md +1 -1
- package/pscode/content/dixi/commands/ps/explore.md +1 -1
- package/pscode/content/dixi/commands/ps/propose.md +1 -1
- package/pscode/content/dixi/commands/pstld/arch-check.md +5 -5
- package/pscode/content/dixi/commands/pstld/dod.md +5 -5
- package/pscode/content/dixi/commands/pstld/jira-draft.md +2 -2
package/dist/core/complete.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
719
|
-
|
|
720
|
-
|
|
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(
|
|
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,
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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,
|
|
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
|
-
//
|
|
317
|
-
|
|
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
|
}
|
|
@@ -23,6 +23,7 @@ export const WORKFLOW_TO_SKILL_DIR = {
|
|
|
23
23
|
'draft': 'pscode-trello-draft',
|
|
24
24
|
// Productivity workflows
|
|
25
25
|
'handoff': 'pscode-handoff',
|
|
26
|
+
'grill-me': 'pscode-grill-me',
|
|
26
27
|
// Dixi-specific workflows
|
|
27
28
|
'rfc': 'pscode-dixi-rfc',
|
|
28
29
|
'design': 'pscode-dixi-design',
|
package/dist/core/profiles.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* `pscode init --profile <name>` or `pscode config profile <name>`.
|
|
6
6
|
* The workflow lists are fixed in code — users cannot customise them.
|
|
7
7
|
*/
|
|
8
|
-
export declare const ALL_WORKFLOWS: readonly ["propose", "explore", "new", "continue", "apply", "ff", "complete", "bulk-archive", "verify", "onboard", "trello-setup", "draft", "rfc", "design", "tasks", "arch-check", "adr", "jira-sync", "dod", "handoff"];
|
|
8
|
+
export declare const ALL_WORKFLOWS: readonly ["propose", "explore", "new", "continue", "apply", "ff", "complete", "bulk-archive", "verify", "onboard", "trello-setup", "draft", "rfc", "design", "tasks", "arch-check", "adr", "jira-sync", "dod", "handoff", "grill-me"];
|
|
9
9
|
export type WorkflowId = (typeof ALL_WORKFLOWS)[number];
|
|
10
10
|
export interface ProfileDefinition {
|
|
11
11
|
description: string;
|
|
@@ -14,11 +14,11 @@ export interface ProfileDefinition {
|
|
|
14
14
|
export declare const PROFILES: {
|
|
15
15
|
readonly standard: {
|
|
16
16
|
readonly description: "Padrão — propose, explore, apply, complete";
|
|
17
|
-
readonly workflows: readonly ["propose", "explore", "apply", "complete", "trello-setup", "draft", "handoff"];
|
|
17
|
+
readonly workflows: readonly ["propose", "explore", "apply", "complete", "trello-setup", "draft", "handoff", "grill-me"];
|
|
18
18
|
};
|
|
19
19
|
readonly dixi: {
|
|
20
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", "handoff"];
|
|
21
|
+
readonly workflows: readonly ["propose", "explore", "apply", "complete", "trello-setup", "draft", "handoff", "grill-me"];
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
24
|
export type ProfileName = keyof typeof PROFILES;
|
package/dist/core/profiles.js
CHANGED
|
@@ -26,15 +26,16 @@ export const ALL_WORKFLOWS = [
|
|
|
26
26
|
'jira-sync',
|
|
27
27
|
'dod',
|
|
28
28
|
'handoff',
|
|
29
|
+
'grill-me',
|
|
29
30
|
];
|
|
30
31
|
export const PROFILES = {
|
|
31
32
|
standard: {
|
|
32
33
|
description: 'Padrão — propose, explore, apply, complete',
|
|
33
|
-
workflows: ['propose', 'explore', 'apply', 'complete', 'trello-setup', 'draft', 'handoff'],
|
|
34
|
+
workflows: ['propose', 'explore', 'apply', 'complete', 'trello-setup', 'draft', 'handoff', 'grill-me'],
|
|
34
35
|
},
|
|
35
36
|
dixi: {
|
|
36
37
|
description: 'Dixi — propose, explore, apply, complete com guardrails para Java/Spring e React/Next.js',
|
|
37
|
-
workflows: ['propose', 'explore', 'apply', 'complete', 'trello-setup', 'draft', 'handoff'],
|
|
38
|
+
workflows: ['propose', 'explore', 'apply', 'complete', 'trello-setup', 'draft', 'handoff', 'grill-me'],
|
|
38
39
|
},
|
|
39
40
|
};
|
|
40
41
|
export const DEFAULT_PROFILE = 'standard';
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Shared utilities for generating skill and command files.
|
|
5
5
|
*/
|
|
6
|
-
import { getExploreSkillTemplate, getNewChangeSkillTemplate, getContinueChangeSkillTemplate, getApplyChangeSkillTemplate, getFfChangeSkillTemplate, getCompleteChangeSkillTemplate, getBulkArchiveChangeSkillTemplate, getVerifyChangeSkillTemplate, getOnboardSkillTemplate, getProposeSkillTemplate, getTrelloSetupSkillTemplate, getTrelloDraftSkillTemplate, getHandoffSkillTemplate, getPsExploreCommandTemplate, getPsNewCommandTemplate, getPsContinueCommandTemplate, getPsApplyCommandTemplate, getPsFfCommandTemplate, getPsCompleteCommandTemplate, getPsBulkArchiveCommandTemplate, getPsVerifyCommandTemplate, getPsOnboardCommandTemplate, getPsProposeCommandTemplate, getTrelloSetupCommandTemplate, getTrelloDraftCommandTemplate, getHandoffCommandTemplate, } from '../templates/skill-templates.js';
|
|
6
|
+
import { getExploreSkillTemplate, getNewChangeSkillTemplate, getContinueChangeSkillTemplate, getApplyChangeSkillTemplate, getFfChangeSkillTemplate, getCompleteChangeSkillTemplate, getBulkArchiveChangeSkillTemplate, getVerifyChangeSkillTemplate, getOnboardSkillTemplate, getProposeSkillTemplate, getTrelloSetupSkillTemplate, getTrelloDraftSkillTemplate, getHandoffSkillTemplate, getGrillMeSkillTemplate, getPsExploreCommandTemplate, getPsNewCommandTemplate, getPsContinueCommandTemplate, getPsApplyCommandTemplate, getPsFfCommandTemplate, getPsCompleteCommandTemplate, getPsBulkArchiveCommandTemplate, getPsVerifyCommandTemplate, getPsOnboardCommandTemplate, getPsProposeCommandTemplate, getTrelloSetupCommandTemplate, getTrelloDraftCommandTemplate, getHandoffCommandTemplate, getGrillMeCommandTemplate, } from '../templates/skill-templates.js';
|
|
7
7
|
/**
|
|
8
8
|
* Gets skill templates with their directory names, optionally filtered by workflow IDs.
|
|
9
9
|
*
|
|
@@ -26,6 +26,7 @@ export function getSkillTemplates(workflowFilter) {
|
|
|
26
26
|
{ template: getTrelloDraftSkillTemplate(), dirName: 'pscode-trello-draft', workflowId: 'draft' },
|
|
27
27
|
// Productivity workflows
|
|
28
28
|
{ template: getHandoffSkillTemplate(), dirName: 'pscode-handoff', workflowId: 'handoff' },
|
|
29
|
+
{ template: getGrillMeSkillTemplate(), dirName: 'pscode-grill-me', workflowId: 'grill-me' },
|
|
29
30
|
];
|
|
30
31
|
if (!workflowFilter)
|
|
31
32
|
return all;
|
|
@@ -54,6 +55,7 @@ export function getCommandTemplates(workflowFilter) {
|
|
|
54
55
|
{ template: getTrelloDraftCommandTemplate(), id: 'draft' },
|
|
55
56
|
// Productivity workflows
|
|
56
57
|
{ template: getHandoffCommandTemplate(), id: 'handoff' },
|
|
58
|
+
{ template: getGrillMeCommandTemplate(), id: 'grill-me' },
|
|
57
59
|
];
|
|
58
60
|
if (!workflowFilter)
|
|
59
61
|
return all;
|
|
@@ -18,4 +18,5 @@ export { getFeedbackSkillTemplate } from './workflows/feedback.js';
|
|
|
18
18
|
export { getTrelloSetupSkillTemplate, getTrelloSetupCommandTemplate } from './workflows/trello-setup.js';
|
|
19
19
|
export { getTrelloDraftSkillTemplate, getTrelloDraftCommandTemplate } from './workflows/trello-draft.js';
|
|
20
20
|
export { getHandoffSkillTemplate, getHandoffCommandTemplate } from './workflows/handoff.js';
|
|
21
|
+
export { getGrillMeSkillTemplate, getGrillMeCommandTemplate } from './workflows/grill-me.js';
|
|
21
22
|
//# sourceMappingURL=skill-templates.d.ts.map
|
|
@@ -19,4 +19,5 @@ export { getTrelloSetupSkillTemplate, getTrelloSetupCommandTemplate } from './wo
|
|
|
19
19
|
export { getTrelloDraftSkillTemplate, getTrelloDraftCommandTemplate } from './workflows/trello-draft.js';
|
|
20
20
|
// Productivity workflows
|
|
21
21
|
export { getHandoffSkillTemplate, getHandoffCommandTemplate } from './workflows/handoff.js';
|
|
22
|
+
export { getGrillMeSkillTemplate, getGrillMeCommandTemplate } from './workflows/grill-me.js';
|
|
22
23
|
//# sourceMappingURL=skill-templates.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grill Me Skill / Command Template
|
|
3
|
+
*
|
|
4
|
+
* Conducts a structured interrogation of a plan — one question at a time,
|
|
5
|
+
* each with a recommended answer — exploring the codebase when evidence is
|
|
6
|
+
* available, until shared understanding is reached. Ported (in Portuguese)
|
|
7
|
+
* from the `grill-me` skill (mattpocock/skills).
|
|
8
|
+
*/
|
|
9
|
+
import type { SkillTemplate, CommandTemplate } from '../types.js';
|
|
10
|
+
export declare function getGrillMeSkillTemplate(): SkillTemplate;
|
|
11
|
+
export declare function getGrillMeInstructions(): string;
|
|
12
|
+
export declare function getGrillMeCommandTemplate(): CommandTemplate;
|
|
13
|
+
//# sourceMappingURL=grill-me.d.ts.map
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export function getGrillMeSkillTemplate() {
|
|
2
|
+
return {
|
|
3
|
+
name: 'pscode-grill-me',
|
|
4
|
+
description: 'Interroga um plano antes da implementação — uma pergunta por vez, com resposta recomendada, explorando o código quando há evidência, até entendimento compartilhado. Use quando o usuário quer validar e refinar um plano antes de escrever artefatos ou código.',
|
|
5
|
+
instructions: getGrillMeInstructions(),
|
|
6
|
+
compatibility: 'Works with any pscode project.',
|
|
7
|
+
metadata: { author: 'pscode', version: '1.0' },
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function getGrillMeInstructions() {
|
|
11
|
+
return `Interrogue o plano do usuário até atingir entendimento compartilhado sobre o que realmente deve existir — não apenas sobre o que foi descrito. O objetivo é pressionar cada decisão e ambiguidade do plano **antes** de escrever qualquer artefato ou código.
|
|
12
|
+
|
|
13
|
+
**Princípio central**: faça **uma pergunta por vez**. Nunca despeje uma lista de perguntas de uma só vez. Aguarde a resposta, incorpore-a ao seu entendimento e só então formule a próxima.
|
|
14
|
+
|
|
15
|
+
**Steps**
|
|
16
|
+
|
|
17
|
+
1. **Entenda o plano inicial**
|
|
18
|
+
|
|
19
|
+
Leia a descrição do usuário (e qualquer artefato/contexto já disponível). Identifique a árvore de decisões: requisitos, escopo, abordagem técnica, trade-offs e os pontos onde o plano está vago, ambíguo ou assume algo não dito.
|
|
20
|
+
|
|
21
|
+
2. **Explore o código antes de perguntar**
|
|
22
|
+
|
|
23
|
+
Se uma pergunta pode ser respondida com evidência presente no próprio repositório (convenções existentes, padrões de arquitetura, como features semelhantes já foram feitas), **investigue o código** em vez de perguntar ao usuário. Use o resultado da investigação para formular perguntas melhores ou para já resolver a decisão.
|
|
24
|
+
|
|
25
|
+
Só pergunte ao usuário o que o código não responde — decisões de produto, prioridades, trade-offs e intenção.
|
|
26
|
+
|
|
27
|
+
3. **Conduza a interrogação — uma pergunta por vez**
|
|
28
|
+
|
|
29
|
+
Para cada ponto não resolvido, na ordem em que as dependências entre decisões exigem (resolva primeiro o que destrava as demais):
|
|
30
|
+
|
|
31
|
+
- Faça **uma** pergunta clara e específica.
|
|
32
|
+
- Sempre acompanhe a pergunta com a **sua resposta recomendada** e um motivo curto — para orientar a decisão e permitir que o usuário apenas concorde e siga em frente quando a recomendação fizer sentido.
|
|
33
|
+
- Quando houver opções discretas, use a **ferramenta AskUserQuestion** com a recomendação como primeira opção (marcada como "(Recomendada)"). Para perguntas abertas, formule a recomendação no texto.
|
|
34
|
+
- Aguarde a resposta antes de prosseguir. Incorpore-a e reavalie a árvore de decisão: a resposta pode tornar perguntas seguintes desnecessárias ou abrir novas.
|
|
35
|
+
|
|
36
|
+
4. **Navegue a árvore de decisão progressivamente**
|
|
37
|
+
|
|
38
|
+
À medida que cada decisão é resolvida, atualize seu entendimento e siga para a próxima decisão relevante. Não pergunte algo que já foi respondido (direta ou indiretamente) por uma resposta anterior ou pelo código.
|
|
39
|
+
|
|
40
|
+
5. **Encerre por entendimento compartilhado**
|
|
41
|
+
|
|
42
|
+
Quando todos os ramos relevantes da árvore de decisão estiverem resolvidos e não restar ambiguidade material, **encerre a interrogação** e apresente um **resumo do entendimento compartilhado**: o que será construído, as decisões tomadas (com seus motivos) e os pontos explicitamente fora de escopo.
|
|
43
|
+
|
|
44
|
+
Confirme com o usuário que o resumo reflete o que deve existir. A partir daí, o plano está pronto para virar artefatos/implementação.
|
|
45
|
+
|
|
46
|
+
**Guardrails**
|
|
47
|
+
- Uma pergunta por vez — sempre. Nunca despeje várias perguntas juntas.
|
|
48
|
+
- Toda pergunta vem com uma resposta recomendada.
|
|
49
|
+
- Prefira investigar o código a perguntar, quando a resposta está no repositório.
|
|
50
|
+
- Não invente decisões: se algo é genuinamente do usuário, pergunte.
|
|
51
|
+
- Pare assim que houver entendimento compartilhado — não prolongue a interrogação além do necessário.
|
|
52
|
+
- Se o usuário passou argumentos, trate-os como a descrição do plano a ser interrogado.
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
export function getGrillMeCommandTemplate() {
|
|
56
|
+
return {
|
|
57
|
+
name: 'PS: Grill Me',
|
|
58
|
+
description: 'Interroga um plano antes da implementação — uma pergunta por vez, com resposta recomendada, até entendimento compartilhado',
|
|
59
|
+
category: 'Workflow',
|
|
60
|
+
tags: ['grill', 'refinamento', 'plano', 'workflow'],
|
|
61
|
+
content: getGrillMeInstructions(),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=grill-me.js.map
|
|
@@ -52,6 +52,18 @@ When ready to implement, run /ps:apply
|
|
|
52
52
|
|
|
53
53
|
**IMPORTANT**: Do NOT proceed without understanding what the user wants to build.
|
|
54
54
|
|
|
55
|
+
1b. **Fase de grill — interrogue o plano antes de gerar artefatos**
|
|
56
|
+
|
|
57
|
+
Antes de criar a change e gerar os artefatos, conduza a **fase de grill** para garantir que a proposta reflita o que realmente deve existir — não apenas a descrição inicial. Aplique o mesmo comportamento da skill \`grill-me\` (\`/ps:grill-me\`):
|
|
58
|
+
|
|
59
|
+
- Faça **uma pergunta por vez** — nunca despeje várias perguntas juntas. Aguarde a resposta antes da próxima.
|
|
60
|
+
- Acompanhe **cada** pergunta com a **sua resposta recomendada** e um motivo curto. Quando houver opções discretas, use a **ferramenta AskUserQuestion** com a recomendação como primeira opção ("(Recomendada)").
|
|
61
|
+
- **Explore o código quando há evidência**: se uma pergunta pode ser respondida pelo próprio repositório (convenções, padrões, features semelhantes), investigue o código em vez de perguntar. Só pergunte ao usuário decisões de produto, prioridades, trade-offs e intenção.
|
|
62
|
+
- Navegue a árvore de decisão progressivamente, resolvendo dependências; não repergunte o que já foi respondido pelo código ou por uma resposta anterior.
|
|
63
|
+
- Encerre quando houver **entendimento compartilhado** e apresente um resumo curto (o que será construído, decisões com motivos, fora de escopo) antes de seguir.
|
|
64
|
+
|
|
65
|
+
Os artefatos gerados a partir do Passo 2 SHALL refletir esse entendimento refinado.
|
|
66
|
+
|
|
55
67
|
2. **Create the change directory**
|
|
56
68
|
\`\`\`bash
|
|
57
69
|
pscode new change "<name>"
|
package/package.json
CHANGED
|
@@ -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 `
|
|
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 `
|
|
57
|
-
- `
|
|
58
|
-
- `
|
|
59
|
-
- `
|
|
60
|
-
- `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
69
|
-
- `
|
|
70
|
-
- `
|
|
71
|
-
- `
|
|
72
|
-
- `
|
|
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 `
|
|
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 `
|
|
11
|
-
- Se `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
10
|
-
- Se `
|
|
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
|
|
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 `
|
|
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:**
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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
|
|
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 `
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
51
|
-
**Projeto padrão:** <projectKey de
|
|
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
|
-
- ✅
|
|
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 `
|
|
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 `
|
|
11
|
-
- Se `
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|
}
|
|
@@ -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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
13
|
-
3. Read `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
11
|
-
- Se `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
10
|
-
- Se `
|
|
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
|
|
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 `
|
|
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:**
|
|
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 `
|
|
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 `
|
|
80
|
+
- Verificar `projectKey` e `defaultIssueType` em `pscode/jira.yaml`
|