diff --git a/cursorless-talon/src/cursorless.py b/cursorless-talon/src/cursorless.py
index df3ea7832e..842e7a4292 100644
--- a/cursorless-talon/src/cursorless.py
+++ b/cursorless-talon/src/cursorless.py
@@ -34,7 +34,7 @@ def private_cursorless_show_command_statistics():
def private_cursorless_start_tutorial():
"""Start the introductory Cursorless tutorial"""
actions.user.private_cursorless_run_rpc_command_no_wait(
- "cursorless.tutorial.start", "1-introduction"
+ "cursorless.tutorial.start", "introduction"
)
def private_cursorless_tutorial_next():
diff --git a/packages/app-web-docs/src/docs/user/tutorial/README.mdx b/packages/app-web-docs/src/docs/user/tutorial/README.mdx
index ddbedf3e64..6505be2864 100644
--- a/packages/app-web-docs/src/docs/user/tutorial/README.mdx
+++ b/packages/app-web-docs/src/docs/user/tutorial/README.mdx
@@ -6,11 +6,11 @@ To follow along interactively, focus VS Code and say `"cursorless tutorial"`.
## 1. Introduction
-[Start Introduction](./1-introduction.mdx) - This tutorial will teach you the basics of Cursorless.
+[Start Introduction](./introduction.mdx) - This tutorial will teach you the basics of Cursorless.
## 2. Basic coding
-[Start Basic coding](./2-basic-coding.mdx) - This tutorial will teach you the basics of coding with Cursorless.
+[Start Basic coding](./basic-coding.mdx) - This tutorial will teach you the basics of coding with Cursorless.
## Use the interactive tutorial
diff --git a/packages/app-web-docs/src/docs/user/tutorial/2-basic-coding.mdx b/packages/app-web-docs/src/docs/user/tutorial/basic-coding.mdx
similarity index 72%
rename from packages/app-web-docs/src/docs/user/tutorial/2-basic-coding.mdx
rename to packages/app-web-docs/src/docs/user/tutorial/basic-coding.mdx
index 0e1257b79e..7b2520d5ae 100644
--- a/packages/app-web-docs/src/docs/user/tutorial/2-basic-coding.mdx
+++ b/packages/app-web-docs/src/docs/user/tutorial/basic-coding.mdx
@@ -1,5 +1,5 @@
import { RecordedTestVisualizer, RecordedTestVisualizerOptions, RecordedTestVisualizerProvider } from "@site/src/docs/components/RecordedTestVisualizer";
-import recordedTests from "./fixtures/2-basic-coding.json";
+import recordedTests from "./fixtures/basic-coding.json";
# 2. Basic coding
@@ -13,7 +13,7 @@ This tutorial will teach you the basics of coding with Cursorless.
When editing code, we often think in terms of statements, functions, etc. Let's clone a statement: `"clone state sit"`
-
+
## Step 2
@@ -21,31 +21,31 @@ Cursorless tries its best to keep your commands short.
In the following command, we just say "string" once, but Cursorless infers that both targets are strings: `"swap string air with whale"`
-
+
## Step 3
Great. Let's learn a new action. The "pour" action lets you start editing a new line below any line on your screen: `"pour urge"`
-
+
## Step 4
Now let's try applying a Cursorless action to the current line: `"dedent this"`
-
+
## Step 5
Code reuse is a fact of life as a programmer. Cursorless makes this easy with the "bring" command: `"bring state urge"`
-
+
## Step 6
"bring" also works with two targets just like "swap": `"bring blue cap to value red"`
-
+
## Step 7
@@ -53,7 +53,7 @@ Cursorless tries its best to use its knowledge of programming languages to leave
Note how it cleans up the comma here: `"chuck arg blue vest"`
-
+
## Step 8
diff --git a/packages/app-web-docs/src/docs/user/tutorial/fixtures/2-basic-coding.json b/packages/app-web-docs/src/docs/user/tutorial/fixtures/basic-coding.json
similarity index 99%
rename from packages/app-web-docs/src/docs/user/tutorial/fixtures/2-basic-coding.json
rename to packages/app-web-docs/src/docs/user/tutorial/fixtures/basic-coding.json
index 3fa913c0f1..505e63a4b9 100644
--- a/packages/app-web-docs/src/docs/user/tutorial/fixtures/2-basic-coding.json
+++ b/packages/app-web-docs/src/docs/user/tutorial/fixtures/basic-coding.json
@@ -1,7 +1,7 @@
[
{
- "path": "tutorial/2-basic-coding/cloneStateInk.yml",
- "name": "tutorial/2-basic-coding/cloneStateInk",
+ "path": "tutorial/basic-coding/cloneStateInk.yml",
+ "name": "tutorial/basic-coding/cloneStateInk",
"fixture": {
"languageId": "python",
"command": {
@@ -1547,8 +1547,8 @@
}
},
{
- "path": "tutorial/2-basic-coding/swapStringAirWithWhale.yml",
- "name": "tutorial/2-basic-coding/swapStringAirWithWhale",
+ "path": "tutorial/basic-coding/swapStringAirWithWhale.yml",
+ "name": "tutorial/basic-coding/swapStringAirWithWhale",
"fixture": {
"languageId": "python",
"command": {
@@ -3211,8 +3211,8 @@
}
},
{
- "path": "tutorial/2-basic-coding/pourUrge.yml",
- "name": "tutorial/2-basic-coding/pourUrge",
+ "path": "tutorial/basic-coding/pourUrge.yml",
+ "name": "tutorial/basic-coding/pourUrge",
"fixture": {
"languageId": "python",
"command": {
@@ -4848,8 +4848,8 @@
}
},
{
- "path": "tutorial/2-basic-coding/dedentThis.yml",
- "name": "tutorial/2-basic-coding/dedentThis",
+ "path": "tutorial/basic-coding/dedentThis.yml",
+ "name": "tutorial/basic-coding/dedentThis",
"fixture": {
"languageId": "python",
"command": {
@@ -6472,8 +6472,8 @@
}
},
{
- "path": "tutorial/2-basic-coding/bringStateUrge.yml",
- "name": "tutorial/2-basic-coding/bringStateUrge",
+ "path": "tutorial/basic-coding/bringStateUrge.yml",
+ "name": "tutorial/basic-coding/bringStateUrge",
"fixture": {
"languageId": "python",
"command": {
@@ -8148,8 +8148,8 @@
}
},
{
- "path": "tutorial/2-basic-coding/bringBlueCapToValueRisk.yml",
- "name": "tutorial/2-basic-coding/bringBlueCapToValueRisk",
+ "path": "tutorial/basic-coding/bringBlueCapToValueRisk.yml",
+ "name": "tutorial/basic-coding/bringBlueCapToValueRisk",
"fixture": {
"languageId": "python",
"command": {
@@ -9871,8 +9871,8 @@
}
},
{
- "path": "tutorial/2-basic-coding/chuckArgueBlueVest.yml",
- "name": "tutorial/2-basic-coding/chuckArgueBlueVest",
+ "path": "tutorial/basic-coding/chuckArgueBlueVest.yml",
+ "name": "tutorial/basic-coding/chuckArgueBlueVest",
"fixture": {
"languageId": "python",
"command": {
diff --git a/packages/app-web-docs/src/docs/user/tutorial/fixtures/1-introduction.json b/packages/app-web-docs/src/docs/user/tutorial/fixtures/introduction.json
similarity index 98%
rename from packages/app-web-docs/src/docs/user/tutorial/fixtures/1-introduction.json
rename to packages/app-web-docs/src/docs/user/tutorial/fixtures/introduction.json
index 5db7a48cdc..ae74a6b806 100644
--- a/packages/app-web-docs/src/docs/user/tutorial/fixtures/1-introduction.json
+++ b/packages/app-web-docs/src/docs/user/tutorial/fixtures/introduction.json
@@ -1,7 +1,7 @@
[
{
- "path": "tutorial/1-introduction/takeCap.yml",
- "name": "tutorial/1-introduction/takeCap",
+ "path": "tutorial/introduction/takeCap.yml",
+ "name": "tutorial/introduction/takeCap",
"fixture": {
"languageId": "plaintext",
"command": {
@@ -629,8 +629,8 @@
}
},
{
- "path": "tutorial/1-introduction/takeBlueSun.yml",
- "name": "tutorial/1-introduction/takeBlueSun",
+ "path": "tutorial/introduction/takeBlueSun.yml",
+ "name": "tutorial/introduction/takeBlueSun",
"fixture": {
"languageId": "plaintext",
"command": {
@@ -1258,8 +1258,8 @@
}
},
{
- "path": "tutorial/1-introduction/takeHarpPastDrum.yml",
- "name": "tutorial/1-introduction/takeHarpPastDrum",
+ "path": "tutorial/introduction/takeHarpPastDrum.yml",
+ "name": "tutorial/introduction/takeHarpPastDrum",
"fixture": {
"languageId": "plaintext",
"command": {
@@ -1910,8 +1910,8 @@
}
},
{
- "path": "tutorial/1-introduction/takeNearAndSun.yml",
- "name": "tutorial/1-introduction/takeNearAndSun",
+ "path": "tutorial/introduction/takeNearAndSun.yml",
+ "name": "tutorial/introduction/takeNearAndSun",
"fixture": {
"languageId": "plaintext",
"command": {
@@ -2572,8 +2572,8 @@
}
},
{
- "path": "tutorial/1-introduction/chuckTrap.yml",
- "name": "tutorial/1-introduction/chuckTrap",
+ "path": "tutorial/introduction/chuckTrap.yml",
+ "name": "tutorial/introduction/chuckTrap",
"fixture": {
"languageId": "plaintext",
"command": {
@@ -3207,8 +3207,8 @@
}
},
{
- "path": "tutorial/1-introduction/chuckLineOdd.yml",
- "name": "tutorial/1-introduction/chuckLineOdd",
+ "path": "tutorial/introduction/chuckLineOdd.yml",
+ "name": "tutorial/introduction/chuckLineOdd",
"fixture": {
"languageId": "plaintext",
"command": {
@@ -3752,8 +3752,8 @@
}
},
{
- "path": "tutorial/1-introduction/takeLine.yml",
- "name": "tutorial/1-introduction/takeLine",
+ "path": "tutorial/introduction/takeLine.yml",
+ "name": "tutorial/introduction/takeLine",
"fixture": {
"languageId": "plaintext",
"command": {
@@ -4187,8 +4187,8 @@
}
},
{
- "path": "tutorial/1-introduction/preUrge.yml",
- "name": "tutorial/1-introduction/preUrge",
+ "path": "tutorial/introduction/preUrge.yml",
+ "name": "tutorial/introduction/preUrge",
"fixture": {
"languageId": "plaintext",
"command": {
@@ -4620,8 +4620,8 @@
}
},
{
- "path": "tutorial/1-introduction/postAir.yml",
- "name": "tutorial/1-introduction/postAir",
+ "path": "tutorial/introduction/postAir.yml",
+ "name": "tutorial/introduction/postAir",
"fixture": {
"languageId": "plaintext",
"command": {
@@ -5053,8 +5053,8 @@
}
},
{
- "path": "tutorial/1-introduction/changeSit.yml",
- "name": "tutorial/1-introduction/changeSit",
+ "path": "tutorial/introduction/changeSit.yml",
+ "name": "tutorial/introduction/changeSit",
"fixture": {
"languageId": "plaintext",
"command": {
diff --git a/packages/app-web-docs/src/docs/user/tutorial/1-introduction.mdx b/packages/app-web-docs/src/docs/user/tutorial/introduction.mdx
similarity index 64%
rename from packages/app-web-docs/src/docs/user/tutorial/1-introduction.mdx
rename to packages/app-web-docs/src/docs/user/tutorial/introduction.mdx
index 6ff32d8afd..27088cbda7 100644
--- a/packages/app-web-docs/src/docs/user/tutorial/1-introduction.mdx
+++ b/packages/app-web-docs/src/docs/user/tutorial/introduction.mdx
@@ -1,5 +1,5 @@
import { RecordedTestVisualizer, RecordedTestVisualizerOptions, RecordedTestVisualizerProvider } from "@site/src/docs/components/RecordedTestVisualizer";
-import recordedTests from "./fixtures/1-introduction.json";
+import recordedTests from "./fixtures/introduction.json";
# 1. Introduction
@@ -13,7 +13,7 @@ This tutorial will teach you the basics of Cursorless.
Say `"take cap"`
-
+
## Step 2
@@ -21,7 +21,7 @@ Well done! 🙌 You just used the code word for 'c', "cap", to refer to the word
When a hat is not gray, we say its color: say `"take blue sun"`
-
+
## Step 3
@@ -29,7 +29,7 @@ Selecting a single token is great, but often we need something bigger.
Say `"take harp past drum"` to select a range.
-
+
## Step 4
@@ -37,13 +37,13 @@ Despite its name, one of the most powerful aspects of Cursorless is the ability
Let's try that: `"take near and sun"`
-
+
## Step 5
But let's show that Cursorless can live up to its name: we can say `"chuck trap"` to delete a word without ever moving our cursor.
-
+
## Step 6
@@ -51,31 +51,31 @@ Tokens are great, but they're just one way to think of a document.
Let's try working with lines: `"chuck line odd"`
-
+
## Step 7
We can also use "line" to refer to the line containing our cursor: `"take line"`
-
+
## Step 8
You now know how to select and delete; let's give you a couple more actions to play with: say "pre" to place the cursor before a target, as in `"pre urge"`
-
+
## Step 9
Say "post" to place the cursor after a target: `"post air"`
-
+
## Step 10
Say "change" to delete a word and move your cursor to where it used to be: `"change sit"`
-
+
## Step 11
@@ -85,4 +85,4 @@ And that wraps up unit 1 of the Cursorless tutorial! Next time, we'll write some
## Next tutorial: 2. Basic coding
-[Continue to Basic coding](./2-basic-coding.mdx) - This tutorial will teach you the basics of coding with Cursorless.
+[Continue to Basic coding](./basic-coding.mdx) - This tutorial will teach you the basics of coding with Cursorless.
diff --git a/packages/lib-common/src/tutorials/tutorial2BasicCoding.ts b/packages/lib-common/src/tutorials/tutorialBasicCoding.ts
similarity index 95%
rename from packages/lib-common/src/tutorials/tutorial2BasicCoding.ts
rename to packages/lib-common/src/tutorials/tutorialBasicCoding.ts
index 23b220c0a4..3170b11e26 100644
--- a/packages/lib-common/src/tutorials/tutorial2BasicCoding.ts
+++ b/packages/lib-common/src/tutorials/tutorialBasicCoding.ts
@@ -1,7 +1,7 @@
import type { RawTutorialContent } from "./tutorial.types";
-export const tutorial2BasicCoding: RawTutorialContent = {
- id: "2-basic-coding",
+export const tutorialBasicCoding: RawTutorialContent = {
+ id: "basic-coding",
title: "Basic coding",
description:
"This tutorial will teach you the basics of coding with Cursorless.",
diff --git a/packages/lib-common/src/tutorials/tutorial1Introduction.ts b/packages/lib-common/src/tutorials/tutorialIntroduction.ts
similarity index 95%
rename from packages/lib-common/src/tutorials/tutorial1Introduction.ts
rename to packages/lib-common/src/tutorials/tutorialIntroduction.ts
index 3b012c4e72..15cd83edeb 100644
--- a/packages/lib-common/src/tutorials/tutorial1Introduction.ts
+++ b/packages/lib-common/src/tutorials/tutorialIntroduction.ts
@@ -3,8 +3,8 @@ import type { RawTutorialContent } from "./tutorial.types";
const wrapsUp =
"And that wraps up unit 1 of the Cursorless tutorial! Next time, we'll write some code 🙌.";
-export const tutorial1Introduction: RawTutorialContent = {
- id: "1-introduction",
+export const tutorialIntroduction: RawTutorialContent = {
+ id: "introduction",
title: "Introduction",
description: "This tutorial will teach you the basics of Cursorless.",
steps: [
diff --git a/packages/lib-common/src/tutorials/tutorial3Visualization.ts b/packages/lib-common/src/tutorials/tutorialVisualization.ts
similarity index 92%
rename from packages/lib-common/src/tutorials/tutorial3Visualization.ts
rename to packages/lib-common/src/tutorials/tutorialVisualization.ts
index a136554df7..ebffe2b196 100644
--- a/packages/lib-common/src/tutorials/tutorial3Visualization.ts
+++ b/packages/lib-common/src/tutorials/tutorialVisualization.ts
@@ -1,7 +1,7 @@
import type { RawTutorialContent } from "./tutorial.types";
-export const tutorial3Visualization: RawTutorialContent = {
- id: "3-visualization",
+export const tutorialVisualization: RawTutorialContent = {
+ id: "visualization",
title: "Visualization",
description:
"This tutorial will teach you how to visualize different scopes in Cursorless.",
diff --git a/packages/lib-common/src/tutorials/tutorials.test.ts b/packages/lib-common/src/tutorials/tutorials.test.ts
index 880211bb9b..19e26727d7 100644
--- a/packages/lib-common/src/tutorials/tutorials.test.ts
+++ b/packages/lib-common/src/tutorials/tutorials.test.ts
@@ -5,11 +5,22 @@ suite("tutorials", () => {
test("filters tutorials by context", () => {
assert.deepEqual(
getTutorialsForContext("documentation").map(({ id }) => id),
- ["1-introduction", "2-basic-coding"],
+ ["introduction", "basic-coding"],
);
assert.deepEqual(
getTutorialsForContext("interactive").map(({ id }) => id),
- ["1-introduction", "2-basic-coding", "3-visualization"],
+ ["introduction", "basic-coding", "visualization"],
+ );
+ });
+
+ test("assigns positions from tutorial order", () => {
+ assert.deepEqual(
+ getTutorialsForContext("interactive").map(({ position }) => position),
+ [1, 2, 3],
+ );
+ assert.deepEqual(
+ getTutorialsForContext("documentation").map(({ position }) => position),
+ [1, 2],
);
});
diff --git a/packages/lib-common/src/tutorials/tutorials.ts b/packages/lib-common/src/tutorials/tutorials.ts
index c06bc298f3..369311b939 100644
--- a/packages/lib-common/src/tutorials/tutorials.ts
+++ b/packages/lib-common/src/tutorials/tutorials.ts
@@ -1,45 +1,36 @@
-import type { TutorialId } from "..";
import type {
RawTutorialContent,
ResolvedTutorialContent,
TutorialContext,
} from "./tutorial.types";
-import { tutorial1Introduction } from "./tutorial1Introduction";
-import { tutorial2BasicCoding } from "./tutorial2BasicCoding";
-import { tutorial3Visualization } from "./tutorial3Visualization";
+import { tutorialBasicCoding } from "./tutorialBasicCoding";
+import { tutorialIntroduction } from "./tutorialIntroduction";
+import { tutorialVisualization } from "./tutorialVisualization";
export const tutorials: RawTutorialContent[] = [
- tutorial1Introduction,
- tutorial2BasicCoding,
- tutorial3Visualization,
+ tutorialIntroduction,
+ tutorialBasicCoding,
+ tutorialVisualization,
];
export function getTutorialsForContext(
context: TutorialContext,
): ResolvedTutorialContent[] {
- return tutorials
- .filter((tutorial) => tutorial.excludeIn?.includes(context) !== true)
- .map((tutorial) => ({
- ...tutorial,
- position: parseTutorialPosition(tutorial.id),
- steps: tutorial.steps.map((step) => {
- const content =
- typeof step === "string" || Array.isArray(step)
- ? step
- : step[context];
+ return (
+ tutorials
+ .map((tutorial, index) => ({
+ ...tutorial,
+ position: index + 1,
+ steps: tutorial.steps.map((step) => {
+ const content =
+ typeof step === "string" || Array.isArray(step)
+ ? step
+ : step[context];
- return Array.isArray(content) ? content.join("\n") : content;
- }),
- }));
-}
-
-function parseTutorialPosition(id: TutorialId) {
- const match = id.match(/^(?\d+)-.+$/u);
- const position = match?.groups?.position;
-
- if (position == null) {
- throw new Error(`Invalid tutorial fixture id: ${id}`);
- }
-
- return Number(position);
+ return Array.isArray(content) ? content.join("\n") : content;
+ }),
+ }))
+ // Need to be done at the end so the index is correct for each tutorial
+ .filter((tutorial) => tutorial.excludeIn?.includes(context) !== true)
+ );
}
diff --git a/packages/lib-common/src/types/tutorial.types.ts b/packages/lib-common/src/types/tutorial.types.ts
index 45084ab75b..0cf1e68555 100644
--- a/packages/lib-common/src/types/tutorial.types.ts
+++ b/packages/lib-common/src/types/tutorial.types.ts
@@ -1,7 +1,4 @@
-export type TutorialId =
- | "1-introduction"
- | "2-basic-coding"
- | "3-visualization";
+export type TutorialId = "introduction" | "basic-coding" | "visualization";
interface BaseTutorialInfo {
id: TutorialId;
diff --git a/packages/test-vscode-e2e/src/suite/tutorial/tutorial.vscode.test.ts b/packages/test-vscode-e2e/src/suite/tutorial/tutorial.vscode.test.ts
index b863859549..c223e2de18 100644
--- a/packages/test-vscode-e2e/src/suite/tutorial/tutorial.vscode.test.ts
+++ b/packages/test-vscode-e2e/src/suite/tutorial/tutorial.vscode.test.ts
@@ -30,7 +30,7 @@ suite("tutorial", function () {
);
});
-const INTRODUCTION_TUTORIAL_ID = "1-introduction";
+const INTRODUCTION_TUTORIAL_ID = "introduction";
async function runBasicTutorialTest(spyIde: SpyIDE) {
const { hatTokenMap, takeSnapshot, getTutorialWebviewEventLog, vscodeApi } =
@@ -100,7 +100,7 @@ async function runBasicTutorialTest(spyIde: SpyIDE) {
data: {
type: "doingTutorial",
hasErrors: false,
- id: "1-introduction",
+ id: "introduction",
stepNumber: 0,
stepContent: [
[
@@ -184,19 +184,19 @@ async function runBasicTutorialTest(spyIde: SpyIDE) {
type: "pickingTutorial",
tutorials: [
{
- id: "1-introduction",
+ id: "introduction",
title: "Introduction",
stepCount: 11,
currentStep: 1,
},
{
- id: "2-basic-coding",
+ id: "basic-coding",
title: "Basic coding",
stepCount: 9,
currentStep: 0,
},
{
- id: "3-visualization",
+ id: "visualization",
title: "Visualization",
stepCount: 6,
currentStep: 0,
diff --git a/packages/tool-meta-updater/src/updateTutorialMdx.ts b/packages/tool-meta-updater/src/updateTutorialMdx.ts
index eedcc43cc6..6ffa5f73f3 100644
--- a/packages/tool-meta-updater/src/updateTutorialMdx.ts
+++ b/packages/tool-meta-updater/src/updateTutorialMdx.ts
@@ -44,14 +44,12 @@ export function updateTutorialReadmeMdx(
"",
'To follow along interactively, focus VS Code and say `"cursorless tutorial"`.',
"",
- ...tutorials
- .toSorted((a, b) => a.position - b.position)
- .flatMap((tutorial) => [
- `## ${tutorial.position}. ${tutorial.title}`,
- "",
- `[Start ${tutorial.title}](./${tutorial.id}.mdx) - ${tutorial.description}`,
- "",
- ]),
+ ...tutorials.flatMap((tutorial) => [
+ `## ${tutorial.position}. ${tutorial.title}`,
+ "",
+ `[Start ${tutorial.title}](./${tutorial.id}.mdx) - ${tutorial.description}`,
+ "",
+ ]),
"## Use the interactive tutorial",
"",
"The VS Code sidebar includes an interactive version of these tutorials. Each step shows a command to say and usually advances automatically when you complete it. It uses your custom spoken forms and saves your progress so that you can continue where you left off.",
diff --git a/resources/fixtures/recorded/tutorial/2-basic-coding/bringBlueCapToValueRisk.yml b/resources/fixtures/recorded/tutorial/basic-coding/bringBlueCapToValueRisk.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/2-basic-coding/bringBlueCapToValueRisk.yml
rename to resources/fixtures/recorded/tutorial/basic-coding/bringBlueCapToValueRisk.yml
diff --git a/resources/fixtures/recorded/tutorial/2-basic-coding/bringStateUrge.yml b/resources/fixtures/recorded/tutorial/basic-coding/bringStateUrge.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/2-basic-coding/bringStateUrge.yml
rename to resources/fixtures/recorded/tutorial/basic-coding/bringStateUrge.yml
diff --git a/resources/fixtures/recorded/tutorial/2-basic-coding/chuckArgueBlueVest.yml b/resources/fixtures/recorded/tutorial/basic-coding/chuckArgueBlueVest.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/2-basic-coding/chuckArgueBlueVest.yml
rename to resources/fixtures/recorded/tutorial/basic-coding/chuckArgueBlueVest.yml
diff --git a/resources/fixtures/recorded/tutorial/2-basic-coding/cloneStateInk.yml b/resources/fixtures/recorded/tutorial/basic-coding/cloneStateInk.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/2-basic-coding/cloneStateInk.yml
rename to resources/fixtures/recorded/tutorial/basic-coding/cloneStateInk.yml
diff --git a/resources/fixtures/recorded/tutorial/2-basic-coding/dedentThis.yml b/resources/fixtures/recorded/tutorial/basic-coding/dedentThis.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/2-basic-coding/dedentThis.yml
rename to resources/fixtures/recorded/tutorial/basic-coding/dedentThis.yml
diff --git a/resources/fixtures/recorded/tutorial/2-basic-coding/pourUrge.yml b/resources/fixtures/recorded/tutorial/basic-coding/pourUrge.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/2-basic-coding/pourUrge.yml
rename to resources/fixtures/recorded/tutorial/basic-coding/pourUrge.yml
diff --git a/resources/fixtures/recorded/tutorial/2-basic-coding/swapStringAirWithWhale.yml b/resources/fixtures/recorded/tutorial/basic-coding/swapStringAirWithWhale.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/2-basic-coding/swapStringAirWithWhale.yml
rename to resources/fixtures/recorded/tutorial/basic-coding/swapStringAirWithWhale.yml
diff --git a/resources/fixtures/recorded/tutorial/1-introduction/changeSit.yml b/resources/fixtures/recorded/tutorial/introduction/changeSit.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/1-introduction/changeSit.yml
rename to resources/fixtures/recorded/tutorial/introduction/changeSit.yml
diff --git a/resources/fixtures/recorded/tutorial/1-introduction/chuckLineOdd.yml b/resources/fixtures/recorded/tutorial/introduction/chuckLineOdd.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/1-introduction/chuckLineOdd.yml
rename to resources/fixtures/recorded/tutorial/introduction/chuckLineOdd.yml
diff --git a/resources/fixtures/recorded/tutorial/1-introduction/chuckTrap.yml b/resources/fixtures/recorded/tutorial/introduction/chuckTrap.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/1-introduction/chuckTrap.yml
rename to resources/fixtures/recorded/tutorial/introduction/chuckTrap.yml
diff --git a/resources/fixtures/recorded/tutorial/1-introduction/postAir.yml b/resources/fixtures/recorded/tutorial/introduction/postAir.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/1-introduction/postAir.yml
rename to resources/fixtures/recorded/tutorial/introduction/postAir.yml
diff --git a/resources/fixtures/recorded/tutorial/1-introduction/preUrge.yml b/resources/fixtures/recorded/tutorial/introduction/preUrge.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/1-introduction/preUrge.yml
rename to resources/fixtures/recorded/tutorial/introduction/preUrge.yml
diff --git a/resources/fixtures/recorded/tutorial/1-introduction/takeBlueSun.yml b/resources/fixtures/recorded/tutorial/introduction/takeBlueSun.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/1-introduction/takeBlueSun.yml
rename to resources/fixtures/recorded/tutorial/introduction/takeBlueSun.yml
diff --git a/resources/fixtures/recorded/tutorial/1-introduction/takeCap.yml b/resources/fixtures/recorded/tutorial/introduction/takeCap.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/1-introduction/takeCap.yml
rename to resources/fixtures/recorded/tutorial/introduction/takeCap.yml
diff --git a/resources/fixtures/recorded/tutorial/1-introduction/takeHarpPastDrum.yml b/resources/fixtures/recorded/tutorial/introduction/takeHarpPastDrum.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/1-introduction/takeHarpPastDrum.yml
rename to resources/fixtures/recorded/tutorial/introduction/takeHarpPastDrum.yml
diff --git a/resources/fixtures/recorded/tutorial/1-introduction/takeLine.yml b/resources/fixtures/recorded/tutorial/introduction/takeLine.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/1-introduction/takeLine.yml
rename to resources/fixtures/recorded/tutorial/introduction/takeLine.yml
diff --git a/resources/fixtures/recorded/tutorial/1-introduction/takeNearAndSun.yml b/resources/fixtures/recorded/tutorial/introduction/takeNearAndSun.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/1-introduction/takeNearAndSun.yml
rename to resources/fixtures/recorded/tutorial/introduction/takeNearAndSun.yml
diff --git a/resources/fixtures/recorded/tutorial/3-visualization/flashState.yml b/resources/fixtures/recorded/tutorial/visualization/flashState.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/3-visualization/flashState.yml
rename to resources/fixtures/recorded/tutorial/visualization/flashState.yml
diff --git a/resources/fixtures/recorded/tutorial/3-visualization/highlightNothing.yml b/resources/fixtures/recorded/tutorial/visualization/highlightNothing.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/3-visualization/highlightNothing.yml
rename to resources/fixtures/recorded/tutorial/visualization/highlightNothing.yml
diff --git a/resources/fixtures/recorded/tutorial/3-visualization/highlightState.yml b/resources/fixtures/recorded/tutorial/visualization/highlightState.yml
similarity index 100%
rename from resources/fixtures/recorded/tutorial/3-visualization/highlightState.yml
rename to resources/fixtures/recorded/tutorial/visualization/highlightState.yml