Sign In

@kmfe/devflow

Package Overview
Dependencies
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@kmfe/devflow - npm Package Compare versions

Comparing version
0.1.0-beta.2
to
0.1.0-beta.3
+1
-1
dist/index.js

@@ -14,2 +14,2 @@ #!/usr/bin/env node

`)}}catch{process.stderr.write(` 查询失败,跳过
`)}await r(),n()})});await r(),p({me:n,team:t}),process.stderr.write(`\n已保存团队配置(${t.length} 人)\n`)}e.close(),_({success:!0,username:t.name,displayName:t.displayName})}catch{e.close();try{n.unlinkSync(l())}catch{}v(`Token 验证失败,请检查后重试`,`auth`)}})}function x(e){e.command(`whoami`).description(`返回当前登录用户信息`).action(async()=>{try{let e=await h().genericGet(`myself`);_({username:e.name,displayName:e.displayName,email:e.emailAddress})}catch(e){y(e)}})}function S(e){e.command(`me`).description(`返回 team.json 中的 me 字段`).action(()=>{let e=d();e.me||v(`未配置 me 字段,请运行 kdev jira auth`,`config`),_({me:e.me})})}function C(e){e.command(`team-members`).description(`返回团队成员列表`).action(()=>{_(d().team??[])})}function w(e){e.command(`team-add <username>`).description(`向团队成员列表追加成员`).action(async e=>{let t=d();t.team.some(t=>t.username===e)&&v(`成员 ${e} 已存在`,`validation`);try{let n=(await h().searchUsers({username:e,maxResults:1}))[0];n||v(`未找到用户 ${e}`,`not_found`),t.team.push({username:n.name,displayName:n.displayName}),p(t),_({success:!0,added:{username:n.name,displayName:n.displayName}})}catch(e){y(e)}})}function T(e){e.command(`team-remove <username>`).description(`从团队成员列表移除成员`).action(e=>{let t=d(),n=t.team.length;t.team=t.team.filter(t=>t.username!==e),t.team.length===n&&v(`成员 ${e} 不存在`,`not_found`),p(t),_({success:!0,removed:e})})}function E(e){e.command(`projects`).description(`列出所有可见项目`).action(async()=>{try{_((await h().listProjects()).map(e=>({key:e.key,name:e.name})))}catch(e){y(e)}})}function D(e){e.command(`issue <key>`).description(`查看工单详情(含子任务、父任务)`).action(async e=>{try{let t=await h().getIssue(e),n=t.fields;_({key:t.key,summary:n.summary,type:n.issuetype?.name,status:n.status?.name,priority:n.priority?.name,assignee:n.assignee?{name:n.assignee.displayName,username:n.assignee.name}:null,reporter:n.reporter?{name:n.reporter.displayName,username:n.reporter.name}:null,description:n.description,duedate:n.duedate,created:n.created,updated:n.updated,parent:n.parent?{key:n.parent.key,summary:n.parent.fields?.summary}:null,subtasks:n.subtasks?.map(e=>({key:e.key,summary:e.fields.summary,status:e.fields.status?.name}))??[]})}catch(t){t instanceof Error&&t.message.includes(`404`)&&v(`工单 ${e} 不存在`,`not_found`),y(t)}})}function O(e){e.command(`search <jql>`).description(`用 JQL 搜索工单`).option(`--max <n>`,`最多返回条数(默认 50,上限 200)`,`50`).action(async(e,t)=>{try{let n=Math.min(parseInt(t.max)||50,200),r=await h().searchJira(e,{fields:[`summary`,`status`,`assignee`,`priority`,`issuetype`,`duedate`,`project`,`updated`],maxResults:n});_({total:r.total,issues:r.issues.map(e=>({key:e.key,project:e.fields.project?.key,type:e.fields.issuetype?.name,status:e.fields.status?.name,assignee:e.fields.assignee?.displayName??null,priority:e.fields.priority?.name,duedate:e.fields.duedate,updated:e.fields.updated,summary:e.fields.summary}))})}catch(e){y(e)}})}function k(e){e.command(`users <query>`).description(`按姓名搜索用户`).action(async e=>{try{_((await h().searchUsers({username:e,maxResults:10})).map(e=>({name:e.displayName,username:e.name,email:e.emailAddress})))}catch(e){y(e)}})}const A=[`DELETE_ISSUES`,`EDIT_ISSUES`,`TRANSITION_ISSUES`,`ASSIGN_ISSUES`,`ADD_COMMENTS`,`CREATE_ISSUES`];function j(e){e.command(`permissions <key>`).description(`查询当前用户对工单的操作权限`).action(async e=>{try{let t=(await h().genericGet(`mypermissions?issueKey=${e}`)).permissions;_(Object.fromEntries(A.map(e=>[t[e]?.name??e,t[e]?.havePermission??!1])))}catch(e){y(e)}})}function M(e){e.command(`transitions <key>`).description(`列出当前可用的状态流转,返回 [{id, name}]`).action(async e=>{try{_((await h().listTransitions(e)).transitions.map(e=>({id:e.id,name:e.name})))}catch(e){y(e)}})}function N(e){e.command(`transition <key> <transitionId>`).description(`按 ID 执行状态流转(ID 从 transitions 命令取得)`).action(async(e,t)=>{try{await h().transitionIssue(e,{transition:{id:t}}),_({success:!0,key:e,transitionId:t})}catch(e){y(e,`validation`)}})}function P(e){e.command(`create-fields <projectKey> [issueType]`).description(`查询创建工单所需字段及必填项`).action(async(e,t)=>{try{let n=(await h().getIssueCreateMetadata({projectKeys:e,expand:`projects.issuetypes.fields`})).projects[0];n||v(`未找到项目 ${e}`,`not_found`),_((t?n.issuetypes.filter(e=>e.name.includes(t)):n.issuetypes).map(e=>({type:e.name,fields:Object.entries(e.fields).map(([e,t])=>({key:e,name:t.name,required:t.required,type:t.schema?.type,allowedValues:t.allowedValues?.slice(0,10).map(e=>e.name??e.value)}))})))}catch(e){y(e)}})}function F(e){e.command(`create <json>`).description(`创建工单,返回工单号和链接`).action(async e=>{let t;try{t=JSON.parse(e)}catch{v(`JSON 格式错误`,`validation`)}try{let e=await h().addNewIssue({fields:t}),n=u();_({key:e.key,url:`https://${n.host}/browse/${e.key}`})}catch(e){y(e,`validation`)}})}function I(e){e.command(`update <key> <json>`).description(`更新工单字段`).action(async(e,t)=>{let n;try{n=JSON.parse(t)}catch{v(`JSON 格式错误`,`validation`)}try{await h().updateIssue(e,{fields:n}),_({success:!0})}catch(e){y(e,`validation`)}})}function L(e){e.command(`comment <key> <body>`).description(`给工单添加评论`).action(async(e,t)=>{try{await h().addComment(e,t),_({success:!0})}catch(e){y(e)}})}function R(e){e.command(`delete <key>`).description(`删除工单(永久移除,内部先检查权限)`).action(async e=>{try{(await h().genericGet(`mypermissions?issueKey=${e}`)).permissions?.DELETE_ISSUES?.havePermission||v(`当前用户无权删除 ${e}`,`permission`),await h().deleteIssue(e),_({success:!0,deleted:e})}catch(e){y(e)}})}function z(e){return/^(\d+[wdhm]\s*)+$/.test(e.trim())}function B(e){return/^\d{4}-\d{2}-\d{2}$/.test(e)}function V(e){e.command(`worklog-get <key>`).description(`查看工单工时记录(预估/实际/剩余)`).action(async e=>{try{let t=await h().getIssue(e,`summary,timetracking`),n=await h().getIssueWorklogs(e),r=t.fields;_({key:e,summary:r.summary,timetracking:{originalEstimate:r.timetracking?.originalEstimate??null,remainingEstimate:r.timetracking?.remainingEstimate??null,timeSpent:r.timetracking?.timeSpent??null},worklogs:n.worklogs.map(e=>({id:e.id,author:e.author?.displayName,timeSpent:e.timeSpent,started:e.started?.slice(0,10),comment:e.comment}))})}catch(e){y(e)}})}function H(e){e.command(`worklog-add <key> <duration> [date]`).description(`记录用时(时长如 1h / 2h 30m / 1d,日期默认今天)`).action(async(e,t,n)=>{z(t)||v(`时长格式错误:"${t}",正确格式示例:1h、2h 30m、1d`,`validation`),n&&!B(n)&&v(`日期格式错误:"${n}",正确格式:YYYY-MM-DD`,`validation`);let r=n?new Date(n+`T09:00:00.000+0800`).toISOString().replace(`Z`,`+0800`):new Date().toISOString().replace(`Z`,`+0800`);try{await h().addWorklog(e,{timeSpent:t,started:r}),_({success:!0,key:e,timeSpent:t,date:n??new Date().toISOString().slice(0,10)})}catch(e){y(e)}})}function U(e){e.command(`worklog-delete <key> <worklogId>`).description(`删除工时记录(worklogId 从 worklog-get 获取)`).action(async(e,t)=>{try{await h().deleteWorklog(e,t),_({success:!0,key:e,worklogId:t})}catch(e){y(e)}})}function W(e){e.command(`time-set <key> <estimate> [remaining]`).description(`设置预估和剩余时间(时长如 1h / 1d 4h)`).action(async(e,t,n)=>{z(t)||v(`预估时长格式错误:"${t}",正确格式示例:1h、1d 4h`,`validation`),n&&!z(n)&&v(`剩余时长格式错误:"${n}",正确格式示例:1h、1d 4h`,`validation`);try{await h().updateIssue(e,{fields:{timetracking:{originalEstimate:t,remainingEstimate:n??t}}}),_({success:!0,key:e,originalEstimate:t,remainingEstimate:n??t})}catch(e){y(e)}})}function G(){let t=new e(`jira`).description(`JIRA 工单操作`);return b(t),x(t),S(t),C(t),w(t),T(t),E(t),D(t),O(t),k(t),j(t),M(t),N(t),P(t),F(t),I(t),L(t),R(t),V(t),H(t),U(t),W(t),t}const K=new e;K.name(`kdev`).description(`DevFlow CLI — agent-first 开发者工具链`).version(`0.1.0`),K.addCommand(G()),K.parseAsync(process.argv);export{};
`)}await r(),n()})});await r(),p({me:n,team:t}),process.stderr.write(`\n已保存团队配置(${t.length} 人)\n`)}e.close(),_({success:!0,username:t.name,displayName:t.displayName})}catch{e.close();try{n.unlinkSync(l())}catch{}v(`Token 验证失败,请检查后重试`,`auth`)}})}function x(e){e.command(`whoami`).description(`返回当前登录用户信息`).action(async()=>{try{let e=await h().genericGet(`myself`);_({username:e.name,displayName:e.displayName,email:e.emailAddress})}catch(e){y(e)}})}function S(e){e.command(`team-members`).description(`返回团队成员列表`).action(()=>{_(d().team??[])})}function C(e){e.command(`team-add <username>`).description(`向团队成员列表追加成员`).action(async e=>{let t=d();t.team.some(t=>t.username===e)&&v(`成员 ${e} 已存在`,`validation`);try{let n=(await h().searchUsers({username:e,maxResults:1}))[0];n||v(`未找到用户 ${e}`,`not_found`),t.team.push({username:n.name,displayName:n.displayName}),p(t),_({success:!0,added:{username:n.name,displayName:n.displayName}})}catch(e){y(e)}})}function w(e){e.command(`team-remove <username>`).description(`从团队成员列表移除成员`).action(e=>{let t=d(),n=t.team.length;t.team=t.team.filter(t=>t.username!==e),t.team.length===n&&v(`成员 ${e} 不存在`,`not_found`),p(t),_({success:!0,removed:e})})}function T(e){e.command(`projects`).description(`列出所有可见项目`).action(async()=>{try{_((await h().listProjects()).map(e=>({key:e.key,name:e.name})))}catch(e){y(e)}})}function E(e){e.command(`issue <key>`).description(`查看工单详情(含子任务、父任务)`).action(async e=>{try{let t=await h().getIssue(e),n=t.fields;_({key:t.key,summary:n.summary,type:n.issuetype?.name,status:n.status?.name,priority:n.priority?.name,assignee:n.assignee?{name:n.assignee.displayName,username:n.assignee.name}:null,reporter:n.reporter?{name:n.reporter.displayName,username:n.reporter.name}:null,description:n.description,duedate:n.duedate,created:n.created,updated:n.updated,parent:n.parent?{key:n.parent.key,summary:n.parent.fields?.summary}:null,subtasks:n.subtasks?.map(e=>({key:e.key,summary:e.fields.summary,status:e.fields.status?.name}))??[]})}catch(t){t instanceof Error&&t.message.includes(`404`)&&v(`工单 ${e} 不存在`,`not_found`),y(t)}})}function D(e){e.command(`search <jql>`).description(`用 JQL 搜索工单`).option(`--max <n>`,`最多返回条数(默认 50,上限 200)`,`50`).action(async(e,t)=>{try{let n=Math.min(parseInt(t.max)||50,200),r=await h().searchJira(e,{fields:[`summary`,`status`,`assignee`,`priority`,`issuetype`,`duedate`,`project`,`updated`],maxResults:n});_({total:r.total,issues:r.issues.map(e=>({key:e.key,project:e.fields.project?.key,type:e.fields.issuetype?.name,status:e.fields.status?.name,assignee:e.fields.assignee?.displayName??null,priority:e.fields.priority?.name,duedate:e.fields.duedate,updated:e.fields.updated,summary:e.fields.summary}))})}catch(e){y(e)}})}function O(e){e.command(`users <query>`).description(`按姓名搜索用户`).action(async e=>{try{_((await h().searchUsers({username:e,maxResults:10})).map(e=>({name:e.displayName,username:e.name,email:e.emailAddress})))}catch(e){y(e)}})}const k=[`DELETE_ISSUES`,`EDIT_ISSUES`,`TRANSITION_ISSUES`,`ASSIGN_ISSUES`,`ADD_COMMENTS`,`CREATE_ISSUES`];function A(e){e.command(`permissions <key>`).description(`查询当前用户对工单的操作权限`).action(async e=>{try{let t=(await h().genericGet(`mypermissions?issueKey=${e}`)).permissions;_(Object.fromEntries(k.map(e=>[t[e]?.name??e,t[e]?.havePermission??!1])))}catch(e){y(e)}})}function j(e){e.command(`transitions <key>`).description(`列出当前可用的状态流转,返回 [{id, name}]`).action(async e=>{try{_((await h().listTransitions(e)).transitions.map(e=>({id:e.id,name:e.name})))}catch(e){y(e)}})}function M(e){e.command(`transition <key> <transitionId>`).description(`按 ID 执行状态流转(ID 从 transitions 命令取得)`).action(async(e,t)=>{try{await h().transitionIssue(e,{transition:{id:t}}),_({success:!0,key:e,transitionId:t})}catch(e){y(e,`validation`)}})}function N(e){e.command(`create-fields <projectKey> [issueType]`).description(`查询创建工单所需字段及必填项`).action(async(e,t)=>{try{let n=(await h().getIssueCreateMetadata({projectKeys:e,expand:`projects.issuetypes.fields`})).projects[0];n||v(`未找到项目 ${e}`,`not_found`),_((t?n.issuetypes.filter(e=>e.name.includes(t)):n.issuetypes).map(e=>({type:e.name,fields:Object.entries(e.fields).map(([e,t])=>({key:e,name:t.name,required:t.required,type:t.schema?.type,allowedValues:t.allowedValues?.slice(0,10).map(e=>e.name??e.value)}))})))}catch(e){y(e)}})}function P(e){e.command(`create <json>`).description(`创建工单,返回工单号和链接`).action(async e=>{let t;try{t=JSON.parse(e)}catch{v(`JSON 格式错误`,`validation`)}try{let e=await h().addNewIssue({fields:t}),n=u();_({key:e.key,url:`https://${n.host}/browse/${e.key}`})}catch(e){y(e,`validation`)}})}function F(e){e.command(`update <key> <json>`).description(`更新工单字段`).action(async(e,t)=>{let n;try{n=JSON.parse(t)}catch{v(`JSON 格式错误`,`validation`)}try{await h().updateIssue(e,{fields:n}),_({success:!0})}catch(e){y(e,`validation`)}})}function I(e){e.command(`comment <key> <body>`).description(`给工单添加评论`).action(async(e,t)=>{try{await h().addComment(e,t),_({success:!0})}catch(e){y(e)}})}function L(e){e.command(`delete <key>`).description(`删除工单(永久移除,内部先检查权限)`).action(async e=>{try{(await h().genericGet(`mypermissions?issueKey=${e}`)).permissions?.DELETE_ISSUES?.havePermission||v(`当前用户无权删除 ${e}`,`permission`),await h().deleteIssue(e),_({success:!0,deleted:e})}catch(e){y(e)}})}function R(e){return/^(\d+[wdhm]\s*)+$/.test(e.trim())}function z(e){return/^\d{4}-\d{2}-\d{2}$/.test(e)}function B(e){e.command(`worklog-get <key>`).description(`查看工单工时记录(预估/实际/剩余)`).action(async e=>{try{let t=await h().getIssue(e,`summary,timetracking`),n=await h().getIssueWorklogs(e),r=t.fields;_({key:e,summary:r.summary,timetracking:{originalEstimate:r.timetracking?.originalEstimate??null,remainingEstimate:r.timetracking?.remainingEstimate??null,timeSpent:r.timetracking?.timeSpent??null},worklogs:n.worklogs.map(e=>({id:e.id,author:e.author?.displayName,timeSpent:e.timeSpent,started:e.started?.slice(0,10),comment:e.comment}))})}catch(e){y(e)}})}function V(e){e.command(`worklog-add <key> <duration> [date]`).description(`记录用时(时长如 1h / 2h 30m / 1d,日期默认今天)`).action(async(e,t,n)=>{R(t)||v(`时长格式错误:"${t}",正确格式示例:1h、2h 30m、1d`,`validation`),n&&!z(n)&&v(`日期格式错误:"${n}",正确格式:YYYY-MM-DD`,`validation`);let r=n?new Date(n+`T09:00:00.000+0800`).toISOString().replace(`Z`,`+0800`):new Date().toISOString().replace(`Z`,`+0800`);try{await h().addWorklog(e,{timeSpent:t,started:r}),_({success:!0,key:e,timeSpent:t,date:n??new Date().toISOString().slice(0,10)})}catch(e){y(e)}})}function H(e){e.command(`worklog-delete <key> <worklogId>`).description(`删除工时记录(worklogId 从 worklog-get 获取)`).action(async(e,t)=>{try{await h().deleteWorklog(e,t),_({success:!0,key:e,worklogId:t})}catch(e){y(e)}})}function U(e){e.command(`time-set <key> <estimate> [remaining]`).description(`设置预估和剩余时间(时长如 1h / 1d 4h)`).action(async(e,t,n)=>{R(t)||v(`预估时长格式错误:"${t}",正确格式示例:1h、1d 4h`,`validation`),n&&!R(n)&&v(`剩余时长格式错误:"${n}",正确格式示例:1h、1d 4h`,`validation`);try{await h().updateIssue(e,{fields:{timetracking:{originalEstimate:t,remainingEstimate:n??t}}}),_({success:!0,key:e,originalEstimate:t,remainingEstimate:n??t})}catch(e){y(e)}})}function W(){let t=new e(`jira`).description(`JIRA 工单操作`);return b(t),x(t),S(t),C(t),w(t),T(t),E(t),D(t),O(t),A(t),j(t),M(t),N(t),P(t),F(t),I(t),L(t),B(t),V(t),H(t),U(t),t}const G=new e;G.name(`kdev`).description(`DevFlow CLI — agent-first 开发者工具链`).version(`0.1.0`),G.addCommand(W()),G.parseAsync(process.argv);export{};
{
"name": "@kmfe/devflow",
"version": "0.1.0-beta.2",
"version": "0.1.0-beta.3",
"description": "DevFlow CLI - agent-first developer toolchain (JIRA, GitLab, etc.)",

@@ -31,5 +31,4 @@ "type": "module",

"dev": "tsdown --watch",
"typecheck": "tsc --noEmit",
"release": "npm publish"
"typecheck": "tsc --noEmit"
}
}