ai-project-manage-cli 5.0.6 → 5.0.7
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/dist/index.js +63 -6
- package/package.json +1 -1
- package/template/AGENTS.md +22 -0
package/dist/index.js
CHANGED
|
@@ -88,6 +88,9 @@ function sessionRulePath(sessionId, apmRoot) {
|
|
|
88
88
|
function sessionYamlPath(sessionId, apmRoot) {
|
|
89
89
|
return join2(sessionDir(sessionId, apmRoot), "session.yaml");
|
|
90
90
|
}
|
|
91
|
+
function sessionMessagesXmlPath(sessionId, apmRoot) {
|
|
92
|
+
return join2(sessionDir(sessionId, apmRoot), "messages.xml");
|
|
93
|
+
}
|
|
91
94
|
function documentLocalFileName(platformName) {
|
|
92
95
|
const trimmed = platformName.trim();
|
|
93
96
|
if (!trimmed) return "document.md";
|
|
@@ -191,6 +194,10 @@ var requestConfig = {
|
|
|
191
194
|
method: "GET",
|
|
192
195
|
path: "/cli/sessions/members"
|
|
193
196
|
}),
|
|
197
|
+
listSessionMessages: defineEndpoint({
|
|
198
|
+
method: "GET",
|
|
199
|
+
path: "/cli/messages"
|
|
200
|
+
}),
|
|
194
201
|
listDocuments: defineEndpoint({
|
|
195
202
|
method: "GET",
|
|
196
203
|
path: "/cli/documents"
|
|
@@ -442,6 +449,48 @@ import { writeFileSync as writeFileSync4 } from "fs";
|
|
|
442
449
|
import { join as join5 } from "path";
|
|
443
450
|
import { stringify as yamlStringify } from "yaml";
|
|
444
451
|
|
|
452
|
+
// src/session-messages-xml.ts
|
|
453
|
+
function escapeXmlAttr(value) {
|
|
454
|
+
return value.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
|
|
455
|
+
}
|
|
456
|
+
function wrapCdata(value) {
|
|
457
|
+
return `<![CDATA[${value.replace(/]]>/g, "]]]]><![CDATA[>")}]]>`;
|
|
458
|
+
}
|
|
459
|
+
function optionalAttr(name, value) {
|
|
460
|
+
if (value == null || value === "") {
|
|
461
|
+
return "";
|
|
462
|
+
}
|
|
463
|
+
return ` ${name}="${escapeXmlAttr(value)}"`;
|
|
464
|
+
}
|
|
465
|
+
function formatSessionMessagesXml(sessionId, messages) {
|
|
466
|
+
const lines = [
|
|
467
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
468
|
+
`<messages sessionId="${escapeXmlAttr(sessionId)}">`
|
|
469
|
+
];
|
|
470
|
+
for (const message of messages) {
|
|
471
|
+
const attrs = [
|
|
472
|
+
`id="${escapeXmlAttr(message.id)}"`,
|
|
473
|
+
`senderId="${escapeXmlAttr(message.senderId)}"`,
|
|
474
|
+
message.sender ? `senderName="${escapeXmlAttr(message.sender.displayName)}"` : "",
|
|
475
|
+
message.sender ? `senderPosition="${escapeXmlAttr(message.sender.position)}"` : "",
|
|
476
|
+
message.sender ? `proxyMode="${escapeXmlAttr(message.sender.proxyMode)}"` : "",
|
|
477
|
+
`status="${escapeXmlAttr(message.status)}"`,
|
|
478
|
+
`createdAt="${escapeXmlAttr(message.createdAt)}"`,
|
|
479
|
+
`contentUpdatedAt="${escapeXmlAttr(message.contentUpdatedAt)}"`
|
|
480
|
+
].filter(Boolean).join(" ");
|
|
481
|
+
lines.push(
|
|
482
|
+
` <message ${attrs}${optionalAttr(
|
|
483
|
+
"roundId",
|
|
484
|
+
message.roundId
|
|
485
|
+
)}${optionalAttr("sentAt", message.sentAt)}>`,
|
|
486
|
+
` <content>${wrapCdata(message.content)}</content>`,
|
|
487
|
+
" </message>"
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
lines.push("</messages>", "");
|
|
491
|
+
return lines.join("\n");
|
|
492
|
+
}
|
|
493
|
+
|
|
445
494
|
// src/commands/sync-session-attachments.ts
|
|
446
495
|
import { writeFileSync as writeFileSync3 } from "fs";
|
|
447
496
|
import { join as join4 } from "path";
|
|
@@ -482,12 +531,15 @@ async function runPull(sessionId, apmRoot) {
|
|
|
482
531
|
}
|
|
483
532
|
const cfg = await ensureLoggedConfig();
|
|
484
533
|
const api = createApmApiClient(cfg);
|
|
485
|
-
const [detail, members, documents, attachments] = await Promise.all(
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
534
|
+
const [detail, members, documents, attachments, messages] = await Promise.all(
|
|
535
|
+
[
|
|
536
|
+
api.cli.sessionDetail({ sessionId: trimmedId }),
|
|
537
|
+
api.cli.sessionMembers({ sessionId: trimmedId }),
|
|
538
|
+
api.cli.listDocuments({ sessionId: trimmedId }),
|
|
539
|
+
api.cli.listAttachments({ sessionId: trimmedId }),
|
|
540
|
+
api.cli.listSessionMessages({ sessionId: trimmedId })
|
|
541
|
+
]
|
|
542
|
+
);
|
|
491
543
|
const dir = sessionDir(trimmedId, apmRoot);
|
|
492
544
|
const docsDir = sessionDocsDir(trimmedId, apmRoot);
|
|
493
545
|
await ensureDirExists(docsDir);
|
|
@@ -521,6 +573,11 @@ async function runPull(sessionId, apmRoot) {
|
|
|
521
573
|
`,
|
|
522
574
|
"utf8"
|
|
523
575
|
);
|
|
576
|
+
writeFileSync4(
|
|
577
|
+
sessionMessagesXmlPath(trimmedId, apmRoot),
|
|
578
|
+
formatSessionMessagesXml(trimmedId, messages),
|
|
579
|
+
"utf8"
|
|
580
|
+
);
|
|
524
581
|
await syncSessionAttachments(cfg, trimmedId, attachments, apmRoot);
|
|
525
582
|
console.log(`[apm] \u5DF2\u540C\u6B65\u4F1A\u8BDD\u5DE5\u4F5C\u533A: ${dir}`);
|
|
526
583
|
return dir;
|
package/package.json
CHANGED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
## APM 指南
|
|
2
|
+
|
|
3
|
+
### 回复消息命令
|
|
4
|
+
|
|
5
|
+
- 命令: `apm append-message --id=<消息ID> --content=<消息内容>`
|
|
6
|
+
- 注意事项:如果消息内容中包含文档地址,不要把前缀也写出来,直接用文档名称即可,并且文档名称要用倒引号包裹
|
|
7
|
+
|
|
8
|
+
### 创建/更新群文档命令
|
|
9
|
+
|
|
10
|
+
- 命令: `apm sync-document <会话ID> --file <文档名称>`
|
|
11
|
+
- 注意事项:文档名称是指`.apm/sessions/<会话ID>/` 这个目录下的某个文档,参数直接文档名称,比如 PRD.md。
|
|
12
|
+
|
|
13
|
+
## 工作流程
|
|
14
|
+
|
|
15
|
+
- 读取 `.apm/sessions/<会话ID>/session.yaml`,必要时读取`messages.xml` 了解当前会话状态与历史消息
|
|
16
|
+
- 根据用户提示找到你对应的人设(system_persona)
|
|
17
|
+
- 根据人设完成用户指定的任务
|
|
18
|
+
|
|
19
|
+
## 目录声明
|
|
20
|
+
|
|
21
|
+
- 技能目录: ./skills
|
|
22
|
+
- 群文档目录: ./sessions/<会话 ID>/docs
|