#!/bin/bash
set -euo pipefail
usage() {
cat <<USAGE >&2
Usage: $0 --project <name> --task <description>
[--issues-source <path>] [--out -|<path>]
Required:
--project <name> project 名 (basename of toplevel)
--task <description> 現タスクの説明 (semantic search query 相当)
Optional:
--issues-source <path> mem search 結果を保持する JSON ファイル
(省略時は items=[]、すなわち過去 issue なし)
--out -|<path> 出力先 (- = stdout, default: stdout)
出力: past-issue.v1 schema 準拠の JSON
USAGE
exit 2
}
PROJECT=""
TASK=""
ISSUES_SOURCE=""
OUT="-"
while [[ $# -gt 0 ]]; do
case "$1" in
--project) PROJECT="${2:-}"; shift 2 ;;
--task) TASK="${2:-}"; shift 2 ;;
--issues-source) ISSUES_SOURCE="${2:-}"; shift 2 ;;
--out) OUT="${2:-}"; shift 2 ;;
-h|--help) usage ;;
*) echo "ERROR: unknown argument: $1" >&2; usage ;;
esac
done
if [[ -z "$PROJECT" ]]; then
echo "ERROR: --project is required (cross-project search is forbidden in Phase 65.2)" >&2
usage
fi
if [[ -z "$TASK" ]]; then
echo "ERROR: --task is required" >&2
usage
fi
if ! command -v jq >/dev/null 2>&1; then
echo "ERROR: jq is required but not found" >&2
exit 3
fi
TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/accept-past-issues.XXXXXX")"
trap 'rm -rf "$TMP_DIR"' EXIT
NORM_SRC="$TMP_DIR/source.json"
if [[ -n "$ISSUES_SOURCE" ]]; then
if [[ ! -f "$ISSUES_SOURCE" ]]; then
echo "ERROR: --issues-source file not found: $ISSUES_SOURCE" >&2
exit 3
fi
if ! jq -e '.' "$ISSUES_SOURCE" >/dev/null 2>&1; then
echo "ERROR: --issues-source is not valid JSON: $ISSUES_SOURCE" >&2
exit 3
fi
jq '{ items: (.items // []) }' "$ISSUES_SOURCE" > "$NORM_SRC"
else
echo '{"items":[]}' > "$NORM_SRC"
fi
TOP_ITEMS_JSON="$(jq '
[.items[] | {
source: (.source // ""),
pattern_id: (.pattern_id // ""),
title: (.title // ""),
summary: (.summary // ""),
relevance_score: (.relevance_score // 0),
verified_in_current_task: (if has("verified_in_current_task") then .verified_in_current_task else false end)
}]
| sort_by(-.relevance_score)
| .[0:3]
' "$NORM_SRC")"
GENERATED_AT="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
OUT_JSON="$(jq -n \
--arg proj "$PROJECT" \
--arg task "$TASK" \
--arg ts "$GENERATED_AT" \
--argjson items "$TOP_ITEMS_JSON" \
'{
schema: "past-issue.v1",
project: $proj,
task_description: $task,
items: $items,
generated_at: $ts
}')"
if [[ "$OUT" == "-" || -z "$OUT" ]]; then
printf '%s\n' "$OUT_JSON"
else
printf '%s\n' "$OUT_JSON" > "$OUT"
fi