@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.
Files changed (52) hide show
  1. package/CHANGELOG.public.md +14 -0
  2. package/README.md +98 -4
  3. package/dist/agent-loop-ZP47LTUE.js +75 -0
  4. package/dist/{ai-dispatch-36HRDRLF.js → ai-dispatch-VSCKUY6J.js} +1 -1
  5. package/dist/{api-command-NMYYJKZH.js → api-command-VWJXBUCJ.js} +2 -2
  6. package/dist/{app-2KMY3QPM.js → app-3JIU5OUX.js} +49 -48
  7. package/dist/attendance-42XLURM7.js +21 -0
  8. package/dist/{auto-update-worker-AXBJIMFP.js → auto-update-worker-OBFGN6FY.js} +1 -1
  9. package/dist/{backlog-7MJIOT22.js → backlog-KSMQIC2R.js} +1 -1
  10. package/dist/charter-command-ULFOEZWE.js +26 -0
  11. package/dist/chunk-BKZGBJWT.js +15 -0
  12. package/dist/{chunk-DMDVLOAY.js → chunk-G4OO4M44.js} +1 -1
  13. package/dist/{chunk-WGVHYTZV.js → chunk-IRAZ27WL.js} +1 -1
  14. package/dist/{chunk-4V4T5ZUS.js → chunk-KEP5QSS4.js} +40 -15
  15. package/dist/{chunk-I3YPO7CY.js → chunk-KUIFIN7P.js} +1 -1
  16. package/dist/{chunk-QOUFHYK5.js → chunk-NIAOX77K.js} +1 -1
  17. package/dist/chunk-P4AEFKLM.js +13 -0
  18. package/dist/{chunk-VCMVTC6B.js → chunk-PK6CUUAQ.js} +1 -1
  19. package/dist/chunk-SP27PYHC.js +3 -0
  20. package/dist/chunk-UDPJ2IGK.js +7 -0
  21. package/dist/chunk-VCZVITWG.js +13 -0
  22. package/dist/{chunk-UIWGEBWI.js → chunk-VGMWPPGD.js} +13 -11
  23. package/dist/{chunk-UG2I6VRD.js → chunk-VYDEUFGU.js} +1 -1
  24. package/dist/{chunk-Y2QAP6SU.js → chunk-WQ66EYZS.js} +1 -1
  25. package/dist/{chunk-6NCY4NPV.js → chunk-X45SJNT2.js} +4 -4
  26. package/dist/chunk-YWGYRISN.js +34 -0
  27. package/dist/{chunk-WOUKWOAR.js → chunk-Z2MNO3FT.js} +10 -9
  28. package/dist/cli.js +33 -8
  29. package/dist/{commands-U36UTCKR.js → commands-OFLBUP6O.js} +1 -1
  30. package/dist/{commands-6YTOVZ5P.js → commands-RG7M6E5K.js} +80 -85
  31. package/dist/{department-JOXXJKQB.js → department-GH475WCF.js} +1 -1
  32. package/dist/{job-title-L47J6TZY.js → job-title-FC2GWDE7.js} +1 -1
  33. package/dist/{logout-guard-FO7KZL3X.js → logout-guard-3PB3VMGP.js} +1 -1
  34. package/dist/{media-ZMDYHHNN.js → media-TD7D4TXF.js} +1 -1
  35. package/dist/{oneshot-KYATQPL7.js → oneshot-QQOOZZDT.js} +5 -5
  36. package/dist/{position-FHWCMMBQ.js → position-4RHTV3IK.js} +1 -1
  37. package/dist/{project-ZODASYER.js → project-DBNWB47J.js} +1 -1
  38. package/dist/{run-QCDT35NT.js → run-VNHAQO24.js} +1 -1
  39. package/dist/{schedule-command-GKXKNMLG.js → schedule-command-FJU7JFNR.js} +1 -1
  40. package/dist/{server-settings-CG3EM7R7.js → server-settings-YL6KALXG.js} +1 -1
  41. package/dist/{setup-6CXUVCF5.js → setup-BJKIHANC.js} +1 -1
  42. package/dist/skill-command-V26WGVXU.js +61 -0
  43. package/dist/{task-G5YWQ6L5.js → task-7VOYCG26.js} +2 -2
  44. package/dist/{update-PZBUIYOL.js → update-RLKK6N7U.js} +1 -1
  45. package/dist/user-UU2SLVC4.js +336 -0
  46. package/package.json +1 -1
  47. package/dist/charter-command-UBUE3KUO.js +0 -36
  48. package/dist/chunk-EJ474UDB.js +0 -3
  49. package/dist/chunk-HW3QGKYR.js +0 -30
  50. package/dist/chunk-IJLJGDMZ.js +0 -7
  51. package/dist/chunk-ODLJ2LNQ.js +0 -13
  52. package/dist/user-DO4VNIBR.js +0 -204
