@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.
- package/CHANGELOG.md +23 -0
- package/README.md +6 -5
- package/README_VN.md +7 -6
- package/package.json +1 -1
- package/skills/flow/SKILL.md +14 -6
- package/skills/flow/_templates/02-scope.md +9 -0
- package/skills/flow/_templates/03-prd.md +11 -0
- package/skills/flow/_templates/05-contract.md +8 -0
- package/skills/flow/_templates/card.md +4 -0
- package/skills/flow/eval/fixtures/converge/conv-01/cards/C-001.md +21 -0
- package/skills/flow/eval/fixtures/converge/conv-01/flow/03-prd.md +7 -0
- package/skills/flow/eval/fixtures/converge/conv-01/src/app.py +3 -0
- package/skills/flow/eval/fixtures/converge/gap-01/cards/C-001.md +21 -0
- package/skills/flow/eval/fixtures/converge/gap-01/cards/C-002.md +21 -0
- package/skills/flow/eval/fixtures/converge/gap-01/flow/03-prd.md +8 -0
- package/skills/flow/eval/fixtures/converge/gap-01/flow/05-contract.md +7 -0
- package/skills/flow/eval/fixtures/converge/gap-01/src/app.py +11 -0
- package/skills/flow/eval/fixtures/converge/manifest.tsv +3 -0
- package/skills/flow/eval/fixtures/fcdd/cards/C-001.md +34 -0
- package/skills/flow/eval/fixtures/fcde/cards/C-001.md +46 -0
- package/skills/flow/eval/manifest.tsv +2 -0
- package/skills/flow/law/CLAUDE.md +7 -0
- package/skills/flow/references/artifact-lifecycle.md +58 -0
- package/skills/flow/references/clarify.md +191 -0
- package/skills/flow/references/command-dispatch.md +5 -2
- package/skills/flow/references/concierge.md +2 -0
- package/skills/flow/references/converge.md +109 -0
- package/skills/flow/references/flow-catalog.tsv +2 -0
- package/skills/flow/references/gate-eval.md +51 -9
- package/skills/flow/references/gate-rules.md +35 -0
- package/skills/flow/references/ground-truth-gates.md +7 -0
- package/skills/flow/references/mode-work.md +11 -1
- package/skills/flow/references/stage-state-machine.md +9 -1
- package/skills/flow/runner/attestations.sh +69 -26
- package/skills/flow/runner/flow.sh +597 -28
- 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
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
739
|
-
|
|
740
|
-
|
|
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
|
-
|
|
750
|
-
|
|
751
|
-
|
|
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
|
-
|
|
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"
|