scriptnow-cli 0.3.94__py3-none-any.whl → 0.3.96__py3-none-any.whl
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.
- cli_anything/scriptnow/README.md +20 -5
- cli_anything/scriptnow/__init__.py +1 -1
- cli_anything/scriptnow/scriptnow_cli.py +16 -64
- cli_anything/scriptnow/skills/SKILL.md +83 -301
- cli_anything/scriptnow/skills/agents/openai.yaml +6 -0
- cli_anything/scriptnow/skills/references/methods.md +117 -0
- cli_anything/scriptnow/skills/references/operations.md +54 -0
- cli_anything/scriptnow/skills/references/planning.md +134 -0
- cli_anything/scriptnow/skills/references/review.md +60 -0
- cli_anything/scriptnow/skills/references/setup.md +80 -0
- cli_anything/scriptnow/skills/references/storyboard.md +21 -0
- cli_anything/scriptnow/skills/references/writing.md +16 -0
- cli_anything/scriptnow/utils/browser_login.py +85 -0
- cli_anything/scriptnow/utils/session.py +4 -26
- {scriptnow_cli-0.3.94.dist-info → scriptnow_cli-0.3.96.dist-info}/METADATA +3 -3
- scriptnow_cli-0.3.96.dist-info/RECORD +26 -0
- scriptnow_cli-0.3.94.dist-info/RECORD +0 -17
- {scriptnow_cli-0.3.94.dist-info → scriptnow_cli-0.3.96.dist-info}/WHEEL +0 -0
- {scriptnow_cli-0.3.94.dist-info → scriptnow_cli-0.3.96.dist-info}/entry_points.txt +0 -0
- {scriptnow_cli-0.3.94.dist-info → scriptnow_cli-0.3.96.dist-info}/licenses/LICENSE +0 -0
- {scriptnow_cli-0.3.94.dist-info → scriptnow_cli-0.3.96.dist-info}/top_level.txt +0 -0
cli_anything/scriptnow/README.md
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
## 安装
|
|
31
31
|
|
|
32
|
-
PyPI
|
|
32
|
+
PyPI 分发已上线:https://pypi.org/project/scriptnow-cli/ 。可用 `pipx install scriptnow-cli`,或在虚拟环境中执行 `python -m pip install scriptnow-cli`;默认升级来源仍为下列生产源。
|
|
33
33
|
|
|
34
34
|
要求 Python 3.10+。macOS/Linux 系统 Python(Homebrew、python.org)受 PEP 668 保护时,
|
|
35
35
|
请先在虚拟环境中安装:
|
|
@@ -63,7 +63,7 @@ Windows PowerShell 使用 `py -3 -m venv .venv` 创建 Python 3.10+ 环境,通
|
|
|
63
63
|
## 登录
|
|
64
64
|
|
|
65
65
|
```bash
|
|
66
|
-
scriptnow login --host https://sn.igeewa.com
|
|
66
|
+
scriptnow login --host https://sn.igeewa.com # 打开系统浏览器登录授权
|
|
67
67
|
```
|
|
68
68
|
|
|
69
69
|
会话保存到 `~/.config/scriptnow-cli/session.json`(仅 Cookie,不含密码,权限 0600)。
|
|
@@ -74,7 +74,7 @@ macOS/Linux 上 CLI 会用跨进程锁协调共享会话的自动续期:不同
|
|
|
74
74
|
是否登录、账号、平台地址与连通性。任何「登录失败 / 找不到配置 / 409 / No such option」
|
|
75
75
|
先 `scriptnow doctor` 定位,不要猜配置位置。`SCRIPTNOW_CLI_CONFIG` 可覆盖会话路径;
|
|
76
76
|
多环境共用同一会话文件时登录一次全部生效。
|
|
77
|
-
|
|
77
|
+
登录仅通过系统浏览器完成,不再接受密码参数、标准输入或密码环境变量。
|
|
78
78
|
|
|
79
79
|
## 快速开始(双域)
|
|
80
80
|
|
|
@@ -220,10 +220,10 @@ evaluation v9(深度评估)、work-completion(完结)、invitations(
|
|
|
220
220
|
|
|
221
221
|
## AI Agent 安装(SKILL 体系)
|
|
222
222
|
|
|
223
|
-
Agent
|
|
223
|
+
PyPI 安装提供 CLI 与内置 Skill 文件,但不会自动注册到每个 Agent 客户端。支持 npx skills 的 Agent 可另行安装名为 `scriptnow` 的 Skill:
|
|
224
224
|
|
|
225
225
|
```bash
|
|
226
|
-
npx skills add quchenchen/scriptnow-cli --skill scriptnow
|
|
226
|
+
npx skills add quchenchen/scriptnow-cli --skill scriptnow -g -y
|
|
227
227
|
```
|
|
228
228
|
|
|
229
229
|
SKILL.md 位于 [`cli_anything/scriptnow/skills/SKILL.md`](cli_anything/scriptnow/skills/SKILL.md)。
|
|
@@ -343,3 +343,18 @@ scriptnow review status <packet-id> --json
|
|
|
343
343
|
## 统一创作 Skill 方案
|
|
344
344
|
|
|
345
345
|
CLI、Creator 与创作运行共用服务端 creative-skill-plan。逐章/逐场前使用 ready-check --unit-id <单元ID> 查看已采纳叙事阶段、本单元功能、个人与内置方法及执行准备;缺少阶段不按集数比例推定。阶段 narrative_stage 与功能 unit_function 随集纲/章纲候选提交,采纳后生效。节奏建议不构成一票否决;已选中、已读取、已应用分别留证。
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
## CLI release synchronization
|
|
349
|
+
|
|
350
|
+
Maintainers run monorepo `scripts/sync-cli-release.sh` to synchronize GitHub, the production distribution and PyPI. PyPI environment review remains required; exit 3 means pending, with an exact resume command. See [publishing instructions](https://github.com/quchenchen/scriptnow-cli/blob/main/PUBLISHING.md).
|
|
351
|
+
|
|
352
|
+
## ScriptNow 创作搭档 Skill
|
|
353
|
+
|
|
354
|
+
作者可以说“启动 ScriptNow 新手模式”或“继续我的作品”。`scriptnow` Skill 负责对话引导,CLI 负责执行,平台负责权限、审阅与保存。入口按当前任务读取安装、规划、审阅、写作方法、正文、运行恢复或分镜说明,不一次加载全部规则。安装 CLI 包会携带完整 Skill,但不会自动向所有 Agent 客户端注册;注册时须包含整个 skills 目录及其 references、agents 文件。Skill 与 CLI 同步发布,实时 `agent-guide --json` 为操作规则依据。
|
|
355
|
+
|
|
356
|
+
开始或继续 ScriptNow 创作时,Skill 默认自检;缺少 CLI 即自动安装必要依赖并验证,无需作者另行提出安装要求,已有可用版本直接复用。先检查 Agent 实际执行环境,Windows 优先调用官方 `install-agent.ps1`,完成后用绝对路径验证并继续登录。现有自动 Python 安装分支针对 amd64;其他架构、组织策略和网络限制按具体检查处理,不承诺所有机器均可无人值守安装。
|
|
357
|
+
|
|
358
|
+
作品写作方法共建:Skill 从灵感和规划对话中积累作者的理念、人物思路、节奏、钩子与表达要求,围绕真实创作决定,正文前整理成核心追求、条件性原则、适用边界和取舍顺序;正反例不是共建主流程,craft 必需的 examples 从已确认的具体取舍中提取。通过现有 skill setup / craft 接口,经作者确认、平台保存和挂载核验后生效;单次修改不自动升级为长期规则。
|
|
359
|
+
|
|
360
|
+
浏览器授权登录:运行 `scriptnow login` 后由系统浏览器登录并确认,临时授权凭证自动传递,作者无需复制。CLI 不接收密码参数、标准输入或密码环境变量。登录会话复用并自动刷新;默认访问凭据 60 分钟,成功刷新后重新计算 30 天闲置有效期,实际值由服务端设置决定。退出、改密或撤销后仍须重新授权。此变更需后端与 Creator 授权页配套部署后发布 CLI。
|
|
@@ -25,7 +25,6 @@ from cli_anything.scriptnow.utils.session import (
|
|
|
25
25
|
ScriptNowError,
|
|
26
26
|
Session,
|
|
27
27
|
load,
|
|
28
|
-
login,
|
|
29
28
|
write_json,
|
|
30
29
|
)
|
|
31
30
|
from cli_anything.scriptnow.utils.upgrade import (
|
|
@@ -83,12 +82,7 @@ class AgentJsonGroup(click.Group):
|
|
|
83
82
|
|
|
84
83
|
|
|
85
84
|
def _session(ctx: click.Context) -> Session:
|
|
86
|
-
"""
|
|
87
|
-
base = ctx.obj.get("base_url")
|
|
88
|
-
email = ctx.obj.get("email")
|
|
89
|
-
password = ctx.obj.get("password")
|
|
90
|
-
if base and email and password:
|
|
91
|
-
return login(base, email, password)
|
|
85
|
+
"""Load only the previously browser-authorized session."""
|
|
92
86
|
return load()
|
|
93
87
|
|
|
94
88
|
|
|
@@ -294,7 +288,7 @@ _MAIN_HELP = (
|
|
|
294
288
|
+ """ScriptNow 创作 CLI —— 从灵感到成书交付的一站式命令行。
|
|
295
289
|
|
|
296
290
|
典型流程(Agent 或创作者,固定 12 步引导顺序):
|
|
297
|
-
1. scriptnow login --host https://sn.igeewa.com
|
|
291
|
+
1. scriptnow login --host https://sn.igeewa.com # 登录平台
|
|
298
292
|
2. scriptnow project create --name 新作 --medium novel # 建项目
|
|
299
293
|
3. scriptnow project direction --apply @direction.json # 补齐创作方向
|
|
300
294
|
4. novel propose cores/blueprint → adopt-core / adopt-blueprint # 故事核心与蓝图(回填优先,planning-quality 门禁)
|
|
@@ -320,8 +314,6 @@ _MAIN_HELP = (
|
|
|
320
314
|
invoke_without_command=True,
|
|
321
315
|
)
|
|
322
316
|
@click.option("--base-url", envvar="SCRIPTNOW_BASE_URL", help="Platform base URL (e.g. https://sn.igeewa.com)")
|
|
323
|
-
@click.option("--email", envvar="SCRIPTNOW_EMAIL", help="Login email")
|
|
324
|
-
@click.option("--password", envvar="SCRIPTNOW_PASSWORD", help="Login password")
|
|
325
317
|
@click.option("--json", "json_output", is_flag=True, help="Emit machine-readable JSON")
|
|
326
318
|
@click.option("--no-color", "no_color", is_flag=True, help="Disable ANSI colors (also: NO_COLOR / SCRIPTNOW_NO_COLOR env)")
|
|
327
319
|
@click.version_option(
|
|
@@ -333,8 +325,6 @@ _MAIN_HELP = (
|
|
|
333
325
|
def main(
|
|
334
326
|
ctx: click.Context,
|
|
335
327
|
base_url: str | None,
|
|
336
|
-
email: str | None,
|
|
337
|
-
password: str | None,
|
|
338
328
|
json_output: bool,
|
|
339
329
|
no_color: bool,
|
|
340
330
|
) -> None:
|
|
@@ -342,8 +332,6 @@ def main(
|
|
|
342
332
|
ui.init(no_color)
|
|
343
333
|
ctx.ensure_object(dict)
|
|
344
334
|
ctx.obj["base_url"] = base_url
|
|
345
|
-
ctx.obj["email"] = email
|
|
346
|
-
ctx.obj["password"] = password
|
|
347
335
|
ctx.obj["json"] = json_output
|
|
348
336
|
ctx.obj["no_color"] = no_color
|
|
349
337
|
# 强制版本检查:后台低频(24h 缓存)查询 GitHub 发布镜像,有新版时提示
|
|
@@ -978,7 +966,7 @@ def doctor_cmd(
|
|
|
978
966
|
click.echo(ui.dim(f"平台:{report.get('base_url')}"), err=True)
|
|
979
967
|
else:
|
|
980
968
|
click.echo(ui.warn(f"未登录:{report.get('login_error')}"), err=True)
|
|
981
|
-
click.echo(ui.dim("修复:scriptnow login --host
|
|
969
|
+
click.echo(ui.dim("修复:scriptnow login --host <平台地址>(系统浏览器授权)"), err=True)
|
|
982
970
|
click.echo(ui.dim("配置目录:~/.config/scriptnow-cli/(session.json + version-check.json + errors.jsonl)"), err=True)
|
|
983
971
|
click.echo(ui.dim("可用环境变量 SCRIPTNOW_CLI_CONFIG 覆盖会话文件位置"), err=True)
|
|
984
972
|
if report["diagnostics_enabled_until"]:
|
|
@@ -1068,6 +1056,7 @@ _AGENT_CONTRACT = {
|
|
|
1068
1056
|
"title": "ScriptNow Agent 操作契约 —— 连接平台前必读",
|
|
1069
1057
|
"audience": "在 ScriptNow 平台上创作小说/剧本的 AI Agent。以本契约为唯一操作准则;本契约与平台后端返回为准,优先于任何对平台的猜测。",
|
|
1070
1058
|
"rules": [
|
|
1059
|
+
"登录只用 scriptnow login 打开系统浏览器,由用户在网页输入账号密码并确认授权。禁止向 Agent 提供密码、读取密码框或以参数、stdin、环境变量代传密码;授权失败不得回退旧密码登录。",
|
|
1071
1060
|
"创作顺序铁律(12 步 guide 顺序):故事核心与蓝图(cores/blueprint)→ 故事梗概(outline)→ 全剧统筹与粗纲(rough-outline)→ StoryMap 与集纲/章纲一体交付 → 正文。粗纲依赖已采纳的核心/蓝图锚点与梗概;禁止先排 StoryMap 或先写正文再补粗纲。",
|
|
1072
1061
|
"authorize 命令与旧版 decision-token 通道已弃用:所有采纳授权统一走 `scriptnow review confirm <packet_id> --decision retain --evidence \"<用户明确决定原话>\" --json` → `scriptnow review claim <packet_id> --json` → 目标采纳命令的 `--review-token <凭证>`;CLI authorize 仅保留兼容输出并标记 deprecated,新流程不再引导使用。",
|
|
1073
1062
|
"创作对话优先于技术操作:新手模式按 scriptnow guide --step <n> --medium novel|script --json 一幕一幕推进。每轮只问一个主问题;用户卡住时才选择一个 lenses 角度启发。先用自然语言复述创作意图,再给一个具体候选,让用户只做『保留 / 调整 / 换方向』的决定。命令、JSON、id、质量术语默认留在幕后。多轮发散后可将最近对话的轻量摘要传给 guide --pulse @pulse.json --step <当前幕>:只含 rounds_without_progress / decision_advanced / captured_material / unresolved / conflicts / next_stage_requested,不传正文。仅当返回 drifting/conflict 才按 recovery 协议先收拢成果、再邀请回归;useful_detour 必须保留素材并允许继续探索。也可直接用 --resume 温和接回。所有机制都不得改变平台状态、强制跳转、倾倒整套流程、连续盘问,或用『作为 AI』『根据算法』等措辞破坏共创感。",
|
|
@@ -1086,7 +1075,7 @@ _AGENT_CONTRACT = {
|
|
|
1086
1075
|
"错误或不适用的项目 Skill 不要归档全局 Skill 或重建项目:在用户明确授权后执行 `skill unmount <project_id> <skill_id> --confirm --json`,CLI 会回读 mounts 确认该项目已解除;其他项目和版本不受影响。解除最后一个已启用写作 Skill 后,ready-check 必须显示不就绪,需挂载通过门禁的方法论后再生成。",
|
|
1087
1076
|
"Skill 健壮性参照:craft / voice / continuity / evaluation / examples 五个维度必须有实质内容并含正反例;script 还必须覆盖四类质量锚点——场次功能与可观察转折、可见可听可表演、对白/VO/OS 发声时序、台词量与目标时长。skill craft 自动补系统锚点,不增加用户问卷;绕过 craft 直接创建也会由后端 robustness v2 检查。制作信息由系统派生,编剧不维护机器字段。",
|
|
1088
1077
|
"回传被平台拒绝时,按 CLI 返回的可行动 detail 修正格式后重传;Agent/--json 场景统一返回 {ok:false,error:{type,status,detail}},其中 detail 保留经脱敏的原始领域提示,不得把中文通用兜底当成修复指令;不要自建替代结构,也不要删除平台已有项目自行重建。",
|
|
1089
|
-
"会话由 CLI 自动续期(refresh token 30 天)。同一项目的创作写操作仍须串行,避免版本/候选冲突;不同项目可并发执行,CLI 会安全协调共享登录会话的 refresh
|
|
1078
|
+
"会话由 CLI 自动续期(refresh token 30 天)。同一项目的创作写操作仍须串行,避免版本/候选冲突;不同项目可并发执行,CLI 会安全协调共享登录会话的 refresh。若提示『登录状态已失效』,重新运行 scriptnow login 并由用户在系统浏览器授权,不要伪造凭据或绕开 CLI。",
|
|
1090
1079
|
"命令与参数以 scriptnow --help / scriptnow <命令> --help 为准;不确定时先查帮助,不要臆造参数或输出格式。",
|
|
1091
1080
|
"需要保存的标识(project_id / chapter_id / revision_id / run_id)来自命令的 --json 输出;后续命令一律引用这些 id,不要自造 id 或猜测路径。",
|
|
1092
1081
|
"CLI 版本与 /cli 页面一致;发现行为异常先检查 scriptnow --version 是否最新。",
|
|
@@ -1101,7 +1090,7 @@ _AGENT_CONTRACT = {
|
|
|
1101
1090
|
],
|
|
1102
1091
|
"quickstart": [
|
|
1103
1092
|
"scriptnow guide --step 1 --medium novel|script --json(每步完成后按 next_step 衔接,不一次展示命令墙)",
|
|
1104
|
-
"scriptnow login --host https://sn.igeewa.com
|
|
1093
|
+
"scriptnow login --host https://sn.igeewa.com",
|
|
1105
1094
|
"scriptnow project create --name <作品名> --medium novel|script --premise <前提> --genre <类型> --tone <文风> --point-of-view <视角> --chapter-target-words 1200;script 项目另设 --volume-one 总集数 --volume-two 每集场数 --volume-three 单集目标分钟(默认 3)(创建后立即 scriptnow project list 回读核对项目存在)",
|
|
1106
1095
|
"规划链逐层(故事核心与蓝图 → 梗概 → 粗纲 → storymap):对 cores/blueprint 先用 review preview 审阅本地文件,再 propose 回填、candidate-preview 审阅平台候选、confirm/claim。小说故事核心执行 `scriptnow novel adopt-core <作品号> <候选号> --review-token <凭证>`,剧本故事核心执行 `scriptnow script adopt-core <作品号> <候选号> --review-token <凭证>`;蓝图分别执行 `scriptnow novel adopt-blueprint <作品号> <候选号> --review-token <凭证>` 或 `scriptnow script adopt-blueprint <作品号> <候选号> --review-token <凭证>`。再采纳 outline、粗纲和集纲/章纲一体的 StoryMap;每个写入都以平台返回的 ID 和回读为准。",
|
|
1107
1096
|
"集纲/章纲随 storymap 一体交付(novel 参照 script 合并模型):剧本每个 episode 提供平铺 logline/active_goal/conflict/turn/state_changes/anchor_ids;小说每个 chapter 的 outline 提供 summary 或 logline、active_goal/conflict/turn/state_changes,锚点可来自 outline.anchor_ids 或 beat。storymap JSON 本地生成 → novel/script planning-quality 预检 → 每阶段先 review preview → propose → review candidate-preview 展示平台候选;人明确保留后分别 adopt,禁止 --adopt 隐式连跳。旧项目可用 episode-outline/chapter outline 补纲;新增卷/章也只形成候选。",
|
|
@@ -1201,8 +1190,8 @@ _GUIDE_STEPS = [
|
|
|
1201
1190
|
"scene": "推开工作室的门。这里存放着你所有的作品与灵感,先落下你的名字。",
|
|
1202
1191
|
"why": "登录一次,之后所有创作命令都会自动带上你的身份,不用反复输入。",
|
|
1203
1192
|
"downstream": "登录后所有写操作自动带身份,是后续一切创作命令的身份基础。",
|
|
1204
|
-
"command": "scriptnow login --host https://sn.igeewa.com
|
|
1205
|
-
"verify": "
|
|
1193
|
+
"command": "scriptnow login --host https://sn.igeewa.com",
|
|
1194
|
+
"verify": "浏览器确认后输出授权成功;doctor 核对已保存会话与当前账号,不输出凭据。",
|
|
1206
1195
|
"prompt": "此刻你想创作什么?不必完整,先说出那个让你心动的念头。",
|
|
1207
1196
|
"masters": [
|
|
1208
1197
|
{
|
|
@@ -1779,56 +1768,19 @@ def _echo_guide(payload: dict[str, object]) -> None:
|
|
|
1779
1768
|
|
|
1780
1769
|
|
|
1781
1770
|
@main.command()
|
|
1782
|
-
@click.option("--host",
|
|
1783
|
-
@click.option("--
|
|
1784
|
-
@click.option(
|
|
1785
|
-
"--password",
|
|
1786
|
-
default=None,
|
|
1787
|
-
hide_input=True,
|
|
1788
|
-
help="密码。为安全起见不建议在命令行传明文:可省略后交互式隐藏输入,或用 --password-stdin / 环境变量 SCRIPTNOW_PASSWORD 传入",
|
|
1789
|
-
)
|
|
1790
|
-
@click.option(
|
|
1791
|
-
"--password-stdin",
|
|
1792
|
-
is_flag=True,
|
|
1793
|
-
help="从标准输入读取密码(管道/agent 安全传入,不落 shell history 与进程列表)",
|
|
1794
|
-
)
|
|
1771
|
+
@click.option("--host", default="https://sn.igeewa.com", help="平台地址")
|
|
1772
|
+
@click.option("--timeout", type=click.IntRange(30, 600), default=180, help="浏览器授权等待秒数")
|
|
1795
1773
|
@click.option("--json", "json_output", is_flag=True)
|
|
1796
|
-
def login_cmd(host: str,
|
|
1797
|
-
"""
|
|
1798
|
-
|
|
1799
|
-
密码安全传递(按优先级):
|
|
1800
|
-
1. --password-stdin:从标准输入读取(推荐给 agent/脚本,不落历史与进程表)
|
|
1801
|
-
2. 环境变量 SCRIPTNOW_PASSWORD(agent 场景)
|
|
1802
|
-
3. 省略 --password:交互式隐藏输入(getpass,屏幕上不显示、不落历史)
|
|
1803
|
-
4. --password <明文>:仅兼容旧脚本;明文会出现在 shell history,尽量不用
|
|
1804
|
-
"""
|
|
1805
|
-
import getpass as _getpass
|
|
1806
|
-
import os as _os
|
|
1807
|
-
|
|
1808
|
-
if password is None:
|
|
1809
|
-
if password_stdin:
|
|
1810
|
-
password = click.get_text_stream("stdin").readline().rstrip("\n")
|
|
1811
|
-
else:
|
|
1812
|
-
env_password = _os.environ.get("SCRIPTNOW_PASSWORD")
|
|
1813
|
-
if env_password:
|
|
1814
|
-
password = env_password
|
|
1815
|
-
else:
|
|
1816
|
-
password = _getpass.getpass("密码(输入时不显示): ")
|
|
1817
|
-
if not password:
|
|
1818
|
-
raise click.ClickException("密码不能为空——请重新运行 scriptnow login")
|
|
1774
|
+
def login_cmd(host: str, timeout: int, json_output: bool) -> None:
|
|
1775
|
+
"""打开系统浏览器登录授权;CLI 和 Agent 不接收账号密码。"""
|
|
1776
|
+
from cli_anything.scriptnow.utils.browser_login import browser_login
|
|
1819
1777
|
try:
|
|
1820
|
-
session =
|
|
1778
|
+
session = browser_login(host, timeout=timeout, notify=lambda message: click.echo(message, err=True))
|
|
1821
1779
|
except ScriptNowError as error:
|
|
1822
1780
|
raise click.ClickException(str(error)) from error
|
|
1823
|
-
|
|
1781
|
+
_emit({"ok": True, "base_url": session.base_url}, json_output)
|
|
1824
1782
|
if not json_output:
|
|
1825
|
-
click.echo(ui.ok(
|
|
1826
|
-
if not _onboarding_done():
|
|
1827
|
-
click.echo(
|
|
1828
|
-
ui.warn("第一次来?小说运行 scriptnow guide --medium novel;剧本运行 --medium script。我们从一个念头开始。"),
|
|
1829
|
-
err=True,
|
|
1830
|
-
)
|
|
1831
|
-
_emit({"ok": True, "base_url": session.base_url, "user": email}, json_output)
|
|
1783
|
+
click.echo(ui.ok("浏览器授权成功,登录会话已保存。"))
|
|
1832
1784
|
|
|
1833
1785
|
|
|
1834
1786
|
# ------------------------------------------------------------------------ projects
|