@@ -22,14 +22,15 @@ ephemeral"}}:block})}));return{model:request.model,max_tokens:request.maxTokens,
22
22
  return new RelayError("cli_disabled",message,403)}if(res.status===429){return new RelayError("rate_limit",message,429)}if(res.status===400){const detail=body?.details;if(Array.isArray(detail?.allowed_models)){return new RelayError("model_not_allowed",`${message}
23
23
  \u5229\u7528\u3067\u304D\u308B\u30E2\u30C7\u30EB: ${detail.allowed_models.join(" / ")}`,400)}return new RelayError("validation",message,400)}if(res.status===503){return new RelayError("unavailable",message,503)}return new RelayError("upstream",message,res.status)}function applyUsage(target,source){if(typeof source!=="object"||source===null)return;const usage=source;target.inputTokens=numberOr(usage["input_tokens"],target.inputTokens);target.cacheReadTokens=numberOr(usage["cache_read_input_tokens"],
24
24
  target.cacheReadTokens);target.cacheWriteTokens=numberOr(usage["cache_creation_input_tokens"],target.cacheWriteTokens);target.outputTokens=numberOr(usage["output_tokens"],target.outputTokens)}function numberOr(value,fallback){return typeof value==="number"&&Number.isFinite(value)?value:fallback}function safeJson(text){try{const parsed=JSON.parse(text);return typeof parsed==="object"&&parsed!==null?parsed:null}catch{return null}}function isAbortError(err){return err instanceof Error&&(err.name===
25
- "AbortError"||err.name==="TimeoutError")}function errorMessage(err){return err instanceof Error?err.message:String(err)}import fs from"fs";import path from"path";function modelCachePath(env=process.env){return path.join(twpHomeDir(env),"models.json")}function modelCacheLockPath(env=process.env){return path.join(twpHomeDir(env),"models.lock")}function builtinCatalog(){return{ids:MODELS.map(m=>m.id),source:"builtin",fetchedAt:null,minSupportedVersion:null}}function cacheFileIsTrustworthy(file){if(process.platform==="win32")return true;try{const st=fs.lstatSync(file);if(st.isSymbolicLink())return false;const uid=process.getuid?.();if(uid!==void 0&&st.uid!==
26
- uid)return false;return(st.mode&18)===0}catch{return false}}function readCacheFile(env){const file=modelCachePath(env);if(!cacheFileIsTrustworthy(file)){return{version:1,entries:{}}}const parsed=JSON.parse(fs.readFileSync(file,"utf8"));if(!parsed||typeof parsed!=="object"||typeof parsed.entries!=="object"||parsed.entries===null){return{version:1,entries:{}}}return parsed}function readFloor(entry){const raw=entry.min_supported_version;return typeof raw==="string"&&parseVersionCore(raw)!==null?raw.
27
- trim():null}function loadCachedVersionFloor(profile,relayUrl,env=process.env){try{const entry=readCacheFile(env).entries?.[profile];if(!entry||entry.relay_url!==relayUrl)return{minSupportedVersion:null,fetchedAt:null};return{minSupportedVersion:readFloor(entry),fetchedAt:typeof entry.fetched_at==="string"?entry.fetched_at:null}}catch{return{minSupportedVersion:null,fetchedAt:null}}}function loadCachedCatalog(profile,relayUrl,env=process.env){try{const parsed=readCacheFile(env).entries?.[profile];
28
- if(!parsed||parsed.relay_url!==relayUrl)return null;const ids=Array.isArray(parsed.models)?parsed.models.filter(id=>typeof id==="string"&&isSafeModelId(id)):[];if(ids.length===0)return null;return{ids,source:"cache",fetchedAt:typeof parsed.fetched_at==="string"?parsed.fetched_at:null,minSupportedVersion:readFloor(parsed)}}catch{return null}}async function saveCatalog(profile,relayUrl,ids,minSupportedVersion,env=process.env,now=Date.now){try{ensureTwpHome(env);await withFileLock(modelCacheLockPath(
29
- env),async()=>{let file;try{file=readCacheFile(env)}catch{file={version:1,entries:{}}}const entries={...file.entries??{}};entries[profile]={relay_url:relayUrl,fetched_at:new Date(now()).toISOString(),models:ids,min_supported_version:minSupportedVersion};const cachePath=modelCachePath(env);const tmp=`${cachePath}.${process.pid}.tmp`;fs.writeFileSync(tmp,`${JSON.stringify({version:1,entries},null,2)}
30
- `,{mode:384});try{fs.renameSync(tmp,cachePath)}catch(err){fs.rmSync(tmp,{force:true});throw err}if(process.platform!=="win32"){try{fs.chmodSync(cachePath,384)}catch{}}})}catch{}}async function loadCatalog(client,profile,relayUrl,env=process.env){try{const{ids,minSupportedVersion}=await client.fetchModelCatalog();await saveCatalog(profile,relayUrl,ids,minSupportedVersion,env);return{ids,source:"server",fetchedAt:new Date().toISOString(),minSupportedVersion}}catch{return loadCachedCatalog(profile,
31
- relayUrl,env)??builtinCatalog()}}function pickModel(catalog,configured){const fallback=catalog.ids[0]??MODELS[0]?.id??DEFAULT_MODEL;if(!configured||configured==="")return{model:fallback};if(catalog.ids.includes(configured))return{model:configured};if(catalog.source==="builtin"){return{model:configured,warning:`\u30E2\u30C7\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u6307\u5B9A\u3055\u308C\u305F ${configured} \u3092\u305D\u306E\u307E\u307E\u4F7F\u3044\u307E\u3059\uFF08\u5229\u7528\u3067\u304D\u306A\u3044\u5834\u5408\u306F\u30EA\u30EC\u30FC\u304C 400 \u3092\u8FD4\u3057\u307E\u3059\uFF09`}}
32
- return{model:fallback,warning:`${configured} \u306F\u5229\u7528\u3067\u304D\u306A\u3044\u305F\u3081 ${fallback} \u3092\u4F7F\u3044\u307E\u3059\uFF08\u5229\u7528\u53EF\u80FD: ${catalog.ids.join(" / ")}\uFF09`}}var DEFAULT_CONTEXT_WINDOW_TOKENS=2e5;var DEFAULT_MAX_TOKENS=8192;var TRIM_THRESHOLD=.8;var ContextManager=class{constructor(contextWindowTokens=DEFAULT_CONTEXT_WINDOW_TOKENS){this.contextWindowTokens=contextWindowTokens}contextWindowTokens;messages=[];totals=emptyUsage();turns=0;lastPromptTokens=0;pendingChars=0;droppedMessages=0;addUser(text){this.pendingChars+=text.length;const last=this.messages[this.messages.length-1];if(last?.role==="user"){last.content.push({type:"text",text});return}this.
25
+ "AbortError"||err.name==="TimeoutError")}function errorMessage(err){return err instanceof Error?err.message:String(err)}import fs2 from"fs";import path from"path";import fs from"fs";function isTrustworthyCacheFile(file){try{const st=fs.lstatSync(file);if(process.platform==="win32")return st.isFile();if(st.isSymbolicLink())return false;const uid=process.getuid?.();if(uid!==void 0&&st.uid!==uid)return false;return(st.mode&18)===0}catch{return false}}function writePrivateFileAtomic(file,content){const tmp=`${file}.${process.pid}.tmp`;fs.rmSync(tmp,{force:true});fs.writeFileSync(tmp,content,{mode:384,flag:"wx"});try{fs.renameSync(tmp,file)}catch(err){fs.rmSync(
26
+ tmp,{force:true});throw err}if(process.platform!=="win32"){try{fs.chmodSync(file,384)}catch{}}}function isPrivateTwpHome(dir){if(process.platform==="win32")return true;try{const st=fs.lstatSync(dir);const uid=process.getuid?.();if(st.isSymbolicLink()||uid!==void 0&&st.uid!==uid)return false;return(st.mode&18)===0}catch{return false}}function modelCachePath(env=process.env){return path.join(twpHomeDir(env),"models.json")}function modelCacheLockPath(env=process.env){return path.join(twpHomeDir(env),"models.lock")}function builtinCatalog(){return{ids:MODELS.map(m=>m.id),source:"builtin",fetchedAt:null,minSupportedVersion:null}}function readCacheFile(env){const file=modelCachePath(env);if(!isTrustworthyCacheFile(file)){return{version:1,entries:{}}}const parsed=JSON.parse(fs2.readFileSync(file,"utf8"));if(!parsed||typeof parsed!==
27
+ "object"||typeof parsed.entries!=="object"||parsed.entries===null){return{version:1,entries:{}}}return parsed}function readFloor(entry){const raw=entry.min_supported_version;return typeof raw==="string"&&parseVersionCore(raw)!==null?raw.trim():null}function loadCachedVersionFloor(profile,relayUrl,env=process.env){try{const entry=readCacheFile(env).entries?.[profile];if(!entry||entry.relay_url!==relayUrl)return{minSupportedVersion:null,fetchedAt:null};return{minSupportedVersion:readFloor(entry),fetchedAt:typeof entry.
28
+ fetched_at==="string"?entry.fetched_at:null}}catch{return{minSupportedVersion:null,fetchedAt:null}}}function loadCachedCatalog(profile,relayUrl,env=process.env){try{const parsed=readCacheFile(env).entries?.[profile];if(!parsed||parsed.relay_url!==relayUrl)return null;const ids=Array.isArray(parsed.models)?parsed.models.filter(id=>typeof id==="string"&&isSafeModelId(id)):[];if(ids.length===0)return null;return{ids,source:"cache",fetchedAt:typeof parsed.fetched_at==="string"?parsed.fetched_at:null,
29
+ minSupportedVersion:readFloor(parsed)}}catch{return null}}async function saveCatalog(profile,relayUrl,ids,minSupportedVersion,env=process.env,now=Date.now){try{ensureTwpHome(env);await withFileLock(modelCacheLockPath(env),async()=>{let file;try{file=readCacheFile(env)}catch{file={version:1,entries:{}}}const entries={...file.entries??{}};entries[profile]={relay_url:relayUrl,fetched_at:new Date(now()).toISOString(),models:ids,min_supported_version:minSupportedVersion};writePrivateFileAtomic(modelCachePath(
30
+ env),`${JSON.stringify({version:1,entries},null,2)}
31
+ `)})}catch{}}async function loadCatalog(client,profile,relayUrl,env=process.env){try{const{ids,minSupportedVersion}=await client.fetchModelCatalog();await saveCatalog(profile,relayUrl,ids,minSupportedVersion,env);return{ids,source:"server",fetchedAt:new Date().toISOString(),minSupportedVersion}}catch{return loadCachedCatalog(profile,relayUrl,env)??builtinCatalog()}}function pickModel(catalog,configured){const fallback=catalog.ids[0]??MODELS[0]?.id??DEFAULT_MODEL;if(!configured||configured==="")return{
32
+ model:fallback};if(catalog.ids.includes(configured))return{model:configured};if(catalog.source==="builtin"){return{model:configured,warning:`\u30E2\u30C7\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\u3067\u304D\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u6307\u5B9A\u3055\u308C\u305F ${configured} \u3092\u305D\u306E\u307E\u307E\u4F7F\u3044\u307E\u3059\uFF08\u5229\u7528\u3067\u304D\u306A\u3044\u5834\u5408\u306F\u30EA\u30EC\u30FC\u304C 400 \u3092\u8FD4\u3057\u307E\u3059\uFF09`}}return{model:fallback,warning:`${configured}\
33
+ \u306F\u5229\u7528\u3067\u304D\u306A\u3044\u305F\u3081 ${fallback} \u3092\u4F7F\u3044\u307E\u3059\uFF08\u5229\u7528\u53EF\u80FD: ${catalog.ids.join(" / ")}\uFF09`}}var DEFAULT_CONTEXT_WINDOW_TOKENS=2e5;var DEFAULT_MAX_TOKENS=8192;var TRIM_THRESHOLD=.8;var ContextManager=class{constructor(contextWindowTokens=DEFAULT_CONTEXT_WINDOW_TOKENS){this.contextWindowTokens=contextWindowTokens}contextWindowTokens;messages=[];totals=emptyUsage();turns=0;lastPromptTokens=0;pendingChars=0;droppedMessages=0;addUser(text){this.pendingChars+=text.length;const last=this.messages[this.messages.length-1];if(last?.role==="user"){last.content.push({type:"text",text});return}this.
33
34
  messages.push({role:"user",content:[{type:"text",text}]})}addToolExchange(assistantText,toolUses,results){if(toolUses.length===0)return;const blocks=[];if(assistantText.trim()!=="")blocks.push({type:"text",text:assistantText});blocks.push(...toolUses);this.messages.push({role:"assistant",content:blocks});this.messages.push({role:"user",content:results});this.pendingChars+=blocks.reduce((n,b)=>n+blockLength(b),0);this.pendingChars+=results.reduce((n,b)=>n+blockLength(b),0)}completeTurn(assistantText){
34
35
  const text=assistantText.trim();if(text===""){const last=this.messages[this.messages.length-1];if(last?.role==="user"&&!hasToolResult(last)){this.messages.pop();this.pendingChars=Math.max(0,this.pendingChars-lengthOf(last))}return false}this.messages.push({role:"assistant",content:[{type:"text",text:assistantText}]});this.pendingChars+=assistantText.length;this.turns+=1;return true}applyUsage(usage){this.totals={inputTokens:this.totals.inputTokens+usage.inputTokens,cacheReadTokens:this.totals.cacheReadTokens+
35
36
  usage.cacheReadTokens,cacheWriteTokens:this.totals.cacheWriteTokens+usage.cacheWriteTokens,outputTokens:this.totals.outputTokens+usage.outputTokens};const prompt=usage.inputTokens+usage.cacheReadTokens+usage.cacheWriteTokens;if(prompt>0){this.lastPromptTokens=prompt;this.pendingChars=0}}history(){return this.messages.map(m=>({role:m.role,content:m.content.map(copyBlock)}))}isEmpty(){return this.messages.length===0}clear(){this.messages=[];this.totals=emptyUsage();this.turns=0;this.lastPromptTokens=
@@ -38,4 +39,4 @@ break;const orphanResult=hasToolResult(head2)&&this.messages.length>1;if(head2.r
38
39
  const freed=before-lengthOf(head);this.lastPromptTokens=Math.max(0,this.lastPromptTokens-Math.ceil(freed/4));this.pendingChars=Math.max(0,this.pendingChars-freed);dropped+=1}this.droppedMessages+=dropped;return dropped}estimatedPromptTokens(){if(this.lastPromptTokens===0){return Math.ceil(this.totalChars()/4)}return this.lastPromptTokens+Math.ceil(this.pendingChars/4)}snapshot(){const used=this.estimatedPromptTokens();const remaining=Math.round((this.contextWindowTokens-used)/this.contextWindowTokens*
39
40
  100);return{totals:{...this.totals},turns:this.turns,lastPromptTokens:this.lastPromptTokens,remainingPercent:Math.max(0,Math.min(100,remaining)),droppedMessages:this.droppedMessages}}totalChars(){return this.messages.reduce((sum,m)=>sum+lengthOf(m),0)}};function lengthOf(message){return message.content.reduce((sum,block)=>sum+blockLength(block),0)}function copyBlock(block){return block.type==="tool_use"?{...block,input:{...block.input}}:{...block}}function hasToolResult(message){return message.content.
40
41
  some(block=>block.type==="tool_result")}function createRuntime(opts){const env=opts.env??process.env;const cwd=opts.cwd??process.cwd();const profile=resolveProfile(opts.profile,env,cwd);const creds=loadCredentials(profile.name,env);const apiUrl=effectiveApiUrl(profile,creds?.api_url,env);const relayUrl=effectiveRelayUrl(profile,creds?.relay_url,env);const session=new AuthSession(profile.name,apiUrl,env);const client=new RelayClient(relayUrl,session,httpFetch,opts.cliVersion);const configured=resolveConfiguredModel(opts.model,profile.name,
41
- env,cwd);return{profileName:profile.name,apiUrl,relayUrl,client,session,context:new ContextManager,loggedIn:creds!==null,configuredModel:configured?.model??null,loadCatalog:()=>loadCatalog(client,profile.name,relayUrl,env),loadCachedFloor:()=>loadCachedVersionFloor(profile.name,relayUrl,env)}}export{modelLabel,toModelInfos,emptyUsage,RelayError,DEFAULT_MAX_TOKENS,builtinCatalog,loadCachedCatalog,pickModel,createRuntime};
42
+ env,cwd);return{profileName:profile.name,apiUrl,relayUrl,client,session,context:new ContextManager,loggedIn:creds!==null,configuredModel:configured?.model??null,loadCatalog:()=>loadCatalog(client,profile.name,relayUrl,env),loadCachedFloor:()=>loadCachedVersionFloor(profile.name,relayUrl,env)}}export{modelLabel,toModelInfos,emptyUsage,RelayError,DEFAULT_MAX_TOKENS,isTrustworthyCacheFile,writePrivateFileAtomic,isPrivateTwpHome,builtinCatalog,loadCachedCatalog,pickModel,createRuntime};
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __twpCreateRequire } from 'node:module';
3
3
  const require = __twpCreateRequire(import.meta.url);
