@manhquy/flow-skill 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +6 -5
  3. package/README_VN.md +7 -6
  4. package/package.json +1 -1
  5. package/skills/flow/SKILL.md +14 -6
  6. package/skills/flow/_templates/02-scope.md +9 -0
  7. package/skills/flow/_templates/03-prd.md +11 -0
  8. package/skills/flow/_templates/05-contract.md +8 -0
  9. package/skills/flow/_templates/card.md +4 -0
  10. package/skills/flow/eval/fixtures/converge/conv-01/cards/C-001.md +21 -0
  11. package/skills/flow/eval/fixtures/converge/conv-01/flow/03-prd.md +7 -0
  12. package/skills/flow/eval/fixtures/converge/conv-01/src/app.py +3 -0
  13. package/skills/flow/eval/fixtures/converge/gap-01/cards/C-001.md +21 -0
  14. package/skills/flow/eval/fixtures/converge/gap-01/cards/C-002.md +21 -0
  15. package/skills/flow/eval/fixtures/converge/gap-01/flow/03-prd.md +8 -0
  16. package/skills/flow/eval/fixtures/converge/gap-01/flow/05-contract.md +7 -0
  17. package/skills/flow/eval/fixtures/converge/gap-01/src/app.py +11 -0
  18. package/skills/flow/eval/fixtures/converge/manifest.tsv +3 -0
  19. package/skills/flow/eval/fixtures/fcdd/cards/C-001.md +34 -0
  20. package/skills/flow/eval/fixtures/fcde/cards/C-001.md +46 -0
  21. package/skills/flow/eval/manifest.tsv +2 -0
  22. package/skills/flow/law/CLAUDE.md +7 -0
  23. package/skills/flow/references/artifact-lifecycle.md +58 -0
  24. package/skills/flow/references/clarify.md +191 -0
  25. package/skills/flow/references/command-dispatch.md +5 -2
  26. package/skills/flow/references/concierge.md +2 -0
  27. package/skills/flow/references/converge.md +109 -0
  28. package/skills/flow/references/flow-catalog.tsv +2 -0
  29. package/skills/flow/references/gate-eval.md +51 -9
  30. package/skills/flow/references/gate-rules.md +35 -0
  31. package/skills/flow/references/ground-truth-gates.md +7 -0
  32. package/skills/flow/references/mode-work.md +11 -1
  33. package/skills/flow/references/stage-state-machine.md +9 -1
  34. package/skills/flow/runner/attestations.sh +69 -26
  35. package/skills/flow/runner/flow.sh +597 -28
  36. package/skills-manifest.json +16 -2
@@ -534,17 +534,20 @@ _att_card_semantic_fingerprint() { # $1 card file $2 base $3 head -> prints fp;
534
534
  head="$(_att_full_commit "$head")" || return 1
535
535
  tree="$(git -C "$ROOT" rev-parse "${head}^{tree}" 2>/dev/null | tr -d '\r\n')" || return 1
536
536
  proj="$(_att_card_contract_projection "$file")"
537
- # changed paths base..head excluding card path
538
- path_manifest="$(git -C "$ROOT" diff-tree -r --no-commit-id --name-status "$base" "$head" 2>/dev/null \
539
- | awk -v card="cards/${id}.md" '$2 != card && $3 != card {print}' \
540
- | while read -r st p rest; do
541
- case "$st" in
542
- R*|C*) p="$rest" ;;
543
- esac
544
- [ -z "$p" ] && continue
545
- mode_oid="$(git -C "$ROOT" ls-tree "$head" -- "$p" 2>/dev/null | awk '{print $1" "$3}')"
546
- printf '%s %s\n' "$p" "$mode_oid"
547
- done | sort)"
537
+ # changed paths base..head excluding card path.
538
+ # Bash 3.2 + set -u: avoid `read st p rest` (unbound rest) and case R*|C* inside
539
+ # command substitution (macOS /bin/bash syntax error). Use name-only only.
540
+ path_manifest="$(
541
+ git -C "$ROOT" diff-tree -r --name-only "$base" "$head" 2>/dev/null \
542
+ | while IFS= read -r p || [ -n "$p" ]; do
543
+ p="$(printf '%s' "$p" | tr -d '\r')"
544
+ [ -z "$p" ] && continue
545
+ [ "$p" = "cards/${id}.md" ] && continue
546
+ mode_oid="$(git -C "$ROOT" ls-tree "$head" -- "$p" 2>/dev/null | awk '{print $1" "$3}')"
547
+ [ -n "$mode_oid" ] || continue
548
+ printf '%s %s\n' "$p" "$mode_oid"
549
+ done | sort
550
+ )"
548
551
  body="base=${base}"$'\n'"head=${head}"$'\n'"tree=${tree}"$'\n'"proj<<"$'\n'"${proj}"$'\n'">>"$'\n'"paths<<"$'\n'"${path_manifest}"$'\n'">>"$'\n'
