공개 문서

learn/canonical/knot/run-knot.sh.md

아래는 learn/canonical/knot/run-knot.sh.md 와 동일한 원문입니다. Markdown과 HTML 변환 결과를 각각 복사할 수 있습니다.

공개 문서 원문 (Markdown)

# tools/knot/run-knot.sh

> Hub reference copy — MAS 정본: `tools/knot/run-knot.sh`

```bash
#!/usr/bin/env bash
# Run knot workflows (ingest | query | lint | drain | validate) with harness-safe defaults.
set -euo pipefail

ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
# shellcheck source=/dev/null
[[ -f "$ROOT/tools/knot/env.example" ]] && source "$ROOT/tools/knot/env.example"

WIKI_DIR="${KNOT_WIKI:-$ROOT/knot-wiki}"
# claude default: codex exec may block on stdin in non-TTY shells
RUNNER="${KNOT_RUNNER:-claude}"

usage() {
  cat <<'EOF'
Usage: run-knot.sh <command> [args]

Commands:
  ingest          Process oldest inbox item (1 commit per source)
  query <text>    Answer from wiki; optional note save
  lint            Health check + fix mechanical errors
  drain           Batch ingest via ops/scripts/drain.sh
  validate        python3 ops/scripts/lint.py only (no LLM)

Env:
  KNOT_WIKI       wiki path (default: $ROOT/knot-wiki)
  KNOT_RUNNER     codex | claude | agy | gemini (default claude)

Harness note: knot is separate from tasks/ — see docs/KNOT-HARNESS-INTEGRATION.md
EOF
}

knot_schema_ref() {
  if [[ -f "$WIKI_DIR/schema/schema.md" ]]; then echo "schema/schema.md"
  else echo "schema.md"; fi
}

knot_prompts_dir() {
  if [[ -d "$WIKI_DIR/ops/prompts" ]]; then echo "ops/prompts"
  else echo "prompts"; fi
}

knot_scripts_dir() {
  if [[ -d "$WIKI_DIR/ops/scripts" ]]; then echo "ops/scripts"
  else echo "scripts"; fi
}

knot_lint_py() {
  echo "$WIKI_DIR/$(knot_scripts_dir)/lint.py"
}

knot_drain_sh() {
  echo "$WIKI_DIR/$(knot_scripts_dir)/drain.sh"
}

run_prompt() {
  local prompt_file="$1"
  local extra="${2:-}"
  local schema_ref prompts_dir
  schema_ref="$(knot_schema_ref)"
  prompts_dir="$(knot_prompts_dir)"
  local prompt="${schema_ref}와 ${prompts_dir}/${prompt_file}를 정독하고 그대로 실행하라"
  [[ -n "$extra" ]] && prompt="$prompt $extra"
  cd "$WIKI_DIR"
  case "$RUNNER" in
    codex)  codex exec "$prompt" < /dev/null ;;
    claude) claude -p "$prompt" --dangerously-skip-permissions < /dev/null ;;
    agy)
      if [[ -n "${KNOT_MODEL:-}" ]]; then
        agy --model "$KNOT_MODEL" --dangerously-skip-permissions --print-timeout 9m -p "$prompt"
      else
        agy --dangerously-skip-permissions --print-timeout 9m -p "$prompt"
      fi
      ;;
    gemini) gemini -p "$prompt" ;;
    *)      "$RUNNER" -p "$prompt" ;;
  esac
}

[[ $# -ge 1 ]] || { usage; exit 1; }

if [[ ! -d "$WIKI_DIR" ]]; then
  echo "[FAIL] KNOT_WIKI not found: $WIKI_DIR" >&2
  echo "       run: bash tools/knot/install-knot-wiki.sh" >&2
  exit 1
fi

cmd="$1"
shift

case "$cmd" in
  ingest)
    run_prompt "ingest.md"
    ;;
  query)
    [[ $# -ge 1 ]] || { echo "usage: run-knot.sh query \"질문\"" >&2; exit 1; }
    run_prompt "query.md" "$*"
    ;;
  lint)
    run_prompt "lint.md"
    ;;
  drain)
    export KNOT_WIKI="$WIKI_DIR"
    export KNOT_RUNNER="$RUNNER"
    exec bash "$(knot_drain_sh)" "$@"
    ;;
  validate)
    python3 "$(knot_lint_py)" "$WIKI_DIR"
    ;;
  -h|--help|help)
    usage
    ;;
  *)
    echo "Unknown command: $cmd" >&2
    usage
    exit 1
    ;;
esac
```

공개 문서 변환 코드 (HTML)

<h1>tools/knot/run-knot.sh</h1>
<blockquote>
<p>Hub reference copy — MAS 정본: <code>tools/knot/run-knot.sh</code></p>
</blockquote>
<pre><code class="language-bash">#!/usr/bin/env bash
# Run knot workflows (ingest | query | lint | drain | validate) with harness-safe defaults.
set -euo pipefail

