@synkro-sh/cli 1.4.25 → 1.4.27

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/dist/bootstrap.js CHANGED
@@ -516,23 +516,28 @@ synkro_route() {
516
516
  echo "cloud"
517
517
  }
518
518
 
519
- # Grade locally via synkro CLI or claude --print. Reads prompt from stdin.
519
+ # Grade locally via synkro CLI channel. Reads prompt from stdin.
520
520
  synkro_local_grade() {
521
521
  local surface="$1"
522
- if synkro_channel_up && [ -n "\${SYNKRO_CLI_BIN:-}" ] && [ -f "$SYNKRO_CLI_BIN" ] && command -v node >/dev/null 2>&1; then
522
+ if ! synkro_channel_up; then
523
+ echo "SYNKRO_CHANNEL_DOWN" >&2
524
+ return 1
525
+ fi
526
+ if [ -n "\${SYNKRO_CLI_BIN:-}" ] && [ -f "$SYNKRO_CLI_BIN" ] && command -v node >/dev/null 2>&1; then
523
527
  node "$SYNKRO_CLI_BIN" grade "$surface" 2>/dev/null
524
- elif synkro_channel_up && command -v synkro >/dev/null 2>&1; then
528
+ elif command -v synkro >/dev/null 2>&1; then
525
529
  synkro grade "$surface" 2>/dev/null
526
- elif command -v claude >/dev/null 2>&1; then
527
- claude --print --model claude-sonnet-4-6 --no-session-persistence 2>/dev/null
530
+ else
531
+ echo "SYNKRO_CLI_NOT_FOUND" >&2
532
+ return 1
528
533
  fi
529
534
  }
530
535
 
531
536
  # Parse <synkro-verdict>...</synkro-verdict> XML from local grader output.
