@amistio/cli 0.1.28 → 0.1.30

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/README.md CHANGED
@@ -60,6 +60,8 @@ Watch mode prints a completed-work success once per work item, keeps fresh compl
60
60
 
61
61
  Known validation failures such as `unsafe_context_path` are printed with attention-needed next steps. For project-context refresh path-safety failures, deploy the latest web/API fix, update and restart the runner when applicable, retry the refresh, and capture only bounded non-secret output if it repeats.
62
62
 
63
+ App-evaluation result finalization rejections print safe validation paths and preserve the local finalization evidence without exposing raw source or secrets. If a structured app-evaluation result is rejected, update and restart the runner, confirm the web/API deployment is current, and retry the evaluation before acting on cleanup or implementation recommendations.
64
+
63
65
  When brain generation or plan revision output is parsed but the Amistio API is temporarily unavailable during finalization, the runner keeps a safe pending result envelope in user-level Amistio config and replays it before claiming more work. The envelope uses a stable idempotency key and does not store raw tool stdout, provider sessions, credentials, or arbitrary local paths.
64
66
 
65
67
  For headless startup after login on supported user-level service managers:
package/dist/index.js CHANGED
@@ -30,6 +30,8 @@ var itemTypeSchema = z.enum([
30
30
  "implementationTestGate",
31
31
  "appEvaluationScan",
32
32
  "appEvaluationFinding",
33
+ "brainConsolidationScan",
34
+ "brainConsolidationProposal",
33
35
  "implementationVerification",
34
36
  "projectContextMap",
35
37
  "projectContextRefresh",
@@ -83,7 +85,7 @@ var workStatusSchema = z.enum([
83
85
  ]);
84
86
  var sourceSchema = z.enum(["web", "repo", "generated", "runner"]);
85
87
  var executionModeSchema = z.enum(["localRunner", "cloudSandbox"]);
86
- var workKindSchema = z.enum(["brainGeneration", "implementation", "planRevision", "assistantQuestion", "impactPreview", "issueDiagnosis", "securityPostureScan", "appEvaluationScan", "projectContextRefresh", "implementationVerification", "testQualityScan", "implementationTestGate", "runnerCommand"]);
88
+ var workKindSchema = z.enum(["brainGeneration", "implementation", "planRevision", "assistantQuestion", "impactPreview", "issueDiagnosis", "securityPostureScan", "appEvaluationScan", "brainConsolidationScan", "projectContextRefresh", "implementationVerification", "testQualityScan", "implementationTestGate", "runnerCommand"]);
87
89
  var autopilotModeSchema = z.enum(["disabled", "enabled", "paused"]);
88
90
  var autopilotClassificationOutcomeSchema = z.enum(["safeAutopilotEligible", "requiresReview", "blocked", "unsafe"]);
89
91
  var autopilotCandidateTypeSchema = z.enum([
@@ -306,6 +308,11 @@ var appEvaluationFindingConfidenceSchema = z.enum(["low", "medium", "high"]);
306
308
  var appEvaluationFindingStatusSchema = z.enum(["open", "planReady", "approved", "changesRequested", "dismissed", "acceptedRisk", "implementationQueued", "resolved", "failed"]);
307
309
  var appEvaluationApprovalStateSchema = z.enum(["proposed", "approved", "changesRequested", "dismissed", "acceptedRisk", "implemented", "blocked"]);
308
310
  var appEvaluationPlanLifecycleActionSchema = z.enum(["createPlan", "updatePlan", "markCompleted", "markImplemented", "markSuperseded", "markBlocked", "archive", "keepActive", "none"]);
311
+ var brainConsolidationScanStatusSchema = z.enum(["running", "completed", "failed"]);
312
+ var brainConsolidationScanSourceSchema = z.enum(["manual", "system", "runner"]);
313
+ var brainConsolidationProposalStatusSchema = z.enum(["open", "approved", "changesRequested", "dismissed", "acceptedRisk", "resolved", "failed"]);
314
+ var brainConsolidationProposalActionSchema = z.enum(["archiveDuplicates", "supersedeDuplicates", "keepCanonical", "manualReview"]);
315
+ var brainConsolidationRiskLevelSchema = z.enum(["low", "medium", "high", "critical"]);
309
316
  var activityEventTypeSchema = z.enum([
310
317
  "autopilotAuthorized",
311
318
  "autopilotReviewRequired",
@@ -350,6 +357,11 @@ var activityEventTypeSchema = z.enum([
350
357
  "appEvaluationFindingReviewed",
351
358
  "appEvaluationPlanCreated",
352
359
  "appEvaluationImplementationQueued",
360
+ "brainConsolidationStarted",
361
+ "brainConsolidationCompleted",
362
+ "brainConsolidationFailed",
363
+ "brainConsolidationProposalCreated",
364
+ "brainConsolidationProposalReviewed",
353
365
  "testProfileDetected",
354
366
  "testProfileUpdated",
355
367
  "testQualityScanQueued",
@@ -615,6 +627,38 @@ var brainDocumentItemSchema = baseItemSchema.extend({
615
627
  source: sourceSchema,
616
628
  syncState: syncStateSchema
617
629
  });
630
+ var brainConsolidationScanItemSchema = baseItemSchema.extend({
631
+ type: z.literal("brainConsolidationScan"),
632
+ projectId: z.string().min(1),
633
+ brainConsolidationScanId: z.string().min(1),
634
+ source: brainConsolidationScanSourceSchema,
635
+ status: brainConsolidationScanStatusSchema,
636
+ activeReviewCount: z.number().int().nonnegative(),
637
+ exactDuplicateGroupCount: z.number().int().nonnegative(),
638
+ autoArchivedCount: z.number().int().nonnegative(),
639
+ proposalCount: z.number().int().nonnegative(),
640
+ skippedCount: z.number().int().nonnegative(),
641
+ residualReviewCount: z.number().int().nonnegative(),
642
+ summary: z.string().trim().min(1).max(800),
643
+ startedAt: isoDateTimeSchema,
644
+ completedAt: isoDateTimeSchema.optional(),
645
+ error: z.string().trim().min(1).max(800).optional()
646
+ });
647
+ var brainConsolidationProposalItemSchema = baseItemSchema.extend({
648
+ type: z.literal("brainConsolidationProposal"),
649
+ projectId: z.string().min(1),
650
+ brainConsolidationProposalId: z.string().min(1),
651
+ brainConsolidationScanId: z.string().min(1).optional(),
652
+ status: brainConsolidationProposalStatusSchema,
653
+ action: brainConsolidationProposalActionSchema,
654
+ riskLevel: brainConsolidationRiskLevelSchema,
655
+ canonicalDocumentId: z.string().min(1),
656
+ candidateDocumentIds: z.array(z.string().min(1)).min(1).max(50),
657
+ evidence: z.array(z.string().trim().min(1).max(300)).min(1).max(20),
658
+ reason: z.string().trim().min(1).max(800),
659
+ reviewedByUserId: z.string().min(1).optional(),
660
+ reviewedAt: isoDateTimeSchema.optional()
661
+ });
618
662
  var generatedDraftItemSchema = baseItemSchema.extend({
619
663
  type: z.literal("generatedDraft"),
620
664
  projectId: z.string().min(1),
@@ -1841,6 +1885,8 @@ var projectItemUnionSchema = z.discriminatedUnion("type", [
1841
1885
  implementationTestGateItemSchema,
1842
1886
  appEvaluationScanItemSchema,
1843
1887
  appEvaluationFindingItemSchema,
1888
+ brainConsolidationScanItemSchema,
1889
+ brainConsolidationProposalItemSchema,
1844
1890
  implementationVerificationItemSchema,
1845
1891
  projectContextMapItemSchema,
1846
1892
  projectContextRefreshItemSchema,
@@ -2222,9 +2268,11 @@ function computeProjectNextAction(input) {
2222
2268
  if (failedPlanRevision) {
2223
2269
  return failedWorkAction(failedPlanRevision, "planRevisionFailed", "Plan revision failed", failedPlanRevision.lastStatusMessage ?? "Review the conversation and request another revision if needed.");
2224
2270
  }
2225
- const blockedWork = latestWorkItem(input.workItems.filter((item) => item.status === "blocked" || item.status === "changesRequested"));
2271
+ const blockedWorkItems = input.workItems.filter((item) => item.status === "blocked" || item.status === "changesRequested");
2272
+ const blockedWork = latestWorkItem(blockedWorkItems);
2226
2273
  if (blockedWork) {
2227
- return workAction(blockedWork, "workBlocked", "user", "danger", "Work is blocked", blockedWork.lastStatusMessage ?? "Review the blocked work item before the runner can continue.");
2274
+ const message = workStatusReason(blockedWork, "Review the blocked work item before the runner can continue.");
2275
+ return workAction(blockedWork, "workBlocked", "user", "danger", "Work is blocked", blockedWorkItems.length > 1 ? `Latest blocked work ${blockedWork.workItemId}: ${message}` : message);
2228
2276
  }
2229
2277
  const failedWork = latestWorkItem(input.workItems.filter((item) => item.status === "failed"));
2230
2278
  if (failedWork) {
@@ -2337,6 +2385,9 @@ function failedWorkAction(workItem, kind, fallbackTitle, fallbackMessage) {
2337
2385
  }
2338
2386
  return workAction(workItem, kind, "user", "danger", fallbackTitle, fallbackMessage);
2339
2387
  }
2388
+ function workStatusReason(workItem, fallbackMessage) {
2389
+ return workItem.blockerReason ?? workItem.sourceFailureSummary ?? workItem.lastStatusMessage ?? fallbackMessage;
2390
+ }
2340
2391
  function workAction(workItem, kind, actor, tone, title, message, detail) {
2341
2392
  return {
2342
2393
  kind,
@@ -5938,6 +5989,8 @@ function createAppEvaluationScanPrompt(workItem, context) {
5938
5989
  "- When lifecycle metadata disagrees across indexes, frontmatter, feature specs, ADRs, and implementation evidence, cite the conflict and propose a metadata correction or verification step instead of archival/removal.",
5939
5990
  "- Check missing memory or workflow updates when repeated lessons or operational rules are visible.",
5940
5991
  "- Check release readiness, UX, accessibility, performance, reliability, and security-posture follow-through at a summary level.",
5992
+ "- Prefer repository-documented verification commands over ad hoc package-script inference.",
5993
+ "- For this Amistio monorepo, if plain Corepack pnpm fails before scripts with spawnSync pnpm ENOENT, retry the documented command corepack pnpm --config.verify-deps-before-run=false verify before declaring whole-app verification blocked.",
5941
5994
  "",
5942
5995
  "## Data Safety",
5943
5996
  "",
@@ -9154,7 +9207,7 @@ function startWorkLeaseRenewal({ apiClient, projectId, repositoryLinkId, runnerI
9154
9207
  }
9155
9208
  async function recordFinalizationFailure({ apiClient, durationMs, error, isolationTelemetry, projectId, repositoryLinkId, runnerId, sessionContext, toolConfig, toolName, workItem }) {
9156
9209
  const detail = truncateLogExcerpt(errorDetail(error));
9157
- const message = `${toolName} completed, but Amistio could not finalize the result.`;
9210
+ const message = `${toolName} completed, but Amistio could not finalize the result. ${safeFinalizationFailureSummary(error)}`;
9158
9211
  const settlements = await Promise.allSettled([
9159
9212
  apiClient.sendRunnerHeartbeat(projectId, runnerId, repositoryLinkId, "online", runnerHeartbeatMetadata(toolConfig)),
9160
9213
  markToolSessionBlocked(apiClient, projectId, sessionContext.toolSession, errorMessage3(error)),
@@ -9194,6 +9247,12 @@ async function recordFinalizationFailure({ apiClient, durationMs, error, isolati
9194
9247
  console.error(detail);
9195
9248
  return { status: "failed", exitCode: 1, message };
9196
9249
  }
9250
+ function safeFinalizationFailureSummary(error) {
9251
+ if (error instanceof AmistioApiError) {
9252
+ return truncateLogExcerpt(error.message);
9253
+ }
9254
+ return "Review the runner log for the finalization error.";
9255
+ }
9197
9256
  function workItemIsolationTelemetry(workItem, isolation) {
9198
9257
  const implementationScopeId = isolation?.implementationScopeId ?? workItem.implementationScopeId;
9199
9258
  const executionBranch = isolation?.branch ?? workItem.executionBranch;