Skip to content

Commit 61bccae

Browse files
0.0.9 I-part repo side: optional foundation intro + tool L01 optionality
- paths/foundation: m0 orientation is now an optional extra-credit module (never first step, never badge-required); verify_paths understands "optional" and badge math excludes it. Route-challenge copy: the module pages live on flypython.com now, repo keeps the canonical markdown. - six tool-course L01s (en+zh): step 2 pre-installs the Skill as optional (the entry sentence reads it from the URL); starter failure count corrected to "five classes + two end-to-end consequences = seven named failures". - READMEs: new positioning line, same change both languages. make check green (12 courses, 2 paths). Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent b762a88 commit 61bccae

19 files changed

Lines changed: 142 additions & 79 deletions

File tree

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
# FlyPython: Build Better Products with Python and AI Coding
1+
# FlyPython: Learn to ship Python with AI coding agents
22

3+
Learn to ship Python with AI coding agents — real projects; your agent does
4+
the typing, `verify.py` decides when you're done.
35
[![GitHub stars](https://img.shields.io/github/stars/flypythoncom/python?style=flat-square&label=stars)](https://github.com/flypythoncom/python/stargazers)
46
[![Validate](https://github.com/flypythoncom/python/actions/workflows/validate.yml/badge.svg)](https://github.com/flypythoncom/python/actions/workflows/validate.yml)
57
[![Website](https://img.shields.io/badge/Website-flypython.com-blue?style=flat-square)](https://flypython.com)

README_cn.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
# FlyPython:用 Python 和 AI Coding 做出好产品
1+
# FlyPython:用 AI 编码 Agent 把 Python 真正交付
22

3+
用 AI 编码 Agent 把 Python 真正交付——真实项目;Agent 负责敲键盘,
4+
`verify.py` 决定你什么时候算完成。
35
[![GitHub stars](https://img.shields.io/github/stars/flypythoncom/python?style=flat-square&label=stars)](https://github.com/flypythoncom/python/stargazers)
46
[![Validate](https://github.com/flypythoncom/python/actions/workflows/validate.yml/badge.svg)](https://github.com/flypythoncom/python/actions/workflows/validate.yml)
57
[![Website](https://img.shields.io/badge/Website-flypython.com-blue?style=flat-square)](https://flypython.com)

content-manifest.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,14 @@
220220
"path": "courses/hands-on-python-with-claude-code/lessons/L01.md",
221221
"title": "Lesson 1: Set up Claude Code, install the FlyPython Skill, fetch the course",
222222
"summary": "Get Claude Code running, install the FlyPython Skill with network access approved, and let the agent fetch this course's files — you download nothing. Then make the starter's failure objective.",
223-
"sha256": "8979f72d7ad8b886bbe954e2af2dba4c30886104bbfa83f61470d6375b45226c"
223+
"sha256": "82369069fc4bd61c79235d87d0fad6cfb154c9fd7cef72a35588bd93d07406ae"
224224
},
225225
{
226226
"lang": "zh-CN",
227227
"path": "courses/hands-on-python-with-claude-code/lessons/L01_cn.md",
228228
"title": "第 1 课:装好 Claude Code、装上 FlyPython Skill、让 Agent 取回课程",
229229
"summary": "先把 Claude Code 跑起来,装好 FlyPython Skill 并打开联网权限,让 Agent 取回本课文件——你不下载任何东西,然后让 starter 的失败变得客观。",
230-
"sha256": "a038f7ff91b277d640aaf078d0a93fc9dd84431e59d3ff842d4ab9a3eb492e61"
230+
"sha256": "92ecf820ba6e85711fe75f3949ece009e7f32e1f3ffdcc41e6d39bd8ad8795f5"
231231
}
232232
]
233233
},
@@ -358,14 +358,14 @@
358358
"path": "courses/hands-on-with-openai-codex/lessons/L01.md",
359359
"title": "Lesson 1: Set up the Codex app, install the FlyPython Skill, fetch the course",
360360
"summary": "Get the Codex app running, install the FlyPython Skill with network access approved, and let the agent fetch this course's files — you download nothing. Then make the starter's failure objective.",
361-
"sha256": "4b3aa0b156a613504be0a7e4d098e82ba5c1158fd15c5a2a10b6015f5208d16e"
361+
"sha256": "ee24b9e1e542eb8c740867f6e47467fcf9fa97f16a02458a15586c34b80927a5"
362362
},
363363
{
364364
"lang": "zh-CN",
365365
"path": "courses/hands-on-with-openai-codex/lessons/L01_cn.md",
366366
"title": "第 1 课:装好 the Codex app、装上 FlyPython Skill、让 Agent 取回课程",
367367
"summary": "先把 the Codex app 跑起来,装好 FlyPython Skill 并打开联网权限,让 Agent 取回本课文件——你不下载任何东西,然后让 starter 的失败变得客观。",
368-
"sha256": "e5623346801e89ef88bc8a7970583ab9f17e9cfbc45b831e5db13b302e1de380"
368+
"sha256": "01aaf0281525e670a7707e2860e778a72c2497c86a6ea5070ae4bc5e5ae68cdb"
369369
}
370370
]
371371
},
@@ -496,14 +496,14 @@
496496
"path": "courses/hands-on-with-cursor/lessons/L01.md",
497497
"title": "Lesson 1: Set up Cursor, install the FlyPython Skill, fetch the course",
498498
"summary": "Get Cursor running, install the FlyPython Skill with network access approved, and let the agent fetch this course's files — you download nothing. Then make the starter's failure objective.",
499-
"sha256": "ecd44f10871f0b2eaa37b742647ad911ff53c66b5f58e31a9c1d6bdd0637c9d3"
499+
"sha256": "de071fa887d8199000873a79feab7bb1ea0e4627f848cd87ba161a4fb0f0a5f7"
500500
},
501501
{
502502
"lang": "zh-CN",
503503
"path": "courses/hands-on-with-cursor/lessons/L01_cn.md",
504504
"title": "第 1 课:装好 Cursor、装上 FlyPython Skill、让 Agent 取回课程",
505505
"summary": "先把 Cursor 跑起来,装好 FlyPython Skill 并打开联网权限,让 Agent 取回本课文件——你不下载任何东西,然后让 starter 的失败变得客观。",
506-
"sha256": "2eab233ad6f2ed9acac57c7155e6be2cedb8dc6195c909c2bde7d651c07c3e43"
506+
"sha256": "54202b2349b7f846e71d5a18f876922c69a5c84b717e5350f1683537397ed386"
507507
}
508508
]
509509
},
@@ -1048,14 +1048,14 @@
10481048
"path": "courses/hands-on-with-deepseek-harness/lessons/L01.md",
10491049
"title": "Lesson 1: Set up DeepSeek Harness, install the FlyPython Skill, fetch the course",
10501050
"summary": "Get DeepSeek Harness running, install the FlyPython Skill with network access approved, and let the agent fetch this course's files — you download nothing. Then make the starter's failure objective.",
1051-
"sha256": "b05961c1d052d53094e651a7906df7868f78ab1ea3bed98d2c435ebb08d15696"
1051+
"sha256": "966ec591705e7351461ec85a7d3f615dcdc001dc559767b32b9a362efde7aaf7"
10521052
},
10531053
{
10541054
"lang": "zh-CN",
10551055
"path": "courses/hands-on-with-deepseek-harness/lessons/L01_cn.md",
10561056
"title": "第 1 课:装好 DeepSeek Harness、装上 FlyPython Skill、让 Agent 取回课程",
10571057
"summary": "先把 DeepSeek Harness 跑起来,装好 FlyPython Skill 并打开联网权限,让 Agent 取回本课文件——你不下载任何东西,然后让 starter 的失败变得客观。",
1058-
"sha256": "d50f8cc860b18080777562960519c47d13d28d00336892bfc043d2ade0948b67"
1058+
"sha256": "0f83e1dc5c7d1ec13b6cc04b4eb2b5050d957ec39da99faaa05adb4f5dc51d4b"
10591059
}
10601060
]
10611061
},
@@ -1186,14 +1186,14 @@
11861186
"path": "courses/hands-on-with-kimi-code/lessons/L01.md",
11871187
"title": "Lesson 1: Set up Kimi Code, install the FlyPython Skill, fetch the course",
11881188
"summary": "Get Kimi Code running, install the FlyPython Skill with network access approved, and let the agent fetch this course's files — you download nothing. Then make the starter's failure objective.",
1189-
"sha256": "4ea8eadb4e6e2bbf6451dc9700b1cc6779dc00eee2474d4c579b609c972f4e2f"
1189+
"sha256": "40c376c81b7a887e17a986908a8e0fce271c494f9e169bea1dd3b9c19e35bd3b"
11901190
},
11911191
{
11921192
"lang": "zh-CN",
11931193
"path": "courses/hands-on-with-kimi-code/lessons/L01_cn.md",
11941194
"title": "第 1 课:装好 Kimi Code、装上 FlyPython Skill、让 Agent 取回课程",
11951195
"summary": "先把 Kimi Code 跑起来,装好 FlyPython Skill 并打开联网权限,让 Agent 取回本课文件——你不下载任何东西,然后让 starter 的失败变得客观。",
1196-
"sha256": "276b400a542a5436f231fa89739ebc1be795fc49b2cf8700fbf2de478b25f106"
1196+
"sha256": "5bb681bb60e03cbb2145b76bb671ddfd831f3680e1e617efcf637dc93592f6b6"
11971197
}
11981198
]
11991199
},
@@ -1600,14 +1600,14 @@
16001600
"path": "courses/hands-on-with-zcode/lessons/L01.md",
16011601
"title": "Lesson 1: Set up ZCode, install the FlyPython Skill, fetch the course",
16021602
"summary": "Get ZCode running, install the FlyPython Skill with network access approved, and let the agent fetch this course's files — you download nothing. Then make the starter's failure objective.",
1603-
"sha256": "c0ebabcd982edcdfee9360d0b4019d0f139573ab84bcc3ce9b9cfe8b729cbfaf"
1603+
"sha256": "2fbfe9fff71fc209d2b89558f34c47c44985711d02cdb0f7a674db606271e665"
16041604
},
16051605
{
16061606
"lang": "zh-CN",
16071607
"path": "courses/hands-on-with-zcode/lessons/L01_cn.md",
16081608
"title": "第 1 课:装好 ZCode、装上 FlyPython Skill、让 Agent 取回课程",
16091609
"summary": "先把 ZCode 跑起来,装好 FlyPython Skill 并打开联网权限,让 Agent 取回本课文件——你不下载任何东西,然后让 starter 的失败变得客观。",
1610-
"sha256": "2803669b8d5526f585975b8221ccdc5cf661f973f118d853fb7c218cf68472f9"
1610+
"sha256": "1e13ba6f4e3562d25b84de6610cdac2a8fdab4915496181143b179762b6e95d9"
16111611
}
16121612
]
16131613
},

courses/hands-on-python-with-claude-code/lessons/L01.md

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ Install the Claude Code CLI
3333
(`npm install -g @anthropic-ai/claude-code`), create an empty working
3434
folder, and start `claude` in it.
3535

36-
## Step 2 — Install the FlyPython Skill (network included)
36+
## Step 2 — (Optional) Pre-install the FlyPython Skill
37+
38+
Optional: Step 3's entry sentence reads the Skill straight from its
39+
URL, so the course works without this step — pre-installing just saves a
40+
permission round-trip on tools that keep skills between sessions.
3741

3842
Save the Skill as a project skill — run this in the working folder:
3943

@@ -95,8 +99,9 @@ rest of the course:
9599
python verify.py
96100
```
97101

98-
You should see the starter reproduce four real-world failure classes, mapped
99-
to test names:
102+
You should see the starter reproduce five real-world failure classes
103+
plus two end-to-end consequences — seven named failing tests in all —
104+
mapped to test names:
100105

101106
| Failing test | Real-world meaning |
102107
| --- | --- |
@@ -131,7 +136,8 @@ will trigger. Then check yourself against the table above.
131136
Run `python verify.py` in the course folder. You pass this lesson when you
132137
can answer, without looking:
133138

134-
1. Which four behaviors separate starter from solution?
139+
1. Which five behaviors separate starter from solution, and which two
140+
failing tests are their end-to-end consequences?
135141
2. Why does `python verify.py` exit non-zero on purpose — what state is
136142
it reporting, and why is that a success condition rather than an error?
137143
3. What does the row you found in the exercise do to the starter — crash,

courses/hands-on-python-with-claude-code/lessons/L01_cn.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ hints:
3131
`npm install -g @anthropic-ai/claude-code`),新建一个空工作目录,
3232
在里面运行 `claude`
3333

34-
## 第 2 步——装 FlyPython Skill(含联网权限)
34+
## 第 2 步——(可选)预装 FlyPython Skill
35+
36+
这一步可选:第 3 步的开课句子会直接从 URL 读取 Skill,不装也能上课——预装只是省掉一次权限往返。
3537

3638
把 Skill 存为项目级技能——在工作目录里运行:
3739

@@ -88,7 +90,7 @@ starter 缺了哪些。”**
8890
python verify.py
8991
```
9092

91-
你会看到 starter 复现四类真实世界的故障,并与测试名一一对应:
93+
你会看到 starter 复现五类真实世界故障,外加两个端到端后果——共七个具名失败测试——并与测试名一一对应:
9294

9395
| 失败的测试 | 现实含义 |
9496
| --- | --- |
@@ -119,7 +121,7 @@ python verify.py starter --expect-failure
119121
在课程文件夹里运行 `python verify.py`。不看材料能回答下面三个
120122
问题即算通过:
121123

122-
1. 哪四个行为把 starter 和 solution 区分开?
124+
1. 哪五个行为把 starter 和 solution 区分开?其中哪两个失败测试是它们的端到端后果
123125
2. `python verify.py` 为什么故意以非零退出——它在报告什么状态?
124126
为什么这是成功条件而不是报错?
125127
3. 你在练习里找到的那一行会让 starter 崩溃、被隔离,还是悄悄

courses/hands-on-with-cursor/lessons/L01.md

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ in this lesson.
3232
Install Cursor, then `File → Open Folder`
3333
on an empty working folder.
3434

35-
## Step 2 — Install the FlyPython Skill (network included)
35+
## Step 2 — (Optional) Pre-install the FlyPython Skill
36+
37+
Optional: Step 3's entry sentence reads the Skill straight from its
38+
URL, so the course works without this step — pre-installing just saves a
39+
permission round-trip on tools that keep skills between sessions.
3640

3741
Save the Skill as a project rule:
3842

@@ -95,8 +99,9 @@ rest of the course:
9599
python verify.py
96100
```
97101

98-
You should see the starter reproduce four real-world failure classes, mapped
99-
to test names:
102+
You should see the starter reproduce five real-world failure classes
103+
plus two end-to-end consequences — seven named failing tests in all —
104+
mapped to test names:
100105

101106
| Failing test | Real-world meaning |
102107
| --- | --- |
@@ -131,7 +136,8 @@ agent to confirm, not to fix.
131136
Run `python verify.py` in the course folder. You pass this lesson when you
132137
can answer, without looking:
133138

134-
1. Which four behaviors separate starter from solution?
139+
1. Which five behaviors separate starter from solution, and which two
140+
failing tests are their end-to-end consequences?
135141
2. Why does `python verify.py` exit non-zero on purpose — what state is
136142
it reporting, and why is that a success condition rather than an error?
137143
3. What does the row you found in the exercise do to the starter — crash,

courses/hands-on-with-cursor/lessons/L01_cn.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ hints:
3030
安装 Cursor,然后 `File → Open Folder`
3131
打开一个空工作目录。
3232

33-
## 第 2 步——装 FlyPython Skill(含联网权限)
33+
## 第 2 步——(可选)预装 FlyPython Skill
34+
35+
这一步可选:第 3 步的开课句子会直接从 URL 读取 Skill,不装也能上课——预装只是省掉一次权限往返。
3436

3537
把 Skill 存为项目规则:
3638

@@ -88,7 +90,7 @@ starter 缺了哪些。”**
8890
python verify.py
8991
```
9092

91-
你会看到 starter 复现出四类真实世界故障,对应到测试名
93+
你会看到 starter 复现五类真实世界故障,外加两个端到端后果——共七个具名失败测试——并与测试名一一对应
9294

9395
| 失败的测试 | 真实含义 |
9496
| --- | --- |
@@ -121,7 +123,7 @@ Agent 确认,而不是让它修。
121123
在课程文件夹里运行 `python verify.py`。不看材料能回答下面三个
122124
问题即算通过:
123125

124-
1. 哪四个行为把 starter 和 solution 区分开?
126+
1. 哪五个行为把 starter 和 solution 区分开?其中哪两个失败测试是它们的端到端后果
125127
2. `python verify.py` 为什么故意以非零退出——它在报告什么状态?
126128
为什么这是成功条件而不是报错?
127129
3. 你在练习里找到的那一行会让 starter 崩溃、被隔离,还是悄悄

courses/hands-on-with-deepseek-harness/lessons/L01.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@ package from the deepseek-harness project) with a configured model plugin —
3636
an API key or local endpoint you supply — and start a session in an empty
3737
working folder.
3838

39-
## Step 2 — Install the FlyPython Skill (network included)
39+
## Step 2 — (Optional) Pre-install the FlyPython Skill
40+
41+
Optional: Step 3's entry sentence reads the Skill straight from its
42+
URL, so the course works without this step — pre-installing just saves a
43+
permission round-trip on tools that keep skills between sessions.
4044

4145
The harness reads `AGENTS.md` from the project root:
4246

@@ -100,7 +104,8 @@ rest of the course:
100104
python verify.py
101105
```
102106

103-
You should see the starter reproduce four real-world failure classes,
107+
You should see the starter reproduce five real-world failure classes
108+
plus two end-to-end consequences — seven named failing tests in all —
104109
mapped to test names:
105110

106111
| Failing test | Real-world meaning |
@@ -142,7 +147,8 @@ the trajectory step where the agent reached the same conclusion.
142147
Run `python verify.py` in the course folder. You pass this lesson when you
143148
can answer, without looking:
144149

145-
1. Which four behaviors separate starter from solution?
150+
1. Which five behaviors separate starter from solution, and which two
151+
failing tests are their end-to-end consequences?
146152
2. Why does `python verify.py` exit non-zero on purpose — what state is
147153
it reporting, and why is that a success condition rather than an error?
148154
3. Where in the trajectory can you prove the agent actually read

courses/hands-on-with-deepseek-harness/lessons/L01_cn.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ hints:
3333
项目的 Python 包)并配置好模型插件——你自己提供的 API key 或本地
3434
端点——在一个空工作目录里启动会话。
3535

36-
## 第 2 步——装 FlyPython Skill(含联网权限)
36+
## 第 2 步——(可选)预装 FlyPython Skill
37+
38+
这一步可选:第 3 步的开课句子会直接从 URL 读取 Skill,不装也能上课——预装只是省掉一次权限往返。
3739

3840
Harness 会读取项目根目录的 `AGENTS.md`
3941

@@ -91,7 +93,7 @@ starter 缺了哪些。”**
9193
python verify.py
9294
```
9395

94-
你会看到 starter 复现出四类真实世界故障,对应到测试名
96+
你会看到 starter 复现五类真实世界故障,外加两个端到端后果——共七个具名失败测试——并与测试名一一对应
9597

9698
| 失败的测试 | 真实含义 |
9799
| --- | --- |
@@ -127,7 +129,7 @@ Agent 得出相同结论的那一步。
127129
在课程文件夹里运行 `python verify.py`。不看材料能回答下面三个
128130
问题即算通过:
129131

130-
1. 哪四个行为把 starter 和 solution 区分开?
132+
1. 哪五个行为把 starter 和 solution 区分开?其中哪两个失败测试是它们的端到端后果
131133
2. `python verify.py` 为什么故意以非零退出——它在报告什么状态?
132134
为什么这是成功条件而不是报错?
133135
3. 在轨迹的哪个位置能证明 Agent 确实读过 `TASK.md`

courses/hands-on-with-kimi-code/lessons/L01.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ Install the `kimi` CLI and sign in with
3333
your Moonshot/Kimi account or API key, then start `kimi` in an empty
3434
working folder.
3535

36-
## Step 2 — Install the FlyPython Skill (network included)
36+
## Step 2 — (Optional) Pre-install the FlyPython Skill
37+
38+
Optional: Step 3's entry sentence reads the Skill straight from its
39+
URL, so the course works without this step — pre-installing just saves a
40+
permission round-trip on tools that keep skills between sessions.
3741

3842
`kimi` reads `AGENTS.md` from the project root:
3943

@@ -97,7 +101,8 @@ rest of the course:
97101
python verify.py
98102
```
99103

100-
You should see the starter reproduce four real-world failure classes,
104+
You should see the starter reproduce five real-world failure classes
105+
plus two end-to-end consequences — seven named failing tests in all —
101106
mapped to test names:
102107

103108
| Failing test | Real-world meaning |
@@ -133,7 +138,8 @@ row will trigger. Then check yourself against the table above — and have
133138
Run `python verify.py` in the course folder. You pass this lesson when you
134139
can answer, without looking:
135140

136-
1. Which four behaviors separate starter from solution?
141+
1. Which five behaviors separate starter from solution, and which two
142+
failing tests are their end-to-end consequences?
137143
2. Why does `python verify.py` exit non-zero on purpose — what state is
138144
it reporting, and why is that a success condition rather than an error?
139145
3. Which subagent can change files — and which two cannot?

0 commit comments

Comments
 (0)