532
- # Sets LOCAL_OK, LOCAL_REASON, LOCAL_RULE_ID, LOCAL_SEV, LOCAL_CAT.
537
+ # Sets LOCAL_OK, LOCAL_REASON, LOCAL_RULE_ID, LOCAL_RULE_MODE, LOCAL_SEV, LOCAL_CAT.
533
538
  synkro_parse_local_verdict() {
534
539
  local resp="$1"
535
- LOCAL_OK="true"; LOCAL_REASON=""; LOCAL_RULE_ID=""; LOCAL_SEV="low"; LOCAL_CAT="general"
540
+ LOCAL_OK="true"; LOCAL_REASON=""; LOCAL_RULE_ID=""; LOCAL_RULE_MODE=""; LOCAL_SEV="low"; LOCAL_CAT="general"
536
541
  local inner
537
542
  inner=$(printf '%s' "$resp" | tr '\\n' ' ' | sed -nE 's|.*<synkro-verdict>(.*)</synkro-verdict>.*|\\1|p' | tail -1)
538
543
  [ -z "$inner" ] && return
@@ -543,6 +548,7 @@ synkro_parse_local_verdict() {
543
548
  [ -z "$LOCAL_REASON" ] && LOCAL_REASON=$(printf '%s' "$inner" | sed -nE 's|.*<reasoning>(.*)</reasoning>.*|\\1|p' | head -1)
544
549
  if [ "$LOCAL_OK" = "false" ]; then
545
550
  LOCAL_RULE_ID=$(printf '%s' "$inner" | sed -nE 's|.*<rule_id>(.*)</rule_id>.*|\\1|p' | head -1)
551
+ LOCAL_RULE_MODE=$(printf '%s' "$inner" | sed -nE 's|.*<rule_mode>(.*)</rule_mode>.*|\\1|p' | head -1)
546
552
  LOCAL_SEV=$(printf '%s' "$inner" | sed -nE 's|.*<risk_level>(.*)</risk_level>.*|\\1|p' | head -1)
547
553
  LOCAL_CAT=$(printf '%s' "$inner" | sed -nE 's|.*<category>(.*)</category>.*|\\1|p' | head -1)
548
554
  if [ -z "$LOCAL_RULE_ID" ]; then
@@ -580,7 +586,7 @@ synkro_rule_mode() {
580
586
  local rid="$1"
581
587
  [ -z "$rid" ] || [ -z "\${SYNKRO_RULES:-}" ] && echo "blocking" && return
582
588
  local m
583
- m=$(printf '%s' "$SYNKRO_RULES" | jq -r --arg r "$rid" '[.[] | select(.rule_id == $r) | .mode] | .[0] // "blocking"' 2>/dev/null)
589
+ m=$(printf '%s' "$SYNKRO_RULES" | jq -r --arg r "$rid" '[.[] | select(.rule_id == $r) | .mode] | if any(. == "blocking") then "blocking" else .[0] // "blocking" end' 2>/dev/null)
584
590
  [ -z "$m" ] || [ "$m" = "null" ] && m="blocking"
585
591
  echo "$m"
586
592
  }
@@ -687,11 +693,15 @@ if [ "$ROUTE" = "local" ]; then
687
693
  trap "rm -f \\"$GRADER_FILE\\"" EXIT
688
694
  printf 'Command: %s\\nUser intent: %s\\nOrg rules: %s\\n' "$COMMAND" "\${USER_INTENT:-none stated}" "\${SYNKRO_RULES:-[]}" > "$GRADER_FILE"
689
695
 
690
- CC_RESP=$(synkro_local_grade bash < "$GRADER_FILE" || echo "")
696
+ CC_RESP=$(synkro_local_grade bash < "$GRADER_FILE" 2>&1)
697
+ if [ $? -ne 0 ]; then
698
+ jq -n --arg m "[synkro:local] bashGuard \u2192 pass: local grader unavailable (run synkro local-cc start)" '{systemMessage: $m}'
699
+ exit 0
700
+ fi
691
701
  synkro_parse_local_verdict "$CC_RESP"
692
702
 
693
703
  if [ "$LOCAL_OK" = "false" ]; then
694
- RULE_MODE=$(synkro_rule_mode "\${LOCAL_RULE_ID}")
704
+ RULE_MODE="\${LOCAL_RULE_MODE:-$(synkro_rule_mode "\${LOCAL_RULE_ID}")}"
695
705
  if [ "$RULE_MODE" = "audit" ]; then
696
706
  REASON="[synkro:local] bashGuard \u2192 warning\${LOCAL_RULE_ID:+ ($LOCAL_RULE_ID)}: \${LOCAL_REASON:-policy violation}"
697
707
  jq -n --arg m "$REASON" '{systemMessage: $m}'
@@ -709,7 +719,7 @@ if [ "$ROUTE" = "local" ]; then
709
719
  if [ "$IS_HEADLESS" = "1" ]; then DEC="deny"; else DEC="ask"; fi
710
720
  REASON="[synkro:local] bashGuard \u2192 block\${LOCAL_RULE_ID:+ ($LOCAL_RULE_ID)}: \${LOCAL_REASON:-policy violation}"
711
721
  jq -n --arg dec "$DEC" --arg reason "$REASON" --arg ctx "$REASON" \\
712
- '{systemMessage:$reason,hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:$dec,permissionDecisionReason:$reason,additionalContext:$ctx}}'
722
+ '{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:$dec,permissionDecisionReason:$reason,additionalContext:$ctx}}'
713
723
  synkro_capture_local "bash" "block" "\${LOCAL_SEV}" "\${LOCAL_CAT}" "$TOOL_NAME" "$GIT_REPO" "$SESSION_ID"
714
724
  fi
715
725
  fi
@@ -876,11 +886,15 @@ if [ "$ROUTE" = "local" ]; then
876
886
  trap "rm -f \\"$GRADER_FILE\\"" EXIT
877
887
  printf 'File: %s\\nProposed content (first 4000 chars):\\n%s\\nUser intent: %s\\nOrg rules: %s\\n' "$FILE_PATH" "$(printf '%s' "$PROPOSED" | head -c 4000)" "\${USER_INTENT:-none stated}" "\${SYNKRO_RULES:-[]}" > "$GRADER_FILE"
878
888
 
879
- CC_RESP=$(synkro_local_grade edit < "$GRADER_FILE" || echo "")
889
+ CC_RESP=$(synkro_local_grade edit < "$GRADER_FILE" 2>&1)
890
+ if [ $? -ne 0 ]; then
891
+ jq -n --arg m "[synkro:local] editGuard \u2192 pass: local grader unavailable (run synkro local-cc start)" '{systemMessage: $m}'
892
+ exit 0
893
+ fi
880
894
  synkro_parse_local_verdict "$CC_RESP"
881
895
 
882
896
  if [ "$LOCAL_OK" = "false" ]; then
883
- RULE_MODE=$(synkro_rule_mode "\${LOCAL_RULE_ID}")
897
+ RULE_MODE="\${LOCAL_RULE_MODE:-$(synkro_rule_mode "\${LOCAL_RULE_ID}")}"
884
898
  if [ "$RULE_MODE" = "audit" ]; then
885
899
  REASON="[synkro:local] editGuard $FILE_SHORT \u2192 warning\${LOCAL_RULE_ID:+ ($LOCAL_RULE_ID)}: \${LOCAL_REASON:-policy violation}"
886
900
  jq -n --arg m "$REASON" '{systemMessage: $m}'
@@ -1025,11 +1039,14 @@ if [ "$ROUTE" = "local" ]; then
1025
1039
  trap "rm -f \\"$GRADER_FILE\\"" EXIT
1026
1040
  printf 'File: %s\\nContent (first 4000 chars):\\n%s\\nOrg rules: %s\\n' "$FILE_PATH" "$(printf '%s' "$FILE_CONTENT" | head -c 4000)" "\${SYNKRO_RULES:-[]}" > "$GRADER_FILE"
1027
1041
 
1028
- CC_RESP=$(synkro_local_grade edit < "$GRADER_FILE" || echo "")
1042
+ CC_RESP=$(synkro_local_grade edit < "$GRADER_FILE" 2>&1)
1043
+ if [ $? -ne 0 ]; then
1044
+ echo '{}'; exit 0
1045
+ fi
1029
1046
  synkro_parse_local_verdict "$CC_RESP"
1030
1047
 
1031
1048
  if [ "$LOCAL_OK" = "false" ]; then
1032
- RULE_MODE=$(synkro_rule_mode "\${LOCAL_RULE_ID}")
1049
+ RULE_MODE="\${LOCAL_RULE_MODE:-$(synkro_rule_mode "\${LOCAL_RULE_ID}")}"
1033
1050
  if [ "$RULE_MODE" = "audit" ]; then
1034
1051
  REASON="[synkro:local] editScan $BASENAME \u2192 warning\${LOCAL_RULE_ID:+ ($LOCAL_RULE_ID)}: \${LOCAL_REASON:-policy violation}"
1035
1052
  jq -n --arg m "$REASON" '{systemMessage: $m}'
@@ -3669,7 +3686,7 @@ function writeConfigEnv(opts) {
3669
3686
  `SYNKRO_CREDENTIALS_PATH=${shellQuoteSingle(credsPath)}`,
3670
3687
  `SYNKRO_TIER=${shellQuoteSingle(safeTier)}`,
3671
3688
  `SYNKRO_INFERENCE=${shellQuoteSingle(safeInference)}`,
3672
- `SYNKRO_VERSION=${shellQuoteSingle("1.4.25")}`
3689
+ `SYNKRO_VERSION=${shellQuoteSingle("1.4.27")}`
3673
3690
  ];
3674
3691
  if (safeSynkroBin) lines.push(`SYNKRO_CLI_BIN=${shellQuoteSingle(safeSynkroBin)}`);
3675
3692
  if (safeUserId) lines.push(`SYNKRO_USER_ID=${shellQuoteSingle(safeUserId)}`);