codebee 0.1.72 → 0.1.73
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.md +6 -0
- package/README.md +4 -4
- package/app/core/flows.py +1 -1
- package/app/core/jobs.py +4 -1
- package/app/core/manager.py +68 -3
- package/app/core/market.py +2 -2
- package/app/core/paihang.py +8 -1
- package/app/core/planner.py +2 -0
- package/app/core/plugins.py +34 -0
- package/app/core/publish/flow.py +54 -3
- package/app/core/publish/manager.py +215 -28
- package/app/core/publish/qimao.py +30 -0
- package/app/core/skillpacks/fanqie-novel.md +66 -48
- package/app/core/skillpacks/qimao-signing.md +70 -59
- package/app/main.py +24 -28
- package/app/ui/app.js +270 -79
- package/app/ui/i18n.js +17 -2
- package/app/ui/index.html +3 -3
- package/app/ui/style.css +7049 -7040
- package/package.json +1 -1
|
@@ -1,61 +1,69 @@
|
|
|
1
1
|
# 七猫签约标准与写作规范(内置经验包)
|
|
2
2
|
|
|
3
|
-
来源:七猫作家交流区专栏《拒稿到签约:过稿经验分享》(26
|
|
4
|
-
|
|
3
|
+
来源:七猫作家交流区专栏《拒稿到签约:过稿经验分享》(26 篇,含女频编辑满星官方拒稿模板拆解及作者方法论);
|
|
4
|
+
可复查入口:[bbs.qimao.com/column/6859f2539995c](https://bbs.qimao.com/column/6859f2539995c)(经验帖,不等同当前政策)。
|
|
5
|
+
签约作者(玄弈、竹简听雪、安澜瀧王、苝薇等)方法论。完整原文见
|
|
5
6
|
`C:\Users\HP\.zcode\skills\qimao-signing-guide\SKILL.md`(含《不周山守村人》两次拒稿复盘)。
|
|
6
7
|
|
|
7
8
|
> 这是写作参考与自检清单,不是平台官方规则或过签预测;按当前频道与后台要求核实。
|
|
8
9
|
|
|
9
|
-
##
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
10
|
+
## 证据等级与使用边界(2026-09-30 更新)
|
|
11
|
+
|
|
12
|
+
- **A级:当前平台事实**:只接受作家助手/合同/官方公告中当前可见的规则;投稿、独家、更新和内容红线必须回到原页面核对,历史材料不能代替政策。
|
|
13
|
+
- **B级:多篇经验或明确拒稿原文**:可作为质量诊断假设,必须同时指出正文位置、读者/编辑反馈和可验证的下一步实验;不能写成“满足即过签”。
|
|
14
|
+
- **C级:单个作者口诀或未给证据的数字**:只保留为待验证问题,不注入硬门禁,不据此推断签约率、推荐权重或收入。
|
|
15
|
+
- 报告按“稿件质量 → 平台适配 → 当前政策”分层。每条结论都写清证据范围、未知项和风险;确定性字数/格式检查只能提示复查,不能替代文学判断。
|
|
16
|
+
|
|
17
|
+
### 跨平台质量底线
|
|
18
|
+
|
|
19
|
+
先检查首个故事单元是否有**具体事件、主角主动选择、可见后果、阶段性兑现和新的可追问问题**,再看爽点密度。人物动机、因果连续性、前后设定、文风锚、手机阅读段落和内容安全是独立维度;任何一项未读、未测或仅凭摘要得出,都标为“未证实”。
|
|
20
|
+
|
|
21
|
+
## 〇、平台定位(经验假设,先核对当前频道)
|
|
22
|
+
- 七猫的免费阅读、广告/保底和即时反馈,是选题与节奏的**定位假设**;不同频道、时期和合同可能不同,不能从定位直接推出收入或签约结果。
|
|
23
|
+
- “无线风”、热门题材带和“开头很快给到情绪价值”来自历史经验帖,适合拿来设计对照实验;榜单与后台数据优先于口诀。
|
|
24
|
+
- 核心问题不是套公式,而是:读者是否迅速知道主角、处境、目标和下一步;本章的承诺是否在正文兑现。
|
|
25
|
+
- 工作观可保留为复盘提示:“方向、结构、情绪”分别写成可验证的事件、选择、后果,不把口号当质量结论。
|
|
26
|
+
|
|
27
|
+
## 一、黄金一章(历史经验观察点,不是“一章定生死”)
|
|
28
|
+
资料建议把第一章作为高信息密度取样点;以下位置是阅读负担观察参考,不代表编辑统一标准。逐项记录证据,未满足不等于质量不合格。
|
|
29
|
+
- **前 100 字**:观察主角何时登场,读者是否知道故事围绕谁展开。
|
|
30
|
+
- **前 200 字**:观察是否已有值得关心的异常、欲望或冲突。
|
|
31
|
+
- **前 600 字**:观察眼前困境是否具体(退婚/背叛/陷害/侮辱/破产/误会/灾难/生死危机),而非只铺垫。
|
|
32
|
+
- **前 2000 字**:观察核心吸引点是否实际展示(字数位置本身不证明吸引力)。
|
|
33
|
+
- **第三章前**:观察主线是否明确(主角要干什么,像“鸣人要当火影”一样清楚)。
|
|
34
|
+
- 第一章具名人物尽量少(五人只是阅读负担参考,不是硬门槛);前三章要有实质局面变化;
|
|
25
35
|
反转必须由前文条件引发,不为口诀机械加死亡/背叛。
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
- 用对话开场最有效(悬念式/劲爆式/仇恨式);行文"短平快",写小说不是说明文。
|
|
36
|
+
- 可复用的一种开篇节奏:**第一章建立冲突并留后续问题 → 第二章让核心能力/设定影响行动 → 第三章完成第一次阶段性兑现**;具体次序服务于本稿题材与因果。
|
|
37
|
+
- 三幕式可以作为结构草图:开端(危机/目标)→发展(行动/代价)→转折(新信息/选择),不要求每稿套“金手指/背叛”等桥段。
|
|
38
|
+
- 历史经验帖常提醒检查设定、世界观、环境和人物关系是否挤占事件;倒叙、群像或配角戏份本身不是禁写项,重点是读者能否跟住主线。
|
|
39
|
+
- 部分经验帖推荐用对话开场(悬念式/劲爆式/仇恨式);可检查开场是否尽快进入人物行动,不能据此规定所有题材都用对话。
|
|
31
40
|
|
|
32
41
|
## 二、爽点、期待感与钩子
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
|
|
37
|
-
- **期待感三源**(掌握一种就够用):① 信息差(读者知道、主角/对手不知道);
|
|
42
|
+
- 建议复查每章是否有可感知的变化、情绪或兑现;“三章一小爆,十章一大爆”是作者口诀,不能替代逐章判断。
|
|
43
|
+
- 部分作者强调及时兑现:可检查目标是否持续推进、阶段结果是否可见,不以等级或固定章节位置判断有效性;"定个目标 → 完成它"可作构思起点。
|
|
44
|
+
- 欲扬先抑是可选结构:打压应有情境动机,反击应有铺垫;反派心理变化可作为效果观察点,不要求每个故事都用打脸。
|
|
45
|
+
- **三类期待构造方式**(构思工具,不是充分条件):① 信息差(读者知道、主角/对手不知道);
|
|
38
46
|
② 目标预告("三年之约"式,读者等着看那一幕);③ 悬念伏笔(小伏笔=断章钩子;大伏笔有伏必应)。
|
|
39
|
-
-
|
|
40
|
-
-
|
|
47
|
+
- 建议复查章末是否留下可兑现的下一步问题:断章、说话说一半、挖坑或反转预告均可;“章尾小爽点更管用”只是部分作者经验,需结合读者反馈验证。
|
|
48
|
+
- 伏笔不以数量取胜:记录前文铺设、当前承诺和后续回收;神秘人、陷阱或关系反转只有在符合因果并服务本稿时才加入。
|
|
41
49
|
|
|
42
50
|
## 三、主线与节奏
|
|
43
51
|
- 一句话主线 + 主角目标细化;目标不细化 = 过程流水账。
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
-
|
|
52
|
+
- 复查段落是否推动目标、关系、信息或情绪;若没有可辨认的作用,再考虑删改。休整章节也应有清楚的阅读功能。
|
|
53
|
+
- 一种连载经验强调持续制造新局面;可用"起因→行动→阻碍→转折→结果"检查因果,但不要求主角永远处于危机。
|
|
54
|
+
- 小剧情单元可用目标→行动→阻碍→结果检查;大剧情链可用起因→发展→转折→高潮→结局规划。
|
|
47
55
|
- 同一件事不重复叙述;背景设定拆散夹在剧情里带出。
|
|
48
56
|
- 分清剧情流/感情流,笔墨按类型分配。
|
|
49
57
|
|
|
50
|
-
##
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
58
|
+
## 四、人物(经验复查维度)
|
|
59
|
+
- 多篇拒稿复盘关注主角是否作出选择并推动事件;检查“目标 → 行动 → 后果”,但不把单一人物类型写成通用过稿红线。
|
|
60
|
+
- 部分男频经验偏好果断与强反馈;是否适用取决于题材/人设,避免把复杂人物统一改成“杀伐果断”模板。
|
|
61
|
+
- 对手和配角应有可理解的动机与行动;他们不必都强势或聪明,关键是冲突因果成立。
|
|
54
62
|
- 人设四要素:基础设定、个性化标签(口头禅/小习惯)、反差萌、人物弧光。
|
|
55
63
|
- **人设不崩是底线**;人设变化需要铺垫。
|
|
56
64
|
|
|
57
65
|
## 五、视角与文笔
|
|
58
|
-
-
|
|
66
|
+
- 开篇视角应让读者容易定位人物、信息来源和情绪距离;第三人称全知等视角不是禁项,需看执行是否清楚。
|
|
59
67
|
例:×"昏暗的房间里,一个男人把南笙按在沙发上" → √"好痒……南笙迷迷糊糊苏醒,感觉腿上一阵瘙痒,
|
|
60
68
|
随后一只粗糙的大手便摸上了她的大腿"。
|
|
61
69
|
- 开篇即入主角视角,不用旁白自我介绍;读者未对主角产生好感前,不铺大篇幅受伤/惨状。
|
|
@@ -64,7 +72,7 @@
|
|
|
64
72
|
- 段落短,适配手机阅读;少错别字病句。
|
|
65
73
|
|
|
66
74
|
### 编辑高频驳回话术拆解(实测复盘,动笔/改稿时逐条对照)
|
|
67
|
-
|
|
75
|
+
以下三条是所汇编材料中反复出现的"文笔类"反馈,可转成自查问题;不代表所有频道或拒稿的完整原因:
|
|
68
76
|
|
|
69
77
|
- **"风格不够统一"**:叙述语域/句式长短/人称距离在一章内忽高忽低(半文半白 + 网络梗 + 书面长句混用),
|
|
70
78
|
或切场景/切视角时文风跟着变。**修法**:全篇定一个文风锚(如"短句 + 白描 + 口语但不过火"),
|
|
@@ -75,7 +83,7 @@
|
|
|
75
83
|
- **"细节刻画力度稍弱"**:核心冲突/情绪爆点被一句话带过(该"放慢给特写"的地方按了快进),
|
|
76
84
|
打压—反击缺生理与环境反应,爽点"打不满"。**修法**:每个爽点/反转标记为"特写镜头",
|
|
77
85
|
用五感 + 微动作 + 环境反馈把这几秒写"厚"(心跳、指节、周围人的呼吸与目光),
|
|
78
|
-
|
|
86
|
+
铺垫在前、放大在中、余波在后;场景篇幅按叙事重要性调整,不把"特写"固定套给每个爽点。
|
|
79
87
|
|
|
80
88
|
## 六、题材、书名、简介
|
|
81
89
|
- 题材 = 个人兴趣 × 市场需求的最大公约数;风格要匹配题材。
|
|
@@ -83,23 +91,26 @@
|
|
|
83
91
|
- 书名带情绪、有看点、有关键词;忌文艺含蓄无信息量。
|
|
84
92
|
- 简介三要素:背景(身份+处境)+ 冲突(核心矛盾+情绪爆发)+ 悬念(埋钩子)。
|
|
85
93
|
|
|
86
|
-
##
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
- [ ]
|
|
96
|
-
- [ ]
|
|
97
|
-
- [ ]
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
- [ ]
|
|
94
|
+
## 七、投稿与签约(历史流程,提交前必须回后台核实)
|
|
95
|
+
- 经验材料常见“2 万字/3 万字/3-5 个工作日”等节点,只能作为项目排期提示;当前频道的字数、审核时长和可投稿状态以作家助手页面为准。
|
|
96
|
+
- 一稿一投、跟进节奏和签约模式是作者经验,不是过签条件;拒稿后保留原文、版本、编辑原话和修改范围,再决定重修、重立项或换稿。
|
|
97
|
+
- 红线需按当前公告、合同和频道规则核对:涉政涉军涉敏低俗、抄袭洗稿、版权/独家义务等不能靠内部自检替代平台判断。
|
|
98
|
+
|
|
99
|
+
## 八、投稿前质量与证据清单(逐项过;非签约保证)
|
|
100
|
+
先给每个结论标注“当前规则 / 多源经验 / 待验证”,并记录实际读过的章节范围;没有证据的项目不标“通过”。
|
|
101
|
+
|
|
102
|
+
**开篇(第一章;字数位置仅作观察点)**
|
|
103
|
+
- [ ] 观察主角是否尽早登场、读者能否辨认主角 [ ] 观察异常/欲望/冲突何时出现
|
|
104
|
+
- [ ] 观察困境是否具体、核心吸引点是否兑现 [ ] 复查具名人物是否过密(“五人”仅为阅读负担参考)
|
|
105
|
+
- [ ] 复查设定/环境/背景是否挤占事件 [ ] 主角视角是否清楚、旁白距离是否符合本稿选择
|
|
106
|
+
- [ ] 开场与题材承诺是否匹配 [ ] 章末是否有可兑现的后续问题
|
|
107
|
+
**前三章(随题材调整,不强制套章纲)**
|
|
108
|
+
- [ ] 核心设定或能力是否改变人物行动 [ ] 是否完成一个有因果的阶段性兑现
|
|
109
|
+
- [ ] 是否有局面变化 [ ] 主线目标/障碍/下一步是否可复述
|
|
101
110
|
**全书通用**
|
|
102
|
-
- [ ]
|
|
103
|
-
- [ ]
|
|
104
|
-
- [ ]
|
|
105
|
-
- [ ]
|
|
111
|
+
- [ ] 主角是否作出改变局面的选择 [ ] 本章事件是否推进目标或关系
|
|
112
|
+
- [ ] 打压/阻碍有动机、反击/解决有铺垫 [ ] 对手与配角有各自目标
|
|
113
|
+
- [ ] 人物变化有铺垫 [ ] 重复信息和与主线无关内容是否影响阅读
|
|
114
|
+
- [ ] 情绪表达是否具体且适合本稿文风 [ ] 段落长度是否适配目标阅读场景
|
|
115
|
+
- [ ] 每个故事单元都能指出事件、选择、后果、兑现和后续问题
|
|
116
|
+
- [ ] 文风锚、因果链、连续性和内容安全分别复核,未把字数/格式当文学评分
|
package/app/main.py
CHANGED
|
@@ -303,6 +303,11 @@ class Handler(BaseHTTPRequestHandler):
|
|
|
303
303
|
except Exception:
|
|
304
304
|
pass
|
|
305
305
|
return self._json(200, v)
|
|
306
|
+
if path == "/api/plugins":
|
|
307
|
+
# 本地插件(.codex-plugin/plugin.json 契约):发现+安装台账的
|
|
308
|
+
# 聚合视图。坏 manifest 以 blocked/broken 行呈现,不 500。
|
|
309
|
+
from core import plugins
|
|
310
|
+
return self._json(200, plugins.view())
|
|
306
311
|
if path == "/api/knowledge":
|
|
307
312
|
from core import knowledge
|
|
308
313
|
return self._json(200, knowledge.view())
|
|
@@ -1306,6 +1311,23 @@ class Handler(BaseHTTPRequestHandler):
|
|
|
1306
1311
|
from core import knowledge
|
|
1307
1312
|
n = knowledge.learn_from_run((self._body().get("run_id") or ""))
|
|
1308
1313
|
return self._json(200, {"ok": True, "learned": n})
|
|
1314
|
+
m = re.match(r"^/api/plugins/([^/]+)/(install|enable|disable|remove)$", path)
|
|
1315
|
+
if m:
|
|
1316
|
+
# 本地插件生命周期:只搬文件+记账(skills 走 market.install_files、
|
|
1317
|
+
# MCP 只暴露声明),永不执行插件代码。前端 loadPlugins 拉的就是
|
|
1318
|
+
# 上面 GET /api/plugins;缺这组路由时设置页会显示「插件加载失败」。
|
|
1319
|
+
from core import plugins
|
|
1320
|
+
pid, op = m.group(1), m.group(2)
|
|
1321
|
+
if op == "install":
|
|
1322
|
+
result, err = plugins.install(pid)
|
|
1323
|
+
if err:
|
|
1324
|
+
return self._json(400, {"error": err})
|
|
1325
|
+
return self._json(200, result or {"ok": True})
|
|
1326
|
+
if op == "remove":
|
|
1327
|
+
err = plugins.remove(pid)
|
|
1328
|
+
return self._json(400, {"error": err}) if err else self._json(200, {"ok": True})
|
|
1329
|
+
err = plugins.toggle(pid, op == "enable")
|
|
1330
|
+
return self._json(400, {"error": err}) if err else self._json(200, {"ok": True})
|
|
1309
1331
|
m = re.match(r"^/api/flows/([^/]+)/reset$", path)
|
|
1310
1332
|
if m:
|
|
1311
1333
|
err = flows.reset_flow(m.group(1))
|
|
@@ -3094,36 +3116,10 @@ def main():
|
|
|
3094
3116
|
from core import notify as _notify
|
|
3095
3117
|
usage_ledger.set_alert_push(_notify.push_text) # 花费预警推送注入(防 usage→notify 静态环)
|
|
3096
3118
|
from core import mcp_client as _mcp
|
|
3119
|
+
from core.plugins import merged_servers_text as _plugins_mcp_text
|
|
3097
3120
|
def _mcp_servers_text():
|
|
3098
3121
|
"""settings 清单 + 已启用插件的 MCP 服务器合成(plugin 名隔离防撞名)。"""
|
|
3099
|
-
|
|
3100
|
-
try:
|
|
3101
|
-
raw = str(settings.load().get("mcp_servers") or "")
|
|
3102
|
-
configured = _json.loads(raw) if raw.strip() else []
|
|
3103
|
-
except Exception:
|
|
3104
|
-
return raw or ""
|
|
3105
|
-
if not isinstance(configured, list):
|
|
3106
|
-
return raw or ""
|
|
3107
|
-
try:
|
|
3108
|
-
from core import plugins as _plugins
|
|
3109
|
-
plugin_servers = _plugins.active_mcp_servers()
|
|
3110
|
-
except Exception:
|
|
3111
|
-
plugin_servers = [] # 坏插件不能连累用户显式配置的服务器
|
|
3112
|
-
import hashlib as _hashlib
|
|
3113
|
-
import re as _re
|
|
3114
|
-
for item in plugin_servers or []:
|
|
3115
|
-
if not isinstance(item, dict):
|
|
3116
|
-
continue
|
|
3117
|
-
plugin_id = str(item.pop("plugin_id", "plugin"))
|
|
3118
|
-
server_name = str(item.get("name") or "server")
|
|
3119
|
-
digest = _hashlib.sha256(
|
|
3120
|
-
(plugin_id + ":" + server_name).encode("utf-8")).hexdigest()[:6]
|
|
3121
|
-
safe = _re.sub(r"[^a-z0-9_-]", "-", plugin_id.lower())
|
|
3122
|
-
item["name"] = ("plg_" + safe[:11] + "_" + digest)[:24]
|
|
3123
|
-
if not any(x.get("name") == item["name"] for x in configured
|
|
3124
|
-
if isinstance(x, dict)):
|
|
3125
|
-
configured.append(item)
|
|
3126
|
-
return _json.dumps(configured, ensure_ascii=False)
|
|
3122
|
+
return _plugins_mcp_text(settings.load().get("mcp_servers"))
|
|
3127
3123
|
_mcp.set_settings_text(_mcp_servers_text) # MCP 清单注入(防 mcp_client→settings 边)
|
|
3128
3124
|
_step("正在回填用量台账…")
|
|
3129
3125
|
n_bf = usage.backfill_from_runs() # 历史运行 token 回填台账(幂等,仅补缺失步骤)
|