claude-spinner-verbs 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/LICENSE +21 -0
- package/README.md +121 -0
- package/extensions/spinner-verbs.ts +121 -0
- package/package.json +8 -0
- package/spinner-verbs/action-movie.json +21 -0
- package/spinner-verbs/doc-emrick.json +57 -0
- package/spinner-verbs/game-of-thrones.json +69 -0
- package/spinner-verbs/game-show.json +26 -0
- package/spinner-verbs/lord-of-the-rings.json +23 -0
- package/spinner-verbs/momentum.json +21 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Rob Howley
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Claude Spinner Verbs
|
|
2
|
+
|
|
3
|
+
> "Thinking..." is the most boring thing a genius could say.
|
|
4
|
+
|
|
5
|
+
Customize the text that appears while Claude is working. Replace the default spinner verbs with something that has a little more personality.
|
|
6
|
+
|
|
7
|
+
**Before**: "Thinking...", "Processing...", "Working..." 🥱
|
|
8
|
+
|
|
9
|
+
**After**: "Paying the iron price...", "With fire and blood..." ⚔️🐉
|
|
10
|
+
|
|
11
|
+
All availble themes can be viewed in [/spinner-verbs](https://github.com/robhowley/claude-spinner-verbs/tree/main/spinner-verbs)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Pi Integration
|
|
16
|
+
|
|
17
|
+
If you use [pi](https://pi.dev), install this as a pi package directly from GitHub:
|
|
18
|
+
|
|
19
|
+
```shell
|
|
20
|
+
pi install git:github.com/robhowley/claude-spinner-verbs
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
That's it. The extension registers automatically and picks up your configuration on the next session start.
|
|
24
|
+
|
|
25
|
+
### Switching Themes with `/verbs`
|
|
26
|
+
|
|
27
|
+
Change your verb list at any time during a session:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
/verbs game-of-thrones
|
|
31
|
+
/verbs doc-emrick
|
|
32
|
+
/verbs (default)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Run `/verbs` with no argument to get an interactive picker. Use `(default)` to restore Claude's built-in spinner.
|
|
36
|
+
|
|
37
|
+
### Auto-configure via `settings.json`
|
|
38
|
+
|
|
39
|
+
Set your preferred theme once and forget about it. Pi checks both project-local (`.pi/settings.json`) and global (`~/.pi/agent/settings.json`) settings on session start.
|
|
40
|
+
|
|
41
|
+
**Use a built-in theme by name:**
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"spinnerVerbs": "game-of-thrones"
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Point to your own custom verbs file:**
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"spinnerVerbsFile": "~/my-verbs.json"
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The path supports three forms and is resolved relative to the `settings.json` file that contains it — not relative to your working directory:
|
|
58
|
+
|
|
59
|
+
| Form | Example | Resolved as |
|
|
60
|
+
|------|---------|-------------|
|
|
61
|
+
| `~/...` | `~/my-verbs.json` | Expanded from your home directory |
|
|
62
|
+
| `/absolute/...` | `/etc/my-verbs.json` | Used as-is |
|
|
63
|
+
| `relative/...` | `../my-verbs.json` | Relative to the `settings.json` file's directory |
|
|
64
|
+
|
|
65
|
+
So if your `.pi/settings.json` contains `"spinnerVerbsFile": "../my-verbs.json"`, it resolves to `my-verbs.json` in the project root — not wherever you launched pi from.
|
|
66
|
+
|
|
67
|
+
Your custom file can be a plain JSON array:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
["Brewing coffee...", "Asking the oracle...", "Consulting the void..."]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Priority order**: `--verbs` CLI flag → project `.pi/settings.json` → global `~/.pi/agent/settings.json`
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Claude Code Integration
|
|
78
|
+
|
|
79
|
+
### Quick Start
|
|
80
|
+
|
|
81
|
+
Install any theme with a single command:
|
|
82
|
+
|
|
83
|
+
```shell
|
|
84
|
+
curl -sL https://raw.githubusercontent.com/robhowley/claude-spinner-verbs/main/update-spinner-verbs.sh | bash -s game-of-thrones
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Replace `game-of-thrones` with any theme name from the [`/spinner-verbs`](./spinner-verbs) directory.
|
|
88
|
+
|
|
89
|
+
### How It Works
|
|
90
|
+
|
|
91
|
+
The script will:
|
|
92
|
+
- Download the specified theme
|
|
93
|
+
- Create `.claude/settings.json` if it doesn't exist
|
|
94
|
+
- Merge the spinner verbs into your existing settings
|
|
95
|
+
|
|
96
|
+
### Manual Installation
|
|
97
|
+
|
|
98
|
+
Edit your Claude settings file directly:
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
~/.claude/settings.json # global
|
|
102
|
+
[project-root]/.claude/settings.json # project-specific
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Add the spinner verbs configuration:
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"spinnerVerbs": {
|
|
110
|
+
"mode": "replace",
|
|
111
|
+
"verbs": [
|
|
112
|
+
"Paying the iron price...",
|
|
113
|
+
"What is dead may never die..."
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Modes**:
|
|
120
|
+
- `"replace"` — swap out the defaults entirely
|
|
121
|
+
- `"append"` — add your verbs alongside the defaults
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
|
|
2
|
+
import { readdirSync, readFileSync, existsSync } from "node:fs";
|
|
3
|
+
import { join, dirname, basename } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
|
|
7
|
+
export default function (pi: ExtensionAPI) {
|
|
8
|
+
const dir = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const verbsDir = join(dir, "..", "spinner-verbs");
|
|
10
|
+
|
|
11
|
+
const available = readdirSync(verbsDir)
|
|
12
|
+
.filter((f) => f.endsWith(".json"))
|
|
13
|
+
.map((f) => basename(f, ".json"));
|
|
14
|
+
|
|
15
|
+
const DEFAULT = "(default)";
|
|
16
|
+
const availableWithDefault = [...available, DEFAULT];
|
|
17
|
+
|
|
18
|
+
function loadVerbs(name: string): string[] {
|
|
19
|
+
const data = JSON.parse(readFileSync(join(verbsDir, `${name}.json`), "utf-8"));
|
|
20
|
+
return data?.spinnerVerbs?.verbs ?? data;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
pi.registerFlag("verbs", {
|
|
24
|
+
description: `Spinner verb list (${available.join(", ")})`,
|
|
25
|
+
type: "string",
|
|
26
|
+
default: "(default)",
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
let interval: ReturnType<typeof setInterval> | undefined;
|
|
30
|
+
|
|
31
|
+
function activate(verbs: string[], ctx: ExtensionContext) {
|
|
32
|
+
clearInterval(interval);
|
|
33
|
+
const pick = () => verbs[Math.floor(Math.random() * verbs.length)];
|
|
34
|
+
ctx.ui.setWorkingMessage(`${pick()}...`);
|
|
35
|
+
interval = setInterval(() => ctx.ui.setWorkingMessage(`${pick()}...`), 3000);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function readSettings(settingsPath: string): Record<string, unknown> | undefined {
|
|
39
|
+
if (!existsSync(settingsPath)) return undefined;
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(readFileSync(settingsPath, "utf-8"));
|
|
42
|
+
} catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function resolveVerbs(settingsPath: string): string[] | undefined {
|
|
48
|
+
const settings = readSettings(settingsPath);
|
|
49
|
+
if (!settings) return undefined;
|
|
50
|
+
|
|
51
|
+
const named = settings.spinnerVerbs;
|
|
52
|
+
if (typeof named === "string" && available.includes(named)) {
|
|
53
|
+
return loadVerbs(named);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const filePath = settings.spinnerVerbsFile;
|
|
57
|
+
if (typeof filePath === "string") {
|
|
58
|
+
const resolved = filePath.startsWith("~")
|
|
59
|
+
? join(homedir(), filePath.slice(1))
|
|
60
|
+
: filePath.startsWith("/")
|
|
61
|
+
? filePath
|
|
62
|
+
: join(dirname(settingsPath), filePath);
|
|
63
|
+
if (existsSync(resolved)) {
|
|
64
|
+
try {
|
|
65
|
+
const data = JSON.parse(readFileSync(resolved, "utf-8"));
|
|
66
|
+
const verbs = data?.spinnerVerbs?.verbs ?? data;
|
|
67
|
+
if (Array.isArray(verbs) && verbs.length > 0) return verbs;
|
|
68
|
+
} catch {}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
76
|
+
const flag = pi.getFlag("--verbs") as string;
|
|
77
|
+
const projectSettings = join(ctx.cwd, ".pi", "settings.json");
|
|
78
|
+
const globalSettings = join(homedir(), ".pi", "agent", "settings.json");
|
|
79
|
+
|
|
80
|
+
let verbs: string[] | undefined;
|
|
81
|
+
|
|
82
|
+
if (flag && flag !== "(default)" && available.includes(flag)) {
|
|
83
|
+
verbs = loadVerbs(flag);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
verbs ??= resolveVerbs(projectSettings) ?? resolveVerbs(globalSettings);
|
|
87
|
+
|
|
88
|
+
if (verbs) activate(verbs, ctx);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
pi.registerCommand("verbs", {
|
|
92
|
+
description: "Choose spinner verb list",
|
|
93
|
+
getArgumentCompletions: (prefix: string) => {
|
|
94
|
+
const matches = availableWithDefault
|
|
95
|
+
.filter((v) => v.startsWith(prefix))
|
|
96
|
+
.map((v) => ({ value: v, label: v }));
|
|
97
|
+
return matches.length > 0 ? matches : null;
|
|
98
|
+
},
|
|
99
|
+
handler: async (args, ctx) => {
|
|
100
|
+
const arg = args?.trim();
|
|
101
|
+
if (arg && arg !== DEFAULT && !available.includes(arg)) {
|
|
102
|
+
ctx.ui.notify(`Unknown verb list: ${arg}. Available: ${availableWithDefault.join(", ")}`, "error");
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const choice = arg || await ctx.ui.select("Spinner verbs:", availableWithDefault);
|
|
106
|
+
if (!choice) return;
|
|
107
|
+
if (choice === DEFAULT) {
|
|
108
|
+
clearInterval(interval);
|
|
109
|
+
ctx.ui.setWorkingMessage();
|
|
110
|
+
ctx.ui.notify("Restored default spinner", "info");
|
|
111
|
+
} else {
|
|
112
|
+
activate(loadVerbs(choice), ctx);
|
|
113
|
+
ctx.ui.notify(`Spinner: ${choice}`, "info");
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
pi.on("session_shutdown", () => {
|
|
119
|
+
clearInterval(interval);
|
|
120
|
+
});
|
|
121
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spinnerVerbs": {
|
|
3
|
+
"verbs": [
|
|
4
|
+
"Yippee-ki-yay",
|
|
5
|
+
"I\u2019ll be back",
|
|
6
|
+
"Hasta la vista, baby",
|
|
7
|
+
"Get to the chopper",
|
|
8
|
+
"Say hello to my little friend",
|
|
9
|
+
"Go ahead, make my day",
|
|
10
|
+
"Welcome to the party, pal",
|
|
11
|
+
"I have a particular set of skills",
|
|
12
|
+
"If it bleeds, we can kill it",
|
|
13
|
+
"This is Sparta",
|
|
14
|
+
"Witness me",
|
|
15
|
+
"Shaken, not stirred",
|
|
16
|
+
"Come with me if you want to live",
|
|
17
|
+
"I know kung fu",
|
|
18
|
+
"Dodge this"
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spinnerVerbs": {
|
|
3
|
+
"mode": "replace",
|
|
4
|
+
"verbs": [
|
|
5
|
+
"Shunting",
|
|
6
|
+
"Sliding",
|
|
7
|
+
"Fiddling",
|
|
8
|
+
"Rattling",
|
|
9
|
+
"Forking",
|
|
10
|
+
"Shoveling",
|
|
11
|
+
"Chipping",
|
|
12
|
+
"Poking",
|
|
13
|
+
"Jamming",
|
|
14
|
+
"Ricocheting",
|
|
15
|
+
"Knifing",
|
|
16
|
+
"Tapping",
|
|
17
|
+
"Skipping",
|
|
18
|
+
"Banking",
|
|
19
|
+
"Throwing",
|
|
20
|
+
"Punching",
|
|
21
|
+
"Pushing",
|
|
22
|
+
"Flipping",
|
|
23
|
+
"Dragging",
|
|
24
|
+
"Soccering",
|
|
25
|
+
"Passing",
|
|
26
|
+
"Dandling",
|
|
27
|
+
"Firing",
|
|
28
|
+
"Slashing",
|
|
29
|
+
"Sheathing",
|
|
30
|
+
"Steering",
|
|
31
|
+
"Scoring",
|
|
32
|
+
"Leading",
|
|
33
|
+
"Rifling",
|
|
34
|
+
"Careening",
|
|
35
|
+
"Directing",
|
|
36
|
+
"Hoisting",
|
|
37
|
+
"Pitching",
|
|
38
|
+
"Popping",
|
|
39
|
+
"Swatting",
|
|
40
|
+
"Finessing",
|
|
41
|
+
"Wanding",
|
|
42
|
+
"Banging",
|
|
43
|
+
"Handing",
|
|
44
|
+
"Forcing",
|
|
45
|
+
"Swiping",
|
|
46
|
+
"Plunging",
|
|
47
|
+
"Lobbing",
|
|
48
|
+
"Nudging",
|
|
49
|
+
"Jabbing",
|
|
50
|
+
"Dribbling",
|
|
51
|
+
"Brushing",
|
|
52
|
+
"Weaving",
|
|
53
|
+
"Squibbing",
|
|
54
|
+
"Stashing"
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spinnerVerbs": {
|
|
3
|
+
"mode": "replace",
|
|
4
|
+
"verbs": [
|
|
5
|
+
"Taking the black",
|
|
6
|
+
"Saying the words",
|
|
7
|
+
"Swearing the oath",
|
|
8
|
+
"My watch begins",
|
|
9
|
+
"Standing the watch",
|
|
10
|
+
"Holding the Wall",
|
|
11
|
+
"Manning the Wall",
|
|
12
|
+
"Guarding the realms of men",
|
|
13
|
+
"Going ranging",
|
|
14
|
+
"Sending a raven",
|
|
15
|
+
"Lighting the beacon",
|
|
16
|
+
"Sealing the gates",
|
|
17
|
+
"Paying the iron price",
|
|
18
|
+
"What is dead may never die",
|
|
19
|
+
"Rising again, harder and stronger",
|
|
20
|
+
"Going reaving",
|
|
21
|
+
"Calling the kingsmoot",
|
|
22
|
+
"Crowning a king",
|
|
23
|
+
"Bending the knee",
|
|
24
|
+
"Swearing fealty",
|
|
25
|
+
"Before gods and men",
|
|
26
|
+
"Calling the banners",
|
|
27
|
+
"Holding court",
|
|
28
|
+
"Taking counsel",
|
|
29
|
+
"Passing judgment",
|
|
30
|
+
"Rendering the king's justice",
|
|
31
|
+
"Naming an heir",
|
|
32
|
+
"Naming a Hand",
|
|
33
|
+
"Sitting the Iron Throne",
|
|
34
|
+
"Stripping lands and titles",
|
|
35
|
+
"Sending to the Wall",
|
|
36
|
+
"Winter is coming",
|
|
37
|
+
"The North remembers",
|
|
38
|
+
"The King in the North",
|
|
39
|
+
"Dracarys",
|
|
40
|
+
"Blood of my blood",
|
|
41
|
+
"Breaking the wheel",
|
|
42
|
+
"With fire and blood",
|
|
43
|
+
"Claiming a dragon",
|
|
44
|
+
"Stallion who mounts the world",
|
|
45
|
+
"Words are wind",
|
|
46
|
+
"The night is dark and full of terrors",
|
|
47
|
+
"Valar Morghulis",
|
|
48
|
+
"Valar Dohaeris",
|
|
49
|
+
"A Lannister always pays his debts",
|
|
50
|
+
"For the good of the realm",
|
|
51
|
+
"Chaos is a ladder",
|
|
52
|
+
"Ours is the fury",
|
|
53
|
+
"Growing Strong",
|
|
54
|
+
"Hear Me Roar",
|
|
55
|
+
"As High as Honor",
|
|
56
|
+
"Unbowed, Unbent, Unbroken",
|
|
57
|
+
"Family, duty, honor",
|
|
58
|
+
"By the old gods and the new",
|
|
59
|
+
"By your leave",
|
|
60
|
+
"Bread and salt",
|
|
61
|
+
"Trial by combat",
|
|
62
|
+
"We do not sow",
|
|
63
|
+
"Night gathers",
|
|
64
|
+
"I pledge my life and honor",
|
|
65
|
+
"For this night and all the nights to come",
|
|
66
|
+
"Khaleesi commands"
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spinnerVerbs": {
|
|
3
|
+
"verbs": [
|
|
4
|
+
"Come on down",
|
|
5
|
+
"Survey says",
|
|
6
|
+
"Is that your final answer",
|
|
7
|
+
"Show me the money",
|
|
8
|
+
"Big money no whammies",
|
|
9
|
+
"Spin the wheel",
|
|
10
|
+
"Let\u2019s make a deal",
|
|
11
|
+
"You are the weakest link",
|
|
12
|
+
"The tribe has spoken",
|
|
13
|
+
"Deal or no deal",
|
|
14
|
+
"Lock it in",
|
|
15
|
+
"Phone a friend",
|
|
16
|
+
"Ask the audience",
|
|
17
|
+
"Press your luck",
|
|
18
|
+
"Higher or lower",
|
|
19
|
+
"Pass or play",
|
|
20
|
+
"Top answer on the board",
|
|
21
|
+
"The envelope please",
|
|
22
|
+
"The moment of truth",
|
|
23
|
+
"Jackpot"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spinnerVerbs": {
|
|
3
|
+
"verbs": [
|
|
4
|
+
"One does not simply",
|
|
5
|
+
"You shall not pass",
|
|
6
|
+
"So it begins",
|
|
7
|
+
"The beacons are lit",
|
|
8
|
+
"Gondor calls for aid",
|
|
9
|
+
"And Rohan will answer",
|
|
10
|
+
"A wizard is never late",
|
|
11
|
+
"The board is set",
|
|
12
|
+
"The pieces are moving",
|
|
13
|
+
"A red sun rises",
|
|
14
|
+
"The road goes ever on",
|
|
15
|
+
"For Frodo",
|
|
16
|
+
"My precious",
|
|
17
|
+
"All we have to decide",
|
|
18
|
+
"This day we fight",
|
|
19
|
+
"Boil \u2019em, mash \u2019em, stick \u2019em in a stew",
|
|
20
|
+
"Looks like meat\u2019s back on the menu, boys"
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spinnerVerbs": {
|
|
3
|
+
"verbs": [
|
|
4
|
+
"Making moves\u2026",
|
|
5
|
+
"Spinning up\u2026",
|
|
6
|
+
"Getting traction\u2026",
|
|
7
|
+
"Lighting the fuse\u2026",
|
|
8
|
+
"Cranking up\u2026",
|
|
9
|
+
"Getting the ball rolling\u2026",
|
|
10
|
+
"Kicking things off\u2026",
|
|
11
|
+
"Setting things in motion\u2026",
|
|
12
|
+
"Rolling out\u2026",
|
|
13
|
+
"Booting up\u2026",
|
|
14
|
+
"Firing it up\u2026",
|
|
15
|
+
"Taking shape\u2026",
|
|
16
|
+
"In motion\u2026",
|
|
17
|
+
"Coming together\u2026",
|
|
18
|
+
"Making it happen\u2026"
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
}
|