snipara-companion 3.6.13 → 3.6.14

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/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  Release notes for `snipara-companion`, newest first.
4
4
 
5
+ ## Unreleased
6
+
7
+ ## New In 3.6.14
8
+
9
+ - Adds opt-in `--minimum-change-mode review` forwarding for hosted context
10
+ queries and code-impact reviews, including the evidence-backed
11
+ minimum-safe-change receipt in answer packs.
12
+
13
+ - Lets managed `pre-commit` and `pre-push` hooks receive an explicit,
14
+ one-operation review-only acknowledgement through
15
+ `SNIPARA_COLLABORATION_GUARD_ACK_REVIEW_ONLY=1`; the hook immediately
16
+ re-runs without the flag so blocking leases and hard conflicts remain
17
+ enforced.
18
+
5
19
  ## New In 3.6.13
6
20
 
7
21
  - Adds a native spec-driven `feature` workflow for durable `spec.md`, `plan.md`,
package/README.md CHANGED
@@ -18,7 +18,7 @@ state, handoffs, and durable task outcomes.
18
18
  ```bash
19
19
  npx -y create-snipara@latest init --client cursor --starter
20
20
  npx -y snipara-companion session-bootstrap --include-session-context --max-context-tokens 1000
21
- npx -y snipara-companion impact src/auth/session.ts --source local
21
+ npx -y snipara-companion code impact --changed-files src/auth/session.ts --source local
22
22
  npx -y snipara-companion source init .
23
23
  ```
24
24
 
@@ -106,7 +106,7 @@ These commands are useful without hosted Snipara:
106
106
  | Command | What it gives you locally |
107
107
  | ------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
108
108
  | `source init` / `source sync` / `source status` | Local source snapshot, document preview, and code overlay |
109
- | `impact` / `code impact` | Bounded transitive blast radius, chains, and explainable local risk |
109
+ | `code impact` (`impact` alias) / `code local impact` | Bounded transitive blast radius, chains, and explainable local risk |
110
110
  | `reality-check` | Intent Ledger, Unknown Registry, auto-linked context, and inspectable proof |
111
111
  | `code callers` / `imports` / `neighbors` / `shortest-path` | Structural repo questions from local files |
112
112
  | `workflow start` / `phase-start` / `phase-commit` / `resume` | Agent continuity that survives compaction |
@@ -125,6 +125,32 @@ These commands are useful without hosted Snipara:
125
125
  | `intelligence ledger-export` | Structured redacted ledger JSON for replay and review |
126
126
  | `stuck-guard`, `memory-guard`, `pre-tool`, `post-tool` | Fail-soft local guards and hook helpers |
127
127
 
128
+ ### Canonical command forms
129
+
130
+ Use the exact CLI value after `workflow run --mode`:
131
+
132
+ | CLI value | Guide label | Meaning |
133
+ | ------------- | ------------------- | --------------------------------------------------------------------- |
134
+ | `lite` | LITE | Small, known-scope work with no mandatory hosted context call |
135
+ | `standard` | STANDARD | Normal work with context and code-graph follow-up when needed |
136
+ | `auto` | AUTO | Routes by task intent to `lite`, `standard`, `full`, or `orchestrate` |
137
+ | `full` | FULL | Managed, phased work with durable context and plan support |
138
+ | `orchestrate` | FULL + ORCHESTRATED | Explicit deeper orchestration for multi-agent or proof-gate work |
139
+
140
+ The root `run` command is the Project Intelligence judgment/release flow.
141
+ `workflow run` is the workflow-mode runner. They share a verb but are not
142
+ aliases.
143
+
144
+ Use `code impact` as the canonical impact gate. The root `impact` command is a
145
+ compatibility alias, while `code local impact` is the separate non-canonical
146
+ local-overlay query. Use `final-commit` as the canonical final workflow
147
+ closeout; `workflow final-commit` remains a compatibility alias. `task-commit`
148
+ captures a durable task outcome, and `workflow phase-commit` records one
149
+ managed phase and advances the workflow; these are distinct operations.
150
+
151
+ For a public, copy/paste-oriented table, see the
152
+ [Companion CLI Command Reference](https://www.snipara.com/docs/integration/companion/reference).
153
+
128
154
  ### Spec-driven feature workflow
129
155
 
130
156
  Companion provides a native Spec Kit-style preparation layer without creating a
@@ -506,14 +532,14 @@ or ahead work; `--source local` remains completely offline.
506
532
  Use `npx` for one-off checks:
507
533
 
508
534
  ```bash
509
- npx -y snipara-companion impact src/auth/session.ts --source local
535
+ npx -y snipara-companion code impact --changed-files src/auth/session.ts --source local
510
536
  ```
511
537
 
512
538
  Install globally only if you use it every day:
513
539
 
514
540
  ```bash
515
541
  npm install -g snipara-companion
516
- snipara-companion impact src/auth/session.ts
542
+ snipara-companion code impact --changed-files src/auth/session.ts
517
543
  snipara-companion workflow resume
518
544
  ```
519
545
 
package/dist/index.d.ts CHANGED
@@ -89,6 +89,7 @@ interface ContextQueryResult {
89
89
  };
90
90
  }
91
91
  type ContextQuerySearchMode = "keyword" | "semantic" | "hybrid";
