@akanjs/cli 3.1.0-rc.2 → 3.1.0-rc.21

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 (103) hide show
  1. package/.build-stamp +1 -1
  2. package/{CodeAgent-q50k4s45.js → CodeAgent-gzfc5t52.js} +2 -2
  3. package/{CodeAgentRpcHost-p7h6n2hp.js → CodeAgentRpcHost-9g27hmer.js} +1 -1
  4. package/{CodeTui-62g35ztk.js → CodeTui-bpsjs8wz.js} +47 -4
  5. package/TunnelShare-tfrnftgr.js +14 -0
  6. package/{agent.command-adfd5299.js → agent.command-67ysh3n6.js} +5 -5
  7. package/akanCode.js +7 -5
  8. package/{application.command-hj3gv1rx.js → application.command-q0tqw5pc.js} +38 -11
  9. package/{applicationBuildRunner-by10r9gf.js → applicationBuildRunner-wsszr305.js} +16 -9
  10. package/buildBatch.proc.js +7 -7
  11. package/{cloud.command-k2fhaape.js → cloud.command-e7tkxyx6.js} +17 -16
  12. package/cloud.script-krzh3d7k.js +24 -0
  13. package/{code.command-kt5zgcc2.js → code.command-ttk8tje2.js} +25 -12
  14. package/commandManifest.json +1 -1
  15. package/{context.command-8fgn42jw.js → context.command-bdsk2z2r.js} +17 -16
  16. package/context.runner-bxzv0gm0.js +25 -0
  17. package/{dependencyScanner-06z2dmrr.js → dependencyScanner-3afj2vt1.js} +1 -1
  18. package/{guideline.command-3yxxr2mm.js → guideline.command-man90n70.js} +2 -2
  19. package/guidelines/agentRule/agentRule.instruction.md +25 -10
  20. package/guidelines/conventions/conventions.instruction.md +486 -1084
  21. package/guidelines/cssRule/cssRule.instruction.md +16 -1
  22. package/guidelines/fieldRule/fieldRule.instruction.md +74 -0
  23. package/guidelines/framework/framework.instruction.md +4 -7
  24. package/guidelines/mcpRule/mcpRule.instruction.md +16 -9
  25. package/guidelines/modelConstant/modelConstant.instruction.md +2 -1
  26. package/guidelines/modelStore/modelStore.instruction.md +16 -0
  27. package/guidelines/pageRule/pageRule.instruction.md +80 -0
  28. package/guidelines/queryRule/queryRule.instruction.md +47 -12
  29. package/guidelines/runtimeRule/runtimeRule.instruction.md +89 -2
  30. package/guidelines/ssrRule/ssrRule.instruction.md +13 -0
  31. package/guidelines/transportRule/transportRule.instruction.md +107 -8
  32. package/guidelines/workspaceOnboarding/workspaceOnboarding.instruction.md +4 -4
  33. package/guidelines/workspaceRecipes/workspaceRecipes.instruction.md +70 -7
  34. package/incrementalBuilder.proc.js +4 -4
  35. package/{index-rhbabmja.js → index-033wne2j.js} +260 -259
  36. package/{index-xpdgxsj5.js → index-1r5a8bzx.js} +2216 -2216
  37. package/{index-jwqtchha.js → index-27y8t17p.js} +1 -1
  38. package/{index-wa5jbxj1.js → index-2mrn1mrg.js} +1 -0
  39. package/{index-t7nws9mx.js → index-2w8j2fnv.js} +661 -448
  40. package/{index-0909wckt.js → index-35m6bzm7.js} +238 -236
  41. package/{index-sqfdmb5b.js → index-4393nb4b.js} +4 -4
  42. package/{index-sby8fe1p.js → index-48edp6q4.js} +1 -1
  43. package/{index-g0vwzy9m.js → index-4v43h00g.js} +20 -21
  44. package/{index-azh29dc8.js → index-54wc2phm.js} +19 -14
  45. package/{index-k9rrten6.js → index-5nd1wtkv.js} +92 -94
  46. package/index-62md4dwy.js +260 -0
  47. package/{index-hnby7p9n.js → index-75n5q4ph.js} +7 -7
  48. package/{index-fjsv10hd.js → index-844q7f8z.js} +7 -7
  49. package/{index-tv8fjaba.js → index-8jehkey8.js} +4 -4
  50. package/{index-bea2gwc6.js → index-9mt4smfy.js} +2 -2
  51. package/{index-d2242ksy.js → index-at7bz0xq.js} +3 -0
  52. package/{index-3hx1z96c.js → index-bqbf654f.js} +1 -1
  53. package/{index-8zdwpxef.js → index-cae9m5jz.js} +119 -81
  54. package/{index-tz5evhdr.js → index-ebarbgba.js} +6 -6
  55. package/{index-2etqq75t.js → index-g6ax17x4.js} +1114 -1082
  56. package/{index-h85cxfkg.js → index-g9ks2k8c.js} +2 -2
  57. package/{index-nq045px5.js → index-h3r3nr9y.js} +356 -307
  58. package/{index-20cebtth.js → index-h6czey01.js} +79 -24
  59. package/{index-6726qr1m.js → index-jrmzcp66.js} +57 -58
  60. package/{index-q958tqqg.js → index-m9jj544v.js} +1 -1
  61. package/{index-8935h3n1.js → index-mdjc93e1.js} +1 -1
  62. package/{index-rk9sdys3.js → index-nv79n88g.js} +5 -5
  63. package/{index-kc8z134d.js → index-nx64dz92.js} +38 -15
  64. package/{index-z507nzhg.js → index-p2r64bpa.js} +4 -4
  65. package/{index-nq2ja5e0.js → index-pg1t468s.js} +3 -3
  66. package/{index-3reaaa1h.js → index-rc51f9ht.js} +29 -27
  67. package/{index-e9prnmyt.js → index-ta1dychm.js} +3 -3
  68. package/{index-2ahj896a.js → index-tvehn2sp.js} +1 -1
  69. package/{index-31ce9vhg.js → index-vkb9m4z7.js} +80 -38
  70. package/{index-58vvz603.js → index-xsd96yzw.js} +1 -1
  71. package/{index-pyxn1b53.js → index-zv5s8x58.js} +13 -13
  72. package/index.js +22 -22
  73. package/{library.command-8tw59xzj.js → library.command-6amzsrb8.js} +3 -3
  74. package/{localRegistry.command-tf3dmznd.js → localRegistry.command-yqc0nyhh.js} +15 -14
  75. package/{module.command-9vm8hffy.js → module.command-10x6jv6c.js} +5 -5
  76. package/{package.command-erbxe2tz.js → package.command-pwfvecjf.js} +4 -4
  77. package/package.json +21 -21
  78. package/{page.command-jpavcj0p.js → page.command-ahhgx9y1.js} +3 -3
  79. package/{pipeline.command-b8rzvjvv.js → pipeline.command-1ptr3e9y.js} +3 -3
  80. package/{primitive.command-sm32chzk.js → primitive.command-g5xwv6tj.js} +6 -6
  81. package/{projectTypecheck-jamtx95x.js → projectTypecheck-fx8x7cat.js} +1 -1
  82. package/{quality.command-pkd17n6y.js → quality.command-fw9ck061.js} +4 -4
  83. package/{repair.command-8y4mq6hs.js → repair.command-g8kecj96.js} +5 -5
  84. package/{scalar.command-q8khmyx5.js → scalar.command-fprap51w.js} +4 -4
  85. package/skills/akan-code/SKILL.md +4 -0
  86. package/skills/akan-store/SKILL.md +2 -1
  87. package/{subspace.command-51n0ykbx.js → subspace.command-sc0t527y.js} +11 -10
  88. package/templates/appSample/lib/task/Task.Util.tsx +7 -7
  89. package/templates/appSample/lib/task/Task.Zone.tsx +1 -1
  90. package/templates/appSample/ui/QuantityControl.tsx +2 -2
  91. package/templates/crudSinglePage/page.tsx +1 -1
  92. package/templates/lib/cnst.ts +0 -1
  93. package/templates/migration/__migrationId__.ts +23 -0
  94. package/templates/server.ts +8 -1
  95. package/templates/workspaceRoot/.gitignore.template +23 -52
  96. package/templates/workspaceRoot/biome.json.template +1 -1
  97. package/{tunnel.command-7820vtxq.js → tunnel.command-mqnsqbwf.js} +8 -7
  98. package/{workflow.command-n5sv4wqz.js → workflow.command-j0jgkr13.js} +10 -10
  99. package/{workspace.command-zdy60jh8.js → workspace.command-1r9hvvw0.js} +29 -28
  100. package/TunnelShare-f1egrktx.js +0 -13
  101. package/cloud.script-z8p5dz7e.js +0 -23
  102. package/context.runner-hnh0rg7m.js +0 -24
  103. package/index-n68jx79w.js +0 -120