ROOT=&quot;$(cd &quot;$(dirname &quot;$0&quot;)/../..&quot; &amp;&amp; pwd)&quot;
# shellcheck source=/dev/null
[[ -f &quot;$ROOT/tools/knot/env.example&quot; ]] &amp;&amp; source &quot;$ROOT/tools/knot/env.example&quot;

WIKI_DIR=&quot;${KNOT_WIKI:-$ROOT/knot-wiki}&quot;
# claude default: codex exec may block on stdin in non-TTY shells
RUNNER=&quot;${KNOT_RUNNER:-claude}&quot;

usage() {
  cat &lt;&lt;&#39;EOF&#39;
Usage: run-knot.sh &lt;command&gt; [args]

Commands:
  ingest          Process oldest inbox item (1 commit per source)
  query &lt;text&gt;    Answer from wiki; optional note save
  lint            Health check + fix mechanical errors
  drain           Batch ingest via ops/scripts/drain.sh
  validate        python3 ops/scripts/lint.py only (no LLM)

Env:
  KNOT_WIKI       wiki path (default: $ROOT/knot-wiki)
  KNOT_RUNNER     codex | claude | agy | gemini (default claude)

Harness note: knot is separate from tasks/ — see docs/KNOT-HARNESS-INTEGRATION.md
EOF
}

knot_schema_ref() {
  if [[ -f &quot;$WIKI_DIR/schema/schema.md&quot; ]]; then echo &quot;schema/schema.md&quot;
  else echo &quot;schema.md&quot;; fi
}

knot_prompts_dir() {
  if [[ -d &quot;$WIKI_DIR/ops/prompts&quot; ]]; then echo &quot;ops/prompts&quot;
  else echo &quot;prompts&quot;; fi
}

knot_scripts_dir() {
  if [[ -d &quot;$WIKI_DIR/ops/scripts&quot; ]]; then echo &quot;ops/scripts&quot;
  else echo &quot;scripts&quot;; fi
}

knot_lint_py() {
  echo &quot;$WIKI_DIR/$(knot_scripts_dir)/lint.py&quot;
}

knot_drain_sh() {
  echo &quot;$WIKI_DIR/$(knot_scripts_dir)/drain.sh&quot;
}

run_prompt() {
  local prompt_file=&quot;$1&quot;
  local extra=&quot;${2:-}&quot;
  local schema_ref prompts_dir
  schema_ref=&quot;$(knot_schema_ref)&quot;
  prompts_dir=&quot;$(knot_prompts_dir)&quot;
  local prompt=&quot;${schema_ref}와 ${prompts_dir}/${prompt_file}를 정독하고 그대로 실행하라&quot;
  [[ -n &quot;$extra&quot; ]] &amp;&amp; prompt=&quot;$prompt $extra&quot;
  cd &quot;$WIKI_DIR&quot;
  case &quot;$RUNNER&quot; in
    codex)  codex exec &quot;$prompt&quot; &lt; /dev/null ;;
    claude) claude -p &quot;$prompt&quot; --dangerously-skip-permissions &lt; /dev/null ;;
    agy)
      if [[ -n &quot;${KNOT_MODEL:-}&quot; ]]; then
        agy --model &quot;$KNOT_MODEL&quot; --dangerously-skip-permissions --print-timeout 9m -p &quot;$prompt&quot;
      else
        agy --dangerously-skip-permissions --print-timeout 9m -p &quot;$prompt&quot;
      fi
      ;;
    gemini) gemini -p &quot;$prompt&quot; ;;
    *)      &quot;$RUNNER&quot; -p &quot;$prompt&quot; ;;
  esac
}

[[ $# -ge 1 ]] || { usage; exit 1; }

if [[ ! -d &quot;$WIKI_DIR&quot; ]]; then
  echo &quot;[FAIL] KNOT_WIKI not found: $WIKI_DIR&quot; &gt;&amp;2
  echo &quot;       run: bash tools/knot/install-knot-wiki.sh&quot; &gt;&amp;2
  exit 1
fi

cmd=&quot;$1&quot;
shift

case &quot;$cmd&quot; in
  ingest)
    run_prompt &quot;ingest.md&quot;
    ;;
  query)
    [[ $# -ge 1 ]] || { echo &quot;usage: run-knot.sh query \&quot;질문\&quot;&quot; &gt;&amp;2; exit 1; }
    run_prompt &quot;query.md&quot; &quot;$*&quot;
    ;;
  lint)
    run_prompt &quot;lint.md&quot;
    ;;
  drain)
    export KNOT_WIKI=&quot;$WIKI_DIR&quot;
    export KNOT_RUNNER=&quot;$RUNNER&quot;
    exec bash &quot;$(knot_drain_sh)&quot; &quot;$@&quot;
    ;;
  validate)
    python3 &quot;$(knot_lint_py)&quot; &quot;$WIKI_DIR&quot;
    ;;
  -h|--help|help)
    usage
    ;;
  *)
    echo &quot;Unknown command: $cmd&quot; &gt;&amp;2
    usage
    exit 1
    ;;
esac
</code></pre>