specatlas 0.1.37 → 0.1.38

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 +36 -6
  2. package/package.json +2 -2
package/dist/bin.js CHANGED
@@ -34465,6 +34465,11 @@ function labelsFor(language) {
34465
34465
  signatureName: "Approver name",
34466
34466
  signatureDate: "Signature date",
34467
34467
  signatureNote: "The signature is recorded with the specification hash and the date.",
34468
+ signedBy: "Approved by",
34469
+ signedAt: "Date",
34470
+ signedHash: "Signed hash",
34471
+ signedChannel: "Channel",
34472
+ signHere: "Sign here to approve this proposal.",
34468
34473
  openMockup: "Open mockup",
34469
34474
  mockupHint: "Each screen opens full size in its own tab. In a browser they are also previewed inline.",
34470
34475
  illustrates: "Illustrates"
@@ -34496,6 +34501,11 @@ function labelsFor(language) {
34496
34501
  missingMockups: "Mockups declarados que faltan",
34497
34502
  screenshots: "Capturas",
34498
34503
  print: "Imprimir / Guardar PDF",
34504
+ signedBy: "Aprobada por",
34505
+ signedAt: "Fecha",
34506
+ signedHash: "Huella firmada",
34507
+ signedChannel: "Canal",
34508
+ signHere: "Firma aqu\xED para aprobar esta propuesta.",
34499
34509
  signatureName: "Nombre de quien aprueba",
34500
34510
  signatureDate: "Fecha de la firma",
34501
34511
  signatureNote: "La firma se registra con la huella de la especificaci\xF3n y la fecha.",
@@ -34578,6 +34588,8 @@ th { background:var(--elev); font-size:11px; text-transform:uppercase; letter-sp
34578
34588
  .grid-shots { display:grid; grid-template-columns:repeat(auto-fill, minmax(220px, 1fr)); gap:12px; margin-top:12px; }
34579
34589
  .grid-shots img { width:100%; border:1px solid var(--line); border-radius:10px; }
34580
34590
  .signature { display:grid; grid-template-columns:1.2fr .8fr; gap:18px; }
34591
+ .sign-line.signed { border-style:solid; border-color:var(--ok); background:color-mix(in srgb, var(--ok) 8%, transparent); }
34592
+ .sign-line .mono { font-family:ui-monospace, Consolas, monospace; font-size:11.5px; word-break:break-all; }
34581
34593
  .sign-line { border:1px dashed var(--accent); border-radius:8px; padding:16px; background:var(--accent-soft); }
34582
34594
  .sign-line .sl-row { display:flex; justify-content:space-between; gap:12px; border-bottom:1px solid var(--line); padding:0 0 6px; margin-bottom:18px; color:var(--muted); font-size:12.5px; }
34583
34595
  .sign-line .sl-row:last-child { border-bottom:0; margin-bottom:0; padding-top:14px; }
@@ -34624,6 +34636,15 @@ function page(input) {
34624
34636
  return `<tr><td><code>${esc(s.id)}</code></td><td>${esc(s.title)}</td><td><span class="pill ${cls}">${esc(label)}</span></td></tr>`;
34625
34637
  }).join("");
34626
34638
  const signatureState = input.approvalStatus === "valid" && input.approval ? `<div class="sign-state ok"><span class="ss-label">${esc(l.approve)}</span><b>${esc(l.approveDone.replace("{by}", input.approval.by).replace("{at}", input.approval.at))}</b></div>` : input.approvalStatus === "stale" && input.approval ? `<div class="sign-state stale"><span class="ss-label">${esc(l.approve)}</span><b>${esc(l.approveStale)}</b><p>${esc(l.approveDone.replace("{by}", input.approval.by).replace("{at}", input.approval.at))}</p></div>` : `<div class="sign-state"><span class="ss-label">${esc(l.approve)}</span><b>${esc(l.approvePending)}</b><p>${esc(l.approveText)}</p></div>`;
34639
+ const signatureBlock = input.approvalStatus === "valid" && input.approval ? `<div class="sign-line signed">
34640
+ <div class="sl-row"><span>${esc(l.signedBy)}</span><b>${esc(input.approval.by)}</b></div>
34641
+ <div class="sl-row"><span>${esc(l.signedAt)}</span><b>${esc(input.approval.at)}</b></div>
34642
+ <div class="sl-row"><span>${esc(l.signedHash)}</span><span class="mono">${esc(input.hash)}</span></div>
34643
+ </div>` : `<div class="sign-line">
34644
+ <p class="sign-help" style="margin:0 0 12px">${esc(l.signHere)}</p>
34645
+ <div class="sl-row"><span>${esc(l.signatureName)}</span><span style="font-family:ui-monospace,Consolas,monospace">____________________</span></div>
34646
+ <div class="sl-row"><span>${esc(l.signatureDate)}</span><span style="font-family:ui-monospace,Consolas,monospace">____ / ____ / ________</span></div>
34647
+ </div>`;
34627
34648
  const mockupHtml = input.mockups.length === 0 ? `<div class="callout">${esc(l.noMockups)}</div>` : `<p class="sign-help" style="margin:0 0 12px">${esc(l.mockupHint)}</p><div class="mockups">${input.mockups.map(
34628
34649
  (m) => `<div class="mockup ${m.platform === "mobile" ? "phone" : ""}" data-mockup="${esc(m.file)}" data-title="${esc(m.title)}"><header><span>${esc(m.title)}</span><a class="btn" href="${esc(m.file)}" target="_blank" rel="noopener">${esc(l.openMockup)}</a></header><div class="mockup-body"><span class="mockup-file">${esc(m.file)}</span>${m.illustrates.length > 0 ? `<span class="mockup-scn">${esc(l.illustrates)}: ${m.illustrates.map((id) => esc(id)).join(", ")}</span>` : ""}</div></div>`
34629
34650
  ).join("")}</div>`;
@@ -34718,14 +34739,11 @@ function page(input) {
34718
34739
  <div class="card-head"><span class="num">05</span><h2>${esc(l.approve)}</h2><span class="sub">acto humano \xB7 queda auditado</span></div>
34719
34740
  <div class="card-body">
34720
34741
  <div class="signature">
34721
- <div class="sign-line">
34722
- <div class="sl-row"><span>${esc(l.signatureName)}</span><span style="font-family:ui-monospace,Consolas,monospace">____________________</span></div>
34723
- <div class="sl-row"><span>${esc(l.signatureDate)}</span><span style="font-family:ui-monospace,Consolas,monospace">____ / ____ / ________</span></div>
34724
- </div>
34742
+ ${signatureBlock}
34725
34743
  <div>
34726
34744
  <p class="sign-help">${esc(l.signatureNote)}</p>
34727
- <p class="sign-help" style="margin-top:8px"><code>${esc(input.approveHint)}</code></p>
34728
- <p class="sign-help" style="margin-top:10px">${esc(l.approveStale)}</p>
34745
+ ${input.approvalStatus === "valid" ? "" : `<p class="sign-help" style="margin-top:8px"><code>${esc(input.approveHint)}</code></p>`}
34746
+ ${input.approvalStatus === "stale" ? `<p class="sign-help" style="margin-top:10px">${esc(l.approveStale)}</p>` : ""}
34729
34747
  </div>
34730
34748
  </div>
34731
34749
  </div>
@@ -37553,6 +37571,18 @@ async function runApprove(ctx) {
37553
37571
  lines.push(` fecha: ${result.approval.approvedAt}`);
37554
37572
  lines.push("");
37555
37573
  lines.push("La firma desbloquea el plan. Si el artefacto cambia, la firma queda obsoleta autom\xE1ticamente.");
37574
+ const slug = change?.slug;
37575
+ if (slug && !flagBool(ctx.flags, "dry-run")) {
37576
+ const presentation = path36.join(root, ".sdd", "changes", slug, "presentation", "index.html");
37577
+ if (await exists(presentation)) {
37578
+ try {
37579
+ await generatePresentation({ root, slug });
37580
+ lines.push(`Propuesta actualizada con la firma: ${path36.relative(ctx.cwd, presentation)}`);
37581
+ } catch (error2) {
37582
+ lines.push(`La propuesta no se pudo rehacer (${error2.message}); vuelve a generarla con \`satlas present ${slug}\`.`);
37583
+ }
37584
+ }
37585
+ }
37556
37586
  }
37557
37587
  const hasErrors2 = result.diagnostics.some((d) => d.severity === "error");
37558
37588
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specatlas",
3
- "version": "0.1.37",
3
+ "version": "0.1.38",
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.2",
43
- "@specatlas/core": "0.1.31"
43
+ "@specatlas/core": "0.1.32"
44
44
  },
45
45
  "scripts": {
46
46
  "typecheck": "tsc --noEmit",