@tocca-systems/twp-cli 0.25.1 → 0.27.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/CHANGELOG.public.md +10 -0
- package/README.md +6 -1
- package/dist/{agent-loop-ZP47LTUE.js → agent-loop-AOTZLJP2.js} +1 -1
- package/dist/{ai-dispatch-3DJKBIV6.js → ai-dispatch-UQHPVRWN.js} +36 -28
- package/dist/{api-command-VWJXBUCJ.js → api-command-CR2JAAE4.js} +2 -2
- package/dist/{app-3JIU5OUX.js → app-WEMM2X7A.js} +2 -2
- package/dist/{backlog-KSMQIC2R.js → backlog-I7GP3RXI.js} +1 -1
- package/dist/{chunk-24ZZFFA3.js → chunk-5PU5QU5U.js} +1 -1
- package/dist/{chunk-NIAOX77K.js → chunk-ECAVSNCJ.js} +21 -21
- package/dist/{chunk-KUIFIN7P.js → chunk-KAUPWF5Q.js} +1 -1
- package/dist/{chunk-X45SJNT2.js → chunk-QQR4OHGV.js} +8 -8
- package/dist/{chunk-VGMWPPGD.js → chunk-RDJYKA3U.js} +1 -1
- package/dist/{chunk-WQ66EYZS.js → chunk-XAMHF5MK.js} +1 -1
- package/dist/{chunk-TYNCXQSN.js → chunk-Y2XAWM2X.js} +13 -12
- package/dist/{chunk-IRAZ27WL.js → chunk-ZCA5CUH7.js} +6 -2
- package/dist/cli.js +12 -7
- package/dist/{commands-OFLBUP6O.js → commands-DDXAFNPT.js} +1 -1
- package/dist/{commands-JLPNUSNZ.js → commands-EOKUE4FC.js} +8 -7
- package/dist/{department-GH475WCF.js → department-6LOJILBM.js} +2 -2
- package/dist/{job-title-FC2GWDE7.js → job-title-WROIJ7IK.js} +1 -2
- package/dist/{logout-guard-3PB3VMGP.js → logout-guard-ICSEMN3J.js} +1 -1
- package/dist/{media-TD7D4TXF.js → media-4CAV5ZRC.js} +1 -1
- package/dist/{oneshot-QQOOZZDT.js → oneshot-J4VX47WN.js} +1 -1
- package/dist/{position-4RHTV3IK.js → position-JI33IPTS.js} +2 -2
- package/dist/{run-VNHAQO24.js → run-XCH5FTSU.js} +1 -1
- package/dist/{server-settings-YL6KALXG.js → server-settings-RC5BOWUW.js} +1 -1
- package/dist/{setup-BJKIHANC.js → setup-CDQ2CEUR.js} +1 -1
- package/dist/{task-7VOYCG26.js → task-VDNZD2FU.js} +27 -9
- package/dist/{user-UU2SLVC4.js → user-JBHTU4TP.js} +39 -40
- package/package.json +1 -1
- package/dist/chunk-UDPJ2IGK.js +0 -7
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
2
|
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{repeatedValues}from"./chunk-IOGVQVGD.js";import{createFlags,fieldBody,hasAnyField,resolveRefFields,updateFlags}from"./chunk-
|
|
4
|
-
import{
|
|
3
|
+
import{repeatedValues}from"./chunk-IOGVQVGD.js";import{booleanText,boundedText,createFlags,fieldBody,hasAnyField,isoDate,isoDateValue,resolveRefFields,updateFlags}from"./chunk-ZCA5CUH7.js";import{LIST_FLAGS,LIST_PAGING_HELP,envelopePaging,flagSegment,nonEmpty,positiveInteger,shellQuote}from"./chunk-G4OO4M44.js";import{DEPARTMENTS_PATH,ORG_MASTER_LIMIT,POSITIONS_PATH}from"./chunk-ECAVSNCJ.js";import{ResolveError,isSafePathSegment}from"./chunk-GMBJTG6A.js";import{ApiError}from"./chunk-FTYJZFEK.js";
|
|
4
|
+
import{requireResolved,singleRef,withResolved}from"./chunk-ZN5EFDH7.js";import"./chunk-II5RVJQN.js";import{isRecord,pick}from"./chunk-ZWVYVS2A.js";import"./chunk-QQRJLH6B.js";import"./chunk-J7QYPKVK.js";import"./chunk-NERYSBA4.js";import"./chunk-RZVI6PMW.js";import"./chunk-NHYMHCAT.js";import{ApiRejectedError,ApiResponseError,UsageError}from"./chunk-7WSNIXTQ.js";import"./chunk-VSJBJXZO.js";import fs3 from"fs";import fs from"fs";var BOM=new RegExp(`^${String.fromCharCode(65279)}`);function decodeCsvText(bytes){try{return new TextDecoder("utf-8",{fatal:true}).decode(bytes).replace(BOM,"")}catch{return new TextDecoder("shift_jis").decode(bytes)}}function readCsvFileText(file,usage,maxBytes,tooLarge){try{const stat=fs.statSync(file);if(!stat.isFile())throw new UsageError(`--file \u306B\u901A\u5E38\u306E\u30D5\u30A1\u30A4\u30EB\u4EE5\u5916\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093: ${file}`,usage);if(stat.size>maxBytes)
|
|
5
|
+
throw tooLarge(stat.size);return decodeCsvText(fs.readFileSync(file))}catch(err){if(err instanceof UsageError)throw err;const reason=err.code??err.message;throw new UsageError(`--file \u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u3081\u307E\u305B\u3093: ${file}\uFF08${reason}\uFF09`,usage)}}var USER_REF_HELP="<\u30E6\u30FC\u30B6\u30FC> \u306F ID\u30FB\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u30FB\u793E\u54E1\u756A\u53F7\u30FB\u6C0F\u540D\u30FBme\uFF08\u81EA\u5206\uFF09\u306E\u3069\u308C\u3067\u3082\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002\n\u6C0F\u540D\u306F\u5B8C\u5168\u4E00\u81F4\u30671\u4EBA\u306B\u7D5E\u308C\u305F\u3068\u304D\u3060\u3051\u53D7\u3051\u4ED8\u3051\u307E\u3059\uFF08\u540C\u59D3\u540C\u540D\u306A\u3089\u5019\u88DC\u3092\u51FA\u3057\u3066\u6B62\u307E\u308B\u306E\u3067\u3001\n\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u304B\u793E\u54E1\u756A\u53F7\u3067\u6307\u5B9A\u3057\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\u3002ID \u4EE5\u5916\u306F\u3001\u30C6\u30CA\u30F3\u30C8\u306E\u30E6\u30FC\u30B6\u30FC\u4E00\u89A7\n\uFF08\u65E2\u5B9A10\u5206\u30AD\u30E3\u30C3\u30B7\u30E5\u30FB--refresh \u3067\u53D6\u308A\u76F4\u3057\uFF09\u3068\u7167\u5408\u3057\u307E\u3059\u3002\n\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u306F\u793E\u54E1\u756A\u53F7\u3067\u306F\u5F15\u3051\u307E\u305B\u3093\u3002\u7D44\u7E54\u7BA1\u7406\u8005\u3067\u306A\u3044\u5834\u5408\u306F ID \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002";
|
|
5
6
|
function userPath(input,suffix=""){const userId=requireResolved(input,"userId");if(!isSafePathSegment(userId)){throw new ApiResponseError(`\u30B5\u30FC\u30D0\u304C\u8FD4\u3057\u305F\u30E6\u30FC\u30B6\u30FC ID \u3092\u30D1\u30B9\u306B\u4F7F\u3048\u307E\u305B\u3093: ${userId}\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return`${encodeURIComponent(userId)}${suffix}`}var USER_REF_FLAG={name:"--user",summary:"\u5BFE\u8C61\u306E\u30E6\u30FC\u30B6\u30FC\uFF08\u4F4D\u7F6E\u5F15\u6570\u306E\u4EE3\u308F\u308A\u306B\u4F7F\u3048\u308B\uFF09",
|
|
6
7
|
takesValue:true,placeholder:"<\u30E6\u30FC\u30B6\u30FC>"};async function prepareUser(input,ctx,usage){const ref=singleRef(input,{flag:"--user",label:"\u30E6\u30FC\u30B6\u30FC",usage});const user=await ctx.resolver.user(ref);return withResolved(input,{userId:user.id})}var ASSIGNMENT_COLUMNS=["id","department_name","position_name","start_date","end_date","is_primary","is_current","is_approval_route","effective_status"];function assignmentRows(body){const response=isRecord(body)&&"response"in body?body["response"]:body;const list=isRecord(response)?response["list"]:void 0;if(!Array.isArray(list)){throw new ApiResponseError("\u6240\u5C5E\u4E00\u89A7\u306E\u5FDC\u7B54\u306B list \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}
|
|
7
8
|
return list}async function nameMap(ctx,path,label2){try{const body=await ctx.send({method:"GET",path,query:{limit:ORG_MASTER_LIMIT}});const list=isRecord(body)?body["list"]:void 0;if(!Array.isArray(list))throw new Error(`${label2}\u4E00\u89A7\u306E\u5FDC\u7B54\u306B list \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093`);const count=isRecord(body)?body["count"]:void 0;if(typeof count==="number"&&count>list.length){ctx.warn(`${label2}\u4E00\u89A7\u304C ${count} \u4EF6\u4E2D ${list.length} \u4EF6\u3067\u5207\u308A\u8A70\u3081\u3089\
|
|
@@ -73,17 +74,16 @@ takesValue:true,placeholder:"<CSV>"};var ROW_FLAGS=[...MOVE_FIELDS.map(field=>fi
|
|
|
73
74
|
trim());cell2=""}else{cell2+=ch}}cells.push(cell2.trim());return cells}var MOVE_CSV_HEADERS=new Set(["user","\u30E6\u30FC\u30B6\u30FC","email","\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9"]);function parseMoveCsv(text){const rows=[];const errors=[];const seen=new Map;let headerChecked=false;text.replace(/^\uFEFF/,"").split(/\r?\n/).forEach((raw,index)=>{const line=index+1;if(raw.trim()===""||raw.trim().startsWith("#"))return;const cells=splitCsvLine(raw);if(!headerChecked){headerChecked=true;if(MOVE_CSV_HEADERS.
|
|
74
75
|
has((cells[0]??"").toLowerCase()))return}if(cells.length<3||cells.length>7){errors.push(`${line} \u884C\u76EE: \u5217\u304C ${cells.length} \u500B\u3042\u308A\u307E\u3059\uFF08\u30E6\u30FC\u30B6\u30FC, \u90E8\u7F72, \u7570\u52D5\u65E5[, \u5F79\u8077, \u8077\u4F4D, \u4E0A\u9577, \u89B3\u5BDF\u8005] \u306E3\u301C7\u5217\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF09`);return}const[user="",department="",date="",position="",jobTitle="",manager="",observers=""]=cells;const missing=[user===""?"\u30E6\u30FC\u30B6\u30FC":
|
|
75
76
|
null,department===""?"\u90E8\u7F72":null,date===""?"\u7570\u52D5\u65E5":null].filter(item=>item!==null);if(missing.length>0){errors.push(`${line} \u884C\u76EE: ${missing.join("\u30FB")}\u304C\u7A7A\u3067\u3059`);return}let startDate;try{startDate=isoDateValue(date,"\u7570\u52D5\u65E5")}catch(err){errors.push(`${line} \u884C\u76EE: ${err.message}`);return}const key=user.toLowerCase();const first=seen.get(key);if(first!==void 0){errors.push(`${line} \u884C\u76EE: ${user} \u306F ${first} \u884C\u76EE\u3068\u91CD\u8907\u3057\u3066\u3044\u307E\u3059\
|
|
76
|
-
\uFF081\u4EBA\u306B\u3064\u304D1\u884C\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF09`);return}seen.set(key,line);const observerRefs=observers.split(";").map(ref=>ref.trim()).filter(ref=>ref!=="");rows.push({line,user,department,startDate,position:position===""?null:position,jobTitle:jobTitle===""?null:jobTitle,manager:manager===""?null:manager,observers:observerRefs})});return{rows,errors}}function readMoveCsv(file,usage){
|
|
77
|
-
`--file \
|
|
78
|
-
|
|
79
|
-
resolver.user(row.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
length} \u884C\u3042\u308B\u305F\u3081\u30011\u4EF6\u3082\u9001\u3063\u3066\u3044\u307E\u305B\u3093:
|
|
77
|
+
\uFF081\u4EBA\u306B\u3064\u304D1\u884C\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF09`);return}seen.set(key,line);const observerRefs=observers.split(";").map(ref=>ref.trim()).filter(ref=>ref!=="");rows.push({line,user,department,startDate,position:position===""?null:position,jobTitle:jobTitle===""?null:jobTitle,manager:manager===""?null:manager,observers:observerRefs})});return{rows,errors}}function readMoveCsv(file,usage){return readCsvFileText(file,usage,MOVE_CSV_MAX_BYTES,size=>new UsageError(
|
|
78
|
+
`--file \u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${size} \u30D0\u30A4\u30C8\u30FB\u4E0A\u9650 ${MOVE_CSV_MAX_BYTES} \u30D0\u30A4\u30C8\uFF09: ${file}`,"CSV \u3092\u5206\u3051\u3066\u6253\u3063\u3066\u304F\u3060\u3055\u3044\u3002"))}function isBulk(input){return input.flags.has(FILE_FLAG.name)}function bulkMoveRows(input){return JSON.parse(requireResolved(input,"bulkRows"))}function rowPlan(row){return{method:"POST",path:assignmentsPath(row.userId),body:row.body}}
|
|
79
|
+
async function prepareBulkRow(row,ctx,usage){const user=await ctx.resolver.user(row.user,"\u30E6\u30FC\u30B6\u30FC");const department=await ctx.resolver.department(row.department,"\u90E8\u7F72");const position=row.position===null?null:await ctx.resolver.position(row.position,"\u5F79\u8077");const noJobTitle=row.jobTitle!==null&&row.jobTitle.toLowerCase()===NO_JOB_TITLE;const jobTitle=row.jobTitle===null||noJobTitle?null:await ctx.resolver.jobTitle(row.jobTitle,"\u8077\u4F4D");const manager=row.manager===
|
|
80
|
+
null?null:await ctx.resolver.user(row.manager,"\u4E0A\u9577");const observers=[];for(const ref of row.observers)observers.push((await ctx.resolver.user(ref,"\u89B3\u5BDF\u8005")).id);const preflight=await primaryPreflight(ctx,user.id,row.startDate,usage);const current=preflight["currentPrimary"]===""||preflight["currentPrimary"]===void 0?null:JSON.parse(preflight["currentPrimary"]);let positionId=position?.id??null;if(positionId===null){if(current?.position_id==null){throw new UsageError("\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\
|
|
81
|
+
\u304C\u7121\u3044\uFF08\u307E\u305F\u306F\u5F79\u8077\u304C\u7121\u3044\uFF09\u305F\u3081\u3001\u5F79\u8077\u3092\u5F15\u304D\u7D99\u3052\u307E\u305B\u3093\u3002\u5F79\u8077\u306E\u5217\u3092\u57CB\u3081\u3066\u304F\u3060\u3055\u3044")}positionId=current.position_id}const jobTitleId=jobTitle?.id??(noJobTitle?null:current?.job_title_id??null);const body={department_id:department.id,position_id:positionId};if(jobTitleId!==null)body["job_title_id"]=jobTitleId;if(manager!==null)body["manager_id"]=manager.
|
|
82
|
+
id;body["start_date"]=row.startDate;if(observers.length>0)body["observer_ids"]=observers;body["is_primary"]=true;return{line:row.line,user:row.user,userId:user.id,body,existingIds:JSON.parse(preflight["existingIds"]??"[]"),preview:{current,startDate:row.startDate,today:preflight["today"]??"",newDepartmentName:await nameOf(()=>ctx.resolver.departments(),department.id)??department.id,newPositionName:await nameOf(()=>ctx.resolver.positions(),positionId)??positionId,inheritedPosition:position===null,
|
|
83
|
+
inheritedJobTitle:jobTitle===null&&!noJobTitle&&jobTitleId!==null,given:{manager:manager!==null,observers:observers.length>0,interviewer:false,mentor:false}}}}async function prepareBulkMove(input,ctx){const usage="twp user assignment move help";if(input.args.length>0){throw new UsageError(`--file \u306E\u3068\u304D\u306F\u30E6\u30FC\u30B6\u30FC\u3092\u4F4D\u7F6E\u5F15\u6570\u3067\u53D7\u3051\u307E\u305B\u3093\uFF08CSV \u306E\u5217\u3067\u6307\u5B9A\u3057\u307E\u3059\uFF09: ${input.args.join(" ")}`,
|
|
84
|
+
usage)}const mixed=ROW_FLAGS.filter(flag=>input.flags.has(flag));if(mixed.length>0){throw new UsageError(`--file \u3068 ${mixed.join(" / ")} \u306F\u540C\u6642\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\uFF08\u884C\u3054\u3068\u306E\u5024\u306F CSV \u306E\u5217\u3067\u6E21\u3057\u307E\u3059\uFF09`,usage)}const file=input.flags.get(FILE_FLAG.name);if(file===void 0||file.trim()==="")throw new UsageError("--file <CSV> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",usage);const parsed=parseMoveCsv(
|
|
85
|
+
readMoveCsv(file,usage));const errors=[...parsed.errors.map(text=>({line:Number(text.split(" ")[0]),text}))];const rows=[];const byUserId=new Map;for(const row of parsed.rows){try{const prepared=await prepareBulkRow(row,ctx,usage);const first=byUserId.get(prepared.userId);if(first!==void 0)throw new UsageError(`${row.user} \u306F ${first} \u884C\u76EE\u3068\u540C\u3058\u30E6\u30FC\u30B6\u30FC\u3067\u3059\uFF081\u4EBA\u306B\u3064\u304D1\u884C\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF09`);byUserId.
|
|
86
|
+
set(prepared.userId,row.line);rows.push(prepared)}catch(err){if(!(err instanceof UsageError))throw err;errors.push({line:row.line,text:`${row.line} \u884C\u76EE: ${err.message}`})}}if(errors.length>0){errors.sort((a,b)=>a.line-b.line);throw new UsageError(`CSV \u306B\u4E0D\u6B63\u306A\u884C\u304C ${errors.length} \u884C\u3042\u308B\u305F\u3081\u30011\u4EF6\u3082\u9001\u3063\u3066\u3044\u307E\u305B\u3093:
|
|
87
87
|
${errors.map(e=>e.text).join("\n ")}`,`\u6B63\u3057\u3044\u884C\u306F ${rows.length} \u884C\u3067\u3059\u3002\u4E0D\u6B63\u306A\u884C\u3092\u76F4\u3059\u304B\u524A\u9664\u3057\u3066\u304B\u3089\u6253\u3061\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}if(rows.length===0)throw new UsageError(`CSV \u306B\u4ED8\u3051\u66FF\u3048\u308B\u884C\u304C\u3042\u308A\u307E\u305B\u3093: ${file}`,usage);return withResolved(input,{bulkRows:JSON.stringify(rows)})}function bulkPlannedNotes(input){const rows=bulkMoveRows(
|
|
88
88
|
input);const lines=[`${rows.length} \u4EF6\u3092\u4ED8\u3051\u66FF\u3048\u307E\u3059\uFF081\u884C\u305A\u3064\u6240\u5C5E\u306E\u4F5C\u6210\u3092 POST \u3057\u307E\u3059\u3002--dry-run \u306B\u51FA\u308B\u8981\u6C42\u306F1\u4EF6\u76EE\u306E\u5206\u3067\u3059\uFF09:`];for(const row of rows){lines.push(` ${row.line} \u884C\u76EE: ${row.user}`);lines.push(...movePreviewLines(row.preview," "))}lines.push("\u9001\u4FE1\u4E2D\u306B\u5931\u6557\u3057\u305F\u3089\u305D\u3053\u3067\u6B62\u3081\u3001\u6210\u529F\u3057\u305F\u884C\u30FB\u5931\u6557\u3057\u305F\u884C\u30FB\u672A\u9001\u4FE1\u306E\u884C\u3068\u3001\u6210\u529F\u3057\u305F\u884C\u306E\u623B\u3057\u65B9\u3092\u51FA\u3057\u307E\u3059\u3002");
|
|
89
89
|
return lines}function rowRevertCommands(row,newId){const current=row.preview.current;if(current===null)return[`twp user assignment delete ${shellQuote(newId)} --user ${shellQuote(row.userId)} --yes`];const immediate=row.preview.startDate<=row.preview.today;return revertCommands(row.userId,current,newId,immediate)}function isBulkBody(body){return isRecord(body)&&body["bulk"]===true&&Array.isArray(body["done"])}function revertBlock(done){const lines=[];for(const item of done){lines.push(` ${item.
|
|
@@ -139,10 +139,10 @@ ${commands.map(c=>` ${c}`).join("\n")}${later}`)}return notes}};var userAssignm
|
|
|
139
139
|
olumn <\u5217\u540D>] [--position-column <\u5217\u540D>] [--max-users <\u4EBA\u6570>]";var HELP="twp user export help";var listPaging=envelopePaging({label:"\u30E6\u30FC\u30B6\u30FC\u4E00\u89A7"});var LEDGER_ROLES=["code","name","email","department","position"];var ROLE_LABEL={code:"\u793E\u54E1\u756A\u53F7",name:"\u6C0F\u540D",email:"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9",department:"\u90E8\u7F72",position:"\u5F79\u8077"};var COLUMN_CANDIDATES={code:["\u793E\u54E1\u756A\u53F7","\u5F93\u696D\u54E1\u756A\u53F7",
|
|
140
140
|
"\u793E\u54E1\u30B3\u30FC\u30C9","\u5F93\u696D\u54E1\u30B3\u30FC\u30C9","employee_code","employee_no"],name:["\u6C0F\u540D","\u540D\u524D","\u793E\u54E1\u540D","\u5F93\u696D\u54E1\u540D","name","user_name"],email:["\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9","\u4F1A\u793E\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9","email","login_id"],department:["\u90E8\u7F72","\u90E8\u7F72\u540D","\u6240\u5C5E\u90E8\u7F72","department","department_name"],position:["\u5F79\u8077","\u5F79\u8077\u540D","position",
|
|
141
141
|
"position_name"]};function parseCsvRecords(text){const records=[];let cells=[];let field="";let quoted=false;let started=false;let line=1;let recordLine=1;let i=0;const pushRecord=()=>{cells.push(field);records.push({line:recordLine,cells});cells=[];field="";started=false};while(i<text.length){const ch=text[i];if(quoted){if(ch==='"'){if(text[i+1]==='"'){field+='"';i+=2;continue}quoted=false}else if(ch==="\r"||ch==="\n"){if(ch==="\r"&&text[i+1]==="\n")i+=1;line+=1;field+="\n"}else{field+=ch}i+=1;
|
|
142
|
-
continue}if(ch==='"'&&field.trim()===""){quoted=true;started=true;field=""}else if(ch===","){cells.push(field);field="";started=true}else if(ch==="\r"||ch==="\n"){if(ch==="\r"&&text[i+1]==="\n")i+=1;pushRecord();line+=1;recordLine=line}else{field+=ch;started=true}i+=1}if(quoted)throw new UsageError(`\u53F0\u5E33 CSV \u306E ${recordLine} \u884C\u76EE\u3067\u5F15\u7528\u7B26\uFF08"\uFF09\u304C\u9589\u3058\u3066\u3044\u307E\u305B\u3093`,HELP);if(started)pushRecord();return records}var
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
142
|
+
continue}if(ch==='"'&&field.trim()===""){quoted=true;started=true;field=""}else if(ch===","){cells.push(field);field="";started=true}else if(ch==="\r"||ch==="\n"){if(ch==="\r"&&text[i+1]==="\n")i+=1;pushRecord();line+=1;recordLine=line}else{field+=ch;started=true}i+=1}if(quoted)throw new UsageError(`\u53F0\u5E33 CSV \u306E ${recordLine} \u884C\u76EE\u3067\u5F15\u7528\u7B26\uFF08"\uFF09\u304C\u9589\u3058\u3066\u3044\u307E\u305B\u3093`,HELP);if(started)pushRecord();return records}var decodeLedger=decodeCsvText;
|
|
143
|
+
function normalizeHeader(value){return value.normalize("NFKC").trim().toLowerCase()}function normalizeValue(value){return value.normalize("NFKC").replace(/\s+/g," ").trim().toLowerCase()}function resolveColumns(header,overrides){const normalized=header.map(normalizeHeader);const map={};for(const role of LEDGER_ROLES){const wanted=overrides[role];if(wanted!==void 0){const index2=normalized.indexOf(normalizeHeader(wanted));if(index2<0){throw new UsageError(`\u53F0\u5E33 CSV \u306B\u300C${wanted}\u300D\u3068\
|
|
144
|
+
\u3044\u3046\u5217\u304C\u3042\u308A\u307E\u305B\u3093\uFF08--${role}-column\uFF09`,`\u898B\u51FA\u3057\u884C\u306E\u5217: ${header.map(h=>h.trim()).join("\u3001")}`)}map[role]=index2;continue}const index=normalized.findIndex(h=>COLUMN_CANDIDATES[role].some(c=>normalizeHeader(c)===h));if(index>=0)map[role]=index}if(map.code===void 0&&map.email===void 0&&map.name===void 0){throw new UsageError("\u53F0\u5E33 CSV \u306B\u3001\u4EBA\u3092\u7A81\u304D\u5408\u308F\u305B\u308B\u5217\uFF08\u793E\u54E1\u756A\u53F7\u30FB\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u30FB\u6C0F\u540D\u306E\u3069\u308C\u304B\uFF09\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",
|
|
145
|
+
`\u898B\u51FA\u3057\u884C\u306E\u5217: ${header.map(h=>h.trim()).join("\u3001")}
|
|
146
146
|
\u5217\u540D\u304C\u9055\u3046\u3068\u304D\u306F --code-column / --email-column / --name-column \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return map}function parseLedger(text,overrides){const records=parseCsvRecords(text).filter(r=>r.cells.some(c=>c.trim()!==""));const[header,...body]=records;if(header===void 0)throw new UsageError("\u53F0\u5E33 CSV \u304C\u7A7A\u3067\u3059\uFF081\u884C\u76EE\u306B\u898B\u51FA\u3057\u304C\u5FC5\u8981\u3067\u3059\uFF09",HELP);const columns=resolveColumns(
|
|
147
147
|
header.cells,overrides);const rows=[];const errors=[];const seen={code:new Map,email:new Map};for(const record of body){const value=role=>{const index=columns[role];if(index===void 0)return void 0;const raw=(record.cells[index]??"").trim();return raw===""?void 0:raw};const cells={};for(const role of LEDGER_ROLES){const v=value(role);if(v!==void 0)cells[role]=v}const row={line:record.line,...cells};if(row.code===void 0&&row.email===void 0&&row.name===void 0){errors.push(`${record.line} \u884C\u76EE: \u793E\u54E1\u756A\u53F7\u30FB\u30E1\
|
|
148
148
|
\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u30FB\u6C0F\u540D\u304C\u3059\u3079\u3066\u7A7A\u3067\u3059`);continue}let duplicated=false;for(const role of["code","email"]){const v=row[role];if(v===void 0)continue;const first=seen[role].get(normalizeValue(v));if(first!==void 0){errors.push(`${record.line} \u884C\u76EE: ${ROLE_LABEL[role]} ${v} \u306F ${first} \u884C\u76EE\u3068\u91CD\u8907\u3057\u3066\u3044\u307E\u3059`);duplicated=true}else{seen[role].set(normalizeValue(v),record.line)}}if(!duplicated)rows.
|
|
@@ -223,33 +223,32 @@ bled")?rows:rows.filter(r=>r.can_login);return{mode:"inventory",rows:visible,sca
|
|
|
223
223
|
rows.map(row=>Object.fromEntries(INVENTORY_COLUMNS.map(c=>{if(c==="permissions")return[c,permissionText(row.permissions)];if(c==="last_login_at")return[c,lastLoginText(row)];if(c==="manager_name")return[c,spreadsheetSafe(row.manager_name??row.manager_id)];return[c,spreadsheetSafe(row[c])]})))},raw:body=>exportBody(body).rows,notes(body){const result=exportBody(body);const notes=[`${result.scanned} \u4EBA\u3092\u8AAD\u307F\u307E\u3057\u305F\uFF08\u3046\u3061\u5931\u52B9\u6E08\u307F ${result.disabled}\
|
|
224
224
|
\u4EBA\uFF09\u3002`+(result.excludedHidden?"\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u306F\u5BFE\u8C61\u5916\u3067\u3059\uFF08--exclude-hidden\uFF09\u3002":"")];if(result.ssoUndetermined>0){notes.push(`\u8A8D\u8A3C\u30BF\u30A4\u30D7\u304C oauth \u306E ${result.ssoUndetermined} \u4EBA\u306F\u3001SSO \u306E\u30ED\u30B0\u30A4\u30F3\u304C\u8A18\u9332\u3055\u308C\u306A\u3044\u305F\u3081\u6700\u7D42\u30ED\u30B0\u30A4\u30F3\u3092\u5224\u5B9A\u3057\u3066\u3044\u307E\u305B\u3093\u3002`)}
|
|
225
225
|
if(result.mode==="diff"){const counts=new Map;for(const row of result.rows)counts.set(row.kind,(counts.get(row.kind)??0)+1);notes.push(counts.size===0?"\u53F0\u5E33\u3068\u306E\u5DEE\u5206\u306F\u3042\u308A\u307E\u305B\u3093\u3002":`\u5DEE\u5206: ${[...counts].map(([kind,n])=>`${kind} ${n}\u4EF6`).join(" / ")}`);if(result.excludedHidden){notes.push("--exclude-hidden \u306E\u305F\u3081\u3001\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u307E\u307E\u5931\u52B9\u3057\u3066\u3044\u306A\u3044\u30E6\u30FC\u30B6\u30FC\uFF08\u5931\u52B9\u6F0F\u308C\uFF09\u306F\u51FA\u3066\u3044\u307E\u305B\u3093\u3002\u307E\u305F\u3001\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u304C missing_in_twp\uFF08\u767B\u9332\u6F0F\u308C\uFF09\u3068\u3057\u3066\u51FA\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002")}}
|
|
226
|
-
return notes}};
|
|
226
|
+
return notes}};var INVITATIONS_PATH="/api/v2/admin/invitations";var INVITE_ROLES=["user","admin","super_admin"];var BULK_MAX=50;var CSV_MAX_BYTES=256*1024;var EMAIL_RE=/^[^\s@,;]+@[^\s@,;]+$/;var LIST_COLUMNS=["email","user_name","role","status","created_at","expires_at"];var ROLE_HELP="\u6A29\u9650\u306F user\uFF08\u4E00\u822C\uFF09/ admin\uFF08\u7BA1\u7406\u8005\uFF09/ super_admin\uFF08\u5168\u4F53\u7BA1\u7406\u8005\uFF09\u3067\u3059\u3002";var FORBIDDEN2="\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002\u30E6\u30FC\u30B6\u30FC\u306E\u62DB\u5F85\u306F\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u6271\u3048\u307E\u3059";
|
|
227
227
|
var INVITE_REF_HELP="<\u62DB\u5F85> \u306F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u3067\u6307\u5B9A\u3057\u307E\u3059\uFF08\u672A\u53D7\u8AFE\u306E\u62DB\u5F85\u304C1\u4EF6\u306B\u7D5E\u308C\u305F\u3068\u304D\u3060\u3051\u53D7\u3051\u4ED8\u3051\u307E\u3059\uFF09\u3002\n\u5BFE\u8C61\u306F twp user invite list \u306B\u51FA\u308B\u62DB\u5F85\uFF08\u671F\u9650\u5185\u306E\u672A\u53D7\u8AFE\uFF09\u3060\u3051\u3067\u3059\u3002\n\u540C\u3058\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306B\u672A\u53D7\u8AFE\u306E\u62DB\u5F85\u304C\u8907\u6570\u3042\u308B\u3068\u304D\u306F\u3001twp user invite list --no-redact \u3067\n\u30C8\u30FC\u30AF\u30F3\u3092\u78BA\u8A8D\u3057\u3066\u3001\u30C8\u30FC\u30AF\u30F3\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002";
|
|
228
228
|
function roleValue(raw,where){const value=raw.trim().toLowerCase();if(!INVITE_ROLES.includes(value)){throw new UsageError(`${where}\u306B\u300C${raw}\u300D\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,ROLE_HELP)}return value}function successAck(body,label2){if(!isRecord(body)||body["result"]!==true){throw new ApiResponseError(`${label2}\u306E\u5FDC\u7B54\u304C\u60F3\u5B9A\u306E\u5F62\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}
|
|
229
229
|
return{result:true,message:body["message"]??null}}function invitationRows(body){const rows=isRecord(body)?body["invitations"]:void 0;if(!Array.isArray(rows)){throw new ApiResponseError("\u62DB\u5F85\u4E00\u89A7\u306E\u5FDC\u7B54\u306B invitations \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}return rows.filter(isRecord)}function cell(raw){const trimmed=raw.trim();return trimmed.length>=2&&trimmed.startsWith(
|
|
230
230
|
'"')&&trimmed.endsWith('"')?trimmed.slice(1,-1).trim():trimmed}function parseInviteCsv(text){const rows=[];const errors=[];const seen=new Map;const lines=text.replace(/^\uFEFF/,"").split(/\r?\n/);let headerChecked=false;lines.forEach((raw,index)=>{const line=index+1;if(raw.trim()===""||raw.trim().startsWith("#"))return;const cells=raw.split(",").map(cell);if(!headerChecked){headerChecked=true;const head=(cells[0]??"").toLowerCase();if(head==="email"||head==="\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9"||
|
|
231
231
|
head==="mail")return}if(cells.length!==2){errors.push(`${line} \u884C\u76EE: \u5217\u304C ${cells.length} \u500B\u3042\u308A\u307E\u3059\uFF08\u300C\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9, \u6A29\u9650\u300D\u306E2\u5217\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u6C0F\u540D\u306F\u53D7\u8AFE\u6642\u306B\u672C\u4EBA\u304C\u5165\u529B\u3057\u307E\u3059\uFF09`);return}const[email,role]=cells;if(!EMAIL_RE.test(email)){errors.push(`${line} \u884C\u76EE: \u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306E\u5F62\u304C\u9055\u3044\u307E\u3059: ${email===
|
|
232
232
|
""?"\uFF08\u7A7A\uFF09":email}`);return}const normalizedRole=role.toLowerCase();if(!INVITE_ROLES.includes(normalizedRole)){errors.push(`${line} \u884C\u76EE: \u6A29\u9650\u306B\u300C${role===""?"\uFF08\u7A7A\uFF09":role}\u300D\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\uFF08${INVITE_ROLES.join(" / ")}\uFF09`);return}const key=email.toLowerCase();const first=seen.get(key);if(first!==void 0){errors.push(`${line} \u884C\u76EE: ${email} \u306F ${first} \u884C\u76EE\u3068\u91CD\u8907\u3057\u3066\u3044\u307E\u3059`);
|
|
233
|
-
return}seen.set(key,line);rows.push({line,email,role:normalizedRole})});return{rows,errors}}function readCsvFile(file,usage){
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
"
|
|
245
|
-
"\
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
usage:"twp user invite bulk --file <CSV>",description:`CSV \u306F\u300C\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9, \u6A29\u9650\u300D\u306E2\u5217\u3067\u3059\uFF081\u884C\u76EE\u306E\u30D8\u30C3\u30C0 email,role \u306F\u7701\u7565\u3067\u304D\u307E\u3059\uFF09\u3002
|
|
233
|
+
return}seen.set(key,line);rows.push({line,email,role:normalizedRole})});return{rows,errors}}function readCsvFile(file,usage){return readCsvFileText(file,usage,CSV_MAX_BYTES,size=>new UsageError(`--file \u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${size} \u30D0\u30A4\u30C8\uFF09: ${file}`,`\u4E00\u5EA6\u306B\u62DB\u5F85\u3067\u304D\u308B\u306E\u306F ${BULK_MAX} \u4EF6\u307E\u3067\u3067\u3059\u3002`))}function bulkRows(input){return JSON.parse(requireResolved(input,
|
|
234
|
+
"rows"))}function matchResults(response,sent){const results=isRecord(response)?response["results"]:void 0;if(!isRecord(response)||response["result"]!==true||!Array.isArray(results)){throw new ApiResponseError("\u4E00\u62EC\u62DB\u5F85\u306E\u5FDC\u7B54\u306B results \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}const byEmail=new Map(sent.map(row=>[row.email.toLowerCase(),row]));const answered=new Set;const rows=results.
|
|
235
|
+
filter(isRecord).map(result=>{const email=String(result["email"]??"");const row=byEmail.get(email.toLowerCase());answered.add(email.toLowerCase());return{line:row?.line??null,email,role:row?.role??null,success:result["success"]===true,queued:result["queued"]===true,error:typeof result["error"]==="string"?result["error"]:null}});for(const row of sent){if(answered.has(row.email.toLowerCase()))continue;rows.push({line:row.line,email:row.email,role:row.role,success:false,queued:false,error:"\u30B5\u30FC\u30D0\u306E\u7D50\u679C\u306B\u542B\
|
|
236
|
+
\u307E\u308C\u3066\u3044\u307E\u305B\u3093\uFF08\u9001\u3089\u308C\u305F\u304B\u3069\u3046\u304B\u4E0D\u660E\u3067\u3059\u3002twp user invite list \u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09"})}return rows}function lineErrors(err,sent){const list=err.body?.error_list;if(!Array.isArray(list))return[];const lines=[];for(const item of list){if(!isRecord(item))continue;const name=typeof item["name"]==="string"?item["name"]:"";const text=typeof item["message"]==="string"?item["messag\
|
|
237
|
+
e"]:"";const match=/^invitations\.(\d+)\./.exec(name);const row=match!==null?sent[Number(match[1])]:void 0;lines.push(row!==void 0?` ${row.line} \u884C\u76EE\uFF08${row.email}\uFF09: ${text}`:` ${name}: ${text}`)}return lines}async function runBulk(input,ctx){const sent=bulkRows(input);let response;try{response=await ctx.send(bulkPlan(input))}catch(err){if(err instanceof ApiError&&err.status===422){const lines=lineErrors(err,sent);if(lines.length>0)ctx.warn(["\u30B5\u30FC\u30D0\u304C CSV \u3092\u53D7\u3051\u4ED8\u3051\u307E\u305B\u3093\u3067\u3057\u305F\uFF081\u901A\u3082\u9001\u3063\u3066\u3044\u307E\u305B\u3093\uFF09:",
|
|
238
|
+
...lines].join("\n"))}throw err}const rows=matchResults(response,sent);const failed=rows.filter(row=>!row.success);if(failed.length>0){const lines=[`\u4E00\u62EC\u62DB\u5F85: ${rows.length} \u4EF6\u4E2D ${failed.length} \u4EF6\u304C\u5931\u6557\u3057\u307E\u3057\u305F\u3002`];for(const row of failed)lines.push(` \u5931\u6557: ${row.line??"?"} \u884C\u76EE ${row.email}\uFF08${row.error??"\u7406\u7531\u4E0D\u660E"}\uFF09`);const ok=rows.filter(row=>row.success);lines.push(ok.length===0?" \u62DB\u5F85\u3092\u9001\u3063\u305F\u884C\
|
|
239
|
+
\u306F\u3042\u308A\u307E\u305B\u3093\u3002":` \u9001\u4FE1\u6E08\u307F\uFF08\u6253\u3061\u76F4\u3059\u30682\u901A\u76EE\u304C\u5C4A\u304D\u307E\u3059\uFF09: ${ok.map(row=>`${row.line??"?"} \u884C\u76EE ${row.email}`).join(" / ")}`);lines.push("\u5931\u6557\u306E\u7406\u7531\u3092\u78BA\u304B\u3081\u3001\u76F4\u305B\u308B\u884C\u3060\u3051\u3092\u6B8B\u3057\u305F CSV \u3067\u6253\u3061\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u9001\u4FE1\u6E08\u307F\u306E\u884C\u306F\u542B\u3081\u306A\u3044\uFF09\u3002");
|
|
240
|
+
ctx.warn(lines.join("\n"));throw new ApiRejectedError(`\u4E00\u62EC\u62DB\u5F85\u306F\u5B8C\u4E86\u3057\u3066\u3044\u307E\u305B\u3093\uFF08${failed.length} \u4EF6\u5931\u6557\u30FB${ok.length} \u4EF6\u9001\u4FE1\uFF09\u3002`)}return{response,rows}}function bulkPlan(input){return{method:"POST",path:`${INVITATIONS_PATH}/bulk`,body:{invitations:bulkRows(input).map(row=>({email:row.email,role:row.role}))}}}function bulkBody(body){return isRecord(body)&&"rows"in body?body:{}}var INVITE_REF_FLAG={name:"\
|
|
241
|
+
--invite",summary:"\u5BFE\u8C61\u306E\u62DB\u5F85\uFF08\u4F4D\u7F6E\u5F15\u6570\u306E\u4EE3\u308F\u308A\u306B\u4F7F\u3048\u308B\uFF09",takesValue:true,placeholder:"<\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9|\u30C8\u30FC\u30AF\u30F3>"};async function prepareInvite(input,usage){const ref=singleRef(input,{flag:INVITE_REF_FLAG.name,label:"\u62DB\u5F85",usage});if(!ref.includes("@")){if(!/^[A-Za-z0-9_-]+$/.test(ref))throw new UsageError(`\u62DB\u5F85\u306E\u30C8\u30FC\u30AF\u30F3\u306E\u5F62\u304C\u9055\u3044\u307E\u3059\uFF08${[
|
|
242
|
+
...ref].length} \u6587\u5B57\uFF09`,INVITE_REF_HELP);return withResolved(input,{token:ref})}return withResolved(input,{email:ref})}async function tokenFor(input,ctx){const token=input.resolved?.["token"];if(token!==void 0)return token;const email=requireResolved(input,"email");const rows=invitationRows(await ctx.send({method:"GET",path:INVITATIONS_PATH}));const hits=rows.filter(row=>String(row["email"]??"").toLowerCase()===email.toLowerCase()&&row["status"]!=="accepted");if(hits.length===0){throw new UsageError(
|
|
243
|
+
`${email} \u5B9B\u3066\u306E\u672A\u53D7\u8AFE\u306E\u62DB\u5F85\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093`,"twp user invite list \u3067\u62DB\u5F85\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}if(hits.length>1){const found=hits.map(row=>`${String(row["status"])}\uFF08\u4F5C\u6210 ${String(row["created_at"])}\uFF09`).join(" / ");throw new UsageError(`${email} \u5B9B\u3066\u306E\u672A\u53D7\u8AFE\u306E\u62DB\u5F85\u304C ${hits.length} \u4EF6\u3042\u308A\u307E\u3059: ${found}`,
|
|
244
|
+
INVITE_REF_HELP)}const hit=hits[0]?.["token"];if(typeof hit!=="string"||!/^[A-Za-z0-9_-]+$/.test(hit)){throw new ApiResponseError("\u62DB\u5F85\u4E00\u89A7\u306E\u5FDC\u7B54\u306E\u30C8\u30FC\u30AF\u30F3\u3092\u30D1\u30B9\u306B\u4F7F\u3048\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}return hit}function invitePath(token,suffix=""){return`${INVITATIONS_PATH}/${encodeURIComponent(token)}${suffix}`}function refPlan(input,method,suffix=""){const token=input.
|
|
245
|
+
resolved?.["token"];return{method,path:token===void 0?`${INVITATIONS_PATH}/{token}${suffix}`:invitePath(token,suffix)}}function refNotes(input){const email=input.resolved?.["email"];return email===void 0?[]:[`\u3053\u306E\u524D\u306B\u3001${email} \u5B9B\u3066\u306E\u62DB\u5F85\u306E\u30C8\u30FC\u30AF\u30F3\u3092\u8ABF\u3079\u308B\u305F\u3081\u62DB\u5F85\u4E00\u89A7\u3092 GET \u3057\u307E\u3059\uFF08{token} \u306F\u305D\u306E\u7D50\u679C\u3067\u57CB\u307E\u308A\u307E\u3059\uFF09\u3002`]}var userInviteResource={
|
|
246
|
+
name:"invite",summary:"\u30E6\u30FC\u30B6\u30FC\u306E\u62DB\u5F85\uFF081\u4EF6\u30FBCSV \u4E00\u62EC\u30FB\u4E00\u89A7\u30FB\u518D\u9001\u30FB\u53D6\u6D88\uFF09",operations:[{name:"create",summary:"1\u4EBA\u3092\u62DB\u5F85\u3059\u308B\uFF08\u62DB\u5F85\u30E1\u30FC\u30EB\u3092\u9001\u308B\uFF09",usage:"twp user invite create --email <\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9> [--role user|admin|super_admin] [--name <\u6C0F\u540D>]",description:"--email \u304C\u5FC5\u9808\u3067\u3059\u3002--role \u3092\u7701\u304F\u3068\u4E00\u822C\u30E6\u30FC\u30B6\u30FC\uFF08user\uFF09\u3067\u62DB\u5F85\u3057\u307E\u3059\u3002\n--nam\
|
|
247
|
+
e \u306F\u62DB\u5F85\u30E1\u30FC\u30EB\u3068\u53D7\u8AFE\u753B\u9762\u306B\u51FA\u3059\u6C0F\u540D\u3067\u3059\uFF08\u53D7\u8AFE\u6642\u306B\u672C\u4EBA\u304C\u5909\u66F4\u3067\u304D\u307E\u3059\uFF09\u3002\n\u6A5F\u80FD\u6A29\u9650\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u65E2\u5B9A\u3092\u4F7F\u3044\u307E\u3059\u3002\n\n"+ROLE_HELP,forbidden:FORBIDDEN2,flags:[{name:"--email",summary:"\u62DB\u5F85\u3059\u308B\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9",takesValue:true,placeholder:"<\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9>"},
|
|
248
|
+
{name:"--role",summary:"\u6A29\u9650\uFF08user / admin / super_admin\uFF09",takesValue:true,placeholder:"<\u6A29\u9650>"},{name:"--name",summary:"\u6C0F\u540D\uFF08\u62DB\u5F85\u30E1\u30FC\u30EB\u3068\u53D7\u8AFE\u753B\u9762\u306B\u51FA\u308B\uFF09",takesValue:true,placeholder:"<\u6C0F\u540D>"}],async prepare(input){if(input.args.length>0){throw new UsageError(`create \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,"twp user invite create help")}const email=input.
|
|
249
|
+
flags.get("--email")?.trim()??"";if(email==="")throw new UsageError("--email \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","twp user invite create help");if(!EMAIL_RE.test(email))throw new UsageError(`--email \u306E\u5F62\u304C\u9055\u3044\u307E\u3059: ${email}`,"\u4F8B: --email new.member@example.com");const role=input.flags.get("--role");if(role!==void 0)roleValue(role,"--role ");const name=input.flags.get("--name");if(name!==void 0&&[...name].length>255){throw new UsageError(`\u6C0F\u540D\u304C\u9577\u3059\u304E\
|
|
250
|
+
\u307E\u3059\uFF08${[...name].length} \u6587\u5B57\u30FB\u4E0A\u9650 255 \u6587\u5B57\uFF09`,"twp user invite create help")}return input},plan(input){const role=input.flags.get("--role");const name=input.flags.get("--name")?.trim();return{method:"POST",path:INVITATIONS_PATH,body:{email:input.flags.get("--email").trim(),role:role===void 0?"user":roleValue(role,"--role "),...name!==void 0&&name!==""?{user_name:name}:{}}}},plannedNotes:input=>input.flags.has("--role")?[]:["--role \u672A\u6307\u5B9A\u306E\u305F\u3081\u3001\u4E00\u822C\u30E6\u30FC\u30B6\u30FC\uFF08user\
|
|
251
|
+
\uFF09\u3067\u62DB\u5F85\u3057\u307E\u3059\u3002"],summarize:body=>successAck(body,"\u62DB\u5F85"),raw:body=>successAck(body,"\u62DB\u5F85")},{name:"bulk",summary:"CSV \u306E\u5168\u54E1\u3092\u62DB\u5F85\u3059\u308B\uFF081\u56DE 50 \u4EF6\u307E\u3067\uFF09",usage:"twp user invite bulk --file <CSV>",description:`CSV \u306F\u300C\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9, \u6A29\u9650\u300D\u306E2\u5217\u3067\u3059\uFF081\u884C\u76EE\u306E\u30D8\u30C3\u30C0 email,role \u306F\u7701\u7565\u3067\u304D\u307E\u3059\uFF09\u3002
|
|
253
252
|
\u6C0F\u540D\u306E\u5217\u306F\u7F6E\u3051\u307E\u305B\u3093\uFF08\u4E00\u62EC\u62DB\u5F85\u3067\u306F\u6C0F\u540D\u306F\u9001\u3089\u308C\u305A\u3001\u53D7\u8AFE\u6642\u306B\u672C\u4EBA\u304C\u5165\u529B\u3057\u307E\u3059\uFF09\u3002
|
|
254
253
|
\u7A7A\u884C\u3068 # \u3067\u59CB\u307E\u308B\u884C\u306F\u8AAD\u307F\u98DB\u3070\u3057\u307E\u3059\u3002
|
|
255
254
|
|
|
@@ -285,8 +284,8 @@ var PASSWORD_HINT="\u30D1\u30B9\u30EF\u30FC\u30C9\u306F --password-file \u306B\u
|
|
|
285
284
|
function booleanFlag(input,flag){const raw=input.flags.get(flag);return raw===void 0?void 0:booleanText(flag,raw)}function roleType(input){const raw=input.flags.get("--role");if(raw===void 0)return void 0;const type=ROLE_TO_TYPE[raw.trim().toLowerCase()];if(type===void 0){throw new UsageError(`--role \u306B\u300C${raw}\u300D\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,"\u6307\u5B9A\u3067\u304D\u308B\u306E\u306F admin\uFF08\u7BA1\u7406\u8005\uFF09/ user\uFF08\u4E00\u822C\uFF09\u3067\u3059\u3002")}
|
|
286
285
|
return type}function authType(input){const raw=input.flags.get("--auth-type");if(raw===void 0)return void 0;const value=raw.trim().toLowerCase();if(!AUTH_TYPES.includes(value)){throw new UsageError(`--auth-type \u306B\u300C${raw}\u300D\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,`\u6307\u5B9A\u3067\u304D\u308B\u306E\u306F ${AUTH_TYPES.join(" / ")} \u3067\u3059\uFF08disabled \u3067\u5931\u52B9\uFF09\u3002`)}return value}async function readPassword(input,usage){const file=input.flags.get(PASSWORD_FILE_FLAG.
|
|
287
286
|
name);if(file===void 0)return void 0;let text;if(file==="-"){if(process.stdin.isTTY===true){throw new UsageError("--password-file - \u306F\u6A19\u6E96\u5165\u529B\u304B\u3089\u8AAD\u307F\u307E\u3059\u304C\u3001\u7AEF\u672B\u304C\u7E4B\u304C\u3063\u3066\u3044\u307E\u3059","\u30D1\u30A4\u30D7\u304B\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3067\u6A19\u6E96\u5165\u529B\u306B\u6E21\u3059\u304B\u3001--password-file \u306B\u30D5\u30A1\u30A4\u30EB\u306E\u30D1\u30B9\u3092\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}
|
|
288
|
-
const chunks=[];let size=0;for await(const chunk of process.stdin){const buffer=Buffer.from(chunk);size+=buffer.length;if(size>PASSWORD_FILE_MAX_BYTES){throw new UsageError(`\u6A19\u6E96\u5165\u529B\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${PASSWORD_FILE_MAX_BYTES} \u30D0\u30A4\u30C8\u8D85\uFF09`,usage)}chunks.push(buffer)}text=Buffer.concat(chunks).toString("utf8")}else{try{const stat=
|
|
289
|
-
d-file \u306B\u901A\u5E38\u306E\u30D5\u30A1\u30A4\u30EB\u4EE5\u5916\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093: ${file}`,usage);if(stat.size>PASSWORD_FILE_MAX_BYTES){throw new UsageError(`--password-file \u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${stat.size} \u30D0\u30A4\u30C8\uFF09: ${file}`,usage)}text=
|
|
287
|
+
const chunks=[];let size=0;for await(const chunk of process.stdin){const buffer=Buffer.from(chunk);size+=buffer.length;if(size>PASSWORD_FILE_MAX_BYTES){throw new UsageError(`\u6A19\u6E96\u5165\u529B\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${PASSWORD_FILE_MAX_BYTES} \u30D0\u30A4\u30C8\u8D85\uFF09`,usage)}chunks.push(buffer)}text=Buffer.concat(chunks).toString("utf8")}else{try{const stat=fs3.statSync(file);if(!stat.isFile())throw new UsageError(`--passwor\
|
|
288
|
+
d-file \u306B\u901A\u5E38\u306E\u30D5\u30A1\u30A4\u30EB\u4EE5\u5916\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093: ${file}`,usage);if(stat.size>PASSWORD_FILE_MAX_BYTES){throw new UsageError(`--password-file \u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${stat.size} \u30D0\u30A4\u30C8\uFF09: ${file}`,usage)}text=fs3.readFileSync(file,"utf8")}catch(err){if(err instanceof UsageError)throw err;const reason=err.code??err.message;throw new UsageError(`--password-file \
|
|
290
289
|
\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u3081\u307E\u305B\u3093: ${file}\uFF08${reason}\uFF09`,usage)}}const password=text.replace(/^\uFEFF/,"").replace(/\r?\n$/,"");if([...password].length<PASSWORD_MIN_CHARS){throw new UsageError(`\u30D1\u30B9\u30EF\u30FC\u30C9\u306F ${PASSWORD_MIN_CHARS} \u6587\u5B57\u4EE5\u4E0A\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08${[...password].length} \u6587\u5B57\uFF09`,usage)}return password}function userFields(input){const body={};for(const field of TEXT_FIELDS){
|
|
291
290
|
const value=boundedText(input,field.flag,{maxChars:field.maxChars,label:field.label});if(value!==void 0)body[field.key]=value}const type=roleType(input);if(type!==void 0)body["type"]=type;const hireDate=isoDate(input,HIRE_DATE_FLAG.name);if(hireDate!==void 0)body["hire_date"]=hireDate;for(const field of DISPLAY_FIELDS){const value=booleanFlag(input,field.flag);if(value!==void 0)body[field.key]=value}return body}function writeAck(body,label2){if(!isRecord(body)||body["result"]!==true){throw new ApiResponseError(
|
|
292
291
|
`${label2}\u306E\u5FDC\u7B54\u304C\u60F3\u5B9A\u306E\u5F62\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}const rest={...body};delete rest["result"];return rest}function licenseNotes(body){const warnings=isRecord(body)?body["license_warnings"]:void 0;if(!Array.isArray(warnings)||warnings.length===0)return[];const texts=warnings.map(warning=>isRecord(warning)?String(warning["message"]??warning["feature_label"]??warning["\
|
package/package.json
CHANGED
package/dist/chunk-UDPJ2IGK.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
-
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
-
import{UsageError}from"./chunk-7WSNIXTQ.js";var ISO_DATE_RE=/^\d{4}-\d{2}-\d{2}$/;function isoDate(input,flag){const raw=input.flags.get(flag);if(raw===void 0)return void 0;return isoDateValue(raw,flag)}function isoDateValue(raw,label){const value=raw.trim();if(!ISO_DATE_RE.test(value)){throw new UsageError(`${label} \u306F YYYY-MM-DD \u306E\u5F62\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${raw}`,"\u4F8B: 2026-09-30")}const[y,m,d]=value.split("-").map(Number);const probe=new Date(Date.UTC(y,m-1,d));if(probe.getUTCFullYear()!==
|
|
4
|
-
y||probe.getUTCMonth()+1!==m||probe.getUTCDate()!==d){throw new UsageError(`${label} \u306B\u5B58\u5728\u3057\u306A\u3044\u65E5\u4ED8\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059: ${raw}`,"\u4F8B: 2026-09-30")}return value}function booleanText(flag,raw){const value=raw.trim().toLowerCase();if(value==="true")return true;if(value==="false")return false;throw new UsageError(`${flag} \u306F true \u304B false \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${raw}`,`\u4F8B: ${flag} fa\
|
|
5
|
-
lse`)}function priority(input,flag="--priority"){const raw=input.flags.get(flag);if(raw===void 0)return void 0;const trimmed=raw.trim();const value=/^\d+$/.test(trimmed)?Number(trimmed):Number.NaN;if(!Number.isInteger(value)||value<1||value>3){throw new UsageError(`${flag} \u306F 1 / 2 / 3 \u306E\u3044\u305A\u308C\u304B\u3067\u3059: ${raw}`,"1: \u9AD8 \uFF0F 2: \u4E2D \uFF0F 3: \u4F4E")}return value}function decimal(input,flag,options){const raw=input.flags.get(flag);if(raw===void 0)return void 0;
|
|
6
|
-
const trimmed=raw.trim();const value=/^\d+(\.\d+)?$/.test(trimmed)?Number(trimmed):Number.NaN;if(!Number.isFinite(value)||value<options.min||value>options.max){throw new UsageError(`${flag} \u306F ${options.min} \u4EE5\u4E0A ${options.max} \u4EE5\u4E0B\u306E\u6570\u5024\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044: ${raw}`,"\u4F8B: 3 / 3.5")}return value}function boundedText(input,flag,options){const raw=input.flags.get(flag);if(raw===void 0)return void 0;if(raw.trim()===""){throw new UsageError(
|
|
7
|
-
`${flag} \u306B\u7A7A\u306E\u5024\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,`${options.label}\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}const count=[...raw].length;if(count>options.maxChars){throw new UsageError(`${options.label}\u304C\u9577\u3059\u304E\u307E\u3059\uFF08${count} \u6587\u5B57\u30FB\u4E0A\u9650 ${options.maxChars} \u6587\u5B57\uFF09`,`${flag} \u3092 ${options.maxChars} \u6587\u5B57\u4EE5\u5185\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return raw}export{isoDate,isoDateValue,booleanText,priority,decimal,boundedText};
|