diff --git a/apps/desktop/src/main/github-issue/__tests__/githubIssueSubmitService.test.ts b/apps/desktop/src/main/github-issue/__tests__/githubIssueSubmitService.test.ts index 7b213747ee4..611971494f6 100644 --- a/apps/desktop/src/main/github-issue/__tests__/githubIssueSubmitService.test.ts +++ b/apps/desktop/src/main/github-issue/__tests__/githubIssueSubmitService.test.ts @@ -101,6 +101,10 @@ describe('submitGithubIssueWithConfirm', () => { expect(posted.appVersion).toBe('0.0.112'); expect(posted.userName).toBe('公开昵称'); expect(posted.description).toContain('用户改过的正文'); + expect(posted.description).toContain('## 提交时的任务环境'); + expect(posted.description).toContain( + '仅代表提交时快照,不一定是故障环境。OS 来自提交客户端本机,不含 SSH 远端主机;Harness / 模型来自当前任务。与运行环境无关的反馈可忽略本段。', + ); expect(posted.description).toContain('**版本区域**: CN'); expect(posted.description).toContain('**OS**: darwin arm64 (25.5.0)'); expect(posted.description).toContain('**Harness**: Codex'); @@ -237,6 +241,7 @@ describe('submitGithubIssueWithConfirm', () => { expect(description).not.toContain('版本区域'); expect(description).not.toContain('global'); // 其余 env 行不受影响,不能因为省略区域行把 env 块整段搞坏。 + expect(description).toContain('## 提交时的任务环境'); expect(description).toContain('**OS**: darwin arm64 (25.5.0)'); expect(description).toContain('**界面语言**: zh-CN'); }); diff --git a/apps/desktop/src/main/github-issue/githubIssueSubmitService.ts b/apps/desktop/src/main/github-issue/githubIssueSubmitService.ts index 4d70f94973d..1506f783eec 100644 --- a/apps/desktop/src/main/github-issue/githubIssueSubmitService.ts +++ b/apps/desktop/src/main/github-issue/githubIssueSubmitService.ts @@ -5,7 +5,7 @@ * 1. 组环境信息并解析本次真实提交身份—— agent 不参与; * 2. await confirm(确认卡片,含真实身份)—— **唯一**通往 postIssue 的路径; * 3. confirmed 后以用户确认的 title/body/type 为准(用户编辑版优先); - * 4. body 末尾附 env 块,clamp 后严格按已确认身份 POST,失败不切换身份。 + * 4. body 末尾附「提交时的任务环境」块,clamp 后严格按已确认身份 POST,失败不切换身份。 * * 模块保持 electron-free,全部依赖注入(规则 14),单测直接调 submitGithubIssueWithConfirm。 */ @@ -196,6 +196,9 @@ export async function submitGithubIssueWithConfirm( const envBlock = [ '', '---', + '## 提交时的任务环境', + '', + '仅代表提交时快照,不一定是故障环境。OS 来自提交客户端本机,不含 SSH 远端主机;Harness / 模型来自当前任务。与运行环境无关的反馈可忽略本段。', // global 不写这一行 —— 缺失即默认区域,理由见 CINDY_REGION_CODE(与确认卡片同源)。 ...(regionCode ? [`**版本区域**: ${regionCode}`] : []), `**OS**: ${env.platform} ${env.arch} (${env.osVersion})`, diff --git a/apps/desktop/src/renderer/i18n/locales/en/common.json b/apps/desktop/src/renderer/i18n/locales/en/common.json index 15afd439f9e..a8536302f7e 100644 --- a/apps/desktop/src/renderer/i18n/locales/en/common.json +++ b/apps/desktop/src/renderer/i18n/locales/en/common.json @@ -9715,7 +9715,7 @@ }, "issueAgent": { "command": { - "instruction": "I'd like to file feedback for {{appName}}. Help me turn it into a complete, clear GitHub issue: confirm whether it is a bug or feature request, and ask only for missing or ambiguous details. Summarize or generalize user-provided quotes and examples by default instead of copying information that could identify a person, conversation, or business context. For bugs, collect the symptoms, reproduction steps, expected and actual behavior, frequency, attempted fixes, and—only with my consent—redacted diagnostic summaries; never include passwords, tokens, email addresses, personal paths, or unrelated files. For feature requests, clarify the use case, current pain point, and desired outcome. Once the information is sufficient, submit it with the submit_github_issue tool via cindy_helper call_tool (category=feedback; you can run list_tools first to check the parameters; a confirmation card will be shown to me before submitting). No GitHub plugin or account setup is required: Cindy's official bot is the default, and a working GitHub account appears only as an optional identity in the confirmation card. After creation, tell me the issue number and link, explain that Cindy is open source, and offer to help me reproduce, fix, test, or extend it from source. If the submission fails, tell me the reason honestly.{{details}}", + "instruction": "I'd like to file feedback for {{appName}}. Help me turn it into a clear GitHub issue: figure out whether it is a bug or a suggestion, and ask only what is actually missing—do not run a fixed questionnaire. Ordinary suggestions do not need a bug checklist; skip Harness, model, and Effort questions when they are unrelated. Summarize or generalize user-provided quotes and examples by default instead of copying information that could identify a person, conversation, or business context. Screenshots in this chat are not uploaded to GitHub—never write that screenshots were attached; describe what they showed instead. With my consent, include redacted diagnostic summaries; never include passwords, tokens, email addresses, personal paths, or unrelated files. For feature requests, write the visible use case and ask; do not write repo paths, implementation plans, or acceptance checklists unless I ask. Once the information is sufficient, submit it with the submit_github_issue tool via cindy_helper call_tool (category=feedback; you can run list_tools first to check the parameters; a confirmation card will be shown to me before submitting). No GitHub plugin or account setup is required: Cindy's official bot is the default, and a working GitHub account appears only as an optional identity in the confirmation card. After creation, tell me the issue number and link, explain that Cindy is open source, and offer to help me reproduce, fix, test, or extend it from source. If the submission fails, tell me the reason honestly.{{details}}", "detailsPrefix": "\nMy initial description: {{details}}" }, "confirm": { @@ -9735,8 +9735,8 @@ "publicNameHint": "This attribution will appear publicly in the Issue body", "anonymous": "Anonymous", "useAnonymous": "Use Anonymous Attribution", - "envLine": "Attached automatically on submit: client {{appVersion}} · {{platform}} {{arch}} ({{osVersion}}) · UI language {{uiLanguage}}", - "runtimeLine": "Harness {{harness}} · Model ID {{modelId}}", + "envLine": "Submitting client environment (attached automatically on submit): client {{appVersion}} · {{platform}} {{arch}} ({{osVersion}}) · UI language {{uiLanguage}}", + "runtimeLine": "Harness {{harness}} · Model ID {{modelId}} (this session)", "regionLine": "Build region: {{region}}", "regionCodeCn": "CN", "regionCodeDev": "Dev", diff --git a/apps/desktop/src/renderer/i18n/locales/ja/common.json b/apps/desktop/src/renderer/i18n/locales/ja/common.json index 75eca7b89fd..ba1cb9aa75e 100644 --- a/apps/desktop/src/renderer/i18n/locales/ja/common.json +++ b/apps/desktop/src/renderer/i18n/locales/ja/common.json @@ -9699,7 +9699,7 @@ }, "issueAgent": { "command": { - "instruction": "{{appName}} にフィードバックを送りたいです。情報が揃った明確な GitHub issue にまとめるのを手伝ってください:バグか機能要望かを確認し、不足または曖昧な点だけを質問してください。ユーザーが示した発言や例は既定で要約・一般化し、個人、会話、業務を特定できる情報をそのまま転載しないでください。バグでは現象、再現手順、期待する動作と実際の動作、再現頻度、試した対処をできるだけ確認し、ユーザーの同意がある場合だけ個人情報を除いた診断の要約を含めてください。パスワード、トークン、メールアドレス、個人パス、無関係なファイル内容は含めないでください。機能要望では利用シーン、現在の困りごと、期待する結果を確認してください。情報が揃ったら cindy_helper の call_tool で submit_github_issue ツールを呼び出して提出してください(category=feedback。先に list_tools でパラメータを確認できます。提出前に確認カードが表示されます)。GitHub プラグインやアカウントの設定は不要です。既定では Cindy 公式 Bot が送信し、利用可能な GitHub アカウントがある場合のみ確認カードに追加の送信元として表示されます。作成後は issue 番号とリンクを伝え、Cindy がオープンソースであること、ソースから再現・修正・テスト・機能開発を一緒に進められることを案内してください。提出に失敗した場合は、理由をそのまま教えてください。{{details}}", + "instruction": "{{appName}} にフィードバックを送りたいです。明確な GitHub issue にまとめるのを手伝ってください:バグか要望かを見極め、足りないことだけを聞いてください。決まった質問票は使わないでください。通常の要望に欠陥のチェックリストを当てはめず、実行環境と無関係なら Harness、モデル、推論強度は尋ねないでください。ユーザーが示した発言や例は既定で要約・一般化し、個人、会話、業務を特定できる情報をそのまま転載しないでください。このチャットの画像は GitHub にアップロードされないので、「スクリーンショットを添付済み」と書かず、画像の内容を文章で説明してください。ユーザーの同意がある場合だけ個人情報を除いた診断の要約を含めてください。パスワード、トークン、メールアドレス、個人パス、無関係なファイル内容は含めないでください。機能要望では見える利用シーンと要望を書き、求められない限りリポジトリパス、実装案、受け入れ条件は書かないでください。情報が揃ったら cindy_helper の call_tool で submit_github_issue ツールを呼び出して提出してください(category=feedback。先に list_tools でパラメータを確認できます。提出前に確認カードが表示されます)。GitHub プラグインやアカウントの設定は不要です。既定では Cindy 公式 Bot が送信し、利用可能な GitHub アカウントがある場合のみ確認カードに追加の送信元として表示されます。作成後は issue 番号とリンクを伝え、Cindy がオープンソースであること、ソースから再現・修正・テスト・機能開発を一緒に進められることを案内してください。提出に失敗した場合は、理由をそのまま教えてください。{{details}}", "detailsPrefix": "\n最初の説明:{{details}}" }, "confirm": { @@ -9719,8 +9719,8 @@ "publicNameHint": "この署名は Issue 本文に公開表示されます", "anonymous": "匿名", "useAnonymous": "匿名の署名を使用", - "envLine": "送信時に自動で付加されます:クライアント {{appVersion}} · {{platform}} {{arch}}({{osVersion}})· 表示言語 {{uiLanguage}}", - "runtimeLine": "Harness {{harness}} · Model ID {{modelId}}", + "envLine": "送信クライアント環境(送信時に自動で付加):クライアント {{appVersion}} · {{platform}} {{arch}}({{osVersion}})· 表示言語 {{uiLanguage}}", + "runtimeLine": "Harness {{harness}} · Model ID {{modelId}}(このセッション)", "regionLine": "リージョン:{{region}}", "regionCodeCn": "CN", "regionCodeDev": "Dev", diff --git a/apps/desktop/src/renderer/i18n/locales/ko/common.json b/apps/desktop/src/renderer/i18n/locales/ko/common.json index 591a3a85d55..92598a29d93 100644 --- a/apps/desktop/src/renderer/i18n/locales/ko/common.json +++ b/apps/desktop/src/renderer/i18n/locales/ko/common.json @@ -9699,7 +9699,7 @@ }, "issueAgent": { "command": { - "instruction": "{{appName}}에 피드백을 제출하고 싶습니다. 정보가 충분하고 명확한 GitHub issue로 정리하도록 도와주세요: 버그인지 기능 제안인지 확인하고, 빠진 정보나 모호한 부분만 질문해 주세요. 사용자가 제공한 인용문과 예시는 기본적으로 요약하거나 일반화하고 개인, 대화 또는 업무 맥락을 식별할 수 있는 정보를 그대로 복사하지 마세요. 버그라면 증상, 재현 단계, 기대 동작과 실제 동작, 재현 빈도, 시도한 해결 방법을 최대한 확인하고, 사용자가 동의한 경우에만 민감 정보를 제거한 진단 요약을 포함해 주세요. 비밀번호, 토큰, 이메일 주소, 개인 경로, 관련 없는 파일 내용은 포함하지 마세요. 기능 제안이라면 사용 시나리오, 현재 문제와 원하는 결과를 확인해 주세요. 정보가 충분해지면 cindy_helper의 call_tool로 submit_github_issue 도구를 호출해 제출해 주세요(category=feedback, 먼저 list_tools로 매개변수를 확인할 수 있습니다. 제출 전에 확인 카드가 표시됩니다). GitHub 플러그인이나 계정 설정은 필요하지 않습니다. 기본적으로 Cindy 공식 봇이 제출하며, 사용 가능한 GitHub 계정이 있을 때만 확인 카드에 추가 제출 계정으로 표시됩니다. 생성 후 issue 번호와 링크를 알려 주고, Cindy가 오픈 소스이며 소스에서 재현·수정·테스트·기능 개발을 함께 진행할 수 있다고 안내해 주세요. 제출에 실패하면 이유를 그대로 알려주세요.{{details}}", + "instruction": "{{appName}}에 피드백을 제출하고 싶습니다. 명확한 GitHub issue로 정리하도록 도와주세요: 버그인지 제안인지 파악하고, 실제로 부족한 것만 질문하세요. 고정 설문은 쓰지 마세요. 일반적인 제안에 버그 체크리스트를 들이대지 말고, 실행 환경과 무관하면 Harness, 모델, 추론 강도는 묻지 마세요. 사용자가 제공한 인용문과 예시는 기본적으로 요약하거나 일반화하고 개인, 대화 또는 업무 맥락을 식별할 수 있는 정보를 그대로 복사하지 마세요. 이 채팅의 이미지는 GitHub에 업로드되지 않으니 「스크린샷을 첨부함」이라고 쓰지 말고, 화면에 보이는 내용을 글로 설명해 주세요. 사용자가 동의한 경우에만 민감 정보를 제거한 진단 요약을 포함해 주세요. 비밀번호, 토큰, 이메일 주소, 개인 경로, 관련 없는 파일 내용은 포함하지 마세요. 기능 제안이라면 눈에 보이는 사용 장면과 요청을 쓰고, 요청하지 않는 한 저장소 경로, 구현안, 인수 조건은 쓰지 마세요. 정보가 충분해지면 cindy_helper의 call_tool로 submit_github_issue 도구를 호출해 제출해 주세요(category=feedback, 먼저 list_tools로 매개변수를 확인할 수 있습니다. 제출 전에 확인 카드가 표시됩니다). GitHub 플러그인이나 계정 설정은 필요하지 않습니다. 기본적으로 Cindy 공식 봇이 제출하며, 사용 가능한 GitHub 계정이 있을 때만 확인 카드에 추가 제출 계정으로 표시됩니다. 생성 후 issue 번호와 링크를 알려 주고, Cindy가 오픈 소스이며 소스에서 재현·수정·테스트·기능 개발을 함께 진행할 수 있다고 안내해 주세요. 제출에 실패하면 이유를 그대로 알려주세요.{{details}}", "detailsPrefix": "\n초기 설명: {{details}}" }, "confirm": { @@ -9719,8 +9719,8 @@ "publicNameHint": "이 서명은 Issue 본문에 공개적으로 표시됩니다", "anonymous": "익명", "useAnonymous": "익명 서명 사용", - "envLine": "제출 시 자동으로 첨부됩니다: 클라이언트 {{appVersion}} · {{platform}} {{arch}}({{osVersion}}) · 표시 언어 {{uiLanguage}}", - "runtimeLine": "Harness {{harness}} · Model ID {{modelId}}", + "envLine": "제출 클라이언트 환경(제출 시 자동 첨부): 클라이언트 {{appVersion}} · {{platform}} {{arch}}({{osVersion}}) · 표시 언어 {{uiLanguage}}", + "runtimeLine": "Harness {{harness}} · Model ID {{modelId}} (지금 이 세션)", "regionLine": "지역: {{region}}", "regionCodeCn": "CN", "regionCodeDev": "Dev", diff --git a/apps/desktop/src/renderer/i18n/locales/zh-CN/common.json b/apps/desktop/src/renderer/i18n/locales/zh-CN/common.json index 1dedf30edd3..5a463f28bcb 100644 --- a/apps/desktop/src/renderer/i18n/locales/zh-CN/common.json +++ b/apps/desktop/src/renderer/i18n/locales/zh-CN/common.json @@ -9691,7 +9691,7 @@ }, "issueAgent": { "command": { - "instruction": "我想给 {{appName}} 提交一条反馈。请协助我整理成一个高质量、信息完整的 GitHub issue:先确认反馈类型(bug 还是功能建议),只针对缺失或含糊的信息追问;整理时默认概括或泛化用户提供的原话和示例,不要直接复制可识别个人、对话或业务的信息;Bug 尽量补齐现象、复现步骤、期望与实际行为、复现频率、已尝试的方法,并在用户同意后纳入经过脱敏的诊断摘要,禁止提交密码、令牌、邮箱、个人路径或无关文件内容;功能建议补齐使用场景、当前痛点和期望结果。信息足够后用 cindy_helper 的 call_tool 调用 submit_github_issue 工具提交(category=feedback,可先 list_tools 查看参数要求;提交前系统会弹确认卡片给我看)。这不需要安装或配置 GitHub 插件:默认由 Cindy 官方 Bot 提交;若当前有可用的 GitHub 账号,确认卡会额外提供本人账号选项。创建成功后告诉我 issue 编号和链接,并说明 Cindy 是开源软件,询问我是否希望通过源码一起复现、修复 Bug、开发功能或准备 PR。如果提交失败,如实告诉我原因。{{details}}", + "instruction": "我想给 {{appName}} 提交一条反馈。请协助我整理成一个高质量的 GitHub issue:先弄清这是缺陷还是建议,缺什么问什么,不要套固定问卷。普通建议不必按缺陷清单追问,和环境无关不必追问 Harness、模型或推理强度。整理时默认概括或泛化用户提供的原话和示例,不要直接复制可识别个人、对话或业务的信息。对话里的图不会传到 GitHub,不要写「已提供截图」,用文字描述图上内容即可;用户同意后再纳入脱敏诊断摘要,禁止提交密码、令牌、邮箱、个人路径或无关文件内容。功能建议写用户能看见的场景和诉求,不要写仓库路径、实现方案或验收清单。信息足够后用 cindy_helper 的 call_tool 调用 submit_github_issue 工具提交(category=feedback,可先 list_tools 查看参数要求;提交前系统会弹确认卡片给我看)。这不需要安装或配置 GitHub 插件:默认由 Cindy 官方 Bot 提交;若当前有可用的 GitHub 账号,确认卡会额外提供本人账号选项。创建成功后告诉我 issue 编号和链接,并说明 Cindy 是开源软件,询问我是否希望通过源码一起复现、修复 Bug、开发功能或准备 PR。如果提交失败,如实告诉我原因。{{details}}", "detailsPrefix": "\n我的初始描述:{{details}}" }, "confirm": { @@ -9711,8 +9711,8 @@ "publicNameHint": "该署名会公开显示在 Issue 正文中", "anonymous": "匿名", "useAnonymous": "使用匿名署名", - "envLine": "提交时将自动附加:客户端 {{appVersion}} · {{platform}} {{arch}}({{osVersion}})· 界面语言 {{uiLanguage}}", - "runtimeLine": "Harness {{harness}} · Model ID {{modelId}}", + "envLine": "提交客户端环境(提交时自动附加):客户端 {{appVersion}} · {{platform}} {{arch}}({{osVersion}})· 界面语言 {{uiLanguage}}", + "runtimeLine": "Harness {{harness}} · Model ID {{modelId}}(当前任务)", "regionLine": "版本区域:{{region}}", "regionCodeCn": "CN", "regionCodeDev": "Dev", diff --git a/apps/desktop/src/renderer/i18n/locales/zh-TW/common.json b/apps/desktop/src/renderer/i18n/locales/zh-TW/common.json index 1f3aa5ed11e..45aa96e1a9e 100644 --- a/apps/desktop/src/renderer/i18n/locales/zh-TW/common.json +++ b/apps/desktop/src/renderer/i18n/locales/zh-TW/common.json @@ -9691,7 +9691,7 @@ }, "issueAgent": { "command": { - "instruction": "我想給 {{appName}} 提交一條反饋。請協助我整理成一個高品質的 GitHub issue:先和我確認反饋型別(bug 還是功能建議),並追問必要細節(現象、復現步驟或使用場景、期望行為);整理時預設概括或泛化使用者提供的原話與範例,不要直接複製可識別個人、對話或業務的資訊;資訊足夠後用 cindy_helper 的 call_tool 呼叫 submit_github_issue 工具提交(category=feedback,可先 list_tools 檢視引數要求;提交前系統會彈確認卡片給我看)。如果提交失敗,如實告訴我原因。{{details}}", + "instruction": "我想給 {{appName}} 提交一條反饋。請協助我整理成一個高品質的 GitHub issue:先和我確認這是缺陷還是建議,缺什麼問什麼,不要套固定問卷。普通建議不必按缺陷清單追問,和環境無關不必追問 Harness、模型或推理強度。整理時預設概括或泛化使用者提供的原話與範例,不要直接複製可識別個人、對話或業務的資訊;對話裡的圖不會傳到 GitHub,不要寫「已提供截圖」,用文字描述即可;功能建議不要寫倉庫路徑、實作方案或驗收清單。資訊足夠後用 cindy_helper 的 call_tool 呼叫 submit_github_issue 工具提交(category=feedback,可先 list_tools 檢視引數要求;提交前系統會彈確認卡片給我看)。如果提交失敗,如實告訴我原因。{{details}}", "detailsPrefix": "\n我的初始描述:{{details}}" }, "confirm": { @@ -9711,8 +9711,8 @@ "publicNameHint": "該署名會公開顯示在 Issue 正文中", "anonymous": "匿名", "useAnonymous": "使用匿名署名", - "envLine": "提交時將自動附加:客戶端 {{appVersion}} · {{platform}} {{arch}}({{osVersion}})· 介面語言 {{uiLanguage}}", - "runtimeLine": "Harness {{harness}} · Model ID {{modelId}}", + "envLine": "提交客戶端環境(提交時自動附加):客戶端 {{appVersion}} · {{platform}} {{arch}}({{osVersion}})· 介面語言 {{uiLanguage}}", + "runtimeLine": "Harness {{harness}} · Model ID {{modelId}}(目前任務)", "regionLine": "版本區域:{{region}}", "regionCodeCn": "CN", "regionCodeDev": "Dev", diff --git a/packages/lizi-mcps/src/__tests__/getCapabilitiesTool.test.ts b/packages/lizi-mcps/src/__tests__/getCapabilitiesTool.test.ts index c848dc72917..d344a17b9ec 100644 --- a/packages/lizi-mcps/src/__tests__/getCapabilitiesTool.test.ts +++ b/packages/lizi-mcps/src/__tests__/getCapabilitiesTool.test.ts @@ -81,6 +81,18 @@ describe('capabilities data source', () => { expect(entry!.detail).toContain('https://cindy.app'); }); + it('issue-tracker 不套固定问卷,并说明自动附加环境含 Harness / 模型 ID', () => { + const entry = findCapability('issue-tracker'); + expect(entry).toBeDefined(); + expect(entry!.detail).toContain('不套固定问卷'); + expect(entry!.detail).toContain('Harness / 模型 ID'); + expect(entry!.detail).toContain('提交时的任务环境'); + expect(entry!.detail).toContain('不要声称截图已附'); + expect(entry!.detail).toContain('不写源码级方案'); + expect(entry!.detail).toContain('不一定是出问题的那个'); + expect(entry!.detail).toContain('实际故障环境按需写进正文'); + }); + it('collab-mode 明确 Pi 可作本地 Lead 和 Worker,且不扩大到 SSH 远程 Pi', () => { const entry = findCapability('collab-mode'); diff --git a/packages/lizi-mcps/src/__tests__/submitGithubIssueTool.test.ts b/packages/lizi-mcps/src/__tests__/submitGithubIssueTool.test.ts index daefaa1ba4b..99eb1274c8d 100644 --- a/packages/lizi-mcps/src/__tests__/submitGithubIssueTool.test.ts +++ b/packages/lizi-mcps/src/__tests__/submitGithubIssueTool.test.ts @@ -63,6 +63,32 @@ describe('submit_github_issue tool', () => { expect(tool?.description).toContain('不能识别所有语义隐私'); }); + it('澄清流程交给 agent 判断,并与自动附加的当前任务环境区分', () => { + const { registry } = setup(); + const tool = registry.get('submit_github_issue'); + expect(tool?.description).toContain('缺什么问什么'); + expect(tool?.description).toContain('不要套固定问卷或章节清单'); + expect(tool?.description).toContain('普通建议不必按缺陷来问'); + expect(tool?.description).toContain('和环境无关不必追问 Harness'); + expect(tool?.description).toContain('系统自动附加的 Harness / Model ID 是当前任务的快照'); + expect(tool?.description).toContain('不一定是出问题的那个'); + expect(tool?.description).toContain('提交时的任务环境'); + expect(tool?.description).toContain('本工具不能把对话里的图片传到 GitHub'); + expect(tool?.description).toContain('禁止写「已提供截图」'); + expect(tool?.description).toContain('不要写仓库路径、实现方案、验收清单'); + expect(tool?.inputShape.body.description).toContain('按这条反馈本身组织'); + expect(tool?.inputShape.body.description).not.toContain('bug 优先用'); + expect(tool?.inputShape.body.description).toContain('禁止声称截图已附'); + expect(tool?.inputShape.body.description).toContain('提交时的任务环境'); + expect(tool?.inputShape.body.description).toContain('实际故障'); + expect(tool?.inputShape.body.description).toContain( + '不要复制系统自动附加的当前任务快照', + ); + expect(tool?.inputShape.body.description).not.toMatch( + /不要写环境信息\(客户端版本 \/ 版本区域 \/ OS \/ Harness \/ 模型 ID/, + ); + }); + it('缺参数 → INVALID_ARGS, host 不被调', async () => { const { registry, submit } = setup(); const res = await registry.call('submit_github_issue', {}); diff --git a/packages/lizi-mcps/src/xdt-helper/capabilities.ts b/packages/lizi-mcps/src/xdt-helper/capabilities.ts index 24652ac9717..6d79e9cc0f2 100644 --- a/packages/lizi-mcps/src/xdt-helper/capabilities.ts +++ b/packages/lizi-mcps/src/xdt-helper/capabilities.ts @@ -126,12 +126,12 @@ export const CAPABILITIES: readonly CapabilityEntry[] = [ title: '官方反馈提交', oneLiner: '/issue 命令或自然语言发起,agent 对话式整理后经确认卡片提交 GitHub issue。', detail: [ - '用户输入 /issue(可带初始描述)或直接说"帮我提个 issue",agent 先追问缺失或含糊的细节,不够清楚时不会急着提交。', - 'Bug 会尽量补齐复现步骤、期望/实际行为、复现频率、已尝试方法和用户同意公开的脱敏诊断摘要;功能建议会澄清使用场景、当前痛点和期望结果。', + '用户输入 /issue(可带初始描述)或直接说"帮我提个 issue",agent 先把反馈整理清楚再提交:缺什么问什么,不套固定问卷,不够清楚时不会急着提交。', + '整理出对维护者有用的标题与正文,默认概括并脱敏;功能建议不写源码级方案。对话里的图不会传到 GitHub,不要声称截图已附。', '整理出结构化标题与正文后调用 submit_github_issue(cindy_helper 的 feedback 类目),系统会尽量隐藏常见密钥、个人路径和邮箱。', '提交前 App 内弹系统确认卡片,用户可编辑标题/正文、确认或取消;', '不需要安装或配置 GitHub 插件:默认由 Cindy 官方 Bot 提交;当前已配置且可用的 GitHub 账号只作为确认卡里的额外身份选项。', - `客户端版本 / OS / 界面语言由系统自动附加,最终创建到 ${BRAND_NAME} 官方 GitHub 仓库。创建后会返回 issue 链接,并可继续协助用户从源码复现、修复 Bug、开发功能和准备 PR。`, + `客户端版本 / OS / Harness / 模型 ID / 界面语言由系统作为「提交时的任务环境」自动附加(OS 来自提交客户端本机,Harness / 模型是当前任务快照,不一定是出问题的那个)。用户说明的实际故障环境按需写进正文。最终创建到 ${BRAND_NAME} 官方 GitHub 仓库。创建后会返回 issue 链接,并可继续协助用户从源码复现、修复 Bug、开发功能和准备 PR。`, ].join(' '), }, { diff --git a/packages/lizi-mcps/src/xdt-helper/submit_github_issue.ts b/packages/lizi-mcps/src/xdt-helper/submit_github_issue.ts index 4f02850c991..984004aaf21 100644 --- a/packages/lizi-mcps/src/xdt-helper/submit_github_issue.ts +++ b/packages/lizi-mcps/src/xdt-helper/submit_github_issue.ts @@ -7,9 +7,10 @@ * - agent 初稿进入确认卡前会做高置信度隐私脱敏;确认卡仍展示最终公开内容, * 用户编辑后的内容视为用户明确确认。 * - host 在确认前确定并展示真实提交身份;确认后失败也不会静默切换身份。 - * - 环境信息(客户端版本 / 版本区域 / OS / Harness / 模型 ID / 界面语言)由 host 自动 - * 附加,agent 无法也无需填写。版本区域(CN / Dev;默认 global 不标注)是构建期身份, - * agent 更猜不到。 + * - 环境信息由 host 自动附加为「提交时的任务环境」,agent 无法也无需填写快照字段。 + * 自动附加的 Harness / Model ID 是当前任务快照,不一定是故障环境;OS 来自提交客户端本机。agent 按反馈本身判断是否在正文补充用户说明的实际故障环境,不要默认把自动附加的当成出问题的那个,也不要复制快照。 + * 版本区域(CN / Dev;默认 global 不标注)是构建期身份,agent 更猜不到。 + * 本工具不上传图片;agent 不得声称截图已附在 GitHub issue。 * - 成功返回 issue 链接及开源协作提示,让 agent 可以继续帮助用户从源码参与修复。 * 本文件只承载工具 schema + 描述(对 LLM 的流程指引)和 host 回调的 payload 整形。 */ @@ -71,12 +72,12 @@ export interface SubmitGithubIssueDeps { const DESCRIPTION = [ `把整理好的用户反馈提交为 ${BRAND_NAME} 官方仓库的 GitHub issue。`, '【流程硬约束】', - '1) 调用前必须先与用户对话澄清,只针对缺失或含糊的信息提问,不要重复已回答的问题,也不要急着调用。bug 至少确认:现象、复现步骤、期望行为、实际行为、复现频率、已尝试的解决办法;feature 至少确认:使用场景、当前痛点或替代方案、期望结果和建议范围。用户不知道的内容标记为未知,不要猜。', - '2) Bug 和功能建议都遵循最小公开原则:默认概括、泛化用户提供的场景与示例,不要逐字复制用户消息、会话标题、真实姓名、账号、业务内容或其它可识别信息。只有复现问题确实需要且用户明确同意公开时,才保留最小必要片段。Bug 可以主动收集用户提供的错误摘要、经过脱敏的日志片段和必要截图说明,但先解释会公开到 GitHub,取得用户同意后再纳入正文。优先摘要而不是整段原始日志;不要提交令牌、密码、邮箱、个人路径、内部域名、私有代码或与问题无关的文件内容。系统会在确认卡前自动隐藏部分常见敏感信息,但不能识别所有语义隐私,仍要让用户检查最终正文。', + '1) 调用前先与用户对话,把这条反馈整理到足以让维护者看懂、能行动。缺什么问什么,已说过的不要重复,不够清楚不要急着调用。问什么、问多深、正文怎么组织,由你按反馈本身判断,不要套固定问卷或章节清单。普通建议不必按缺陷来问,和环境无关不必追问 Harness / 模型 / 推理强度。用户不知道的标未知,不要猜。系统自动附加的 Harness / Model ID 是当前任务的快照,不一定是出问题的那个。功能建议写用户能看见的场景和诉求;不要写仓库路径、实现方案、验收清单或内部架构推测,除非用户明确要求。', + '2) Bug 和功能建议都遵循最小公开原则:默认概括、泛化用户提供的场景与示例,不要逐字复制用户消息、会话标题、真实姓名、账号、业务内容或其它可识别信息。只有复现问题确实需要且用户明确同意公开时,才保留最小必要片段。Bug 可以主动收集用户提供的错误摘要、经过脱敏的日志片段和必要截图说明,但先解释会公开到 GitHub,取得用户同意后再纳入正文。优先摘要而不是整段原始日志;不要提交令牌、密码、邮箱、个人路径、内部域名、私有代码或与问题无关的文件内容。本工具不能把对话里的图片传到 GitHub。禁止写「已提供截图」「截图见上」等让维护者以为 GitHub issue 里有图的话;用户给过图时,用文字描述图上可见内容。系统会在确认卡前自动隐藏部分常见敏感信息,但不能识别所有语义隐私,仍要让用户检查最终正文。', '3) 本工具被调用后会在 App 内弹出系统确认卡片,用户可以编辑标题/正文并确认或取消;最终提交内容以用户确认的版本为准(返回的 final_title 可能与你传入的不同)。确认前不得创建 issue。', '4) Cindy 官方 Bot 是默认且始终可用的提交身份,不要求用户安装插件或配置 GitHub。仅当系统实时验证到可用的 Cindy GitHub 账号时,确认卡才额外提供“用本人账号提交”的选项(受其 token 仓库权限约束)。用户确认身份后,提交失败不会静默切换身份。', '5) errorCode 语义: USER_CANCELLED = 用户主动取消了本次提交,如实告知即可,不要换参数自动重试; CONFIRM_TIMEOUT = 确认卡片超时无人响应(用户可能不在电脑前),告知用户可以再说一声重新发起; AUTH_NOT_READY / NETWORK_ERROR / SERVER_ERROR / HOST_NOT_READY = 提交失败,如实转告原因,不存在任何绕过确认、权限或失败的提交途径。', - '6) 环境信息(客户端版本 / 版本区域 / OS / Harness / 模型 ID / 界面语言)由系统自动附加;GitHub 作者就是确认卡片显示的身份——都无需也无法由你填写。版本区域是用户装的哪个区域构建(CN / Dev,默认的 global 构建不标注),构建期烘焙,你猜不到也不要写。', + '6) 系统自动附加「提交时的任务环境」快照(客户端版本 / 版本区域 / 提交客户端 OS / 当前任务的 Harness / 模型 ID / 界面语言);GitHub 作者就是确认卡片显示的身份——这些快照字段无需也无法由你填写。系统自动附加的 Harness / Model ID 是当前任务的快照,不一定是出问题的那个;不要复制进正文。用户说明的实际故障 Harness / 模型 / 推理强度,只在真正有助于定位时写入正文。版本区域是用户装的哪个区域构建(CN / Dev,默认的 global 构建不标注),构建期烘焙,你猜不到也不要写。', `7) 提交成功后告诉用户 issue 编号和链接,说明 ${BRAND_NAME} 是开源软件,并询问用户是否愿意继续参与:可以协助其通过源码复现、修复 Bug、开发功能、补测试并准备 PR。`, ].join('\n'); @@ -85,10 +86,11 @@ const D_TITLE = '禁止截断正文凑标题,禁止「用户反馈」「一个 bug」这类空泛词。'; const D_BODY = - 'Markdown 正文。bug 优先用「## 现象 / ## 复现步骤 / ## 期望行为 / ## 实际行为 / ## 复现频率 / ## 已尝试」结构;' + - 'feature 优先用「## 使用场景 / ## 当前痛点 / ## 诉求 / ## 建议方案」结构,信息来自与用户的对话。' + + 'Markdown 正文,按这条反馈本身组织,不要为了凑章节而编造。' + '默认概括并泛化用户原话、真实场景和示例,不要逐字复制可识别的私人或业务内容。诊断信息只放用户同意公开的、经过脱敏的摘要;缺失信息写“用户未知”或省略,不要编造。' + - '不要写环境信息(客户端版本 / 版本区域 / OS / Harness / 模型 ID / 界面语言)和提交人——系统会自动附加。'; + '用户说明的实际故障 Harness / 模型 / 推理强度,只在真正有助于定位时写入,不要当固定栏目,也不要复制系统自动附加的当前任务快照。' + + '功能建议不要写仓库路径、实现方案或验收清单,除非用户明确要求。禁止声称截图已附在本 issue——本工具不会上传图片。' + + '不要填写系统会自动附加的快照字段(客户端版本 / 版本区域 / 提交客户端 OS / 当前任务的 Harness / 模型 ID / 界面语言)和提交人——系统会附加为「提交时的任务环境」。用户报告的实际故障环境应留在正文。'; const D_TYPE = 'bug=缺陷, feature=功能建议。决定 GitHub label。';