specatlas 0.1.7 → 0.1.9

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 (2) hide show
  1. package/dist/bin.js +12 -4
  2. package/package.json +2 -2
package/dist/bin.js CHANGED
@@ -9898,10 +9898,11 @@ function deriveState(input) {
9898
9898
  }
9899
9899
  if (approval.status === "missing" || approval.status === "stale") {
9900
9900
  blockedBy.push(approval.status === "stale" ? "la firma de la spec qued\xF3 obsoleta (el archivo cambi\xF3)" : "la spec no est\xE1 aprobada");
9901
+ const presented = change.presentationPath !== void 0;
9901
9902
  return {
9902
9903
  state: "awaiting_approval",
9903
9904
  blockedBy,
9904
- nextAction: next(`satlas present ${change.slug}`, "Presentar la propuesta y firmar la aprobaci\xF3n (satlas approve)"),
9905
+ nextAction: presented ? next(`satlas approve ${change.slug} --by "<nombre>"`, "Firmar la aprobaci\xF3n (la presentaci\xF3n ya est\xE1 generada)") : next(`satlas present ${change.slug}`, "Presentar la propuesta y firmar la aprobaci\xF3n (satlas approve)"),
9905
9906
  progress
9906
9907
  };
9907
9908
  }
@@ -10128,6 +10129,8 @@ async function loadChange(root, slug, relDir) {
10128
10129
  if (await exists(planFile)) change.planPath = planFile;
10129
10130
  const reviewFile = path4.join(dir, "review.md");
10130
10131
  if (await exists(reviewFile)) change.reviewPath = reviewFile;
10132
+ const presentationFile = path4.join(dir, "presentation", "index.html");
10133
+ if (await exists(presentationFile)) change.presentationPath = presentationFile;
10131
10134
  const tasksFile = path4.join(dir, "tasks.md");
10132
10135
  const tasksRaw = await readTextIfExists(tasksFile);
10133
10136
  if (tasksRaw !== void 0) {
@@ -11850,6 +11853,8 @@ async function generatePresentation(opts) {
11850
11853
  const mockupInfo = await copyMockups(root, change, mockupsCopyDir);
11851
11854
  const proposalRaw = await readTextIfExists(path12.join(change.dir, "proposal.md"));
11852
11855
  const proposalBody = proposalRaw ? parseFrontmatter(proposalRaw).body : "";
11856
+ const approvals = await loadApprovals(path12.join(root, ".sdd"));
11857
+ const approval = verifyApproval(change, approvals.byArtifact, config, deltaContent);
11853
11858
  const labels = labelsFor(language);
11854
11859
  const html = page({
11855
11860
  language,
@@ -11866,7 +11871,8 @@ async function generatePresentation(opts) {
11866
11871
  evidence: new Map((change.verify?.evidence ?? []).map((e) => [e.scenario, e.result])),
11867
11872
  mockups: mockupInfo.screens,
11868
11873
  screenshots: mockupInfo.screenshots,
11869
- approveHint: `satlas approve ${change.slug} --by "<nombre>" --channel presentation`
11874
+ approveHint: `satlas approve ${change.slug} --by "<nombre>" --channel presentation`,
11875
+ ...approval.status === "valid" && approval.approvedBy ? { approval: { by: approval.approvedBy, at: approval.approvedAt ?? "" } } : {}
11870
11876
  });
11871
11877
  const outFile = path12.join(presentationDir, "index.html");
11872
11878
  await writeText(outFile, html);
@@ -11917,6 +11923,7 @@ function labelsFor(language) {
11917
11923
  mockups: "Mockups",
11918
11924
  approve: "Approval",
11919
11925
  approveText: "This proposal is approved by signing the spec (hash + author). Any later change invalidates the signature.",
11926
+ approveDone: "Approved by {by} on {at}. Any later change invalidates the signature.",
11920
11927
  command: "Command",
11921
11928
  hash: "Hash",
11922
11929
  generated: "Generated",
@@ -11938,6 +11945,7 @@ function labelsFor(language) {
11938
11945
  mockups: "Mockups",
11939
11946
  approve: "Aprobaci\xF3n",
11940
11947
  approveText: "Esta propuesta se aprueba firmando la spec (hash + autor). Cualquier cambio posterior invalida la firma.",
11948
+ approveDone: "Aprobada por {by} el {at}. Cualquier cambio posterior invalida la firma.",
11941
11949
  command: "Comando",
11942
11950
  hash: "Hash",
11943
11951
  generated: "Generado",
@@ -12053,8 +12061,8 @@ function page(input) {
12053
12061
 
12054
12062
  <section>
12055
12063
  <h2>${esc(l.approve)}</h2>
12056
- <div class="callout">${esc(l.approveText)}</div>
12057
- <p>${esc(l.command)}: <code>${esc(input.approveHint)}</code></p>
12064
+ ${input.approval ? `<div class="callout" style="border-left-color:#15803d;background:rgba(21,128,61,.12)">\u2714 ${esc(l.approveDone.replace("{by}", input.approval.by).replace("{at}", input.approval.at))}</div>` : `<div class="callout">${esc(l.approveText)}</div>
12065
+ <p>${esc(l.command)}: <code>${esc(input.approveHint)}</code></p>`}
12058
12066
  </section>
12059
12067
 
12060
12068
  <footer>SpecAtlas \xB7 ${esc(input.project)} \xB7 ${esc(input.generatedAt)}</footer>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specatlas",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "SpecAtlas: kernel determinista de Spec-Driven Development (CLI)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "devDependencies": {
42
42
  "@specatlas/adapters": "0.1.1",
43
- "@specatlas/core": "0.1.5"
43
+ "@specatlas/core": "0.1.7"
44
44
  },
45
45
  "scripts": {
46
46
  "typecheck": "tsc --noEmit",