@openyida/yidacli 0.1.1 → 0.1.2
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/dist/utils.js +1 -1
- package/package.json +2 -2
- package/scripts/postinstall.js +25 -10
package/dist/utils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
let fs=require("fs"),path=require("path"),os=require("os"),execSync=require("child_process").execSync,
|
|
1
|
+
let fs=require("fs"),path=require("path"),os=require("os"),execSync=require("child_process").execSync;function isWukongActive(){var e=path.join(os.homedir(),".real");return fs.existsSync(path.join(e,"daemon.sock"))||fs.existsSync(path.join(e,".mcp"))||fs.existsSync(path.join(e,".skills"))}function findProjectRoot(){var e=os.homedir();if(isWukongActive()){e=path.join(e,".real","workspace","openyida");if(fs.existsSync(e))return e}e=path.join(process.cwd(),"openyida");return fs.existsSync(e)?e:process.cwd()}function extractInfoFromCookies(e){let r=null,o=null,t=null;for(var s of e){var n;"tianshu_csrf_token"===s.name?r=s.value:"tianshu_corp_user"===s.name&&0<(n=s.value.lastIndexOf("_"))&&(o=s.value.slice(0,n),t=s.value.slice(n+1))}return{csrfToken:r,corpId:o,userId:t}}function loadCookieData(r,o){r=r||findProjectRoot(),o=o||"https://www.aliwork.com",r=path.join(r,".cache","cookies.json");if(!fs.existsSync(r))return null;try{var t=fs.readFileSync(r,"utf-8").trim();if(!t)return null;var s,n,i,a=JSON.parse(t);let e;return(e=Array.isArray(a)?{cookies:a,base_url:o}:a).cookies&&0<e.cookies.length&&({csrfToken:s,corpId:n,userId:i}=extractInfoFromCookies(e.cookies),s&&(e.csrf_token=s),n&&(e.corp_id=n),i)&&(e.user_id=i),e}catch{return null}}function triggerLogin(){console.error("\n🔐 登录态失效,正在打开浏览器扫码登录...\n");var e=require("./login").ensureLogin;return e()}function refreshCsrfToken(){console.error("\n🔄 csrf_token 已过期,正在从 Cookie 重新提取...\n");var e=require("./login").refreshCsrfFromCache;return e()}function isLoginExpired(e){return e&&!1===e.success&&("307"===e.errorCode||"302"===e.errorCode)}function isCsrfTokenExpired(e){return e&&!1===e.success&&"TIANSHU_000030"===e.errorCode}function resolveBaseUrl(e,r){r=r||"https://www.aliwork.com";return(e&&e.base_url||r).replace(/\/+$/,"")}function httpPost(a,c,u,l){let f=require("https"),p=require("http");return new Promise((t,e)=>{var r=l.map(e=>e.name+"="+e.value).join("; "),o=new URL(a),s="https:"===o.protocol,n=s?f:p,o={hostname:o.hostname,port:o.port||(s?443:80),path:c,method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","Content-Length":Buffer.byteLength(u),Origin:a,Referer:a+"/",Cookie:r},timeout:3e4};let i=n.request(o,r=>{let o="";r.on("data",e=>{o+=e}),r.on("end",()=>{console.error(" HTTP 状态码: "+r.statusCode);try{var e=JSON.parse(o);isLoginExpired(e)?t({__needLogin:!0}):isCsrfTokenExpired(e)?t({__csrfExpired:!0}):t(e)}catch{console.error(" 响应内容: "+o.substring(0,500)),t({success:!1,errorMsg:`HTTP ${r.statusCode}: 响应非 JSON`})}})});i.on("timeout",()=>{i.destroy(),e(new Error("请求超时"))}),i.on("error",e),i.write(u),i.end()})}function httpGet(c,u,l,f){let p=require("https"),d=require("http"),h=require("querystring");return new Promise((t,e)=>{var r=f.map(e=>e.name+"="+e.value).join("; "),o=new URL(c),s="https:"===o.protocol,n=s?p:d,i=l?u+"?"+h.stringify(l):u;let a=n.request({hostname:o.hostname,port:o.port||(s?443:80),path:i,method:"GET",headers:{Origin:c,Referer:c+"/",Cookie:r},timeout:3e4},r=>{let o="";r.on("data",e=>{o+=e}),r.on("end",()=>{console.error(" HTTP 状态码: "+r.statusCode);try{var e=JSON.parse(o);isLoginExpired(e)?t({__needLogin:!0}):isCsrfTokenExpired(e)?t({__csrfExpired:!0}):t(e)}catch{console.error(" 响应内容: "+o.substring(0,500)),t({success:!1,errorMsg:`HTTP ${r.statusCode}: 响应非 JSON`})}})});a.on("timeout",()=>{a.destroy(),e(new Error("请求超时"))}),a.on("error",e),a.end()})}async function requestWithAutoLogin(e,r){let o=await e(r);var t;return o&&o.__csrfExpired&&(t=refreshCsrfToken(),r.cookieData=t,r.csrfToken=t.csrf_token,r.cookies=t.cookies,r.baseUrl=resolveBaseUrl(t),console.error(" 🔄 csrf_token 已刷新,重试..."),o=await e(r)),o&&o.__needLogin&&(t=triggerLogin(),r.cookieData=t,r.csrfToken=t.csrf_token,r.cookies=t.cookies,r.baseUrl=resolveBaseUrl(t),console.error(" 🔄 重新登录后重试..."),o=await e(r)),o}module.exports={findProjectRoot:findProjectRoot,extractInfoFromCookies:extractInfoFromCookies,loadCookieData:loadCookieData,triggerLogin:triggerLogin,refreshCsrfToken:refreshCsrfToken,resolveBaseUrl:resolveBaseUrl,isLoginExpired:isLoginExpired,isCsrfTokenExpired:isCsrfTokenExpired,httpPost:httpPost,httpGet:httpGet,requestWithAutoLogin:requestWithAutoLogin};
|
package/package.json
CHANGED
package/scripts/postinstall.js
CHANGED
|
@@ -3,9 +3,13 @@
|
|
|
3
3
|
* postinstall.js - npm 安装后钩子
|
|
4
4
|
*
|
|
5
5
|
* 检测当前运行的 AI 工具环境,将 npm 包内的 openyida/ 目录
|
|
6
|
-
*
|
|
6
|
+
* 合并复制到对应目标目录下。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* 复制目标策略:
|
|
9
|
+
* - 悟空(Wukong):复制到 ~/.real/workspace/openyida(专属 workspace)
|
|
10
|
+
* - 其他 AI 工具:复制到当前工程目录(process.cwd())下的 openyida/
|
|
11
|
+
*
|
|
12
|
+
* 文件覆盖策略:
|
|
9
13
|
* - 已存在的文件:强制覆盖(更新到最新版本)
|
|
10
14
|
* - 目标目录中已有但源目录没有的文件:保留(不删除用户数据)
|
|
11
15
|
*
|
|
@@ -23,7 +27,12 @@ const os = require("os");
|
|
|
23
27
|
const PACKAGE_OPENYIDA_DIR = path.resolve(__dirname, "..", "openyida");
|
|
24
28
|
|
|
25
29
|
/**
|
|
26
|
-
* 检测所有活跃的 AI
|
|
30
|
+
* 检测所有活跃的 AI 工具,返回其目标 openyida 目录列表。
|
|
31
|
+
*
|
|
32
|
+
* 复制策略:
|
|
33
|
+
* - 悟空(Wukong):复制到 ~/.real/workspace/openyida(专属 workspace)
|
|
34
|
+
* - 其他 AI 工具:复制到当前工程目录(process.cwd())下的 openyida/
|
|
35
|
+
*
|
|
27
36
|
* 复用 dist/env.js 的 detectEnvironment,避免重复维护 TOOL_DETECTORS。
|
|
28
37
|
*/
|
|
29
38
|
function detectActiveWorkspaces() {
|
|
@@ -31,13 +40,20 @@ function detectActiveWorkspaces() {
|
|
|
31
40
|
const { detectEnvironment } = require("../dist/env");
|
|
32
41
|
const { results } = detectEnvironment();
|
|
33
42
|
|
|
43
|
+
const cwd = process.cwd();
|
|
44
|
+
|
|
34
45
|
return results
|
|
35
46
|
.filter((entry) => entry.isActive)
|
|
36
|
-
.map(({ displayName, workspaceRoot }) =>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
47
|
+
.map(({ displayName, dirName, workspaceRoot }) => {
|
|
48
|
+
const isWukong = dirName === ".real";
|
|
49
|
+
if (isWukong) {
|
|
50
|
+
// 悟空:使用专属 workspace 路径(workspaceRoot 已是 ~/.real/workspace/openyida)
|
|
51
|
+
return { displayName, destOpenyidaDir: workspaceRoot };
|
|
52
|
+
} else {
|
|
53
|
+
// 其他 AI 工具:复制到当前工程目录下的 openyida/
|
|
54
|
+
return { displayName, destOpenyidaDir: path.join(cwd, "openyida") };
|
|
55
|
+
}
|
|
56
|
+
});
|
|
41
57
|
}
|
|
42
58
|
|
|
43
59
|
/**
|
|
@@ -94,8 +110,7 @@ function main() {
|
|
|
94
110
|
|
|
95
111
|
let totalCopied = 0;
|
|
96
112
|
|
|
97
|
-
for (const { displayName,
|
|
98
|
-
const destOpenyidaDir = path.join(workspaceDir, "openyida");
|
|
113
|
+
for (const { displayName, destOpenyidaDir } of activeWorkspaces) {
|
|
99
114
|
console.log(` 📁 ${displayName}`);
|
|
100
115
|
console.log(` 目标: ${destOpenyidaDir}`);
|
|
101
116
|
|