owner-clone-ai-mcp 1.84.0 → 2.1.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/domains/knowledge.js +2 -1
- package/domains/projectOs.js +263 -0
- package/domains/video.js +2 -2
- package/index.js +5 -2
- package/package.json +1 -1
package/domains/knowledge.js
CHANGED
|
@@ -162,7 +162,8 @@ text_content(自由テキスト)か、content(カテゴリ別の構造化
|
|
|
162
162
|
description: 'カテゴリ',
|
|
163
163
|
enum: ['offer', 'product', 'profile', 'testimonial', 'persona', 'sns_blog', 'ad', 'mail', 'tone', 'other', 'note_manual', 'note_research', 'note_hint', 'note_article', 'note_meeting', 'image'],
|
|
164
164
|
},
|
|
165
|
-
folder_id: { type: 'string', description: 'フォルダID
|
|
165
|
+
folder_id: { type: 'string', description: 'フォルダID(省略可)。プロジェクト紐付きキーで省略すると、プロジェクトの「成果物の保存先フォルダ」が設定済みなら自動でそこに保存される' },
|
|
166
|
+
subfolder: { type: 'string', description: 'プロジェクトの成果物フォルダ内のサブフォルダ名(例: "調査", "原稿")。保存先フォルダ設定済み+folder_id省略時のみ有効。同名があれば再利用・無ければ自動作成=種類ごとに分かりやすく仕分けられる' },
|
|
166
167
|
tags: { type: 'array', items: { type: 'string' }, description: 'タグの配列(例: ["マーケティング", "集客"])省略可。省略時はタグなしで登録。' },
|
|
167
168
|
preserve_html_for_ai: { type: 'boolean', description: 'HTMLコードなどをプレーンテキストに変換せずAIがコード参照を可能にする。HTMLページ/コードを"成果物・中身"として保管しAIがそのまま参照・再編集できるようにする時に true(例: HTMLの納品物・コード)。false(既定)は装飾扱いでAIにはプレーンテキストで渡る。' },
|
|
168
169
|
},
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// プロジェクトOS — ゴール駆動のプロジェクト管理(docs/PROJECT_OS_PLAN.md §8/§14)
|
|
3
|
+
// Claude Code / Codex からの利用が主役(MCPファースト)。
|
|
4
|
+
// ⚠️ プロジェクト紐付きキーで接続している場合、project_id は省略可(キーから自動解決)。
|
|
5
|
+
// 別プロジェクトを指定すると 403(境界はサーバーが強制する)。
|
|
6
|
+
const { callApi } = require('../lib/api');
|
|
7
|
+
|
|
8
|
+
const tools = [
|
|
9
|
+
{
|
|
10
|
+
name: 'get_project_os_spec',
|
|
11
|
+
description: 'プロジェクトOSの仕様書(AIの作業手順・提案の種類・進捗の規則)を取得します。プロジェクト関連の操作を始める前に一度読んでください。',
|
|
12
|
+
annotations: { readOnlyHint: true },
|
|
13
|
+
inputSchema: { type: 'object', properties: {} },
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'get_project_context',
|
|
17
|
+
description: `プロジェクトの全体像を取得します(ゴールの木・進捗・停滞/期日超過・直近の動き・リソース棚・承認待ちの提案)。
|
|
18
|
+
|
|
19
|
+
■ level(トークン量の制御):
|
|
20
|
+
• brief — 木と要注意だけ(まず全体を掴む)
|
|
21
|
+
• standard — 標準(既定)
|
|
22
|
+
• full — 成果物・貯まったナレッジ込み
|
|
23
|
+
|
|
24
|
+
作業の基本フロー: get_project_context → get_goal_briefing → 作業 → complete_task / append_project_journal`,
|
|
25
|
+
annotations: { readOnlyHint: true },
|
|
26
|
+
inputSchema: { type: 'object', properties: {
|
|
27
|
+
project_id: { type: 'string', description: 'プロジェクトID(プロジェクト紐付きキーなら省略可)' },
|
|
28
|
+
level: { type: 'string', enum: ['brief', 'standard', 'full'] },
|
|
29
|
+
} },
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'get_goal_briefing',
|
|
33
|
+
description: 'ゴール1つの「作業指示書」を取得します(祖先の文脈・完了の基準・タスク・直近の決定・棚のナレッジ本文入り)。作業を始める前に必ず読んでください。',
|
|
34
|
+
annotations: { readOnlyHint: true },
|
|
35
|
+
inputSchema: { type: 'object', properties: {
|
|
36
|
+
goal_id: { type: 'string', description: 'ゴールID(get_project_context の goal_tree から)' },
|
|
37
|
+
}, required: ['goal_id'] },
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'complete_project_task',
|
|
41
|
+
description: `タスクを完了として報告します【書き込み権限付きキーが必要】。進捗がゴールの木を上に自動伝播し、残タスクと次の一手が返ります。
|
|
42
|
+
⚠️ result には「何をどう完了したか」と「done_criteria を満たした根拠」を書いてください(あとでナレッジに蒸留されます)。`,
|
|
43
|
+
annotations: { destructiveHint: false, idempotentHint: true },
|
|
44
|
+
inputSchema: { type: 'object', properties: {
|
|
45
|
+
task_id: { type: 'string' },
|
|
46
|
+
result: { type: 'string', description: '完了の内容と根拠' },
|
|
47
|
+
deliverable_refs: { type: 'array', items: { type: 'object' }, description: '成果物への参照(任意)' },
|
|
48
|
+
}, required: ['task_id'] },
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'append_project_journal',
|
|
52
|
+
description: `プロジェクトの航海日誌に記録を残します【書き込み権限付きキーが必要】。
|
|
53
|
+
kind: note=メモ / decision=決定 / result=経過・実行結果 / customer=顧客の声 / metric=数値
|
|
54
|
+
⚠️ 重要な進捗・判断は必ず書き残してください。日誌はあとでAIが「次も使える学び」としてナレッジに蒸留します。`,
|
|
55
|
+
annotations: { destructiveHint: false, idempotentHint: false },
|
|
56
|
+
inputSchema: { type: 'object', properties: {
|
|
57
|
+
project_id: { type: 'string', description: 'プロジェクト紐付きキーなら省略可' },
|
|
58
|
+
kind: { type: 'string', enum: ['note', 'decision', 'result', 'customer', 'metric'] },
|
|
59
|
+
title: { type: 'string' },
|
|
60
|
+
content: { type: 'string' },
|
|
61
|
+
goal_id: { type: 'string' },
|
|
62
|
+
}, required: ['kind', 'content'] },
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'propose_project_action',
|
|
66
|
+
description: `プロジェクトへの提案を登録します【書き込み権限付きキーが必要】。⚠️ 提案はユーザーの承認後に実行されます(AIが直接作らない)。
|
|
67
|
+
■ kind と payload:
|
|
68
|
+
• add_task — { title }
|
|
69
|
+
• add_goal — { title, purpose, done_criteria }
|
|
70
|
+
• create_resource — { resource_type: agent_preset|chatbot|funnel|workflow, config: { name, description } }
|
|
71
|
+
⚠️ 過去に却下された提案と同じ内容は再提案しないこと(却下理由は日誌にあります)。`,
|
|
72
|
+
annotations: { destructiveHint: false, idempotentHint: true },
|
|
73
|
+
inputSchema: { type: 'object', properties: {
|
|
74
|
+
project_id: { type: 'string', description: 'プロジェクト紐付きキーなら省略可' },
|
|
75
|
+
kind: { type: 'string', enum: ['add_task', 'add_goal', 'create_resource'] },
|
|
76
|
+
payload: { type: 'object' },
|
|
77
|
+
reason: { type: 'string', description: '承認する人が一目で判断できる理由' },
|
|
78
|
+
goal_id: { type: 'string' },
|
|
79
|
+
client_token: { type: 'string', description: '冪等キー(再試行の二重登録防止)' },
|
|
80
|
+
}, required: ['kind', 'payload'] },
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'list_project_proposals',
|
|
84
|
+
description: '提案一覧を取得します(承認待ち優先・却下済みも見える)。',
|
|
85
|
+
annotations: { readOnlyHint: true },
|
|
86
|
+
inputSchema: { type: 'object', properties: { project_id: { type: 'string' } } },
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'approve_project_proposal',
|
|
90
|
+
description: '提案を承認して実行します【書き込み権限付きキーが必要】。⚠️ ユーザーから明示的に「承認して」と言われたときだけ使ってください(自分の提案を自分で承認しない)。',
|
|
91
|
+
annotations: { destructiveHint: false, idempotentHint: false },
|
|
92
|
+
inputSchema: { type: 'object', properties: { proposal_id: { type: 'string' } }, required: ['proposal_id'] },
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'reject_project_proposal',
|
|
96
|
+
description: '提案を却下します【書き込み権限付きキーが必要】。理由は日誌に残り、AIが同じ提案を繰り返さない材料になります。',
|
|
97
|
+
annotations: { destructiveHint: false, idempotentHint: true },
|
|
98
|
+
inputSchema: { type: 'object', properties: {
|
|
99
|
+
proposal_id: { type: 'string' }, reason: { type: 'string' },
|
|
100
|
+
}, required: ['proposal_id'] },
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'plan_project_goals',
|
|
104
|
+
description: 'ゴールをAIで子ゴール・タスクに分解します【書き込み権限付きキーが必要】。結果は提案として登録され、承認後に木が立ちます。',
|
|
105
|
+
annotations: { destructiveHint: false, idempotentHint: true },
|
|
106
|
+
inputSchema: { type: 'object', properties: {
|
|
107
|
+
project_id: { type: 'string', description: 'プロジェクト紐付きキーなら省略可' },
|
|
108
|
+
goal_id: { type: 'string', description: '分解対象(省略時はルートゴール)' },
|
|
109
|
+
client_token: { type: 'string' },
|
|
110
|
+
} },
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'add_project_resource',
|
|
114
|
+
description: `プロジェクトのリソース棚に載せます【書き込み権限付きキーが必要】。AIは棚に載ったものだけを見ます(境界)。
|
|
115
|
+
resource_type: knowledge_item / knowledge_folder / agent_preset / chatbot / funnel / workflow / skill / slide_deck / video_project / analytics_sheet
|
|
116
|
+
role: reference(参照) / tool(道具) / output(成果物)`,
|
|
117
|
+
annotations: { destructiveHint: false, idempotentHint: true },
|
|
118
|
+
inputSchema: { type: 'object', properties: {
|
|
119
|
+
project_id: { type: 'string', description: 'プロジェクト紐付きキーなら省略可' },
|
|
120
|
+
resource_type: { type: 'string' },
|
|
121
|
+
resource_id: { type: 'string' },
|
|
122
|
+
role: { type: 'string', enum: ['reference', 'tool', 'output'] },
|
|
123
|
+
}, required: ['resource_type', 'resource_id'] },
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: 'set_project_output_folder',
|
|
127
|
+
description: `プロジェクトの「成果物の保存先フォルダ」を設定します【書き込み権限付きキーが必要】。
|
|
128
|
+
設定後は create_knowledge(folder_id未指定)がこのフォルダへ自動保存し、subfolder パラメータでサブフォルダ仕分けもできます。folder_id を省略すると解除(未分類に戻る)。`,
|
|
129
|
+
annotations: { destructiveHint: false, idempotentHint: true },
|
|
130
|
+
inputSchema: { type: 'object', properties: {
|
|
131
|
+
project_id: { type: 'string', description: 'プロジェクト紐付きキーなら省略可' },
|
|
132
|
+
folder_id: { type: 'string', description: 'ナレッジフォルダID(list_knowledge_folders で確認。省略=解除)' },
|
|
133
|
+
} },
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: 'distill_project_knowledge',
|
|
137
|
+
description: '航海日誌から「次も使える学び」をナレッジに整理します(蒸留)【書き込み権限付きキーが必要】。ゴール完了時は自動で走るため、ユーザーに頼まれたときだけ使ってください。',
|
|
138
|
+
annotations: { destructiveHint: false, idempotentHint: false },
|
|
139
|
+
inputSchema: { type: 'object', properties: { project_id: { type: 'string' } } },
|
|
140
|
+
},
|
|
141
|
+
];
|
|
142
|
+
|
|
143
|
+
const q = (args, keys) => {
|
|
144
|
+
const p = keys.filter(k => args && args[k] !== undefined && args[k] !== null)
|
|
145
|
+
.map(k => `${k}=${encodeURIComponent(args[k])}`).join('&');
|
|
146
|
+
return p ? `?${p}` : '';
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
function fmtTree(nodes, depth = 0) {
|
|
150
|
+
const lines = [];
|
|
151
|
+
for (const n of nodes || []) {
|
|
152
|
+
lines.push(`${' '.repeat(depth)}- [${n.id}] ${n.title}(${n.status}・${n.progress_pct || 0}%)${n.done_criteria ? ` 完了基準: ${n.done_criteria}` : ''}`);
|
|
153
|
+
for (const t of n.tasks || []) lines.push(`${' '.repeat(depth + 1)}☐ [task:${t.id}] ${t.title}(${t.status})`);
|
|
154
|
+
lines.push(...fmtTree(n.children, depth + 1));
|
|
155
|
+
}
|
|
156
|
+
return lines;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const handlers = {
|
|
160
|
+
async get_project_os_spec() {
|
|
161
|
+
const d = await callApi('/project-os/spec');
|
|
162
|
+
return d.spec;
|
|
163
|
+
},
|
|
164
|
+
async get_project_context(args = {}) {
|
|
165
|
+
const d = await callApi(`/project-os/context${q(args, ['project_id', 'level'])}`);
|
|
166
|
+
const out = [`# ${d.project.name}(level: ${d.level})`, '', '## ゴールの木', ...fmtTree(d.goal_tree)];
|
|
167
|
+
if (d.attention && (d.attention.stalled.length || d.attention.overdue.length)) {
|
|
168
|
+
out.push('', '## 要注意');
|
|
169
|
+
if (d.attention.overdue.length) out.push(`⚠ 期日超過: ${d.attention.overdue.join(' / ')}`);
|
|
170
|
+
if (d.attention.stalled.length) out.push(`⏸ 停滞: ${d.attention.stalled.join(' / ')}`);
|
|
171
|
+
}
|
|
172
|
+
if (d.pending_proposals && d.pending_proposals.length) {
|
|
173
|
+
out.push('', `## 承認待ちの提案(${d.pending_proposals.length}件)`);
|
|
174
|
+
for (const p of d.pending_proposals) out.push(`- [${p.id}] ${p.kind}: ${p.reason || ''}`);
|
|
175
|
+
}
|
|
176
|
+
if (d.resources && d.resources.length) {
|
|
177
|
+
out.push('', '## リソース棚');
|
|
178
|
+
for (const r of d.resources) out.push(`- ${r.resource_type}: ${r.name || r.resource_id}(${r.role}${r.added_by === 'ai' ? '・🤖' : ''})`);
|
|
179
|
+
}
|
|
180
|
+
if (d.recent_journal && d.recent_journal.length) {
|
|
181
|
+
out.push('', '## 直近の動き');
|
|
182
|
+
for (const e of d.recent_journal.slice(0, 10)) out.push(`- [${e.kind}/${e.actor}] ${e.title || ''} ${e.content || ''}`.trim());
|
|
183
|
+
}
|
|
184
|
+
out.push('', `➡ ${d.guide}`);
|
|
185
|
+
return out.join('\n');
|
|
186
|
+
},
|
|
187
|
+
async get_goal_briefing(args) {
|
|
188
|
+
const d = await callApi(`/project-os/goal-briefing/${args.goal_id}`);
|
|
189
|
+
const out = [`# 作業指示書: ${d.goal.title}`, '',
|
|
190
|
+
`プロジェクト: ${d.project.name}`,
|
|
191
|
+
d.ancestors.length ? `文脈: ${d.ancestors.map(a => a.title).join(' → ')} → このゴール` : '',
|
|
192
|
+
`目的: ${d.goal.purpose || '(未記入)'}`,
|
|
193
|
+
`★完了の基準: ${d.goal.done_criteria || '(未記入)'}`,
|
|
194
|
+
`進捗: ${d.goal.progress_pct || 0}%`, ''];
|
|
195
|
+
if (d.tasks.length) {
|
|
196
|
+
out.push('## タスク');
|
|
197
|
+
for (const t of d.tasks) out.push(`${['done', 'completed'].includes(t.status) ? '☑' : '☐'} [${t.id}] ${t.title}`);
|
|
198
|
+
}
|
|
199
|
+
if (d.recent_decisions.length) {
|
|
200
|
+
out.push('', '## 直近の決定(前提にすること)');
|
|
201
|
+
for (const x of d.recent_decisions) out.push(`- ${x.title}: ${x.content || ''}`);
|
|
202
|
+
}
|
|
203
|
+
if (d.knowledge.length) {
|
|
204
|
+
out.push('', '## 棚のナレッジ(本文)');
|
|
205
|
+
for (const k of d.knowledge) out.push(`### ${k.title}(${k.category})\n${k.body}`);
|
|
206
|
+
}
|
|
207
|
+
out.push('', `➡ ${d.guide}`);
|
|
208
|
+
return out.filter(x => x !== '').join('\n');
|
|
209
|
+
},
|
|
210
|
+
async complete_project_task(args) {
|
|
211
|
+
const d = await callApi('/project-os/complete-task', { method: 'POST', body: JSON.stringify(args) });
|
|
212
|
+
const out = [`✅ 完了: ${d.completed.title}`];
|
|
213
|
+
if (d.remaining_tasks.length) {
|
|
214
|
+
out.push('残りのタスク:');
|
|
215
|
+
for (const t of d.remaining_tasks) out.push(`☐ [${t.id}] ${t.title}`);
|
|
216
|
+
}
|
|
217
|
+
out.push(`➡ ${d.hint}`);
|
|
218
|
+
return out.join('\n');
|
|
219
|
+
},
|
|
220
|
+
async append_project_journal(args) {
|
|
221
|
+
const d = await callApi('/project-os/journal', { method: 'POST', body: JSON.stringify(args) });
|
|
222
|
+
return `✅ 日誌に記録しました(id: ${d.id})`;
|
|
223
|
+
},
|
|
224
|
+
async propose_project_action(args) {
|
|
225
|
+
const d = await callApi('/project-os/propose', { method: 'POST', body: JSON.stringify(args) });
|
|
226
|
+
return `${d.deduped ? '♻' : '✅'} ${d.message}\n提案ID: ${d.proposal.id}`;
|
|
227
|
+
},
|
|
228
|
+
async list_project_proposals(args = {}) {
|
|
229
|
+
const d = await callApi(`/project-os/proposals${q(args, ['project_id'])}`);
|
|
230
|
+
if (!d.proposals.length) return '提案はありません。';
|
|
231
|
+
return d.proposals.map(p =>
|
|
232
|
+
`- [${p.id}] ${p.status === 'pending' ? '⏸' : p.status} ${p.kind}: ${p.reason || ''}`).join('\n');
|
|
233
|
+
},
|
|
234
|
+
async approve_project_proposal(args) {
|
|
235
|
+
const d = await callApi(`/project-os/proposals/${args.proposal_id}/approve`, { method: 'POST' });
|
|
236
|
+
return `✅ 実行しました(${d.executed})\n結果: ${JSON.stringify(d.result)}`;
|
|
237
|
+
},
|
|
238
|
+
async reject_project_proposal(args) {
|
|
239
|
+
await callApi(`/project-os/proposals/${args.proposal_id}/reject`, { method: 'POST', body: JSON.stringify({ reason: args.reason }) });
|
|
240
|
+
return '✅ 却下しました(理由は日誌に残り、AIが同じ提案を繰り返さない材料になります)';
|
|
241
|
+
},
|
|
242
|
+
async plan_project_goals(args = {}) {
|
|
243
|
+
const d = await callApi('/project-os/plan-goals', { method: 'POST', body: JSON.stringify(args) });
|
|
244
|
+
return `${d.deduped ? '♻ 既存の提案を返します' : '✅ ' + d.message}\n提案ID: ${d.proposal.id}\n(list_project_proposals で内容確認・ユーザーの承認で実行)`;
|
|
245
|
+
},
|
|
246
|
+
async add_project_resource(args) {
|
|
247
|
+
const d = await callApi('/project-os/resources', { method: 'POST', body: JSON.stringify(args) });
|
|
248
|
+
return `✅ 棚に載せました: ${d.resource_type} ${d.resource_id}(${d.role})`;
|
|
249
|
+
},
|
|
250
|
+
async set_project_output_folder(args = {}) {
|
|
251
|
+
const d = await callApi('/project-os/output-folder', { method: 'POST', body: JSON.stringify(args) });
|
|
252
|
+
return d.output_folder_id
|
|
253
|
+
? `✅ 成果物の保存先を設定しました。${d.hint || ''}`
|
|
254
|
+
: '✅ 保存先を解除しました(未分類に保存されます)';
|
|
255
|
+
},
|
|
256
|
+
async distill_project_knowledge(args = {}) {
|
|
257
|
+
const d = await callApi('/project-os/distill', { method: 'POST', body: JSON.stringify(args) });
|
|
258
|
+
if (d.skipped) return `⏭ ${d.skipped}`;
|
|
259
|
+
return `✅ 学びを整理: ナレッジ${d.saved.length}件を保存\n${d.saved.map(s => `- ${s.title}(${s.category})`).join('\n')}`;
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
module.exports = { tools, handlers };
|
package/domains/video.js
CHANGED
|
@@ -173,11 +173,11 @@ const tools = [
|
|
|
173
173
|
},
|
|
174
174
|
{
|
|
175
175
|
name: 'patch_video_track',
|
|
176
|
-
description: '1つのトラックだけを差し替えます(タイムライン全体を送り直さなくて済むので安全・軽量)。テロップだけ直す・BGM
|
|
176
|
+
description: '1つのトラックだけを差し替えます(タイムライン全体を送り直さなくて済むので安全・軽量)。テロップだけ直す・BGMだけ足す・コーナー見出し(banner)を置く、といった部分更新に使ってください。コーナー見出し=ニュース番組の隅にあるテーマ表示で、テーマごとに start/duration を切って出しっぱなしにします(既定の位置は left 最優先の top-left)。形式は get_video_timeline_spec を参照。',
|
|
177
177
|
annotations: { destructiveHint: false },
|
|
178
178
|
inputSchema: { type: 'object', properties: {
|
|
179
179
|
id: { type: 'string', description: 'プロジェクトID' },
|
|
180
|
-
type: { type: 'string', enum: ['slides', 'audio', 'video', 'image', 'telop'], description:
|
|
180
|
+
type: { type: 'string', enum: ['slides', 'audio', 'video', 'image', 'telop', 'banner'], description: "対象トラックの種類。banner=コーナー見出し(画面の隅に出しっぱなしの見出し。テロップとは別物)" },
|
|
181
181
|
role: { type: 'string', description: '同じ種類が複数あるときの絞り込み(audio の voice / bgm)' },
|
|
182
182
|
media_id: { type: 'string', description: '同じ種類が複数あるときの絞り込み(mediaId)' },
|
|
183
183
|
clips: { type: 'array', items: { type: 'object' }, description: 'そのトラックのクリップ配列(全置換)。形式は get_video_timeline_spec' },
|
package/index.js
CHANGED
|
@@ -17,7 +17,10 @@ const workflows = require('./domains/workflows');
|
|
|
17
17
|
const chatbots = require('./domains/chatbots');
|
|
18
18
|
const schedulesAndTasks = require('./domains/schedulesAndTasks');
|
|
19
19
|
const projects = require('./domains/projects');
|
|
20
|
-
|
|
20
|
+
// ⚠️ brain は 2.0.0 で配布リストから除外(プロジェクトOSに統合・docs/PROJECT_OS_PLAN.md §15)。
|
|
21
|
+
// サーバー側の /v1/brain は旧版(1.x)利用者のため読み取りシムで残っている。
|
|
22
|
+
// const brain = require('./domains/brain');
|
|
23
|
+
const projectOs = require('./domains/projectOs');
|
|
21
24
|
const funnels = require('./domains/funnels');
|
|
22
25
|
const skills = require('./domains/skills');
|
|
23
26
|
const slides = require('./domains/slides');
|
|
@@ -27,7 +30,7 @@ const myasp = require('./domains/myasp');
|
|
|
27
30
|
const wordpress = require('./domains/wordpress');
|
|
28
31
|
const macbuil = require('./domains/macbuil');
|
|
29
32
|
|
|
30
|
-
const allDomains = [knowledge, agentPresets, workflows, chatbots, schedulesAndTasks, projects,
|
|
33
|
+
const allDomains = [knowledge, agentPresets, workflows, chatbots, schedulesAndTasks, projects, projectOs, funnels, skills, slides, video, analytics, myasp, wordpress, macbuil];
|
|
31
34
|
|
|
32
35
|
const TOOLS = allDomains.flatMap(d => d.tools);
|
|
33
36
|
const HANDLERS = Object.assign({}, ...allDomains.map(d => d.handlers));
|