549
552
  fmt="$(_att_object_format)"
550
553
  oid="$(printf '%s' "$body" | git -C "$ROOT" hash-object --stdin 2>/dev/null | tr -d '\r\n')"
@@ -680,49 +683,73 @@ revision_oracle_fingerprint: ${_ATT_W_revision_oracle_fingerprint}
680
683
  }
681
684
 
682
685
  # ---------- process supervisor ----------
686
+ # Prefer setsid (Linux). macOS often lacks setsid: fall back to best-effort kill of
687
+ # the launched PID (not a full session). Live-auto residual is documented for that case.
688
+ _att_has_setsid() { command -v setsid >/dev/null 2>&1; }
689
+
683
690
  _att_supervisor_capable() {
684
691
  if [ "${FLOW_ATTEST_SUPERVISOR:-}" = "force-unsupported" ]; then return 1; fi
685
692
  if [ "${FLOW_ATTEST_SUPERVISOR:-}" = "force-ok" ]; then return 0; fi
686
- command -v setsid >/dev/null 2>&1 || return 1
687
693
  if [ "${_ATT_SUP_CAP_CACHED:-}" = "1" ]; then
688
694
  [ "${_ATT_SUP_CAP_OK:-0}" = "1" ]; return $?
689
695
  fi
690
- _ATT_SUP_CAP_CACHED=1; _ATT_SUP_CAP_OK=0
696
+ _ATT_SUP_CAP_CACHED=1
697
+ _ATT_SUP_CAP_OK=0
691
698
  local outf pid pgid
692
699
  outf="$(mktemp 2>/dev/null || echo "${TMPDIR:-/tmp}/.att-cap.$$")"
693
700
  : > "$outf"
694
- ( cd "${ROOT:-/tmp}" || exit 127; exec setsid sleep 30 ) >"$outf" 2>&1 &
701
+ if _att_has_setsid; then
702
+ ( cd "${ROOT:-/tmp}" || exit 127; exec setsid sleep 30 ) >"$outf" 2>&1 &
703
+ else
704
+ ( cd "${ROOT:-/tmp}" || exit 127; exec sleep 30 ) >"$outf" 2>&1 &
705
+ fi
695
706
  pid=$!
696
707
  sleep 0.15 2>/dev/null || true
697
708
  pgid="$(ps -o pgid= -p "$pid" 2>/dev/null | tr -d ' ')"
698
709
  [ -n "$pgid" ] || pgid="$pid"
699
- kill -TERM -"$pgid" 2>/dev/null || kill -TERM "$pid" 2>/dev/null || true
710
+ if _att_has_setsid; then
711
+ kill -TERM -"$pgid" 2>/dev/null || kill -TERM "$pid" 2>/dev/null || true
712
+ else
713
+ kill -TERM "$pid" 2>/dev/null || true
714
+ fi
700
715
  sleep 0.25 2>/dev/null || true
701
716
  if kill -0 "$pid" 2>/dev/null; then
702
- kill -KILL -"$pgid" 2>/dev/null || kill -KILL "$pid" 2>/dev/null || true
717
+ if _att_has_setsid; then
718
+ kill -KILL -"$pgid" 2>/dev/null || kill -KILL "$pid" 2>/dev/null || true
719
+ else
720
+ kill -KILL "$pid" 2>/dev/null || true
721
+ fi
703
722
  sleep 0.1 2>/dev/null || true
704
723
  fi
705
724
  wait "$pid" 2>/dev/null || true
706
725
  rm -f "$outf" 2>/dev/null || true
707
- kill -0 "$pid" 2>/dev/null && return 1
726
+ if kill -0 "$pid" 2>/dev/null; then
727
+ return 1
728
+ fi
708
729
  _ATT_SUP_CAP_OK=1
709
730
  return 0
710
731
  }
732
+
711
733
  _att_run_supervised() {
712
734
  local timeout_s="${FLOW_ATTEST_TIMEOUT_S:-30}" cap="${FLOW_ATTEST_OUT_CAP:-65536}"
713
735
  local comb="${FLOW_ATTEST_COMBINED_CAP:-98304}" grace_s="${FLOW_ATTEST_GRACE_S:-2}"
714
- local outf errf start end rc=0 pid="" pgid="" i
736
+ local outf errf start end rc=0 pid="" pgid="" i use_setsid=0
715
737
  _ATT_RUN_RC="spawn-error"; _ATT_RUN_CODE=127; _ATT_RUN_OUT=""; _ATT_RUN_MS=0
716
738
  if ! _att_supervisor_capable; then _ATT_RUN_RC="spawn-error"; return 1; fi
717
739
  case "$timeout_s" in ''|*[!0-9]*|0) timeout_s=30 ;; esac
718
740
  case "$cap" in ''|*[!0-9]*|0) cap=65536 ;; esac
