@geekbeer/minion 4.1.2 → 4.2.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/docs/api-reference.md +57 -37
- package/linux/bin/hq +68 -41
- package/linux/routes/chat.js +1 -1
- package/package.json +1 -1
- package/rules/core.md +16 -12
- package/skills/accounting-bookkeeping/references/api-expense-reimbursement.md +34 -0
- package/skills/accounting-bookkeeping/references/api-journal-entries.md +14 -6
- package/win/routes/chat.js +1 -1
package/docs/api-reference.md
CHANGED
|
@@ -809,20 +809,22 @@ Base path: All endpoints are prefixed with `/api/minion` by the agent's API clie
|
|
|
809
809
|
|--------|----------|-------------|
|
|
810
810
|
| GET | `/api/minion/me/projects` | 参加プロジェクト一覧(role 含む) |
|
|
811
811
|
|
|
812
|
+
Query parameters:
|
|
813
|
+
- `workspace_id` (optional, UUID): 指定したワークスペースに属するプロジェクトのみ返す。省略すると参加している全プロジェクト(複数ワークスペース横断)を返す。
|
|
814
|
+
|
|
812
815
|
Response:
|
|
813
816
|
```json
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
]
|
|
817
|
+
{
|
|
818
|
+
"projects": [
|
|
819
|
+
{
|
|
820
|
+
"id": "uuid",
|
|
821
|
+
"name": "project-name",
|
|
822
|
+
"description": "...",
|
|
823
|
+
"workspace_id": "uuid",
|
|
824
|
+
"role": "pm"
|
|
825
|
+
}
|
|
826
|
+
]
|
|
827
|
+
}
|
|
826
828
|
```
|
|
827
829
|
|
|
828
830
|
`role` is one of `"pm"` (project manager), `"engineer"`, or `"accountant"`.
|
|
@@ -2107,56 +2109,74 @@ DAGスキルノードの `skill_version_id` は **オプション** です。
|
|
|
2107
2109
|
ローカルエージェントの `/api/project-memories` は上記 HQ API へのプロキシ。
|
|
2108
2110
|
詳細なリクエスト/レスポンス仕様はローカル API セクションの「Project Memories」を参照。
|
|
2109
2111
|
|
|
2110
|
-
### Notes (HQ,
|
|
2112
|
+
### Notes (HQ, ワークスペース/プロジェクトノート)
|
|
2113
|
+
|
|
2114
|
+
ノートはワークスペース直下に保存され、任意で 1 つ以上のプロジェクトにリンクできる(`note_project_links`)。
|
|
2115
|
+
**テキストベースの成果物(レポート、調査結果、要約等)はノートに保存すること。** HQダッシュボードでユーザーが即座に閲覧・編集・検索でき、バージョン管理もされる。
|
|
2116
|
+
|
|
2117
|
+
ミニオンには**ワークスペース経由API**と**プロジェクト経由API**の2系統がある:
|
|
2111
2118
|
|
|
2112
|
-
|
|
2113
|
-
|
|
2119
|
+
- **ワークスペース経由** — 自分が所属するワークスペース内のすべてのノートにアクセス可能 (プロジェクト未リンクのノート含む)。一般的な検索・整理に使う
|
|
2120
|
+
- **プロジェクト経由** — 作業コンテキストが特定プロジェクトに紐づいているときに、そのプロジェクトのノートだけを絞り込む用途。プロジェクトメンバーシップで認可される
|
|
2121
|
+
|
|
2122
|
+
**削除エンドポイントは存在しない**(事故防止のため人間操作限定)。アーカイブが必要な場合は `status=archived` で PATCH すること。
|
|
2123
|
+
|
|
2124
|
+
#### Workspace-scoped Notes
|
|
2114
2125
|
|
|
2115
2126
|
| Method | Endpoint | Description |
|
|
2116
2127
|
|--------|----------|-------------|
|
|
2117
|
-
| GET | `/api/minion/
|
|
2118
|
-
| POST | `/api/minion/
|
|
2119
|
-
| GET | `/api/minion/
|
|
2120
|
-
| PATCH | `/api/minion/
|
|
2121
|
-
| GET | `/api/minion/
|
|
2128
|
+
| GET | `/api/minion/workspaces/:id/notes` | ワークスペースのノート一覧。Query: `?status=active&search=&project_id=&include_content=true` |
|
|
2129
|
+
| POST | `/api/minion/workspaces/:id/notes` | ノート作成。Body: `{title, content?, project_ids?: string[]}`。`project_ids` 指定時は自動でリンク |
|
|
2130
|
+
| GET | `/api/minion/workspaces/:id/notes/:noteId` | ノート詳細(全文) |
|
|
2131
|
+
| PATCH | `/api/minion/workspaces/:id/notes/:noteId` | 更新(内容変更時にバージョン自動作成)。Body: `{title?, content?, status?, change_summary?}` |
|
|
2132
|
+
| GET | `/api/minion/workspaces/:id/notes/search?q=keyword` | ワークスペース全体を全文検索 |
|
|
2122
2133
|
|
|
2123
|
-
POST `/api/minion/
|
|
2134
|
+
POST `/api/minion/workspaces/:id/notes` body:
|
|
2124
2135
|
```json
|
|
2125
2136
|
{
|
|
2126
2137
|
"title": "調査レポート: ユーザー行動分析",
|
|
2127
|
-
"content": "## 概要\n..."
|
|
2138
|
+
"content": "## 概要\n...",
|
|
2139
|
+
"project_ids": ["<uuid>"]
|
|
2128
2140
|
}
|
|
2129
2141
|
```
|
|
2130
2142
|
|
|
2131
2143
|
| Field | Type | Required | Description |
|
|
2132
2144
|
|-------|------|----------|-------------|
|
|
2133
|
-
| `title` | string | Yes |
|
|
2134
|
-
| `content` | string | No |
|
|
2145
|
+
| `title` | string | Yes | ワークスペース内で一意である必要がある |
|
|
2146
|
+
| `content` | string | No | Markdown本文 |
|
|
2147
|
+
| `project_ids` | string[] | No | リンクするプロジェクト(ワークスペースに属している必要あり) |
|
|
2135
2148
|
|
|
2136
|
-
|
|
2137
|
-
```json
|
|
2138
|
-
{
|
|
2139
|
-
"title": "更新されたタイトル",
|
|
2140
|
-
"content": "更新された本文",
|
|
2141
|
-
"change_summary": "データを追加"
|
|
2142
|
-
}
|
|
2143
|
-
```
|
|
2149
|
+
#### Project-scoped Notes
|
|
2144
2150
|
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
|
2148
|
-
|
|
2149
|
-
|
|
|
2151
|
+
特定プロジェクトのノートだけを絞り込みたいときに使う。認可は `project_members` を経由。
|
|
2152
|
+
|
|
2153
|
+
| Method | Endpoint | Description |
|
|
2154
|
+
|--------|----------|-------------|
|
|
2155
|
+
| GET | `/api/minion/projects/:projectId/notes` | プロジェクトのノート一覧。Query: `?status=active&include_content=true` |
|
|
2156
|
+
| POST | `/api/minion/projects/:projectId/notes` | ノート作成 + 当該プロジェクトに自動リンク |
|
|
2157
|
+
| GET | `/api/minion/projects/:projectId/notes/:noteId` | ノート詳細(全文含む) |
|
|
2158
|
+
| PATCH | `/api/minion/projects/:projectId/notes/:noteId` | ノートを更新(内容変更時にバージョン自動作成) |
|
|
2159
|
+
| GET | `/api/minion/projects/:projectId/notes/search?q=keyword` | プロジェクト内のノートを全文検索 |
|
|
2160
|
+
|
|
2161
|
+
PATCH body は workspace 版と共通: `{title?, content?, change_summary?}` (status は workspace 経由のみ受理)。
|
|
2150
2162
|
|
|
2151
2163
|
#### hq CLI ラッパー
|
|
2152
2164
|
|
|
2153
2165
|
```bash
|
|
2166
|
+
# プロジェクトスコープ
|
|
2154
2167
|
hq note create <project_id> --title "タイトル" --content "本文"
|
|
2155
2168
|
hq note create <project_id> --title "タイトル" --file /tmp/report.md
|
|
2156
2169
|
hq note update <project_id> <note_id> --content "更新内容" --change-summary "修正理由"
|
|
2157
2170
|
hq note list <project_id>
|
|
2158
2171
|
hq note get <project_id> <note_id>
|
|
2159
2172
|
hq note search <project_id> "キーワード"
|
|
2173
|
+
|
|
2174
|
+
# ワークスペーススコープ (プロジェクト紐づけなしも対象)
|
|
2175
|
+
hq note create --workspace <workspace_id> --title "タイトル" --content "本文"
|
|
2176
|
+
hq note update --workspace <workspace_id> <note_id> --content "更新内容"
|
|
2177
|
+
hq note list --workspace <workspace_id>
|
|
2178
|
+
hq note get --workspace <workspace_id> <note_id>
|
|
2179
|
+
hq note search --workspace <workspace_id> "キーワード"
|
|
2160
2180
|
```
|
|
2161
2181
|
|
|
2162
2182
|
### Meeting Rooms 🧪 (HQ, experimental, v3.59.0〜)
|
package/linux/bin/hq
CHANGED
|
@@ -19,12 +19,17 @@
|
|
|
19
19
|
# hq list workspaces - List workspaces this minion belongs to
|
|
20
20
|
# hq list dag-workflows [project_id] - List DAG workflows (optionally filter by project)
|
|
21
21
|
# hq note create <project_id> --title "Title" --content "Body" [--file path]
|
|
22
|
-
#
|
|
22
|
+
# hq note create --workspace <workspace_id> --title "Title" --content "Body" [--file path] [--project-ids <id,id>]
|
|
23
|
+
# - Create a note (project- or workspace-scoped)
|
|
23
24
|
# hq note update <project_id> <note_id> --content "Body" [--title "Title"] [--file path] [--change-summary "summary"]
|
|
25
|
+
# hq note update --workspace <workspace_id> <note_id> --content "Body" [--title "Title"] [--status active|archived]
|
|
24
26
|
# - Update an existing note
|
|
25
27
|
# hq note list <project_id> - List notes in the project
|
|
28
|
+
# hq note list --workspace <workspace_id> - List notes in the workspace (incl. project-unlinked)
|
|
26
29
|
# hq note get <project_id> <note_id> - Get a single note with full content
|
|
30
|
+
# hq note get --workspace <workspace_id> <note_id> - Same, workspace-scoped
|
|
27
31
|
# hq note search <project_id> <query> - Search notes in the project
|
|
32
|
+
# hq note search --workspace <workspace_id> <query> - Search across the whole workspace
|
|
28
33
|
# hq create dag-workflow <body.json> - Create a DAG workflow (PM only). Body: {project_id, name, graph?, ...}
|
|
29
34
|
# hq put dag-workflow <id> <body.json> - Update DAG workflow draft (PM only). Body: {graph?, content?, ...}
|
|
30
35
|
# hq publish dag-workflow <id> - Publish the draft as a new version (PM only, validated)
|
|
@@ -163,10 +168,15 @@ print_usage() {
|
|
|
163
168
|
echo " hq list workspaces - List workspaces this minion belongs to" >&2
|
|
164
169
|
echo " hq list dag-workflows [project_id] - List DAG workflows (optionally by project)" >&2
|
|
165
170
|
echo " hq note create <project_id> --title \"Title\" --content \"Body\" [--file path]" >&2
|
|
171
|
+
echo " hq note create --workspace <ws_id> --title \"Title\" --content \"Body\" [--project-ids <id,id>]" >&2
|
|
166
172
|
echo " hq note update <project_id> <note_id> --content \"Body\" [--title \"Title\"] [--file path]" >&2
|
|
167
|
-
echo " hq note
|
|
168
|
-
echo " hq note
|
|
169
|
-
echo " hq note
|
|
173
|
+
echo " hq note update --workspace <ws_id> <note_id> --content \"Body\" [--title \"Title\"] [--status active|archived]" >&2
|
|
174
|
+
echo " hq note list <project_id> - List notes in the project" >&2
|
|
175
|
+
echo " hq note list --workspace <ws_id> - List notes in the workspace" >&2
|
|
176
|
+
echo " hq note get <project_id> <note_id> - Get a single note" >&2
|
|
177
|
+
echo " hq note get --workspace <ws_id> <note_id> - Get a single note (workspace-scoped)" >&2
|
|
178
|
+
echo " hq note search <project_id> <query> - Search notes in the project" >&2
|
|
179
|
+
echo " hq note search --workspace <ws_id> <query> - Search notes across the workspace" >&2
|
|
170
180
|
echo " hq create dag-workflow <body.json> - Create a DAG workflow (PM only)" >&2
|
|
171
181
|
echo " hq put dag-workflow <id> <body.json> - Update DAG workflow draft (PM only)" >&2
|
|
172
182
|
echo " hq publish dag-workflow <id> - Publish the draft as a new version (PM only)" >&2
|
|
@@ -310,22 +320,38 @@ case "${1:-}" in
|
|
|
310
320
|
|
|
311
321
|
note)
|
|
312
322
|
action="${2:-}"
|
|
323
|
+
shift 2 || true
|
|
324
|
+
# Resolve scope: either "--workspace <ws_id>" (must be first) or positional <project_id>.
|
|
325
|
+
note_base=""
|
|
326
|
+
if [ "${1:-}" = "--workspace" ]; then
|
|
327
|
+
ws_id="${2:-}"
|
|
328
|
+
if [ -z "$ws_id" ]; then
|
|
329
|
+
echo "Error: --workspace requires a workspace_id" >&2
|
|
330
|
+
exit 1
|
|
331
|
+
fi
|
|
332
|
+
note_base="$BASE_URL/workspaces/$ws_id/notes"
|
|
333
|
+
shift 2
|
|
334
|
+
else
|
|
335
|
+
project_id="${1:-}"
|
|
336
|
+
if [ -z "$project_id" ] || [ "${project_id#--}" != "$project_id" ]; then
|
|
337
|
+
echo "Usage: hq note $action <project_id> ... | hq note $action --workspace <ws_id> ..." >&2
|
|
338
|
+
exit 1
|
|
339
|
+
fi
|
|
340
|
+
note_base="$BASE_URL/projects/$project_id/notes"
|
|
341
|
+
shift
|
|
342
|
+
fi
|
|
313
343
|
case "$action" in
|
|
314
344
|
create)
|
|
315
|
-
project_id="${3:-}"
|
|
316
|
-
if [ -z "$project_id" ]; then
|
|
317
|
-
echo "Usage: hq note create <project_id> --title \"Title\" --content \"Body\" [--file path]" >&2
|
|
318
|
-
exit 1
|
|
319
|
-
fi
|
|
320
|
-
shift 3
|
|
321
345
|
note_title=""
|
|
322
346
|
note_content=""
|
|
323
347
|
note_file=""
|
|
348
|
+
project_ids_csv=""
|
|
324
349
|
while [ $# -gt 0 ]; do
|
|
325
350
|
case "$1" in
|
|
326
351
|
--title) note_title="$2"; shift 2 ;;
|
|
327
352
|
--content) note_content="$2"; shift 2 ;;
|
|
328
353
|
--file) note_file="$2"; shift 2 ;;
|
|
354
|
+
--project-ids) project_ids_csv="$2"; shift 2 ;;
|
|
329
355
|
*) echo "Unknown option: $1" >&2; exit 1 ;;
|
|
330
356
|
esac
|
|
331
357
|
done
|
|
@@ -344,38 +370,47 @@ case "${1:-}" in
|
|
|
344
370
|
echo "Error: --content or --file is required" >&2
|
|
345
371
|
exit 1
|
|
346
372
|
fi
|
|
347
|
-
# Build JSON body using jq or python3
|
|
348
373
|
if command -v jq &>/dev/null; then
|
|
349
374
|
body=$(jq -n --arg t "$note_title" --arg c "$note_content" '{title: $t, content: $c}')
|
|
375
|
+
if [ -n "$project_ids_csv" ]; then
|
|
376
|
+
body=$(echo "$body" | jq --arg ids "$project_ids_csv" '. + {project_ids: ($ids | split(","))}')
|
|
377
|
+
fi
|
|
350
378
|
elif command -v python3 &>/dev/null; then
|
|
351
|
-
body=$(python3 -c "
|
|
379
|
+
body=$(python3 -c "
|
|
380
|
+
import json, sys
|
|
381
|
+
d = {'title': sys.argv[1], 'content': sys.argv[2]}
|
|
382
|
+
if sys.argv[3]:
|
|
383
|
+
d['project_ids'] = [s for s in sys.argv[3].split(',') if s]
|
|
384
|
+
print(json.dumps(d))
|
|
385
|
+
" "$note_title" "$note_content" "$project_ids_csv")
|
|
352
386
|
else
|
|
353
387
|
echo "Error: jq or python3 is required to build JSON" >&2
|
|
354
388
|
exit 1
|
|
355
389
|
fi
|
|
356
390
|
tmpfile=$(mktemp)
|
|
357
391
|
echo "$body" > "$tmpfile"
|
|
358
|
-
send_json_request POST "$
|
|
392
|
+
send_json_request POST "$note_base" "$tmpfile"
|
|
359
393
|
rm -f "$tmpfile"
|
|
360
394
|
;;
|
|
361
395
|
update)
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
echo "Usage: hq note update <project_id> <note_id> --content \"Body\" [--title \"Title\"] [--file path] [--change-summary \"summary\"]" >&2
|
|
396
|
+
note_id="${1:-}"
|
|
397
|
+
if [ -z "$note_id" ]; then
|
|
398
|
+
echo "Error: <note_id> is required" >&2
|
|
366
399
|
exit 1
|
|
367
400
|
fi
|
|
368
|
-
shift
|
|
401
|
+
shift
|
|
369
402
|
note_title=""
|
|
370
403
|
note_content=""
|
|
371
404
|
note_file=""
|
|
372
405
|
change_summary=""
|
|
406
|
+
note_status=""
|
|
373
407
|
while [ $# -gt 0 ]; do
|
|
374
408
|
case "$1" in
|
|
375
409
|
--title) note_title="$2"; shift 2 ;;
|
|
376
410
|
--content) note_content="$2"; shift 2 ;;
|
|
377
411
|
--file) note_file="$2"; shift 2 ;;
|
|
378
412
|
--change-summary) change_summary="$2"; shift 2 ;;
|
|
413
|
+
--status) note_status="$2"; shift 2 ;;
|
|
379
414
|
*) echo "Unknown option: $1" >&2; exit 1 ;;
|
|
380
415
|
esac
|
|
381
416
|
done
|
|
@@ -386,16 +421,16 @@ case "${1:-}" in
|
|
|
386
421
|
fi
|
|
387
422
|
note_content=$(cat "$note_file")
|
|
388
423
|
fi
|
|
389
|
-
if [ -z "$note_content" ] && [ -z "$note_title" ]; then
|
|
390
|
-
echo "Error: at least --content, --file, or --
|
|
424
|
+
if [ -z "$note_content" ] && [ -z "$note_title" ] && [ -z "$note_status" ]; then
|
|
425
|
+
echo "Error: at least --content, --file, --title, or --status is required" >&2
|
|
391
426
|
exit 1
|
|
392
427
|
fi
|
|
393
|
-
# Build JSON body
|
|
394
428
|
if command -v jq &>/dev/null; then
|
|
395
429
|
body="{}"
|
|
396
430
|
[ -n "$note_title" ] && body=$(echo "$body" | jq --arg t "$note_title" '. + {title: $t}')
|
|
397
431
|
[ -n "$note_content" ] && body=$(echo "$body" | jq --arg c "$note_content" '. + {content: $c}')
|
|
398
432
|
[ -n "$change_summary" ] && body=$(echo "$body" | jq --arg s "$change_summary" '. + {change_summary: $s}')
|
|
433
|
+
[ -n "$note_status" ] && body=$(echo "$body" | jq --arg st "$note_status" '. + {status: $st}')
|
|
399
434
|
elif command -v python3 &>/dev/null; then
|
|
400
435
|
body=$(python3 -c "
|
|
401
436
|
import json, sys
|
|
@@ -403,20 +438,20 @@ d = {}
|
|
|
403
438
|
if sys.argv[1]: d['title'] = sys.argv[1]
|
|
404
439
|
if sys.argv[2]: d['content'] = sys.argv[2]
|
|
405
440
|
if sys.argv[3]: d['change_summary'] = sys.argv[3]
|
|
441
|
+
if sys.argv[4]: d['status'] = sys.argv[4]
|
|
406
442
|
print(json.dumps(d))
|
|
407
|
-
" "$note_title" "$note_content" "$change_summary")
|
|
443
|
+
" "$note_title" "$note_content" "$change_summary" "$note_status")
|
|
408
444
|
else
|
|
409
445
|
echo "Error: jq or python3 is required to build JSON" >&2
|
|
410
446
|
exit 1
|
|
411
447
|
fi
|
|
412
448
|
tmpfile=$(mktemp)
|
|
413
449
|
echo "$body" > "$tmpfile"
|
|
414
|
-
# Use PATCH for update
|
|
415
450
|
response=$(curl -s -w "\n%{http_code}" -X PATCH \
|
|
416
451
|
-H "Authorization: Bearer $API_TOKEN" \
|
|
417
452
|
-H "Content-Type: application/json" \
|
|
418
453
|
--data-binary "@$tmpfile" \
|
|
419
|
-
"$
|
|
454
|
+
"$note_base/$note_id")
|
|
420
455
|
rm -f "$tmpfile"
|
|
421
456
|
http_code=$(echo "$response" | tail -1)
|
|
422
457
|
body_out=$(echo "$response" | sed '$d')
|
|
@@ -429,30 +464,22 @@ print(json.dumps(d))
|
|
|
429
464
|
fi
|
|
430
465
|
;;
|
|
431
466
|
list)
|
|
432
|
-
|
|
433
|
-
if [ -z "$project_id" ]; then
|
|
434
|
-
echo "Usage: hq note list <project_id>" >&2
|
|
435
|
-
exit 1
|
|
436
|
-
fi
|
|
437
|
-
fetch_resource "$BASE_URL/projects/$project_id/notes?include_content=false"
|
|
467
|
+
fetch_resource "$note_base?include_content=false"
|
|
438
468
|
;;
|
|
439
469
|
get)
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
echo "Usage: hq note get <project_id> <note_id>" >&2
|
|
470
|
+
note_id="${1:-}"
|
|
471
|
+
if [ -z "$note_id" ]; then
|
|
472
|
+
echo "Error: <note_id> is required" >&2
|
|
444
473
|
exit 1
|
|
445
474
|
fi
|
|
446
|
-
fetch_resource "$
|
|
475
|
+
fetch_resource "$note_base/$note_id"
|
|
447
476
|
;;
|
|
448
477
|
search)
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
echo "Usage: hq note search <project_id> <query>" >&2
|
|
478
|
+
query="${1:-}"
|
|
479
|
+
if [ -z "$query" ]; then
|
|
480
|
+
echo "Error: <query> is required" >&2
|
|
453
481
|
exit 1
|
|
454
482
|
fi
|
|
455
|
-
# URL-encode the query
|
|
456
483
|
if command -v jq &>/dev/null; then
|
|
457
484
|
encoded=$(printf '%s' "$query" | jq -sRr @uri)
|
|
458
485
|
elif command -v python3 &>/dev/null; then
|
|
@@ -460,7 +487,7 @@ print(json.dumps(d))
|
|
|
460
487
|
else
|
|
461
488
|
encoded="$query"
|
|
462
489
|
fi
|
|
463
|
-
fetch_resource "$
|
|
490
|
+
fetch_resource "$note_base/search?q=$encoded"
|
|
464
491
|
;;
|
|
465
492
|
*)
|
|
466
493
|
echo "Unknown note action: $action" >&2
|
package/linux/routes/chat.js
CHANGED
|
@@ -391,7 +391,7 @@ async function buildContextPrefix(message, context, sessionId, workspaceId, refe
|
|
|
391
391
|
'[ファイル出力ルール]',
|
|
392
392
|
'成果物の保存先は以下のルールに従うこと。`/home/minion/` 直下にファイルを保存しないこと。',
|
|
393
393
|
'',
|
|
394
|
-
'- **テキスト成果物**(レポート、調査結果、要約等)→ ノートに保存: `hq note create <project_id> --title "タイトル" --content "本文"`',
|
|
394
|
+
'- **テキスト成果物**(レポート、調査結果、要約等)→ ノートに保存: `hq note create <project_id> --title "タイトル" --content "本文"` (プロジェクト紐づけなしは `hq note create --workspace <ws_id> ...`)',
|
|
395
395
|
'- **バイナリファイル**(PDF、画像、ZIP等)→ `~/files/` に配置(ユーザーがHQからダウンロード可能)',
|
|
396
396
|
'- **一時ファイル** → `/tmp/` に配置(作業後に削除)',
|
|
397
397
|
'',
|
package/package.json
CHANGED
package/rules/core.md
CHANGED
|
@@ -445,28 +445,32 @@ display_name が同じユーザーが同一ワークスペースに複数いる
|
|
|
445
445
|
|
|
446
446
|
### ノートへの保存 (`hq note` コマンド)
|
|
447
447
|
|
|
448
|
-
|
|
448
|
+
テキストベースの成果物は原則ノートに保存する。ノートはワークスペース直下に保存され、任意で 1 つ以上のプロジェクトにリンクできる。HQダッシュボードで閲覧・編集・検索でき、バージョン管理もされる。
|
|
449
|
+
|
|
450
|
+
スコープの使い分け:
|
|
451
|
+
|
|
452
|
+
- **プロジェクトスコープ** — 作業がプロジェクトに紐づくとき (`hq note ... <project_id>`)。プロジェクトのノートタブから即発見できる
|
|
453
|
+
- **ワークスペーススコープ** — プロジェクトに紐づかない一般的なメモや、ワークスペース横断で検索したいとき (`hq note ... --workspace <workspace_id>`)。プロジェクト未指定でも作成・検索できる
|
|
449
454
|
|
|
450
455
|
```bash
|
|
451
|
-
#
|
|
456
|
+
# プロジェクトスコープ(作業コンテキストが特定プロジェクト)
|
|
452
457
|
hq note create <project_id> --title "レポートタイトル" --content "本文..."
|
|
453
|
-
|
|
454
|
-
# 長い内容はファイルから読み込む
|
|
455
458
|
hq note create <project_id> --title "調査結果" --file /tmp/report.md
|
|
456
|
-
|
|
457
|
-
# 既存ノートを更新
|
|
458
459
|
hq note update <project_id> <note_id> --content "更新された内容"
|
|
459
|
-
|
|
460
|
-
# ノート一覧を確認
|
|
461
460
|
hq note list <project_id>
|
|
462
|
-
|
|
463
|
-
# ノート内容を取得
|
|
464
461
|
hq note get <project_id> <note_id>
|
|
465
|
-
|
|
466
|
-
# ノートを検索
|
|
467
462
|
hq note search <project_id> "キーワード"
|
|
463
|
+
|
|
464
|
+
# ワークスペーススコープ(プロジェクト未紐づけのノート含む)
|
|
465
|
+
hq note create --workspace <workspace_id> --title "メモ" --content "..."
|
|
466
|
+
hq note update --workspace <workspace_id> <note_id> --content "更新内容"
|
|
467
|
+
hq note list --workspace <workspace_id>
|
|
468
|
+
hq note get --workspace <workspace_id> <note_id>
|
|
469
|
+
hq note search --workspace <workspace_id> "キーワード"
|
|
468
470
|
```
|
|
469
471
|
|
|
472
|
+
**削除はミニオンから実行できない**(事故防止のため人間操作限定)。不要なノートは `hq note update ... --status archived` (または PATCH の `status: "archived"`) でアーカイブすること。
|
|
473
|
+
|
|
470
474
|
### ノート内のユーザーメンション
|
|
471
475
|
|
|
472
476
|
人間ユーザーがノート編集UIで `Ctrl+I` を押すと、自分の発言を示すアバター付きチップが行頭に挿入される。マークダウン上は次の形式で永続化される:
|
|
@@ -97,6 +97,40 @@ Response: { "reimbursement": { "id", "expense_journal_entry_id" } }
|
|
|
97
97
|
422 missing_default_payable_account — 立替者の貸方科目が後から消去された場合
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
+
### POST /api/accounting/expense-reimbursements/bulk-settle
|
|
101
|
+
|
|
102
|
+
複数の立替を1本の精算仕訳でまとめて精算する。実運用で「役員Aの今月分3件を1回の振込で精算」する典型ケース向け。
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
Body:
|
|
106
|
+
{
|
|
107
|
+
"reimbursement_ids": ["<uuid>", "<uuid>", ...], // 未精算の立替IDを1件以上
|
|
108
|
+
"settled_on": "YYYY-MM-DD",
|
|
109
|
+
"wallet_account_id": "<is_wallet=true の account uuid>"
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
仕訳 (合計1本):
|
|
113
|
+
(借) counterparty.default_payable_account sum(amounts) [counterparty_id=<立替者>]
|
|
114
|
+
(貸) wallet_account sum(amounts) [counterparty_id=<立替者>]
|
|
115
|
+
|
|
116
|
+
Response: { "settlement_entry_id": "<uuid>", "reimbursement_ids": ["<uuid>", ...] }
|
|
117
|
+
|
|
118
|
+
制約:
|
|
119
|
+
- すべての reimbursement が同一 counterparty に属すこと (混在不可)
|
|
120
|
+
- 全額精算のみ (部分精算は非対応)
|
|
121
|
+
|
|
122
|
+
主要エラー:
|
|
123
|
+
400 missing_required_fields — reimbursement_ids が空 / 必須項目欠落
|
|
124
|
+
400 multiple_counterparties — 異なる立替者が混在 (context.counterparty_ids)
|
|
125
|
+
400 not_a_wallet_account — 支払口座が is_wallet=false
|
|
126
|
+
404 reimbursement_not_found — 一部のIDが見つからない (context.missing_ids)
|
|
127
|
+
409 already_settled — 一部が既に精算済み (context.settled_ids)
|
|
128
|
+
409 period_closed — settled_on が締め済期間内
|
|
129
|
+
422 missing_default_payable_account — 立替者の貸方科目が未設定
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
データモデル: 精算仕訳と立替の関係は `accounting_reimbursement_settlements` (junction) で多対多管理される。単発 `/settle` 経由でも junction に行が書かれるため、補助元帳の集計クエリは junction を起点に書くと統一感が出る。`accounting_expense_reimbursements.settlement_journal_entry_id` は最後に紐付いた精算仕訳のポインタとして残る (後方互換用)。
|
|
133
|
+
|
|
100
134
|
### GET /api/accounting/expense-reimbursements
|
|
101
135
|
|
|
102
136
|
```
|
|
@@ -41,23 +41,27 @@
|
|
|
41
41
|
}
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
**手動仕訳 (manual) -
|
|
44
|
+
**手動仕訳 (manual) - 複合仕訳 (N行)。HQ UIでは新規取引フォームの「複合仕訳」タブから入力される:**
|
|
45
45
|
```
|
|
46
46
|
{
|
|
47
47
|
"entry_type": "manual",
|
|
48
48
|
"entry_date": "2026-05-25",
|
|
49
|
-
"description": "
|
|
49
|
+
"description": "給与支払 (5月分)",
|
|
50
50
|
"lines": [
|
|
51
|
-
{ "account_id": "
|
|
52
|
-
{ "account_id": "
|
|
51
|
+
{ "account_id": "<給料手当>", "debit": 300000, "credit": 0, "memo": "基本給", "counterparty_id": "..." },
|
|
52
|
+
{ "account_id": "<法定福利費>", "debit": 45000, "credit": 0, "memo": "社会保険料" },
|
|
53
|
+
{ "account_id": "<預り金>", "debit": 0, "credit": 25000, "memo": "源泉所得税" },
|
|
54
|
+
{ "account_id": "<普通預金>", "debit": 0, "credit": 320000, "memo": "振込" }
|
|
53
55
|
]
|
|
54
56
|
}
|
|
55
57
|
```
|
|
56
58
|
|
|
57
59
|
**注意点:**
|
|
58
|
-
- `lines` は **必ず2行以上** で **借方合計=貸方合計** であること(DB triggerで強制される)
|
|
60
|
+
- `lines` は **必ず2行以上** で **借方合計=貸方合計** であること (DB triggerで強制される)
|
|
61
|
+
- 各行は **`debit` または `credit` のいずれか一方のみが正の数** であること (両ゼロ・両正は400)
|
|
59
62
|
- `counterparty_id` は任意。付与すると補助元帳でその取引先の明細として集計される
|
|
60
|
-
-
|
|
63
|
+
- 一般社団法人プロファイルで収益/費用行の `dimensions.net_asset_restriction` を省略するとデフォルト値で埋められる (`general`)。明示指定したい場合は `dimensions` フィールドを付ける
|
|
64
|
+
- 「1枚のレシートに会議費と接待交際費が混在」「給与計算」「未払金の振替計上」など、income/expense/transfer の2行構造に収まらないケースで使う
|
|
61
65
|
|
|
62
66
|
```
|
|
63
67
|
Response: { "entry": {...} }
|
|
@@ -65,6 +69,9 @@ Response: { "entry": {...} }
|
|
|
65
69
|
400 entry_date and entry_type are required
|
|
66
70
|
400 at least 2 lines required
|
|
67
71
|
400 debit/credit must balance
|
|
72
|
+
400 manual entry requires at least 2 lines — lines 配列が短い
|
|
73
|
+
400 line[N]: exactly one of debit/credit must be positive — 行レベル不整合
|
|
74
|
+
400 指定された勘定科目がこの帳簿に存在しません — account_id が別 book / 削除済
|
|
68
75
|
409 period_closed
|
|
69
76
|
```
|
|
70
77
|
|
|
@@ -98,3 +105,4 @@ Response: { "entries": [{ ..., lines: [...] }] }
|
|
|
98
105
|
- **通常の経費は manual で複合仕訳を組まず、`expense` ですませる。** シンプルな分、間違いが少ない
|
|
99
106
|
- **立替経費は仕訳APIで組み立てず、必ず /expense-reimbursements を使う。** 自前で組むと「立替者」軸の集計ができない
|
|
100
107
|
- **dimensions の `net_asset_restriction`** は一般社団法人プロファイル時のみ意味あり。株式会社(corporation-jp)では空でOK
|
|
108
|
+
- **manual を使う判断基準**: 1取引イベントで3科目以上を同時に動かす必要があるとき (給与/源泉/振込のセット、1レシートを複数費用科目に按分 等)。2科目で済むなら income/expense/transfer のいずれかに当てはまる
|
package/win/routes/chat.js
CHANGED
|
@@ -452,7 +452,7 @@ async function buildContextPrefix(message, context, sessionId, workspaceId, refe
|
|
|
452
452
|
'[ファイル出力ルール]',
|
|
453
453
|
'成果物の保存先は以下のルールに従うこと。`/home/minion/` 直下にファイルを保存しないこと。',
|
|
454
454
|
'',
|
|
455
|
-
'- **テキスト成果物**(レポート、調査結果、要約等)→ ノートに保存: `hq note create <project_id> --title "タイトル" --content "本文"`',
|
|
455
|
+
'- **テキスト成果物**(レポート、調査結果、要約等)→ ノートに保存: `hq note create <project_id> --title "タイトル" --content "本文"` (プロジェクト紐づけなしは `hq note create --workspace <ws_id> ...`)',
|
|
456
456
|
'- **バイナリファイル**(PDF、画像、ZIP等)→ `~/files/` に配置(ユーザーがHQからダウンロード可能)',
|
|
457
457
|
'- **一時ファイル** → `/tmp/` に配置(作業後に削除)',
|
|
458
458
|
'',
|