@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.
- package/.build-stamp +1 -1
- package/{CodeAgent-q50k4s45.js → CodeAgent-gzfc5t52.js} +2 -2
- package/{CodeAgentRpcHost-p7h6n2hp.js → CodeAgentRpcHost-9g27hmer.js} +1 -1
- package/{CodeTui-62g35ztk.js → CodeTui-bpsjs8wz.js} +47 -4
- package/TunnelShare-tfrnftgr.js +14 -0
- package/{agent.command-adfd5299.js → agent.command-67ysh3n6.js} +5 -5
- package/akanCode.js +7 -5
- package/{application.command-hj3gv1rx.js → application.command-q0tqw5pc.js} +38 -11
- package/{applicationBuildRunner-by10r9gf.js → applicationBuildRunner-wsszr305.js} +16 -9
- package/buildBatch.proc.js +7 -7
- package/{cloud.command-k2fhaape.js → cloud.command-e7tkxyx6.js} +17 -16
- package/cloud.script-krzh3d7k.js +24 -0
- package/{code.command-kt5zgcc2.js → code.command-ttk8tje2.js} +25 -12
- package/commandManifest.json +1 -1
- package/{context.command-8fgn42jw.js → context.command-bdsk2z2r.js} +17 -16
- package/context.runner-bxzv0gm0.js +25 -0
- package/{dependencyScanner-06z2dmrr.js → dependencyScanner-3afj2vt1.js} +1 -1
- package/{guideline.command-3yxxr2mm.js → guideline.command-man90n70.js} +2 -2
- package/guidelines/agentRule/agentRule.instruction.md +25 -10
- package/guidelines/conventions/conventions.instruction.md +486 -1084
- package/guidelines/cssRule/cssRule.instruction.md +16 -1
- package/guidelines/fieldRule/fieldRule.instruction.md +74 -0
- package/guidelines/framework/framework.instruction.md +4 -7
- package/guidelines/mcpRule/mcpRule.instruction.md +16 -9
- package/guidelines/modelConstant/modelConstant.instruction.md +2 -1
- package/guidelines/modelStore/modelStore.instruction.md +16 -0
- package/guidelines/pageRule/pageRule.instruction.md +80 -0
- package/guidelines/queryRule/queryRule.instruction.md +47 -12
- package/guidelines/runtimeRule/runtimeRule.instruction.md +89 -2
- package/guidelines/ssrRule/ssrRule.instruction.md +13 -0
- package/guidelines/transportRule/transportRule.instruction.md +107 -8
- package/guidelines/workspaceOnboarding/workspaceOnboarding.instruction.md +4 -4
- package/guidelines/workspaceRecipes/workspaceRecipes.instruction.md +70 -7
- package/incrementalBuilder.proc.js +4 -4
- package/{index-rhbabmja.js → index-033wne2j.js} +260 -259
- package/{index-xpdgxsj5.js → index-1r5a8bzx.js} +2216 -2216
- package/{index-jwqtchha.js → index-27y8t17p.js} +1 -1
- package/{index-wa5jbxj1.js → index-2mrn1mrg.js} +1 -0
- package/{index-t7nws9mx.js → index-2w8j2fnv.js} +661 -448
- package/{index-0909wckt.js → index-35m6bzm7.js} +238 -236
- package/{index-sqfdmb5b.js → index-4393nb4b.js} +4 -4
- package/{index-sby8fe1p.js → index-48edp6q4.js} +1 -1
- package/{index-g0vwzy9m.js → index-4v43h00g.js} +20 -21
- package/{index-azh29dc8.js → index-54wc2phm.js} +19 -14
- package/{index-k9rrten6.js → index-5nd1wtkv.js} +92 -94
- package/index-62md4dwy.js +260 -0
- package/{index-hnby7p9n.js → index-75n5q4ph.js} +7 -7
- package/{index-fjsv10hd.js → index-844q7f8z.js} +7 -7
- package/{index-tv8fjaba.js → index-8jehkey8.js} +4 -4
- package/{index-bea2gwc6.js → index-9mt4smfy.js} +2 -2
- package/{index-d2242ksy.js → index-at7bz0xq.js} +3 -0
- package/{index-3hx1z96c.js → index-bqbf654f.js} +1 -1
- package/{index-8zdwpxef.js → index-cae9m5jz.js} +119 -81
- package/{index-tz5evhdr.js → index-ebarbgba.js} +6 -6
- package/{index-2etqq75t.js → index-g6ax17x4.js} +1114 -1082
- package/{index-h85cxfkg.js → index-g9ks2k8c.js} +2 -2
- package/{index-nq045px5.js → index-h3r3nr9y.js} +356 -307
- package/{index-20cebtth.js → index-h6czey01.js} +79 -24
- package/{index-6726qr1m.js → index-jrmzcp66.js} +57 -58
- package/{index-q958tqqg.js → index-m9jj544v.js} +1 -1
- package/{index-8935h3n1.js → index-mdjc93e1.js} +1 -1
- package/{index-rk9sdys3.js → index-nv79n88g.js} +5 -5
- package/{index-kc8z134d.js → index-nx64dz92.js} +38 -15
- package/{index-z507nzhg.js → index-p2r64bpa.js} +4 -4
- package/{index-nq2ja5e0.js → index-pg1t468s.js} +3 -3
- package/{index-3reaaa1h.js → index-rc51f9ht.js} +29 -27
- package/{index-e9prnmyt.js → index-ta1dychm.js} +3 -3
- package/{index-2ahj896a.js → index-tvehn2sp.js} +1 -1
- package/{index-31ce9vhg.js → index-vkb9m4z7.js} +80 -38
- package/{index-58vvz603.js → index-xsd96yzw.js} +1 -1
- package/{index-pyxn1b53.js → index-zv5s8x58.js} +13 -13
- package/index.js +22 -22
- package/{library.command-8tw59xzj.js → library.command-6amzsrb8.js} +3 -3
- package/{localRegistry.command-tf3dmznd.js → localRegistry.command-yqc0nyhh.js} +15 -14
- package/{module.command-9vm8hffy.js → module.command-10x6jv6c.js} +5 -5
- package/{package.command-erbxe2tz.js → package.command-pwfvecjf.js} +4 -4
- package/package.json +21 -21
- package/{page.command-jpavcj0p.js → page.command-ahhgx9y1.js} +3 -3
- package/{pipeline.command-b8rzvjvv.js → pipeline.command-1ptr3e9y.js} +3 -3
- package/{primitive.command-sm32chzk.js → primitive.command-g5xwv6tj.js} +6 -6
- package/{projectTypecheck-jamtx95x.js → projectTypecheck-fx8x7cat.js} +1 -1
- package/{quality.command-pkd17n6y.js → quality.command-fw9ck061.js} +4 -4
- package/{repair.command-8y4mq6hs.js → repair.command-g8kecj96.js} +5 -5
- package/{scalar.command-q8khmyx5.js → scalar.command-fprap51w.js} +4 -4
- package/skills/akan-code/SKILL.md +4 -0
- package/skills/akan-store/SKILL.md +2 -1
- package/{subspace.command-51n0ykbx.js → subspace.command-sc0t527y.js} +11 -10
- package/templates/appSample/lib/task/Task.Util.tsx +7 -7
- package/templates/appSample/lib/task/Task.Zone.tsx +1 -1
- package/templates/appSample/ui/QuantityControl.tsx +2 -2
- package/templates/crudSinglePage/page.tsx +1 -1
- package/templates/lib/cnst.ts +0 -1
- package/templates/migration/__migrationId__.ts +23 -0
- package/templates/server.ts +8 -1
- package/templates/workspaceRoot/.gitignore.template +23 -52
- package/templates/workspaceRoot/biome.json.template +1 -1
- package/{tunnel.command-7820vtxq.js → tunnel.command-mqnsqbwf.js} +8 -7
- package/{workflow.command-n5sv4wqz.js → workflow.command-j0jgkr13.js} +10 -10
- package/{workspace.command-zdy60jh8.js → workspace.command-1r9hvvw0.js} +29 -28
- package/TunnelShare-f1egrktx.js +0 -13
- package/cloud.script-z8p5dz7e.js +0 -23
- package/context.runner-hnh0rg7m.js +0 -24
- package/index-n68jx79w.js +0 -120
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
import {
|
|
3
3
|
AppExecutor,
|
|
4
4
|
LibExecutor
|
|
5
|
-
} from "./index-
|
|
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(
|
|
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(/(
|
|
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
|
{
|