@@ -2,7 +2,10 @@
2
2
  import {
3
3
  AppExecutor,
4
4
  LibExecutor
5
- } from "./index-2etqq75t.js";
5
+ } from "./index-g6ax17x4.js";
6
+
7
+ // pkgs/@akanjs/devkit/workflow/artifacts.ts
8
+ import { capitalize } from "akanjs/common";
6
9
 
7
10
  // pkgs/@akanjs/devkit/workflow/utils.ts
8
11
  var jsonText = (value, { trailingNewline = true } = {}) => `${JSON.stringify(value, null, 2)}${trailingNewline ? `
@@ -22,7 +25,6 @@ var uniqueBy = (values, key) => {
22
25
  var compactDiagnostics = (diagnostics) => diagnostics.filter((diagnostic) => !!diagnostic);
23
26
 
24
27
  // pkgs/@akanjs/devkit/workflow/artifacts.ts
25
- import { capitalize } from "akanjs/common";
26
28
  var sourceChangeBlocked = (diagnostics) => diagnostics.some((diagnostic) => diagnostic.severity === "error" && (diagnostic.failureScope === "source-change" || !diagnostic.failureScope || diagnostic.failureScope === "unknown"));
27
29
  var workflowPlanApproval = {
28
30
  required: true,
@@ -139,7 +141,7 @@ var writeWorkflowRunArtifact = async (workspace, artifact) => {
139
141
  return { runId, path: artifactPath, artifact: artifactWithMetadata };
140
142
  };
141
143
  var workflowSyncDir = ".akan/workflows/sync";
142
- var syncStateSlug = (target) => target.trim().replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "").toLowerCase();
144
+ var syncStateSlug = (target) => target.trim().replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-|-$/g, "").toLowerCase();
143
145
  var workflowSyncStatePath = (target) => `${workflowSyncDir}/${syncStateSlug(target) || "target"}.json`;
144
146
  var generatedFilePathsForTarget = (targetRoot, reason = "Generated files were refreshed by sync.") => [
145
147
  { path: `${targetRoot}/lib/cnst.ts`, action: "sync", reason },
@@ -383,260 +385,6 @@ var createRepairReport = ({
383
385
  generatedFiles,
384
386
  ...syncedAt ? { syncedAt } : {}
385
387
  });
386
-
387
- // pkgs/@akanjs/devkit/workflow/render.ts
388
- var listOr = (items, render, empty = "- none") => items?.length ? items.map(render) : [empty];
389
- var renderDiagnostic = (diagnostic) => `- [${diagnostic.severity}] ${diagnostic.code}: ${diagnostic.message}`;
390
- var renderCommand = (entry) => `- \`${entry.command}\`: ${entry.reason}`;
391
- var renderFile = (file) => `- \`${file.action}\` ${file.path}: ${file.reason}`;
392
- var renderRecommendation = (recommendation) => {
393
- const target = recommendation.target ? ` ${recommendation.target}` : "";
394
- const action = recommendation.action ? ` Action: ${recommendation.action}` : "";
395
- return `- [${recommendation.kind}]${target} ${recommendation.message}${action}`;
396
- };
397
- var renderWorkflowList = (specs) => [
398
- "# Akan Workflows",
399
- "",
400
- ...specs.flatMap((spec) => [`- \`${spec.name}\`: ${spec.description}`, ` - When: ${spec.whenToUse}`]),
401
- ""
402
- ].join(`
403
- `);
404
- var renderWorkflowExplain = (spec) => [
405
- `# Workflow: ${spec.name}`,
406
- "",
407
- spec.description,
408
- "",
409
- "## When To Use",
410
- spec.whenToUse,
411
- "",
412
- "## Inputs",
413
- ...Object.entries(spec.inputs).map(([name, input]) => `- \`${name}\`${input.required ? " (required)" : ""}: ${input.description}${input.allowedValues ? ` Allowed: ${input.allowedValues.join(", ")}.` : ""}`),
414
- "",
415
- "## Optional Surfaces",
416
- ...Object.entries(spec.optionalSurfaces ?? {}).map(([name, mode]) => `- \`${name}\`: ${mode}`),
417
- "",
418
- "## Steps",
419
- ...spec.steps.map((step, index) => `${index + 1}. \`${step.id}\` (${step.tool}): ${step.description}`),
420
- "",
421
- "## Validation",
422
- ...spec.validation.map(renderCommand),
423
- ""
424
- ].join(`
425
- `);
426
- var renderWorkflowPlan = (plan) => [
427
- `# Workflow Plan: ${plan.workflow}`,
428
- "",
429
- `- Mode: ${plan.mode}`,
430
- `- Requires approval: ${plan.requiresApproval}`,
431
- `- Approval: ${plan.approval?.meaning ?? "Review this read-only plan before applying workflow mutations."}`,
432
- "",
433
- "## Inputs",
434
- ...Object.entries(plan.inputs).map(([name, value]) => `- \`${name}\`: ${Array.isArray(value) ? value.join(", ") : value}`),
435
- "",
436
- "## Optional Surfaces",
437
- ...Object.entries(plan.optionalSurfaces).map(([name, mode]) => `- \`${name}\`: ${mode}`),
438
- "",
439
- "## Steps",
440
- ...plan.steps.map((step, index) => `${index + 1}. \`${step.id}\` (${step.tool}): ${step.description}`),
441
- "",
442
- "## Predicted Changes",
443
- ...plan.predictedChanges.map((change) => {
444
- const scope = change.applyScope ? ` (${change.applyScope})` : "";
445
- return `- \`${change.action}\`${scope} ${change.target}: ${change.reason}`;
446
- }),
447
- "",
448
- "## Validation",
449
- ...plan.validation.map(renderCommand),
450
- "",
451
- "## Diagnostics",
452
- ...listOr(plan.diagnostics, renderDiagnostic),
453
- "",
454
- "## Recommendations",
455
- ...listOr(plan.recommendations, (recommendation) => `- [${recommendation.kind}] ${recommendation.message}`),
456
- ""
457
- ].join(`
458
- `);
459
- var renderWorkflowApplyReport = (report) => {
460
- const applySummary = {
461
- sourceFilesChanged: report.summary?.sourceFilesChanged ?? report.changedFiles,
462
- generatedFilesSynced: report.summary?.generatedFilesSynced ?? report.generatedFiles
463
- };
464
- const manualReviewItems = [
465
- ...report.diagnostics.filter((diagnostic) => diagnostic.severity === "warning").map(renderDiagnostic),
466
- ...report.recommendations.filter((recommendation) => recommendation.kind === "manual-action").map(renderRecommendation)
467
- ];
468
- const validationBlockers = report.diagnostics.filter((diagnostic) => diagnostic.severity === "error" && (diagnostic.failureScope === "workspace-config" || diagnostic.failureScope === "environment")).map(renderDiagnostic);
469
- const sourceBlockers = report.diagnostics.filter((diagnostic) => diagnostic.severity === "error" && (diagnostic.failureScope === "source-change" || !diagnostic.failureScope || diagnostic.failureScope === "unknown")).map(renderDiagnostic);
470
- return [
471
- `# Workflow Apply: ${report.workflow}`,
472
- "",
473
- `- Mode: ${report.mode}`,
474
- `- Status: ${report.status}`,
475
- `- Source-change status: ${sourceBlockers.length ? "failed" : "passed"}`,
476
- `- Workspace status: ${validationBlockers.length ? "blocked" : "not blocked during apply"}`,
477
- `- Source files changed: ${applySummary.sourceFilesChanged.length}`,
478
- `- Generated files queued for sync: ${applySummary.generatedFilesSynced.length}`,
479
- ...report.validationTarget ? [`- Validation target: ${report.validationTarget}`] : [],
480
- "",
481
- "## Apply Checks",
482
- ...report.postApplyChecks?.length ? report.postApplyChecks.map((check) => `- [${check.status}] ${check.code} ${check.target}: ${check.message}`) : ["- not run"],
483
- "",
484
- "## Source Change Blockers",
485
- ...sourceBlockers.length ? sourceBlockers : ["- none"],
486
- "",
487
- "## Automatically Modified",
488
- ...listOr(applySummary.sourceFilesChanged, renderFile),
489
- "",
490
- "## Generated Sync",
491
- ...listOr(applySummary.generatedFilesSynced, renderFile),
492
- "",
493
- "## Applied Commands",
494
- ...listOr(report.appliedCommands, renderCommand),
495
- "",
496
- "## Recommended Validation Commands",
497
- ...listOr(report.recommendedValidationCommands, renderCommand),
498
- "",
499
- "## User Review Required",
500
- ...manualReviewItems.length ? manualReviewItems : ["- none"],
501
- "",
502
- "## Validation Blockers",
503
- ...validationBlockers.length ? validationBlockers : report.recommendedValidationCommands.length ? ["- none detected during apply; run validation with the validation target for command-level blockers."] : ["- none"],
504
- "",
505
- "## Diagnostics",
506
- ...listOr(report.diagnostics, renderDiagnostic),
507
- "",
508
- "## Recommendations",
509
- ...listOr(report.recommendations.slice(0, 3), renderRecommendation),
510
- "",
511
- "## Next Actions",
512
- ...listOr(report.nextActions.slice(0, 3), renderCommand),
513
- ""
514
- ].join(`
515
- `);
516
- };
517
- var renderWorkflowApply = (report, format = "markdown") => format === "json" ? jsonText(report) : renderWorkflowApplyReport(report);
518
- var renderWorkflowValidationRunReport = (report) => {
519
- const baselineSummary = report.baselineSummary ?? {
520
- status: report.baselineDiagnostics?.some((diagnostic) => diagnostic.severity === "error") ? "failed" : "unknown",
521
- total: report.baselineDiagnostics?.length ?? 0,
522
- totalErrors: report.baselineDiagnostics?.filter((diagnostic) => diagnostic.severity === "error").length ?? 0,
523
- totalWarnings: report.baselineDiagnostics?.filter((diagnostic) => diagnostic.severity === "warning").length ?? 0,
524
- detailsIncluded: true,
525
- knownBlockerCount: report.knownBlockers.filter((blocker) => blocker.known).length,
526
- byCode: []
527
- };
528
- return [
529
- `# Workflow Validation: ${report.workflow}`,
530
- "",
531
- `- Run: ${report.runId}`,
532
- `- Status: ${report.status}`,
533
- `- Source status: ${report.sourceStatus}`,
534
- `- Workspace status: ${report.workspaceStatus}`,
535
- `- Validation commands status: ${report.validationCommandsStatus ?? "unknown"}`,
536
- `- Baseline status: ${report.baselineStatus ?? baselineSummary.status}`,
537
- `- Overall status: ${report.overallStatus}`,
538
- "",
539
- "## Status Summary",
540
- `- Source-change: ${report.summary.sourceChange}`,
541
- `- Generated sync: ${report.summary.generatedSync}`,
542
- `- Validation commands: ${report.summary.validationCommands ?? "unknown"}`,
543
- `- Baseline: ${report.summary.baseline ?? baselineSummary.status}`,
544
- `- Workspace config: ${report.summary.workspaceConfig}`,
545
- `- Environment: ${report.summary.environment}`,
546
- "",
547
- "## Source Change Diagnostics",
548
- ...listOr(report.workflowDiagnostics, renderDiagnostic),
549
- "",
550
- "## Existing Workspace Blockers",
551
- `- Status: ${baselineSummary.status}`,
552
- `- Errors: ${baselineSummary.totalErrors}`,
553
- `- Warnings: ${baselineSummary.totalWarnings}`,
554
- ...listOr(baselineSummary.byCode, (item) => `- [${item.severity}] ${item.code} (${item.count}x): ${item.sampleMessage}`),
555
- ...baselineSummary.detailsIncluded ? [] : [
556
- "- Baseline details are summarized by default. Re-run validation with includeBaselineDetails=true for full baselineDiagnostics."
557
- ],
558
- "",
559
- "## Existing Workspace Blocker Details",
560
- ...listOr(report.baselineDiagnostics, renderDiagnostic, baselineSummary.detailsIncluded ? "- none" : "- omitted"),
561
- "",
562
- "## Known Blockers",
563
- ...listOr(report.knownBlockers, (blocker) => {
564
- const command = blocker.command ? ` \`${blocker.command}\`` : "";
565
- const count = blocker.count > 1 ? ` (${blocker.count}x)` : "";
566
- const known = blocker.known ? " known" : "";
567
- return `- [${blocker.failureScope}${known}]${command}${count}: ${blocker.message}`;
568
- }),
569
- "",
570
- "## Commands",
571
- ...listOr(report.commands, (command) => {
572
- const scope = command.failureScope ? ` (${command.failureScope})` : "";
573
- return `- [${command.status}] \`${command.command}\`${scope}: ${command.reason}`;
574
- }),
575
- "",
576
- "## Diagnostics",
577
- ...listOr(report.diagnostics, renderDiagnostic),
578
- "",
579
- "## Repair Actions",
580
- ...listOr(report.repairActions, renderCommand),
581
- "",
582
- "## Next Actions",
583
- ...listOr(report.nextActions, renderCommand),
584
- ""
585
- ].join(`
586
- `);
587
- };
588
- var renderWorkflowValidation = (report, format = "markdown") => format === "json" ? jsonText(report) : renderWorkflowValidationRunReport(report);
589
- var renderRepairReportMarkdown = (report) => [
590
- `# Akan Repair: ${report.kind}`,
591
- "",
592
- `- Status: ${report.status}`,
593
- `- Target: ${report.target ?? "none"}`,
594
- "",
595
- "## Commands",
596
- ...listOr(report.commands, (command) => `- [${command.status}] \`${command.command}\`: ${command.reason}`),
597
- "",
598
- "## Diagnostics",
599
- ...listOr(report.diagnostics, renderDiagnostic),
600
- "",
601
- "## Next Actions",
602
- ...listOr(report.nextActions, renderCommand),
603
- ""
604
- ].join(`
605
- `);
606
- var renderRepairReport = (report, format = "markdown") => format === "json" ? jsonText(report) : renderRepairReportMarkdown(report);
607
- var renderWorkflowRunArtifact = (artifact, format = "markdown") => {
608
- if ("kind" in artifact)
609
- return renderRepairReport(artifact, format);
610
- if ("mode" in artifact && artifact.mode === "validate")
611
- return renderWorkflowValidation(artifact, format);
612
- if ("mode" in artifact && (artifact.mode === "apply" || artifact.mode === "dry-run")) {
613
- return renderWorkflowApply(artifact, format);
614
- }
615
- return jsonText(artifact);
616
- };
617
- var renderPrimitiveWriteReport = (report) => [
618
- `# Primitive Write: ${report.command}`,
619
- "",
620
- `- Status: ${report.status}`,
621
- "",
622
- "## Changed Files",
623
- ...listOr(report.changedFiles, renderFile),
624
- "",
625
- "## Generated Files",
626
- ...listOr(report.generatedFiles, renderFile),
627
- "",
628
- "## Validation Commands",
629
- ...listOr(report.validationCommands, renderCommand),
630
- "",
631
- "## Diagnostics",
632
- ...listOr(report.diagnostics, renderDiagnostic),
633
- "",
634
- "## Next Actions",
635
- ...listOr(report.nextActions, renderCommand),
636
- ""
637
- ].join(`
638
- `);
639
- var renderPrimitiveReport = (report, format = "markdown") => format === "json" ? jsonText(report) : renderPrimitiveWriteReport(report);
640
388
  // pkgs/@akanjs/devkit/workflow/executor.ts
641
389
  import { capitalize as capitalize2 } from "akanjs/common";
642
390
  import ts4 from "typescript";
@@ -704,7 +452,7 @@ var sourceFile = (sys, path, action, reason) => ({
704
452
  action,
705
453
  reason
706
454
  });
707
- var moduleComponentName = (moduleName) => moduleName.replace(/[-_]+/g, " ").replace(/(?:^|\s+)([a-zA-Z0-9])/g, (_, char) => char.toUpperCase()).replace(/\s+/g, "");
455
+ var moduleComponentName = (moduleName) => moduleName.replace(/[-_]+/g, " ").replace(/(?<=^|\s)[a-zA-Z0-9]/g, (char) => char.toUpperCase()).replace(/\s+/g, "");
708
456
  var moduleSourcePaths = (moduleName) => {
709
457
  const componentName = moduleComponentName(moduleName);
710
458
  return {
@@ -1292,7 +1040,7 @@ var insertTemplateField = ({
1292
1040
  var ensureEnumImport = (content) => {
1293
1041
  if (content.includes("enumOf"))
1294
1042
  return content;
1295
- const baseImport = /import \{ ([^}]+) \} from "akanjs\/base";/.exec(content);
1043
+ const baseImport = /import \{ ([^{}]+) \} from "akanjs\/base";/.exec(content);
1296
1044
  if (baseImport) {
1297
1045
  const names = baseImport[1]?.split(",").map((name) => name.trim()) ?? [];
1298
1046
  return content.replace(baseImport[0], `import { ${[...names, "enumOf"].sort().join(", ")} } from "akanjs/base";`);
@@ -2687,6 +2435,259 @@ var createWorkflowPlan = (spec, rawInputs) => {
2687
2435
  approval: workflowPlanApproval
2688
2436
  };
2689
2437
  };
2438
+ // pkgs/@akanjs/devkit/workflow/render.ts
2439
+ var listOr = (items, render, empty = "- none") => items?.length ? items.map(render) : [empty];
2440
+ var renderDiagnostic = (diagnostic) => `- [${diagnostic.severity}] ${diagnostic.code}: ${diagnostic.message}`;
2441
+ var renderCommand = (entry) => `- \`${entry.command}\`: ${entry.reason}`;
2442
+ var renderFile = (file) => `- \`${file.action}\` ${file.path}: ${file.reason}`;
2443
+ var renderRecommendation = (recommendation) => {
2444
+ const target = recommendation.target ? ` ${recommendation.target}` : "";
2445
+ const action = recommendation.action ? ` Action: ${recommendation.action}` : "";
2446
+ return `- [${recommendation.kind}]${target} ${recommendation.message}${action}`;
2447
+ };
2448
+ var renderWorkflowList = (specs) => [
2449
+ "# Akan Workflows",
2450
+ "",
2451
+ ...specs.flatMap((spec) => [`- \`${spec.name}\`: ${spec.description}`, ` - When: ${spec.whenToUse}`]),
2452
+ ""
2453
+ ].join(`
2454
+ `);
2455
+ var renderWorkflowExplain = (spec) => [
2456
+ `# Workflow: ${spec.name}`,
2457
+ "",
2458
+ spec.description,
2459
+ "",
2460
+ "## When To Use",
2461
+ spec.whenToUse,
2462
+ "",
2463
+ "## Inputs",
2464
+ ...Object.entries(spec.inputs).map(([name, input]) => `- \`${name}\`${input.required ? " (required)" : ""}: ${input.description}${input.allowedValues ? ` Allowed: ${input.allowedValues.join(", ")}.` : ""}`),
2465
+ "",
2466
+ "## Optional Surfaces",
2467
+ ...Object.entries(spec.optionalSurfaces ?? {}).map(([name, mode]) => `- \`${name}\`: ${mode}`),
2468
+ "",
2469
+ "## Steps",
2470
+ ...spec.steps.map((step, index) => `${index + 1}. \`${step.id}\` (${step.tool}): ${step.description}`),
2471
+ "",
2472
+ "## Validation",
2473
+ ...spec.validation.map(renderCommand),
2474
+ ""
2475
+ ].join(`
2476
+ `);
2477
+ var renderWorkflowPlan = (plan) => [
2478
+ `# Workflow Plan: ${plan.workflow}`,
2479
+ "",
2480
+ `- Mode: ${plan.mode}`,
2481
+ `- Requires approval: ${plan.requiresApproval}`,
2482
+ `- Approval: ${plan.approval?.meaning ?? "Review this read-only plan before applying workflow mutations."}`,
2483
+ "",
2484
+ "## Inputs",
2485
+ ...Object.entries(plan.inputs).map(([name, value]) => `- \`${name}\`: ${Array.isArray(value) ? value.join(", ") : value}`),
2486
+ "",
2487
+ "## Optional Surfaces",
2488
+ ...Object.entries(plan.optionalSurfaces).map(([name, mode]) => `- \`${name}\`: ${mode}`),
2489
+ "",
2490
+ "## Steps",
2491
+ ...plan.steps.map((step, index) => `${index + 1}. \`${step.id}\` (${step.tool}): ${step.description}`),
2492
+ "",
2493
+ "## Predicted Changes",
2494
+ ...plan.predictedChanges.map((change) => {
2495
+ const scope = change.applyScope ? ` (${change.applyScope})` : "";
2496
+ return `- \`${change.action}\`${scope} ${change.target}: ${change.reason}`;
2497
+ }),
2498
+ "",
2499
+ "## Validation",
2500
+ ...plan.validation.map(renderCommand),
2501
+ "",
2502
+ "## Diagnostics",
2503
+ ...listOr(plan.diagnostics, renderDiagnostic),
2504
+ "",
2505
+ "## Recommendations",
2506
+ ...listOr(plan.recommendations, (recommendation) => `- [${recommendation.kind}] ${recommendation.message}`),
2507
+ ""
2508
+ ].join(`
2509
+ `);
2510
+ var renderWorkflowApplyReport = (report) => {
2511
+ const applySummary = {
2512
+ sourceFilesChanged: report.summary?.sourceFilesChanged ?? report.changedFiles,
2513
+ generatedFilesSynced: report.summary?.generatedFilesSynced ?? report.generatedFiles
2514
+ };
2515
+ const manualReviewItems = [
2516
+ ...report.diagnostics.filter((diagnostic) => diagnostic.severity === "warning").map(renderDiagnostic),
2517
+ ...report.recommendations.filter((recommendation) => recommendation.kind === "manual-action").map(renderRecommendation)
2518
+ ];
2519
+ const validationBlockers = report.diagnostics.filter((diagnostic) => diagnostic.severity === "error" && (diagnostic.failureScope === "workspace-config" || diagnostic.failureScope === "environment")).map(renderDiagnostic);
2520
+ const sourceBlockers = report.diagnostics.filter((diagnostic) => diagnostic.severity === "error" && (diagnostic.failureScope === "source-change" || !diagnostic.failureScope || diagnostic.failureScope === "unknown")).map(renderDiagnostic);
2521
+ return [
2522
+ `# Workflow Apply: ${report.workflow}`,
2523
+ "",
2524
+ `- Mode: ${report.mode}`,
2525
+ `- Status: ${report.status}`,
2526
+ `- Source-change status: ${sourceBlockers.length ? "failed" : "passed"}`,
2527
+ `- Workspace status: ${validationBlockers.length ? "blocked" : "not blocked during apply"}`,
2528
+ `- Source files changed: ${applySummary.sourceFilesChanged.length}`,
2529
+ `- Generated files queued for sync: ${applySummary.generatedFilesSynced.length}`,
2530
+ ...report.validationTarget ? [`- Validation target: ${report.validationTarget}`] : [],
2531
+ "",
2532
+ "## Apply Checks",
2533
+ ...report.postApplyChecks?.length ? report.postApplyChecks.map((check) => `- [${check.status}] ${check.code} ${check.target}: ${check.message}`) : ["- not run"],
2534
+ "",
2535
+ "## Source Change Blockers",
2536
+ ...sourceBlockers.length ? sourceBlockers : ["- none"],
2537
+ "",
2538
+ "## Automatically Modified",
2539
+ ...listOr(applySummary.sourceFilesChanged, renderFile),
2540
+ "",
2541
+ "## Generated Sync",
2542
+ ...listOr(applySummary.generatedFilesSynced, renderFile),
2543
+ "",
2544
+ "## Applied Commands",
2545
+ ...listOr(report.appliedCommands, renderCommand),
2546
+ "",
2547
+ "## Recommended Validation Commands",
2548
+ ...listOr(report.recommendedValidationCommands, renderCommand),
2549
+ "",
2550
+ "## User Review Required",
2551
+ ...manualReviewItems.length ? manualReviewItems : ["- none"],
2552
+ "",
2553
+ "## Validation Blockers",
2554
+ ...validationBlockers.length ? validationBlockers : report.recommendedValidationCommands.length ? ["- none detected during apply; run validation with the validation target for command-level blockers."] : ["- none"],
2555
+ "",
2556
+ "## Diagnostics",
2557
+ ...listOr(report.diagnostics, renderDiagnostic),
2558
+ "",
2559
+ "## Recommendations",
2560
+ ...listOr(report.recommendations.slice(0, 3), renderRecommendation),
2561
+ "",
2562
+ "## Next Actions",
2563
+ ...listOr(report.nextActions.slice(0, 3), renderCommand),
2564
+ ""
2565
+ ].join(`
2566
+ `);
2567
+ };
2568
+ var renderWorkflowApply = (report, format = "markdown") => format === "json" ? jsonText(report) : renderWorkflowApplyReport(report);
2569
+ var renderWorkflowValidationRunReport = (report) => {
2570
+ const baselineSummary = report.baselineSummary ?? {
2571
+ status: report.baselineDiagnostics?.some((diagnostic) => diagnostic.severity === "error") ? "failed" : "unknown",
2572
+ total: report.baselineDiagnostics?.length ?? 0,
2573
+ totalErrors: report.baselineDiagnostics?.filter((diagnostic) => diagnostic.severity === "error").length ?? 0,
2574
+ totalWarnings: report.baselineDiagnostics?.filter((diagnostic) => diagnostic.severity === "warning").length ?? 0,
2575
+ detailsIncluded: true,
2576
+ knownBlockerCount: report.knownBlockers.filter((blocker) => blocker.known).length,
2577
+ byCode: []
2578
+ };
2579
+ return [
2580
+ `# Workflow Validation: ${report.workflow}`,
2581
+ "",
2582
+ `- Run: ${report.runId}`,
2583
+ `- Status: ${report.status}`,
2584
+ `- Source status: ${report.sourceStatus}`,
2585
+ `- Workspace status: ${report.workspaceStatus}`,
2586
+ `- Validation commands status: ${report.validationCommandsStatus ?? "unknown"}`,
2587
+ `- Baseline status: ${report.baselineStatus ?? baselineSummary.status}`,
2588
+ `- Overall status: ${report.overallStatus}`,
2589
+ "",
2590
+ "## Status Summary",
2591
+ `- Source-change: ${report.summary.sourceChange}`,
2592
+ `- Generated sync: ${report.summary.generatedSync}`,
2593
+ `- Validation commands: ${report.summary.validationCommands ?? "unknown"}`,
2594
+ `- Baseline: ${report.summary.baseline ?? baselineSummary.status}`,
2595
+ `- Workspace config: ${report.summary.workspaceConfig}`,
2596
+ `- Environment: ${report.summary.environment}`,
2597
+ "",
2598
+ "## Source Change Diagnostics",
2599
+ ...listOr(report.workflowDiagnostics, renderDiagnostic),
2600
+ "",
2601
+ "## Existing Workspace Blockers",
2602
+ `- Status: ${baselineSummary.status}`,
2603
+ `- Errors: ${baselineSummary.totalErrors}`,
2604
+ `- Warnings: ${baselineSummary.totalWarnings}`,
2605
+ ...listOr(baselineSummary.byCode, (item) => `- [${item.severity}] ${item.code} (${item.count}x): ${item.sampleMessage}`),
2606
+ ...baselineSummary.detailsIncluded ? [] : [
2607
+ "- Baseline details are summarized by default. Re-run validation with includeBaselineDetails=true for full baselineDiagnostics."
2608
+ ],
2609
+ "",
2610
+ "## Existing Workspace Blocker Details",
2611
+ ...listOr(report.baselineDiagnostics, renderDiagnostic, baselineSummary.detailsIncluded ? "- none" : "- omitted"),
2612
+ "",
2613
+ "## Known Blockers",
2614
+ ...listOr(report.knownBlockers, (blocker) => {
2615
+ const command = blocker.command ? ` \`${blocker.command}\`` : "";
2616
+ const count = blocker.count > 1 ? ` (${blocker.count}x)` : "";
2617
+ const known = blocker.known ? " known" : "";
2618
+ return `- [${blocker.failureScope}${known}]${command}${count}: ${blocker.message}`;
2619
+ }),
2620
+ "",
2621
+ "## Commands",
2622
+ ...listOr(report.commands, (command) => {
2623
+ const scope = command.failureScope ? ` (${command.failureScope})` : "";
2624
+ return `- [${command.status}] \`${command.command}\`${scope}: ${command.reason}`;
2625
+ }),
2626
+ "",
2627
+ "## Diagnostics",
2628
+ ...listOr(report.diagnostics, renderDiagnostic),
2629
+ "",
2630
+ "## Repair Actions",
2631
+ ...listOr(report.repairActions, renderCommand),
2632
+ "",
2633
+ "## Next Actions",
2634
+ ...listOr(report.nextActions, renderCommand),
2635
+ ""
2636
+ ].join(`
2637
+ `);
2638
+ };
2639
+ var renderWorkflowValidation = (report, format = "markdown") => format === "json" ? jsonText(report) : renderWorkflowValidationRunReport(report);
2640
+ var renderRepairReportMarkdown = (report) => [
2641
+ `# Akan Repair: ${report.kind}`,
2642
+ "",
2643
+ `- Status: ${report.status}`,
2644
+ `- Target: ${report.target ?? "none"}`,
2645
+ "",
2646
+ "## Commands",
2647
+ ...listOr(report.commands, (command) => `- [${command.status}] \`${command.command}\`: ${command.reason}`),
2648
+ "",
2649
+ "## Diagnostics",
2650
+ ...listOr(report.diagnostics, renderDiagnostic),
2651
+ "",
2652
+ "## Next Actions",
2653
+ ...listOr(report.nextActions, renderCommand),
2654
+ ""
2655
+ ].join(`
2656
+ `);
2657
+ var renderRepairReport = (report, format = "markdown") => format === "json" ? jsonText(report) : renderRepairReportMarkdown(report);
2658
+ var renderWorkflowRunArtifact = (artifact, format = "markdown") => {
2659
+ if ("kind" in artifact)
2660
+ return renderRepairReport(artifact, format);
2661
+ if ("mode" in artifact && artifact.mode === "validate")
2662
+ return renderWorkflowValidation(artifact, format);
2663
+ if ("mode" in artifact && (artifact.mode === "apply" || artifact.mode === "dry-run")) {
2664
+ return renderWorkflowApply(artifact, format);
2665
+ }
2666
+ return jsonText(artifact);
2667
+ };
2668
+ var renderPrimitiveWriteReport = (report) => [
2669
+ `# Primitive Write: ${report.command}`,
2670
+ "",
2671
+ `- Status: ${report.status}`,
2672
+ "",
2673
+ "## Changed Files",
2674
+ ...listOr(report.changedFiles, renderFile),
2675
+ "",
2676
+ "## Generated Files",
2677
+ ...listOr(report.generatedFiles, renderFile),
2678
+ "",
2679
+ "## Validation Commands",
2680
+ ...listOr(report.validationCommands, renderCommand),
2681
+ "",
2682
+ "## Diagnostics",
2683
+ ...listOr(report.diagnostics, renderDiagnostic),
2684
+ "",
2685
+ "## Next Actions",
2686
+ ...listOr(report.nextActions, renderCommand),
2687
+ ""
2688
+ ].join(`
2689
+ `);
2690
+ var renderPrimitiveReport = (report, format = "markdown") => format === "json" ? jsonText(report) : renderPrimitiveWriteReport(report);
2690
2691
  // pkgs/@akanjs/devkit/workflow/rolloutGate.ts
2691
2692
  var toolingRolloutCandidates = [
2692
2693
  {