@promovaweb/specsfy 0.7.0 → 0.9.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.
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Projeção de milestones para projetos consumidores do Specsfy.
3
+ *
4
+ * A fonte normativa continua distribuída: cada spec e cada item de backlog
5
+ * declara seus vínculos, enquanto este módulo mantém os blocos derivados de
6
+ * `specs.md` e de `specs/milestones/<ID>.md`. Conteúdo humano fora dos blocos
7
+ * delimitados nunca é substituído.
8
+ */
9
+ import { readFile, readdir } from "node:fs/promises";
10
+ import { basename, dirname, join } from "node:path";
11
+ import { pathExists, resolvePath, writeTextAtomic } from "./filesystem.js";
12
+ import { scanSpecPaths } from "./lifecycle.js";
13
+ const TABLE_FIELD = /^\|\s*([^|]+?)\s*\|\s*([^|]+?)\s*\|\s*$/u;
14
+ const BOLD_FIELD = /^\*\*([^*]+?)\*\*:\s*(.+?)\s*$/u;
15
+ const START = "<!-- specsfy:milestone-progress:start -->";
16
+ const END = "<!-- specsfy:milestone-progress:end -->";
17
+ const INDEX_START = "<!-- specsfy:specs-index:start -->";
18
+ const INDEX_END = "<!-- specsfy:specs-index:end -->";
19
+ /**
20
+ * Reconstrói as projeções de milestones a partir do backlog e das specs.
21
+ *
22
+ * O comando pode criar o esqueleto de um marco citado por uma spec. A condição
23
+ * de saída permanece pendente até ser confirmada pela entrevista de MVP ou de
24
+ * roadmap, portanto a sincronização não inventa requisito de produto.
25
+ */
26
+ export async function syncMilestones(project) {
27
+ const root = resolvePath(project);
28
+ const [specs, backlog] = await Promise.all([scanLinkedSpecs(root), scanBacklog(root)]);
29
+ const ids = [...new Set([...specs, ...backlog].flatMap((record) => record.milestones))]
30
+ .sort(compareMilestone);
31
+ const milestones = [];
32
+ for (const id of ids) {
33
+ const linkedSpecs = specs.filter((spec) => spec.milestones.includes(id));
34
+ const linkedBacklog = backlog.filter((item) => item.milestones.includes(id));
35
+ const completedSpecs = linkedSpecs.filter(isComplete).length;
36
+ const path = join(root, "specs", "milestones", `${id}.md`);
37
+ const progress = {
38
+ id,
39
+ path,
40
+ total_specs: linkedSpecs.length,
41
+ completed_specs: completedSpecs,
42
+ backlog_items: linkedBacklog.length,
43
+ percent: linkedSpecs.length ? Math.round((completedSpecs * 100) / linkedSpecs.length) : 0,
44
+ };
45
+ await writeMilestone(path, progress, linkedSpecs, linkedBacklog);
46
+ milestones.push(progress);
47
+ }
48
+ const indexPath = join(root, "specs.md");
49
+ await writeSpecsIndex(indexPath, specs, milestones);
50
+ return { index_path: indexPath, milestones };
51
+ }
52
+ async function scanLinkedSpecs(project) {
53
+ const paths = await scanSpecPaths(project);
54
+ return Promise.all(paths.map(async (path) => recordFromFile(path)));
55
+ }
56
+ async function scanBacklog(project) {
57
+ const directory = join(project, "specs", "backlog");
58
+ if (!(await pathExists(directory)))
59
+ return [];
60
+ const entries = await readdir(directory, { withFileTypes: true });
61
+ return Promise.all(entries.filter((entry) => entry.isFile() && entry.name.endsWith(".md"))
62
+ .map((entry) => recordFromFile(join(directory, entry.name))));
63
+ }
64
+ async function recordFromFile(path) {
65
+ const content = await readFile(path, "utf8");
66
+ const fields = fieldsFrom(content);
67
+ return {
68
+ slug: basename(path, ".md") === "spec" ? basename(dirname(path)) : basename(path, ".md"),
69
+ title: content.match(/^#\s+(.+?)\s*$/mu)?.[1]?.trim() ?? basename(path, ".md"),
70
+ status: fields.get("status") ?? "Unknown",
71
+ milestones: parseMilestones(fields.get("milestones") ?? fields.get("milestone")),
72
+ };
73
+ }
74
+ function fieldsFrom(content) {
75
+ const fields = new Map();
76
+ for (const line of content.split(/\r?\n/u)) {
77
+ const field = TABLE_FIELD.exec(line) ?? BOLD_FIELD.exec(line);
78
+ if (field?.[1] && field[2])
79
+ fields.set(field[1].trim().toLowerCase(), field[2].trim());
80
+ }
81
+ return fields;
82
+ }
83
+ function parseMilestones(value) {
84
+ if (!value)
85
+ return [];
86
+ return [...new Set(value.split(/[;,]/u).map((item) => item.trim().toUpperCase())
87
+ .filter((item) => /^M\d{2,}(?:-[a-z0-9-]+)?$/iu.test(item)))].sort(compareMilestone);
88
+ }
89
+ function isComplete(record) {
90
+ return record.status.trim().toLowerCase() === "complete";
91
+ }
92
+ async function writeMilestone(path, progress, specs, backlog) {
93
+ const current = (await pathExists(path)) ? await readFile(path, "utf8") : milestoneSkeleton(progress.id);
94
+ const body = [
95
+ START,
96
+ "## Progresso derivado",
97
+ "",
98
+ `- ${progress.completed_specs} de ${progress.total_specs} specs concluídas (${progress.percent}%).`,
99
+ `- ${progress.backlog_items} itens de backlog relacionados.`,
100
+ "",
101
+ "### Specs vinculadas",
102
+ "",
103
+ ...(specs.length ? specs.map((spec) => `- ${spec.slug} — ${spec.title} (${spec.status})`) : ["- Nenhuma spec vinculada."]),
104
+ "",
105
+ "### Backlog relacionado",
106
+ "",
107
+ ...(backlog.length ? backlog.map((item) => `- ${item.slug} — ${item.title}`) : ["- Nenhum item de backlog relacionado."]),
108
+ END,
109
+ "",
110
+ ].join("\n");
111
+ await writeTextAtomic(path, replaceBlock(current, START, END, body));
112
+ }
113
+ async function writeSpecsIndex(path, specs, milestones) {
114
+ const current = (await pathExists(path)) ? await readFile(path, "utf8") : "# Índice de specs\n\n";
115
+ const rows = specs.map((spec, index) => `| ${String(index + 1).padStart(2, "0")} | ${spec.slug} | ${spec.status} | ${spec.milestones.join(", ") || "—"} |`);
116
+ const body = [
117
+ INDEX_START,
118
+ "## Sequência e estado",
119
+ "",
120
+ "| Ordem | Spec | Estado | Milestones |",
121
+ "| --- | --- | --- | --- |",
122
+ ...(rows.length ? rows : ["| — | Nenhuma spec | — | — |"]),
123
+ "",
124
+ "## Marcos",
125
+ "",
126
+ ...(milestones.length
127
+ ? milestones.map((milestone) => `- ${milestone.id}: ${milestone.completed_specs}/${milestone.total_specs} specs concluídas (${milestone.percent}%).`)
128
+ : ["- Nenhuma milestone vinculada ainda."]),
129
+ INDEX_END,
130
+ "",
131
+ ].join("\n");
132
+ await writeTextAtomic(path, replaceBlock(current, INDEX_START, INDEX_END, body));
133
+ }
134
+ function milestoneSkeleton(id) {
135
+ return `# ${id}\n\n## Objetivo\n\nA confirmar na entrevista.\n\n## Condição de saída\n\nA confirmar na entrevista.\n\n## Fora de escopo\n\nA confirmar na entrevista.\n\n`;
136
+ }
137
+ function replaceBlock(current, start, end, next) {
138
+ const begin = current.indexOf(start);
139
+ const finish = current.indexOf(end);
140
+ if (begin >= 0 && finish >= begin)
141
+ return `${current.slice(0, begin)}${next}${current.slice(finish + end.length).replace(/^\r?\n/u, "")}`;
142
+ const separator = current.endsWith("\n\n") ? "" : current.endsWith("\n") ? "\n" : "\n\n";
143
+ return `${current}${separator}${next}`;
144
+ }
145
+ function compareMilestone(left, right) {
146
+ return left.localeCompare(right, "pt-BR", { numeric: true });
147
+ }
148
+ //# sourceMappingURL=milestones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestones.js","sourceRoot":"","sources":["../src/milestones.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /** Diagnóstico compartilhado pelos fluxos de setup, update e upgrade. */
2
+ export interface PrerequisiteCheck {
3
+ name: "node" | "git" | "skills" | "npm" | "project";
4
+ ok: boolean;
5
+ detail: string;
6
+ command?: string[] | undefined;
7
+ }
8
+ interface CheckOptions {
9
+ path?: string;
10
+ nodeVersion?: string;
11
+ npxOverride?: string;
12
+ skillsLauncher?: string;
13
+ }
14
+ /** Informa se a versão do runtime satisfaz o contrato do pacote. */
15
+ export declare function nodeVersionSupported(version: string): boolean;
16
+ /**
17
+ * Resolve o `npx` que chama a CLI oficial `skills` sob demanda.
18
+ *
19
+ * Toda materialização do Specsfy passa por `npx skills add`, para usar a
20
+ * versão publicada e tornar o comando apresentado à pessoa explícito.
21
+ */
22
+ export declare function resolveNpxSkillsCommand(path?: string, override?: string | undefined, _launcher?: string | undefined): Promise<string[] | undefined>;
23
+ /** Verifica todos os recursos usados pelos comandos de instalação e atualização. */
24
+ export declare function checkPrerequisites(project: string, options?: CheckOptions): Promise<PrerequisiteCheck[]>;
25
+ /** Interrompe o fluxo com todas as correções necessárias em uma única mensagem. */
26
+ export declare function assertPrerequisites(checks: PrerequisiteCheck[], required?: PrerequisiteCheck["name"][]): void;
27
+ export {};
28
+ //# sourceMappingURL=prerequisites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerequisites.d.ts","sourceRoot":"","sources":["../src/prerequisites.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAQzE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IACpD,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAChC;AAED,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,SAAyB,EAC7B,QAAQ,qBAAkC,EAC1C,SAAS,qBAAkB,GAC1B,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAO/B;AAED,oFAAoF;AACpF,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAqD9B;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,QAAQ,GAAE,iBAAiB,CAAC,MAAM,CAAC,EAAmC,GACrE,IAAI,CAQN"}
@@ -0,0 +1,112 @@
1
+ /** Diagnóstico compartilhado pelos fluxos de setup, update e upgrade. */
2
+ import { constants } from "node:fs";
3
+ import { access, stat } from "node:fs/promises";
4
+ import { delimiter, join, resolve } from "node:path";
5
+ const MINIMUM_NODE_VERSION = [22, 20, 0];
6
+ /** Informa se a versão do runtime satisfaz o contrato do pacote. */
7
+ export function nodeVersionSupported(version) {
8
+ const parts = version.split(".").map(Number);
9
+ if (parts.length < 2 || parts.some((part) => !Number.isInteger(part)))
10
+ return false;
11
+ for (let index = 0; index < MINIMUM_NODE_VERSION.length; index += 1) {
12
+ const difference = (parts[index] ?? 0) - MINIMUM_NODE_VERSION[index];
13
+ if (difference)
14
+ return difference > 0;
15
+ }
16
+ return true;
17
+ }
18
+ /**
19
+ * Resolve o `npx` que chama a CLI oficial `skills` sob demanda.
20
+ *
21
+ * Toda materialização do Specsfy passa por `npx skills add`, para usar a
22
+ * versão publicada e tornar o comando apresentado à pessoa explícito.
23
+ */
24
+ export async function resolveNpxSkillsCommand(path = process.env.PATH ?? "", override = process.env.SPECSFY_NPX_COMMAND, _launcher = process.argv[1]) {
25
+ if (override) {
26
+ const executable = resolve(override);
27
+ return (await isExecutable(executable)) ? [executable, "skills"] : undefined;
28
+ }
29
+ const npx = await findExecutable("npx", path);
30
+ return npx ? [npx, "skills"] : undefined;
31
+ }
32
+ /** Verifica todos os recursos usados pelos comandos de instalação e atualização. */
33
+ export async function checkPrerequisites(project, options = {}) {
34
+ const path = options.path ?? process.env.PATH ?? "";
35
+ const nodeVersion = options.nodeVersion ?? process.versions.node;
36
+ const git = await findExecutable("git", path);
37
+ const npm = await findExecutable("npm", path);
38
+ const skills = await resolveNpxSkillsCommand(path, options.npxOverride ?? process.env.SPECSFY_NPX_COMMAND, options.skillsLauncher ?? process.argv[1]);
39
+ const target = resolve(project);
40
+ let projectOk = false;
41
+ try {
42
+ projectOk = (await stat(target)).isDirectory();
43
+ if (projectOk)
44
+ await access(target, constants.R_OK | constants.W_OK);
45
+ }
46
+ catch {
47
+ projectOk = false;
48
+ }
49
+ return [
50
+ {
51
+ name: "node",
52
+ ok: nodeVersionSupported(nodeVersion),
53
+ detail: `Node.js 22.20 ou mais recente; versão atual: ${nodeVersion}`,
54
+ },
55
+ {
56
+ name: "git",
57
+ ok: Boolean(git),
58
+ detail: git ? `Git encontrado em ${git}` : "Git não encontrado no PATH",
59
+ command: git ? [git] : undefined,
60
+ },
61
+ {
62
+ name: "skills",
63
+ ok: Boolean(skills),
64
+ detail: skills
65
+ ? `instalação de skills disponível por ${skills.join(" ")}`
66
+ : "npx não encontrado; instale o npm e disponibilize `npx` no PATH",
67
+ command: skills,
68
+ },
69
+ {
70
+ name: "npm",
71
+ ok: Boolean(npm),
72
+ detail: npm ? `npm encontrado em ${npm}` : "npm não encontrado no PATH",
73
+ command: npm ? [npm] : undefined,
74
+ },
75
+ {
76
+ name: "project",
77
+ ok: projectOk,
78
+ detail: projectOk
79
+ ? `projeto legível e gravável em ${target}`
80
+ : `projeto ausente, inválido ou sem permissão de escrita: ${target}`,
81
+ },
82
+ ];
83
+ }
84
+ /** Interrompe o fluxo com todas as correções necessárias em uma única mensagem. */
85
+ export function assertPrerequisites(checks, required = checks.map(({ name }) => name)) {
86
+ const selected = new Set(required);
87
+ const failures = checks.filter(({ name, ok }) => selected.has(name) && !ok);
88
+ if (!failures.length)
89
+ return;
90
+ throw new Error("pré-requisitos ausentes:\n" +
91
+ failures.map(({ detail }) => `- ${detail}`).join("\n"));
92
+ }
93
+ async function findExecutable(name, path) {
94
+ for (const directory of path.split(delimiter)) {
95
+ if (!directory)
96
+ continue;
97
+ const executable = join(directory, name);
98
+ if (await isExecutable(executable))
99
+ return executable;
100
+ }
101
+ return undefined;
102
+ }
103
+ async function isExecutable(path) {
104
+ try {
105
+ await access(path, constants.X_OK);
106
+ return true;
107
+ }
108
+ catch {
109
+ return false;
110
+ }
111
+ }
112
+ //# sourceMappingURL=prerequisites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../src/prerequisites.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ export interface SpecProgress {
8
8
  path: string;
9
9
  content: string;
10
10
  status: string;
11
+ effort: number | null;
12
+ execution_profile: "light" | "standard" | "high" | "maximum" | "unknown";
11
13
  definition_gate: string;
12
14
  plan_gate: string;
13
15
  delivery_gate: string;
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAGxE;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,eAAe,CAwBrE;AAED,8DAA8D;AAC9D,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcvE;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAG/E"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iBAAiB,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACzE,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAGxE;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,eAAe,CAwBrE;AAED,8DAA8D;AAC9D,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcvE;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAG/E"}
package/dist/progress.js CHANGED
@@ -2,9 +2,10 @@
2
2
  * Projeção de progresso das especificações Markdown.
3
3
  */
4
4
  import { createHash } from "node:crypto";
5
- import { readFile, readdir } from "node:fs/promises";
6
- import { basename, dirname, join, relative } from "node:path";
7
- import { isFile, resolvePath } from "./filesystem.js";
5
+ import { readFile } from "node:fs/promises";
6
+ import { basename, dirname, relative } from "node:path";
7
+ import { resolvePath } from "./filesystem.js";
8
+ import { scanSpecPaths } from "./lifecycle.js";
8
9
  const FIELD = /^\*\*([^*]+)\*\*:\s*(.+?)\s*$/;
9
10
  const TABLE_FIELD = /^\|\s*([^|]+?)\s*\|\s*([^|]+?)\s*\|\s*$/;
10
11
  const CHECKLIST_ITEM = /^\s*[-*+]\s*\[([ xX])\]\s+(.+?)\s*$/;
@@ -13,7 +14,7 @@ const GATE_NAMES = ["definition gate", "plan gate", "delivery gate"];
13
14
  /** Lê specs no layout canônico e no layout legado. */
14
15
  export async function scanSpecs(project) {
15
16
  const root = resolvePath(project);
16
- return Promise.all((await specPaths(root)).map(parseSpec));
17
+ return Promise.all((await scanSpecPaths(root)).map(parseSpec));
17
18
  }
18
19
  /** Consolida as métricas das specs fornecidas. */
19
20
  export function summarizeSpecs(specs) {
@@ -42,7 +43,7 @@ export function summarizeSpecs(specs) {
42
43
  export async function specsFingerprint(project) {
43
44
  const root = resolvePath(project);
44
45
  const digest = createHash("sha256");
45
- for (const path of await specPaths(root)) {
46
+ for (const path of await scanSpecPaths(root)) {
46
47
  digest.update(relative(root, path));
47
48
  digest.update("\0");
48
49
  try {
@@ -60,29 +61,6 @@ export function serializeSpec(spec) {
60
61
  const { content: _content, ...serialized } = spec;
61
62
  return serialized;
62
63
  }
63
- async function specPaths(root) {
64
- const paths = new Set();
65
- for (const parent of [
66
- join(root, "specs", "specs"),
67
- join(root, "specs"),
68
- ]) {
69
- let entries;
70
- try {
71
- entries = await readdir(parent, { withFileTypes: true });
72
- }
73
- catch {
74
- continue;
75
- }
76
- for (const entry of entries) {
77
- if (!entry.isDirectory())
78
- continue;
79
- const path = join(parent, entry.name, "spec.md");
80
- if (await isFile(path))
81
- paths.add(path);
82
- }
83
- }
84
- return [...paths].sort();
85
- }
86
64
  async function parseSpec(path) {
87
65
  const content = await readFile(path, "utf8");
88
66
  const slug = basename(dirname(path));
@@ -118,6 +96,8 @@ async function parseSpec(path) {
118
96
  path,
119
97
  content,
120
98
  status: fields.get("status") ?? "Unknown",
99
+ effort: parsedEffort(fields.get("effort")),
100
+ execution_profile: effortProfile(parsedEffort(fields.get("effort"))),
121
101
  definition_gate: fields.get("definition gate") ?? "Unknown",
122
102
  plan_gate: fields.get("plan gate") ?? "Unknown",
123
103
  delivery_gate: fields.get("delivery gate") ?? "Unknown",
@@ -132,6 +112,23 @@ async function parseSpec(path) {
132
112
  percent: ratio(totalItems ? completedItems : passedGates, totalItems ? totalItems : totalGates),
133
113
  };
134
114
  }
115
+ function parsedEffort(value) {
116
+ if (!value || !/^\d+$/u.test(value))
117
+ return null;
118
+ const effort = Number(value);
119
+ return effort >= 1 && effort <= 10 ? effort : null;
120
+ }
121
+ function effortProfile(effort) {
122
+ if (effort === null)
123
+ return "unknown";
124
+ if (effort <= 2)
125
+ return "light";
126
+ if (effort <= 6)
127
+ return "standard";
128
+ if (effort <= 8)
129
+ return "high";
130
+ return "maximum";
131
+ }
135
132
  function sum(specs, key) {
136
133
  return specs.reduce((total, spec) => total + spec[key], 0);
137
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"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"}
package/dist/tui.d.ts CHANGED
@@ -59,6 +59,30 @@ export declare const TUI_TABS: readonly [{
59
59
  readonly label: "Sobre";
60
60
  readonly key: "C-o";
61
61
  }];
62
+ /**
63
+ * Paleta semântica da TUI, derivada dos tokens oficiais do dark mode.
64
+ *
65
+ * Os pares de texto, seleção e foco mantêm contraste mensurável sem depender
66
+ * das cores configuráveis de 16 posições do terminal da pessoa usuária.
67
+ */
68
+ export declare const TUI_THEME: {
69
+ readonly background: "#000A0E";
70
+ readonly surface: "#001117";
71
+ readonly surfaceRaised: "#03212A";
72
+ readonly text: "#F2F8F9";
73
+ readonly textMuted: "#B2C6CE";
74
+ readonly border: "#5F7D8C";
75
+ readonly accent: "#C4B5FD";
76
+ readonly activeBackground: "#5EEDE1";
77
+ readonly activeText: "#001117";
78
+ readonly selectedBackground: "#6D28D9";
79
+ readonly selectedText: "#F2F8F9";
80
+ readonly primaryBackground: "#15626A";
81
+ readonly primaryText: "#F2F8F9";
82
+ readonly focusBackground: "#5EEDE1";
83
+ readonly focusText: "#001117";
84
+ readonly warning: "#FCD34D";
85
+ };
62
86
  /** Identificador válido de uma área principal do dashboard. */
63
87
  export type Tab = (typeof TUI_TABS)[number]["id"];
64
88
  /** Filtro aplicado sobre as opções de skill disponíveis. */
@@ -95,6 +119,10 @@ export declare class SpecsfyTui {
95
119
  private mountShell;
96
120
  private bindKeys;
97
121
  private showTab;
122
+ /** Recupera um alvo navegável quando um painel foi recriado ou fechado. */
123
+ private focusActiveTab;
124
+ /** Renderiza somente enquanto a tela ainda pertence ao ciclo atual. */
125
+ private renderScreen;
98
126
  /**
99
127
  * Retorna um nível por vez: fecha modal, limpa busca e volta ao Home.
100
128
  *
@@ -111,6 +139,7 @@ export declare class SpecsfyTui {
111
139
  private renderSkills;
112
140
  private renderAbout;
113
141
  private refreshAll;
142
+ private refreshAllInternal;
114
143
  private refreshIfChanged;
115
144
  private skillOptions;
116
145
  private visibleSkills;
package/dist/tui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}