raptor-aios 0.12.1 → 0.13.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/CHANGELOG.md +50 -0
- package/README.md +24 -6
- package/dist/_core/dist/git/repo.js +9 -0
- package/dist/_core/package.json +1 -1
- package/dist/commands/new.js +23 -9
- package/dist/shared/git-prompt.js +2 -2
- package/dist/shared/project.js +23 -18
- package/package.json +1 -1
- package/scripts/prepare-npm.mjs +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,56 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.13.0] - 2026-06-18
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **`raptor new` parou de "sobrescrever" specs anteriores — resolução de feature por slug
|
|
13
|
+
exato.** `featureDir()`/`auditableDir()` casavam o slug informado por **sufixo**
|
|
14
|
+
(`d.endsWith('-'+slug)`) e devolviam o primeiro match, então um slug curto resolvia
|
|
15
|
+
silenciosamente para um diretório irmão mais longo (`home-screen` →
|
|
16
|
+
`001-dashboard-home-screen`). Os ~22 comandos a jusante (`plan`, `tasks`, `implement`,
|
|
17
|
+
`clarify`, `verify`, `status`, `audit`, …) passavam a operar sobre a feature **errada**,
|
|
18
|
+
parecendo sobrescrever os artefatos da anterior. Agora o match é **exato** (nome completo
|
|
19
|
+
`NNN-slug` ou slug após o número); múltiplos diretórios casando viram **erro de
|
|
20
|
+
ambiguidade** em vez de adivinhação.
|
|
21
|
+
- **`raptor new` não quebra mais quando `.raptor/specs` não existe.** Git não versiona
|
|
22
|
+
diretórios vazios, então um clone novo (ou após `git clean`) podia não ter a pasta; o
|
|
23
|
+
`readdir` agora tolera a ausência e trata como "sem features".
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- **Branches de feature passam a empilhar (forkam do HEAD atual, não mais de `main`).** Com
|
|
28
|
+
`git.branch_per_feature`, cada feature nascia de uma `main` sem as specs das irmãs
|
|
29
|
+
(commitadas só nas branches delas); ao trocar de branch o Git esvaziava a pasta da spec
|
|
30
|
+
anterior (deixando só a casca `contracts/`), dando a impressão de perda de artefatos. Agora
|
|
31
|
+
a branch nova forka da **branch ativa**, então as specs anteriores são herdadas no working
|
|
32
|
+
tree e o histórico empilha. A primeira feature ainda nasce de `main` naturalmente (é onde
|
|
33
|
+
você começa); HEAD destacado cai no fallback da branch-base.
|
|
34
|
+
- **Numeração `NNN` à prova de colisão entre branches.** O próximo número agora vem da
|
|
35
|
+
**união** das pastas em `.raptor/specs/` **e** dos números embutidos nos nomes de **todas
|
|
36
|
+
as branches** (locais e remotas, via novo `listBranches()` do core), eliminando o
|
|
37
|
+
`feat/002-*` duplicado que surgia quando o contador só via a árvore da branch atual. O
|
|
38
|
+
reuso-por-slug também consulta as branches, preservando a idempotência de `raptor new`
|
|
39
|
+
(re-rodar um slug que vive só em uma branch irmã volta para o número dela).
|
|
40
|
+
|
|
41
|
+
## [0.12.2] - 2026-06-16
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
|
|
45
|
+
- **Glossário e README atualizados com os termos das releases 0.9.0→0.12.1.** O glossário
|
|
46
|
+
canônico (`docs/glossary.md`) ganhou 6 entradas novas — `gol-smiles (G1–G6)`, os Gol Gates
|
|
47
|
+
`gate.gol.*`, `deep_verify`, `Transport`, `Setup Wizard` e `Design / Figma Integration` — e
|
|
48
|
+
teve a contagem de gates atualizada (**48 gates**, família `gol` incluída; apêndices C/D
|
|
49
|
+
completados com `verify tangerina/arch/i18n`, `raptor setup` e `raptor design`). O README
|
|
50
|
+
passou a documentar a captura determinística do Figma (`figma-rest`), o preset `gol-smiles`
|
|
51
|
+
e atualizou o badge de versão. Certificação do glossário avançada para `0.12.1`.
|
|
52
|
+
|
|
53
|
+
### Fixed
|
|
54
|
+
|
|
55
|
+
- **Correção factual no glossário:** `gate.release.crash_free_window` não existe no código (é
|
|
56
|
+
apenas uma menção *future*) — removido do catálogo de gates.
|
|
57
|
+
|
|
8
58
|
## [0.12.1] - 2026-06-13
|
|
9
59
|
|
|
10
60
|
### Changed
|
package/README.md
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
[](https://www.npmjs.com/package/raptor-aios)
|
|
8
8
|
[](https://nodejs.org)
|
|
9
9
|
[](https://reactnative.dev)
|
|
10
|
-
[](#️-desenvolvimento-local)
|
|
11
|
+
[](CHANGELOG.md)
|
|
12
12
|
[](LICENSE)
|
|
13
13
|
|
|
14
14
|
</div>
|
|
@@ -464,7 +464,7 @@ Declarar não é cumprir. O Raptor **mede** e compara com o declarado:
|
|
|
464
464
|
|
|
465
465
|
| Capacidade | Para que serve | Comandos |
|
|
466
466
|
| ----------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
|
|
467
|
-
| 🎚️ **Presets** | Conjuntos reusáveis de artigos + gates, empilháveis. Bundled: `mobile-opinionated
|
|
467
|
+
| 🎚️ **Presets** | Conjuntos reusáveis de artigos + gates, empilháveis. Bundled: `mobile-opinionated` (M1–M6), `gol-smiles` (G1–G6, empilha sobre mobile), `lean`. | `raptor preset list · add · info · remove` |
|
|
468
468
|
| 🔁 **Workflows** | Orquestram o ciclo via YAML, com gates de revisão humana. Bundled: `sdd-cycle`, `sdd-cycle-quick`. | `raptor workflow catalog · run · status · resume · list` |
|
|
469
469
|
| 🤖 **Agentes** | Materializa os slash commands por agente. | `raptor add-agent` · `raptor list-agents` |
|
|
470
470
|
| 🧠 **Skills** | Habilidades reusáveis materializadas para os agentes. | `raptor skill add · list · sync · remove` |
|
|
@@ -472,6 +472,7 @@ Declarar não é cumprir. O Raptor **mede** e compara com o declarado:
|
|
|
472
472
|
| 🪝 **Hooks** | Scripts disparados em **34 pontos** do ciclo (`before_*`/`after_*` de 17 comandos). | `raptor hook list · run` |
|
|
473
473
|
| 📦 **Extensões** | Pacotes self-contained (templates/gates/hooks/workflows). | `raptor extension add · list · info · remove` |
|
|
474
474
|
| 🎟️ **Jira** | Puxa issues do Jira (somente leitura) para semear specs. | `raptor jira connect · status · pull · disconnect` |
|
|
475
|
+
| 🎨 **Figma / Design** | Captura **determinística** de tokens/telas/assets/fontes do Figma (provider `figma-rest` + PAT) e semeia `design/`. | `raptor design connect · status · pull · sync · disconnect` |
|
|
475
476
|
| 📜 **Auditoria & trace** | Consulta a trilha de eventos e a rastreabilidade. | `raptor audit query · show` · `raptor trace` |
|
|
476
477
|
|
|
477
478
|
### 🎟️ Integração com Jira
|
|
@@ -484,6 +485,20 @@ raptor new login --jira APP-1234 # semeia a spec a partir da issue
|
|
|
484
485
|
|
|
485
486
|
> 📖 Como o card é capturado **por inteiro** (campos ricos, links de Figma) e redistribuído na spec — com os gates cobrando: veja [docs/jira-spec-enrichment.md](docs/jira-spec-enrichment.md).
|
|
486
487
|
|
|
488
|
+
### 🎨 Integração com Figma (design determinístico)
|
|
489
|
+
|
|
490
|
+
Em vez de o link do Figma virar só uma URL na spec, o Raptor **captura o design de forma determinística** e semeia a pasta `design/` — espelhando o modelo do Jira (Raptor captura, agente redistribui).
|
|
491
|
+
|
|
492
|
+
```bash
|
|
493
|
+
raptor design connect # provider figma-rest (Personal Access Token) — default, CI-friendly
|
|
494
|
+
raptor new home --figma <url-figma> # captura tokens/telas/assets/fontes e semeia design/
|
|
495
|
+
raptor design sync home # re-captura idempotente (nunca sobrescreve o refino)
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
O provider **`figma-rest`** usa a REST API da Figma com um PAT (`${FIGMA_TOKEN}` no `raptor.yml`), é determinístico e roda em CI. A captura gera `design/tokens.json` (colors/typography/spacing/radii), `design/screens/<slug>.md` (frames de topo) e `design/assets-manifest.json` (assets baixados com SHA-256, guarda anti-SSRF). Quando há captura real, os prompts fazem o **flip REDISTRIBUIR**: o agente passa a *refinar e redistribuir* os artefatos em disco em vez de "olhar o Figma" — cobrado pelo `gate.design.ready`.
|
|
499
|
+
|
|
500
|
+
> 📖 Detalhes, providers e limitações: [docs/design-figma-sync.md](docs/design-figma-sync.md) e [docs/design-gate.md](docs/design-gate.md).
|
|
501
|
+
|
|
487
502
|
---
|
|
488
503
|
|
|
489
504
|
## 📖 Referência de comandos CLI
|
|
@@ -493,11 +508,13 @@ raptor new login --jira APP-1234 # semeia a spec a partir da issue
|
|
|
493
508
|
🌿 Branch/commit commit · scan
|
|
494
509
|
🔬 Verificação verify · verify a11y · verify perf · verify stores · verify os-matrix
|
|
495
510
|
verify architecture · verify audit · verify constitution
|
|
511
|
+
verify tangerina · verify arch · verify i18n (preset gol-smiles)
|
|
496
512
|
📊 Status status · doctor · trace · audit query · audit show
|
|
497
513
|
⚖️ Governança gate list · gate approve · gate skip · repair constitution · hotfix · resync · upgrade
|
|
498
514
|
🧩 Extensão preset … · workflow … · skill … · mcp … · hook … · extension …
|
|
499
515
|
add-agent · list-agents · add-extension
|
|
500
516
|
🎟️ Jira jira connect · status · pull · disconnect
|
|
517
|
+
🎨 Figma/Design design connect · status · pull · sync · disconnect
|
|
501
518
|
```
|
|
502
519
|
|
|
503
520
|
Rode `raptor <comando> --help` para os detalhes (flags, exemplos) de cada um.
|
|
@@ -546,7 +563,7 @@ Flags disponíveis:
|
|
|
546
563
|
├── raptor.yml # ⚙️ config (preset, ai, git.branch_per_feature, commit_trailer)
|
|
547
564
|
├── raptor.manifest.json # 📋 manifest de instalação
|
|
548
565
|
├── agents.yml · skills.yml · mcp.yml
|
|
549
|
-
├── specs/<NNN-slug>/ # 📝 spec.md · plan.md · tasks.md · impl-log.md · audit.jsonl · checklists/
|
|
566
|
+
├── specs/<NNN-slug>/ # 📝 spec.md · plan.md · tasks.md · impl-log.md · audit.jsonl · checklists/ · design/ (tokens.json · screens/ · assets-manifest.json)
|
|
550
567
|
├── templates/ # 🧱 cópia bundlada (commands/*.md + *-template.md)
|
|
551
568
|
├── memory/ # 🧠 constitution copy · amendments.log · decisions.md · glossary.md
|
|
552
569
|
├── extensions/ · workflows/ · presets/ · hooks/ · scripts/ · cache/
|
|
@@ -564,9 +581,10 @@ Comece pelo **[📖 Glossário Canônico](docs/glossary.md)** — a referência
|
|
|
564
581
|
|
|
565
582
|
| Documento | Sobre |
|
|
566
583
|
| ------------------------------------------------------------------ | ---------------------------------------------------------------------------------- |
|
|
567
|
-
| **[📖 docs/glossary.md](docs/glossary.md)** | Glossário canônico: conceitos, hierarquias, catálogo de
|
|
584
|
+
| **[📖 docs/glossary.md](docs/glossary.md)** | Glossário canônico: conceitos, hierarquias, catálogo de 48 gates e de comandos CLI |
|
|
568
585
|
| [🧭 docs/setup-wizard.md](docs/setup-wizard.md) | Assistente de instalação `raptor setup`: onboarding, IA/IDE, preset, Jira/Figma |
|
|
569
586
|
| [🛡️ docs/readiness-gates.md](docs/readiness-gates.md) | Gates de prontidão (`spec/plan/tasks.ready`) em detalhe |
|
|
587
|
+
| [🎨 docs/design-figma-sync.md](docs/design-figma-sync.md) | Captura determinística do Figma (`figma-rest`): tokens/telas/assets/fontes + flip REDISTRIBUIR |
|
|
570
588
|
| [🎨 docs/design-gate.md](docs/design-gate.md) | Design gate, integração Figma e `assets-manifest.json` |
|
|
571
589
|
| [🔗 docs/artifact-chain.md](docs/artifact-chain.md) | Cadeia de artefatos e rastreabilidade spec→plan→tasks→código |
|
|
572
590
|
| [🎟️ docs/jira-spec-enrichment.md](docs/jira-spec-enrichment.md) | Enriquecimento de spec a partir de cards do Jira |
|
|
@@ -603,7 +621,7 @@ Monorepo pnpm (`packages/core` = `@raptor/core`, `packages/cli` = binário `rapt
|
|
|
603
621
|
```bash
|
|
604
622
|
pnpm install
|
|
605
623
|
pnpm build
|
|
606
|
-
pnpm -r test && pnpm test:e2e #
|
|
624
|
+
pnpm -r test && pnpm test:e2e # ~1356 testes (1071 core + ~251 cli + 34 e2e)
|
|
607
625
|
|
|
608
626
|
# usar a CLI local em outro projeto:
|
|
609
627
|
cd packages/cli && npm link # ou: pnpm link --global
|
|
@@ -14,6 +14,15 @@ export function branchExists(exec, cwd, name) {
|
|
|
14
14
|
});
|
|
15
15
|
return r.status === 0;
|
|
16
16
|
}
|
|
17
|
+
export function listBranches(exec, cwd) {
|
|
18
|
+
const r = exec(["for-each-ref", "--format=%(refname:short)", "refs/heads", "refs/remotes"], { cwd });
|
|
19
|
+
if (r.status !== 0 || !r.stdout)
|
|
20
|
+
return [];
|
|
21
|
+
return r.stdout
|
|
22
|
+
.split("\n")
|
|
23
|
+
.map((s) => s.trim())
|
|
24
|
+
.filter(Boolean);
|
|
25
|
+
}
|
|
17
26
|
export function isWorkingTreeClean(exec, cwd) {
|
|
18
27
|
const r = exec(["status", "--porcelain"], { cwd });
|
|
19
28
|
return r.status === 0 && r.stdout === "";
|
package/dist/_core/package.json
CHANGED
package/dist/commands/new.js
CHANGED
|
@@ -3,7 +3,7 @@ import { BaseCommand } from "../base-command.js";
|
|
|
3
3
|
import { step, heading } from "../shared/ui.js";
|
|
4
4
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, } from "node:fs";
|
|
5
5
|
import { join } from "node:path";
|
|
6
|
-
import { appendAuditEvent, buildCanonicalPrompt, deriveBranchName, executeWorkflow, extractFigmaRefs, hashString, inferKindFromJiraIssueType, loadAgentsConfig, mapDesignToSpecContext, mapIssueToSpecContext, parseFrontmatter, renderBundled, selectAgent, writeDesignScaffold, } from "../_core/dist/index.js";
|
|
6
|
+
import { appendAuditEvent, buildCanonicalPrompt, deriveBranchName, execSyncGitExecutor, executeWorkflow, listBranches, extractFigmaRefs, hashString, inferKindFromJiraIssueType, loadAgentsConfig, mapDesignToSpecContext, mapIssueToSpecContext, parseFrontmatter, renderBundled, selectAgent, writeDesignScaffold, } from "../_core/dist/index.js";
|
|
7
7
|
import { currentActor, readConfig, readInitOptions, requireProjectRoot, } from "../shared/project.js";
|
|
8
8
|
import { ensureWorkItemBranch, resolveInteractive, } from "../shared/git-prompt.js";
|
|
9
9
|
import { jiraConn, jiraReadyNonInteractive, openJiraClient, } from "../shared/jira.js";
|
|
@@ -14,6 +14,12 @@ import { waitForPhaseArtifact, } from "../shared/artifact-io.js";
|
|
|
14
14
|
import { resolveWorkflow } from "../shared/workflow-resolver.js";
|
|
15
15
|
import { writeFeaturePrompt } from "../shared/feature-prompt.js";
|
|
16
16
|
import { cliCommandExecutor } from "../workflow/executor.js";
|
|
17
|
+
function parseFeatureBranch(name) {
|
|
18
|
+
const m = /(?:^|\/)(\d{3})-(.+)$/.exec(name);
|
|
19
|
+
if (!m)
|
|
20
|
+
return null;
|
|
21
|
+
return { nnn: m[1], slug: (m[2] ?? "").split(".")[0] };
|
|
22
|
+
}
|
|
17
23
|
export default class New extends BaseCommand {
|
|
18
24
|
static description = "Create a new feature spec in the current Raptor project";
|
|
19
25
|
static examples = [
|
|
@@ -88,17 +94,25 @@ export default class New extends BaseCommand {
|
|
|
88
94
|
if (!/^[a-z][a-z0-9-]*$/.test(args.slug)) {
|
|
89
95
|
this.error("Slug must be kebab-case (lowercase letters, digits, hyphens; starts with a letter).");
|
|
90
96
|
}
|
|
91
|
-
const existing =
|
|
97
|
+
const existing = existsSync(specsDir)
|
|
98
|
+
? readdirSync(specsDir).filter((d) => /^\d{3}-/.test(d))
|
|
99
|
+
: [];
|
|
100
|
+
const branchFeatures = listBranches(execSyncGitExecutor, root)
|
|
101
|
+
.map(parseFeatureBranch)
|
|
102
|
+
.filter((b) => b !== null);
|
|
92
103
|
const reusedDir = existing.find((d) => d.replace(/^\d{3}-/, "") === args.slug);
|
|
93
|
-
const
|
|
94
|
-
const
|
|
104
|
+
const reusedBranch = branchFeatures.find((b) => b.slug === args.slug);
|
|
105
|
+
const reusedNnn = reusedDir
|
|
106
|
+
? reusedDir.slice(0, 3)
|
|
107
|
+
: reusedBranch?.nnn;
|
|
108
|
+
const reusing = reusedNnn !== undefined;
|
|
109
|
+
const dirNumbers = existing
|
|
95
110
|
.map((d) => parseInt(d.slice(0, 3), 10))
|
|
96
111
|
.filter((n) => !Number.isNaN(n));
|
|
97
|
-
const
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const featureName = reusing ? reusedDir : `${nnn}-${args.slug}`;
|
|
112
|
+
const branchNumbers = branchFeatures.map((b) => parseInt(b.nnn, 10));
|
|
113
|
+
const maxN = Math.max(0, ...dirNumbers, ...branchNumbers);
|
|
114
|
+
const nnn = reusing ? reusedNnn : String(maxN + 1).padStart(3, "0");
|
|
115
|
+
const featureName = reusing && reusedDir ? reusedDir : `${nnn}-${args.slug}`;
|
|
102
116
|
const featureDir = join(specsDir, featureName);
|
|
103
117
|
const actor0 = currentActor("human");
|
|
104
118
|
runBeforeHook(this, {
|
|
@@ -21,7 +21,7 @@ export async function confirmPrompt(question) {
|
|
|
21
21
|
}
|
|
22
22
|
async function promptDirtyTree(cmd, branchName) {
|
|
23
23
|
cmd.log("");
|
|
24
|
-
cmd.warn(`Your working tree has uncommitted changes, and the new branch "${branchName}"
|
|
24
|
+
cmd.warn(`Your working tree has uncommitted changes, and the new branch "${branchName}" will fork from the current branch.`);
|
|
25
25
|
cmd.log(" How do you want to proceed?");
|
|
26
26
|
cmd.log(" 1) stash — set the changes aside, branch from a clean base");
|
|
27
27
|
cmd.log(" 2) carry — take the uncommitted changes onto the new branch");
|
|
@@ -86,7 +86,7 @@ export async function ensureWorkItemBranch(input) {
|
|
|
86
86
|
}
|
|
87
87
|
return { outcome: "switched", branch: branchName, base: null };
|
|
88
88
|
}
|
|
89
|
-
const base = defaultBaseBranch(exec, root);
|
|
89
|
+
const base = currentBranch(exec, root) ?? defaultBaseBranch(exec, root);
|
|
90
90
|
const st = createBranch(exec, root, branchName, base);
|
|
91
91
|
if (st !== 0) {
|
|
92
92
|
const hint = carry
|
package/dist/shared/project.js
CHANGED
|
@@ -59,17 +59,30 @@ export function activePresetIds(cfg) {
|
|
|
59
59
|
ordered.push(singular);
|
|
60
60
|
return ordered;
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
function resolveFeatureDir(base, slug) {
|
|
63
|
+
if (!existsSync(base))
|
|
64
|
+
return null;
|
|
65
|
+
const dirs = readdirSync(base);
|
|
66
|
+
const matches = dirs.filter((d) => d === slug || d.replace(/^\d{3}-/, '') === slug);
|
|
67
|
+
if (matches.length === 1)
|
|
68
|
+
return join(base, matches[0]);
|
|
69
|
+
if (matches.length > 1) {
|
|
70
|
+
throw new Error(`Ambiguous feature '${slug}' — matches ${matches
|
|
71
|
+
.sort()
|
|
72
|
+
.join(', ')}. Pass the full directory name (e.g. ${matches.sort()[0]}).`);
|
|
73
|
+
}
|
|
68
74
|
if (/^\d{3}-/.test(slug)) {
|
|
69
|
-
const direct = join(
|
|
75
|
+
const direct = join(base, slug);
|
|
70
76
|
if (existsSync(direct))
|
|
71
77
|
return direct;
|
|
72
78
|
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
export function featureDir(root, slug) {
|
|
82
|
+
const specs = join(root, '.raptor', 'specs');
|
|
83
|
+
const resolved = resolveFeatureDir(specs, slug);
|
|
84
|
+
if (resolved)
|
|
85
|
+
return resolved;
|
|
73
86
|
throw new Error(`feature not found: ${slug} (under ${specs})`);
|
|
74
87
|
}
|
|
75
88
|
export function auditableDir(root, slug) {
|
|
@@ -78,17 +91,9 @@ export function auditableDir(root, slug) {
|
|
|
78
91
|
join(root, '.raptor', 'hotfixes'),
|
|
79
92
|
];
|
|
80
93
|
for (const base of candidates) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const match = dirs.find((d) => d === slug || d.endsWith(`-${slug}`));
|
|
85
|
-
if (match)
|
|
86
|
-
return join(base, match);
|
|
87
|
-
if (/^\d{3}-/.test(slug)) {
|
|
88
|
-
const direct = join(base, slug);
|
|
89
|
-
if (existsSync(direct))
|
|
90
|
-
return direct;
|
|
91
|
-
}
|
|
94
|
+
const resolved = resolveFeatureDir(base, slug);
|
|
95
|
+
if (resolved)
|
|
96
|
+
return resolved;
|
|
92
97
|
}
|
|
93
98
|
throw new Error(`slug not found: ${slug} (checked .raptor/specs and .raptor/hotfixes)`);
|
|
94
99
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "raptor-aios",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Raptor — Spec-Driven Development (SDD) CLI for modern mobile apps. Constitutional gates, audit trail, real verification (a11y/perf/stores/OS matrix), and AI-agent slash commands.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/scripts/prepare-npm.mjs
CHANGED