719
741
  case "$comb" in ''|*[!0-9]*|0) comb=98304 ;; esac
720
742
  case "$grace_s" in ''|*[!0-9]*) grace_s=2 ;; esac
743
+ _att_has_setsid && use_setsid=1
721
744
  outf="$(mktemp 2>/dev/null || echo "${TMPDIR:-/tmp}/.att-out.$$")"
722
745
  errf="$(mktemp 2>/dev/null || echo "${TMPDIR:-/tmp}/.att-err.$$")"
723
746
  : > "$outf"; : > "$errf"
724
747
  start="$(_att_now_s)"
725
- ( cd "$ROOT" || exit 127; exec setsid "$@" ) >"$outf" 2>"$errf" &
748
+ if [ "$use_setsid" -eq 1 ]; then
749
+ ( cd "$ROOT" || exit 127; exec setsid "$@" ) >"$outf" 2>"$errf" &
750
+ else
751
+ ( cd "$ROOT" || exit 127; exec "$@" ) >"$outf" 2>"$errf" &
752
+ fi
726
753
  pid=$!
727
754
  i=0
728
755
  while [ "$i" -lt 20 ]; do
@@ -735,9 +762,15 @@ _att_run_supervised() {
735
762
  [ -n "$pgid" ] || pgid="$pid"
736
763
  ( sleep "$timeout_s" 2>/dev/null
737
764
  if kill -0 "$pid" 2>/dev/null; then
738
- kill -TERM -"$pgid" 2>/dev/null || kill -TERM "$pid" 2>/dev/null || true
739
- sleep "$grace_s" 2>/dev/null
740
- kill -KILL -"$pgid" 2>/dev/null || kill -KILL "$pid" 2>/dev/null || true
765
+ if [ "$use_setsid" -eq 1 ]; then
766
+ kill -TERM -"$pgid" 2>/dev/null || kill -TERM "$pid" 2>/dev/null || true
767
+ sleep "$grace_s" 2>/dev/null
768
+ kill -KILL -"$pgid" 2>/dev/null || kill -KILL "$pid" 2>/dev/null || true
769
+ else
770
+ kill -TERM "$pid" 2>/dev/null || true
771
+ sleep "$grace_s" 2>/dev/null
772
+ kill -KILL "$pid" 2>/dev/null || true
773
+ fi
741
774
  echo timeout > "${outf}.to"
742
775
  fi ) &
743
776
  local wd=$!
@@ -746,9 +779,15 @@ _att_run_supervised() {
746
779
  os="$(wc -c < "$outf" 2>/dev/null | tr -d ' ')"
747
780
  es="$(wc -c < "$errf" 2>/dev/null | tr -d ' ')"
748
781
  if [ "${os:-0}" -gt "$cap" ] || [ "${es:-0}" -gt "$cap" ] || [ $(( ${os:-0} + ${es:-0} )) -gt "$comb" ]; then
749
- kill -TERM -"$pgid" 2>/dev/null || kill -TERM "$pid" 2>/dev/null || true
750
- sleep 1
751
- kill -KILL -"$pgid" 2>/dev/null || kill -KILL "$pid" 2>/dev/null || true
782
+ if [ "$use_setsid" -eq 1 ]; then
783
+ kill -TERM -"$pgid" 2>/dev/null || kill -TERM "$pid" 2>/dev/null || true
784
+ sleep 1
785
+ kill -KILL -"$pgid" 2>/dev/null || kill -KILL "$pid" 2>/dev/null || true
786
+ else
787
+ kill -TERM "$pid" 2>/dev/null || true
788
+ sleep 1
789
+ kill -KILL "$pid" 2>/dev/null || true
790
+ fi
752
791
  echo cap > "${outf}.cap"; break
753
792
  fi
754
793
  sleep 0.1 2>/dev/null || sleep 1
@@ -757,7 +796,11 @@ _att_run_supervised() {
757
796
  wait "$pid" 2>/dev/null; rc=$?
758
797
  kill "$wd" 2>/dev/null; wait "$wd" 2>/dev/null
759
798
  kill "$capw" 2>/dev/null; wait "$capw" 2>/dev/null
760
- kill -KILL -"$pgid" 2>/dev/null || true
799
+ if [ "$use_setsid" -eq 1 ]; then
800
+ kill -KILL -"$pgid" 2>/dev/null || true
801
+ else
802
+ kill -KILL "$pid" 2>/dev/null || true
803
+ fi
761
804
  end="$(_att_now_s)"
762
805
  _ATT_RUN_MS=$(( (end - start) * 1000 )); [ "$_ATT_RUN_MS" -lt 0 ] && _ATT_RUN_MS=0
763
806
  if [ -f "${outf}.cap" ]; then _ATT_RUN_RC="output-cap"; _ATT_RUN_CODE=1; rm -f "${outf}.cap"