92
+ type MinimumChangeMode = "off" | "review";
92
93
  interface ContextQueryOptions {
93
94
  searchMode?: ContextQuerySearchMode;
94
95
  includeMetadata?: boolean;
@@ -97,6 +98,7 @@ interface ContextQueryOptions {
97
98
  includeSharedContext?: boolean;
98
99
  includeAllTiers?: boolean;
99
100
  returnReferences?: boolean;
101
+ minimumChangeMode?: MinimumChangeMode;
100
102
  }
101
103
  interface AnswerPackSource {
102
104
  title?: string;
@@ -125,6 +127,7 @@ interface AnswerPack {
125
127
  graph_context_included?: boolean;
126
128
  impact_hint?: string | null;
127
129
  };
130
+ minimum_safe_change?: Record<string, unknown>;
128
131
  token_count?: number;
129
132
  }
130
133
  interface HostedContextControlDiffResponse {
@@ -1141,6 +1144,7 @@ declare class RLMClient {
1141
1144
  direction?: "in" | "out" | "both";
1142
1145
  edgeKinds?: string[];
1143
1146
  limit?: number;
1147
+ minimumChangeMode?: MinimumChangeMode;
1144
1148
  }): Promise<Record<string, unknown>>;
1145
1149
  /**
1146
1150
  * Track accessed files using snipara_remember
@@ -2198,6 +2202,7 @@ declare function writeLocalCodeOverlayCache(manifest: LocalCodeOverlayManifest):
2198
2202
  declare function readLocalCodeOverlayCache(cwd?: string): LocalCodeOverlayManifest | null;
2199
2203
  declare function writeLocalCodePromotionState(state: LocalCodePromotionState): string;
2200
2204
  declare function readLocalCodePromotionState(cwd?: string): LocalCodePromotionState | null;
2205
+ declare function resolveMinimumChangeMode(value: unknown): MinimumChangeMode;
2201
2206
  declare function resolveCodeGraphMode(args: {
2202
2207
  requested: CodeGraphSource;
2203
2208
  dirtyFiles: string[];
@@ -5373,4 +5378,4 @@ declare function installAutomationBundle(args: {
5373
5378
  }): Promise<AutomationInstallResult>;
5374
5379
  declare function getAutomationStatus(projectDir?: string): AutomationStatusResult;
5375
5380
 
5376
- export { AGENT_CONTEXT_EVIDENCE_DEFAULT_LEDGER, AUTOMATION_MANIFEST_RELATIVE_PATH, AutomationInstallConflictError, AutomationUnsupportedHookBundleError, CODING_INTELLIGENCE_LEDGER_VERSION, COLLABORATION_STATE_RELATIVE_PATH, ENGINEERING_LEAD_EXECUTION_RECEIPT_STAGES, ENGINEERING_LEAD_EXECUTION_RECEIPT_STATUSES, ENGINEERING_LEAD_POSTURES, ENGINEERING_LEAD_PROOF_VERIFICATION_SOURCES, ENGINEERING_LEAD_PROOF_VERIFICATION_STATUSES, ENGINEERING_LEAD_ROUTING_MODES, ENGINEERING_LEAD_STATUSES, ENGINEERING_LEAD_SUPERVISION_STATUSES, ENGINEERING_LEAD_WORKER_ROLES, ENGINEERING_LEAD_WORK_PACKAGE_STATUSES, FEATURE_DEFAULT_OUTPUT_DIR, FEATURE_WORK_ITEM_VERSION, FINAL_COMMIT_REPORT_RELATIVE_PATH, FINAL_COMMIT_REPORT_VERSION, MEMORY_GUARD_CONTEXT_TIMEOUT_MS, MEMORY_GUARD_RECALL_TIMEOUT_MS, ORCHESTRATOR_HANDOFF_RELATIVE_PATH, POLICY_LEDGER_SYNC_REPORT_VERSION, PRODUCER_LOOP_ARTIFACT_VERSION, PRODUCER_LOOP_RELATIVE_DIR, PRODUCER_LOOP_REPORT_VERSION, TEAM_SYNC_STATE_RELATIVE_PATH, WHY_OUTCOME_CAPTURE_VERSION, WORKFLOW_PLANS_RELATIVE_DIR, WORKFLOW_STATE_RELATIVE_PATH, addLocalWorker, agentContextEvidenceCollectCommand, agentContextEvidenceRecordCommand, agentContextEvidenceStatusCommand, agentContextEvidenceTemplateCommand, agentContextResolveCommand, agentContextValidateCommand, agentReadinessAuditCommand, appendActivityEvent, applyLocalContextMutationPlan, applyManagedWorkflowPolicyAutoResponses, archiveInactiveTeamSyncWork, attachLocalContextPackReceipts, autoArchiveTeamSyncState, buildAdaptiveWorkRoutingRecommendation, buildAgentReadinessAuditReport, buildAgenticHandoffMarkdown, buildAgenticTimeline, buildAgenticWorkStatus, buildAutomationInstallPlan, buildCanonicalEvent, buildCodeHooksInstallPlan, buildCodePromotionResult, buildCodeStatusResult, buildCodeSyncResult, buildCodingIntelligenceLedger, buildCollaborationActor, buildCollaborationGuardActionCards, buildCollaborationHooksInstallPlan, buildCommitResultMetadata, buildCompanionEngineeringLeadPlanReport, buildContextPackStats, buildEvalCaseArtifact, buildFeaturePlanMarkdown, buildFeatureSpecMarkdown, buildFeatureTasksMarkdown, buildFinalCommitReport, buildGeneratedWorkflowPlanDocument, buildHostedCodeOverlayUploadPayload, buildHostedGuardPayload, buildJournalCheckpointEntry, buildLocalAgentContextValidationReport, buildLocalCallersResult, buildLocalCodeOverlay, buildLocalContextMutationPlan, buildLocalContextPackReceipt, buildLocalContextPackReceipts, buildLocalImpactResult, buildLocalImportsResult, buildLocalNeighborsResult, buildLocalProjectContextValidationReport, buildLocalProjectDriftReport, buildLocalProjectRealityCheck, buildLocalProjectRealityCheckWithAutoContext, buildLocalShortestPathResult, buildLocalSourceSnapshot, buildLocalSourceStatus, buildLocalSourceSyncResult, buildMemoryAudit, buildOnboardFolderManifest, buildOrchestratorHandoff, buildPolicyLedgerSyncReport, buildProducerLoopReport, buildProjectIntelligenceBrief, buildProjectIntelligenceRun, buildProjectJudgmentCard, buildSessionBootstrapBrief, buildSessionBootstrapQuality, buildSessionSnapshot, buildSyncDocumentsDryRun, buildTeamSyncHandoffRecord, buildTeamSyncStartWorkRecord, buildTeamSyncSummary, buildToolCallPayload, buildToolResultPayload, buildVerificationPlan, buildWhyOutcomeCaptureReport, buildWorkerTrustCandidates, buildWorkflowImpactGate, buildWorkflowPhaseCommitReceipt, buildWorkflowPhaseCommitSummary, buildWorkflowPlanScaffold, captureStandaloneCommitWhy, categoryFromGuardTag, classifyToolResult, cleanContextPacks, codingLedgerExportCommand, collaborationIdeStatusCommand, collectAgentReadinessLocalSignals, collectPolicyLedgerSyncArtifacts, collectSyncDocuments, collectSyncDocumentsInput, compactHostedGuardResources, compareLocalSourceSnapshots, completeTeamSyncStateFromEvidence, completeTeamSyncWorkFromEvidence, contextControlApplyCommand, contextControlDriftCommand, contextControlHostedApplyCommand, contextControlHostedDiffCommand, contextControlPlanCommand, contextControlValidateCommand, contextPackCleanCommand, contextPackPackCommand, contextPackRetrieveCommand, contextPackStatsCommand, controlledWorkerExecuteCommand, createClient, createEmptyCollaborationState, createEmptyTeamSyncState, createLocalQueryCache, deriveLocalCollaborationResourcesFromFiles, deriveManagedWorkflowJudgmentResolution, detectReleaseSurfacesFromFiles, detectRuntimeEnvironment, evalExportCommand, evalRunCommand, evaluateProjectPolicyGates, extractCommandFromToolInput, extractFilesFromToolInput, featureInitCommand, featurePlanCommand, featureSpecifyCommand, featureStartCommand, featureStatusCommand, featureTasksCommand, formatAgentContextResolution, formatAgentReadinessAuditReport, formatCompanionEngineeringLeadPlanReport, formatFinalCommitReport, formatOrchestratorRecommendationReason, formatPolicyGateDecision, formatProjectJudgmentCard, formatStuckGuardDecision, getAutomationManifestPath, getAutomationStatus, getCollaborationStatePath, getConfigPath, getContextPackStoragePaths, getLocalCodeOverlayCachePath, getLocalCodePromotionStatePath, getLocalSourceSnapshotPath, getOrchestratorRecommendation, getPlanStepDisplayTitle, getStagedFiles, getStuckGuardInjection, getTeamSyncStatePath, hasActiveManagedWorkflow, hashWorkerProfile, ingestReferences, installAutomationBundle, leadPlanCommand, listProjectsForApiKey, loadAutomationManifest, loadCollaborationState, loadConfig, loadTeamSyncState, memoryAuditCommand, memoryCleanCandidatesCommand, memoryCompactCommand, memoryHealthCommand, memoryLocalCommand, memoryReviewsCommand, mergeHybridCodeResults, normalizeCollaborationFiles, normalizeFeatureSlug, normalizeGuardTag, normalizeWorkflowPlanInput, outcomeCapturePreviewCommand, packContext, parseCollaborationResources, projectIntelligenceBriefCommand, projectIntelligenceRunCommand, readActivityTimeline, readAgentContextEvidenceLedger, readLocalCodeOverlayCache, readLocalCodePromotionState, readLocalSourceSnapshot, readLocalWorkersConfig, readSessionSnapshot, readStandaloneCommitEvidence, readWorkerTrustEvent, realityCheckCommand, referencesIngestCommand, referencesScanCommand, resolveAutoWorkflowMode, resolveCodeGraphMode, resolveContextPackRecord, resolveFeatureArtifactPaths, resolveFullWorkflowTokenBudget, resolveLocalWorkerRoutingDefaults, resolveQueryFromToolInput, retrieveContextPack, runMemoryGuardCheck, saveCollaborationState, saveConfig, saveTeamSyncState, scanReferences, shouldFailCollaborationGuard, shouldSuggestOrchestratorForWorkflow, shouldSuggestRuntimeForWorkflow, summarizeLocalCodeOverlay, teamSyncSweepCommand, validatePlanResult, verifyCommand, workerTrustCandidateCommand, workerTrustReviewCommand, workerTrustStatusCommand, workersLocalAddCommand, workersLocalListCommand, workersLocalProbePrintCommand, workersLocalRemoveCommand, workersLocalStatusCommand, workflowSyncPolicyLedgerCommand, writeFinalCommitReport, writeLocalCodeOverlayCache, writeLocalCodePromotionState, writeLocalSourceSnapshot, writeOrchestratorHandoff, writeProducerLoopArtifact, writeSessionSnapshot };
5381
+ export { AGENT_CONTEXT_EVIDENCE_DEFAULT_LEDGER, AUTOMATION_MANIFEST_RELATIVE_PATH, AutomationInstallConflictError, AutomationUnsupportedHookBundleError, CODING_INTELLIGENCE_LEDGER_VERSION, COLLABORATION_STATE_RELATIVE_PATH, ENGINEERING_LEAD_EXECUTION_RECEIPT_STAGES, ENGINEERING_LEAD_EXECUTION_RECEIPT_STATUSES, ENGINEERING_LEAD_POSTURES, ENGINEERING_LEAD_PROOF_VERIFICATION_SOURCES, ENGINEERING_LEAD_PROOF_VERIFICATION_STATUSES, ENGINEERING_LEAD_ROUTING_MODES, ENGINEERING_LEAD_STATUSES, ENGINEERING_LEAD_SUPERVISION_STATUSES, ENGINEERING_LEAD_WORKER_ROLES, ENGINEERING_LEAD_WORK_PACKAGE_STATUSES, FEATURE_DEFAULT_OUTPUT_DIR, FEATURE_WORK_ITEM_VERSION, FINAL_COMMIT_REPORT_RELATIVE_PATH, FINAL_COMMIT_REPORT_VERSION, MEMORY_GUARD_CONTEXT_TIMEOUT_MS, MEMORY_GUARD_RECALL_TIMEOUT_MS, ORCHESTRATOR_HANDOFF_RELATIVE_PATH, POLICY_LEDGER_SYNC_REPORT_VERSION, PRODUCER_LOOP_ARTIFACT_VERSION, PRODUCER_LOOP_RELATIVE_DIR, PRODUCER_LOOP_REPORT_VERSION, TEAM_SYNC_STATE_RELATIVE_PATH, WHY_OUTCOME_CAPTURE_VERSION, WORKFLOW_PLANS_RELATIVE_DIR, WORKFLOW_STATE_RELATIVE_PATH, addLocalWorker, agentContextEvidenceCollectCommand, agentContextEvidenceRecordCommand, agentContextEvidenceStatusCommand, agentContextEvidenceTemplateCommand, agentContextResolveCommand, agentContextValidateCommand, agentReadinessAuditCommand, appendActivityEvent, applyLocalContextMutationPlan, applyManagedWorkflowPolicyAutoResponses, archiveInactiveTeamSyncWork, attachLocalContextPackReceipts, autoArchiveTeamSyncState, buildAdaptiveWorkRoutingRecommendation, buildAgentReadinessAuditReport, buildAgenticHandoffMarkdown, buildAgenticTimeline, buildAgenticWorkStatus, buildAutomationInstallPlan, buildCanonicalEvent, buildCodeHooksInstallPlan, buildCodePromotionResult, buildCodeStatusResult, buildCodeSyncResult, buildCodingIntelligenceLedger, buildCollaborationActor, buildCollaborationGuardActionCards, buildCollaborationHooksInstallPlan, buildCommitResultMetadata, buildCompanionEngineeringLeadPlanReport, buildContextPackStats, buildEvalCaseArtifact, buildFeaturePlanMarkdown, buildFeatureSpecMarkdown, buildFeatureTasksMarkdown, buildFinalCommitReport, buildGeneratedWorkflowPlanDocument, buildHostedCodeOverlayUploadPayload, buildHostedGuardPayload, buildJournalCheckpointEntry, buildLocalAgentContextValidationReport, buildLocalCallersResult, buildLocalCodeOverlay, buildLocalContextMutationPlan, buildLocalContextPackReceipt, buildLocalContextPackReceipts, buildLocalImpactResult, buildLocalImportsResult, buildLocalNeighborsResult, buildLocalProjectContextValidationReport, buildLocalProjectDriftReport, buildLocalProjectRealityCheck, buildLocalProjectRealityCheckWithAutoContext, buildLocalShortestPathResult, buildLocalSourceSnapshot, buildLocalSourceStatus, buildLocalSourceSyncResult, buildMemoryAudit, buildOnboardFolderManifest, buildOrchestratorHandoff, buildPolicyLedgerSyncReport, buildProducerLoopReport, buildProjectIntelligenceBrief, buildProjectIntelligenceRun, buildProjectJudgmentCard, buildSessionBootstrapBrief, buildSessionBootstrapQuality, buildSessionSnapshot, buildSyncDocumentsDryRun, buildTeamSyncHandoffRecord, buildTeamSyncStartWorkRecord, buildTeamSyncSummary, buildToolCallPayload, buildToolResultPayload, buildVerificationPlan, buildWhyOutcomeCaptureReport, buildWorkerTrustCandidates, buildWorkflowImpactGate, buildWorkflowPhaseCommitReceipt, buildWorkflowPhaseCommitSummary, buildWorkflowPlanScaffold, captureStandaloneCommitWhy, categoryFromGuardTag, classifyToolResult, cleanContextPacks, codingLedgerExportCommand, collaborationIdeStatusCommand, collectAgentReadinessLocalSignals, collectPolicyLedgerSyncArtifacts, collectSyncDocuments, collectSyncDocumentsInput, compactHostedGuardResources, compareLocalSourceSnapshots, completeTeamSyncStateFromEvidence, completeTeamSyncWorkFromEvidence, contextControlApplyCommand, contextControlDriftCommand, contextControlHostedApplyCommand, contextControlHostedDiffCommand, contextControlPlanCommand, contextControlValidateCommand, contextPackCleanCommand, contextPackPackCommand, contextPackRetrieveCommand, contextPackStatsCommand, controlledWorkerExecuteCommand, createClient, createEmptyCollaborationState, createEmptyTeamSyncState, createLocalQueryCache, deriveLocalCollaborationResourcesFromFiles, deriveManagedWorkflowJudgmentResolution, detectReleaseSurfacesFromFiles, detectRuntimeEnvironment, evalExportCommand, evalRunCommand, evaluateProjectPolicyGates, extractCommandFromToolInput, extractFilesFromToolInput, featureInitCommand, featurePlanCommand, featureSpecifyCommand, featureStartCommand, featureStatusCommand, featureTasksCommand, formatAgentContextResolution, formatAgentReadinessAuditReport, formatCompanionEngineeringLeadPlanReport, formatFinalCommitReport, formatOrchestratorRecommendationReason, formatPolicyGateDecision, formatProjectJudgmentCard, formatStuckGuardDecision, getAutomationManifestPath, getAutomationStatus, getCollaborationStatePath, getConfigPath, getContextPackStoragePaths, getLocalCodeOverlayCachePath, getLocalCodePromotionStatePath, getLocalSourceSnapshotPath, getOrchestratorRecommendation, getPlanStepDisplayTitle, getStagedFiles, getStuckGuardInjection, getTeamSyncStatePath, hasActiveManagedWorkflow, hashWorkerProfile, ingestReferences, installAutomationBundle, leadPlanCommand, listProjectsForApiKey, loadAutomationManifest, loadCollaborationState, loadConfig, loadTeamSyncState, memoryAuditCommand, memoryCleanCandidatesCommand, memoryCompactCommand, memoryHealthCommand, memoryLocalCommand, memoryReviewsCommand, mergeHybridCodeResults, normalizeCollaborationFiles, normalizeFeatureSlug, normalizeGuardTag, normalizeWorkflowPlanInput, outcomeCapturePreviewCommand, packContext, parseCollaborationResources, projectIntelligenceBriefCommand, projectIntelligenceRunCommand, readActivityTimeline, readAgentContextEvidenceLedger, readLocalCodeOverlayCache, readLocalCodePromotionState, readLocalSourceSnapshot, readLocalWorkersConfig, readSessionSnapshot, readStandaloneCommitEvidence, readWorkerTrustEvent, realityCheckCommand, referencesIngestCommand, referencesScanCommand, resolveAutoWorkflowMode, resolveCodeGraphMode, resolveContextPackRecord, resolveFeatureArtifactPaths, resolveFullWorkflowTokenBudget, resolveLocalWorkerRoutingDefaults, resolveMinimumChangeMode, resolveQueryFromToolInput, retrieveContextPack, runMemoryGuardCheck, saveCollaborationState, saveConfig, saveTeamSyncState, scanReferences, shouldFailCollaborationGuard, shouldSuggestOrchestratorForWorkflow, shouldSuggestRuntimeForWorkflow, summarizeLocalCodeOverlay, teamSyncSweepCommand, validatePlanResult, verifyCommand, workerTrustCandidateCommand, workerTrustReviewCommand, workerTrustStatusCommand, workersLocalAddCommand, workersLocalListCommand, workersLocalProbePrintCommand, workersLocalRemoveCommand, workersLocalStatusCommand, workflowSyncPolicyLedgerCommand, writeFinalCommitReport, writeLocalCodeOverlayCache, writeLocalCodePromotionState, writeLocalSourceSnapshot, writeOrchestratorHandoff, writeProducerLoopArtifact, writeSessionSnapshot };
package/dist/index.js CHANGED
@@ -253,6 +253,7 @@ __export(index_exports, {
253
253
  resolveFeatureArtifactPaths: () => resolveFeatureArtifactPaths,
254
254
  resolveFullWorkflowTokenBudget: () => resolveFullWorkflowTokenBudget,
255
255
  resolveLocalWorkerRoutingDefaults: () => resolveLocalWorkerRoutingDefaults,
256
+ resolveMinimumChangeMode: () => resolveMinimumChangeMode,
256
257
  resolveQueryFromToolInput: () => resolveQueryFromToolInput,
257
258
  retrieveContextPack: () => retrieveContextPack,
258
259
  runMemoryGuardCheck: () => runMemoryGuardCheck,
@@ -975,7 +976,8 @@ var RLMClient = class {
975
976
  auto_decompose: options.autoDecompose,
976
977
  include_shared_context: options.includeSharedContext,
977
978
  include_all_tiers: options.includeAllTiers,
978
- return_references: options.returnReferences
979
+ return_references: options.returnReferences,
980
+ minimum_change_mode: options.minimumChangeMode ?? "off"
979
981
  });
980
982
  return {
981
983
  sections: (result.sections || []).map((s) => ({
@@ -1072,7 +1074,8 @@ var RLMClient = class {
1072
1074
  depth: options.depth ?? 3,
1073
1075
  direction: options.direction ?? "both",
1074
1076
  edge_kinds: options.edgeKinds,
1075
- limit: options.limit ?? 50
1077
+ limit: options.limit ?? 50,
1078
+ minimum_change_mode: options.minimumChangeMode ?? "off"
1076
1079
  });
1077
1080
  }
1078
1081
  /**
@@ -5328,6 +5331,11 @@ function resolveRequestedCodeGraphSource(value) {
5328
5331
  }
5329
5332
  throw new Error("--source must be one of: auto, local, hosted, hybrid");
5330
5333
  }
5334
+ function resolveMinimumChangeMode(value) {
5335
+ if (value === void 0 || value === null || value === "") return "off";
5336
+ if (value === "off" || value === "review") return value;
5337
+ throw new Error("--minimum-change-mode must be one of: off, review");
5338
+ }
5331
5339
  function resolveCodeGraphMode(args) {
5332
5340
  if (args.fallbackHosted && args.requested !== "hosted") {
5333
5341
  return args.hostedConfigured ? { selected: "hybrid_graph", reason: "fallback_hosted_requested" } : { selected: "local_overlay", reason: "fallback_hosted_not_configured" };
@@ -5484,6 +5492,7 @@ function mergeHybridCodeResults(verb, localResult, hostedResult, hostedError) {
5484
5492
  );
5485
5493
  const coverageGaps = mergeResultArrays([hosted, local], ["coverage_gaps", "coverageGaps"]);
5486
5494
  const warnings = mergeResultArrays([hosted, local], ["warnings"]);
5495
+ const minimumSafeChange = hosted.minimum_safe_change ?? hosted.minimumSafeChange ?? local.minimum_safe_change;
5487
5496
  return {
5488
5497
  title: `Hybrid ${verb}`,
5489
5498
  mode: hostedError ? "hybrid_degraded_local" : "hybrid",
@@ -5506,6 +5515,7 @@ function mergeHybridCodeResults(verb, localResult, hostedResult, hostedError) {
5506
5515
  recommended_actions: recommendedActions,
5507
5516
  coverage_gaps: coverageGaps,
5508
5517
  warnings,
5518
+ ...minimumSafeChange ? { minimum_safe_change: minimumSafeChange } : {},
5509
5519
  ...hosted.index_freshness !== void 0 ? { index_freshness: hosted.index_freshness } : {},
5510
5520
  ...hosted.impact !== void 0 ? { impact: hosted.impact } : {},
5511
5521
  local: localResult,
@@ -5587,7 +5597,8 @@ async function callHostedCodeTool(verb, options) {
5587
5597
  depth: options.depth,
5588
5598
  direction: traversalDirection(options.direction),
5589
5599
  edgeKinds: options.edgeKinds,
5590
- limit: options.limit
5600
+ limit: options.limit,
5601
+ minimumChangeMode: options.minimumChangeMode
5591
5602
  });
5592
5603
  }
5593
5604
  }
@@ -20469,7 +20480,22 @@ function buildCollaborationGitHookBlock(hookName) {
20469
20480
  " fi",
20470
20481
  " }",
20471
20482
  ` snipara_companion_hook collaboration claim --resource SURFACE:checkout-git-write --mode EXCLUSIVE --ttl-seconds 300 --reason "${profile} git write" --json >/dev/null || true`,
20472
- ` snipara_companion_hook collaboration guard --profile ${profile} --action ${profile} --resource SURFACE:checkout-git-write --enforce --json >/dev/null`,
20483
+ " snipara_companion_guard() {",
20484
+ ` snipara_companion_hook collaboration guard --profile ${profile} --action ${profile} --resource SURFACE:checkout-git-write --enforce "$@" --json >/dev/null`,
20485
+ " }",
20486
+ ' if [ "${SNIPARA_COLLABORATION_GUARD_ACK_REVIEW_ONLY:-0}" = "1" ]; then',
20487
+ " snipara_companion_guard --ack-review-only",
20488
+ " snipara_guard_status=$?",
20489
+ ' if [ "$snipara_guard_status" -eq 0 ]; then',
20490
+ " snipara_companion_guard",
20491
+ " snipara_guard_status=$?",
20492
+ " fi",
20493
+ ' if [ "$snipara_guard_status" -ne 0 ]; then',
20494
+ ' exit "$snipara_guard_status"',
20495
+ " fi",
20496
+ " else",
20497
+ " snipara_companion_guard",
20498
+ " fi",
20473
20499
  "fi",
20474
20500
  collaborationHookBlockMarker(hookName, "end")
20475
20501
  ].join("\n");
@@ -32606,6 +32632,7 @@ async function queryCommand(options) {
32606
32632
  const result = await client.queryContext(options.query, options.maxTokens || 8e3, {
32607
32633
  searchMode,
32608
32634
  includeAnswerPack: options.includeAnswerPack,
32635
+ minimumChangeMode: options.minimumChangeMode,
32609
32636
  autoDecompose: options.autoDecompose,
32610
32637
  includeSharedContext: options.includeSharedContext
32611
32638
  });
@@ -43943,7 +43970,7 @@ program.command("memory-guard").description(
43943
43970
  );
43944
43971
  program.command("query").description(
43945
43972
  "Search project documents, parsed files, and current truth through hosted Snipara context"
43946
- ).requiredOption("-q, --query <query>", "Search query").option("-m, --max-tokens <number>", "Maximum tokens", "8000").option("--search-mode <mode>", "Search mode: keyword|semantic|hybrid", "hybrid").option("--timeout-ms <number>", "Hosted context query timeout in milliseconds", "30000").option("--no-answer-pack", "Skip Answer Pack generation").option("--no-auto-decompose", "Disable automatic query decomposition").option("--no-shared-context", "Exclude linked shared context").option(
43973
+ ).requiredOption("-q, --query <query>", "Search query").option("-m, --max-tokens <number>", "Maximum tokens", "8000").option("--search-mode <mode>", "Search mode: keyword|semantic|hybrid", "hybrid").option("--timeout-ms <number>", "Hosted context query timeout in milliseconds", "30000").option("--no-answer-pack", "Skip Answer Pack generation").option("--minimum-change-mode <mode>", "off|review (opt-in non-blocking review)", "off").option("--no-auto-decompose", "Disable automatic query decomposition").option("--no-shared-context", "Exclude linked shared context").option(
43947
43974
  "--follow-recommendation",
43948
43975
  "Automatically execute the recommended structural tool when Snipara returns one"
43949
43976
  ).option("--json", "Print raw JSON").action(async (options) => {
@@ -43953,6 +43980,7 @@ program.command("query").description(
43953
43980
  searchMode: options.searchMode,
43954
43981
  timeoutMs: parseInt(options.timeoutMs, 10),
43955
43982
  includeAnswerPack: options.answerPack !== false,
43983
+ minimumChangeMode: resolveMinimumChangeMode(options.minimumChangeMode),
43956
43984
  autoDecompose: options.autoDecompose !== false,
43957
43985
  includeSharedContext: options.sharedContext !== false,
43958
43986
  followRecommendation: Boolean(options.followRecommendation),
@@ -45264,7 +45292,7 @@ collaboration.command("ide-status").description("Print compact JSON status for I
45264
45292
  json: options.json
45265
45293
  });
45266
45294
  });
45267
- program.command("impact").description("Run bounded code impact with automatic local, hosted, or hybrid source selection").argument("[filePath]", "Source file to analyze").option("-q, --qualified-name <qualifiedName>", "Qualified symbol name").option("--symbol-key <symbolKey>", "Stable graph symbol key").option("-f, --file-path <filePath>", "Source file to analyze").option("--changed-files <changedFiles...>", "Changed files to analyze").option("--diff-summary <diffSummary>", "Natural-language summary of the change").option("-d, --depth <number>", "Transitive traversal depth", "3").option("--transitive", "Enable transitive traversal (enabled by default)").option("--direction <direction>", "in|out|both", "both").option("-e, --edge-kinds <edgeKinds...>", "Edge kinds to traverse").option("--max-nodes <number>", "Maximum graph nodes to visit", "500").option("-l, --limit <number>", "Maximum impact entries", "50").option("--source <source>", "auto|local|hosted|hybrid", "auto").option("--fallback-hosted", "Augment the local result with hosted graph context").option("--cached", "When local is selected, use the cached overlay if present").option("--max-files <number>", "Maximum supported code files for local overlay", "2000").option("--json", "Print raw JSON").action(async (filePath, options) => {
45295
+ program.command("impact").description("Run bounded code impact with automatic local, hosted, or hybrid source selection").argument("[filePath]", "Source file to analyze").option("-q, --qualified-name <qualifiedName>", "Qualified symbol name").option("--symbol-key <symbolKey>", "Stable graph symbol key").option("-f, --file-path <filePath>", "Source file to analyze").option("--changed-files <changedFiles...>", "Changed files to analyze").option("--diff-summary <diffSummary>", "Natural-language summary of the change").option("-d, --depth <number>", "Transitive traversal depth", "3").option("--transitive", "Enable transitive traversal (enabled by default)").option("--direction <direction>", "in|out|both", "both").option("-e, --edge-kinds <edgeKinds...>", "Edge kinds to traverse").option("--max-nodes <number>", "Maximum graph nodes to visit", "500").option("-l, --limit <number>", "Maximum impact entries", "50").option("--source <source>", "auto|local|hosted|hybrid", "auto").option("--minimum-change-mode <mode>", "off|review (opt-in non-blocking review)", "off").option("--fallback-hosted", "Augment the local result with hosted graph context").option("--cached", "When local is selected, use the cached overlay if present").option("--max-files <number>", "Maximum supported code files for local overlay", "2000").option("--json", "Print raw JSON").action(async (filePath, options) => {
45268
45296
  await codeGraphAutoSourceCommand("impact", {
45269
45297
  qualifiedName: options.qualifiedName,
45270
45298
  symbolKey: options.symbolKey,
@@ -45278,6 +45306,7 @@ program.command("impact").description("Run bounded code impact with automatic lo
45278
45306
  maxNodes: parseInt(options.maxNodes, 10),
45279
45307
  limit: parseInt(options.limit, 10),
45280
45308
  source: options.source,
45309
+ minimumChangeMode: resolveMinimumChangeMode(options.minimumChangeMode),
45281
45310
  fallbackHosted: Boolean(options.fallbackHosted),
45282
45311
  cached: Boolean(options.cached),
45283
45312
  maxFiles: parseInt(options.maxFiles, 10),
@@ -45529,7 +45558,7 @@ code.addCommand(
45529
45558
  });
45530
45559
  })
45531
45560
  ).addCommand(
45532
- new import_commander.Command("impact").description("Run the primary agent-ready code impact gate with automatic source selection").argument("[filePath]", "Source file to analyze").option("-q, --qualified-name <qualifiedName>", "Qualified symbol name").option("--symbol-key <symbolKey>", "Stable graph symbol key").option("-f, --file-path <filePath>", "Source file to analyze").option("--changed-files <changedFiles...>", "Changed files to analyze").option("--diff-summary <diffSummary>", "Natural-language summary of the change").option("-d, --depth <number>", "Transitive traversal depth", "3").option("--transitive", "Enable transitive traversal (enabled by default)").option("--direction <direction>", "in|out|both", "both").option("-e, --edge-kinds <edgeKinds...>", "Edge kinds to traverse").option("--max-nodes <number>", "Maximum graph nodes to visit", "500").option("-l, --limit <number>", "Maximum impact entries", "50").option("--source <source>", "auto|local|hosted|hybrid", "auto").option("--fallback-hosted", "Augment the local result with hosted graph context").option("--cached", "When local is selected, use the cached overlay if present").option("--max-files <number>", "Maximum supported code files for local overlay", "2000").option("--json", "Print raw JSON").action(async (filePath, options) => {
45561
+ new import_commander.Command("impact").description("Run the primary agent-ready code impact gate with automatic source selection").argument("[filePath]", "Source file to analyze").option("-q, --qualified-name <qualifiedName>", "Qualified symbol name").option("--symbol-key <symbolKey>", "Stable graph symbol key").option("-f, --file-path <filePath>", "Source file to analyze").option("--changed-files <changedFiles...>", "Changed files to analyze").option("--diff-summary <diffSummary>", "Natural-language summary of the change").option("-d, --depth <number>", "Transitive traversal depth", "3").option("--transitive", "Enable transitive traversal (enabled by default)").option("--direction <direction>", "in|out|both", "both").option("-e, --edge-kinds <edgeKinds...>", "Edge kinds to traverse").option("--max-nodes <number>", "Maximum graph nodes to visit", "500").option("-l, --limit <number>", "Maximum impact entries", "50").option("--source <source>", "auto|local|hosted|hybrid", "auto").option("--minimum-change-mode <mode>", "off|review (opt-in non-blocking review)", "off").option("--fallback-hosted", "Augment the local result with hosted graph context").option("--cached", "When local is selected, use the cached overlay if present").option("--max-files <number>", "Maximum supported code files for local overlay", "2000").option("--json", "Print raw JSON").action(async (filePath, options) => {
45533
45562
  await codeGraphAutoSourceCommand("impact", {
45534
45563
  qualifiedName: options.qualifiedName,
45535
45564
  symbolKey: options.symbolKey,
@@ -45543,6 +45572,7 @@ code.addCommand(
45543
45572
  maxNodes: parseInt(options.maxNodes, 10),
45544
45573
  limit: parseInt(options.limit, 10),
45545
45574
  source: options.source,
45575
+ minimumChangeMode: resolveMinimumChangeMode(options.minimumChangeMode),
45546
45576
  fallbackHosted: Boolean(options.fallbackHosted),
45547
45577
  cached: Boolean(options.cached),
45548
45578
  maxFiles: parseInt(options.maxFiles, 10),
@@ -46093,6 +46123,7 @@ if (require.main === module) {
46093
46123
  resolveFeatureArtifactPaths,
46094
46124
  resolveFullWorkflowTokenBudget,
46095
46125
  resolveLocalWorkerRoutingDefaults,
46126
+ resolveMinimumChangeMode,
46096
46127
  resolveQueryFromToolInput,
46097
46128
  retrieveContextPack,
46098
46129
  runMemoryGuardCheck,
@@ -1117,8 +1117,30 @@ durable memory policy locally.
1117
1117
  These commands keep local workflow state moving and call hosted Snipara only
1118
1118
  where the specific command needs hosted context or memory:
1119
1119
 
1120
+ #### Canonical command forms
1121
+
1122
+ `workflow run --mode` accepts exactly these values:
1123
+
1124
+ | CLI value | Guide label | Runtime behavior |
1125
+ | ------------- | ------------------- | --------------------------------------------------------------------- |
1126
+ | `lite` | LITE | Small, known-scope work with no mandatory hosted context call |
1127
+ | `standard` | STANDARD | Normal work with context and code-graph follow-up when needed |
1128
+ | `auto` | AUTO | Routes by task intent to `lite`, `standard`, `full`, or `orchestrate` |
1129
+ | `full` | FULL | Managed, phased work with durable context and plan support |
1130
+ | `orchestrate` | FULL + ORCHESTRATED | Explicit deeper orchestration for multi-agent or proof-gate work |
1131
+
1132
+ The root `run` command is the Project Intelligence judgment/release flow.
1133
+ `workflow run` is the workflow-mode runner; they are different commands.
1134
+ Use root `final-commit` as the canonical final closeout. The registered
1135
+ `workflow final-commit` spelling is a compatibility alias. Similarly,
1136
+ `code impact` is the canonical impact gate, root `impact` is its compatibility
1137
+ alias, and `code local impact` is the separate repository-local overlay query.
1138
+ `task-commit` captures a durable task outcome; `workflow phase-commit`
1139
+ records one managed phase and advances the workflow.
1140
+
1120
1141
  ```bash
1121
1142
  npx -y snipara-companion@latest workflow run --mode standard --query "who imports src.mcp_transport"
1143
+ npx -y snipara-companion@latest workflow run --mode auto --query "map the next bounded change"
1122
1144
  npx -y snipara-companion@latest workflow run --mode full --include-session-context --query "plan the auth refactor"
1123
1145
  npx -y snipara-companion@latest plan --query "plan the auth refactor" --write-plan-file .snipara/workflow/plans/auth-refactor-plan.json
1124
1146
  npx -y snipara-companion@latest task-commit --summary "Shipped auth refactor" --files apps/web/src/lib/auth.ts
@@ -1152,6 +1174,7 @@ snipara-companion workflow producer-review --artifact producer-abc123 --outcome
1152
1174
  snipara-companion final-commit --summary "Shipped auth hardening and tests" --why "Close the reported session replay gap" --evidence "passed:pnpm test auth" --next-step "Review the first 24 hours of telemetry" --files src/auth.ts tests/auth.test.ts
1153
1175
  snipara-companion doctor
1154
1176
  snipara-companion doctor --json
1177
+ snipara-companion collaboration guard --profile pre-deploy --enforce
1155
1178
  snipara-companion code callers --qualified-name src.mcp_transport.handle_call_tool
1156
1179
  snipara-companion code imports --file-path src/mcp_transport.py
1157
1180
  snipara-companion code neighbors --qualified-name src.mcp_transport.handle_call_tool --depth 3
@@ -1675,8 +1698,8 @@ Semantics:
1675
1698
  - `snipara-companion team-sync what-changed` = prints the local state summary and the hosted What Changed For Me response when configured
1676
1699
  - `snipara-companion team-sync sweep` = archives stale local work items after an inactivity threshold; default is 14 days and `--dry-run` previews candidates, actual archive count, and remaining stale work
1677
1700
  - `snipara-companion team-sync resume` = reloads local carryover plus the hosted latest handoff and checkpoint-aware resume guidance when available
1678
- - `snipara-companion final-commit` / `workflow final-commit` = final hosted handoff plus a redacted seven-section closeout report in human output and `.snipara/workflow/final-report.json`; stored phase outcomes, pending Why Capture candidates, non-persisted items, evidence statuses, risks, and the next step remain visibly distinct
1679
- - `snipara-companion code callers/imports/neighbors/shortest-path/impact` = primary code graph surface for agents with shell access. These commands use `--source auto` by default; clean configured checkouts use hosted MCP, dirty/ahead worktrees use a hosted-base plus local-delta hybrid, and unconfigured projects stay local. Every response reports `sourceSelection` and provenance.
1701
+ - `snipara-companion final-commit` (canonical) / `workflow final-commit` (compatibility alias) = final hosted handoff plus a redacted seven-section closeout report in human output and `.snipara/workflow/final-report.json`; stored phase outcomes, pending Why Capture candidates, non-persisted items, evidence statuses, risks, and the next step remain visibly distinct
1702
+ - `snipara-companion code callers/imports/neighbors/shortest-path/impact` = primary code graph surface for agents with shell access. These commands use `--source auto` by default; clean configured checkouts use hosted MCP, dirty/ahead worktrees use a hosted-base plus local-delta hybrid, and unconfigured projects stay local. Every response reports `sourceSelection` and provenance. The canonical impact spelling is `code impact`; root `impact` remains an alias.
1680
1703
  - `snipara-companion code symbol-card` = direct `snipara_code_symbol_card` for an important symbol before editing, with an agent guidance summary before raw JSON
1681
1704
  - `snipara-companion code impact --source hosted|local|hybrid` = optional source override. `--fallback-hosted` augments a local query when hosted auth is available; failures remain explicit degraded-local results.
1682
1705
  - `snipara-companion code local impact` = explicit repository-local bounded transitive impact. TypeScript uses compiler-AST calls/references/imports; Python and Go use import fallback. Use `--depth`, `--direction`, `--edge-kinds`, and `--max-nodes` to control expansion.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "snipara-companion",
3
- "version": "3.6.13",
3
+ "version": "3.6.14",
4
4
  "description": "Local-first CLI that asks your repo what breaks before an AI coding agent edits it.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {