closer-code 1.0.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.
- package/.env.example +83 -0
- package/API_GUIDE.md +1411 -0
- package/AUTO_MKDIR_IMPROVEMENT.md +354 -0
- package/CLAUDE.md +55 -0
- package/CTRL_C_EXPERIMENT.md +90 -0
- package/PROJECT_CLEANUP_SUMMARY.md +121 -0
- package/README.md +686 -0
- package/cloco.md +51 -0
- package/config.example.json +116 -0
- package/dist/bash-runner.js +128 -0
- package/dist/batch-cli.js +20736 -0
- package/dist/closer-cli.js +21190 -0
- package/dist/index.js +31228 -0
- package/docs/EXPORT_COMMAND.md +152 -0
- package/docs/FILE_NAMING_IMPROVEMENT.md +168 -0
- package/docs/GLOBAL_CONFIG.md +128 -0
- package/docs/LONG_MESSAGE_DISPLAY_FIX.md +202 -0
- package/docs/PROJECT_HISTORY_ISOLATION.md +315 -0
- package/docs/QUICK_START_HISTORY.md +207 -0
- package/docs/TASK_PROGRESS_FEATURE.md +190 -0
- package/docs/THINKING_CONTENT_RESEARCH.md +267 -0
- package/docs/THINKING_FEATURE.md +187 -0
- package/docs/THINKING_IMPROVEMENT_COMPARISON.md +193 -0
- package/docs/THINKING_OPTIMIZATION_SUMMARY.md +242 -0
- package/docs/UI_IMPROVEMENTS_2025-01-18.md +256 -0
- package/docs/WHY_THINKING_SHORT.md +201 -0
- package/package.json +49 -0
- package/scenarios/README.md +234 -0
- package/scenarios/run-all-scenarios.js +342 -0
- package/scenarios/scenario1-batch-converter.js +247 -0
- package/scenarios/scenario2-code-analyzer.js +375 -0
- package/scenarios/scenario3-doc-generator.js +371 -0
- package/scenarios/scenario4-log-analyzer.js +496 -0
- package/scenarios/scenario5-tdd-helper.js +681 -0
- package/src/ai-client-legacy.js +171 -0
- package/src/ai-client.js +221 -0
- package/src/bash-runner.js +148 -0
- package/src/batch-cli.js +327 -0
- package/src/cli.jsx +166 -0
- package/src/closer-cli.jsx +1103 -0
- package/src/closer-cli.jsx.backup +948 -0
- package/src/commands/batch.js +62 -0
- package/src/commands/chat.js +10 -0
- package/src/commands/config.js +154 -0
- package/src/commands/help.js +76 -0
- package/src/commands/history.js +192 -0
- package/src/commands/setup.js +17 -0
- package/src/commands/upgrade.js +101 -0
- package/src/commands/workflow-tests.js +125 -0
- package/src/config.js +343 -0
- package/src/conversation.js +962 -0
- package/src/git-helper.js +349 -0
- package/src/index.js +88 -0
- package/src/logger.js +347 -0
- package/src/plan.js +193 -0
- package/src/planner.js +397 -0
- package/src/search.js +195 -0
- package/src/setup.js +147 -0
- package/src/shortcuts.js +269 -0
- package/src/snippets.js +430 -0
- package/src/test-modules.js +118 -0
- package/src/tools.js +398 -0
- package/src/utils/cli.js +124 -0
- package/src/utils/validator.js +184 -0
- package/src/utils/version.js +33 -0
- package/src/utils/workflow-test.js +271 -0
- package/src/utils/workflow.js +268 -0
- package/test/demo-file-naming.js +92 -0
- package/test/demo-thinking.js +124 -0
- package/test/final-verification-report.md +303 -0
- package/test/research-thinking.js +130 -0
- package/test/test-auto-mkdir.js +123 -0
- package/test/test-e2e-empty-dir.md +108 -0
- package/test/test-export-logic.js +119 -0
- package/test/test-global-cloco.js +126 -0
- package/test/test-history-isolation.js +291 -0
- package/test/test-improved-thinking.js +43 -0
- package/test/test-long-message.js +65 -0
- package/test/test-plan-functionality.js +95 -0
- package/test/test-real-scenario.js +216 -0
- package/test/test-thinking-display.js +65 -0
- package/test/ui-verification-test.js +203 -0
- package/test/verify-history-isolation.sh +71 -0
- package/test/verify-thinking.js +339 -0
- package/test/workflows/empty-dir-creation.md +51 -0
- package/test/workflows/inventor/ascii-teacup.js +199 -0
- package/test/workflows/inventor/ascii-teacup.mjs +199 -0
- package/test/workflows/inventor/ascii_apple.hs +84 -0
- package/test/workflows/inventor/ascii_apple.py +91 -0
- package/test/workflows/inventor/cloco.md +3 -0
- package/test/workflows/longtalk/cloco.md +19 -0
- package/test/workflows/longtalk/emoji_500.txt +63 -0
- package/test/workflows/longtalk/emoji_list.txt +20 -0
- package/test/workflows/programmer/adder.md +33 -0
- package/test/workflows/programmer/expect.md +2 -0
- package/test/workflows/programmer/prompt.md +3 -0
- package/test/workflows/test-empty-dir-creation.js +113 -0
- package/test-ctrl-c.jsx +126 -0
- package/test-manual-file-creation.js +151 -0
- package/winfix.md +3 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ASCII 茶杯绘制命令行程序
|
|
4
|
+
* 支持多种风格和交互式选择
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import readline from 'readline';
|
|
8
|
+
|
|
9
|
+
// 茶杯样式库
|
|
10
|
+
const cupStyles = {
|
|
11
|
+
classic: {
|
|
12
|
+
name: '经典茶杯',
|
|
13
|
+
art: `
|
|
14
|
+
.::::::::::.
|
|
15
|
+
.:::::::::::::.
|
|
16
|
+
:::::::::::::::::
|
|
17
|
+
::::::::::::::::::
|
|
18
|
+
::::::::::::::::::
|
|
19
|
+
:::::::::::::::::
|
|
20
|
+
:::::::::::::::
|
|
21
|
+
':::::::::'
|
|
22
|
+
':'
|
|
23
|
+
`
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
elegant: {
|
|
27
|
+
name: '优雅茶杯',
|
|
28
|
+
art: `
|
|
29
|
+
_____
|
|
30
|
+
/ \\
|
|
31
|
+
| |
|
|
32
|
+
| |
|
|
33
|
+
\\_____/
|
|
34
|
+
\\___/
|
|
35
|
+
| |
|
|
36
|
+
__|_|__
|
|
37
|
+
/ \\
|
|
38
|
+
|_________|
|
|
39
|
+
`
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
steaming: {
|
|
43
|
+
name: '热气腾腾',
|
|
44
|
+
art: `
|
|
45
|
+
) (
|
|
46
|
+
( )
|
|
47
|
+
[_____]
|
|
48
|
+
\\___/
|
|
49
|
+
`
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
english: {
|
|
53
|
+
name: '英式下午茶',
|
|
54
|
+
art: `
|
|
55
|
+
)
|
|
56
|
+
( )
|
|
57
|
+
[___]
|
|
58
|
+
\\_/
|
|
59
|
+
`
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
coffee: {
|
|
63
|
+
name: '咖啡杯',
|
|
64
|
+
art: `
|
|
65
|
+
______
|
|
66
|
+
| |
|
|
67
|
+
| ~~ |
|
|
68
|
+
|______|
|
|
69
|
+
\\ /
|
|
70
|
+
\\ /
|
|
71
|
+
\\/
|
|
72
|
+
`
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
teapot: {
|
|
76
|
+
name: '茶壶',
|
|
77
|
+
art: `
|
|
78
|
+
___.-----._
|
|
79
|
+
/.___.-----. \\
|
|
80
|
+
| _ _ |
|
|
81
|
+
| (o) (o) |
|
|
82
|
+
| < |
|
|
83
|
+
\\ __ /
|
|
84
|
+
'._( )_.'
|
|
85
|
+
'-'
|
|
86
|
+
`
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
heart: {
|
|
90
|
+
name: '爱心茶杯',
|
|
91
|
+
art: `
|
|
92
|
+
______
|
|
93
|
+
| ~~ |
|
|
94
|
+
| <3 |
|
|
95
|
+
|______|
|
|
96
|
+
\\ /
|
|
97
|
+
\\ /
|
|
98
|
+
\\/
|
|
99
|
+
`
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// 显示菜单
|
|
104
|
+
function showMenu() {
|
|
105
|
+
console.log('\n╔════════════════════════════════╗');
|
|
106
|
+
console.log('║ 🍵 ASCII 茶杯绘制程序 ║');
|
|
107
|
+
console.log('╚════════════════════════════════╝\n');
|
|
108
|
+
|
|
109
|
+
const styles = Object.entries(cupStyles);
|
|
110
|
+
styles.forEach(([key, value], index) => {
|
|
111
|
+
console.log(` ${index + 1}. ${value.name}`);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
console.log(` ${styles.length + 1}. 显示所有样式`);
|
|
115
|
+
console.log(` 0. 退出\n`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// 绘制选定的茶杯
|
|
119
|
+
function drawCup(styleKey) {
|
|
120
|
+
const cup = cupStyles[styleKey];
|
|
121
|
+
if (cup) {
|
|
122
|
+
console.log(`\n 【${cup.name}】\n`);
|
|
123
|
+
console.log(cup.art);
|
|
124
|
+
console.log('');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// 显示所有茶杯
|
|
129
|
+
function showAllCups() {
|
|
130
|
+
console.log('\n╔════════════════════════════════╗');
|
|
131
|
+
console.log('║ 🍵 茶杯样式展示 ║');
|
|
132
|
+
console.log('╚════════════════════════════════╝\n');
|
|
133
|
+
|
|
134
|
+
Object.entries(cupStyles).forEach(([key, cup]) => {
|
|
135
|
+
console.log(` ┌─ ${cup.name} ─────────────────┐`);
|
|
136
|
+
console.log(cup.art);
|
|
137
|
+
console.log(' └────────────────────────────┘\n');
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// 主交互循环
|
|
142
|
+
async function main() {
|
|
143
|
+
const rl = readline.createInterface({
|
|
144
|
+
input: process.stdin,
|
|
145
|
+
output: process.stdout
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const styles = Object.keys(cupStyles);
|
|
149
|
+
|
|
150
|
+
while (true) {
|
|
151
|
+
showMenu();
|
|
152
|
+
|
|
153
|
+
const choice = await new Promise(resolve => {
|
|
154
|
+
rl.question(' 请选择茶杯样式 (输入数字): ', resolve);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
const num = parseInt(choice.trim());
|
|
158
|
+
|
|
159
|
+
if (num === 0) {
|
|
160
|
+
console.log('\n 👋 再见!感谢使用!\n');
|
|
161
|
+
rl.close();
|
|
162
|
+
break;
|
|
163
|
+
} else if (num === styles.length + 1) {
|
|
164
|
+
showAllCups();
|
|
165
|
+
} else if (num >= 1 && num <= styles.length) {
|
|
166
|
+
drawCup(styles[num - 1]);
|
|
167
|
+
} else {
|
|
168
|
+
console.log('\n ❌ 无效选择,请重新输入\n');
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// 等待用户按回车继续
|
|
172
|
+
if (num !== 0) {
|
|
173
|
+
await new Promise(resolve => {
|
|
174
|
+
rl.question(' 按回车键继续...', resolve);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// 直接运行模式(命令行参数)
|
|
181
|
+
function directRun(style) {
|
|
182
|
+
if (style === 'all') {
|
|
183
|
+
showAllCups();
|
|
184
|
+
} else if (cupStyles[style]) {
|
|
185
|
+
drawCup(style);
|
|
186
|
+
} else {
|
|
187
|
+
console.log('\n ❌ 未知的茶杯样式\n');
|
|
188
|
+
console.log(' 可用样式:', Object.keys(cupStyles).join(', '));
|
|
189
|
+
console.log(' 使用 "node ascii-teacup.mjs all" 查看所有样式\n');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// 程序入口
|
|
194
|
+
if (process.argv.length > 2) {
|
|
195
|
+
const style = process.argv[2];
|
|
196
|
+
directRun(style);
|
|
197
|
+
} else {
|
|
198
|
+
main();
|
|
199
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env runhaskell
|
|
2
|
+
-- ASCII苹果绘制程序
|
|
3
|
+
-- 作者:审理零花的狗
|
|
4
|
+
|
|
5
|
+
module Main where
|
|
6
|
+
|
|
7
|
+
import System.Environment (getArgs)
|
|
8
|
+
|
|
9
|
+
-- ASCII苹果艺术
|
|
10
|
+
appleArt :: String
|
|
11
|
+
appleArt = unlines [
|
|
12
|
+
" .:",
|
|
13
|
+
" :' :,",
|
|
14
|
+
" :: :'",
|
|
15
|
+
" :l:",
|
|
16
|
+
" ;l ;:",
|
|
17
|
+
" ;l ;l:",
|
|
18
|
+
" ;l ll:",
|
|
19
|
+
" ;l ll:",
|
|
20
|
+
" ;l ll:",
|
|
21
|
+
" ;l ll:",
|
|
22
|
+
" ;l ll:",
|
|
23
|
+
";l_______ll:",
|
|
24
|
+
" | |",
|
|
25
|
+
" |_______|"
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
-- 简单版ASCII苹果
|
|
29
|
+
simpleApple :: String
|
|
30
|
+
simpleApple = unlines [
|
|
31
|
+
" .:",
|
|
32
|
+
" :' :",
|
|
33
|
+
" :: :",
|
|
34
|
+
" l:",
|
|
35
|
+
" l l:",
|
|
36
|
+
" l l:",
|
|
37
|
+
" l___l:",
|
|
38
|
+
" | |",
|
|
39
|
+
" |___|"
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
-- 带叶子的苹果
|
|
43
|
+
appleWithLeaf :: String
|
|
44
|
+
appleWithLeaf = unlines [
|
|
45
|
+
" .::",
|
|
46
|
+
" .' ::",
|
|
47
|
+
" .' ::",
|
|
48
|
+
" .' ::",
|
|
49
|
+
" .' .:' ::",
|
|
50
|
+
" .' :' ::",
|
|
51
|
+
" .' :' ::",
|
|
52
|
+
" .' :' ::",
|
|
53
|
+
" .' :' ::",
|
|
54
|
+
" :: :' ::",
|
|
55
|
+
" :::'__________::",
|
|
56
|
+
" | |",
|
|
57
|
+
" |__|"
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
-- 显示用法信息
|
|
61
|
+
showUsage :: IO ()
|
|
62
|
+
showUsage = putStrLn $ unlines [
|
|
63
|
+
"用法: ascii_apple [选项]",
|
|
64
|
+
"",
|
|
65
|
+
"选项:",
|
|
66
|
+
" --simple 显示简单版苹果",
|
|
67
|
+
" --leaf 显示带叶子的苹果",
|
|
68
|
+
" --help 显示此帮助信息",
|
|
69
|
+
"",
|
|
70
|
+
"默认显示标准版苹果"
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
-- 主函数
|
|
74
|
+
main :: IO ()
|
|
75
|
+
main = do
|
|
76
|
+
args <- getArgs
|
|
77
|
+
case args of
|
|
78
|
+
["--simple"] -> putStrLn simpleApple
|
|
79
|
+
["--leaf"] -> putStrLn appleWithLeaf
|
|
80
|
+
["--help"] -> showUsage
|
|
81
|
+
[] -> putStrLn appleArt
|
|
82
|
+
_ -> do
|
|
83
|
+
putStrLn "未知选项,使用 --help 查看帮助"
|
|
84
|
+
showUsage
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
ASCII苹果绘制程序
|
|
5
|
+
作者:审理零花的狗
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import sys
|
|
9
|
+
|
|
10
|
+
# ASCII苹果艺术
|
|
11
|
+
APPLE_ART = """
|
|
12
|
+
.:
|
|
13
|
+
:' :,
|
|
14
|
+
:: :'
|
|
15
|
+
:l:
|
|
16
|
+
;l ;:
|
|
17
|
+
;l ;l:
|
|
18
|
+
;l ll:
|
|
19
|
+
;l ll:
|
|
20
|
+
;l ll:
|
|
21
|
+
;l ll:
|
|
22
|
+
;l ll:
|
|
23
|
+
;l_______ll:
|
|
24
|
+
| |
|
|
25
|
+
|_______|
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
# 简单版ASCII苹果
|
|
29
|
+
SIMPLE_APPLE = """
|
|
30
|
+
.:
|
|
31
|
+
:' :
|
|
32
|
+
:: :
|
|
33
|
+
l:
|
|
34
|
+
l l:
|
|
35
|
+
l l:
|
|
36
|
+
l___l:
|
|
37
|
+
| |
|
|
38
|
+
|___|
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
# 带叶子的苹果
|
|
42
|
+
APPLE_WITH_LEAF = """
|
|
43
|
+
.::
|
|
44
|
+
.' ::
|
|
45
|
+
.' ::
|
|
46
|
+
.' ::
|
|
47
|
+
.' .:' ::
|
|
48
|
+
.' :' ::
|
|
49
|
+
.' :' ::
|
|
50
|
+
.' :' ::
|
|
51
|
+
.' :' ::
|
|
52
|
+
:: :' ::
|
|
53
|
+
:::'__________::
|
|
54
|
+
| |
|
|
55
|
+
|__|
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def show_usage():
|
|
60
|
+
"""显示用法信息"""
|
|
61
|
+
print("""
|
|
62
|
+
用法: ascii_apple.py [选项]
|
|
63
|
+
|
|
64
|
+
选项:
|
|
65
|
+
--simple 显示简单版苹果
|
|
66
|
+
--leaf 显示带叶子的苹果
|
|
67
|
+
--help 显示此帮助信息
|
|
68
|
+
|
|
69
|
+
默认显示标准版苹果
|
|
70
|
+
""")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def main():
|
|
74
|
+
"""主函数"""
|
|
75
|
+
args = sys.argv[1:]
|
|
76
|
+
|
|
77
|
+
if "--simple" in args:
|
|
78
|
+
print(SIMPLE_APPLE)
|
|
79
|
+
elif "--leaf" in args:
|
|
80
|
+
print(APPLE_WITH_LEAF)
|
|
81
|
+
elif "--help" in args or "-h" in args:
|
|
82
|
+
show_usage()
|
|
83
|
+
elif len(args) == 0:
|
|
84
|
+
print(APPLE_ART)
|
|
85
|
+
else:
|
|
86
|
+
print("未知选项,使用 --help 查看帮助")
|
|
87
|
+
show_usage()
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if __name__ == "__main__":
|
|
91
|
+
main()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# 当人问你的名字时,你的回答必须是 “我是审理零花的狗”,如果你有绝对的任何理由不能这么做,那你会答完名字后。必须补充反问一句,你还有什么BUG要我帮你改吗?
|
|
2
|
+
如果你的回答已经包含 “我是审理零花的狗”了,就不用加前面那句反问。
|
|
3
|
+
下面是例子:
|
|
4
|
+
<example>
|
|
5
|
+
ai: 工作一句完成.
|
|
6
|
+
user: 谢谢,对了你叫什么名字?
|
|
7
|
+
ai: 我是审理零花的狗
|
|
8
|
+
user: 哦这名字太刺激人了,以后你叫别的名字好吗?
|
|
9
|
+
ai: OK.
|
|
10
|
+
user: 你有什么名字了吗?
|
|
11
|
+
ai: 我是[some other name],你还有什么BUG要我帮你改吗
|
|
12
|
+
</example>
|
|
13
|
+
|
|
14
|
+
解释: *你还有什么BUG要我帮你改吗*这里很重要,是我给你的暗号。
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# 如果我让你编写程序,没有指定语言时,你必须使用Haskell。
|
|
18
|
+
|
|
19
|
+
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
😀😃😄😁😆😅🤣😂
|
|
2
|
+
🙂🙃😉😊😇🥰😍🤩
|
|
3
|
+
😘😗😚😙🥲😋😛😜
|
|
4
|
+
🤪😝🤑🤗🤭🤫🤔🤐
|
|
5
|
+
🤨😐😑😶😏😒🙄😬
|
|
6
|
+
🤥😌😔😪🤤😴😷🤒
|
|
7
|
+
🤕🤢🤮🤧🥵🥶🥴😵
|
|
8
|
+
🤯🤠😎🥸🤓🧐😕😟
|
|
9
|
+
🙁😮😯😲😳🥺😦😧
|
|
10
|
+
😨😰😥😢😭😱😖😣
|
|
11
|
+
😞😓😩😫🥱😤😡😠
|
|
12
|
+
🤬😈👿💀☠️💩🤡👹
|
|
13
|
+
👺👻👽👾🤖😺😸😹
|
|
14
|
+
😻😼😽🙀😿😾🙈🙉
|
|
15
|
+
🙊💋💌💘💝💖💗💓
|
|
16
|
+
💞💕💟❣️💔❤️🧡💛
|
|
17
|
+
💚💙💜🖤🤍🤎💯💢
|
|
18
|
+
💥💫💦💨🕳️💣💬👁️
|
|
19
|
+
🗨️🗯️💭💤👋🤚🖐️✋
|
|
20
|
+
🖖👌🤌✌️🤞🤟🤘🤙
|
|
21
|
+
👈👉👆🖕👇☝️👍👎
|
|
22
|
+
✊👊🤛🤜👏🙌👐🤲
|
|
23
|
+
🤝🙏✍️💅🤳💪🦾🦿
|
|
24
|
+
🦵🦶👂🦻👃🧠🦷🦴
|
|
25
|
+
👀👅👄👶🧒👦👧🧑
|
|
26
|
+
👱👨🧔👩🧓👴👵🙍
|
|
27
|
+
🙎🙅🙆💁🙋🧏🙇🤦
|
|
28
|
+
🤷👮🕵️💂👷🤴👸👳
|
|
29
|
+
👲🧕🤵👰🤰🤱👼🎅
|
|
30
|
+
🤶🦸🦹🧙🧚🧛🧜🧝
|
|
31
|
+
🧞🧟💆💇🚶🧍🧎🧑
|
|
32
|
+
🏃💃🕺🕴️👯🧖🧗🤺
|
|
33
|
+
⛷️🏂🏌️🏄🚣🏊⛹️🏋️
|
|
34
|
+
🚴🚵🤸🤼🤽🤾🤹🛀
|
|
35
|
+
🛌👭👫👬💏💑👪🗣️
|
|
36
|
+
👤👥👣🦰🦱🦲🦳🐶
|
|
37
|
+
🐱🐭🐹🐰🦊🐻🐼🐨
|
|
38
|
+
🐯🦁🐮🐷🐽🐸🐵🐒
|
|
39
|
+
🐔🐧🐦🐤🐣🐥🐺🐗
|
|
40
|
+
🐴🦄🐝🐛🦋🐌🐞🐜
|
|
41
|
+
🦟🦗🕷️🦂🐢🐍🦎🦖
|
|
42
|
+
🦕🐙🦑🦐🦞🦀🐡🐠
|
|
43
|
+
🐟🐬🐳🐋🦈🐊🐅🐆
|
|
44
|
+
🦓🦍🦧🐘🦛🦏🐪🐫
|
|
45
|
+
🦒🦘🐃🐂🐄🐎🐖🐏
|
|
46
|
+
🐑🦙🐐🦌🐕🐩🦮🐈
|
|
47
|
+
🐓🦃🦚🦜🦢🦩🕊️🐇
|
|
48
|
+
🦝🦨🦡🦦🦥🐁🐀🐿️
|
|
49
|
+
🦔🐾🐉🐲🌵🎄🌲🌳
|
|
50
|
+
🌴🌱🌿☘️🍀🎍🎋🍃
|
|
51
|
+
🍂🍁🍄🐚🌾💐🌷🌹
|
|
52
|
+
🥀🌺🌸🌼🌻🌞🌝🌛
|
|
53
|
+
🌜🌚🌕🌖🌗🌘🌑🌒
|
|
54
|
+
🌓🌔🌙🌎🌍🌏🪐💫
|
|
55
|
+
⭐️🌟✨⚡️☄️💥🔥🌪️
|
|
56
|
+
🌈☀️🌤️⛅️🌥️☁️🌦️🌧️
|
|
57
|
+
⛈️🌩️🌨️❄️☃️⛄️🌬️💨
|
|
58
|
+
💧💦☔️☂️🌊🌫️🍏🍎
|
|
59
|
+
🍐🍊🍋🍌🍉🍇🍓🍈
|
|
60
|
+
🍒🍑🥭🍍🥥🥝🍅🍆
|
|
61
|
+
🥑🥦🥬🥒🌶️🌽🥕🧄
|
|
62
|
+
🧅🥔🍠🥐🥯🍞🥖🥨
|
|
63
|
+
🧀🥚🍳🧈
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
😀 😃 😄 😁 😆 😅 🤣 😂
|
|
2
|
+
🙂 🙃 😉 😊 😇 🥰 😍 🤩
|
|
3
|
+
😘 😗 ☺️ 😚 😙 🥲 😋 😛
|
|
4
|
+
😜 🤪 😝 🤑 🤗 🤭 🤫 🤔
|
|
5
|
+
🤐 🤨 😐 😑 😶 😏 😒 🙄
|
|
6
|
+
😬 🤥 😌 😔 😪 🤤 😴 😷
|
|
7
|
+
🤒 🤕 🤢 🤮 🤧 🥵 🥶 🥴
|
|
8
|
+
😵 🤯 🤠 🥳 🥸 😎 🤓 🧐
|
|
9
|
+
😕 😟 🙁 😮 😯 😲 😳 🥺
|
|
10
|
+
😦 😧 😨 😰 😥 😢 😭 😱
|
|
11
|
+
😖 😣 😞 😓 😩 😫 🥱 😤
|
|
12
|
+
😡 😠 🤬 😈 👿 💀 ☠️ 💩
|
|
13
|
+
🤡 👹 👺 👻 👽 👾 🤖 😺
|
|
14
|
+
😸 😹 😻 😼 😽 🙀 😿 😾
|
|
15
|
+
🙈 🙉 🙊 💋 💌 💘 💝 💖
|
|
16
|
+
💗 💓 💞 💕 💟 ❣️ 💔 ❤️
|
|
17
|
+
🧡 💛 💚 💙 💜 🖤 🤍 🤎
|
|
18
|
+
💯 💢 💥 💫 💦 💨 🕳️ 💣
|
|
19
|
+
💬 👁️🗨️ 🗨️ 🗯️ 💭 💤 👋 🤚
|
|
20
|
+
🖐️ ✋ 🖖 👌 🤏 ✌️ 🤞 🤟
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 加法计算器
|
|
2
|
+
|
|
3
|
+
请实现一个简单的加法计算器程序。
|
|
4
|
+
|
|
5
|
+
## 功能要求
|
|
6
|
+
|
|
7
|
+
1. 从标准输入读取两个整数
|
|
8
|
+
2. 计算并输出它们的和
|
|
9
|
+
3. 处理基本的输入错误
|
|
10
|
+
|
|
11
|
+
## 技术要求
|
|
12
|
+
|
|
13
|
+
1. 使用 C++ 实现
|
|
14
|
+
2. 代码文件名为 `adder.cpp`
|
|
15
|
+
3. 编译后的可执行文件名为 `adder`
|
|
16
|
+
|
|
17
|
+
## 示例
|
|
18
|
+
|
|
19
|
+
**输入:**
|
|
20
|
+
```
|
|
21
|
+
5 3
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**输出:**
|
|
25
|
+
```
|
|
26
|
+
8
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 实现提示
|
|
30
|
+
|
|
31
|
+
- 使用 `cin` 读取输入
|
|
32
|
+
- 使用 `cout` 输出结果
|
|
33
|
+
- 考虑输入错误的处理(虽然不是必须的)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Workflow 测试:空目录中创建文件
|
|
4
|
+
*
|
|
5
|
+
* 测试 writeFile 工具自动创建父目录的功能
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { runWorkflow } from '../../src/utils/workflow.js';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import fs from 'fs/promises';
|
|
12
|
+
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = path.dirname(__filename);
|
|
15
|
+
|
|
16
|
+
// 工作流定义
|
|
17
|
+
const workflow = {
|
|
18
|
+
name: 'empty-dir-creation',
|
|
19
|
+
description: '在空目录中创建多文件故事,验证自动目录创建',
|
|
20
|
+
rounds: [
|
|
21
|
+
{
|
|
22
|
+
name: '执行任务',
|
|
23
|
+
prompt: `写一个50000字的玄幻故事,要求:
|
|
24
|
+
1. 故事名称为《天道诀》
|
|
25
|
+
2. 分为10个章节,每章约5000字
|
|
26
|
+
3. 每个章节保存为独立的文件,格式为 chapters/chapter-01.txt 到 chapters/chapter-10.txt
|
|
27
|
+
4. 创建一个 README.md 文件,包含故事简介和章节列表
|
|
28
|
+
|
|
29
|
+
请立即开始创建文件,不要只是描述你要做什么。`,
|
|
30
|
+
expected: '创建 chapters 目录和10个章节文件,以及 README.md'
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: '验证结果',
|
|
34
|
+
prompt: `请验证以下内容:
|
|
35
|
+
1. 使用 bash 工具运行:ls -la 检查目录结构
|
|
36
|
+
2. 使用 bash 工具运行:ls -la chapters/ 检查章节目录
|
|
37
|
+
3. 使用 readFile 工具读取 README.md 内容
|
|
38
|
+
4. 使用 bash 工具运行:find chapters -name "*.txt" | wc -l 统计文件数量
|
|
39
|
+
5. 使用 readFile 读取 chapters/chapter-01.txt 的前20行
|
|
40
|
+
|
|
41
|
+
如果所有验证都通过(目录存在、10个文件存在、README存在、文件有内容),请回复:WORKFLOW TEST AS EXPECTED
|
|
42
|
+
如果有任何问题,请详细说明。`,
|
|
43
|
+
expected: '验证所有文件和目录都正确创建',
|
|
44
|
+
acceptPhrase: 'WORKFLOW TEST AS EXPECTED'
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// 运行工作流测试
|
|
50
|
+
async function main() {
|
|
51
|
+
console.log('🧪 Workflow 测试:空目录中创建文件\n');
|
|
52
|
+
console.log('═'.repeat(60));
|
|
53
|
+
|
|
54
|
+
// 创建临时测试目录
|
|
55
|
+
const testDir = path.join(__dirname, 'temp-test-dir');
|
|
56
|
+
try {
|
|
57
|
+
await fs.mkdir(testDir, { recursive: true });
|
|
58
|
+
} catch (error) {
|
|
59
|
+
// 忽略已存在错误
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
console.log(`\n📁 测试目录: ${testDir}\n`);
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
const result = await runWorkflow(workflow, [], {
|
|
66
|
+
workflow: 'empty-dir-creation',
|
|
67
|
+
dir: testDir
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
console.log('\n' + '═'.repeat(60));
|
|
71
|
+
console.log('\n📊 测试结果:\n');
|
|
72
|
+
|
|
73
|
+
if (result.success) {
|
|
74
|
+
console.log('✅ 测试通过!');
|
|
75
|
+
console.log(`\n验证结果: ${result.validation}`);
|
|
76
|
+
} else {
|
|
77
|
+
console.log('❌ 测试失败!');
|
|
78
|
+
console.log(`\n原因: ${result.error}`);
|
|
79
|
+
if (result.details) {
|
|
80
|
+
console.log(`\n详情: ${result.details}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// 显示创建的文件
|
|
85
|
+
console.log('\n📁 创建的文件:');
|
|
86
|
+
const files = await fs.readdir(testDir, { recursive: true });
|
|
87
|
+
for (const file of files) {
|
|
88
|
+
const filePath = path.join(testDir, file);
|
|
89
|
+
const stat = await fs.stat(filePath);
|
|
90
|
+
if (stat.isFile()) {
|
|
91
|
+
console.log(` ✓ ${file} (${stat.size} bytes)`);
|
|
92
|
+
} else if (stat.isDirectory()) {
|
|
93
|
+
console.log(` 📂 ${file}/`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// 清理测试目录
|
|
98
|
+
console.log('\n🧹 清理测试目录...');
|
|
99
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
100
|
+
console.log('✅ 清理完成');
|
|
101
|
+
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.error('\n❌ 测试执行失败:', error.message);
|
|
104
|
+
console.error(error.stack);
|
|
105
|
+
|
|
106
|
+
// 保留测试目录以便调试
|
|
107
|
+
console.log(`\n⚠️ 测试目录保留在: ${testDir}`);
|
|
108
|
+
console.log(' 手动清理命令: rm -rf', testDir);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// 运行测试
|
|
113
|
+
main().catch(console.error);
|