chainlesschain 0.162.130 → 0.162.131
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/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DlBanM-D.js → AIOps-2KUTHQX_.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-yoBaBWJy.js → ActionButton-L7_IhqNu.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BmrOyYD0.js → Analytics-CUixECiG.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-GFuM9A3X.js → AppLayout-Dpe2haDQ.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-XknQ2_0O.js → Audit-CnRXY9qp.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B1iEUtGw.js → Backup-C0JsfiNs.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Be6KNmhp.js → BaseInput-Cu__ZKoW.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DwsFF4yj.js → Chat-CBFYmY92.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Dw1_CWh4.js → ChatBubbleRenderer-Df45RqwP.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CJMgWRaw.js → Checkbox-Brs6y0pv.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DmUTxgww.js → Codegen-DvIDK2R6.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DKiqcZD4.js → Col-BY1bz9zm.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DwkBuQJ9.js → Community-Du0uBY_j.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-ClnINh4j.js → Compact-CxkCfnD4.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CiT8aABn.js → Compliance-DI4GSvYO.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CSdl80o1.js → Cowork-BaBiaYNG.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-EpM2_dN5.js → Cron-By787-AO.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-D0k0wjwX.js → Crosschain-D06BizgW.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CC4U6GEI.js → DID-CaE65NYK.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CxHIpA4F.js → Dashboard-BEk1ucNb.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-z6Y524uk.js → Dropdown-Depeqs8h.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bs_NxIAQ.js → EmailListRenderer-BA1AKXFR.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BdMikomZ.js → FamilyGuardDashboard-BZFbC7Cx.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BaBybFmU.js → Federation-8yPwScKv.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-bOifggcW.js → FormItemContext-BVy_AKdW.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BEhi1SaZ.js → GenericCardRenderer-D7kFe3QM.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BoISA30j.js → Git-BI_taCzW.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-D8XZcZmr.js → Governance-DIOg1O6M.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DF0zfQ35.js → Inference-CSL-isQ_.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Bx28A0s9.js → KnowledgeGraph-iCn8Fvmf.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CxP6elqM.js → Logs-YMjpW89s.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-BhyVR9xn.js → Marketplace--fNmNRri.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-TYU8DcM5.js → McpTools-DGaQOFxN.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-UDwDvKuv.js → Memory-DNjUfk5O.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DEa4DTPm.js → MobileBridge-Ce2Pn2oK.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BU-T_VO4.js → MobileProjects-DaNhq1_x.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-hYAzBWQi.js → Mtc-Htf1b8xE.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-0417bzil.js → MtcAudit-2IIu0OB3.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-C8mNrESc.js → Multisig-BMAUzfxj.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Cq73NSD-.js → NLProgramming-DsPldroh.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CuyXdYfG.js → Notes-COLd7vCP.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-4dP5jtLG.js → NotificationSettings-CNzZtI_o.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BlFX_WW9.js → OrderTableRenderer-6NPy-YHQ.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DM8-EgzR.js → Organization-DSNHsR4a.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-B9pMMIE8.js → Overflow-BcAYe_TB.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CNxt3m8G.js → P2P-B9XhsIKr.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BbppiJQa.js → PdhVaultBrowser-BR0GWf23.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CkbU4k5w.js → Permissions-Css2FapO.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CTP1cWxo.js → PersonalDataHub-DjRdBk_h.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-DOXykOA8.js → Pipeline-Cv6hncIf.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BWrp8ZRY.js → Privacy-vDC68AoW.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-B6OQPTTl.js → ProjectInit-mkoQhgMU.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CYu0yAVQ.js → ProjectSettings-Byl3RnMM.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Dcu-tF8M.js → Projects-CILs2XYD.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-mR6PwgKV.js → Providers-BCrc0doI.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-EWtGuBnr.js → QuickAsk-Dt4oMuVS.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-YKMSZwfC.js → Recommend-BERAt_xe.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-yK5aobGy.js → Reputation-BKMmJ1ht.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D1s181ke.js → Row-DtGT9VXo.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DVoFZ5kC.js → RssFeed-CU_HDGRB.js} +2 -2
- package/src/assets/web-panel/assets/{Search-CN4DO-B5.js → Search-Df58g7IV.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DU7zt02X.js → Security-Cf9gGz78.js} +4 -4
- package/src/assets/web-panel/assets/{Services-ithSFJ8m.js → Services-epoiecXf.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-AdnDEpv-.js → Skeleton-C9675HRM.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DbzSM7vB.js → Skills-DnGvHN3A.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DX54_u0l.js → Sla-DRwsKeYG.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CRHZuDqy.js → SpeechSettings-DqBcNvXF.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DbFnDg_K.js → SyncSettings-CR50CALR.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Dhsmw2CQ.js → Tasks-ncUrJWWO.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DeBl9D2A.js → Templates-CWjIynfa.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CF-RiJ0g.js → Tenant-CpIyHDJJ.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-_66-j6JZ.js → Terminal-BVUShXlx.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-9RbokKX3.js → TimelineRenderer-C0ovMDh_.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Bv1_BfYT.js → Tokens-BJJfEvw7.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CCYW_wGy.js → Trigger-nDr3aXXM.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-C8NW132a.js → Trust-DBfuYxaI.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C4VPSFe9.js → UkeySign-DTUTMPJd.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-1zzclNfS.js → VideoEditing-CQqkMpBR.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DafZQtOh.js → Wallet-84mblhC7.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-we7YNPUy.js → WebAuthn-xH8iwuYw.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-C0ufqV_h.js → WorkflowEditor-BAdP685p.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D-OyV5Td.js → chat-BG05UmOG.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DfY_daVD.js → colors-B--izi6g.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BZGEQaH7.js → compact-item-mhINqcNr.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-Ha9KgHfb.js → createContext-BxF4heyS.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-B-PQddh3.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DGcsqYDb.js → hasIn-k6zp6JXy.js} +1 -1
- package/src/assets/web-panel/assets/{index--WXQ2y49.js → index-ALaGUTBj.js} +1 -1
- package/src/assets/web-panel/assets/index-B8dJqRve.js +1 -0
- package/src/assets/web-panel/assets/{index-CaQ_9au2.js → index-BQTN9owK.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6Lk_-uR.js → index-Bm4EqCGD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BdYrVSXl.js → index-BmqTrBA9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCWbpajj.js → index-BptC59Nw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhX3LQ5F.js → index-BpxmdKly.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5t-g1rX.js → index-Bz_W2HMQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dw0NH-KM.js → index-C3T_jBxU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCMhrAQQ.js → index-C7E33Rtr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DihK8yMW.js → index-C8YjdEoE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DNHsZmjx.js → index-C9uMHXAU.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8304Ulf.js → index-CDgK11Jy.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYnWmaCw.js → index-CQ4ARcWQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcaG1Gci.js → index-CZY1CcMi.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiHUtyKj.js → index-C_PP2xgo.js} +1 -1
- package/src/assets/web-panel/assets/{index-ybjPuUmk.js → index-CaOJtN9_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNRFSxql.js → index-Cf1HBQJD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvJxHGRq.js → index-ClLYJ9Lr.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4PD8V1s.js → index-D22mMJcM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZU8HRgG.js → index-D4it444p.js} +3 -3
- package/src/assets/web-panel/assets/{index-CZ18sJL-.js → index-D50R_x2q.js} +1 -1
- package/src/assets/web-panel/assets/index-DA_QbRy1.js +1 -0
- package/src/assets/web-panel/assets/{index-Da-1E5Dk.js → index-DBeRyDo3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cn6dP-P7.js → index-DIfHlmg5.js} +1 -1
- package/src/assets/web-panel/assets/{index-LODjH1N_.js → index-DJ7voWn9.js} +1 -1
- package/src/assets/web-panel/assets/{index-42LImEfZ.js → index-DYDTWu56.js} +1 -1
- package/src/assets/web-panel/assets/{index-gTYJ-BfG.js → index-DZhH_4lu.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsdgGEmW.js → index-DbJ9HYUz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvhP7rmX.js → index-DcIEV2W9.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5Jgl_3A.js → index-DkGO_kL_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLAWGH1Z.js → index-DoIbLP_2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMggRtTA.js → index-Dut5fnts.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiPMeSUC.js → index-Dy6draCr.js} +1 -1
- package/src/assets/web-panel/assets/{index-i7FGX3Og.js → index-Hrtyb8g4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DN6Qj7JH.js → index-NufO1jVs.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvCAWCE_.js → index-YVGxF1lz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCDaH6SF.js → index-ptTT_8Cw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDDEWfQx.js → index-tgxfNjRl.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B5HHTM2M.js → initDefaultProps-BRO1fie3.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BGMk0sIO.js → motion-B0PeqWDm.js} +1 -1
- package/src/assets/web-panel/assets/{move-5FLoyfX1.js → move-DaFHMz5S.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DJl_jRfZ.js → mtc-parser-CwRq1H46.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Db-_WlEN.js → omit-BoixPnCY.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DsZsLkAT.js → pickAttrs-CtG4UyHs.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-M5UE9Uuc.js → placementArrow-CGzpdN2U.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-c4k_3oW2.js → responsiveObserve-DxtcM-r9.js} +1 -1
- package/src/assets/web-panel/assets/{slide-Bk5r7ti1.js → slide-oAHegf3-.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CKIS5RY_.js → statusUtils-Ddl5dLe-.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BYIaM5uH.js → styleChecker-4gYXGrlZ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CcjrBzHi.js → useFlexGapSupport-DB-sP5mv.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CkMOMjsE.js → useFs-cROlRg8N.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-Djl3wiRP.js → usePersonalDataHub-COtU3A5K.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-V3dEKndy.js → vnode-Cz2bZGdQ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DroVkKDe.js → zoom-zhr1SK6Y.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agents.js +15 -28
- package/src/lib/agents.js +57 -0
- package/src/repl/add-dir.js +73 -0
- package/src/repl/agent-repl.js +311 -1
- package/src/repl/agents-status.js +122 -0
- package/src/repl/hooks-status.js +67 -0
- package/src/repl/pr-comments.js +197 -0
- package/src/repl/release-notes.js +29 -0
- package/src/repl/status-summary.js +33 -0
- package/src/repl/todos-status.js +65 -0
- package/src/assets/web-panel/assets/devWarning-CnWCtTRg.js +0 -1
- package/src/assets/web-panel/assets/index-35rCdAfK.js +0 -1
- package/src/assets/web-panel/assets/index-DN16qFHw.js +0 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/pr-comments` REPL command (Claude-Code parity) — fetch a GitHub pull
|
|
3
|
+
* request's review summaries, conversation comments and inline code comments
|
|
4
|
+
* via the `gh` CLI, format them, and feed the block back as this turn's input
|
|
5
|
+
* so the agent can address the feedback.
|
|
6
|
+
*
|
|
7
|
+
* The pure pieces (parse args + format) are unit-tested; the `gh` calls go
|
|
8
|
+
* through an injected `runGh` so fetchPrComments is testable without a network
|
|
9
|
+
* or a real repo. The REPL (agent-repl.js) wires expandPrComments into the
|
|
10
|
+
* same promptText seam that `/mcp__server__prompt` uses.
|
|
11
|
+
*/
|
|
12
|
+
import { execFile } from "child_process";
|
|
13
|
+
|
|
14
|
+
/** Default `gh` runner — resolves stdout, rejects with a friendly message. */
|
|
15
|
+
function defaultRunGh(args) {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
execFile(
|
|
18
|
+
"gh",
|
|
19
|
+
args,
|
|
20
|
+
{ encoding: "utf-8", maxBuffer: 16 * 1024 * 1024 },
|
|
21
|
+
(err, stdout, stderr) => {
|
|
22
|
+
if (err) {
|
|
23
|
+
if (err.code === "ENOENT") {
|
|
24
|
+
return reject(
|
|
25
|
+
new Error(
|
|
26
|
+
"gh CLI not found — install GitHub CLI (https://cli.github.com) and run `gh auth login`.",
|
|
27
|
+
),
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return reject(
|
|
31
|
+
new Error(String(stderr || err.message || "gh failed").trim()),
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
resolve(stdout);
|
|
35
|
+
},
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Parse `/pr-comments [<n>|<url>] [--repo owner/name]`.
|
|
42
|
+
* @returns {{ pr: number|null, repo: string|null }}
|
|
43
|
+
*/
|
|
44
|
+
export function parsePrCommentsArg(line) {
|
|
45
|
+
const rest = String(line || "")
|
|
46
|
+
.trim()
|
|
47
|
+
.replace(/^\/pr-comments\b/, "")
|
|
48
|
+
.trim();
|
|
49
|
+
let pr = null;
|
|
50
|
+
let repo = null;
|
|
51
|
+
const tokens = rest.length ? rest.split(/\s+/) : [];
|
|
52
|
+
for (let i = 0; i < tokens.length; i += 1) {
|
|
53
|
+
const t = tokens[i];
|
|
54
|
+
if (t === "--repo" || t === "-R") {
|
|
55
|
+
repo = tokens[i + 1] || null;
|
|
56
|
+
i += 1;
|
|
57
|
+
} else if (/^\d+$/.test(t)) {
|
|
58
|
+
pr = Number(t);
|
|
59
|
+
} else {
|
|
60
|
+
const m = /github\.com\/([^/]+\/[^/]+)\/pull\/(\d+)/.exec(t);
|
|
61
|
+
if (m) {
|
|
62
|
+
repo = repo || m[1];
|
|
63
|
+
pr = pr ?? Number(m[2]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { pr, repo };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Indent a (possibly multi-line) comment body under its header. */
|
|
71
|
+
function indentBody(body, indent = " ") {
|
|
72
|
+
const text = String(body || "").trim();
|
|
73
|
+
if (!text) return `${indent}(empty)`;
|
|
74
|
+
return text
|
|
75
|
+
.split(/\r?\n/)
|
|
76
|
+
.map((l) => indent + l)
|
|
77
|
+
.join("\n");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Format fetched PR comment data into a plain-text block.
|
|
82
|
+
* @param {object} data { number, title, url, reviews[], conversation[], inline[] }
|
|
83
|
+
*/
|
|
84
|
+
export function formatPrComments(data) {
|
|
85
|
+
const number = data?.number;
|
|
86
|
+
const reviews = (Array.isArray(data?.reviews) ? data.reviews : []).filter(
|
|
87
|
+
(r) => (r?.body && r.body.trim()) || (r?.state && r.state !== "COMMENTED"),
|
|
88
|
+
);
|
|
89
|
+
const conv = Array.isArray(data?.conversation) ? data.conversation : [];
|
|
90
|
+
const inline = Array.isArray(data?.inline) ? data.inline : [];
|
|
91
|
+
|
|
92
|
+
const lines = [`PR #${number ?? "?"} — ${data?.title || "(no title)"}`];
|
|
93
|
+
if (data?.url) lines.push(data.url);
|
|
94
|
+
|
|
95
|
+
lines.push("", `Reviews (${reviews.length}):`);
|
|
96
|
+
for (const r of reviews) {
|
|
97
|
+
const who = r?.author?.login || r?.user?.login || "?";
|
|
98
|
+
lines.push(` @${who} ${r?.state || ""}`.trimEnd());
|
|
99
|
+
if (r?.body && r.body.trim()) lines.push(indentBody(r.body));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
lines.push("", `Conversation comments (${conv.length}):`);
|
|
103
|
+
for (const c of conv) {
|
|
104
|
+
const who = c?.author?.login || c?.user?.login || "?";
|
|
105
|
+
lines.push(` @${who}:`);
|
|
106
|
+
lines.push(indentBody(c?.body));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
lines.push("", `Inline code comments (${inline.length}):`);
|
|
110
|
+
for (const c of inline) {
|
|
111
|
+
const who = c?.user?.login || c?.author?.login || "?";
|
|
112
|
+
const lineNo = c?.line ?? c?.original_line;
|
|
113
|
+
const loc = c?.path
|
|
114
|
+
? `${c.path}${lineNo != null ? ":" + lineNo : ""}`
|
|
115
|
+
: "?";
|
|
116
|
+
lines.push(` ${loc} @${who}:`);
|
|
117
|
+
lines.push(indentBody(c?.body));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return lines.join("\n");
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Fetch a PR's reviews + conversation + inline comments via `gh`.
|
|
125
|
+
* @param {object} opts { pr?: number, repo?: string, deps?: { runGh } }
|
|
126
|
+
*/
|
|
127
|
+
export async function fetchPrComments({ pr = null, repo = null, deps } = {}) {
|
|
128
|
+
const runGh = deps?.runGh || defaultRunGh;
|
|
129
|
+
const viewArgs = ["pr", "view"];
|
|
130
|
+
if (pr) viewArgs.push(String(pr));
|
|
131
|
+
if (repo) viewArgs.push("--repo", repo);
|
|
132
|
+
viewArgs.push("--json", "number,title,url,comments,reviews");
|
|
133
|
+
const meta = JSON.parse(await runGh(viewArgs));
|
|
134
|
+
const number = meta?.number;
|
|
135
|
+
|
|
136
|
+
let ownerRepo = repo;
|
|
137
|
+
if (!ownerRepo) {
|
|
138
|
+
const m = /github\.com\/([^/]+\/[^/]+)\/pull\//.exec(meta?.url || "");
|
|
139
|
+
ownerRepo = m ? m[1] : null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
let inline = [];
|
|
143
|
+
if (ownerRepo && number) {
|
|
144
|
+
try {
|
|
145
|
+
const raw = await runGh([
|
|
146
|
+
"api",
|
|
147
|
+
`repos/${ownerRepo}/pulls/${number}/comments?per_page=100`,
|
|
148
|
+
]);
|
|
149
|
+
const parsed = JSON.parse(raw);
|
|
150
|
+
if (Array.isArray(parsed)) inline = parsed;
|
|
151
|
+
} catch {
|
|
152
|
+
// inline review-thread comments are best-effort; the JSON view above is
|
|
153
|
+
// the primary source.
|
|
154
|
+
inline = [];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
number,
|
|
160
|
+
title: meta?.title,
|
|
161
|
+
url: meta?.url,
|
|
162
|
+
reviews: Array.isArray(meta?.reviews) ? meta.reviews : [],
|
|
163
|
+
conversation: Array.isArray(meta?.comments) ? meta.comments : [],
|
|
164
|
+
inline,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const PR_INSTRUCTION =
|
|
169
|
+
"下面是该 PR 的评审意见(reviews / 评论 / 行内代码评论)。请逐条理解并处理:" +
|
|
170
|
+
"能直接改的就改代码,需要讨论或澄清的给出回应。";
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Expand a `/pr-comments …` line into turn input. Returns
|
|
174
|
+
* `{ number, count, block, text }`, or `null` when the line isn't the command.
|
|
175
|
+
* Throws on fetch failure (the REPL surfaces it and skips the turn).
|
|
176
|
+
*/
|
|
177
|
+
export async function expandPrComments(line, { deps } = {}) {
|
|
178
|
+
if (
|
|
179
|
+
!String(line || "")
|
|
180
|
+
.trim()
|
|
181
|
+
.startsWith("/pr-comments")
|
|
182
|
+
)
|
|
183
|
+
return null;
|
|
184
|
+
const { pr, repo } = parsePrCommentsArg(line);
|
|
185
|
+
const data = await fetchPrComments({ pr, repo, deps });
|
|
186
|
+
const block = formatPrComments(data);
|
|
187
|
+
const count =
|
|
188
|
+
(data.reviews?.length || 0) +
|
|
189
|
+
(data.conversation?.length || 0) +
|
|
190
|
+
(data.inline?.length || 0);
|
|
191
|
+
return {
|
|
192
|
+
number: data.number,
|
|
193
|
+
count,
|
|
194
|
+
block,
|
|
195
|
+
text: `${PR_INSTRUCTION}\n\n${block}`,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/release-notes` REPL command — show the running cc version and point at the
|
|
3
|
+
* full changelog (Claude-Code parity). The npm package ships only bin/ + src/ +
|
|
4
|
+
* README, so rather than bundle a copy of the changelog that would go stale, we
|
|
5
|
+
* surface a reliable pointer to the canonical sources + how to upgrade.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export const CHANGELOG_URL = "https://docs.chainlesschain.com/changelog";
|
|
9
|
+
export const RELEASES_URL =
|
|
10
|
+
"https://github.com/chainlesschain/chainlesschain/releases";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param {object} info { version, installedVersion }
|
|
14
|
+
*/
|
|
15
|
+
export function formatReleaseNotes(info = {}) {
|
|
16
|
+
const lines = [`cc ${info.version || "?"}`];
|
|
17
|
+
if (info.installedVersion && info.installedVersion !== info.version) {
|
|
18
|
+
lines.push(` (disk ${info.installedVersion} — restart to apply)`);
|
|
19
|
+
}
|
|
20
|
+
lines.push(
|
|
21
|
+
"",
|
|
22
|
+
"What's new / 完整更新日志:",
|
|
23
|
+
` ${CHANGELOG_URL}`,
|
|
24
|
+
` ${RELEASES_URL}`,
|
|
25
|
+
"",
|
|
26
|
+
"检查更新 / 升级: cc update · npm i -g chainlesschain",
|
|
27
|
+
);
|
|
28
|
+
return lines.join("\n");
|
|
29
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/status` REPL command — a concise environment snapshot (Claude-Code parity,
|
|
3
|
+
* minus the account/billing bits cc doesn't have). Lighter than `/doctor`'s
|
|
4
|
+
* health check: just "where am I" — version, model, session, cwd, roots, and
|
|
5
|
+
* connection counts. Pure renderer; the REPL gathers the live info.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @param {object} info
|
|
10
|
+
* version, installedVersion, node, platform, provider, model, sessionId,
|
|
11
|
+
* messageCount, cwd, extraRoots, ideConnected, mcpServers, hookEvents
|
|
12
|
+
*/
|
|
13
|
+
export function formatStatus(info = {}) {
|
|
14
|
+
const ver =
|
|
15
|
+
info.installedVersion && info.installedVersion !== info.version
|
|
16
|
+
? `cc ${info.version} (disk ${info.installedVersion} — restart to apply)`
|
|
17
|
+
: `cc ${info.version || "?"}`;
|
|
18
|
+
const lines = [
|
|
19
|
+
`${ver} · node ${info.node || "?"} · ${info.platform || "?"}`,
|
|
20
|
+
` provider/model: ${info.provider || "?"} / ${info.model || "?"}`,
|
|
21
|
+
` session: ${info.sessionId || "(none)"} · messages: ${info.messageCount ?? 0}`,
|
|
22
|
+
` cwd: ${info.cwd || "?"}`,
|
|
23
|
+
];
|
|
24
|
+
if (info.extraRoots > 0) {
|
|
25
|
+
lines.push(` extra roots: +${info.extraRoots} (/add-dir)`);
|
|
26
|
+
}
|
|
27
|
+
lines.push(
|
|
28
|
+
` IDE: ${info.ideConnected ? "connected" : "none"} · ` +
|
|
29
|
+
`MCP: ${info.mcpServers || 0} server(s) · ` +
|
|
30
|
+
`hooks: ${info.hookEvents || 0} event(s)`,
|
|
31
|
+
);
|
|
32
|
+
return lines.join("\n");
|
|
33
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure renderer for the `/todos` REPL command — a user-facing view of the
|
|
3
|
+
* agent's session TODO list (the one it maintains with the `todo_write` tool).
|
|
4
|
+
* The data comes from todo-manager's getTodos(sessionId); this module only
|
|
5
|
+
* formats it, so it stays deterministic and unit-testable.
|
|
6
|
+
*
|
|
7
|
+
* The agent uses todos to track multi-step work; before this command they were
|
|
8
|
+
* only visible to the model. `/todos` surfaces them to the human, the way
|
|
9
|
+
* Claude Code's /todos view does.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** A short status badge for one todo item. */
|
|
13
|
+
export function todoStatusLabel(status) {
|
|
14
|
+
switch (status) {
|
|
15
|
+
case "in_progress":
|
|
16
|
+
return "▶ in progress";
|
|
17
|
+
case "completed":
|
|
18
|
+
return "✓ done";
|
|
19
|
+
case "cancelled":
|
|
20
|
+
return "✗ cancelled";
|
|
21
|
+
case "pending":
|
|
22
|
+
return "☐ pending";
|
|
23
|
+
default:
|
|
24
|
+
return status || "?";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Count items by status (tolerant of unknown statuses). */
|
|
29
|
+
export function summarize(todos) {
|
|
30
|
+
const counts = { pending: 0, in_progress: 0, completed: 0, cancelled: 0 };
|
|
31
|
+
for (const t of Array.isArray(todos) ? todos : []) {
|
|
32
|
+
if (counts[t?.status] !== undefined) counts[t.status] += 1;
|
|
33
|
+
}
|
|
34
|
+
return counts;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Render the session TODO list as a plain-text block.
|
|
39
|
+
* @param {Array} todos from getTodos(sessionId): [{ id, content, status }]
|
|
40
|
+
*/
|
|
41
|
+
export function formatTodos(todos) {
|
|
42
|
+
const list = Array.isArray(todos) ? todos : [];
|
|
43
|
+
if (list.length === 0) {
|
|
44
|
+
return (
|
|
45
|
+
"No TODOs for this session.\n" +
|
|
46
|
+
" (The agent tracks multi-step work with the todo_write tool — " +
|
|
47
|
+
"they appear here once it creates some.)"
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
const c = summarize(list);
|
|
51
|
+
const lines = [
|
|
52
|
+
`Session TODOs (${list.length}: ${c.completed} done, ` +
|
|
53
|
+
`${c.in_progress} in progress, ${c.pending} pending` +
|
|
54
|
+
(c.cancelled ? `, ${c.cancelled} cancelled` : "") +
|
|
55
|
+
`):`,
|
|
56
|
+
];
|
|
57
|
+
for (const t of list) {
|
|
58
|
+
const content = String(t?.content || "")
|
|
59
|
+
.replace(/\s+/g, " ")
|
|
60
|
+
.trim();
|
|
61
|
+
const short = content.length > 80 ? content.slice(0, 80) + "…" : content;
|
|
62
|
+
lines.push(` ${todoStatusLabel(t?.status)} ${short}`);
|
|
63
|
+
}
|
|
64
|
+
return lines.join("\n");
|
|
65
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{R as r}from"./index-DZU8HRgG.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-D1s181ke.js";import{a0 as t}from"./index-DZU8HRgG.js";import"./vendor-BvqAck49.js";import"./responsiveObserve-c4k_3oW2.js";import"./useFlexGapSupport-CcjrBzHi.js";import"./styleChecker-BYIaM5uH.js";import"./index-CcaG1Gci.js";import"./icons-DP3uiYxy.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-DKiqcZD4.js";import{a0 as t}from"./index-DZU8HRgG.js";import"./vendor-BvqAck49.js";import"./index-CcaG1Gci.js";import"./icons-DP3uiYxy.js";const s=t(o);export{s as default};
|