merge: tickets work item thread mvp
This commit is contained in:
commit
4d080ca985
31
TODO.md
31
TODO.md
|
|
@ -1,26 +1,5 @@
|
|||
- Workflow / Skills
|
||||
- 内部 Worker / 内部 Pod の Workflow 化 → [tickets/internal-worker-workflow.md](tickets/internal-worker-workflow.md)
|
||||
- 半自動開発運用 Workflow → [tickets/auto-maintain-workflow.md](tickets/auto-maintain-workflow.md)
|
||||
- tickets.sh による WorkItem / Thread MVP → [tickets/tickets-sh-workitem-thread-mvp.md](tickets/tickets-sh-workitem-thread-mvp.md)
|
||||
- Prompt / Workflow 評価メトリクスと改善 Offer → [tickets/prompt-eval-metrics.md](tickets/prompt-eval-metrics.md)
|
||||
- Permission: allow-all 既定 policy への整理 → [tickets/permission-default-policy.md](tickets/permission-default-policy.md)
|
||||
- Pod: 任意ターンからの Fork(複数ターン巻き戻しを汎用化) → [tickets/pod-session-fork.md](tickets/pod-session-fork.md)
|
||||
- Pod/TUI: 手動 rollback 導線 → [tickets/manual-turn-rollback.md](tickets/manual-turn-rollback.md)
|
||||
- Pod: Inbound PodEvent ハンドリングの重複を統合 → [tickets/pod-inbound-pod-event-dedup.md](tickets/pod-inbound-pod-event-dedup.md)
|
||||
- Pod: scope 永続化 authority の整理 → [tickets/pod-scope-persistence-authority.md](tickets/pod-scope-persistence-authority.md)
|
||||
- SpawnPod 初回 task delivery の受理確認 → [tickets/spawnpod-initial-run-confirmation.md](tickets/spawnpod-initial-run-confirmation.md)
|
||||
- E2E テストハーネス(`tests/e2e/`、opt-in) → [tickets/e2e-harness.md](tickets/e2e-harness.md)
|
||||
- メモリ機構
|
||||
- memory / knowledge tool 利用タイミングのプロンプトガイダンス → [tickets/memory-tool-guidance-prompt.md](tickets/memory-tool-guidance-prompt.md)
|
||||
- TUI 拡充
|
||||
- navigation mode / block focus の設計 → [tickets/tui-navigation-mode-design.md](tickets/tui-navigation-mode-design.md)
|
||||
- spawned child Pod の一覧と一時 attach → [tickets/tui-spawned-pod-panel.md](tickets/tui-spawned-pod-panel.md)
|
||||
- actionbar transient notice API → [tickets/tui-actionbar-transient-notice-api.md](tickets/tui-actionbar-transient-notice-api.md)
|
||||
- tui -r picker で live pending Pod が表示から漏れる → [tickets/tui-picker-live-pending-pods.md](tickets/tui-picker-live-pending-pods.md)
|
||||
- ユーザーマニフェストのモデル設定 wizard → [tickets/tui-user-model-setup.md](tickets/tui-user-model-setup.md)
|
||||
- セッション内 Task ツールの注意機構(無アクティビティで `<system-reminder>` ナッジ) → [tickets/session-todo-reminder.md](tickets/session-todo-reminder.md)
|
||||
- ワークスペースのメモリーをLintするヘッドレスCLI
|
||||
- system-reminder 注入機構の汎用化(2件目の利用者が出た時に検討。タグ形式 `<system-reminder>...</system-reminder>` の規約は session-todo-reminder で先行確立。注入された Item は worker.history に append する方針)
|
||||
- Bashツールがファイル編集に常用されている問題をdesciptionで抑制
|
||||
- 事前定義したManifestをProfile的に扱い、Orchestrator/Coder/Researcherで別々のモデル/設定を使わせる運用ができるようにする
|
||||
- 複数のPodのViewを行き来できるUI
|
||||
# TODO legacy notice
|
||||
|
||||
Active repository work items have been migrated to `work-items/`.
|
||||
|
||||
Use `./tickets.sh list --status all` for the generated/current view and `./tickets.sh doctor` to validate the migration state.
|
||||
|
|
|
|||
539
tickets.sh
Executable file
539
tickets.sh
Executable file
|
|
@ -0,0 +1,539 @@
|
|||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
WORK_ITEMS_DIR=${WORK_ITEMS_DIR:-work-items}
|
||||
STATUSES="open pending closed"
|
||||
REQUIRED_FIELDS="id slug title status kind priority labels created_at updated_at assignee legacy_ticket"
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
tickets.sh - repository-local WorkItem / Thread helper
|
||||
|
||||
Usage:
|
||||
./tickets.sh help
|
||||
./tickets.sh --help
|
||||
./tickets.sh list [--status open|pending|closed|all]
|
||||
./tickets.sh show <id-or-slug>
|
||||
./tickets.sh create --title <title> [--slug <slug>] [--kind <kind>] [--priority P2] [--label a,b]
|
||||
./tickets.sh comment <id-or-slug> [--role comment|plan|decision|implementation_report] [--author <name>] [--file <path>]
|
||||
./tickets.sh review <id-or-slug> --approve|--request-changes [--author <name>] [--file <path>]
|
||||
./tickets.sh status <id-or-slug> open|pending|closed
|
||||
./tickets.sh close <id-or-slug> [--resolution <text>|--file <path>]
|
||||
./tickets.sh doctor
|
||||
|
||||
Backend:
|
||||
work-items/{open,pending,closed}/<id>/item.md
|
||||
work-items/{open,pending,closed}/<id>/thread.md
|
||||
work-items/{open,pending,closed}/<id>/artifacts/
|
||||
|
||||
Migration policy:
|
||||
work-items/ is the canonical backend after migration. TODO.md is only a
|
||||
legacy/generated-view notice. Open items must not remain as tickets/*.md, and
|
||||
review notes must be appended to thread.md instead of tickets/*.review.md.
|
||||
EOF
|
||||
}
|
||||
|
||||
die() {
|
||||
printf 'error: %s\n' "$*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
now_utc() {
|
||||
date -u '+%Y-%m-%dT%H:%M:%SZ'
|
||||
}
|
||||
|
||||
compact_date() {
|
||||
date -u '+%Y%m%d-%H%M%S'
|
||||
}
|
||||
|
||||
ensure_backend_dirs() {
|
||||
mkdir -p "$WORK_ITEMS_DIR/open" "$WORK_ITEMS_DIR/pending" "$WORK_ITEMS_DIR/closed"
|
||||
}
|
||||
|
||||
is_status() {
|
||||
case "$1" in
|
||||
open|pending|closed) return 0 ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
slugify() {
|
||||
# ASCII-focused slugifier for POSIX shell. Non-ASCII titles should pass --slug.
|
||||
printf '%s' "$1" |
|
||||
tr '[:upper:]' '[:lower:]' |
|
||||
sed 's/[^a-z0-9][^a-z0-9]*/-/g; s/^-//; s/-$//; s/--*/-/g'
|
||||
}
|
||||
|
||||
field_value() {
|
||||
file=$1
|
||||
field=$2
|
||||
awk -v key="$field" '
|
||||
NR == 1 && $0 == "---" { in_fm = 1; next }
|
||||
in_fm && $0 == "---" { exit }
|
||||
in_fm {
|
||||
prefix = key ":"
|
||||
if (index($0, prefix) == 1) {
|
||||
value = substr($0, length(prefix) + 1)
|
||||
sub(/^[[:space:]]*/, "", value)
|
||||
print value
|
||||
exit
|
||||
}
|
||||
}
|
||||
' "$file"
|
||||
}
|
||||
|
||||
set_frontmatter_field() {
|
||||
file=$1
|
||||
field=$2
|
||||
value=$3
|
||||
tmp=${TMPDIR:-/tmp}/tickets-sh.$$.tmp
|
||||
awk -v key="$field" -v new_value="$value" '
|
||||
NR == 1 && $0 == "---" { in_fm = 1; print; next }
|
||||
in_fm && $0 == "---" { in_fm = 0; print; next }
|
||||
in_fm {
|
||||
prefix = key ":"
|
||||
if (index($0, prefix) == 1) {
|
||||
print key ": " new_value
|
||||
next
|
||||
}
|
||||
}
|
||||
{ print }
|
||||
' "$file" > "$tmp"
|
||||
mv "$tmp" "$file"
|
||||
}
|
||||
|
||||
find_item_dir() {
|
||||
query=$1
|
||||
matches=${TMPDIR:-/tmp}/tickets-sh.matches.$$
|
||||
: > "$matches"
|
||||
for status in $STATUSES; do
|
||||
for dir in "$WORK_ITEMS_DIR/$status"/*; do
|
||||
[ -d "$dir" ] || continue
|
||||
item=$dir/item.md
|
||||
[ -f "$item" ] || continue
|
||||
id=$(field_value "$item" id || true)
|
||||
slug=$(field_value "$item" slug || true)
|
||||
if [ "$query" = "$id" ] || [ "$query" = "$slug" ]; then
|
||||
printf '%s\n' "$dir" >> "$matches"
|
||||
fi
|
||||
done
|
||||
done
|
||||
count=$(wc -l < "$matches" | tr -d ' ')
|
||||
if [ "$count" -eq 0 ]; then
|
||||
rm -f "$matches"
|
||||
die "work item not found: $query"
|
||||
fi
|
||||
if [ "$count" -gt 1 ]; then
|
||||
cat "$matches" >&2
|
||||
rm -f "$matches"
|
||||
die "ambiguous work item: $query"
|
||||
fi
|
||||
sed -n '1p' "$matches"
|
||||
rm -f "$matches"
|
||||
}
|
||||
|
||||
item_status_from_dir() {
|
||||
case "$1" in
|
||||
*/open/*) printf 'open\n' ;;
|
||||
*/pending/*) printf 'pending\n' ;;
|
||||
*/closed/*) printf 'closed\n' ;;
|
||||
*) printf 'unknown\n' ;;
|
||||
esac
|
||||
}
|
||||
|
||||
labels_yaml() {
|
||||
labels=$1
|
||||
if [ -z "$labels" ]; then
|
||||
printf '[]'
|
||||
return
|
||||
fi
|
||||
old_ifs=$IFS
|
||||
IFS=,
|
||||
first=1
|
||||
printf '['
|
||||
for label in $labels; do
|
||||
clean=$(printf '%s' "$label" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
|
||||
[ -n "$clean" ] || continue
|
||||
if [ "$first" -eq 0 ]; then
|
||||
printf ', '
|
||||
fi
|
||||
printf '%s' "$clean"
|
||||
first=0
|
||||
done
|
||||
IFS=$old_ifs
|
||||
printf ']'
|
||||
}
|
||||
|
||||
read_body_to_file() {
|
||||
input_file=$1
|
||||
output_file=$2
|
||||
if [ -n "$input_file" ]; then
|
||||
[ -f "$input_file" ] || die "file not found: $input_file"
|
||||
cat "$input_file" > "$output_file"
|
||||
return
|
||||
fi
|
||||
if [ -t 0 ]; then
|
||||
printf 'No body provided.\n' > "$output_file"
|
||||
else
|
||||
cat > "$output_file"
|
||||
fi
|
||||
}
|
||||
|
||||
append_thread_event() {
|
||||
dir=$1
|
||||
event=$2
|
||||
heading=$3
|
||||
author=$4
|
||||
status_value=$5
|
||||
body_file=$6
|
||||
at=$(now_utc)
|
||||
thread=$dir/thread.md
|
||||
[ -f "$thread" ] || : > "$thread"
|
||||
{
|
||||
printf '\n<!-- event: %s author: %s at: %s' "$event" "$author" "$at"
|
||||
if [ -n "$status_value" ]; then
|
||||
printf ' status: %s' "$status_value"
|
||||
fi
|
||||
printf ' -->\n\n'
|
||||
printf '## %s\n\n' "$heading"
|
||||
cat "$body_file"
|
||||
printf '\n\n---\n'
|
||||
} >> "$thread"
|
||||
set_frontmatter_field "$dir/item.md" updated_at "$at"
|
||||
}
|
||||
|
||||
cmd_list() {
|
||||
status_filter=open
|
||||
while [ "$#" -gt 0 ]; do
|
||||
case "$1" in
|
||||
--status)
|
||||
[ "$#" -ge 2 ] || die "--status requires a value"
|
||||
status_filter=$2
|
||||
shift 2
|
||||
;;
|
||||
*) die "unknown list argument: $1" ;;
|
||||
esac
|
||||
done
|
||||
case "$status_filter" in
|
||||
open|pending|closed|all) ;;
|
||||
*) die "invalid status: $status_filter" ;;
|
||||
esac
|
||||
|
||||
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' status id slug title kind priority updated_at
|
||||
for status in $STATUSES; do
|
||||
if [ "$status_filter" != all ] && [ "$status_filter" != "$status" ]; then
|
||||
continue
|
||||
fi
|
||||
for dir in "$WORK_ITEMS_DIR/$status"/*; do
|
||||
[ -d "$dir" ] || continue
|
||||
item=$dir/item.md
|
||||
[ -f "$item" ] || continue
|
||||
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
|
||||
"$(field_value "$item" status)" \
|
||||
"$(field_value "$item" id)" \
|
||||
"$(field_value "$item" slug)" \
|
||||
"$(field_value "$item" title)" \
|
||||
"$(field_value "$item" kind)" \
|
||||
"$(field_value "$item" priority)" \
|
||||
"$(field_value "$item" updated_at)"
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
cmd_show() {
|
||||
[ "$#" -eq 1 ] || die "show requires <id-or-slug>"
|
||||
dir=$(find_item_dir "$1")
|
||||
item=$dir/item.md
|
||||
thread=$dir/thread.md
|
||||
printf '# %s\n\n' "$(field_value "$item" title)"
|
||||
printf 'Path: %s\n' "$dir"
|
||||
printf 'Status: %s\n' "$(field_value "$item" status)"
|
||||
printf 'ID: %s\n' "$(field_value "$item" id)"
|
||||
printf 'Slug: %s\n\n' "$(field_value "$item" slug)"
|
||||
printf '## item.md\n\n'
|
||||
cat "$item"
|
||||
printf '\n\n## thread.md\n\n'
|
||||
if [ -f "$thread" ]; then
|
||||
tail -n 80 "$thread"
|
||||
else
|
||||
printf '(missing thread.md)\n'
|
||||
fi
|
||||
}
|
||||
|
||||
cmd_create() {
|
||||
title=
|
||||
slug=
|
||||
kind=task
|
||||
priority=P2
|
||||
labels=
|
||||
while [ "$#" -gt 0 ]; do
|
||||
case "$1" in
|
||||
--title) [ "$#" -ge 2 ] || die "--title requires a value"; title=$2; shift 2 ;;
|
||||
--slug) [ "$#" -ge 2 ] || die "--slug requires a value"; slug=$2; shift 2 ;;
|
||||
--kind) [ "$#" -ge 2 ] || die "--kind requires a value"; kind=$2; shift 2 ;;
|
||||
--priority) [ "$#" -ge 2 ] || die "--priority requires a value"; priority=$2; shift 2 ;;
|
||||
--label) [ "$#" -ge 2 ] || die "--label requires a value"; labels=$2; shift 2 ;;
|
||||
*) die "unknown create argument: $1" ;;
|
||||
esac
|
||||
done
|
||||
[ -n "$title" ] || die "create requires --title"
|
||||
if [ -z "$slug" ]; then
|
||||
slug=$(slugify "$title")
|
||||
else
|
||||
slug=$(slugify "$slug")
|
||||
fi
|
||||
[ -n "$slug" ] || slug=item
|
||||
ensure_backend_dirs
|
||||
stamp=$(compact_date)
|
||||
id=$stamp-$slug
|
||||
dir=$WORK_ITEMS_DIR/open/$id
|
||||
if [ -e "$dir" ]; then
|
||||
id=$id-$$
|
||||
dir=$WORK_ITEMS_DIR/open/$id
|
||||
fi
|
||||
created=$(now_utc)
|
||||
mkdir -p "$dir/artifacts"
|
||||
: > "$dir/artifacts/.gitkeep"
|
||||
cat > "$dir/item.md" <<EOF
|
||||
---
|
||||
id: $id
|
||||
slug: $slug
|
||||
title: $title
|
||||
status: open
|
||||
kind: $kind
|
||||
priority: $priority
|
||||
labels: $(labels_yaml "$labels")
|
||||
created_at: $created
|
||||
updated_at: $created
|
||||
assignee: null
|
||||
legacy_ticket: null
|
||||
---
|
||||
|
||||
## Background
|
||||
|
||||
Created by tickets.sh.
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
- TBD
|
||||
EOF
|
||||
cat > "$dir/thread.md" <<EOF
|
||||
<!-- event: create author: tickets.sh at: $created -->
|
||||
|
||||
## Created
|
||||
|
||||
Created by tickets.sh create.
|
||||
|
||||
---
|
||||
EOF
|
||||
printf '%s\n' "$id"
|
||||
}
|
||||
|
||||
cmd_comment() {
|
||||
[ "$#" -ge 1 ] || die "comment requires <id-or-slug>"
|
||||
query=$1
|
||||
shift
|
||||
role=comment
|
||||
author=${USER:-unknown}
|
||||
file=
|
||||
while [ "$#" -gt 0 ]; do
|
||||
case "$1" in
|
||||
--role) [ "$#" -ge 2 ] || die "--role requires a value"; role=$2; shift 2 ;;
|
||||
--author) [ "$#" -ge 2 ] || die "--author requires a value"; author=$2; shift 2 ;;
|
||||
--file) [ "$#" -ge 2 ] || die "--file requires a value"; file=$2; shift 2 ;;
|
||||
*) die "unknown comment argument: $1" ;;
|
||||
esac
|
||||
done
|
||||
dir=$(find_item_dir "$query")
|
||||
body=${TMPDIR:-/tmp}/tickets-sh.body.$$
|
||||
read_body_to_file "$file" "$body"
|
||||
heading=$role
|
||||
case "$role" in
|
||||
comment) heading="Comment" ;;
|
||||
plan) heading="Plan" ;;
|
||||
decision) heading="Decision" ;;
|
||||
implementation_report) heading="Implementation report" ;;
|
||||
esac
|
||||
append_thread_event "$dir" "$role" "$heading" "$author" "" "$body"
|
||||
rm -f "$body"
|
||||
}
|
||||
|
||||
cmd_review() {
|
||||
[ "$#" -ge 1 ] || die "review requires <id-or-slug>"
|
||||
query=$1
|
||||
shift
|
||||
author=${USER:-unknown}
|
||||
file=
|
||||
review_status=
|
||||
while [ "$#" -gt 0 ]; do
|
||||
case "$1" in
|
||||
--approve) review_status=approve; shift ;;
|
||||
--request-changes) review_status=request_changes; shift ;;
|
||||
--author) [ "$#" -ge 2 ] || die "--author requires a value"; author=$2; shift 2 ;;
|
||||
--file) [ "$#" -ge 2 ] || die "--file requires a value"; file=$2; shift 2 ;;
|
||||
*) die "unknown review argument: $1" ;;
|
||||
esac
|
||||
done
|
||||
[ -n "$review_status" ] || die "review requires --approve or --request-changes"
|
||||
dir=$(find_item_dir "$query")
|
||||
body=${TMPDIR:-/tmp}/tickets-sh.body.$$
|
||||
read_body_to_file "$file" "$body"
|
||||
if [ "$review_status" = approve ]; then
|
||||
heading="Review: approve"
|
||||
else
|
||||
heading="Review: request changes"
|
||||
fi
|
||||
append_thread_event "$dir" review "$heading" "$author" "$review_status" "$body"
|
||||
rm -f "$body"
|
||||
}
|
||||
|
||||
cmd_status() {
|
||||
[ "$#" -eq 2 ] || die "status requires <id-or-slug> <open|pending|closed>"
|
||||
query=$1
|
||||
new_status=$2
|
||||
is_status "$new_status" || die "invalid status: $new_status"
|
||||
dir=$(find_item_dir "$query")
|
||||
id=$(field_value "$dir/item.md" id)
|
||||
new_dir=$WORK_ITEMS_DIR/$new_status/$id
|
||||
ensure_backend_dirs
|
||||
if [ "$dir" != "$new_dir" ]; then
|
||||
[ ! -e "$new_dir" ] || die "target already exists: $new_dir"
|
||||
mv "$dir" "$new_dir"
|
||||
dir=$new_dir
|
||||
fi
|
||||
set_frontmatter_field "$dir/item.md" status "$new_status"
|
||||
set_frontmatter_field "$dir/item.md" updated_at "$(now_utc)"
|
||||
}
|
||||
|
||||
cmd_close() {
|
||||
[ "$#" -ge 1 ] || die "close requires <id-or-slug>"
|
||||
query=$1
|
||||
shift
|
||||
resolution=
|
||||
file=
|
||||
while [ "$#" -gt 0 ]; do
|
||||
case "$1" in
|
||||
--resolution) [ "$#" -ge 2 ] || die "--resolution requires a value"; resolution=$2; shift 2 ;;
|
||||
--file) [ "$#" -ge 2 ] || die "--file requires a value"; file=$2; shift 2 ;;
|
||||
*) die "unknown close argument: $1" ;;
|
||||
esac
|
||||
done
|
||||
cmd_status "$query" closed
|
||||
dir=$(find_item_dir "$query")
|
||||
body=${TMPDIR:-/tmp}/tickets-sh.body.$$
|
||||
if [ -n "$file" ]; then
|
||||
read_body_to_file "$file" "$body"
|
||||
elif [ -n "$resolution" ]; then
|
||||
printf '%s\n' "$resolution" > "$body"
|
||||
else
|
||||
printf 'Closed.\n' > "$body"
|
||||
fi
|
||||
cp "$body" "$dir/resolution.md"
|
||||
append_thread_event "$dir" close "Closed" "${USER:-unknown}" closed "$body"
|
||||
rm -f "$body"
|
||||
}
|
||||
|
||||
doctor_error() {
|
||||
printf 'doctor: %s\n' "$*" >&2
|
||||
DOCTOR_ERRORS=$((DOCTOR_ERRORS + 1))
|
||||
}
|
||||
|
||||
cmd_doctor() {
|
||||
DOCTOR_ERRORS=0
|
||||
for status in $STATUSES; do
|
||||
[ -d "$WORK_ITEMS_DIR/$status" ] || doctor_error "missing directory: $WORK_ITEMS_DIR/$status"
|
||||
done
|
||||
|
||||
ids=${TMPDIR:-/tmp}/tickets-sh.ids.$$
|
||||
slugs=${TMPDIR:-/tmp}/tickets-sh.slugs.$$
|
||||
: > "$ids"
|
||||
: > "$slugs"
|
||||
|
||||
for status in $STATUSES; do
|
||||
[ -d "$WORK_ITEMS_DIR/$status" ] || continue
|
||||
for dir in "$WORK_ITEMS_DIR/$status"/*; do
|
||||
[ -d "$dir" ] || continue
|
||||
item=$dir/item.md
|
||||
thread=$dir/thread.md
|
||||
artifacts=$dir/artifacts
|
||||
[ -f "$item" ] || { doctor_error "missing item.md: $dir"; continue; }
|
||||
[ -f "$thread" ] || doctor_error "missing thread.md: $dir"
|
||||
[ -d "$artifacts" ] || doctor_error "missing artifacts/: $dir"
|
||||
first=$(sed -n '1p' "$item")
|
||||
[ "$first" = "---" ] || doctor_error "item.md missing frontmatter opener: $item"
|
||||
for field in $REQUIRED_FIELDS; do
|
||||
value=$(field_value "$item" "$field" || true)
|
||||
[ -n "$value" ] || doctor_error "missing required field '$field': $item"
|
||||
done
|
||||
id=$(field_value "$item" id || true)
|
||||
slug=$(field_value "$item" slug || true)
|
||||
fm_status=$(field_value "$item" status || true)
|
||||
if [ -n "$id" ]; then
|
||||
printf '%s\t%s\n' "$id" "$item" >> "$ids"
|
||||
base=$(basename "$dir")
|
||||
[ "$base" = "$id" ] || doctor_error "directory id mismatch: $dir has id $id"
|
||||
fi
|
||||
if [ -n "$slug" ]; then
|
||||
printf '%s\t%s\n' "$slug" "$item" >> "$slugs"
|
||||
fi
|
||||
if [ "$fm_status" != "$status" ]; then
|
||||
doctor_error "status mismatch: $item has '$fm_status' under '$status'"
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
dup_ids=$(cut -f1 "$ids" | sort | uniq -d)
|
||||
if [ -n "$dup_ids" ]; then
|
||||
old_ifs=$IFS
|
||||
IFS='
|
||||
'
|
||||
for dup in $dup_ids; do
|
||||
[ -n "$dup" ] && doctor_error "duplicate id: $dup"
|
||||
done
|
||||
IFS=$old_ifs
|
||||
fi
|
||||
dup_slugs=$(cut -f1 "$slugs" | sort | uniq -d)
|
||||
if [ -n "$dup_slugs" ]; then
|
||||
old_ifs=$IFS
|
||||
IFS='
|
||||
'
|
||||
for dup in $dup_slugs; do
|
||||
[ -n "$dup" ] && doctor_error "duplicate slug: $dup"
|
||||
done
|
||||
IFS=$old_ifs
|
||||
fi
|
||||
rm -f "$ids" "$slugs"
|
||||
|
||||
if [ -f TODO.md ] && grep -Eq 'tickets/[^][ )]+\.md|tickets/.*\.review\.md' TODO.md; then
|
||||
doctor_error "TODO.md still references legacy tickets/*.md"
|
||||
fi
|
||||
for f in tickets/*.md tickets/*.review.md; do
|
||||
[ -e "$f" ] || continue
|
||||
doctor_error "legacy ticket file remains: $f"
|
||||
done
|
||||
|
||||
if [ "$DOCTOR_ERRORS" -eq 0 ]; then
|
||||
printf 'doctor: ok\n'
|
||||
return 0
|
||||
fi
|
||||
printf 'doctor: %s error(s)\n' "$DOCTOR_ERRORS" >&2
|
||||
return 1
|
||||
}
|
||||
|
||||
main() {
|
||||
cmd=${1:-help}
|
||||
case "$cmd" in
|
||||
help|--help|-h) usage ;;
|
||||
list) shift; cmd_list "$@" ;;
|
||||
show) shift; cmd_show "$@" ;;
|
||||
create) shift; cmd_create "$@" ;;
|
||||
comment) shift; cmd_comment "$@" ;;
|
||||
review) shift; cmd_review "$@" ;;
|
||||
status) shift; cmd_status "$@" ;;
|
||||
close) shift; cmd_close "$@" ;;
|
||||
doctor) shift; [ "$#" -eq 0 ] || die "doctor takes no arguments"; cmd_doctor ;;
|
||||
*) usage >&2; die "unknown command: $cmd" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
main "$@"
|
||||
96
work-items/README.md
Normal file
96
work-items/README.md
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
# Work Items backend
|
||||
|
||||
`work-items/` is the canonical file backend for repository work after the migration from `TODO.md` and `tickets/*.md`.
|
||||
|
||||
## Layout
|
||||
|
||||
```text
|
||||
work-items/
|
||||
README.md
|
||||
open/
|
||||
<id>/
|
||||
item.md
|
||||
thread.md
|
||||
artifacts/
|
||||
pending/
|
||||
<id>/
|
||||
item.md
|
||||
thread.md
|
||||
artifacts/
|
||||
closed/
|
||||
<id>/
|
||||
item.md
|
||||
thread.md
|
||||
resolution.md
|
||||
artifacts/
|
||||
```
|
||||
|
||||
`<id>` is timestamp based: `YYYYMMDD-HHMMSS-<slug>`. There is no central sequence file.
|
||||
|
||||
## `item.md` schema
|
||||
|
||||
`item.md` is Markdown with YAML-like frontmatter. The MVP parser intentionally supports only simple `key: value` lines.
|
||||
|
||||
Required fields:
|
||||
|
||||
```yaml
|
||||
---
|
||||
id: 20260527-000001-example
|
||||
slug: example
|
||||
title: Human-readable title
|
||||
status: open
|
||||
kind: feature
|
||||
priority: P2
|
||||
labels: [maintainer, workflow]
|
||||
created_at: 2026-05-27T00:00:01Z
|
||||
updated_at: 2026-05-27T00:00:01Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/example.md
|
||||
---
|
||||
```
|
||||
|
||||
`status` must match the containing directory (`open`, `pending`, or `closed`). `legacy_ticket` records the migrated source path when one existed; use `null` for items created from a TODO-only entry or new work.
|
||||
|
||||
## `thread.md` schema
|
||||
|
||||
`thread.md` is an append-only Markdown event log. `tickets.sh comment`, `tickets.sh review`, and `tickets.sh close` append an HTML-comment event header, a Markdown heading, the event body, and a `---` separator.
|
||||
|
||||
Example:
|
||||
|
||||
```md
|
||||
<!-- event: review author: orchestrator at: 2026-05-27T12:00:00Z status: request_changes -->
|
||||
|
||||
## Review: request changes
|
||||
|
||||
Review notes.
|
||||
|
||||
---
|
||||
```
|
||||
|
||||
Review state belongs in `thread.md`; new `tickets/*.review.md` files should not be created.
|
||||
|
||||
## Commands
|
||||
|
||||
Use `../tickets.sh --help` from this repository root for the command reference. The script performs file operations only; it does not run `git add` or `git commit`.
|
||||
|
||||
Common commands:
|
||||
|
||||
```sh
|
||||
./tickets.sh list --status all
|
||||
./tickets.sh show <id-or-slug>
|
||||
./tickets.sh create --title "Title" --slug title
|
||||
./tickets.sh comment <id-or-slug> --role plan --file notes.md
|
||||
./tickets.sh review <id-or-slug> --approve --file review.md
|
||||
./tickets.sh close <id-or-slug> --resolution "Done"
|
||||
./tickets.sh doctor
|
||||
```
|
||||
|
||||
## Migration policy
|
||||
|
||||
The migration moved unfinished `TODO.md` entries and `tickets/*.md` bodies into `work-items/open/*/item.md`. Existing review files, when present, must be represented as `review` events in `thread.md`. After migration:
|
||||
|
||||
- `work-items/` is the source of truth.
|
||||
- `TODO.md` is only a legacy/generated-view notice and must not carry open ticket state.
|
||||
- `tickets/*.md` and `tickets/*.review.md` must not remain as canonical unfinished items.
|
||||
- Closed items are moved to `work-items/closed/` instead of being deleted.
|
||||
- `./tickets.sh doctor` checks schema, status placement, duplicate IDs/slugs, and leftover legacy ticket files.
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000001-auto-maintain-workflow
|
||||
slug: auto-maintain-workflow
|
||||
title: 半自動開発運用 Workflow
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:01Z
|
||||
updated_at: 2026-05-27T00:00:01Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/auto-maintain-workflow.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/auto-maintain-workflow.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# 半自動開発運用 Workflow
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:01Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/auto-maintain-workflow.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000002-e2e-harness
|
||||
slug: e2e-harness
|
||||
title: E2E テストハーネス
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:02Z
|
||||
updated_at: 2026-05-27T00:00:02Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/e2e-harness.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/e2e-harness.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# E2E テストハーネス
|
||||
|
||||
## 背景
|
||||
7
work-items/open/20260527-000002-e2e-harness/thread.md
Normal file
7
work-items/open/20260527-000002-e2e-harness/thread.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:02Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/e2e-harness.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000003-internal-worker-workflow
|
||||
slug: internal-worker-workflow
|
||||
title: 内部 Worker / 内部 Pod の Workflow 化
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:03Z
|
||||
updated_at: 2026-05-27T00:00:03Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/internal-worker-workflow.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/internal-worker-workflow.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# 内部 Worker / 内部 Pod の Workflow 化
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:03Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/internal-worker-workflow.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000004-manual-turn-rollback
|
||||
slug: manual-turn-rollback
|
||||
title: Pod/TUI: 手動 rollback 導線
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:04Z
|
||||
updated_at: 2026-05-27T00:00:04Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/manual-turn-rollback.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/manual-turn-rollback.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# Pod/TUI: 手動 rollback 導線
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:04Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/manual-turn-rollback.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000005-memory-tool-guidance-prompt
|
||||
slug: memory-tool-guidance-prompt
|
||||
title: プロンプト: memory / knowledge tool 利用タイミングのガイダンス
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:05Z
|
||||
updated_at: 2026-05-27T00:00:05Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/memory-tool-guidance-prompt.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/memory-tool-guidance-prompt.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# プロンプト: memory / knowledge tool 利用タイミングのガイダンス
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:05Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/memory-tool-guidance-prompt.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000006-permission-default-policy
|
||||
slug: permission-default-policy
|
||||
title: Permission: allow-all 既定 policy への整理
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:06Z
|
||||
updated_at: 2026-05-27T00:00:06Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/permission-default-policy.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/permission-default-policy.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# Permission: allow-all 既定 policy への整理
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:06Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/permission-default-policy.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000007-pod-inbound-pod-event-dedup
|
||||
slug: pod-inbound-pod-event-dedup
|
||||
title: Inbound PodEvent ハンドリングの重複を統合する
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:07Z
|
||||
updated_at: 2026-05-27T00:00:07Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/pod-inbound-pod-event-dedup.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/pod-inbound-pod-event-dedup.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# Inbound PodEvent ハンドリングの重複を統合する
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:07Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/pod-inbound-pod-event-dedup.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000008-pod-scope-persistence-authority
|
||||
slug: pod-scope-persistence-authority
|
||||
title: Pod: scope 永続化 authority の整理
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:08Z
|
||||
updated_at: 2026-05-27T00:00:08Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/pod-scope-persistence-authority.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/pod-scope-persistence-authority.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# Pod: scope 永続化 authority の整理
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:08Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/pod-scope-persistence-authority.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000009-pod-session-fork
|
||||
slug: pod-session-fork
|
||||
title: Pod: 任意ターンからの Fork(複数ターン巻き戻し)
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:09Z
|
||||
updated_at: 2026-05-27T00:00:09Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/pod-session-fork.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/pod-session-fork.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# Pod: 任意ターンからの Fork(複数ターン巻き戻し)
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:09Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/pod-session-fork.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000010-prompt-eval-metrics
|
||||
slug: prompt-eval-metrics
|
||||
title: Prompt / Workflow 評価メトリクスと改善 Offer
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:10Z
|
||||
updated_at: 2026-05-27T00:00:10Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/prompt-eval-metrics.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/prompt-eval-metrics.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# Prompt / Workflow 評価メトリクスと改善 Offer
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:10Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/prompt-eval-metrics.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000011-session-todo-reminder
|
||||
slug: session-todo-reminder
|
||||
title: セッション内 Task ツールの注意機構
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:11Z
|
||||
updated_at: 2026-05-27T00:00:11Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/session-todo-reminder.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/session-todo-reminder.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# セッション内 Task ツールの注意機構
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:11Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/session-todo-reminder.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000012-spawnpod-initial-run-confirmation
|
||||
slug: spawnpod-initial-run-confirmation
|
||||
title: SpawnPod: initial Run delivery confirmation
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:12Z
|
||||
updated_at: 2026-05-27T00:00:12Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/spawnpod-initial-run-confirmation.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/spawnpod-initial-run-confirmation.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# SpawnPod: initial Run delivery confirmation
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:12Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/spawnpod-initial-run-confirmation.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000013-tickets-sh-workitem-thread-mvp
|
||||
slug: tickets-sh-workitem-thread-mvp
|
||||
title: Ticket 管理: tickets.sh による WorkItem / Thread MVP
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:13Z
|
||||
updated_at: 2026-05-27T00:00:13Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/tickets-sh-workitem-thread-mvp.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/tickets-sh-workitem-thread-mvp.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# Ticket 管理: tickets.sh による WorkItem / Thread MVP
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:13Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/tickets-sh-workitem-thread-mvp.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000014-tui-actionbar-transient-notice-api
|
||||
slug: tui-actionbar-transient-notice-api
|
||||
title: TUI: actionbar transient notice API
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:14Z
|
||||
updated_at: 2026-05-27T00:00:14Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/tui-actionbar-transient-notice-api.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/tui-actionbar-transient-notice-api.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# TUI: actionbar transient notice API
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:14Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/tui-actionbar-transient-notice-api.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000015-tui-navigation-mode-design
|
||||
slug: tui-navigation-mode-design
|
||||
title: TUI: navigation mode / block focus の設計
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:15Z
|
||||
updated_at: 2026-05-27T00:00:15Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/tui-navigation-mode-design.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/tui-navigation-mode-design.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# TUI: navigation mode / block focus の設計
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:15Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/tui-navigation-mode-design.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000016-tui-picker-live-pending-pods
|
||||
slug: tui-picker-live-pending-pods
|
||||
title: TUI picker: live pending Pod の表示優先と状態補完
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:16Z
|
||||
updated_at: 2026-05-27T00:00:16Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/tui-picker-live-pending-pods.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/tui-picker-live-pending-pods.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# TUI picker: live pending Pod の表示優先と状態補完
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:16Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/tui-picker-live-pending-pods.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000017-tui-spawned-pod-panel
|
||||
slug: tui-spawned-pod-panel
|
||||
title: TUI: spawned child Pod の一覧と一時 attach
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:17Z
|
||||
updated_at: 2026-05-27T00:00:17Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/tui-spawned-pod-panel.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/tui-spawned-pod-panel.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# TUI: spawned child Pod の一覧と一時 attach
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:17Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/tui-spawned-pod-panel.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -1,3 +1,22 @@
|
|||
---
|
||||
id: 20260527-000018-tui-user-model-setup
|
||||
slug: tui-user-model-setup
|
||||
title: TUI: ユーザーマニフェストのモデル設定 wizard
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:18Z
|
||||
updated_at: 2026-05-27T00:00:18Z
|
||||
assignee: null
|
||||
legacy_ticket: tickets/tui-user-model-setup.md
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: tickets/tui-user-model-setup.md
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# TUI: ユーザーマニフェストのモデル設定 wizard
|
||||
|
||||
## 背景
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:18Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from tickets/tui-user-model-setup.md. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
id: 20260527-000019-workspace-memory-lint-cli
|
||||
slug: workspace-memory-lint-cli
|
||||
title: ワークスペースのメモリーをLintするヘッドレスCLI
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:19Z
|
||||
updated_at: 2026-05-27T00:00:19Z
|
||||
assignee: null
|
||||
legacy_ticket: null
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: null
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# ワークスペースのメモリーをLintするヘッドレスCLI
|
||||
|
||||
## Background
|
||||
|
||||
This work item was migrated from an unfinished TODO.md entry that did not have a dedicated legacy ticket file.
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
- Define the concrete requirements before implementation.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:19Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from TODO.md entry without a legacy ticket file. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
id: 20260527-000020-system-reminder-injection-generalization
|
||||
slug: system-reminder-injection-generalization
|
||||
title: system-reminder 注入機構の汎用化(2件目の利用者が出た時に検討。タグ形式 `<system-reminder>...</system-reminder>` の規約は session-todo-reminder で先行確立。注入された Item は worker.history に append する方針)
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:20Z
|
||||
updated_at: 2026-05-27T00:00:20Z
|
||||
assignee: null
|
||||
legacy_ticket: null
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: null
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# system-reminder 注入機構の汎用化(2件目の利用者が出た時に検討。タグ形式 `<system-reminder>...</system-reminder>` の規約は session-todo-reminder で先行確立。注入された Item は worker.history に append する方針)
|
||||
|
||||
## Background
|
||||
|
||||
This work item was migrated from an unfinished TODO.md entry that did not have a dedicated legacy ticket file.
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
- Define the concrete requirements before implementation.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:20Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from TODO.md entry without a legacy ticket file. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
id: 20260527-000021-bash-tool-editing-guidance
|
||||
slug: bash-tool-editing-guidance
|
||||
title: Bashツールがファイル編集に常用されている問題をdesciptionで抑制
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:21Z
|
||||
updated_at: 2026-05-27T00:00:21Z
|
||||
assignee: null
|
||||
legacy_ticket: null
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: null
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# Bashツールがファイル編集に常用されている問題をdesciptionで抑制
|
||||
|
||||
## Background
|
||||
|
||||
This work item was migrated from an unfinished TODO.md entry that did not have a dedicated legacy ticket file.
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
- Define the concrete requirements before implementation.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:21Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from TODO.md entry without a legacy ticket file. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
28
work-items/open/20260527-000022-manifest-profiles/item.md
Normal file
28
work-items/open/20260527-000022-manifest-profiles/item.md
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
id: 20260527-000022-manifest-profiles
|
||||
slug: manifest-profiles
|
||||
title: 事前定義したManifestをProfile的に扱い、Orchestrator/Coder/Researcherで別々のモデル/設定を使わせる運用ができるようにする
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:22Z
|
||||
updated_at: 2026-05-27T00:00:22Z
|
||||
assignee: null
|
||||
legacy_ticket: null
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: null
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# 事前定義したManifestをProfile的に扱い、Orchestrator/Coder/Researcherで別々のモデル/設定を使わせる運用ができるようにする
|
||||
|
||||
## Background
|
||||
|
||||
This work item was migrated from an unfinished TODO.md entry that did not have a dedicated legacy ticket file.
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
- Define the concrete requirements before implementation.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:22Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from TODO.md entry without a legacy ticket file. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
28
work-items/open/20260527-000023-multi-pod-view-ui/item.md
Normal file
28
work-items/open/20260527-000023-multi-pod-view-ui/item.md
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
id: 20260527-000023-multi-pod-view-ui
|
||||
slug: multi-pod-view-ui
|
||||
title: 複数のPodのViewを行き来できるUI
|
||||
status: open
|
||||
kind: task
|
||||
priority: P2
|
||||
labels: [migrated]
|
||||
created_at: 2026-05-27T00:00:23Z
|
||||
updated_at: 2026-05-27T00:00:23Z
|
||||
assignee: null
|
||||
legacy_ticket: null
|
||||
---
|
||||
|
||||
## Migration reference
|
||||
|
||||
- legacy_ticket: null
|
||||
- migrated_from: TODO.md / tickets directory migration on 2026-05-27
|
||||
|
||||
# 複数のPodのViewを行き来できるUI
|
||||
|
||||
## Background
|
||||
|
||||
This work item was migrated from an unfinished TODO.md entry that did not have a dedicated legacy ticket file.
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
- Define the concrete requirements before implementation.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<!-- event: migration author: tickets.sh-migration at: 2026-05-27T00:00:23Z -->
|
||||
|
||||
## Migrated
|
||||
|
||||
Migrated from TODO.md entry without a legacy ticket file. No legacy review file was present at migration time.
|
||||
|
||||
---
|
||||
Loading…
Reference in New Issue
Block a user