@tocca-systems/twp-cli 0.24.0 → 0.25.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 +14 -0
- package/README.md +98 -4
- package/dist/agent-loop-ZP47LTUE.js +75 -0
- package/dist/{ai-dispatch-36HRDRLF.js → ai-dispatch-VSCKUY6J.js} +1 -1
- package/dist/{api-command-NMYYJKZH.js → api-command-VWJXBUCJ.js} +2 -2
- package/dist/{app-2KMY3QPM.js → app-3JIU5OUX.js} +49 -48
- package/dist/attendance-42XLURM7.js +21 -0
- package/dist/{auto-update-worker-AXBJIMFP.js → auto-update-worker-OBFGN6FY.js} +1 -1
- package/dist/{backlog-7MJIOT22.js → backlog-KSMQIC2R.js} +1 -1
- package/dist/charter-command-ULFOEZWE.js +26 -0
- package/dist/chunk-BKZGBJWT.js +15 -0
- package/dist/{chunk-DMDVLOAY.js → chunk-G4OO4M44.js} +1 -1
- package/dist/{chunk-WGVHYTZV.js → chunk-IRAZ27WL.js} +1 -1
- package/dist/{chunk-4V4T5ZUS.js → chunk-KEP5QSS4.js} +40 -15
- package/dist/{chunk-I3YPO7CY.js → chunk-KUIFIN7P.js} +1 -1
- package/dist/{chunk-QOUFHYK5.js → chunk-NIAOX77K.js} +1 -1
- package/dist/chunk-P4AEFKLM.js +13 -0
- package/dist/{chunk-VCMVTC6B.js → chunk-PK6CUUAQ.js} +1 -1
- package/dist/chunk-SP27PYHC.js +3 -0
- package/dist/chunk-UDPJ2IGK.js +7 -0
- package/dist/chunk-VCZVITWG.js +13 -0
- package/dist/{chunk-UIWGEBWI.js → chunk-VGMWPPGD.js} +13 -11
- package/dist/{chunk-UG2I6VRD.js → chunk-VYDEUFGU.js} +1 -1
- package/dist/{chunk-Y2QAP6SU.js → chunk-WQ66EYZS.js} +1 -1
- package/dist/{chunk-6NCY4NPV.js → chunk-X45SJNT2.js} +4 -4
- package/dist/chunk-YWGYRISN.js +34 -0
- package/dist/{chunk-WOUKWOAR.js → chunk-Z2MNO3FT.js} +10 -9
- package/dist/cli.js +33 -8
- package/dist/{commands-U36UTCKR.js → commands-OFLBUP6O.js} +1 -1
- package/dist/{commands-6YTOVZ5P.js → commands-RG7M6E5K.js} +80 -85
- package/dist/{department-JOXXJKQB.js → department-GH475WCF.js} +1 -1
- package/dist/{job-title-L47J6TZY.js → job-title-FC2GWDE7.js} +1 -1
- package/dist/{logout-guard-FO7KZL3X.js → logout-guard-3PB3VMGP.js} +1 -1
- package/dist/{media-ZMDYHHNN.js → media-TD7D4TXF.js} +1 -1
- package/dist/{oneshot-KYATQPL7.js → oneshot-QQOOZZDT.js} +5 -5
- package/dist/{position-FHWCMMBQ.js → position-4RHTV3IK.js} +1 -1
- package/dist/{project-ZODASYER.js → project-DBNWB47J.js} +1 -1
- package/dist/{run-QCDT35NT.js → run-VNHAQO24.js} +1 -1
- package/dist/{schedule-command-GKXKNMLG.js → schedule-command-FJU7JFNR.js} +1 -1
- package/dist/{server-settings-CG3EM7R7.js → server-settings-YL6KALXG.js} +1 -1
- package/dist/{setup-6CXUVCF5.js → setup-BJKIHANC.js} +1 -1
- package/dist/skill-command-V26WGVXU.js +61 -0
- package/dist/{task-G5YWQ6L5.js → task-7VOYCG26.js} +2 -2
- package/dist/{update-PZBUIYOL.js → update-RLKK6N7U.js} +1 -1
- package/dist/user-UU2SLVC4.js +336 -0
- package/package.json +1 -1
- package/dist/charter-command-UBUE3KUO.js +0 -36
- package/dist/chunk-EJ474UDB.js +0 -3
- package/dist/chunk-HW3QGKYR.js +0 -30
- package/dist/chunk-IJLJGDMZ.js +0 -7
- package/dist/chunk-ODLJ2LNQ.js +0 -13
- package/dist/user-DO4VNIBR.js +0 -204
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { createRequire as __twpCreateRequire } from 'node:module';
|
|
2
|
+
const require = __twpCreateRequire(import.meta.url);
|
|
3
|
+
import{repeatedValues}from"./chunk-IOGVQVGD.js";import{createFlags,fieldBody,hasAnyField,resolveRefFields,updateFlags}from"./chunk-IRAZ27WL.js";import{booleanText,boundedText,isoDate,isoDateValue}from"./chunk-UDPJ2IGK.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-NIAOX77K.js";import{ResolveError,isSafePathSegment}from"./chunk-GMBJTG6A.js";
|
|
4
|
+
import{ApiError}from"./chunk-FTYJZFEK.js";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 fs4 from"fs";import fs from"fs";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
|
+
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
|
+
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
|
+
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\
|
|
8
|
+
\u308C\u305F\u305F\u3081\u3001\u4E00\u90E8\u306E${label2}\u540D\u306F\u7A7A\u6B04\u3067\u3059\u3002ID \u306F --output json \u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002`)}const map={};for(const row of list){if(isRecord(row)&&typeof row["id"]==="string"&&typeof row["name"]==="string"){map[row["id"]]=row["name"]}}return map}catch(err){ctx.warn(`${label2}\u540D\u3092\u53D6\u5F97\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081\u3001${label2}\u540D\u306E\u5217\u306F\u7A7A\u6B04\u3067\u3059\uFF08${err.
|
|
9
|
+
message}\uFF09\u3002ID \u306F --output json \u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002`);return{}}}function assignmentPlan(input){const suffix=input.flags.has("--current")?"/assignments/current":"/assignments";return{method:"GET",path:`/api/v2/organization/users/${userPath(input,suffix)}`}}var listOperation={name:"list",summary:"\u30E6\u30FC\u30B6\u30FC\u306E\u6240\u5C5E\u306E\u5C65\u6B74\u3092\u4E00\u89A7\u3059\u308B",usage:"twp user assignment list <\u30E6\u30FC\u30B6\u30FC> [--current]",
|
|
10
|
+
description:"\u904E\u53BB\u30FB\u73FE\u5728\u30FB\u4E88\u5B9A\u306E\u6240\u5C5E\u3092\u3059\u3079\u3066\u51FA\u3057\u307E\u3059\u3002--current \u3067\u73FE\u5728\u6709\u52B9\u306A\u6240\u5C5E\u3060\u3051\u306B\u7D5E\u308A\u307E\u3059\u3002\nis_primary \u306F\u4E3B\u52D9\u3001is_approval_route \u306F\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u306E\u4E0A\u9577\u627F\u8A8D\u306B\u4F7F\u308F\u308C\u308B\u6240\u5C5E\u3067\u3059\u3002\n\u53C2\u7167\u3067\u304D\u308B\u306E\u306F\u672C\u4EBA\u30FB\u4E0A\u9577\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u3067\u3059\u3002\n\u3053\u306E API \u306F\u30DA\u30FC\u30B8\u30F3\u30B0\u3092\u6301\u305F\u305A\u3001\u5E38\u306B\u5168\u4EF6\u3092\u8FD4\u3057\u307E\u3059\u3002\n\n"+
|
|
11
|
+
USER_REF_HELP,forbidden:"\u3053\u306E\u30E6\u30FC\u30B6\u30FC\u306E\u6240\u5C5E\u3092\u53C2\u7167\u3059\u308B\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u672C\u4EBA\u30FB\u4E0A\u9577\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u53C2\u7167\u3067\u304D\u307E\u3059",flags:[USER_REF_FLAG,{name:"--current",summary:"\u73FE\u5728\u6709\u52B9\u306A\u6240\u5C5E\u3060\u3051\u3092\u51FA\u3059",takesValue:false}],prepare:(input,ctx)=>prepareUser(input,ctx,"twp user assignment list help"),
|
|
12
|
+
plan:assignmentPlan,plannedNotes:()=>["\u3053\u306E\u3042\u3068\u3001\u90E8\u7F72\u540D\u30FB\u5F79\u8077\u540D\u3092\u8868\u793A\u3059\u308B\u305F\u3081\u90E8\u7F72\u4E00\u89A7\u3068\u5F79\u8077\u4E00\u89A7\u3092 GET \u3057\u307E\u3059\u3002"],async execute(input,ctx){const response=await ctx.send(assignmentPlan(input));assignmentRows(response);const[departmentNames,positionNames]=await Promise.all([nameMap(ctx,DEPARTMENTS_PATH,"\u90E8\u7F72"),nameMap(ctx,POSITIONS_PATH,"\u5F79\u8077")]);return{
|
|
13
|
+
response,departmentNames,positionNames}},summarize(body){const names=body;return assignmentRows(body).map(row=>{const record=isRecord(row)?row:{};const department=record["department_id"];const position=record["position_id"];return pick({...record,department_name:typeof department==="string"?names.departmentNames?.[department]??null:null,position_name:typeof position==="string"?names.positionNames?.[position]??null:null},ASSIGNMENT_COLUMNS)})},raw:body=>assignmentRows(body)};var FORBIDDEN="\u7D44\u7E54\u7BA1\u7406\u8005\u306E\
|
|
14
|
+
\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002\u6240\u5C5E\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u30FB\u7D42\u4E86\u30FB\u524A\u9664\u306F\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u4F7F\u3048\u307E\u3059";function userRefField(flag,key,label2){return{kind:"ref",flag,key,summary:`${label2}\uFF08\u30E6\u30FC\u30B6\u30FC\u3002ID\u30FB\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u30FB\u793E\u54E1\u756A\u53F7\u30FB\u6C0F\u540D\uFF09`,placeholder:"<\u30E6\u30FC\u30B6\u30FC>",clearFlag:`--no-${flag.
|
|
15
|
+
slice(2)}`,clearSummary:`${label2}\u3092\u5916\u3059`,resolve:(ctx,ref,flagName)=>ctx.resolver.user(ref,flagName)}}var DEPARTMENT_FIELD={kind:"ref",flag:"--department",key:"department_id",summary:"\u90E8\u7F72\uFF08\u540D\u524D\u30FB\u30B3\u30FC\u30C9\u30FBID\uFF09",placeholder:"<\u90E8\u7F72>",clearFlag:"--no-department",clearSummary:"",resolve:(ctx,ref,flag)=>ctx.resolver.department(ref,flag)};var POSITION_FIELD={kind:"ref",flag:"--position",key:"position_id",summary:"\u5F79\u8077\uFF08\u540D\u524D\u30FB\u30B3\u30FC\u30C9\u30FBID\uFF09",
|
|
16
|
+
placeholder:"<\u5F79\u8077>",clearFlag:"--no-position",clearSummary:"",resolve:(ctx,ref,flag)=>ctx.resolver.position(ref,flag)};var JOB_TITLE_FIELD={kind:"ref",flag:"--job-title",key:"job_title_id",summary:"\u8077\u4F4D\uFF08\u540D\u524D\u30FB\u30B3\u30FC\u30C9\u30FBID\uFF09",placeholder:"<\u8077\u4F4D>",clearFlag:"--no-job-title",clearSummary:"\u8077\u4F4D\u3092\u5916\u3059",resolve:(ctx,ref,flag)=>ctx.resolver.jobTitle(ref,flag)};var MANAGER_FIELD=userRefField("--manager","manager_id","\u4E0A\u9577");
|
|
17
|
+
var INTERVIEWER_FIELD=userRefField("--interviewer","interview_user_id","\u9762\u8AC7\u8005");var MENTOR_FIELD=userRefField("--mentor","mentor_user_id","\u30E1\u30F3\u30BF\u30FC");var END_DATE_FIELD={kind:"date",flag:"--end-date",key:"end_date",summary:"\u7D42\u4E86\u65E5\uFF08YYYY-MM-DD\u3002none \u3067\u7D42\u4E86\u65E5\u3092\u6D88\u3059\uFF09"};var PRIMARY_FIELD={kind:"boolean",flag:"--primary",key:"is_primary",summary:"\u4E3B\u6240\u5C5E\u304B\uFF08true / false\uFF09"};var TYPE_FIELD={kind:"e\
|
|
18
|
+
num",flag:"--type",key:"assignment_type",values:["regular","concurrent","acting"],summary:"\u6240\u5C5E\u306E\u7A2E\u985E\uFF08regular: \u901A\u5E38 / concurrent: \u517C\u52D9 / acting: \u4EE3\u7406\uFF09"};var NOTES_FIELD={kind:"text",flag:"--notes",key:"notes",label:"\u5099\u8003",maxChars:1e3,summary:"\u5099\u8003\uFF081000\u6587\u5B57\u307E\u3067\uFF09"};var FIELDS=[DEPARTMENT_FIELD,POSITION_FIELD,JOB_TITLE_FIELD,MANAGER_FIELD,INTERVIEWER_FIELD,MENTOR_FIELD,END_DATE_FIELD,PRIMARY_FIELD,TYPE_FIELD,
|
|
19
|
+
NOTES_FIELD];var MOVE_FIELDS=[DEPARTMENT_FIELD,POSITION_FIELD,JOB_TITLE_FIELD,MANAGER_FIELD,INTERVIEWER_FIELD,MENTOR_FIELD,NOTES_FIELD];var NOT_CLEARABLE=new Set(["--no-department","--no-position"]);var START_DATE_FLAG={name:"--start-date",summary:"\u958B\u59CB\u65E5\uFF08YYYY-MM-DD\uFF09",takesValue:true,placeholder:"<YYYY-MM-DD>"};var OBSERVER_FLAG={name:"--observer",summary:"\u89B3\u5BDF\u8005\uFF08\u30E6\u30FC\u30B6\u30FC\u3002\u8907\u6570\u56DE\u6307\u5B9A\u3067\u304D\u308B\uFF09",takesValue:true,
|
|
20
|
+
placeholder:"<\u30E6\u30FC\u30B6\u30FC>",repeatable:true};var NO_OBSERVERS_FLAG={name:"--no-observers",summary:"\u89B3\u5BDF\u8005\u3092\u3059\u3079\u3066\u5916\u3059",takesValue:false};var OWNER_FLAG={name:"--user",summary:"\u6240\u5C5E\u3092\u6301\u3064\u30E6\u30FC\u30B6\u30FC\uFF08\u5FC5\u9808\uFF09",takesValue:true,placeholder:"<\u30E6\u30FC\u30B6\u30FC>"};var USER_FIELD_HELP="--manager / --interviewer / --mentor / --observer \u306F\u30E6\u30FC\u30B6\u30FC\u3092 ID\u30FB\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u30FB\u793E\u54E1\u756A\u53F7\u30FB\u6C0F\u540D\u3067\u6307\u5B9A\u3057\u307E\u3059\u3002\n--department / --position / --job\
|
|
21
|
+
-title \u306F\u540D\u524D\u30FB\u30B3\u30FC\u30C9\u30FBID \u306E\u3069\u308C\u3067\u3082\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002";var OBSERVERS_KEY="observer_ids";async function resolveObservers(input,ctx){const refs=repeatedValues(input,OBSERVER_FLAG.name);if(refs.length===0)return input;const ids=[];for(const ref of refs)ids.push((await ctx.resolver.user(ref,OBSERVER_FLAG.name)).id);return withResolved(input,{[OBSERVERS_KEY]:JSON.stringify(ids)})}function checkArguments(input,fields){fieldBody(
|
|
22
|
+
input,fields);isoDate(input,START_DATE_FLAG.name);for(const ref of repeatedValues(input,OBSERVER_FLAG.name)){if(ref.trim()==="")throw new UsageError(`${OBSERVER_FLAG.name} \u306B\u7A7A\u306E\u5024\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`)}if(input.flags.has(NO_OBSERVERS_FLAG.name)&&repeatedValues(input,OBSERVER_FLAG.name).length>0){throw new UsageError(`${OBSERVER_FLAG.name} \u3068 ${NO_OBSERVERS_FLAG.name} \u306F\u540C\u6642\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,"\u3069\u3061\u3089\u304B\u4E00\u65B9\u3060\u3051\u3092\u6307\u5B9A\u3057\
|
|
23
|
+
\u3066\u304F\u3060\u3055\u3044\u3002")}}function assignmentBody(input,fields){const body=fieldBody(input,fields);const startDate=isoDate(input,START_DATE_FLAG.name);if(startDate!==void 0)body["start_date"]=startDate;const observers=input.resolved?.[OBSERVERS_KEY];if(observers!==void 0)body["observer_ids"]=JSON.parse(observers);if(input.flags.has(NO_OBSERVERS_FLAG.name))body["observer_ids"]=[];return body}async function resolveAll(input,ctx,fields){return resolveObservers(await resolveRefFields(input,
|
|
24
|
+
ctx,fields),ctx)}async function prepareTarget(input,ctx,usage){if(input.args.length===0)throw new UsageError("\u6240\u5C5E ID \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",`${usage}\uFF08\u6240\u5C5E ID \u306F twp user assignment list <\u30E6\u30FC\u30B6\u30FC> \u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\uFF09`);if(input.args.length>1)throw new UsageError(`\u53D7\u3051\u53D6\u308C\u308B\u6240\u5C5E ID \u306F1\u3064\u3060\u3051\u3067\u3059: ${input.args.slice(1).join(" ")}`,usage);const id=input.
|
|
25
|
+
args[0].trim();if(!isSafePathSegment(id))throw new UsageError(`\u6240\u5C5E ID \u306B\u4F7F\u3048\u306A\u3044\u5024\u3067\u3059: ${id}`,usage);const owner=nonEmpty(input.flags,OWNER_FLAG.name);if(owner===void 0){throw new UsageError("--user \u3067\u6240\u5C5E\u3092\u6301\u3064\u30E6\u30FC\u30B6\u30FC\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",`${usage}\uFF08\u6240\u5C5E\u306E URL \u306B\u306F\u30E6\u30FC\u30B6\u30FC\u304C\u8981\u308A\u307E\u3059\uFF09`)}const user=await ctx.resolver.
|
|
26
|
+
user(owner,OWNER_FLAG.name);return withResolved(input,{userId:user.id,assignmentId:id})}function itemPath(input,suffix=""){return`/api/v2/organization/users/${userPath(input,"/assignments/")}${encodeURIComponent(requireResolved(input,"assignmentId"))}${suffix}`}var WRITE_COLUMNS=["id","department_id","position_id","start_date","end_date","is_primary","is_current","effective_status"];function writeResult(body,label2){if(!isRecord(body)||body["result"]!==true||!isRecord(body["assignment"])){throw new ApiResponseError(
|
|
27
|
+
`${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 writeSummary(body,label2){const result=writeResult(body,label2);return{message:result["message"]??null,...pick(result["assignment"],WRITE_COLUMNS)}}function previousPrimaryNotes(body){const previous=isRecord(body)?body["previousPrimaryUpdated"]:void 0;
|
|
28
|
+
if(!isRecord(previous))return[];return[`\u65E2\u5B58\u306E\u4E3B\u6240\u5C5E\uFF08${String(previous["department_name"]??previous["department_id"]??"\u4E0D\u660E")}\uFF09\u306E\u7D42\u4E86\u65E5\u3092 ${String(previous["new_end_date"]??"?")} \u306B\u8A2D\u5B9A\u3057\u307E\u3057\u305F\u3002`]}var createOperation={name:"create",summary:"\u6240\u5C5E\u3092\u4F5C\u6210\u3059\u308B\uFF08\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09",usage:"twp user assignment create <\u30E6\u30FC\u30B6\u30FC> --department <\u90E8\u7F72> --posit\
|
|
29
|
+
ion <\u5F79\u8077> --start-date <YYYY-MM-DD> [--primary true|false] [--job-title <\u8077\u4F4D>] [--manager <\u30E6\u30FC\u30B6\u30FC>] [--observer <\u30E6\u30FC\u30B6\u30FC>]\u2026 [\u9805\u76EE\u2026]",description:`--department / --position / --start-date \u304C\u5FC5\u9808\u3067\u3059\u3002
|
|
30
|
+
--primary \u3092\u7701\u304F\u3068\u4E3B\u6240\u5C5E\uFF08true\uFF09\u3068\u3057\u3066\u4F5C\u308A\u307E\u3059\uFF08\u30B5\u30FC\u30D0\u306E\u65E2\u5B9A\u3068\u540C\u3058\u5024\u3092\u660E\u793A\u3057\u3066\u9001\u308A\u307E\u3059\uFF09\u3002
|
|
31
|
+
\u4E3B\u6240\u5C5E\u3068\u3057\u3066\u4F5C\u308B\u3068\u3001\u30B5\u30FC\u30D0\u304C\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E\u7D42\u4E86\u65E5\u3092\u958B\u59CB\u65E5\u306E\u524D\u65E5\u306B\u8A2D\u5B9A\u3057\u307E\u3059\u3002\u517C\u52D9\u306A\u3089 --primary false \u3067\u3059\u3002
|
|
32
|
+
\u4E3B\u6240\u5C5E\u3068\u3057\u3066\u4F5C\u308B\u3068\u304D\u306F\u3001\u958B\u59CB\u65E5\u304C\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E\u958B\u59CB\u65E5\u4EE5\u524D\u306E\u5834\u5408\u3068\u3001\u4E88\u7D04\u6E08\u307F\u306E\u4E3B\u6240\u5C5E\u304C\u5225\u306B\u3042\u308B\u5834\u5408\u306B\u9001\u3089\u305A\u306B\u6B62\u3081\u307E\u3059
|
|
33
|
+
\uFF08\u958B\u59CB\u65E5\u3088\u308A\u524D\u306B\u7D42\u308F\u308B\u6240\u5C5E\u3084\u3001\u91CD\u306A\u3063\u305F\u4E3B\u6240\u5C5E\u304C\u3067\u304D\u308B\u305F\u3081\uFF09\u3002
|
|
34
|
+
\u7570\u52D5\uFF08\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u3092\u7D42\u3048\u3066\u65B0\u3057\u3044\u6240\u5C5E\u3078\u79FB\u3059\uFF09\u306B\u306F twp user assignment move \u3092\u4F7F\u3046\u3068\u3001\u9001\u308B\u524D\u306B\u5185\u5BB9\u3092\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002
|
|
35
|
+
|
|
36
|
+
${USER_FIELD_HELP}
|
|
37
|
+
|
|
38
|
+
${USER_REF_HELP}`,forbidden:FORBIDDEN,flags:[...createFlags(FIELDS),START_DATE_FLAG,OBSERVER_FLAG,USER_REF_FLAG],async prepare(input,ctx){checkArguments(input,FIELDS);for(const flag of[DEPARTMENT_FIELD.flag,POSITION_FIELD.flag,START_DATE_FLAG.name]){if(!input.flags.has(flag))throw new UsageError(`${flag} \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044`,"twp user assignment create help")}const user=await resolveAll(await prepareUser(input,ctx,"twp user assignment create help"),ctx,FIELDS);
|
|
39
|
+
if(input.flags.get(PRIMARY_FIELD.flag)?.trim().toLowerCase()==="false")return user;const startDate=isoDate(input,START_DATE_FLAG.name);return withResolved(user,await primaryPreflight(ctx,requireResolved(user,"userId"),startDate,"twp user assignment create help"))},plan(input){const body=assignmentBody(input,FIELDS);if(body["is_primary"]===void 0)body["is_primary"]=true;return{method:"POST",path:`/api/v2/organization/users/${userPath(input,"/assignments")}`,body}},plannedNotes:input=>input.flags.
|
|
40
|
+
get(PRIMARY_FIELD.flag)?.trim().toLowerCase()==="false"?[]:[(input.flags.has(PRIMARY_FIELD.flag)?"":"--primary \u672A\u6307\u5B9A\u306E\u305F\u3081\u3001\u4E3B\u6240\u5C5E\uFF08true\uFF09\u3068\u3057\u3066\u4F5C\u6210\u3057\u307E\u3059\u3002")+"\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u304C\u3042\u308C\u3070\u3001\u30B5\u30FC\u30D0\u304C\u305D\u306E\u7D42\u4E86\u65E5\u3092\u958B\u59CB\u65E5\u306E\u524D\u65E5\u306B\u8A2D\u5B9A\u3057\u307E\u3059\uFF08\u517C\u52D9\u306A\u3089 --primary false\uFF09\u3002"],
|
|
41
|
+
summarize:body=>writeSummary(body,"\u6240\u5C5E\u4F5C\u6210"),raw:body=>writeResult(body,"\u6240\u5C5E\u4F5C\u6210"),notes:body=>previousPrimaryNotes(body)};var updateOperation={name:"update",summary:"\u6240\u5C5E\u3092\u66F4\u65B0\u3059\u308B\uFF08\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09",usage:"twp user assignment update <\u6240\u5C5EID> --user <\u30E6\u30FC\u30B6\u30FC> [--department <\u90E8\u7F72>] [--position <\u5F79\u8077>] [--manager <\u30E6\u30FC\u30B6\u30FC> | --no-manager] [--end-date <YYYY-MM-DD|none>] [\u9805\u76EE\u2026]",
|
|
42
|
+
description:"\u6307\u5B9A\u3057\u305F\u9805\u76EE\u3060\u3051\u3092\u5909\u66F4\u3057\u307E\u3059\uFF08\u6307\u5B9A\u3057\u306A\u304B\u3063\u305F\u9805\u76EE\u306F\u5909\u308F\u308A\u307E\u305B\u3093\uFF09\u3002\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u3082\u6307\u5B9A\u3057\u306A\u3044\u3068\u30A8\u30E9\u30FC\u306B\u306A\u308A\u307E\u3059\u3002\n\u6240\u5C5E ID \u306F twp user assignment list <\u30E6\u30FC\u30B6\u30FC> \u306E id \u5217\u3067\u3059\u3002--user \u306F\u6240\u5C5E\u3092\u6301\u3064\u30E6\u30FC\u30B6\u30FC\u3067\u3059\uFF08\u5FC5\u9808\uFF09\u3002\n--no-job-title / --no-manager / --no-interviewer / --no-mentor / --no-observers \u3067\u5024\u3092\u5916\u3057\u307E\u3059\u3002\n--end-date none \u3067\u7D42\u4E86\u65E5\u3092\u6D88\u3059\u3068\u3001\u958B\u59CB\u65E5\u304C\u4ECA\u65E5\u4EE5\u524D\u306A\u3089\u305D\u306E\u6240\u5C5E\u306F\u6709\u52B9\u306B\u623B\u308A\u307E\u3059\u3002\n\n"+
|
|
43
|
+
USER_FIELD_HELP,forbidden:FORBIDDEN,flags:[...updateFlags(FIELDS).filter(flag=>!NOT_CLEARABLE.has(flag.name)),START_DATE_FLAG,OBSERVER_FLAG,NO_OBSERVERS_FLAG,OWNER_FLAG],async prepare(input,ctx){const changed=hasAnyField(input,FIELDS)||[START_DATE_FLAG,NO_OBSERVERS_FLAG].some(flag=>input.flags.has(flag.name))||repeatedValues(input,OBSERVER_FLAG.name).length>0;if(!changed)throw new UsageError("\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u4EE5\u4E0A\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
44
|
+
"twp user assignment update help");checkArguments(input,FIELDS);const target=await prepareTarget(input,ctx,"twp user assignment update help");return resolveAll(target,ctx,FIELDS)},plan:input=>({method:"PUT",path:itemPath(input),body:assignmentBody(input,FIELDS)}),summarize:body=>writeSummary(body,"\u6240\u5C5E\u66F4\u65B0"),raw:body=>writeResult(body,"\u6240\u5C5E\u66F4\u65B0")};var END_DATE_FLAG={name:"--end-date",summary:"\u7D42\u4E86\u65E5\uFF08YYYY-MM-DD\u30FB\u5FC5\u9808\uFF09",takesValue:true,
|
|
45
|
+
placeholder:"<YYYY-MM-DD>"};var endOperation={name:"end",summary:"\u6240\u5C5E\u3092\u7D42\u4E86\u3059\u308B\uFF08\u7D42\u4E86\u65E5\u3092\u8A2D\u5B9A\u3059\u308B\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09",usage:"twp user assignment end <\u6240\u5C5EID> --user <\u30E6\u30FC\u30B6\u30FC> --end-date <YYYY-MM-DD>",description:"\u7D42\u4E86\u65E5\u304C\u4ECA\u65E5\u3088\u308A\u524D\u306A\u3089\u3001\u305D\u306E\u6240\u5C5E\u306F\u3059\u3050\u306B\u7D42\u4E86\u72B6\u614B\u306B\u306A\u308A\u307E\u3059\u3002\u4ECA\u65E5\u4EE5\u964D\u306A\u3089\u7D42\u4E86\u65E5\u307E\u3067\u6709\u52B9\u306A\u307E\u307E\u3067\u3059\n\uFF08\u7D42\u4E86\u65E5\u5F53\u65E5\u306F\u6709\u52B9\u671F\u9593\u5185\u3067\u3059\uFF09\u3002\u7D42\u4E86\u65E5\u306F\u958B\u59CB\u65E5\u4EE5\u964D\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093\uFF08\u30B5\u30FC\u30D0\u304C\u65AD\u308A\u307E\u3059\uFF09\u3002\n\u53D6\u308A\u6D88\u3059\u3068\u304D\u306F twp user assignment update <\u6240\u5C5EID> --user <\u30E6\u30FC\u30B6\u30FC> --end-date\
|
|
46
|
+
none \u3067\u3059\u3002\n\u6240\u5C5E ID \u306F twp user assignment list <\u30E6\u30FC\u30B6\u30FC> \u306E id \u5217\u3067\u3059\u3002",forbidden:FORBIDDEN,flags:[END_DATE_FLAG,OWNER_FLAG],async prepare(input,ctx){if(isoDate(input,END_DATE_FLAG.name)===void 0){throw new UsageError("--end-date \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","twp user assignment end help")}return prepareTarget(input,ctx,"twp user assignment end help")},plan:input=>({method:"POST",path:itemPath(input,"/end"),
|
|
47
|
+
body:{end_date:isoDate(input,END_DATE_FLAG.name)}}),summarize:body=>writeSummary(body,"\u6240\u5C5E\u7D42\u4E86"),raw:body=>writeResult(body,"\u6240\u5C5E\u7D42\u4E86")};function deleteAck(body){if(!isRecord(body)||body["result"]!==true){throw new ApiResponseError("\u6240\u5C5E\u524A\u9664\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")}return{result:true,message:body["\
|
|
48
|
+
message"]??null}}var deleteOperation={name:"delete",summary:"\u6240\u5C5E\u3092\u524A\u9664\u3059\u308B\uFF08\u5C65\u6B74\u3054\u3068\u6D88\u3059\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\u30FB--yes \u304C\u8981\u308B\uFF09",usage:"twp user assignment delete <\u6240\u5C5EID> --user <\u30E6\u30FC\u30B6\u30FC> --yes",description:"\u6240\u5C5E\u3092\u5C65\u6B74\u304B\u3089\u6D88\u3057\u307E\u3059\uFF08\u5143\u306B\u623B\u3059\u64CD\u4F5C\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\u3002\u7570\u52D5\u3084\u9000\u8077\u3067\u6240\u5C5E\u3092\u7D42\u3048\u308B\u306A\u3089\u3001\u5C65\u6B74\u304C\u6B8B\u308B\ntwp user assignment end \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002\u524A\u9664\u306F\u3001\u8AA4\u3063\u3066\u4F5C\u3063\u305F\u6240\u5C5E\u3092\u6D88\u3059\u305F\u3081\u306E\u3082\u306E\u3067\u3059\u3002\n\u6240\u5C5E ID \u306F twp user assignment list <\u30E6\u30FC\u30B6\u30FC> \u306E id \u5217\u3067\u3059\u3002",
|
|
49
|
+
destructive:true,forbidden:FORBIDDEN,flags:[OWNER_FLAG],prepare:(input,ctx)=>prepareTarget(input,ctx,"twp user assignment delete help"),plan:input=>({method:"DELETE",path:itemPath(input)}),summarize:deleteAck,raw:deleteAck};function previousDay(iso){const[y,m,d]=iso.split("-").map(Number);const date=new Date(Date.UTC(y,m-1,d-1));return date.toISOString().slice(0,10)}function tokyoToday(now=new Date){return new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Tokyo",year:"numeric",month:"2-digit",day:"\
|
|
50
|
+
2-digit"}).format(now)}function strOrNull(value){return typeof value==="string"&&value!==""?value:null}function currentPrimaryOf(input){const raw=input.resolved?.["currentPrimary"];return raw===void 0||raw===""?null:JSON.parse(raw)}function existingIdsOf(input){const raw=input.resolved?.["existingIds"];return new Set(raw===void 0?[]:JSON.parse(raw))}async function nameOf(list,id){if(id===null)return null;try{return(await list()).find(row=>row.id===id)?.name??null}catch{return null}}function label(name,id){
|
|
51
|
+
return name??id??"\uFF08\u4E0D\u660E\uFF09"}async function primaryPreflight(ctx,userId,startDate,usage){let primary;let rows;try{[primary,rows]=await Promise.all([ctx.resolver.primaryAssignment(userId),ctx.resolver.assignments(userId)])}catch(err){if(err instanceof ResolveError&&err.status===403)throw new ResolveError(`${FORBIDDEN}\uFF08${err.message}\uFF09`,403);throw err}let current=null;if(primary!==null){const departmentId=strOrNull(primary["department_id"]);const positionId=strOrNull(primary["\
|
|
52
|
+
position_id"]);const observers=primary["observer_ids"];current={id:String(primary["id"]),department_id:departmentId,department_name:await nameOf(()=>ctx.resolver.departments(),departmentId),position_id:positionId,position_name:await nameOf(()=>ctx.resolver.positions(),positionId),job_title_id:strOrNull(primary["job_title_id"]),start_date:strOrNull(primary["start_date"]),end_date:strOrNull(primary["end_date"]),has_manager:strOrNull(primary["manager_id"])!==null,observer_ids:Array.isArray(observers)?
|
|
53
|
+
observers.filter(id=>typeof id==="string"):[],has_interviewer:strOrNull(primary["interview_user_id"])!==null,has_mentor:strOrNull(primary["mentor_user_id"])!==null};if(current.start_date!==null&&startDate<=current.start_date){throw new UsageError(`\u958B\u59CB\u65E5 ${startDate} \u304C\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E\u958B\u59CB\u65E5 ${current.start_date} \u4EE5\u524D\u3067\u3059\uFF08\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u304C\u958B\u59CB\u65E5\u3088\u308A\u524D\u306B\u7D42\u308F\u308B\u3053\u3068\u306B\u306A\u308A\u307E\u3059\uFF09`,
|
|
54
|
+
`\u958B\u59CB\u65E5\u3092\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E\u958B\u59CB\u65E5\u3088\u308A\u5F8C\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E\u958B\u59CB\u65E5\u3092\u76F4\u3059\u306A\u3089 twp user assignment update\u3001\u517C\u52D9\u3068\u3057\u3066\u8DB3\u3059\u306A\u3089 twp user assignment create --primary false \u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\uFF08${usage}\uFF09\u3002`)}}const scheduled=rows.filter(row=>row["is_primary"]===
|
|
55
|
+
true&&row["id"]!==current?.id&&(row["is_scheduled"]===true||row["effective_status"]==="scheduled"));if(scheduled.length>0){const first=scheduled[0];throw new UsageError(`\u4E88\u7D04\u6E08\u307F\u306E\u4E3B\u6240\u5C5E\u304C\u3042\u308A\u307E\u3059\uFF08\u6240\u5C5E ID ${String(first["id"])}\u30FB${String(first["start_date"]??"?")}\u301C\uFF09\u3002\u3053\u306E\u307E\u307E\u4E3B\u6240\u5C5E\u3092\u4F5C\u308B\u3068\u3001\u540C\u3058\u671F\u9593\u306B\u4E3B\u6240\u5C5E\u304C2\u3064\u91CD\u306A\u308A\u307E\u3059`,
|
|
56
|
+
"\u4E88\u7D04\u3092\u53D6\u308A\u6D88\u3059\u306A\u3089 twp user assignment delete <\u6240\u5C5EID> --user <\u30E6\u30FC\u30B6\u30FC> --yes\u3001\u65E5\u4ED8\u3092\u5909\u3048\u308B\u306A\u3089 twp user assignment update \u3092\u5148\u306B\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002")}return{currentPrimary:current===null?"":JSON.stringify(current),existingIds:JSON.stringify(rows.map(row=>String(row["id"]))),today:tokyoToday()}}function revertCommands(userId,current,newId,immediate){const commands=[];
|
|
57
|
+
if(newId!==null)commands.push(`twp user assignment delete ${shellQuote(newId)} --user ${shellQuote(userId)} --yes`);let restore=`twp user assignment update ${shellQuote(current.id)} --user ${shellQuote(userId)} --end-date ${shellQuote(current.end_date??"none")}`;if(immediate){restore+=" --primary true";for(const observer of current.observer_ids)restore+=` --observer ${shellQuote(observer)}`}commands.push(restore);return commands}var MOVE_USAGE="twp user assignment move <\u30E6\u30FC\u30B6\u30FC> --department <\u90E8\u7F72> -\
|
|
58
|
+
-start-date <\u7570\u52D5\u65E5> [--position <\u5F79\u8077>] [--job-title <\u8077\u4F4D> | --no-job-title] [--manager <\u30E6\u30FC\u30B6\u30FC>] [--observer <\u30E6\u30FC\u30B6\u30FC>]\u2026 [\u9805\u76EE\u2026]\n twp user assignment move --file <CSV>";function assignmentsPath(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\
|
|
59
|
+
\u3002`)}return`/api/v2/organization/users/${encodeURIComponent(userId)}/assignments`}async function partialMoveLines(ctx,target,uncertain){const{userId,departmentId,startDate,existingIds:before,current}=target;let rows;try{rows=assignmentRows(await ctx.send({method:"GET",path:assignmentsPath(userId)}))}catch(err){return[`\u4ED8\u3051\u66FF\u3048\u306E\u9001\u4FE1\u306B\u5931\u6557\u3057\u3001\u53CD\u6620\u72B6\u6CC1\u3082\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08${err.message}\
|
|
60
|
+
\uFF09\u3002twp user assignment list ${shellQuote(userId)} \u3067\u3001\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E\u7D42\u4E86\u65E5\u3068\u65B0\u3057\u3044\u6240\u5C5E\u306E\u6709\u7121\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`]}const records=rows.filter(isRecord);const created=records.find(row=>row["department_id"]===departmentId&&row["start_date"]===startDate&&!before.has(String(row["id"])));const old=current===null?void 0:records.find(row=>row["id"]===current.id);const oldChanged=current!==
|
|
61
|
+
null&&old!==void 0&&(strOrNull(old["end_date"])!==current.end_date||old["is_primary"]!==true);const oldState=current===null?"\u5BFE\u8C61\u306A\u3057":old===void 0?`\u4E00\u89A7\u306B\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08\u6240\u5C5E ID ${current.id} \u304C\u524A\u9664\u30FB\u5DEE\u3057\u66FF\u3048\u3055\u308C\u305F\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF09`:oldChanged?`\u53CD\u6620\u6E08\u307F\uFF08\u7D42\u4E86\u65E5 ${String(old["end_date"]??"\u306A\u3057")}\u30FB\u4E3B\u6240\u5C5E ${String(
|
|
62
|
+
old["is_primary"])}\uFF09`:"\u672A\u53CD\u6620";const lines=["\u4ED8\u3051\u66FF\u3048\u306E\u9001\u4FE1\u306F\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u6240\u5C5E\u3092\u8AAD\u307F\u76F4\u3057\u305F\u7D50\u679C:",` \u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E\u7D42\u4E86: ${oldState}`,` \u65B0\u3057\u3044\u6240\u5C5E\u306E\u4F5C\u6210: ${created===void 0?"\u672A\u53CD\u6620":`\u53CD\u6620\u6E08\u307F\uFF08\u6240\u5C5E ID ${String(created["id"])}\uFF09`}`];if(current!==null&&oldChanged){const immediate=old?.["\
|
|
63
|
+
is_primary"]!==true;const createdId=created===void 0?null:String(created["id"]);lines.push(createdId===null?"\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u3060\u3051\u304C\u7D42\u4E86\u3057\u305F\u72B6\u614B\u3067\u3059\u3002\u4ED8\u3051\u66FF\u3048\u3092\u3084\u308A\u76F4\u3059\u304B\u3001\u6B21\u306E\u30B3\u30DE\u30F3\u30C9\u3067\u5143\u306B\u623B\u3057\u3066\u304F\u3060\u3055\u3044:":"\u4E21\u65B9\u3068\u3082\u53CD\u6620\u3055\u308C\u3066\u3044\u307E\u3059\uFF08\u5FDC\u7B54\u3060\u3051\u304C\u5931\u308F\u308C\u305F\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF09\u3002\u53D6\u308A\u6D88\u3059\u306A\u3089\u6B21\u306E\u30B3\u30DE\u30F3\u30C9\u3067\u3059:");
|
|
64
|
+
lines.push(...revertCommands(userId,current,createdId,immediate).map(command=>` ${command}`))}else if(created!==void 0){lines.push(`\u65B0\u3057\u3044\u6240\u5C5E\u3060\u3051\u304C\u4F5C\u3089\u308C\u3066\u3044\u307E\u3059\u3002\u53D6\u308A\u6D88\u3059\u306A\u3089: twp user assignment delete ${shellQuote(String(created["id"]))} --user ${shellQuote(userId)} --yes`)}else if(uncertain){lines.push(`\u8AAD\u307F\u76F4\u3057\u305F\u6642\u70B9\u3067\u306F\u5909\u308F\u3063\u3066\u3044\u307E\u305B\u3093\u304C\u3001\u5FDC\u7B54\u304C\u5C4A\u304B\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u30B5\u30FC\u30D0\u304C\u307E\u3060\u51E6\u7406\u4E2D\u3067\u5F8C\u304B\u3089\u53CD\u6620\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089 twp user assignment list ${shellQuote(
|
|
65
|
+
userId)} \u3067\u78BA\u8A8D\u3057\u3001\u53CD\u6620\u3055\u308C\u3066\u3044\u306A\u3051\u308C\u3070\u3082\u3046\u4E00\u5EA6\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}else{lines.push("\u4F55\u3082\u5909\u308F\u3063\u3066\u3044\u307E\u305B\u3093\u3002\u539F\u56E0\u3092\u53D6\u308A\u9664\u3044\u3066\u304B\u3089\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3092\u3082\u3046\u4E00\u5EA6\u5B9F\u884C\u3067\u304D\u307E\u3059\u3002")}return lines}function rejectedBeforeWrite(err){return err instanceof
|
|
66
|
+
ApiError&&[401,403,422].includes(err.status)}function movePreviewLines(preview,indent=" "){const{current,startDate,today}=preview;const endDate=previousDay(startDate);const scheduled=today!==""&&startDate>today;const lines=[];if(current===null){lines.push(`${indent}\u7D42\u4E86\u3059\u308B\u6240\u5C5E: \u306A\u3057\uFF08\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u304C\u3042\u308A\u307E\u305B\u3093\uFF09`)}else{const period=`${current.start_date??"?"}\u301C${current.end_date??""}`;let change;if(current.
|
|
67
|
+
end_date!==null&¤t.end_date<=endDate){change=scheduled?`\u7D42\u4E86\u65E5 ${current.end_date} \u306F\u7570\u52D5\u65E5\u306E\u524D\u65E5\u4EE5\u524D\u306A\u306E\u3067\u5909\u3048\u307E\u305B\u3093`:`\u7D42\u4E86\u65E5 ${current.end_date} \u306F\u7570\u52D5\u65E5\u306E\u524D\u65E5\u4EE5\u524D\u306A\u306E\u3067\u5909\u3048\u305A\u3001\u4E3B\u6240\u5C5E\u304B\u3089\u5916\u3057\u307E\u3059`}else{change=`\u7D42\u4E86\u65E5\u3092 ${endDate} \u306B\u3057\u307E\u3059`}lines.push(`${indent}\u7D42\u4E86\u3059\u308B\u6240\u5C5E:\
|
|
68
|
+
${label(current.department_name,current.department_id)} / ${label(current.position_name,current.position_id)}\uFF08${period}\uFF09\u2192 ${change} [\u6240\u5C5E ID ${current.id}]`)}const inheritedFrom=[preview.inheritedPosition?"\u5F79\u8077":null,preview.inheritedJobTitle?"\u8077\u4F4D":null].filter(item=>item!==null);lines.push(`${indent}\u4F5C\u308B\u6240\u5C5E: ${preview.newDepartmentName} / ${preview.newPositionName}\uFF08${startDate}\u301C\u30FB\u4E3B\u6240\u5C5E\uFF09`+(inheritedFrom.
|
|
69
|
+
length>0?` \u203B${inheritedFrom.join("\u30FB")}\u306F\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u304B\u3089\u5F15\u304D\u7D99\u304E`:""));if(current!==null){const dropped=[current.has_manager&&!preview.given.manager?"\u4E0A\u9577":null,current.observer_ids.length>0&&!preview.given.observers?"\u89B3\u5BDF\u8005":null,current.has_interviewer&&!preview.given.interviewer?"\u9762\u8AC7\u8005":null,current.has_mentor&&!preview.given.mentor?"\u30E1\u30F3\u30BF\u30FC":null].filter(item=>item!==null);if(dropped.
|
|
70
|
+
length>0){lines.push(`${indent}\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E${dropped.join("\u30FB")}\u306F\u5F15\u304D\u7D99\u304E\u307E\u305B\u3093\uFF08\u65B0\u3057\u3044\u6240\u5C5E\u3067\u306F\u672A\u8A2D\u5B9A\u3067\u3059\u3002\u8981\u308B\u306A\u3089 --manager \u7B49\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\u3002`)}}if(scheduled){lines.push(`${indent}\u7570\u52D5\u65E5\u304C\u672A\u6765\u306E\u305F\u3081\u3001\u65B0\u3057\u3044\u6240\u5C5E\u306F\u4E88\u7D04\u306B\u306A\u308A\u307E\u3059\u3002\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306F ${endDate}\
|
|
71
|
+
\u307E\u3067\u6709\u52B9\u306A\u307E\u307E\u3067\u3059\u3002`)}else if(today!==""){lines.push(`${indent}\u7570\u52D5\u65E5\u304C\u4ECA\u65E5\u4EE5\u524D\u306E\u305F\u3081\u3001\u9001\u4FE1\u3057\u305F\u6642\u70B9\u3067\u5207\u308A\u66FF\u308F\u308A\u307E\u3059\u3002`)}return lines}var MOVE_CSV_MAX_BYTES=1024*1024;var FILE_FLAG={name:"--file",summary:"\u4E00\u62EC\u3067\u4ED8\u3051\u66FF\u3048\u308B CSV\uFF08\u30E6\u30FC\u30B6\u30FC, \u90E8\u7F72, \u7570\u52D5\u65E5[, \u5F79\u8077, \u8077\u4F4D, \u4E0A\u9577, \u89B3\u5BDF\u8005]\uFF09",
|
|
72
|
+
takesValue:true,placeholder:"<CSV>"};var ROW_FLAGS=[...MOVE_FIELDS.map(field=>field.flag),"--no-job-title",START_DATE_FLAG.name,OBSERVER_FLAG.name,USER_REF_FLAG.name];var NO_JOB_TITLE="none";function splitCsvLine(raw){const cells=[];let cell2="";let quoted=false;for(let i=0;i<raw.length;i++){const ch=raw[i];if(quoted){if(ch==='"'&&raw[i+1]==='"'){cell2+='"';i++}else if(ch==='"'){quoted=false}else{cell2+=ch}}else if(ch==='"'&&cell2.trim()===""){quoted=true;cell2=""}else if(ch===","){cells.push(cell2.
|
|
73
|
+
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
|
+
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
|
+
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){try{const stat=fs.statSync(file);if(!stat.isFile())throw new UsageError(
|
|
77
|
+
`--file \u306B\u901A\u5E38\u306E\u30D5\u30A1\u30A4\u30EB\u4EE5\u5916\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093: ${file}`,usage);if(stat.size>MOVE_CSV_MAX_BYTES){throw new UsageError(`--file \u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${stat.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")}return fs.readFileSync(file,"utf8")}catch(err){
|
|
78
|
+
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)}}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}}async function prepareBulkRow(row,ctx,usage){const user=await ctx.
|
|
79
|
+
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===null?null:await ctx.resolver.user(row.manager,"\u4E0A\u9577");
|
|
80
|
+
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\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")}
|
|
81
|
+
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.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:{
|
|
82
|
+
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,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 assignme\
|
|
83
|
+
nt 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(" ")}`,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`,
|
|
84
|
+
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(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)
|
|
85
|
+
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.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.
|
|
86
|
+
length} \u884C\u3042\u308B\u305F\u3081\u30011\u4EF6\u3082\u9001\u3063\u3066\u3044\u307E\u305B\u3093:
|
|
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
|
+
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
|
+
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.
|
|
90
|
+
line} \u884C\u76EE\uFF08${item.user}\uFF09:`);lines.push(...item.revert.map(command=>` ${command}`))}if(done.some(item=>item.scheduled)){lines.push(" \uFF08\u4E88\u7D04\u306E\u884C\u3092\u7570\u52D5\u65E5\u4EE5\u964D\u306B\u623B\u3059\u3068\u304D\u306F\u30012\u672C\u76EE\u306B --primary true \u3068\u5143\u306E\u89B3\u5BDF\u8005\u306E --observer \u3082\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\uFF09")}return lines}async function runBulkMove(input,ctx){const rows=bulkMoveRows(input);const done=[];
|
|
91
|
+
for(const[index,row]of rows.entries()){let response;try{const body=await ctx.send(rowPlan(row));response=writeResult(body,"\u6240\u5C5E\u306E\u4ED8\u3051\u66FF\u3048")}catch(err){const unsent=rows.slice(index+1);const lines=[`\u4E00\u62EC\u306E\u4ED8\u3051\u66FF\u3048\u306F ${row.line} \u884C\u76EE\u3067\u6B62\u307E\u308A\u307E\u3057\u305F\uFF08${rows.length} \u4EF6\u4E2D \u6210\u529F ${done.length} \u4EF6\u30FB\u5931\u6557 1 \u4EF6\u30FB\u672A\u9001\u4FE1 ${unsent.length} \u4EF6\uFF09\u3002`,` \
|
|
92
|
+
\u5931\u6557: ${row.line} \u884C\u76EE ${row.user}\uFF08${err.message}\uFF09`];if(rejectedBeforeWrite(err)){lines.push(" \u3053\u306E\u884C\u306F\u66F8\u304D\u8FBC\u307F\u306E\u524D\u306B\u65AD\u3089\u308C\u305F\u305F\u3081\u3001\u4F55\u3082\u5909\u308F\u3063\u3066\u3044\u307E\u305B\u3093\u3002")}else{const target={userId:row.userId,departmentId:String(row.body["department_id"]),startDate:row.preview.startDate,existingIds:new Set(row.existingIds),current:row.preview.current};lines.push(...(await partialMoveLines(
|
|
93
|
+
ctx,target,!(err instanceof ApiError))).map(text=>` ${text}`))}lines.push(done.length===0?" \u6210\u529F: \u306A\u3057":` \u6210\u529F: ${done.map(item=>`${item.line} \u884C\u76EE ${item.user}\uFF08\u6240\u5C5E ID ${String(assignmentOf(item.response)["id"]??"?")}\uFF09`).join(" / ")}`);lines.push(unsent.length===0?" \u672A\u9001\u4FE1: \u306A\u3057":` \u672A\u9001\u4FE1: ${unsent.map(item=>`${item.line} \u884C\u76EE ${item.user}`).join(" / ")}`);if(done.length>0){lines.push("\u6210\u529F\u3057\u305F\u884C\u3092\u5143\u306B\u623B\u3059\u306B\u306F\uFF08\
|
|
94
|
+
\u65B0\u3057\u3044\u6240\u5C5E\u306E\u524A\u9664 \u2192 \u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E\u7D42\u4E86\u65E5\u306E\u623B\u3057 \u306E\u9806\uFF09:",...revertBlock(done));lines.push("\u7D9A\u304D\u3092\u6D41\u3059\u3068\u304D\u306F\u3001\u6210\u529F\u3057\u305F\u884C\u3092 CSV \u304B\u3089\u9664\u3044\u3066\u304B\u3089\u6253\u3061\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}else{lines.push("\u3069\u306E\u884C\u3082\u4ED8\u3051\u66FF\u3048\u3066\u3044\u307E\u305B\u3093\u3002\u539F\u56E0\u3092\u53D6\u308A\u9664\u3044\u3066\u304B\u3089\u540C\u3058 CSV \u3092\u3082\u3046\u4E00\u5EA6\u6D41\u305B\u307E\u3059\u3002")}
|
|
95
|
+
ctx.warn(lines.join("\n"));if(done.length===0)throw err;throw new ApiRejectedError(`\u4E00\u62EC\u306E\u4ED8\u3051\u66FF\u3048\u306F\u5B8C\u4E86\u3057\u3066\u3044\u307E\u305B\u3093\uFF08\u6210\u529F ${done.length} \u4EF6\u30FB\u5931\u6557 1 \u4EF6\u30FB\u672A\u9001\u4FE1 ${unsent.length} \u4EF6\uFF09\u3002`)}const createdId=strOrNull(assignmentOf(response)["id"]);done.push({line:row.line,user:row.user,userId:row.userId,response,revert:createdId===null?[]:rowRevertCommands(row,createdId),scheduled:row.
|
|
96
|
+
preview.today!==""&&row.preview.startDate>row.preview.today,startDate:row.preview.startDate})}return{bulk:true,done}}function assignmentOf(response){return isRecord(response["assignment"])?response["assignment"]:{}}function bulkSummary(body){return body.done.map(item=>({line:item.line,user:item.user,...pick(item.response["assignment"],WRITE_COLUMNS)}))}function bulkRaw(body){return body.done.map(item=>({line:item.line,user_id:item.userId,...item.response}))}function bulkNotes(body){const notes=[
|
|
97
|
+
`${body.done.length} \u4EF6\u3092\u4ED8\u3051\u66FF\u3048\u307E\u3057\u305F\u3002`];for(const item of body.done){for(const note of previousPrimaryNotes(item.response))notes.push(`${item.line} \u884C\u76EE\uFF08${item.user}\uFF09: ${note}`)}if(body.done.some(item=>item.revert.length>0))notes.push(["\u53D6\u308A\u6D88\u3059\u306B\u306F:",...revertBlock(body.done)].join("\n"));return notes}var moveOperation={name:"move",summary:"\u6240\u5C5E\u3092\u4ED8\u3051\u66FF\u3048\u308B\uFF08\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u3092\u7570\u52D5\u65E5\u306E\u524D\u65E5\u3067\u7D42\u3048\u3001\u65B0\u3057\u3044\u4E3B\u6240\u5C5E\u3092\u4F5C\u308B\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09",
|
|
98
|
+
usage:MOVE_USAGE,description:`\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u3092\u7570\u52D5\u65E5\u306E\u524D\u65E5\u3067\u7D42\u4E86\u3057\u3001\u7570\u52D5\u65E5\u304B\u3089\u65B0\u3057\u3044\u4E3B\u6240\u5C5E\u3092\u4F5C\u308A\u307E\u3059\uFF08\u30B5\u30FC\u30D0\u3078\u306F\u6240\u5C5E\u306E\u4F5C\u62101\u672C\u3092\u9001\u308A\u3001
|
|
99
|
+
\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E\u7D42\u4E86\u306F\u30B5\u30FC\u30D0\u304C\u540C\u3058\u8981\u6C42\u306E\u4E2D\u3067\u884C\u3044\u307E\u3059\uFF09\u3002--department \u3068 --start-date\uFF08\u7570\u52D5\u65E5\uFF09\u304C\u5FC5\u9808\u3067\u3059\u3002
|
|
100
|
+
\u9001\u308B\u524D\u306B\u6240\u5C5E\u3092\u8AAD\u307F\u3001\u7D42\u4E86\u3059\u308B\u6240\u5C5E\u3068\u4F5C\u308B\u6240\u5C5E\u3092 stderr \u306B\u4E26\u3079\u307E\u3059\u3002--dry-run \u3067\u9001\u3089\u305A\u306B\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002
|
|
101
|
+
|
|
102
|
+
\u5F15\u304D\u7D99\u3050\u3082\u306E: \u5F79\u8077\u30FB\u8077\u4F4D\uFF08--position / --job-title \u3092\u6307\u5B9A\u3059\u308C\u3070\u305D\u3061\u3089\u3092\u4F7F\u3046\u3002--no-job-title \u3067\u8077\u4F4D\u3092\u5916\u3059\uFF09\u3002
|
|
103
|
+
\u5F15\u304D\u7D99\u304C\u306A\u3044\u3082\u306E: \u4E0A\u9577\u30FB\u89B3\u5BDF\u8005\u30FB\u9762\u8AC7\u8005\u30FB\u30E1\u30F3\u30BF\u30FC\uFF08\u65E7\u4E0A\u9577\u306E\u307E\u307E\u627F\u8A8D\u7D4C\u8DEF\u304C\u6B8B\u3089\u306A\u3044\u3088\u3046\u306B\u3001\u6307\u5B9A\u3057\u305F\u3082\u306E\u3060\u3051\u3092\u8A2D\u5B9A\u3057\u307E\u3059\uFF09\u3002
|
|
104
|
+
\u517C\u52D9\u30FB\u4EE3\u7406\u306E\u6240\u5C5E\u3092\u8DB3\u3059\u306A\u3089 move \u3067\u306F\u306A\u304F twp user assignment create --primary false \u3092\u4F7F\u3044\u307E\u3059\u3002
|
|
105
|
+
|
|
106
|
+
\u7570\u52D5\u65E5\u304C\u672A\u6765\u306A\u3089\u65B0\u3057\u3044\u6240\u5C5E\u306F\u4E88\u7D04\u306B\u306A\u308A\u3001\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306F\u524D\u65E5\u307E\u3067\u6709\u52B9\u306A\u307E\u307E\u3067\u3059\uFF08\u958B\u59CB\u65E5\u306E\u65E5\u6B21\u30D0\u30C3\u30C1\u3067\u5207\u308A\u66FF\u308F\u308A\u307E\u3059\uFF09\u3002
|
|
107
|
+
\u7570\u52D5\u65E5\u304C\u4ECA\u65E5\u4EE5\u524D\u306A\u3089\u3059\u3050\u306B\u5207\u308A\u66FF\u308F\u308A\u307E\u3059\u3002\u6B21\u306E\u5834\u5408\u306F\u9001\u3089\u305A\u306B\u6B62\u3081\u307E\u3059: \u7570\u52D5\u65E5\u304C\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u306E\u958B\u59CB\u65E5\u4EE5\u524D
|
|
108
|
+
\uFF08\u958B\u59CB\u65E5\u3088\u308A\u524D\u306B\u7D42\u308F\u308B\u6240\u5C5E\u306B\u306A\u308B\uFF09\uFF0F\u4E88\u7D04\u6E08\u307F\u306E\u4E3B\u6240\u5C5E\u304C\u5225\u306B\u3042\u308B\uFF08\u4E3B\u6240\u5C5E\u304C2\u3064\u91CD\u306A\u308B\uFF09\u3002
|
|
109
|
+
\u9001\u4FE1\u304C\u9014\u4E2D\u3067\u5931\u6557\u3057\u305F\u3068\u304D\u306F\u3001\u6240\u5C5E\u3092\u8AAD\u307F\u76F4\u3057\u3066\u3069\u3053\u307E\u3067\u53CD\u6620\u3055\u308C\u305F\u304B\u3068\u5143\u306B\u623B\u3059\u30B3\u30DE\u30F3\u30C9\u3092\u51FA\u3057\u307E\u3059\u3002
|
|
110
|
+
|
|
111
|
+
\u4E00\u62EC\u306E\u4ED8\u3051\u66FF\u3048\uFF08--file\uFF09: CSV \u306E1\u884C\u304C1\u4EBA\u306E\u7570\u52D5\u3067\u3059\u3002\u5217\u306F
|
|
112
|
+
\u300C\u30E6\u30FC\u30B6\u30FC, \u90E8\u7F72, \u7570\u52D5\u65E5, \u5F79\u8077, \u8077\u4F4D, \u4E0A\u9577, \u89B3\u5BDF\u8005\u300D\u3067\u3001\u5F8C\u308D\u306E4\u5217\u306F\u7701\u7565\u30FB\u7A7A\u6B04\u306B\u3067\u304D\u307E\u3059
|
|
113
|
+
\uFF08\u5F79\u8077\u30FB\u8077\u4F4D\u306E\u7A7A\u6B04\u306F\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\u304B\u3089\u5F15\u304D\u7D99\u304E\u3001\u8077\u4F4D\u306B none \u3067\u5916\u3059\u3002\u89B3\u5BDF\u8005\u306F ; \u533A\u5207\u308A\u3067\u8907\u6570\uFF09\u3002
|
|
114
|
+
1\u884C\u76EE\u306E\u30D8\u30C3\u30C0\uFF08user,department,\u2026\uFF09\u306F\u7701\u7565\u3067\u304D\u307E\u3059\u3002\u7A7A\u884C\u3068 # \u3067\u59CB\u307E\u308B\u884C\u306F\u8AAD\u307F\u98DB\u3070\u3057\u307E\u3059\u3002
|
|
115
|
+
|
|
116
|
+
user,department,start_date,position,job_title,manager,observers
|
|
117
|
+
yamada@example.com,\u958B\u767A\u90E8,2027-04-01,,,suzuki@example.com,
|
|
118
|
+
sato@example.com,\u55B6\u696D\u90E8,2027-04-01,\u4E3B\u4EFB,none,,tanaka@example.com;ito@example.com
|
|
119
|
+
|
|
120
|
+
\u9001\u308B\u524D\u306B\u5168\u884C\u30921\u884C\u305A\u3064\u306E move \u3068\u540C\u3058\u304F\u691C\u67FB\u3057\uFF08\u540D\u524D\u89E3\u6C7A\u30FB\u65E5\u4ED8\u30FB\u958B\u59CB\u65E5\u3068\u4E88\u7D04\u6E08\u307F\u306E\u4E3B\u6240\u5C5E\u30FB\u540C\u3058\u30E6\u30FC\u30B6\u30FC\u306E\u91CD\u8907\uFF09\u3001
|
|
121
|
+
\u4E0D\u6B63\u306A\u884C\u304C1\u3064\u3067\u3082\u3042\u308C\u3070**1\u4EF6\u3082\u9001\u3089\u305A**\u306B\u3001\u305D\u306E\u884C\u756A\u53F7\u3068\u7406\u7531\u3092\u3059\u3079\u3066\u51FA\u3057\u3066\u7D42\u4E86\u30B3\u30FC\u30C9 2 \u3067\u7D42\u308F\u308A\u307E\u3059\u3002
|
|
122
|
+
--dry-run \u3067\u5168\u884C\u306E\u300C\u7D42\u4E86\u3059\u308B\u6240\u5C5E\u300D\u300C\u4F5C\u308B\u6240\u5C5E\u300D\u3092\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002\u9001\u4FE1\u306F1\u884C\u305A\u3064\u3067\u3001\u5931\u6557\u3057\u305F\u3089\u305D\u3053\u3067\u6B62\u3081\u3001
|
|
123
|
+
\u6210\u529F\u3057\u305F\u884C\u30FB\u5931\u6557\u3057\u305F\u884C\u30FB\u672A\u9001\u4FE1\u306E\u884C\u3092\u884C\u756A\u53F7\u3064\u304D\u3067\u51FA\u3057\u3001\u6210\u529F\u3057\u305F\u884C\u3092\u623B\u3059\u30B3\u30DE\u30F3\u30C9\u3092\u51FA\u3057\u307E\u3059\uFF08\u7D42\u4E86\u30B3\u30FC\u30C9 3\u3002
|
|
124
|
+
1\u4EF6\u3082\u6210\u529F\u3057\u3066\u3044\u306A\u3051\u308C\u3070\u3001\u5931\u6557\u3057\u305F\u8981\u6C42\u306E\u7D42\u4E86\u30B3\u30FC\u30C9\uFF09\u3002--file \u306E\u3068\u304D\u306F\u4ED6\u306E\u9805\u76EE\u30D5\u30E9\u30B0\u306F\u53D7\u3051\u307E\u305B\u3093\u3002
|
|
125
|
+
|
|
126
|
+
${USER_FIELD_HELP}
|
|
127
|
+
|
|
128
|
+
${USER_REF_HELP}`,forbidden:FORBIDDEN,flags:[...createFlags(MOVE_FIELDS),{name:"--no-job-title",summary:"\u8077\u4F4D\u3092\u5F15\u304D\u7D99\u304C\u306A\u3044\uFF08\u65B0\u3057\u3044\u6240\u5C5E\u3092\u8077\u4F4D\u306A\u3057\u3067\u4F5C\u308B\uFF09",takesValue:false},START_DATE_FLAG,OBSERVER_FLAG,USER_REF_FLAG,FILE_FLAG],async prepare(input,ctx){if(isBulk(input))return prepareBulkMove(input,ctx);checkArguments(input,MOVE_FIELDS);for(const flag of[DEPARTMENT_FIELD.flag,START_DATE_FLAG.name]){if(!input.
|
|
129
|
+
flags.has(flag))throw new UsageError(`${flag} \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044`,"twp user assignment move help")}const startDate=isoDate(input,START_DATE_FLAG.name);const resolved=await resolveAll(await prepareUser(input,ctx,"twp user assignment move help"),ctx,MOVE_FIELDS);const userId=requireResolved(resolved,"userId");const inherited=await primaryPreflight(ctx,userId,startDate,"twp user assignment move help");const current=currentPrimaryOf(withResolved(resolved,inherited));
|
|
130
|
+
if(!input.flags.has(POSITION_FIELD.flag)){if(current?.position_id==null){throw new UsageError("\u73FE\u5728\u306E\u4E3B\u6240\u5C5E\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--position \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044","twp user assignment move help")}inherited[POSITION_FIELD.key]=current.position_id;inherited["inheritedPosition"]="1"}if(!input.flags.has(JOB_TITLE_FIELD.
|
|
131
|
+
flag)&&!input.flags.has("--no-job-title")&¤t?.job_title_id!=null){inherited[JOB_TITLE_FIELD.key]=current.job_title_id;inherited["inheritedJobTitle"]="1"}const newDepartment=requireResolved(resolved,DEPARTMENT_FIELD.key);inherited["newDepartmentName"]=await nameOf(()=>ctx.resolver.departments(),newDepartment)??newDepartment;const newPosition=inherited[POSITION_FIELD.key]??requireResolved(resolved,POSITION_FIELD.key);inherited["newPositionName"]=await nameOf(()=>ctx.resolver.positions(),newPosition)??
|
|
132
|
+
newPosition;return withResolved(resolved,inherited)},plan(input){if(isBulk(input))return rowPlan(bulkMoveRows(input)[0]);const body=assignmentBody(input,MOVE_FIELDS);if(input.resolved?.["inheritedPosition"]==="1")body["position_id"]=requireResolved(input,POSITION_FIELD.key);if(input.resolved?.["inheritedJobTitle"]==="1")body["job_title_id"]=requireResolved(input,JOB_TITLE_FIELD.key);if(input.flags.has("--no-job-title"))delete body["job_title_id"];body["is_primary"]=true;return{method:"POST",path:`\
|
|
133
|
+
/api/v2/organization/users/${userPath(input,"/assignments")}`,body}},plannedNotes(input){if(isBulk(input))return bulkPlannedNotes(input);return["\u4ED8\u3051\u66FF\u3048\u306E\u5185\u5BB9:",...movePreviewLines({current:currentPrimaryOf(input),startDate:isoDate(input,START_DATE_FLAG.name),today:input.resolved?.["today"]??"",newDepartmentName:input.resolved?.["newDepartmentName"]??"?",newPositionName:input.resolved?.["newPositionName"]??"?",inheritedPosition:input.resolved?.["inheritedPosition"]===
|
|
134
|
+
"1",inheritedJobTitle:input.resolved?.["inheritedJobTitle"]==="1",given:{manager:input.flags.has(MANAGER_FIELD.flag),observers:repeatedValues(input,OBSERVER_FLAG.name).length>0,interviewer:input.flags.has(INTERVIEWER_FIELD.flag),mentor:input.flags.has(MENTOR_FIELD.flag)}})]},async execute(input,ctx){if(isBulk(input))return runBulkMove(input,ctx);const current=currentPrimaryOf(input);try{return await ctx.send(moveOperation.plan(input))}catch(err){if(!rejectedBeforeWrite(err)){const target={userId:requireResolved(
|
|
135
|
+
input,"userId"),departmentId:requireResolved(input,"department_id"),startDate:isoDate(input,START_DATE_FLAG.name),existingIds:existingIdsOf(input),current};ctx.warn((await partialMoveLines(ctx,target,!(err instanceof ApiError))).join("\n"))}throw err}},summarize:body=>isBulkBody(body)?bulkSummary(body):writeSummary(body,"\u6240\u5C5E\u306E\u4ED8\u3051\u66FF\u3048"),raw:body=>isBulkBody(body)?bulkRaw(body):writeResult(body,"\u6240\u5C5E\u306E\u4ED8\u3051\u66FF\u3048"),notes(body,input){if(isBulkBody(
|
|
136
|
+
body))return bulkNotes(body);const notes=[...previousPrimaryNotes(body)];const current=currentPrimaryOf(input);const created=isRecord(body)&&isRecord(body["assignment"])?strOrNull(body["assignment"]["id"]):null;if(current!==null&&created!==null){const startDate=isoDate(input,START_DATE_FLAG.name);const immediate=startDate<=(input.resolved?.["today"]??"");const commands=revertCommands(requireResolved(input,"userId"),current,created,immediate);const later=immediate?"":`
|
|
137
|
+
\uFF08${startDate} \u4EE5\u964D\u306B\u623B\u3059\u3068\u304D\u306F\u30012\u672C\u76EE\u306B --primary true \u3068\u5143\u306E\u89B3\u5BDF\u8005\u306E --observer \u3082\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\uFF09`;notes.push(`\u53D6\u308A\u6D88\u3059\u306B\u306F:
|
|
138
|
+
${commands.map(c=>` ${c}`).join("\n")}${later}`)}return notes}};var userAssignmentResource={name:"assignment",summary:"\u30E6\u30FC\u30B6\u30FC\u306E\u6240\u5C5E\uFF08\u90E8\u7F72\u30FB\u5F79\u8077\uFF09\u306E\u53C2\u7167\u30FB\u4F5C\u6210\u30FB\u66F4\u65B0\u30FB\u7D42\u4E86\u30FB\u524A\u9664\u30FB\u4ED8\u3051\u66FF\u3048",operations:[listOperation,createOperation,updateOperation,endOperation,deleteOperation,moveOperation]};import fs2 from"fs";var LOGIN_HISTORY_RETENTION_DAYS=90;var DEFAULT_INACTIVE_DAYS=60;var DEFAULT_MAX_USERS=2e3;var LIST_PAGE_LIMIT=100;var MATRIX_PAGE_LIMIT=200;var LOGIN_HISTORY_LIMIT=500;var CONCURRENCY=4;var SEND_PER_MINUTE=200;var SEND_BURST=30;var RATE_LIMIT_WAIT_MS=6e4;var RATE_LIMIT_RETRIES=2;var LEDGER_MAX_BYTES=5*1024*1024;var USAGE="twp user export [--file <\u53F0\u5E33CSV>] [--include-disabled] [--exclude-hidden] [--inactive-days <\u65E5\u6570>] [--code-column <\u5217\u540D>] [--name-column <\u5217\u540D>] [--email-column <\u5217\u540D>] [--department-c\
|
|
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
|
+
"\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
|
+
"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 BOM=new RegExp(
|
|
143
|
+
`^${String.fromCharCode(65279)}`);function decodeLedger(bytes){try{return new TextDecoder("utf-8",{fatal:true}).decode(bytes).replace(BOM,"")}catch{return new TextDecoder("shift_jis").decode(bytes)}}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){
|
|
144
|
+
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\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}
|
|
145
|
+
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",`\u898B\u51FA\u3057\u884C\u306E\u5217: ${header.map(h=>h.trim()).join("\u3001")}
|
|
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
|
+
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
|
+
\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.
|
|
149
|
+
push(row)}if(errors.length>0){throw new UsageError(`\u53F0\u5E33 CSV \u306B\u4E0D\u6B63\u306A\u884C\u304C ${errors.length} \u884C\u3042\u308A\u307E\u3059:
|
|
150
|
+
${errors.join("\n ")}`,HELP)}return{header:header.cells.map(h=>h.trim()),columns,rows}}function readLedgerFile(file){let fd;try{fd=fs2.openSync(file,"r");if(!fs2.fstatSync(fd).isFile())throw new UsageError(`--file \u306B\u901A\u5E38\u306E\u30D5\u30A1\u30A4\u30EB\u4EE5\u5916\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093: ${file}`,HELP);const buffer=Buffer.alloc(LEDGER_MAX_BYTES+1);let total=0;for(;;){const n=fs2.readSync(fd,buffer,total,buffer.length-total,null);if(n===0)break;total+=n;if(total>
|
|
151
|
+
LEDGER_MAX_BYTES){throw new UsageError(`--file \u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u307E\u3059: ${file}`,`\u4E0A\u9650\u306F ${LEDGER_MAX_BYTES} \u30D0\u30A4\u30C8\u3067\u3059\u3002`)}}return buffer.subarray(0,total)}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`,HELP)}finally{if(fd!==void 0)fs2.closeSync(fd)}}
|
|
152
|
+
var KIND_LABEL={not_in_ledger:"\u53F0\u5E33\u306B\u3044\u306A\u3044\uFF08\u5931\u52B9\u6F0F\u308C\uFF09",missing_in_twp:"TWP \u306B\u3044\u306A\u3044\uFF08\u767B\u9332\u6F0F\u308C\uFF09",disabled_in_twp:"TWP \u3067\u5931\u52B9\u3057\u3066\u3044\u308B\uFF08\u8AA4\u5931\u52B9\uFF09",ambiguous:"\u8907\u6570\u306E\u30E6\u30FC\u30B6\u30FC\u306B\u4E00\u81F4\uFF08\u7A81\u304D\u5408\u308F\u305B\u3067\u304D\u306A\u3044\uFF09",department_mismatch:"\u90E8\u7F72\u304C\u9055\u3046\uFF08\u7570\u52D5\u306E\u53CD\u6620\u6F0F\u308C\uFF09",
|
|
153
|
+
position_mismatch:"\u5F79\u8077\u304C\u9055\u3046\uFF08\u7570\u52D5\u306E\u53CD\u6620\u6F0F\u308C\uFF09",inactive:"\u9577\u671F\u9593\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u306A\u3044"};function str(value){return typeof value==="string"&&value!==""?value:null}function listPlan(input,cursor){return{method:"GET",path:"/api/v2/admin/users/list",query:{limit:LIST_PAGE_LIMIT,cursor,include_hidden:input.flags.has("--exclude-hidden")?void 0:"true"}}}var sleep=ms=>new Promise(resolve=>setTimeout(resolve,
|
|
154
|
+
ms));function pacedSender(ctx){const intervalMs=6e4/SEND_PER_MINUTE;let tokens=SEND_BURST;let last=Date.now();let chain=Promise.resolve();const take=()=>{chain=chain.then(async()=>{const now=Date.now();tokens=Math.min(SEND_BURST,tokens+(now-last)/intervalMs);last=now;if(tokens<1){await sleep((1-tokens)*intervalMs);tokens=1;last=Date.now()}tokens-=1});return chain};return async plan=>{for(let attempt=0;;attempt+=1){await take();try{return await ctx.send(plan)}catch(err){if(!(err instanceof ApiError)||
|
|
155
|
+
err.status!==429||attempt>=RATE_LIMIT_RETRIES)throw err;ctx.warn(`API \u306E\u30EC\u30FC\u30C8\u5236\u9650\uFF08429\uFF09\u306B\u5F53\u305F\u3063\u305F\u305F\u3081\u3001${RATE_LIMIT_WAIT_MS/1e3} \u79D2\u5F85\u3063\u3066\u9001\u308A\u76F4\u3057\u307E\u3059\u3002`);await sleep(RATE_LIMIT_WAIT_MS)}}}}async function mapPool(items,limit,fn){const results=new Array(items.length);let next=0;let failed=false;const worker=async()=>{while(!failed&&next<items.length){const index=next;next+=1;try{results[index]=
|
|
156
|
+
await fn(items[index])}catch(err){failed=true;throw err}}};await Promise.all(Array.from({length:Math.min(limit,items.length)},worker));return results}async function listAllUsers(input,send,maxUsers){const users=[];let cursor;for(;;){const body=await send(listPlan(input,cursor));for(const item of listPaging.items(body)){if(!isRecord(item)||typeof item["user_id"]!=="string"){throw new ApiResponseError("\u30E6\u30FC\u30B6\u30FC\u4E00\u89A7\u306E\u884C\u306B user_id \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}
|
|
157
|
+
users.push(item)}if(users.length>maxUsers){throw new UsageError(`\u5BFE\u8C61\u306E\u30E6\u30FC\u30B6\u30FC\u304C ${maxUsers} \u4EBA\u3092\u8D85\u3048\u305F\u305F\u3081\u3001\u8A73\u7D30\u3092\u8AAD\u3080\u524D\u306B\u6B62\u3081\u307E\u3057\u305F\uFF081\u4EBA\u3042\u305F\u308A\u6700\u59273\u5F80\u5FA9\u3057\u307E\u3059\uFF09`,input.flags.has("--exclude-hidden")?`\u4E0A\u9650\u3092\u4E0A\u3052\u308B\u306A\u3089 --max-users <\u4EBA\u6570> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002`:
|
|
158
|
+
"\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3092\u9664\u304F\u306A\u3089 --exclude-hidden\u3001\u4E0A\u9650\u3092\u4E0A\u3052\u308B\u306A\u3089 --max-users <\u4EBA\u6570> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}const next=listPaging.nextCursor(body);if(next===null)return users;cursor=next}}async function permissionMatrix(input,send){const map=new Map;for(let page=1;;page+=1){const body=await send({method:"GET",path:"/api/v2/admin/users/\
|
|
159
|
+
permissions-matrix",query:{page,limit:MATRIX_PAGE_LIMIT,include_hidden:input.flags.has("--exclude-hidden")?void 0:"true"}});const items=isRecord(body)?body["items"]:void 0;const totalPages=isRecord(body)?body["total_pages"]:void 0;if(!Array.isArray(items)||typeof totalPages!=="number"){throw new ApiResponseError("\u6A29\u9650\u30DE\u30C8\u30EA\u30AF\u30B9\u306E\u5FDC\u7B54\u306B items / total_pages \u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}
|
|
160
|
+
for(const item of items){if(!isRecord(item)||typeof item["user_id"]!=="string")continue;const raw=item["feature_permissions"];const levels={};if(isRecord(raw)){for(const[feature,level]of Object.entries(raw)){if(typeof level==="string")levels[feature]=level}}else if(!Array.isArray(raw)){continue}map.set(item["user_id"],levels)}if(page>=totalPages)return map}}function userSegment(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}\
|
|
161
|
+
\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}return encodeURIComponent(userId)}async function userDetail(send,userId){const body=await send({method:"GET",path:`/api/v2/admin/users/${userSegment(userId)}`});if(!isRecord(body)||body["user_id"]!==userId){throw new ApiResponseError(`\u30E6\u30FC\u30B6\u30FC\u8A73\u7D30\u306E\u5FDC\u7B54\u304C ${userId} \u306E\u3082\u306E\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`)}
|
|
162
|
+
return body}async function primaryAssignment(send,userId){const body=await send({method:"GET",path:`/api/v2/organization/users/${userSegment(userId)}/assignments/current`});const list=isRecord(body)?body["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");const primary=list.find(row=>isRecord(row)&&
|
|
163
|
+
row["is_approval_route"]===true)??list.find(row=>isRecord(row)&&row["is_primary"]===true);return isRecord(primary)?{id:str(primary["id"]),managerId:str(primary["manager_id"])}:{id:null,managerId:null}}async function lastLogin(send,userId){const body=await send({method:"GET",path:"/api/v2/admin/tenant/login-history",query:{user_id:userId,result:"success",limit:LOGIN_HISTORY_LIMIT}});const data=isRecord(body)&&isRecord(body["data"])?body["data"]:body;const histories=isRecord(data)?data["histories"]:
|
|
164
|
+
void 0;if(!Array.isArray(histories)){throw new ApiResponseError("\u30ED\u30B0\u30A4\u30F3\u5C65\u6B74\u306E\u5FDC\u7B54\u306B histories \u914D\u5217\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u63A5\u7D9A\u5148\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002")}let latest=null;for(const h of histories){const ts=isRecord(h)&&h["result"]==="success"?str(h["timestamp"]):null;if(ts!==null&&(latest===null||ts>latest))latest=ts}return latest}async function collectInventory(input,ctx){const send=pacedSender(
|
|
165
|
+
ctx);const maxUsers=Number(requireResolved(input,"maxUsers"));const users=await listAllUsers(input,send,maxUsers);const permissions=await permissionMatrix(input,send);const minutes=Math.ceil(users.length*3/SEND_PER_MINUTE);ctx.warn(`${users.length} \u4EBA\u306E\u8A73\u7D30\u30FB\u6240\u5C5E\u30FB\u6700\u7D42\u30ED\u30B0\u30A4\u30F3\u3092\u8AAD\u307F\u307E\u3059\uFF08\u6700\u5927 ${users.length*3} \u5F80\u5FA9`+(users.length*3>SEND_BURST?`\u30FB\u30EC\u30FC\u30C8\u5236\u9650\u306B\u5408\u308F\u305B\u3066\u6700\u9577 ${minutes}\
|
|
166
|
+
\u5206\u307B\u3069`:"")+"\uFF09\u3002");const names=new Map(users.map(u=>[u["user_id"],str(u["user_name"])]));const rows=await mapPool(users,CONCURRENCY,async user=>{const userId=user["user_id"];const detail=await userDetail(send,userId);const authType2=str(detail["auth_type"]);const canLogin=authType2!=="disabled";const wantDetail=canLogin||input.flags.has("--include-disabled");const sso=authType2==="oauth";const[assignment,loginAt]=wantDetail?await Promise.all([primaryAssignment(send,userId),
|
|
167
|
+
sso?Promise.resolve(null):lastLogin(send,userId)]):[{id:null,managerId:null},null];const managerId=assignment.managerId;return{user_id:userId,user_name:str(user["user_name"]),email:str(user["email"]),employee_code:str(user["employee_code"]),hire_date:str(detail["hire_date"]),department_name:str(user["department_name"]),position_name:str(user["position_name"]),assignment_id:assignment.id,manager_id:managerId,manager_name:managerId===null?null:names.get(managerId)??null,role:str(user["role"]),is_partner:typeof user["\
|
|
168
|
+
is_partner"]==="boolean"?user["is_partner"]:null,permissions:permissions.get(userId)??null,auth_type:authType2,can_login:canLogin,display_flg:typeof user["display_flg"]==="boolean"?user["display_flg"]:null,last_login_at:loginAt,last_login_status:!wantDetail?"not_checked":sso?"sso_not_recorded":loginAt===null?"not_recorded":"recorded"}});return{rows,scanned:users.length}}function daysBetween(fromIso,now){return(now.getTime()-new Date(fromIso).getTime())/864e5}function placeholder(label2){return shellQuote(
|
|
169
|
+
`<${label2}>`)}function disableCommand(userId){return`twp user update ${shellQuote(userId)} --auth-type disabled --display false --memberlist false --org-chart false --dashboard false`}function recentlyHired(hireDate,inactiveDays,now){return hireDate!==null&&daysBetween(`${hireDate}T00:00:00Z`,now)<=inactiveDays}function diffAgainstLedger(inventory,ledger,columns,inactiveDays,now){const index={code:new Map,email:new Map,name:new Map};const add=(map,key,row)=>{if(key===null)return;const k=normalizeValue(
|
|
170
|
+
key);map.set(k,[...map.get(k)??[],row])};for(const row of inventory){add(index.code,row.employee_code,row);add(index.email,row.email,row);add(index.name,row.user_name,row)}const diffs=[];const matched=new Set;const base=(kind,user,line)=>({kind,kind_label:KIND_LABEL[kind],user_id:user?.user_id??null,user_name:user?.user_name??null,email:user?.email??null,employee_code:user?.employee_code??null,auth_type:user?.auth_type??null,is_partner:user?.is_partner??null,ledger_line:line,twp_value:null,ledger_value:null,
|
|
171
|
+
suggestion:null});const fromLedger=(kind,entry)=>({...base(kind,null,entry.line),user_name:entry.name??null,email:entry.email??null,employee_code:entry.code??null,ledger_value:entry.code??entry.email??entry.name??null});for(const entry of ledger){let candidates=[];for(const role of["code","email","name"]){const v=entry[role];if(v===void 0)continue;candidates=index[role].get(normalizeValue(v))??[];if(candidates.length>0)break}if(candidates.length>1){const active=candidates.filter(c=>c.can_login);
|
|
172
|
+
if(active.length===1)candidates=active}if(candidates.length>1){diffs.push({...fromLedger("ambiguous",entry),twp_value:`${candidates.length} \u4EBA\u306B\u4E00\u81F4\uFF08${candidates.map(c=>c.user_id).join(", ")}\uFF09`,suggestion:null});continue}const user=candidates[0];if(user===void 0){diffs.push({...fromLedger("missing_in_twp",entry),suggestion:`twp user invite create ${flagSegment("--email",entry.email??"<\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9>")}`});continue}matched.add(user.user_id);if(!user.
|
|
173
|
+
can_login){diffs.push({...base("disabled_in_twp",user,entry.line),twp_value:user.auth_type,suggestion:`twp user update ${shellQuote(user.user_id)} --auth-type ${placeholder("\u5931\u52B9\u524D\u306E\u8A8D\u8A3C\u30BF\u30A4\u30D7")} --display true --memberlist true --org-chart true --dashboard true`});continue}if(columns.department!==void 0&&entry.department!==void 0&&normalizeValue(entry.department)!==normalizeValue(user.department_name??"")){diffs.push({...base("department_mismatch",user,entry.
|
|
174
|
+
line),twp_value:user.department_name,ledger_value:entry.department,suggestion:`twp user assignment move ${shellQuote(user.user_id)} ${flagSegment("--department",entry.department)} --start-date ${placeholder("\u7570\u52D5\u65E5")}`})}if(columns.position!==void 0&&entry.position!==void 0&&normalizeValue(entry.position)!==normalizeValue(user.position_name??"")){diffs.push({...base("position_mismatch",user,entry.line),twp_value:user.position_name,ledger_value:entry.position,suggestion:user.assignment_id===
|
|
175
|
+
null?null:`twp user assignment update ${shellQuote(user.assignment_id)} --user ${shellQuote(user.user_id)} `+flagSegment("--position",entry.position)})}}for(const user of inventory){if(!user.can_login)continue;if(!matched.has(user.user_id)){diffs.push({...base("not_in_ledger",user,null),twp_value:user.auth_type,suggestion:disableCommand(user.user_id)})}if(user.last_login_status==="sso_not_recorded"||recentlyHired(user.hire_date,inactiveDays,now))continue;if(user.last_login_at===null||daysBetween(
|
|
176
|
+
user.last_login_at,now)>inactiveDays){diffs.push({...base("inactive",user,null),twp_value:user.last_login_at??`${LOGIN_HISTORY_RETENTION_DAYS}\u65E5\u4EE5\u5185\u306E\u30ED\u30B0\u30A4\u30F3\u8A18\u9332\u306A\u3057`})}}return diffs}var INVENTORY_COLUMNS=["user_id","user_name","email","employee_code","hire_date","department_name","position_name","manager_name","role","is_partner","permissions","auth_type","display_flg","last_login_at"];var DIFF_COLUMNS=["kind","kind_label","user_id","user_name","\
|
|
177
|
+
email","employee_code","auth_type","is_partner","ledger_line","twp_value","ledger_value","suggestion"];function exportBody(body){if(!isRecord(body)||!Array.isArray(body["rows"])||body["mode"]!=="inventory"&&body["mode"]!=="diff"){throw new ApiResponseError("\u68DA\u5378\u306E\u7D50\u679C\u3092\u7D44\u307F\u7ACB\u3066\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u5185\u90E8\u30A8\u30E9\u30FC\uFF09\u3002")}return body}function permissionText(levels){if(levels===null)return"\uFF08\u53D6\u5F97\u3067\u304D\u305A\uFF09";
|
|
178
|
+
const granted=Object.entries(levels).filter(([,level])=>level!=="none"&&level!=="").sort(([a],[b])=>a.localeCompare(b));return granted.length===0?"\uFF08\u306A\u3057\uFF09":granted.map(([feature,level])=>`${feature}:${level}`).join(";")}function lastLoginText(row){switch(row.last_login_status){case"recorded":return row.last_login_at;case"sso_not_recorded":return"\u5224\u5B9A\u4E0D\u80FD\uFF08SSO \u306F\u8A18\u9332\u3055\u308C\u306A\u3044\uFF09";case"not_recorded":return`${LOGIN_HISTORY_RETENTION_DAYS}\
|
|
179
|
+
\u65E5\u4EE5\u5185\u306E\u8A18\u9332\u306A\u3057`;default:return null}}function spreadsheetSafe(value){return typeof value==="string"&&/^[=+\-@\t\r]/.test(value)?`'${value}`:value}function flagValue(input,flag){const raw=input.flags.get(flag);if(raw===void 0)return void 0;if(raw.trim()==="")throw new UsageError(`${flag} \u306B\u7A7A\u306E\u5024\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,HELP);return raw}function ledgerOf(input){const raw=input.resolved?.["ledger"];return raw===void 0?void 0:
|
|
180
|
+
JSON.parse(raw)}var COLUMN_FLAGS=LEDGER_ROLES.map(role=>({name:`--${role}-column`,summary:`\u53F0\u5E33\u306E${ROLE_LABEL[role]}\u306E\u5217\u540D\uFF08\u65E2\u5B9A\u306F ${COLUMN_CANDIDATES[role].slice(0,3).join(" / ")} \u306A\u3069\u304B\u3089\u63A2\u3059\uFF09`,takesValue:true,placeholder:"<\u5217\u540D>"}));var exportOperation={name:"export",summary:"\u5728\u7C4D\u8005\u3092\u68DA\u5378\u3059\u308B\uFF08\u6240\u5C5E\u30FB\u5F79\u8077\u30FB\u4E0A\u9577\u30FB\u6A29\u9650\u30FB\u6700\u7D42\u30ED\u30B0\u30A4\u30F3\u4ED8\u304D\u30FB\u4EBA\u4E8B\u53F0\u5E33 CSV \u3068\u306E\u5DEE\u5206\uFF09",
|
|
181
|
+
usage:USAGE,description:`\u5728\u7C4D\u8005\uFF08\u8A8D\u8A3C\u30BF\u30A4\u30D7\u304C disabled \u3067\u306A\u3044\u30E6\u30FC\u30B6\u30FC\uFF09\u30921\u4EBA1\u884C\u3067\u51FA\u3057\u307E\u3059\u3002\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3082\u542B\u307F\u307E\u3059
|
|
182
|
+
\uFF08\u8868\u793A\u30D5\u30E9\u30B0\u3060\u3051\u5916\u3057\u3066\u5931\u52B9\u3055\u305B\u3066\u3044\u306A\u3044\u4EBA\u3092\u898B\u3064\u3051\u308B\u305F\u3081\uFF09\u3002--exclude-hidden \u3067\u8868\u793A\u4E2D\u306E\u30E6\u30FC\u30B6\u30FC\u3060\u3051\u306B\u7D5E\u308C\u307E\u3059\u3002
|
|
183
|
+
--include-disabled \u3067\u5931\u52B9\u6E08\u307F\u306E\u30E6\u30FC\u30B6\u30FC\u3082\u51FA\u3057\u307E\u3059\u3002\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u4F7F\u3048\u307E\u3059\u3002
|
|
184
|
+
|
|
185
|
+
\u5217: user_id / user_name / email / employee_code / hire_date\uFF08\u5165\u793E\u65E5\uFF09/ department_name\u30FBposition_name\uFF08\u4E3B\u6240\u5C5E\uFF09/
|
|
186
|
+
manager_name\uFF08\u4E3B\u6240\u5C5E\u306E\u4E0A\u9577\uFF09/ role / is_partner / permissions\uFF08\u6A5F\u80FD\u3054\u3068\u306E\u6A29\u9650\u3002none \u306F\u7701\u304F\uFF09/ auth_type / display_flg / last_login_at\u3002
|
|
187
|
+
\u500B\u4EBA\u9023\u7D61\u5148\uFF08\u500B\u4EBA\u30E1\u30FC\u30EB\u30FB\u7DCA\u6025\u9023\u7D61\u5148\u306A\u3069\uFF09\u306F\u51FA\u3057\u307E\u305B\u3093\u3002--output tsv \u3067\u8868\u8A08\u7B97\u30BD\u30D5\u30C8\u3078\u3001--output json \u3067\u4ED6\u306E\u30C4\u30FC\u30EB\u3078\u6E21\u305B\u307E\u3059
|
|
188
|
+
\uFF08tsv / table \u3067\u306F\u3001= + - @ \u3067\u59CB\u307E\u308B\u5024\u306E\u5148\u982D\u306B ' \u3092\u4ED8\u3051\u3066\u3001\u8868\u8A08\u7B97\u30BD\u30D5\u30C8\u304C\u5F0F\u3068\u3057\u3066\u8AAD\u307E\u306A\u3044\u3088\u3046\u306B\u3057\u307E\u3059\uFF09\u3002
|
|
189
|
+
|
|
190
|
+
\u6700\u7D42\u30ED\u30B0\u30A4\u30F3\u306F\u30ED\u30B0\u30A4\u30F3\u5C65\u6B74\u304B\u3089\u53D6\u308A\u307E\u3059\u3002\u6B21\u306E2\u70B9\u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
191
|
+
- \u30ED\u30B0\u30A4\u30F3\u5C65\u6B74\u306F90\u65E5\u3067\u6D88\u3048\u307E\u3059\u3002\u300C90\u65E5\u4EE5\u5185\u306E\u8A18\u9332\u306A\u3057\u300D\u306F\u4E00\u5EA6\u3082\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u306A\u3044\u3001\u3068\u3044\u3046\u610F\u5473\u3067\u306F\u3042\u308A\u307E\u305B\u3093
|
|
192
|
+
- Google / Microsoft \u306E SSO \u3067\u306E\u30ED\u30B0\u30A4\u30F3\u306F\u8A18\u9332\u3055\u308C\u307E\u305B\u3093\u3002\u8A8D\u8A3C\u30BF\u30A4\u30D7\u304C oauth \u306E\u30E6\u30FC\u30B6\u30FC\u306F\u300C\u5224\u5B9A\u4E0D\u80FD\u300D\u3068\u51FA\u3057\u3001
|
|
193
|
+
\u9577\u671F\u672A\u30ED\u30B0\u30A4\u30F3\uFF08inactive\uFF09\u306E\u5224\u5B9A\u304B\u3089\u5916\u3057\u307E\u3059\u3002all \u306E\u30E6\u30FC\u30B6\u30FC\u304C SSO \u3060\u3051\u3067\u4F7F\u3063\u3066\u3044\u308B\u5834\u5408\u3082\u8A18\u9332\u306F\u6B8B\u308A\u307E\u305B\u3093
|
|
194
|
+
|
|
195
|
+
--file <\u53F0\u5E33CSV> \u3092\u4ED8\u3051\u308B\u3068\u3001\u4EBA\u4E8B\u53F0\u5E33\u3068\u306E\u5DEE\u5206\u3060\u3051\u3092\u51FA\u3057\u307E\u3059\uFF081\u884C\u76EE\u306F\u898B\u51FA\u3057\u3002UTF-8 \u3068 Shift_JIS \u3092\u8AAD\u3081\u307E\u3059\uFF09:
|
|
196
|
+
not_in_ledger TWP \u3067\u5931\u52B9\u3057\u3066\u3044\u306A\u3044\u304C\u53F0\u5E33\u306B\u3044\u306A\u3044\uFF08\u9000\u793E\u6642\u306E\u5931\u52B9\u6F0F\u308C\u3002\u30D1\u30FC\u30C8\u30CA\u30FC\u3084\u5171\u7528\u30A2\u30AB\u30A6\u30F3\u30C8\u3082\u51FA\u307E\u3059\uFF09
|
|
197
|
+
missing_in_twp \u53F0\u5E33\u306B\u3044\u308B\u304C TWP \u306B\u3044\u306A\u3044\uFF08\u767B\u9332\u6F0F\u308C\uFF09
|
|
198
|
+
disabled_in_twp \u53F0\u5E33\u306B\u3044\u308B\u304C TWP \u3067\u5931\u52B9\u3057\u3066\u3044\u308B\uFF08\u8AA4\u5931\u52B9\uFF09
|
|
199
|
+
ambiguous \u53F0\u5E33\u306E1\u884C\u304C TWP \u306E\u8907\u6570\u306E\u30E6\u30FC\u30B6\u30FC\u306B\u4E00\u81F4\u3057\u3001\u6C7A\u3081\u3089\u308C\u306A\u3044
|
|
200
|
+
department_mismatch \u90E8\u7F72\u304C\u9055\u3046\uFF08\u7570\u52D5\u306E\u53CD\u6620\u6F0F\u308C\u30FB\u53F0\u5E33\u306B\u90E8\u7F72\u306E\u5217\u304C\u3042\u308B\u3068\u304D\uFF09
|
|
201
|
+
position_mismatch \u5F79\u8077\u304C\u9055\u3046\uFF08\u540C\u4E0A\u30FB\u53F0\u5E33\u306B\u5F79\u8077\u306E\u5217\u304C\u3042\u308B\u3068\u304D\uFF09
|
|
202
|
+
inactive \u30ED\u30B0\u30A4\u30F3\u3067\u304D\u308B\u306E\u306B --inactive-days \u65E5\uFF08\u65E2\u5B9A60\u30FB\u6700\u592790\uFF09\u30ED\u30B0\u30A4\u30F3\u306E\u8A18\u9332\u304C\u7121\u3044
|
|
203
|
+
\uFF08\u5165\u793E\u65E5\u304C\u305D\u306E\u65E5\u6570\u4EE5\u5185\u306E\u4EBA\u3068\u3001oauth \u306E\u4EBA\u306F\u51FA\u3057\u307E\u305B\u3093\uFF09
|
|
204
|
+
\u53F0\u5E33\u306E\u4EBA\u3068\u306F\u3001\u793E\u54E1\u756A\u53F7 \u2192 \u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9 \u2192 \u6C0F\u540D\u306E\u9806\u306B\u8A66\u3057\u3001\u6700\u521D\u306B TWP \u306E\u8AB0\u304B\u306B\u5F53\u305F\u3063\u305F\u5217\u3067\u7A81\u304D\u5408\u308F\u305B\u307E\u3059\u3002
|
|
205
|
+
\u90E8\u7F72\u30FB\u5F79\u8077\u306F TWP \u306E\u540D\u524D\u3068\u6BD4\u3079\u307E\u3059\uFF08\u5168\u89D2\u534A\u89D2\u30FB\u7A7A\u767D\u306E\u63FA\u308C\u3068\u5927\u6587\u5B57\u5C0F\u6587\u5B57\u306F\u7121\u8996\u3057\u307E\u3059\uFF09\u3002
|
|
206
|
+
\u5217\u540D\u306F \u793E\u54E1\u756A\u53F7 / \u6C0F\u540D / \u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9 / \u90E8\u7F72 / \u5F79\u8077 \u306A\u3069\u3092\u81EA\u52D5\u3067\u63A2\u3057\u307E\u3059\u3002\u9055\u3046\u3068\u304D\u306F --code-column \u7B49\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044
|
|
207
|
+
\uFF08\u898B\u51FA\u3057\u304C\u5358\u306B\u300C\u30E1\u30FC\u30EB\u300D\u306E\u5217\u306F\u500B\u4EBA\u30E1\u30FC\u30EB\u306E\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u81EA\u52D5\u3067\u306F\u4F7F\u3044\u307E\u305B\u3093\uFF09\u3002\u4F7F\u3046\u5217\u306F\u5B9F\u884C\u524D\u306B\u8868\u793A\u3057\u307E\u3059\u3002
|
|
208
|
+
\u5404\u884C\u306E suggestion \u306F\u6B21\u306B\u6253\u3064\u30B3\u30DE\u30F3\u30C9\u306E\u6848\u3067\u3059\u3002'<\u7570\u52D5\u65E5>' \u306A\u3069\u306E <\u2026> \u306F\u57CB\u3081\u3066\u304B\u3089\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
209
|
+
\u5B9F\u884C\u3059\u308B\u524D\u306B\u3001\u5BFE\u8C61\u304C\u81EA\u5206\u81EA\u8EAB\u3084\u5171\u7528\u306E\u7BA1\u7406\u30A2\u30AB\u30A6\u30F3\u30C8\u3067\u306A\u3044\u304B\u3092\u78BA\u304B\u3081\u3066\u304F\u3060\u3055\u3044\uFF08\u5931\u52B9\u3055\u305B\u308B\u3068\u30ED\u30B0\u30A4\u30F3\u3067\u304D\u306A\u304F\u306A\u308A\u307E\u3059\uFF09\u3002
|
|
210
|
+
twp user assignment move \u306F\u4E0A\u9577\u3092\u5F15\u304D\u7D99\u304C\u306A\u3044\u306E\u3067\u3001\u5FC5\u8981\u306A\u3089 --manager \u3082\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002
|
|
211
|
+
\u72B6\u614B\u304C active \u3067\u306A\u3044\u30A2\u30AB\u30A6\u30F3\u30C8\uFF08\u30DE\u30B9\u30BF\u7BA1\u7406\u3067\u505C\u6B62\u3057\u305F\u3082\u306E\u7B49\uFF09\u306F\u4E00\u89A7\u306B\u51FA\u306A\u3044\u305F\u3081\u3001missing_in_twp \u306B\u51FA\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002
|
|
212
|
+
|
|
213
|
+
1\u4EBA\u3042\u305F\u308A\u6700\u59273\u5F80\u5FA9\u3057\u307E\u3059\u3002\u672C\u756A\u306E API \u30EC\u30FC\u30C8\u5236\u9650\u306B\u5408\u308F\u305B\u30661\u5206\u3042\u305F\u308A ${SEND_PER_MINUTE} \u672C\u307E\u3067\u306B\u6291\u3048\u3066\u9001\u308A\u307E\u3059\u3002
|
|
214
|
+
\u5BFE\u8C61\u304C --max-users\uFF08\u65E2\u5B9A ${DEFAULT_MAX_USERS} \u4EBA\uFF09\u3092\u8D85\u3048\u308B\u3068\u3001\u8A73\u7D30\u3092\u8AAD\u3080\u524D\u306B\u6B62\u307E\u308A\u307E\u3059\u3002`,forbidden:"\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002twp user export \u306F\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u4F7F\u3048\u307E\u3059",flags:[{name:"--file",summary:"\u7A81\u304D\u5408\u308F\u305B\u308B\u4EBA\u4E8B\u53F0\u5E33\u306E CSV\uFF081\u884C\u76EE\u306F\u898B\u51FA\u3057\uFF09",
|
|
215
|
+
takesValue:true,placeholder:"<\u53F0\u5E33CSV>"},{name:"--include-disabled",summary:"\u5931\u52B9\u6E08\u307F\u306E\u30E6\u30FC\u30B6\u30FC\u3082\u51FA\u3059\uFF08--file \u7121\u3057\u306E\u3068\u304D\uFF09",takesValue:false},{name:"--exclude-hidden",summary:"\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3092\u5BFE\u8C61\u304B\u3089\u5916\u3059",takesValue:false},{name:"--inactive-days",summary:`\u3053\u306E\u65E5\u6570\u30ED\u30B0\u30A4\u30F3\u306E\u8A18\u9332\u304C\u7121\u3044\u5728\u7C4D\u8005\u3092 inactive \u3068\u3057\u3066\u51FA\u3059\uFF08\u65E2\u5B9A ${DEFAULT_INACTIVE_DAYS}\
|
|
216
|
+
\u30FB\u6700\u5927 ${LOGIN_HISTORY_RETENTION_DAYS}\uFF09`,takesValue:true,placeholder:"<\u65E5\u6570>"},...COLUMN_FLAGS,{name:"--max-users",summary:`\u5BFE\u8C61\u306E\u4EBA\u6570\u306E\u4E0A\u9650\uFF08\u65E2\u5B9A ${DEFAULT_MAX_USERS}\uFF09`,takesValue:true,placeholder:"<\u4EBA\u6570>"}],async prepare(input){if(input.args.length>0)throw new UsageError(`export \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,HELP);const inactiveDays=positiveInteger(input.
|
|
217
|
+
flags,"--inactive-days")??DEFAULT_INACTIVE_DAYS;if(inactiveDays>LOGIN_HISTORY_RETENTION_DAYS){throw new UsageError(`--inactive-days \u306F ${LOGIN_HISTORY_RETENTION_DAYS} \u4EE5\u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u53D7\u3051\u53D6\u3063\u305F\u5024: ${inactiveDays}\uFF09`,`\u30ED\u30B0\u30A4\u30F3\u5C65\u6B74\u306F ${LOGIN_HISTORY_RETENTION_DAYS} \u65E5\u3067\u6D88\u3048\u308B\u305F\u3081\u3001\u305D\u308C\u3088\u308A\u524D\u306F\u5224\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002`)}
|
|
218
|
+
const maxUsers=positiveInteger(input.flags,"--max-users")??DEFAULT_MAX_USERS;const file=flagValue(input,"--file");const overrides={};for(const role of LEDGER_ROLES){const value=flagValue(input,`--${role}-column`);if(value!==void 0)overrides[role]=value}const resolved={inactiveDays:String(inactiveDays),maxUsers:String(maxUsers)};if(file===void 0)return withResolved(input,resolved);if(input.flags.has("--include-disabled")){throw new UsageError("--include-disabled \u306F --file \u3068\u4E00\u7DD2\u306B\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093",
|
|
219
|
+
"\u5DEE\u5206\u3067\u306F\u5931\u52B9\u6E08\u307F\u306E\u30E6\u30FC\u30B6\u30FC\u3082\u7A81\u304D\u5408\u308F\u305B\u306B\u4F7F\u3044\u3001\u53F0\u5E33\u306B\u3044\u308B\u4EBA\u306F disabled_in_twp \u3068\u3057\u3066\u51FA\u3057\u307E\u3059\u3002")}resolved["ledger"]=JSON.stringify(parseLedger(decodeLedger(readLedgerFile(file)),overrides));return withResolved(input,resolved)},plan:input=>listPlan(input),plannedNotes:input=>{const notes=["\u3053\u306E\u3042\u3068\u4E00\u89A7\u306E\u7D9A\u304D\u30FB\u6A29\u9650\u30DE\u30C8\u30EA\u30AF\u30B9\u3092 GET \u3057\u30011\u4EBA\u305A\u3064\u8A73\u7D30\u30FB\u73FE\u5728\u306E\u6240\u5C5E\u30FB\u30ED\u30B0\u30A4\u30F3\u5C65\u6B74\u3092 GET \u3057\u307E\u3059\uFF08\u8AAD\u307F\u53D6\u308A\
|
|
220
|
+
\u3060\u3051\uFF09\u3002"];if(!input.flags.has("--exclude-hidden"))notes.push("\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3082\u5BFE\u8C61\u306B\u3057\u307E\u3059\uFF08--exclude-hidden \u3067\u9664\u3051\u307E\u3059\uFF09\u3002");const ledger=ledgerOf(input);if(ledger!==void 0){const used=LEDGER_ROLES.filter(role=>ledger.columns[role]!==void 0).map(role=>`${ROLE_LABEL[role]}=\u300C${ledger.header[ledger.columns[role]]??""}\u300D`);notes.push(`\u53F0\u5E33 ${ledger.
|
|
221
|
+
rows.length} \u884C\u3092\u8AAD\u307F\u307E\u3057\u305F\u3002\u4F7F\u3046\u5217: ${used.join("\u3001")}`)}return notes},async execute(input,ctx){const{rows,scanned}=await collectInventory(input,ctx);const disabled=rows.filter(r=>!r.can_login).length;const ssoUndetermined=rows.filter(r=>r.can_login&&r.last_login_status==="sso_not_recorded").length;const excludedHidden=input.flags.has("--exclude-hidden");const ledger=ledgerOf(input);if(ledger===void 0){const visible=input.flags.has("--include-disa\
|
|
222
|
+
bled")?rows:rows.filter(r=>r.can_login);return{mode:"inventory",rows:visible,scanned,disabled,ssoUndetermined,excludedHidden}}const diffs=diffAgainstLedger(rows,ledger.rows,ledger.columns,Number(requireResolved(input,"inactiveDays")),new Date);return{mode:"diff",rows:diffs,scanned,disabled,ssoUndetermined,excludedHidden}},summarize(body){const result=exportBody(body);if(result.mode==="diff"){return result.rows.map(row=>Object.fromEntries(DIFF_COLUMNS.map(c=>[c,spreadsheetSafe(row[c])])))}return result.
|
|
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
|
+
\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
|
+
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}};import fs3 from"fs";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
|
+
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
|
+
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
|
+
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
|
+
'"')&&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
|
+
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
|
+
""?"\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){try{const stat=fs3.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>CSV_MAX_BYTES){throw new UsageError(`--file \u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u307E\u3059\uFF08${stat.size} \u30D0\u30A4\u30C8\uFF09: ${file}`,
|
|
234
|
+
`\u4E00\u5EA6\u306B\u62DB\u5F85\u3067\u304D\u308B\u306E\u306F ${BULK_MAX} \u4EF6\u307E\u3067\u3067\u3059\u3002`)}return fs3.readFileSync(file,"utf8")}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)}}function bulkRows(input){return JSON.parse(requireResolved(input,"rows"))}function matchResults(response,sent){const results=isRecord(
|
|
235
|
+
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.filter(isRecord).map(result=>{const email=String(result["\
|
|
236
|
+
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\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"})}
|
|
237
|
+
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["message"]:"";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}`)}
|
|
238
|
+
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:",...lines].join("\n"))}throw err}const rows=matchResults(response,sent);const failed=rows.
|
|
239
|
+
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\u306F\u3042\u308A\u307E\u305B\u3093\u3002":` \u9001\u4FE1\u6E08\u307F\uFF08\u6253\u3061\
|
|
240
|
+
\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");ctx.warn(lines.join("\n"));throw new ApiRejectedError(`\u4E00\u62EC\u62DB\u5F85\u306F\u5B8C\u4E86\u3057\u3066\u3044\u307E\u305B\u3093\uFF08${failed.
|
|
241
|
+
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:"--invite",summary:"\u5BFE\u8C61\u306E\u62DB\u5F85\uFF08\u4F4D\u7F6E\u5F15\u6570\u306E\u4EE3\u308F\u308A\u306B\u4F7F\u3048\u308B\uFF09",takesValue:true,
|
|
242
|
+
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${[...ref].length} \u6587\u5B57\uFF09`,INVITE_REF_HELP);return withResolved(input,{token:ref})}return withResolved(input,{email:ref})}
|
|
243
|
+
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(`${email} \u5B9B\u3066\u306E\u672A\u53D7\u8AFE\u306E\u62DB\u5F85\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093`,
|
|
244
|
+
"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}`,INVITE_REF_HELP)}const hit=hits[0]?.["token"];if(typeof hit!=="string"||!/^[A-Za-z0-9_-]+$/.test(hit)){throw new ApiResponseError(
|
|
245
|
+
"\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.resolved?.["token"];return{method,path:token===void 0?`${INVITATIONS_PATH}/{token}${suffix}`:invitePath(token,suffix)}}
|
|
246
|
+
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={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",
|
|
247
|
+
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--name \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"+
|
|
248
|
+
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>"},{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>"}],
|
|
249
|
+
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.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\
|
|
250
|
+
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\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,
|
|
251
|
+
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\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",
|
|
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
|
|
253
|
+
\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
|
+
\u7A7A\u884C\u3068 # \u3067\u59CB\u307E\u308B\u884C\u306F\u8AAD\u307F\u98DB\u3070\u3057\u307E\u3059\u3002
|
|
255
|
+
|
|
256
|
+
email,role
|
|
257
|
+
new.member@example.com,user
|
|
258
|
+
leader@example.com,admin
|
|
259
|
+
|
|
260
|
+
\u9001\u308B\u524D\u306B\u5168\u884C\u3092\u691C\u67FB\u3057\u3001\u5F62\u306E\u8AA4\u308A\u30FB\u91CD\u8907\u304C\u3042\u308B\u884C\u304C1\u3064\u3067\u3082\u3042\u308C\u3070**1\u901A\u3082\u9001\u3089\u305A**\u306B\u3001
|
|
261
|
+
\u305D\u306E\u884C\u756A\u53F7\u3068\u7406\u7531\u3092\u3059\u3079\u3066\u51FA\u3057\u3066\u7D42\u4E86\u30B3\u30FC\u30C9 2 \u3067\u7D42\u308F\u308A\u307E\u3059\u3002--dry-run \u3067\u9001\u308B\u5185\u5BB9\u306E\u4E00\u89A7\u3092\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002
|
|
262
|
+
\u9001\u3063\u305F\u5F8C\u306B\u30B5\u30FC\u30D0\u304C\u884C\u3054\u3068\u306B\u65AD\u3063\u305F\u5834\u5408\uFF08\u65E2\u306B\u4F7F\u308F\u308C\u3066\u3044\u308B\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u7B49\uFF09\u306F\u3001
|
|
263
|
+
\u5931\u6557\u3057\u305F\u884C\u3068\u9001\u4FE1\u6E08\u307F\u306E\u884C\u3092 stderr \u306B\u51FA\u3057\u3066\u7D42\u4E86\u30B3\u30FC\u30C9 3 \u3067\u7D42\u308F\u308A\u307E\u3059\uFF08\u9001\u4FE1\u6E08\u307F\u306E\u884C\u306F\u53D6\u308A\u6D88\u3055\u308C\u307E\u305B\u3093\uFF09\u3002
|
|
264
|
+
|
|
265
|
+
\u6A5F\u80FD\u6A29\u9650\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u65E2\u5B9A\u3092\u4F7F\u3044\u307E\u3059\u3002${ROLE_HELP}`,forbidden:FORBIDDEN2,flags:[{name:"--file",summary:"\u62DB\u5F85\u3059\u308B\u4EBA\u306E CSV\uFF08\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9, \u6A29\u9650\uFF09",takesValue:true,placeholder:"<CSV>"}],async prepare(input){const usage="twp user invite bulk help";if(input.args.length>0)throw new UsageError(`bulk \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.
|
|
266
|
+
args.join(" ")}`,usage);const file=input.flags.get("--file");if(file===void 0||file.trim()==="")throw new UsageError("--file <CSV> \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",usage);const{rows,errors}=parseInviteCsv(readCsvFile(file,usage));if(errors.length>0){throw new UsageError(`CSV \u306B\u4E0D\u6B63\u306A\u884C\u304C ${errors.length} \u884C\u3042\u308B\u305F\u3081\u30011\u901A\u3082\u9001\u3063\u3066\u3044\u307E\u305B\u3093:
|
|
267
|
+
${errors.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\u62DB\u5F85\u3059\u308B\u884C\u304C\u3042\u308A\u307E\u305B\u3093: ${file}`,usage);if(rows.length>BULK_MAX){throw new UsageError(`\u4E00\u5EA6\u306B\u62DB\u5F85\u3067\u304D\u308B\u306E\u306F ${BULK_MAX} \u4EF6\
|
|
268
|
+
\u307E\u3067\u3067\u3059\uFF08${rows.length} \u4EF6\uFF09`,`CSV \u3092 ${BULK_MAX} \u884C\u305A\u3064\u306B\u5206\u3051\u3066\u6253\u3063\u3066\u304F\u3060\u3055\u3044\u3002`)}return withResolved(input,{rows:JSON.stringify(rows)})},plan:bulkPlan,plannedNotes:input=>{const rows=bulkRows(input);return[`${rows.length} \u4EF6\u3092\u62DB\u5F85\u3057\u307E\u3059:`,...rows.map(row=>` ${row.line} \u884C\u76EE: ${row.email}\uFF08${row.role}\uFF09`)]},execute:runBulk,summarize:body=>(bulkBody(body).rows??
|
|
269
|
+
[]).map(row=>pick(row,["line","email","role","success","queued","error"])),raw:body=>{const response=bulkBody(body).response??body;if(!isRecord(response))return response;const rest={...response};delete rest["result"];return rest},notes:body=>{const response=bulkBody(body).response;const queued=isRecord(response)?response["queued_count"]:void 0;const warnings=isRecord(response)?response["license_warnings"]:void 0;const notes=[];if(typeof queued==="number"&&queued>0){notes.push(`${queued} \u4EF6\u306F\u9001\u4FE1\u5F85\u3061\u306E\u5217\
|
|
270
|
+
\u306B\u5165\u308A\u307E\u3057\u305F\uFF08\u6570\u5206\u4EE5\u5185\u306B\u9001\u3089\u308C\u307E\u3059\u3002\u5C4A\u304B\u306A\u3051\u308C\u3070 twp user invite resend \u3067\u518D\u9001\u3067\u304D\u307E\u3059\uFF09\u3002`)}if(Array.isArray(warnings)&&warnings.length>0)notes.push(`\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6CE8\u610F: ${warnings.map(String).join(" / ")}`);return notes}},{name:"list",summary:"\u672A\u53D7\u8AFE\u306E\u62DB\u5F85\u3092\u4E00\u89A7\u3059\u308B",usage:"twp user invite l\
|
|
271
|
+
ist",description:"\u51FA\u308B\u306E\u306F\u672A\u53D7\u8AFE\u3067\u671F\u9650\u5185\u306E\u62DB\u5F85\u3060\u3051\u3067\u3059\uFF08\u671F\u9650\u5207\u308C\u30FB\u53D7\u8AFE\u6E08\u307F\u306F\u30B5\u30FC\u30D0\u304C\u8FD4\u3057\u307E\u305B\u3093\uFF09\u3002\n\u671F\u9650\u304C\u5207\u308C\u305F\u62DB\u5F85\u306F\u518D\u9001\u3082\u53D6\u6D88\u3082\u3067\u304D\u306A\u3044\u306E\u3067\u3001twp user invite create \u3067\u62DB\u5F85\u3057\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n\u30C8\u30FC\u30AF\u30F3\u306F\u62DB\u5F85\u3092\u53D7\u8AFE\u3067\u304D\u308B\u79D8\u5BC6\u306A\u306E\u3067\u4F0F\u5B57\u3067\u51FA\u3057\u307E\u3059\uFF08--no-redact \u3067\u8868\u793A\uFF09\u3002\n\u3053\u306E API \u306F\u30DA\u30FC\u30B8\u30F3\u30B0\u3092\u6301\u305F\u305A\u3001\u5E38\u306B\u5168\u4EF6\u3092\u8FD4\u3057\u307E\u3059\u3002",
|
|
272
|
+
forbidden:FORBIDDEN2,flags:[],async prepare(input){if(input.args.length>0)throw new UsageError(`list \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,"twp user invite list help");return input},plan:()=>({method:"GET",path:INVITATIONS_PATH}),summarize:body=>invitationRows(body).map(row=>pick(row,LIST_COLUMNS)),raw:body=>invitationRows(body)},{name:"resend",summary:"\u62DB\u5F85\u30E1\u30FC\u30EB\u3092\u518D\u9001\u3059\u308B\uFF08\u671F\u9650\u5185\u306E\u672A\u53D7\u8AFE\u306E\u62DB\u5F85\u3060\u3051\uFF09",
|
|
273
|
+
usage:"twp user invite resend <\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9|\u30C8\u30FC\u30AF\u30F3>",description:INVITE_REF_HELP,forbidden:FORBIDDEN2,flags:[INVITE_REF_FLAG],prepare:input=>prepareInvite(input,"twp user invite resend help"),plan:input=>refPlan(input,"POST","/resend"),plannedNotes:refNotes,async execute(input,ctx){return ctx.send({method:"POST",path:invitePath(await tokenFor(input,ctx),"/resend")})},summarize:body=>successAck(body,"\u62DB\u5F85\u306E\u518D\u9001"),raw:body=>successAck(
|
|
274
|
+
body,"\u62DB\u5F85\u306E\u518D\u9001")},{name:"delete",summary:"\u62DB\u5F85\u3092\u53D6\u308A\u6D88\u3059\uFF08\u53D7\u8AFE\u7528\u306E\u30EA\u30F3\u30AF\u304C\u4F7F\u3048\u306A\u304F\u306A\u308B\uFF09",usage:"twp user invite delete <\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9|\u30C8\u30FC\u30AF\u30F3> --yes",description:`${INVITE_REF_HELP}
|
|
275
|
+
|
|
276
|
+
\u53D6\u308A\u6D88\u3057\u305F\u62DB\u5F85\u306F\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3002\u3082\u3046\u4E00\u5EA6\u62DB\u5F85\u3059\u308B\u3068\u304D\u306F twp user invite create \u3092\u4F7F\u3044\u307E\u3059\u3002`,destructive:true,forbidden:FORBIDDEN2,flags:[INVITE_REF_FLAG],prepare:input=>prepareInvite(input,"twp user invite delete help"),plan:input=>refPlan(input,"DELETE"),plannedNotes:refNotes,async execute(input,ctx){return ctx.send({method:"DELETE",path:invitePath(await tokenFor(input,
|
|
277
|
+
ctx))})},summarize:body=>successAck(body,"\u62DB\u5F85\u306E\u53D6\u6D88"),raw:body=>successAck(body,"\u62DB\u5F85\u306E\u53D6\u6D88")}]};var LIST_COLUMNS2=["user_id","user_name","email","employee_code","department_name","position_name","role","display_flg"];var GET_COLUMNS=["user_id","user_name","user_name_kana","email","employee_code","role","auth_type","hire_date","is_locked","display_flg","memberlist_flg","org_chart_flg","dashboard_flg"];var EMPLOYMENT_TYPES=["employee","partner"];var listPaging2=envelopePaging({label:"\u30E6\u30FC\u30B6\u30FC\u4E00\u89A7"});function userObject(body){if(!isRecord(body)||typeof body["user_id"]!==
|
|
278
|
+
"string"){throw new ApiResponseError("\u30E6\u30FC\u30B6\u30FC\u8A73\u7D30\u306E\u5FDC\u7B54\u306B user_id \u304C\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}var TEXT_FIELDS=[{flag:"--name",key:"user_name",label:"\u6C0F\u540D",maxChars:255,summary:"\u6C0F\u540D",placeholder:"<\u6C0F\u540D>"},{flag:"--kana",key:"user_name_kana",label:"\u30D5\u30EA\u30AC\u30CA",maxChars:255,
|
|
279
|
+
summary:"\u6C0F\u540D\u306E\u30D5\u30EA\u30AC\u30CA",placeholder:"<\u30D5\u30EA\u30AC\u30CA>"},{flag:"--email",key:"login_id",label:"\u30ED\u30B0\u30A4\u30F3ID",maxChars:255,summary:"\u30ED\u30B0\u30A4\u30F3ID\uFF08\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\uFF09",placeholder:"<\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9>"},{flag:"--employee-code",key:"employee_code",label:"\u793E\u54E1\u756A\u53F7",maxChars:50,summary:"\u793E\u54E1\u756A\u53F7",placeholder:"<\u793E\u54E1\u756A\u53F7>"}];var DISPLAY_FIELDS=[
|
|
280
|
+
{flag:"--display",key:"display_flg",summary:"\u30E6\u30FC\u30B6\u30FC\u4E00\u89A7\u30FB\u9078\u629E\u80A2\u306B\u8868\u793A\u3059\u308B\u304B\uFF08true / false\uFF09"},{flag:"--memberlist",key:"memberlist_flg",summary:"\u30E1\u30F3\u30D0\u30FC\u4E00\u89A7\u306B\u8868\u793A\u3059\u308B\u304B\uFF08true / false\uFF09"},{flag:"--org-chart",key:"org_chart_flg",summary:"\u7D44\u7E54\u56F3\u306B\u8868\u793A\u3059\u308B\u304B\uFF08true / false\uFF09"},{flag:"--dashboard",key:"dashboard_flg",summary:"\u30C0\u30C3\u30B7\
|
|
281
|
+
\u30E5\u30DC\u30FC\u30C9\u306B\u8868\u793A\u3059\u308B\u304B\uFF08true / false\uFF09"}];var ROLE_TO_TYPE={user:"0",admin:"1"};var AUTH_TYPES=["all","password","oauth","disabled"];var PASSWORD_MIN_CHARS=8;var PASSWORD_FILE_MAX_BYTES=4096;var PASSWORD_FILE_FLAG={name:"--password-file",summary:"\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u66F8\u3044\u305F\u30D5\u30A1\u30A4\u30EB\uFF08- \u3067\u6A19\u6E96\u5165\u529B\uFF09",takesValue:true,placeholder:"<\u30D1\u30B9|->"};var ROLE_FLAG={name:"--role",summary:"\
|
|
282
|
+
\u7A2E\u5225\uFF08admin: \u7BA1\u7406\u8005 / user: \u4E00\u822C\uFF09",takesValue:true,placeholder:"<admin|user>"};var HIRE_DATE_FLAG={name:"--hire-date",summary:"\u5165\u793E\u65E5\uFF08YYYY-MM-DD\uFF09",takesValue:true,placeholder:"<YYYY-MM-DD>"};var AUTH_TYPE_FLAG={name:"--auth-type",summary:"\u8A8D\u8A3C\u30BF\u30A4\u30D7\uFF08all / password / oauth / disabled\uFF1D\u5931\u52B9\u30FB\u30ED\u30B0\u30A4\u30F3\u4E0D\u53EF\uFF09",takesValue:true,placeholder:"<\u7A2E\u985E>"};var FIELD_FLAGS=[...TEXT_FIELDS.
|
|
283
|
+
map(f=>({name:f.flag,summary:f.summary,takesValue:true,placeholder:f.placeholder})),ROLE_FLAG,HIRE_DATE_FLAG,...DISPLAY_FIELDS.map(f=>({name:f.flag,summary:f.summary,takesValue:true,placeholder:"<true|false>"})),PASSWORD_FILE_FLAG];var PASSWORD_HELP="\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u30B3\u30DE\u30F3\u30C9\u884C\u306B\u7F6E\u3051\u307E\u305B\u3093\uFF08\u30B7\u30A7\u30EB\u306E\u5C65\u6B74\u3068\u30D7\u30ED\u30BB\u30B9\u4E00\u89A7\u306B\u6B8B\u308B\u305F\u3081\uFF09\u3002\n--password-file <\u30D1\u30B9> \u3067\u6E21\u3059\u304B\u3001--password-file - \u3067\u6A19\u6E96\u5165\u529B\u304B\u3089\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n\u672B\u5C3E\u306E\u6539\u884C1\u3064\u306F\u53D6\u308A\u9664\u304D\u307E\u3059\uFF08echo \u3067\u66F8\u3044\u305F\u30D5\u30A1\u30A4\u30EB\u3067\u3082\u305D\u306E\u307E\u307E\u4F7F\u3048\u307E\u3059\uFF09\u30028\u6587\u5B57\u4EE5\u4E0A\u3067\u3059\u3002";
|
|
284
|
+
var PASSWORD_HINT="\u30D1\u30B9\u30EF\u30FC\u30C9\u306F --password-file \u306B\u30D5\u30A1\u30A4\u30EB\u306E\u30D1\u30B9\u3092\u6E21\u3059\u304B\u3001\u5024\u306B\u300C-\u300D\u3092\u6E21\u3057\u3066\u6A19\u6E96\u5165\u529B\u304B\u3089\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\uFF088\u6587\u5B57\u4EE5\u4E0A\uFF09\u3002";var DISPLAY_HELP="--display / --memberlist / --org-chart / --dashboard \u306F true \u304B false \u3067\u3059\uFF08\u753B\u9762\u306E\u300C\u8868\u793A\u8A2D\u5B9A\u300D\uFF09\u3002";
|
|
285
|
+
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
|
+
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
|
+
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=fs4.statSync(file);if(!stat.isFile())throw new UsageError(`--passwor\
|
|
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=fs4.readFileSync(file,"utf8")}catch(err){if(err instanceof UsageError)throw err;const reason=err.code??err.message;throw new UsageError(`--password-file \
|
|
290
|
+
\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
|
+
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
|
+
`${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["\
|
|
293
|
+
feature"]??""):String(warning));return[`\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u7A7A\u304D\u304C\u8DB3\u308A\u306A\u3044\u305F\u3081\u3001\u4E00\u90E8\u306E\u6A5F\u80FD\u6A29\u9650\u306F\u4ED8\u4E0E\u3055\u308C\u3066\u3044\u307E\u305B\u3093: ${texts.join(" / ")}`]}var createOperation2={name:"create",summary:"\u30E6\u30FC\u30B6\u30FC\u3092\u4F5C\u6210\u3059\u308B\uFF08\u5165\u793E\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09",usage:"twp user create --name <\u6C0F\u540D> --email <\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9> --password-\
|
|
294
|
+
file <\u30D1\u30B9|-> [--role admin|user] [--kana <\u30D5\u30EA\u30AC\u30CA>] [--hire-date <YYYY-MM-DD>] [--employee-code <\u793E\u54E1\u756A\u53F7>] [--display true|false] \u2026",description:`--name / --email / --password-file \u304C\u5FC5\u9808\u3067\u3059\u3002--role \u3092\u7701\u304F\u3068\u4E00\u822C\u30E6\u30FC\u30B6\u30FC\uFF08user\uFF09\u3067\u4F5C\u6210\u3057\u307E\u3059\u3002
|
|
295
|
+
\u8868\u793A\u30D5\u30E9\u30B0\u3092\u7701\u304F\u3068\u3001\u30B5\u30FC\u30D0\u306E\u65E2\u5B9A\uFF08\u3059\u3079\u3066 true\uFF1D\u8868\u793A\u3059\u308B\uFF09\u3067\u4F5C\u6210\u3057\u307E\u3059\u3002
|
|
296
|
+
\u6A5F\u80FD\u6A29\u9650\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u65E2\u5B9A\u3067\u4ED8\u4E0E\u3055\u308C\u307E\u3059\uFF08\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u7A7A\u304D\u304C\u8DB3\u308A\u306A\u3044\u6A5F\u80FD\u306F\u4ED8\u4E0E\u3055\u308C\u305A\u3001stderr \u306B\u51FA\u307E\u3059\uFF09\u3002
|
|
297
|
+
|
|
298
|
+
${PASSWORD_HELP}
|
|
299
|
+
|
|
300
|
+
${DISPLAY_HELP}
|
|
301
|
+
|
|
302
|
+
\u4F5C\u6210\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u306E ID \u304C\u8FD4\u308A\u307E\u3059\u3002\u7D9A\u3051\u3066 twp user get <ID> \u3067\u5185\u5BB9\u3092\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002`,forbidden:"\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002twp user create \u306F\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u4F7F\u3048\u307E\u3059",flags:FIELD_FLAGS,async prepare(input){if(input.args.length>0){throw new UsageError(`create \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.
|
|
303
|
+
args.join(" ")}`,"twp user create help")}const body=userFields(input);for(const[flag,key]of[["--name","user_name"],["--email","login_id"]]){if(body[key]===void 0)throw new UsageError(`${flag} \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044`,"twp user create help")}if(!input.flags.has(PASSWORD_FILE_FLAG.name)){throw new UsageError("--password-file \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",PASSWORD_HINT)}const password=await readPassword(input,"twp user create help");return withResolved(
|
|
304
|
+
input,{password})},plan(input){const body=userFields(input);if(body["type"]===void 0)body["type"]=ROLE_TO_TYPE["user"];return{method:"POST",path:"/api/v2/admin/users",body:{...body,password:requireResolved(input,"password")}}},plannedNotes:input=>input.flags.has("--role")?[]:["--role \u672A\u6307\u5B9A\u306E\u305F\u3081\u3001\u4E00\u822C\u30E6\u30FC\u30B6\u30FC\uFF08user\uFF09\u3067\u4F5C\u6210\u3057\u307E\u3059\u3002"],summarize:body=>pick(writeAck(body,"\u30E6\u30FC\u30B6\u30FC\u4F5C\u6210"),[
|
|
305
|
+
"user_id","message"]),raw:body=>writeAck(body,"\u30E6\u30FC\u30B6\u30FC\u4F5C\u6210"),notes:body=>licenseNotes(body)};var UPDATE_FLAGS=[...FIELD_FLAGS,AUTH_TYPE_FLAG,USER_REF_FLAG];var updateOperation2={name:"update",summary:"\u30E6\u30FC\u30B6\u30FC\u3092\u66F4\u65B0\u3059\u308B\uFF08\u5931\u52B9\u3092\u542B\u3080\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09",usage:"twp user update <\u30E6\u30FC\u30B6\u30FC> [--auth-type all|password|oauth|disabled] [--display true|false] [--memberlist true|false] [--org-\
|
|
306
|
+
chart true|false] [--dashboard true|false] [--name <\u6C0F\u540D>] \u2026",description:`\u6307\u5B9A\u3057\u305F\u9805\u76EE\u3060\u3051\u3092\u5909\u66F4\u3057\u307E\u3059\uFF08\u6307\u5B9A\u3057\u306A\u304B\u3063\u305F\u9805\u76EE\u306F\u5909\u308F\u308A\u307E\u305B\u3093\uFF09\u3002
|
|
307
|
+
\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u3082\u6307\u5B9A\u3057\u306A\u3044\u3068\u30A8\u30E9\u30FC\u306B\u306A\u308A\u307E\u3059\u3002
|
|
308
|
+
|
|
309
|
+
\u9000\u793E\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u306F\u3001\u8A8D\u8A3C\u30BF\u30A4\u30D7\u3092 disabled\uFF08\u753B\u9762\u306E\u300C\u7121\u52B9\uFF08\u30ED\u30B0\u30A4\u30F3\u4E0D\u53EF\uFF09\u300D\uFF09\u306B\u3057\u3066\u5931\u52B9\u3055\u305B\u307E\u3059\u3002
|
|
310
|
+
\u5931\u52B9\u3055\u305B\u308B\u3068\u3001\u305D\u306E\u30E6\u30FC\u30B6\u30FC\u306F\u65B0\u3057\u304F\u30ED\u30B0\u30A4\u30F3\u3067\u304D\u305A\u3001\u767A\u884C\u6E08\u307F\u306E\u30C8\u30FC\u30AF\u30F3\u3068 API \u30AD\u30FC\u3082\u30B5\u30FC\u30D0\u304C\u5931\u52B9\u3055\u305B\u307E\u3059\u3002
|
|
311
|
+
\u4E00\u89A7\u3084\u7D44\u7E54\u56F3\u304B\u3089\u5916\u3059\u306A\u3089\u3001\u8868\u793A\u30D5\u30E9\u30B0\u3082 false \u306B\u3057\u307E\u3059:
|
|
312
|
+
twp user update <\u30E6\u30FC\u30B6\u30FC> --auth-type disabled --display false --memberlist false --org-chart false --dashboard false
|
|
313
|
+
\u53D6\u308A\u6D88\u3059\uFF08\u518D\u5165\u793E\u30FB\u8AA4\u64CD\u4F5C\uFF09\u3068\u304D\u306F\u540C\u3058\u30B3\u30DE\u30F3\u30C9\u3067\u623B\u3057\u307E\u3059\uFF08\u8868\u793A\u30D5\u30E9\u30B0\u3092 true\u3001--auth-type \u306F\u5931\u52B9\u524D\u306E\u5024\uFF09\u3002
|
|
314
|
+
\u5931\u52B9\u524D\u306E\u8A8D\u8A3C\u30BF\u30A4\u30D7\u306F\u8A18\u9332\u3055\u308C\u306A\u3044\u306E\u3067\u3001\u5931\u52B9\u3055\u305B\u308B\u524D\u306B twp user get <\u30E6\u30FC\u30B6\u30FC> \u306E auth_type \u3092\u63A7\u3048\u3066\u304F\u3060\u3055\u3044
|
|
315
|
+
\uFF08all \u306F\u30D1\u30B9\u30EF\u30FC\u30C9\u3068 OAuth \u306E\u4E21\u65B9\u3092\u8A31\u3057\u307E\u3059\u3002SSO \u3060\u3051\u306E\u30E6\u30FC\u30B6\u30FC\u3092 all \u306B\u623B\u3059\u3068\u30D1\u30B9\u30EF\u30FC\u30C9\u3067\u3082\u30ED\u30B0\u30A4\u30F3\u3067\u304D\u307E\u3059\uFF09\u3002
|
|
316
|
+
|
|
317
|
+
${USER_REF_HELP}
|
|
318
|
+
\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3059\u3068\u3001\u305D\u306E\u30E6\u30FC\u30B6\u30FC\u306F\u793E\u54E1\u756A\u53F7\u3067\u306F\u6307\u5B9A\u3067\u304D\u306A\u304F\u306A\u308A\u307E\u3059\uFF08\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u304B ID \u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\u3002
|
|
319
|
+
\u4F5C\u6210\u30FB\u66F4\u65B0\u306E\u76F4\u5F8C\u306B\u793E\u54E1\u756A\u53F7\u3067\u6307\u5B9A\u3059\u308B\u3068\u304D\u306F --refresh \u3092\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\uFF08\u30E6\u30FC\u30B6\u30FC\u4E00\u89A7\u306F10\u5206\u30AD\u30E3\u30C3\u30B7\u30E5\u3057\u307E\u3059\uFF09\u3002
|
|
320
|
+
|
|
321
|
+
${PASSWORD_HELP}
|
|
322
|
+
|
|
323
|
+
${DISPLAY_HELP}`,forbidden:"\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002twp user update \u306F\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u4F7F\u3048\u307E\u3059",flags:UPDATE_FLAGS,async prepare(input,ctx){const changed=[...FIELD_FLAGS,AUTH_TYPE_FLAG].some(flag=>input.flags.has(flag.name));if(!changed){throw new UsageError("\u5909\u66F4\u3059\u308B\u9805\u76EE\u30921\u3064\u4EE5\u4E0A\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",`\u6307\u5B9A\u3067\u304D\u308B\u9805\u76EE: ${[
|
|
324
|
+
...FIELD_FLAGS,AUTH_TYPE_FLAG].map(flag=>flag.name).join("\u3001")}`)}userFields(input);authType(input);const password=await readPassword(input,"twp user update help");const resolved=await prepareUser(input,ctx,"twp user update help");return password===void 0?resolved:withResolved(resolved,{password})},plan(input){const userId=requireResolved(input,"userId");const body=userFields(input);const auth=authType(input);if(auth!==void 0)body["auth_type"]=auth;const password=input.resolved?.["password"];
|
|
325
|
+
if(password!==void 0)body["password"]=password;return{method:"PUT",path:`/api/v2/admin/users/${userPath(input)}`,body:{user_id:userId,update_fields:Object.keys(body),...body}}},plannedNotes:input=>{if(authType(input)!=="disabled")return[];const ref=(input.args[0]??input.flags.get("--user")??"").trim().toLowerCase();const notes=["\u3053\u306E\u30E6\u30FC\u30B6\u30FC\u3092\u5931\u52B9\u3055\u305B\u307E\u3059\uFF08\u30ED\u30B0\u30A4\u30F3\u4E0D\u53EF\u3002\u767A\u884C\u6E08\u307F\u306E\u30C8\u30FC\u30AF\u30F3\u30FBAPI \u30AD\u30FC\u3082\u30B5\u30FC\u30D0\u304C\u5931\u52B9\u3055\u305B\u307E\u3059\uFF09\u3002"];
|
|
326
|
+
if(ref==="me")notes.push("\u5BFE\u8C61\u306F\u81EA\u5206\u81EA\u8EAB\u3067\u3059\u3002\u5B9F\u884C\u3059\u308B\u3068\u3001\u3053\u306E\u3042\u3068 twp \u306E\u64CD\u4F5C\u3082\u30ED\u30B0\u30A4\u30F3\u3082\u3067\u304D\u306A\u304F\u306A\u308A\u307E\u3059\u3002");return notes},summarize:body=>pick(writeAck(body,"\u30E6\u30FC\u30B6\u30FC\u66F4\u65B0"),["message"]),raw:body=>writeAck(body,"\u30E6\u30FC\u30B6\u30FC\u66F4\u65B0"),notes:body=>licenseNotes(body)};var userDomain={name:"user",summary:"\u30C6\u30CA\u30F3\
|
|
327
|
+
\u30C8\u306E\u30E6\u30FC\u30B6\u30FC\uFF08\u4F5C\u6210\u30FB\u66F4\u65B0\u30FB\u5931\u52B9\u30FB\u62DB\u5F85\u30FB\u68DA\u5378\uFF09\u3068\u6240\u5C5E\uFF08\u53C2\u7167\u30FB\u4ED8\u3051\u66FF\u3048\u30FB\u4F5C\u6210\u30FB\u66F4\u65B0\u30FB\u7D42\u4E86\u30FB\u524A\u9664\uFF09",operations:[{name:"list",summary:"\u30E6\u30FC\u30B6\u30FC\u3092\u4E00\u89A7\u3059\u308B\uFF08\u90E8\u7F72\u30FB\u5F79\u8077\u30FB\u96C7\u7528\u533A\u5206\u30FB\u30AD\u30FC\u30EF\u30FC\u30C9\u3067\u7D5E\u308A\u8FBC\u3081\u308B\uFF09",
|
|
328
|
+
usage:"twp user list [--department <\u90E8\u7F72>] [--position <\u5F79\u8077>] [--employment employee|partner] [--keyword <\u8A9E>] [--include-hidden] [--all] [--limit <\u4EF6\u6570>] [--cursor <\u30AB\u30FC\u30BD\u30EB>]",description:"--department / --position \u306F\u540D\u524D\u30FB\u30B3\u30FC\u30C9\u30FBID \u306E\u3069\u308C\u3067\u3082\u6307\u5B9A\u3067\u304D\u307E\u3059\uFF08\u4E3B\u6240\u5C5E\u3067\u7D5E\u308A\u8FBC\u307F\u307E\u3059\uFF09\u3002\n--employment \u306F employee\uFF08\u793E\u54E1\uFF09\u304B partner\uFF08\u30D1\u30FC\u30C8\u30CA\u30FC\uFF09\u3067\u3059\u3002\n--include-hidden \u306F\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3082\u542B\u3081\u307E\u3059\uFF08\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u3068\u304D\u3060\u3051\u52B9\u304D\u307E\u3059\uFF09\u3002\n\u5931\u52B9\uFF08\u30ED\u30B0\u30A4\u30F3\u4E0D\u53EF\uFF09\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3082\u4E00\u89A7\u306B\u542B\u307E\u308C\u307E\u3059\u3002\u5931\u52B9\u304B\u3069\u3046\u304B\u306F twp user get \u306E auth_type \u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\n\uFF08\u5168\u54E1\u306E\u8A8D\u8A3C\u30BF\u30A4\u30D7\u3092\u4E00\u89A7\u3067\u898B\u308B\u306A\u3089 twp user export \
|
|
329
|
+
--include-disabled\uFF09\u3002\n\n--output json \u306F API \u304C\u8FD4\u3059\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u51FA\u3057\u307E\u3059\u3002\n--output table / text / tsv \u306F\u8981\u7D04\u5217\uFF08user_id / user_name / email / employee_code / department_name / position_name / role / display_flg\uFF09\u3067\u3059\u3002\n\n"+LIST_PAGING_HELP,flags:[...LIST_FLAGS,{name:"--department",summary:"\u4E3B\u6240\u5C5E\u306E\u90E8\u7F72\u3067\u7D5E\u308A\u8FBC\u3080\uFF08\u540D\u524D\u30FB\u30B3\u30FC\u30C9\u30FBID\uFF09",
|
|
330
|
+
takesValue:true,placeholder:"<\u90E8\u7F72>"},{name:"--position",summary:"\u4E3B\u6240\u5C5E\u306E\u5F79\u8077\u3067\u7D5E\u308A\u8FBC\u3080\uFF08\u540D\u524D\u30FB\u30B3\u30FC\u30C9\u30FBID\uFF09",takesValue:true,placeholder:"<\u5F79\u8077>"},{name:"--employment",summary:"\u96C7\u7528\u533A\u5206\u3067\u7D5E\u308A\u8FBC\u3080\uFF08employee / partner\uFF09",takesValue:true,placeholder:"<\u533A\u5206>"},{name:"--keyword",summary:"\u6C0F\u540D\u30FB\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306E\u90E8\u5206\u4E00\u81F4\u3067\u7D5E\u308A\u8FBC\u3080",
|
|
331
|
+
takesValue:true,placeholder:"<\u8A9E>"},{name:"--include-hidden",summary:"\u8868\u793A\u30D5\u30E9\u30B0\u3092\u5916\u3057\u305F\u30E6\u30FC\u30B6\u30FC\u3082\u542B\u3081\u308B",takesValue:false}],paging:listPaging2,async prepare(input,ctx){if(input.args.length>0){throw new UsageError(`list \u306F\u4F4D\u7F6E\u5F15\u6570\u3092\u53D6\u308A\u307E\u305B\u3093: ${input.args.join(" ")}`,"twp user list help")}const employment=nonEmpty(input.flags,"--employment");if(employment!==void 0&&!EMPLOYMENT_TYPES.
|
|
332
|
+
includes(employment)){throw new UsageError(`--employment \u306B\u300C${employment}\u300D\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,`\u6307\u5B9A\u3067\u304D\u308B\u306E\u306F ${EMPLOYMENT_TYPES.join(" / ")} \u3067\u3059`)}const resolved={};const department=nonEmpty(input.flags,"--department");if(department!==void 0)resolved["departmentId"]=(await ctx.resolver.department(department)).id;const position=nonEmpty(input.flags,"--position");if(position!==void 0)resolved["positionId"]=(await ctx.
|
|
333
|
+
resolver.position(position)).id;return withResolved(input,resolved)},plan(input){return{method:"GET",path:"/api/v2/admin/users/list",query:{limit:positiveInteger(input.flags,"--limit"),cursor:nonEmpty(input.flags,"--cursor"),keyword:nonEmpty(input.flags,"--keyword"),department_id:input.resolved?.["departmentId"],position_id:input.resolved?.["positionId"],employment_type:nonEmpty(input.flags,"--employment"),include_hidden:input.flags.has("--include-hidden")?"true":void 0}}},summarize:body=>listPaging2.
|
|
334
|
+
items(body).map(row=>pick(row,LIST_COLUMNS2)),raw:body=>listPaging2.items(body)},{name:"get",summary:"\u30E6\u30FC\u30B6\u30FC1\u4EBA\u306E\u8A73\u7D30\u3092\u8868\u793A\u3059\u308B\uFF08\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09",usage:"twp user get <\u30E6\u30FC\u30B6\u30FC>",description:USER_REF_HELP+"\n\nauth_type \u304C disabled \u306E\u30E6\u30FC\u30B6\u30FC\u306F\u5931\u52B9\uFF08\u30ED\u30B0\u30A4\u30F3\u4E0D\u53EF\uFF09\u3057\u3066\u3044\u307E\u3059\u3002\n\u8981\u7D04\uFF08table / text / tsv\uFF09\u306B\u306F\u500B\u4EBA\u9023\u7D61\u5148\u3092\u51FA\u3057\u307E\u305B\u3093\u3002--output json \u306F API \u304C\u8FD4\u3059\u5168\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u51FA\u3057\u307E\u3059\u3002",
|
|
335
|
+
forbidden:"\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002twp user get \u306F\u7D44\u7E54\u7BA1\u7406\u8005\u3060\u3051\u304C\u4F7F\u3048\u307E\u3059",flags:[USER_REF_FLAG],prepare:(input,ctx)=>prepareUser(input,ctx,"twp user get help"),plan:input=>({method:"GET",path:`/api/v2/admin/users/${userPath(input)}`}),summarize:body=>pick(userObject(body),GET_COLUMNS),raw:body=>userObject(body)},createOperation2,updateOperation2,exportOperation],subresources:[userAssignmentResource,
|
|
336
|
+
userInviteResource]};export{userDomain};
|