4
- import{parseArgv}from"./chunk-HW3QGKYR.js";import"./chunk-NAUH75MM.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-TAN5I2DP.js";import"./chunk-EJ474UDB.js";import"./chunk-QQRJLH6B.js";import"./chunk-VSJBJXZO.js";var VERSION=true?"0.24.0":"0.0.0-dev";var HELP=`twp ${VERSION} \u2014 TWP CLI
4
+ import{parseArgv}from"./chunk-YWGYRISN.js";import"./chunk-NAUH75MM.js";import{GLOBAL_OPTIONS_HELP}from"./chunk-TAN5I2DP.js";import"./chunk-SP27PYHC.js";import"./chunk-QQRJLH6B.js";import"./chunk-VSJBJXZO.js";var VERSION=true?"0.25.0":"0.0.0-dev";var HELP=`twp ${VERSION} \u2014 TWP CLI
5
5
 
6
6
  \u4F7F\u3044\u65B9:
7
7
  twp \u5BFE\u8A71 TUI \u3092\u8D77\u52D5
@@ -46,6 +46,13 @@ import{parseArgv}from"./chunk-HW3QGKYR.js";import"./chunk-NAUH75MM.js";import{GL
46
46
  twp task-loop charter pull --project <\u30AD\u30FC|UUID> [--out <\u30D1\u30B9>]
47
47
  \u30B5\u30FC\u30D0\u306E\u61B2\u7AE0\u3092\u30D5\u30A1\u30A4\u30EB\u3078\u5C55\u958B\uFF08\u65E2\u5B9A CONSTITUTION.md\uFF09\u3002
48
48
  \u65E2\u5B58\u30D5\u30A1\u30A4\u30EB\u3068\u9055\u3046\u3068\u304D\u306F\u5DEE\u5206\u3092\u8868\u793A\u3057\u3001--yes \u3067\u4E0A\u66F8\u304D
49
+ twp task-loop skill push --project <\u30AD\u30FC|UUID> <\u540D\u524D|--all> [--dir <\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA>]
50
+ \u30B9\u30AD\u30EB\u5B9A\u7FA9\u3092 <\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA>/<\u540D\u524D>.md\uFF08\u65E2\u5B9A .claude/commands\uFF09\u304B\u3089
51
+ \u30B5\u30FC\u30D0\u3078\u767B\u9332\u3002\u5DEE\u5206\u3068 revision \u3092\u8868\u793A\u3057\u3066\u6B62\u307E\u308A\u3001\u6848\u5185\u3055\u308C\u308B
52
+ --yes --revision <N>\uFF08--all \u306F \u540D\u524D=N,...\uFF09\u3067\u78BA\u5B9A
53
+ twp task-loop skill pull --project <\u30AD\u30FC|UUID> <\u540D\u524D|--all> [--dir <\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA>]
54
+ \u30B5\u30FC\u30D0\u306E\u30B9\u30AD\u30EB\u5B9A\u7FA9\u3092\u30D5\u30A1\u30A4\u30EB\u3078\u5C55\u958B\u3002\u65E2\u5B58\u30D5\u30A1\u30A4\u30EB\u3068\u9055\u3046\u3068\u304D\u306F
55
+ \u5DEE\u5206\u3092\u8868\u793A\u3057\u3001--yes \u3067\u4E0A\u66F8\u304D\uFF08\u624B\u5143\u306B\u3060\u3051\u3042\u308B\u30D5\u30A1\u30A4\u30EB\u306F\u6D88\u3055\u306A\u3044\uFF09
49
56
  twp --mode <id> \u8D77\u52D5\u6642\u306E\u30E2\u30FC\u30C9\u3092\u6307\u5B9A\uFF08dev | biz | plan\uFF09
50
57
  twp --permission-mode <v>
51
58
  \u30C4\u30FC\u30EB\u5B9F\u884C\u306E\u65E2\u5B9A\u3092\u4E0A\u66F8\u304D\uFF08plan | acceptEdits | denyAll\uFF09\u3002
@@ -69,6 +76,18 @@ import{parseArgv}from"./chunk-HW3QGKYR.js";import"./chunk-NAUH75MM.js";import{GL
69
76
  twp --help \u3053\u306E\u30D8\u30EB\u30D7
70
77
 
71
78
  \u30C9\u30E1\u30A4\u30F3\u30B3\u30DE\u30F3\u30C9\uFF08TWP \u306E\u30C7\u30FC\u30BF\u3092\u64CD\u4F5C\u3059\u308B\uFF09:
79
+ twp agent-loop list \u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30EB\u30FC\u30D7\u306E\u30AD\u30E5\u30FC\u3092\u4E00\u89A7\u3059\u308B\uFF08--status \u3067\u7D5E\u308A\u8FBC\u3080\uFF09
80
+ twp agent-loop get <\u30A2\u30A4\u30C6\u30E0ID>
81
+ \u30AD\u30E5\u30FC\u306E\u30A2\u30A4\u30C6\u30E01\u4EF6\u306E\u8A73\u7D30\u3092\u8868\u793A\u3059\u308B
82
+ twp agent-loop create \u30AD\u30E5\u30FC\u306B\u30A2\u30A4\u30C6\u30E0\u3092\u6295\u5165\u3059\u308B\uFF08--prompt "/twp-<\u30B9\u30AD\u30EB> <\u5F15\u6570>"\uFF09
83
+ twp agent-loop update <\u30A2\u30A4\u30C6\u30E0ID>
84
+ \u30A2\u30A4\u30C6\u30E0\u306E\u30E9\u30D9\u30EB\u30FB\u30D7\u30ED\u30F3\u30D7\u30C8\u30FBAI \u6307\u5B9A\u3092\u66F4\u65B0\u3059\u308B\uFF08\u7BA1\u7406\u8005\u306E\u307F\uFF09
85
+ twp agent-loop move <\u30A2\u30A4\u30C6\u30E0ID>
86
+ \u30A2\u30A4\u30C6\u30E0\u3092\u30AD\u30E5\u30FC\u306E\u5148\u982D\u3078\u79FB\u3059\uFF08--yes \u304C\u8981\u308B\u30FB\u7BA1\u7406\u8005\u306E\u307F\uFF09
87
+ twp agent-loop delete <\u30A2\u30A4\u30C6\u30E0ID>
88
+ \u30A2\u30A4\u30C6\u30E0\u3092\u524A\u9664\u3059\u308B\uFF08--yes \u304C\u8981\u308B\u30FB\u7BA1\u7406\u8005\u306E\u307F\uFF09
89
+ twp agent-loop history list
90
+ \u671F\u9593\u3092\u6307\u5B9A\u3057\u3066\u5B9F\u884C\u5C65\u6B74\u3092\u4E00\u89A7\u3059\u308B\uFF08--since \u304C\u8981\u308B\uFF09
72
91
  twp project list \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3092\u4E00\u89A7\u3059\u308B
73
92
  twp project get <\u53C2\u7167> \u30D7\u30ED\u30B8\u30A7\u30AF\u30C81\u4EF6\u306E\u8A73\u7D30\u3092\u8868\u793A\u3059\u308B
74
93
  twp project members \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30E1\u30F3\u30D0\u30FC\u3092\u4E00\u89A7\u3059\u308B
@@ -119,6 +138,10 @@ import{parseArgv}from"./chunk-HW3QGKYR.js";import"./chunk-NAUH75MM.js";import{GL
119
138
  twp media bulk-download <\u30D5\u30A1\u30A4\u30EBID>...
120
139
  ZIP \u306B\u307E\u3068\u3081\u3066\u66F8\u304D\u51FA\u3059\uFF08--out \u5FC5\u9808\u30FB50\u4EF6\u307E\u3067\uFF09
121
140
  twp storage get \u30C6\u30CA\u30F3\u30C8\u306E\u30B9\u30C8\u30EC\u30FC\u30B8\u4F7F\u7528\u91CF\u30FB\u4E0A\u9650\u30FB\u6B8B\u91CF\uFF08\u7BA1\u7406\u8005\u306E\u307F\uFF09
141
+ twp attendance status \u3044\u307E\u306E\u6253\u523B\u72B6\u614B\u3068\u3001\u6B21\u306B\u6253\u3066\u308B\u6253\u523B\u3092\u8868\u793A\u3059\u308B
142
+ twp attendance list \u6253\u523B\u306E\u5C65\u6B74\u3092\u4E00\u89A7\u3059\u308B\uFF08--month / --date\uFF09
143
+ twp attendance timesheet
144
+ \u6708\u306E\u52E4\u6020\u8868\uFF08\u65E5\u5225\u3068\u6708\u306E\u5408\u8A08\u30FB--month\uFF09
122
145
  twp backlog space list \u9023\u643A\u6E08\u307F\u306E Backlog \u30B9\u30DA\u30FC\u30B9\u3092\u4E00\u89A7\u3059\u308B
123
146
  twp backlog project list
124
147
  Backlog \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3092\u4E00\u89A7\u3059\u308B
@@ -154,6 +177,8 @@ import{parseArgv}from"./chunk-HW3QGKYR.js";import"./chunk-NAUH75MM.js";import{GL
154
177
  twp user create \u30E6\u30FC\u30B6\u30FC\u3092\u4F5C\u6210\u3059\u308B\uFF08\u30D1\u30B9\u30EF\u30FC\u30C9\u306F --password-file\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09
155
178
  twp user update <\u30E6\u30FC\u30B6\u30FC>
156
179
  \u30E6\u30FC\u30B6\u30FC\u3092\u66F4\u65B0\u3059\u308B\uFF08--auth-type disabled \u3067\u5931\u52B9\uFF1D\u9000\u793E\uFF09
180
+ twp user export [--file <\u53F0\u5E33CSV>]
181
+ \u5728\u7C4D\u8005\u3092\u68DA\u5378\u3059\u308B\uFF08--file \u3067\u4EBA\u4E8B\u53F0\u5E33\u3068\u306E\u5DEE\u5206\u30FB\u7D44\u7E54\u7BA1\u7406\u8005\u306E\u307F\uFF09
157
182
  twp user invite create 1\u4EBA\u3092\u62DB\u5F85\u3059\u308B
158
183
  twp user invite bulk CSV\uFF08\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9, \u6A29\u9650\uFF09\u306E\u5168\u54E1\u3092\u62DB\u5F85\u3059\u308B
159
184
  twp user invite list \u62DB\u5F85\u3092\u4E00\u89A7\u3059\u308B
@@ -222,13 +247,13 @@ TUI \u5185:
222
247
  TWP API \u3092\u547C\u3079\u307E\u3059\u3002TWP API \u306E\u30C4\u30FC\u30EB\u306F\u65E2\u5B9A\u3067\u78BA\u8A8D\u304C\u51FA\u307E\u3059\uFF08-p \u3067\u306F\u62D2\u5426\u3002--allowed-tools \u3067\u540D\u524D\u3092\u8A31\u53EF\uFF09\u3002
223
248
  \u4F1A\u8A71\u30FB\u30ED\u30FC\u30AB\u30EB\u30C4\u30FC\u30EB\uFF08\u30D5\u30A1\u30A4\u30EB\u30FB\u30B3\u30DE\u30F3\u30C9\u30FBgit\uFF09\u306F\u30C6\u30CA\u30F3\u30C8\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u3067\u5B9F\u969B\u306B\u52D5\u304D\u307E\u3059\u3002
224
249
  `;function ignoreEpipe(stream){stream.on("error",err=>{if(err.code==="EPIPE")process.exit(0);throw err})}async function main(){const nodeMajor=Number(process.versions.node.split(".")[0]);if(nodeMajor<22){process.stderr.write(`twp-cli \u306B\u306F Node.js 22 \u4EE5\u4E0A\u304C\u5FC5\u8981\u3067\u3059\uFF08\u73FE\u5728: ${process.versions.node}\uFF09
225
- `);process.exit(1)}ignoreEpipe(process.stdout);ignoreEpipe(process.stderr);if(process.env["TWP_AUTO_UPDATE_WORKER"]==="1"){const{runAutoUpdateWorker}=await import("./auto-update-worker-AXBJIMFP.js");await runAutoUpdateWorker().catch(()=>void 0);return}const args=parseArgv(process.argv.slice(2));if(args.command==="version"){process.stdout.write(`${VERSION}
250
+ `);process.exit(1)}ignoreEpipe(process.stdout);ignoreEpipe(process.stderr);if(process.env["TWP_AUTO_UPDATE_WORKER"]==="1"){const{runAutoUpdateWorker}=await import("./auto-update-worker-OBFGN6FY.js");await runAutoUpdateWorker().catch(()=>void 0);return}const args=parseArgv(process.argv.slice(2));if(args.command==="version"){process.stdout.write(`${VERSION}
226
251
  `);return}if(args.command==="help"){process.stdout.write(HELP);return}if(args.unknown.length>0){process.stderr.write(`\u4E0D\u660E\u306A\u5F15\u6570: ${args.unknown.join(" ")}
227
252
 
228
- ${HELP}`);process.exitCode=2;return}const autoUpdate=await import("./auto-update-CV2MM32C.js");autoUpdate.registerRunning();if(args.command==="task-loop"){process.env[autoUpdate.DISABLE_ENV]="1"}else if(args.command!=="update"){autoUpdate.onStartup(VERSION)}if(args.command==="domain"&&args.domain!==void 0){const{runDomain}=await import("./run-QCDT35NT.js");process.exitCode=await runDomain({domain:args.domain,...args.operation!==void 0?{operation:args.operation}:{},argv:args.domainArgv,help:args.
229
- domainHelp,globals:{...args.profile!==void 0?{profile:args.profile}:{},...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{},dryRun:args.dryRun,debug:args.debug,yes:args.yes,refresh:args.refresh},version:VERSION});return}if(args.command==="api"){const{runApiCommand}=await import("./api-command-NMYYJKZH.js");process.exitCode=await runApiCommand({argv:args.domainArgv,help:args.domainHelp,globals:{...args.profile!==void 0?{profile:args.profile}:{},...args.output!==
230
- void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{},dryRun:args.dryRun,debug:args.debug,yes:args.yes},version:VERSION});return}if(args.command==="update"){const{runUpdate}=await import("./update-PZBUIYOL.js");process.exitCode=await runUpdate({...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}if(args.command==="login"||args.command==="logout"||args.command==="whoami"){const{runLogin,runLogout,runWhoami}=await import("./commands-U36UTCKR.js");
231
- const options={profile:args.profile,method:args.loginMethod,tenant:args.tenant,noBrowser:args.loginNoBrowser,cliVersion:VERSION,force:args.logoutForce,...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{}};const runner=args.command==="login"?runLogin:args.command==="logout"?runLogout:runWhoami;process.exitCode=await runner(options);return}if(args.command==="task-loop"){const{runTaskLoop}=await import("./commands-6YTOVZ5P.js");process.exitCode=await runTaskLoop(
253
+ ${HELP}`);process.exitCode=2;return}const autoUpdate=await import("./auto-update-CV2MM32C.js");autoUpdate.registerRunning();if(args.command==="task-loop"){process.env[autoUpdate.DISABLE_ENV]="1"}else if(args.command!=="update"){autoUpdate.onStartup(VERSION)}if(args.command==="domain"&&args.domain!==void 0){const{runDomain}=await import("./run-VNHAQO24.js");process.exitCode=await runDomain({domain:args.domain,...args.operation!==void 0?{operation:args.operation}:{},argv:args.domainArgv,help:args.
254
+ domainHelp,globals:{...args.profile!==void 0?{profile:args.profile}:{},...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{},dryRun:args.dryRun,debug:args.debug,yes:args.yes,refresh:args.refresh},version:VERSION});return}if(args.command==="api"){const{runApiCommand}=await import("./api-command-VWJXBUCJ.js");process.exitCode=await runApiCommand({argv:args.domainArgv,help:args.domainHelp,globals:{...args.profile!==void 0?{profile:args.profile}:{},...args.output!==
255
+ void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{},dryRun:args.dryRun,debug:args.debug,yes:args.yes},version:VERSION});return}if(args.command==="update"){const{runUpdate}=await import("./update-RLKK6N7U.js");process.exitCode=await runUpdate({...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}if(args.command==="login"||args.command==="logout"||args.command==="whoami"){const{runLogin,runLogout,runWhoami}=await import("./commands-OFLBUP6O.js");
256
+ const options={profile:args.profile,method:args.loginMethod,tenant:args.tenant,noBrowser:args.loginNoBrowser,cliVersion:VERSION,force:args.logoutForce,...args.output!==void 0?{output:args.output}:{},...args.query!==void 0?{query:args.query}:{}};const runner=args.command==="login"?runLogin:args.command==="logout"?runLogout:runWhoami;process.exitCode=await runner(options);return}if(args.command==="task-loop"){const{runTaskLoop}=await import("./commands-RG7M6E5K.js");process.exitCode=await runTaskLoop(
232
257
  {action:args.taskLoopAction??"run",project:args.project,profile:args.profile,safe:args.safe,daemon:args.daemon,interval:args.interval,maxCycles:args.maxCycles,forceRunner:args.forceRunner,force:args.stopForce,drain:args.stopDrain,engine:args.engine,version:VERSION,verbose:args.verbose,scheduleNow:args.scheduleNow,scheduleCounts:args.scheduleCounts,scheduleGate:args.scheduleGate,charterOp:args.charterOp,charterInput:args.charterFile,charterOutput:args.charterOut,charterRevision:args.charterRevision,
233
- yes:args.yes,ais:args.ais,workspace:args.workspace,aiConfigFile:args.aiConfigFile,noAiConfigFile:args.noAiConfigFile});return}if(args.command==="print"){const{runOneShot}=await import("./oneshot-KYATQPL7.js");process.exitCode=await runOneShot({prompt:args.prompt??"",fromStdin:args.promptFromStdin,mode:args.mode??"dev",...args.permissionMode!==void 0?{permissionMode:args.permissionMode}:{},allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,...args.model!==void 0?{model:args.model}:
234
- {},...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}const{startTui}=await import("./app-2KMY3QPM.js");await startTui({mode:args.mode,permissionMode:args.permissionMode,allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,model:args.model,profile:args.profile,noTui:args.noTui||!process.stdout.isTTY,doctor:args.doctor,version:VERSION})}await main();
258
+ skillOp:args.skillOp,skillName:args.skillName,skillAll:args.skillAll,skillDir:args.skillDir,yes:args.yes,ais:args.ais,workspace:args.workspace,aiConfigFile:args.aiConfigFile,noAiConfigFile:args.noAiConfigFile});return}if(args.command==="print"){const{runOneShot}=await import("./oneshot-QQOOZZDT.js");process.exitCode=await runOneShot({prompt:args.prompt??"",fromStdin:args.promptFromStdin,mode:args.mode??"dev",...args.permissionMode!==void 0?{permissionMode:args.permissionMode}:{},allowedTools:args.
259
+ allowedTools,disallowedTools:args.disallowedTools,...args.model!==void 0?{model:args.model}:{},...args.profile!==void 0?{profile:args.profile}:{},version:VERSION});return}const{startTui}=await import("./app-3JIU5OUX.js");await startTui({mode:args.mode,permissionMode:args.permissionMode,allowedTools:args.allowedTools,disallowedTools:args.disallowedTools,model:args.model,profile:args.profile,noTui:args.noTui||!process.stdout.isTTY,doctor:args.doctor,version:VERSION})}await main();
@@ -50,7 +50,7 @@ ${err.hint?`${err.hint}
50
50
  `);return 1}writeErr(`\u30A8\u30E9\u30FC: ${err.message}
51
51
  `);return 1}}async function runLogin(options){return run(async()=>{const profile=resolveProfile(options.profile);const io=makeIo(options.cliVersion);if(options.method==="password"){await passwordLogin(profile,{tenantCode:options.tenant??void 0},process.env,io)}else if(options.method==="token"){await tokenLogin(profile,process.env,io)}else{await browserLogin(profile,process.env,io,{noBrowser:options.noBrowser})}})}async function runLogout(options){return run(async()=>{const profile=resolveProfile(
52
52
  options.profile);const creds=loadCredentials(profile.name);if(!creds){writeOut(`\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u300C${profile.name}\u300D\u306F\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u307E\u305B\u3093\u3002
53
- `);return}const{describeLogoutImpact,findLoopsUsingProfile}=await import("./logout-guard-FO7KZL3X.js");const found=findLoopsUsingProfile(profile.name,options.logoutGuard);if(found.users.length>0||found.undetermined.length>0){writeErr(describeLogoutImpact(profile.name,found,options.force===true));if(options.force!==true)throw new LogoutRefusedError}const apiUrl=effectiveApiUrl(profile,creds.api_url);const revoked=await httpFetch(`${apiUrl}/api/v2/auth/logout`,{method:"POST",headers:{Accept:"applic\
53
+ `);return}const{describeLogoutImpact,findLoopsUsingProfile}=await import("./logout-guard-3PB3VMGP.js");const found=findLoopsUsingProfile(profile.name,options.logoutGuard);if(found.users.length>0||found.undetermined.length>0){writeErr(describeLogoutImpact(profile.name,found,options.force===true));if(options.force!==true)throw new LogoutRefusedError}const apiUrl=effectiveApiUrl(profile,creds.api_url);const revoked=await httpFetch(`${apiUrl}/api/v2/auth/logout`,{method:"POST",headers:{Accept:"applic\
54
54
  ation/json",Authorization:`Bearer ${creds.token}`}}).then(res=>res.ok,()=>false);await deleteCredentials(profile.name);writeOut(`\u2705 \u30ED\u30B0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF08\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB: ${profile.name} / \u30C8\u30FC\u30AF\u30F3: ${maskToken(creds.token)}\uFF09
55
55
  `);if(!revoked){writeOut("\u26A0 \u30B5\u30FC\u30D0\u5074\u306E\u30C8\u30FC\u30AF\u30F3\u5931\u52B9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u7B49\uFF09\u3002TWP \u306E\u300C\u8A2D\u5B9A > CLI\u7AEF\u672B\u300D\u304B\u3089\u3082\u5931\u52B9\u3067\u304D\u307E\u3059\u3002\n")}})}async function runWhoami(options){return run(async()=>{const profile=resolveProfile(options.profile);const structured=options.output!==void 0||options.query!==void 0;let format=null;if(structured){
56
56
  const{resolveOutputFormat,OUTPUT_FORMATS}=await import("./format-NMW6Y2E5.js");format=resolveOutputFormat({...options.output!==void 0?{flag:options.output}:{},isTty:process.stdout.isTTY===true});if(format===null){throw new UsageError(`--output \u306B\u300C${options.output??""}\u300D\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093`,`\u6307\u5B9A\u3067\u304D\u308B\u306E\u306F ${OUTPUT_FORMATS.join(" / ")} \u3067\u3059`)}}const stored=loadCredentials(profile.name);const apiUrl=effectiveApiUrl(