English
五块钱买不到吃亏,五块钱买不到上当,但五块钱能买到一直免费升级的 my ai team。
My AI Team(mat)不再按年订阅,改卖拷贝:一次付款,终生免费升级。
- 今天 $5,每月涨 $1。 2026 年 11 月 12 日起价 $5,此后每月 12 日(UTC)涨 $1:12 月 12 日起为 $6。买得越早,付得越少。
- 终身升级。
mat upgrade 轻松升级。正在运行的版本,即使不升级也永远也不会过期。
- 一份一机。 换机器时,旧机运行
mat license deactivate,新机运行 mat activate。
每月 12 日涨 $1, $99.99 封顶:
成年人的世界,想要就下手。早买早享受,而且省钱。
购买地址:mat.shukelabs.com/buy。结账由 LemonSqueezy 处理,它是我们的代理销售商(merchant of record)。
为什么不再订阅
大实话:订阅卖得不好。开发工具升级的需求不迫切,ai时代,小 bug 自己就修了。但像my ai team这样好用的框架,从零开始复刻,不说token的钱,时间上你就不划算。所以我们不再搞订阅,我们让你买得踏实,让你买得没有后顾之忧。
五块钱买到什么
一个和你一起探索需求写票的Explorer agent。
一支不需要babysit的24小时高效工作的交付团队。你再也不用头痛交付的事情。你尽管挖坑,填坑交给交付团队就好。
你只管和Explorer对话开ticket。交付团队全自动的高质量的完成这些票。
最重要的,mat交付的产品仍是你的产品。你不会失去掌控。
mat 运行在你的计算机上,它访问你的 GitHub 仓库来读取并更新工单。交付agent自动认领就绪的工单,自动写开发计划并由独立评审审核计划,自动开worktree实现、开 PR,再自动由独立评审审查实现,仅在审查通过同时CI和测试全绿时才合并。在真正遇到麻烦或决策难题时,agent才通过 Telegram 向你询问意见。
一句话:你专注需求和验收,ai team专注于开票、交付和质量控制。
联系我们
文档
社区
TG群组
销售条款
退款政策
npm write tokens now live 90 days at most, so a CI job that publishes with NPM_TOKEN breaks every quarter until someone rotates the secret. Trusted publishing removes the secret: the workflow trades its GitHub OIDC token for a short-lived publish credential.
First, the publish job needs permission to mint an OIDC token, and npm 11.5.1 or newer:
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/setup-node@v4
with:
node-version: 22
registry-url: https://registry.npmjs.org
- run: npm install -g npm@11 # Node 22 ships an older npm
- run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} # fallback, remove later
Keeping NODE_AUTH_TOKEN during the switch is safe: npm tries OIDC first and only falls back to the token when no trusted publisher matches.
Then tell the registry which workflow may publish each package. This takes npm 11.15.0 or newer and an interactive login with 2FA. A bypass-2FA automation token gets a 403 here.
NPM_CONFIG_BROWSER=false npx npm@latest login --auth-type=web
npx npm@latest trust github @your-scope/your-pkg \
--repo your-org/your-repo --file release.yml --allow-publish --yes
NPM_CONFIG_BROWSER=false makes npm just print the login URL and poll. Without it, npm can stay stuck on its "Press ENTER to open in the browser" prompt even after you approve, and pressing ENTER does not release it. On the 2FA page, tick "don't challenge" so a loop over many packages does not prompt for each one; sleep a couple of seconds between calls to stay under rate limits.
A few things to know before you start:
--file is the workflow file name, not a path. If you rename the workflow, publishing breaks until you replace the trust entry.
- A package can have only one trusted publisher, and it must already exist: publish a brand-new package's first version with a token, then add its trust entry. After that, new versions need nothing.
After the next release publishes cleanly through OIDC (public repos also get provenance, visible in npm view <pkg>@<ver> dist.attestations), delete the NODE_AUTH_TOKEN line and the repo secret, and revoke the token. From then on, nothing expires.
Once your org moves to passwordless sign-in (passkey or Windows Hello PIN), the classic RDP credential prompt is a dead end: the remote VM has no passkey and no PIN, so there is nothing to type that it will accept.
The fix is one line in the .rdp file:
enablerdsaadauth:i:1
This is the "Use a web account to sign in to the remote computer" checkbox on the Advanced tab of mstsc. Instead of handing a password to the remote host, the client opens a Microsoft Entra web sign-in on your local machine, where the passkey/PIN actually lives, and passes the resulting token to the VM.
If an old .rdp file still fails after you tick the box in a fresh connection, look inside it. Files saved before the change usually don't omit the setting; they spell it out as disabled:
enablerdsaadauth:i:0
so it silently overrides your new default. Change the 0 to 1. Watch the encoding when editing by script: .rdp files can be UTF-8 with BOM or UTF-16LE, and a naive sed won't match UTF-16 text.
One caveat: this only works for hosts that accept your Entra account ([email protected]). A host that only knows a classic domain login (DOMAIN\user) will reject the web sign-in, so keep enablerdsaadauth:i:0 on those. Different hosts can legitimately need different values; don't "align" them.
多看阅读里攒了几千条笔记,想拿出来却只能一本书一本书点「导出」:没有批量功能,没有公开 API,导入书的笔记也不存在本地数据库里。
能走通的路是让 AI 助手替你点。它在电脑上用 adb 读屏幕、点按钮,每本书进「想法详情」→「导出」→ 分享给 Termux 存成文件,约 40 秒一本,放后台跑。我用这条路导出了 217 本书的 3172 条笔记,与 app 里显示的总数一条不差(多看阅读 7.12.10,Android 9 平板)。
两个坑决定成败:默认文件名是「《书名》的笔记.txt」,书名一长就超过 255 字节,Termux 报 File name too long,所以要在保存框里改成编号名;另外每次返回列表别多按 BACK,否则会退到书架。
不需要 root:让 Termux 的 ~/downloads 链接到 /sdcard/Download/duokan,导出文件就落在 adb 能直接取的地方。这一步我是在平板上手动授予存储权限、建同样的链接验证的,没有经过 termux-setup-storage 本身。
准备好电脑(装 adb,有能执行命令的 agent,比如 Claude Code)、打开 USB 调试的安卓设备和 Termux,把下面整段发给你的助手:
请帮我把安卓设备上「多看阅读」里所有书的笔记(想法)批量导出到这台电脑。下面是已实测走通的路,照此做;与我的设备不符时自行调整,并告诉我改了什么。
【已知事实】
- 多看没有公开 API,导入书的笔记也不存在本地数据库里,不必去抓包或翻数据库。唯一可靠的路是 app 内每本书「想法详情」页的「导出」按钮:它通过安卓分享菜单发出一个文本文件。
- 分享目标选 Termux:会弹出「Save file in ~/downloads/」对话框,里面有可编辑的文件名框(EditText)和「OPEN DIRECTORY」按钮,点 OPEN DIRECTORY 即保存。
- 导出文件格式:第一行书名,空一行,然后每条笔记先是一行「 YYYY-MM-DD」(行首有一个空格),下面是笔记正文,可多行。划线与我的评论不做区分。
【准备】
1. `adb devices` 确认设备已连上。
2. 让 Termux 把文件存到共享存储,这样无需 root 就能用 adb 取:请我在设备上打开 Termux,依次输入
termux-setup-storage (在弹窗里允许存储权限)
mkdir -p /storage/emulated/0/Download/duokan
mv ~/downloads ~/downloads.bak 2>/dev/null; ln -s /storage/emulated/0/Download/duokan ~/downloads
此后导出的文件会落在 /sdcard/Download/duokan/。
3. 记下 `adb shell settings get system screen_off_timeout` 的原值,临时设为 1800000,全部完成后还原。
4. 请我在多看里打开「我的」→「想法」:这一页列出所有有笔记的书,每项有书名、条数、上次记录日期。「我的」页上的「想法」总数记下来,最后用来核对。
【逐本导出:写一个脚本,用 `adb shell uiautomator dump` 读界面,用 `adb shell input tap / swipe / keyevent / text` 操作】
- 列表项节点的 resource-id 是 com.duokan.reader:id/personal__reading_note_item_view__title,另有 __count 和 __date,可读出书名、条数、日期和坐标。笔记正文是自绘的,dump 读不到,不必尝试。
- 每本书:点书名 → 等出现文字为「导出」的节点再点它(不同书的位置不同,按文字找,别写死坐标)→ 在分享菜单里找文字「Termux」并点它 → 对话框出现后,点 EditText,发 `input keyevent 123`(光标移到末尾),再发约 250 个 67(退格)清空,`input text 001.txt` 换成短编号名 → 重新 dump,核对文件名框确为 001.txt → 点「OPEN DIRECTORY」→ 确认 /sdcard/Download/duokan/001.txt 已出现。
- 一定要改文件名:默认名「《书名》的笔记.txt」在书名很长时超过 255 字节,Termux 会报 Error saving file … (File name too long);同名的书也会互相覆盖。用三位编号命名,并把 编号→书名、条数、日期 追加写入一个 jsonl 进度文件,中断后可续跑。
- 返回列表:保存后 Termux 在前台。用 `adb shell am start -n com.duokan.reader/.DkMainActivity` 拉回多看(通常回到想法详情页);只有 dump 里看不到列表项时才再按一次 BACK,多按会退到书架。
- 自愈:每轮开始先确认在想法列表;在「想法详情」页就按 BACK;在别处就点底部「我的」,再点「想法」那一行。dump 里会混有被遮住的页面层的节点,判断当前页要看它独有的文字。
- 当前屏的书都导完就上滑(从屏高 83% 处滑到 34% 处);连续两次滑动后列表不变,就是到底了。
- 同一本书失败两次就记为失败,继续下一本;出现错误对话框先点「OK」关掉。每 25 本执行一次 `adb shell am force-stop com.termux`,免得 Termux 会话越积越多。
- 脚本放后台跑并写日志,定时看进度,不要守着。
【收尾】
- 核对:每本文件里「 YYYY-MM-DD」行数应等于列表上的条数,总和应等于「想法」总数。不符的书单独重导。
- `adb pull /sdcard/Download/duokan/` 到电脑;按进度文件把 001.txt 改名为「001-书名.txt」(书名截到 80 字节以内,去掉 / \ : * ? " < > | 和空白),再合成一份按书分节、带日期的 Markdown 汇总。
- 还原屏幕超时;把 Termux 的 ~/downloads 恢复原状(删掉链接,把 ~/downloads.bak 改回来)。最后告诉我:导出了几本书、几条笔记、哪些失败了。
多看改版后界面元素可能变化,提示词里已让助手按文字找按钮、自行调整,并在最后核对条数。
An xrdp reconnect can leave a virtual mouse button or key down. A stuck mouse button creates an X11 pointer grab, so every window appears unable to receive clicks even though XFCE and the taskbar are still alive. The old workaround was to click the stuck button once; a reconnect hook can repair both devices automatically without destroying the desktop session.
Keep the session alive in /etc/xrdp/sesman.ini:
KillDisconnected=false
DisconnectedTimeLimit=0
ReconnectScript=reconnectwm.sh
ReconnectScript is the important part. It runs when xrdp-sesman reconnects a client to an existing session. Put the repair command in /etc/xrdp/reconnectwm.sh:
#!/bin/sh
/usr/local/bin/rdp-input-reset >/dev/null 2>&1 || true
The helper only resets a device when X reports a key or button still down:
#!/bin/sh
set -eu
for name in xrdpMouse xrdpKeyboard; do
id=$(xinput list --id-only "$name" 2>/dev/null || true)
[ -n "$id" ] || continue
if xinput query-state "$id" | grep -Eq '(key|button)\[[0-9]+\]=down'; then
xinput disable "$id"
xinput enable "$id"
fi
done
Run the helper manually when the connection has not dropped:
DISPLAY=:10.0 XAUTHORITY="$HOME/.Xauthority" rdp-input-reset
This is safer than restarting xfwm4, the panel, or the whole desktop: it clears the stale XRDP input devices while preserving windows, terminals, and the session. It is not magic—the hook only runs for a reconnect to an existing session. If the connection remains open while input gets stuck, run the helper manually. KillDisconnected=true is a stronger isolation workaround, but it eventually kills the disconnected desktop, so it is the wrong trade-off for a persistent RDP session.