@human-avatar/skills-for-humanity 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/.claude-plugin/plugin.json +22 -0
- package/README.md +451 -0
- package/bin/install.js +271 -0
- package/package.json +41 -0
- package/skills/aesthetic/SKILL.md +80 -0
- package/skills/aesthetic-coherence-check/SKILL.md +92 -0
- package/skills/aesthetic-elegance-testing/SKILL.md +96 -0
- package/skills/aesthetic-pattern-detection/SKILL.md +93 -0
- package/skills/aesthetic-simplicity-analysis/SKILL.md +97 -0
- package/skills/analogy/SKILL.md +80 -0
- package/skills/analogy-boundary-testing/SKILL.md +90 -0
- package/skills/analogy-domain-transfer/SKILL.md +87 -0
- package/skills/analogy-perspective-shifting/SKILL.md +84 -0
- package/skills/analogy-structure-mapping/SKILL.md +88 -0
- package/skills/communication/SKILL.md +78 -0
- package/skills/communication-audience-modeling/SKILL.md +82 -0
- package/skills/communication-clarity-audit/SKILL.md +88 -0
- package/skills/communication-medium-selection/SKILL.md +89 -0
- package/skills/communication-objection-mapping/SKILL.md +87 -0
- package/skills/constraint/SKILL.md +78 -0
- package/skills/constraint-hardness-testing/SKILL.md +94 -0
- package/skills/constraint-rule-inversion/SKILL.md +77 -0
- package/skills/constraint-scope-reduction/SKILL.md +84 -0
- package/skills/constraint-workaround-mapping/SKILL.md +88 -0
- package/skills/creativity/SKILL.md +173 -0
- package/skills/creativity-alternatives/SKILL.md +84 -0
- package/skills/creativity-assumption-excavator/SKILL.md +95 -0
- package/skills/creativity-brainstorm/SKILL.md +102 -0
- package/skills/creativity-concept-fan/SKILL.md +93 -0
- package/skills/creativity-consider-factors/SKILL.md +87 -0
- package/skills/creativity-lateral-thinking/SKILL.md +77 -0
- package/skills/creativity-other-perspectives/SKILL.md +91 -0
- package/skills/creativity-plus-minus-interesting/SKILL.md +80 -0
- package/skills/creativity-provocation/SKILL.md +79 -0
- package/skills/creativity-random-entry/SKILL.md +74 -0
- package/skills/creativity-six-hats/SKILL.md +84 -0
- package/skills/creativity-water-logic/SKILL.md +79 -0
- package/skills/decision/SKILL.md +78 -0
- package/skills/decision-criteria-weighting/SKILL.md +88 -0
- package/skills/decision-option-mapping/SKILL.md +93 -0
- package/skills/decision-premortem-analysis/SKILL.md +86 -0
- package/skills/decision-reversibility-analysis/SKILL.md +88 -0
- package/skills/emotional/SKILL.md +78 -0
- package/skills/emotional-motivation-mapping/SKILL.md +95 -0
- package/skills/emotional-resistance-diagnosis/SKILL.md +96 -0
- package/skills/emotional-stakes-mapping/SKILL.md +98 -0
- package/skills/emotional-trust-audit/SKILL.md +96 -0
- package/skills/ethics/SKILL.md +130 -0
- package/skills/ethics-bias-check/SKILL.md +90 -0
- package/skills/ethics-check/SKILL.md +86 -0
- package/skills/ethics-consent-review/SKILL.md +104 -0
- package/skills/ethics-council/SKILL.md +219 -0
- package/skills/ethics-crisis-triage/SKILL.md +113 -0
- package/skills/ethics-data-audit/SKILL.md +87 -0
- package/skills/ethics-empathy-circle/SKILL.md +108 -0
- package/skills/ethics-impact-scan/SKILL.md +90 -0
- package/skills/ethics-vendor-review/SKILL.md +97 -0
- package/skills/game-theory/SKILL.md +59 -0
- package/skills/game-theory-auction/SKILL.md +96 -0
- package/skills/game-theory-coalition/SKILL.md +84 -0
- package/skills/game-theory-equilibrium/SKILL.md +73 -0
- package/skills/game-theory-iterated/SKILL.md +83 -0
- package/skills/game-theory-mechanism-design/SKILL.md +85 -0
- package/skills/game-theory-prisoners-dilemma/SKILL.md +81 -0
- package/skills/game-theory-signaling/SKILL.md +72 -0
- package/skills/historical/SKILL.md +78 -0
- package/skills/historical-cycle-detection/SKILL.md +102 -0
- package/skills/historical-failure-analysis/SKILL.md +96 -0
- package/skills/historical-lesson-extraction/SKILL.md +97 -0
- package/skills/historical-precedent-analysis/SKILL.md +96 -0
- package/skills/human/SKILL.md +128 -0
- package/skills/identity/SKILL.md +66 -0
- package/skills/identity-character-testing/SKILL.md +76 -0
- package/skills/identity-mission-alignment/SKILL.md +74 -0
- package/skills/identity-values-clarification/SKILL.md +68 -0
- package/skills/logic/SKILL.md +112 -0
- package/skills/logic-argument-validation/SKILL.md +92 -0
- package/skills/logic-causality-mapping/SKILL.md +121 -0
- package/skills/logic-check/SKILL.md +92 -0
- package/skills/logic-consistency-check/SKILL.md +96 -0
- package/skills/logic-constraint-mapping/SKILL.md +105 -0
- package/skills/logic-council/SKILL.md +158 -0
- package/skills/logic-fixer/SKILL.md +94 -0
- package/skills/narrative/SKILL.md +78 -0
- package/skills/narrative-audience-modeling/SKILL.md +65 -0
- package/skills/narrative-frame-analysis/SKILL.md +66 -0
- package/skills/narrative-structure-mapping/SKILL.md +70 -0
- package/skills/narrative-tension-mapping/SKILL.md +62 -0
- package/skills/play/SKILL.md +80 -0
- package/skills/play-constraint-inversion/SKILL.md +97 -0
- package/skills/play-perspective-reversal/SKILL.md +101 -0
- package/skills/play-stimulus-generation/SKILL.md +101 -0
- package/skills/play-worst-case-reversal/SKILL.md +94 -0
- package/skills/probability/SKILL.md +78 -0
- package/skills/probability-base-rate-anchoring/SKILL.md +66 -0
- package/skills/probability-confidence-calibration/SKILL.md +73 -0
- package/skills/probability-expected-value-calculation/SKILL.md +69 -0
- package/skills/probability-scenario-weighting/SKILL.md +66 -0
- package/skills/resource/SKILL.md +78 -0
- package/skills/resource-allocation-analysis/SKILL.md +71 -0
- package/skills/resource-bottleneck-analysis/SKILL.md +76 -0
- package/skills/resource-leverage-mapping/SKILL.md +69 -0
- package/skills/resource-waste-audit/SKILL.md +80 -0
- package/skills/sensory/SKILL.md +68 -0
- package/skills/sensory-detail-mining/SKILL.md +70 -0
- package/skills/sensory-signal-detection/SKILL.md +68 -0
- package/skills/sensory-structured-observation/SKILL.md +73 -0
- package/skills/social/SKILL.md +78 -0
- package/skills/social-coalition-mapping/SKILL.md +74 -0
- package/skills/social-dynamics-analysis/SKILL.md +80 -0
- package/skills/social-incentive-analysis/SKILL.md +76 -0
- package/skills/social-power-mapping/SKILL.md +67 -0
- package/skills/strategy/SKILL.md +54 -0
- package/skills/strategy-alliance/SKILL.md +67 -0
- package/skills/strategy-deception/SKILL.md +60 -0
- package/skills/strategy-force-economy/SKILL.md +63 -0
- package/skills/strategy-intelligence/SKILL.md +65 -0
- package/skills/strategy-positioning/SKILL.md +62 -0
- package/skills/strategy-terrain/SKILL.md +64 -0
- package/skills/strategy-timing/SKILL.md +64 -0
- package/skills/strategy-victory/SKILL.md +64 -0
- package/skills/systems/SKILL.md +78 -0
- package/skills/systems-archetype-matching/SKILL.md +72 -0
- package/skills/systems-emergence-detection/SKILL.md +65 -0
- package/skills/systems-feedback-mapping/SKILL.md +67 -0
- package/skills/systems-leverage-analysis/SKILL.md +65 -0
- package/skills/temporal/SKILL.md +78 -0
- package/skills/temporal-cycle-detection/SKILL.md +75 -0
- package/skills/temporal-futures-mapping/SKILL.md +63 -0
- package/skills/temporal-horizon-mapping/SKILL.md +65 -0
- package/skills/temporal-timing-analysis/SKILL.md +67 -0
- package/skills/writing/SKILL.md +115 -0
- package/skills/writing-arc-design/SKILL.md +68 -0
- package/skills/writing-argument/SKILL.md +79 -0
- package/skills/writing-audience-calibration/SKILL.md +72 -0
- package/skills/writing-character-development/SKILL.md +72 -0
- package/skills/writing-copy/SKILL.md +83 -0
- package/skills/writing-dialogue/SKILL.md +86 -0
- package/skills/writing-executive-summary/SKILL.md +68 -0
- package/skills/writing-inconsistency-audit/SKILL.md +94 -0
- package/skills/writing-line-editing/SKILL.md +87 -0
- package/skills/writing-plot-structure/SKILL.md +65 -0
- package/skills/writing-pov/SKILL.md +72 -0
- package/skills/writing-prose-elevation/SKILL.md +82 -0
- package/skills/writing-report/SKILL.md +65 -0
- package/skills/writing-restructure/SKILL.md +71 -0
- package/skills/writing-rhetoric/SKILL.md +90 -0
- package/skills/writing-scene-construction/SKILL.md +79 -0
- package/skills/writing-technical/SKILL.md +94 -0
- package/skills/writing-tone-alignment/SKILL.md +72 -0
- package/skills/writing-voice-consistency/SKILL.md +74 -0
- package/skills/writing-worldbuilding/SKILL.md +59 -0
package/bin/install.js
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const os = require('os');
|
|
7
|
+
const readline = require('readline');
|
|
8
|
+
|
|
9
|
+
// ANSI colors — suppressed when not a TTY
|
|
10
|
+
const isTTY = process.stdout.isTTY;
|
|
11
|
+
const bold = isTTY ? '\x1b[1m' : '';
|
|
12
|
+
const dim = isTTY ? '\x1b[2m' : '';
|
|
13
|
+
const green = isTTY ? '\x1b[32m' : '';
|
|
14
|
+
const cyan = isTTY ? '\x1b[36m' : '';
|
|
15
|
+
const yellow = isTTY ? '\x1b[33m' : '';
|
|
16
|
+
const red = isTTY ? '\x1b[31m' : '';
|
|
17
|
+
const reset = isTTY ? '\x1b[0m' : '';
|
|
18
|
+
|
|
19
|
+
function log(msg = '') { process.stdout.write(msg + '\n'); }
|
|
20
|
+
function err(msg) { process.stderr.write(`${red}error:${reset} ${msg}\n`); }
|
|
21
|
+
function warn(msg) { process.stderr.write(`${yellow}warn:${reset} ${msg}\n`); }
|
|
22
|
+
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Scope resolution
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
const SCOPES = {
|
|
28
|
+
user: {
|
|
29
|
+
label: 'User',
|
|
30
|
+
description: 'available in all projects',
|
|
31
|
+
pluginsDir: path.join(os.homedir(), '.claude', 'plugins', 'skills-for-humanity'),
|
|
32
|
+
settingsPath: path.join(os.homedir(), '.claude', 'settings.json'),
|
|
33
|
+
},
|
|
34
|
+
project: {
|
|
35
|
+
label: 'Project',
|
|
36
|
+
description: `this project only ${dim}(${process.cwd()})${reset}`,
|
|
37
|
+
pluginsDir: path.join(process.cwd(), '.claude', 'plugins', 'skills-for-humanity'),
|
|
38
|
+
settingsPath: path.join(process.cwd(), '.claude', 'settings.json'),
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const SKILLS_SRC = path.join(__dirname, '..', 'skills');
|
|
43
|
+
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Argument parsing
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
|
|
48
|
+
const args = process.argv.slice(2);
|
|
49
|
+
|
|
50
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
51
|
+
log(`
|
|
52
|
+
${bold}skills-for-humanity${reset} — 93 structured thinking tools for Claude Code
|
|
53
|
+
|
|
54
|
+
${bold}Usage:${reset}
|
|
55
|
+
npx @human-avatar/skills-for-humanity [options]
|
|
56
|
+
|
|
57
|
+
${bold}Options:${reset}
|
|
58
|
+
${cyan}--scope user|project${reset} Install scope (prompted if omitted)
|
|
59
|
+
${dim}user: ~/.claude/ — all projects${reset}
|
|
60
|
+
${dim}project: ./.claude/ — this project only${reset}
|
|
61
|
+
${cyan}--dir <path>${reset} Install to a custom directory (skips scope prompt)
|
|
62
|
+
${cyan}--uninstall${reset} Remove skills and clean up settings.json
|
|
63
|
+
${cyan}--help${reset} Show this help message
|
|
64
|
+
|
|
65
|
+
${bold}After install:${reset}
|
|
66
|
+
Restart Claude Code and type ${cyan}/human${reset} to get started.
|
|
67
|
+
Or jump straight to a category: ${cyan}/ethics${reset} ${cyan}/logic${reset} ${cyan}/creativity${reset}
|
|
68
|
+
`);
|
|
69
|
+
process.exit(0);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Helpers
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
|
|
76
|
+
function copyDir(src, dest) {
|
|
77
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
78
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
79
|
+
const s = path.join(src, entry.name);
|
|
80
|
+
const d = path.join(dest, entry.name);
|
|
81
|
+
entry.isDirectory() ? copyDir(s, d) : fs.copyFileSync(s, d);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function removeDir(dir) {
|
|
86
|
+
if (fs.existsSync(dir)) fs.rmSync(dir, { recursive: true, force: true });
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function readSettings(settingsPath) {
|
|
90
|
+
if (!fs.existsSync(settingsPath)) return {};
|
|
91
|
+
try { return JSON.parse(fs.readFileSync(settingsPath, 'utf8')); }
|
|
92
|
+
catch { return {}; }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function writeSettings(settingsPath, settings) {
|
|
96
|
+
fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
|
|
97
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function countDirs(dir) {
|
|
101
|
+
try { return fs.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).length; }
|
|
102
|
+
catch { return '?'; }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function prompt(question) {
|
|
106
|
+
return new Promise((resolve) => {
|
|
107
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
108
|
+
rl.question(question, (answer) => { rl.close(); resolve(answer.trim()); });
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function askScope() {
|
|
113
|
+
log(`${bold}Where should the skills be installed?${reset}`);
|
|
114
|
+
log();
|
|
115
|
+
log(` ${cyan}1) User${reset} — available in all projects ${dim}(~/.claude/)${reset}`);
|
|
116
|
+
log(` ${cyan}2) Project${reset} — this project only ${dim}(./.claude/)${reset}`);
|
|
117
|
+
log();
|
|
118
|
+
|
|
119
|
+
while (true) {
|
|
120
|
+
const answer = await prompt(`Enter ${cyan}1${reset} or ${cyan}2${reset}: `);
|
|
121
|
+
if (answer === '1') return 'user';
|
|
122
|
+
if (answer === '2') return 'project';
|
|
123
|
+
log(`${yellow}Please enter 1 or 2.${reset}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Resolve scope + paths
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
|
|
131
|
+
async function resolveTarget() {
|
|
132
|
+
// --dir takes precedence, skips scope prompt entirely
|
|
133
|
+
const dirFlag = args.indexOf('--dir');
|
|
134
|
+
if (dirFlag !== -1 && args[dirFlag + 1]) {
|
|
135
|
+
const custom = path.resolve(args[dirFlag + 1]);
|
|
136
|
+
// For custom dirs, write settings next to the dir's .claude parent if it exists,
|
|
137
|
+
// otherwise fall back to user settings.
|
|
138
|
+
const customSettings = path.join(path.dirname(custom), 'settings.json');
|
|
139
|
+
return { pluginsDir: custom, settingsPath: customSettings };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// --scope flag skips the interactive prompt
|
|
143
|
+
const scopeFlag = args.indexOf('--scope');
|
|
144
|
+
if (scopeFlag !== -1 && args[scopeFlag + 1]) {
|
|
145
|
+
const key = args[scopeFlag + 1].toLowerCase();
|
|
146
|
+
if (!SCOPES[key]) {
|
|
147
|
+
err(`Unknown scope "${key}". Use "user" or "project".`);
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
return SCOPES[key];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Non-interactive fallback (CI, pipes)
|
|
154
|
+
if (!isTTY) return SCOPES.user;
|
|
155
|
+
|
|
156
|
+
// Interactive prompt
|
|
157
|
+
const key = await askScope();
|
|
158
|
+
log();
|
|
159
|
+
return SCOPES[key];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// Uninstall
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
|
|
166
|
+
async function uninstall() {
|
|
167
|
+
log();
|
|
168
|
+
log(`${bold}Uninstalling skills-for-humanity…${reset}`);
|
|
169
|
+
log();
|
|
170
|
+
|
|
171
|
+
const target = await resolveTarget();
|
|
172
|
+
|
|
173
|
+
removeDir(target.pluginsDir);
|
|
174
|
+
log(`${green}✓${reset} Removed ${dim}${target.pluginsDir}${reset}`);
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
const settings = readSettings(target.settingsPath);
|
|
178
|
+
if (Array.isArray(settings.pluginDirectories)) {
|
|
179
|
+
const before = settings.pluginDirectories.length;
|
|
180
|
+
settings.pluginDirectories = settings.pluginDirectories.filter(
|
|
181
|
+
(d) => path.resolve(d) !== path.resolve(target.pluginsDir)
|
|
182
|
+
);
|
|
183
|
+
if (settings.pluginDirectories.length < before) {
|
|
184
|
+
writeSettings(target.settingsPath, settings);
|
|
185
|
+
log(`${green}✓${reset} Removed from ${dim}${target.settingsPath}${reset}`);
|
|
186
|
+
} else {
|
|
187
|
+
log(`${dim}→ Not found in settings — nothing to remove${reset}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
} catch (e) {
|
|
191
|
+
warn(`Could not update settings.json: ${e.message}`);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
log();
|
|
195
|
+
log(`${dim}Uninstall complete.${reset}`);
|
|
196
|
+
log();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
// Install
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
|
|
203
|
+
async function install() {
|
|
204
|
+
log();
|
|
205
|
+
log(`${bold}${cyan}skills-for-humanity${reset}`);
|
|
206
|
+
log(`${dim}93 structured thinking tools for Claude Code${reset}`);
|
|
207
|
+
log();
|
|
208
|
+
|
|
209
|
+
const target = await resolveTarget();
|
|
210
|
+
const { pluginsDir, settingsPath } = target;
|
|
211
|
+
|
|
212
|
+
// 1. Copy skills
|
|
213
|
+
const isUpdate = fs.existsSync(pluginsDir);
|
|
214
|
+
log(`${isUpdate ? 'Updating' : 'Installing'} skills to ${yellow}${pluginsDir}${reset}…`);
|
|
215
|
+
|
|
216
|
+
try {
|
|
217
|
+
copyDir(SKILLS_SRC, pluginsDir);
|
|
218
|
+
log(`${green}✓${reset} Skills ${isUpdate ? 'updated' : 'installed'} (${countDirs(pluginsDir)} skills)`);
|
|
219
|
+
} catch (e) {
|
|
220
|
+
err(`Could not copy skills: ${e.message}`);
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// 2. Register in settings.json
|
|
225
|
+
try {
|
|
226
|
+
const settings = readSettings(settingsPath);
|
|
227
|
+
if (!Array.isArray(settings.pluginDirectories)) settings.pluginDirectories = [];
|
|
228
|
+
|
|
229
|
+
const already = settings.pluginDirectories.some(
|
|
230
|
+
(d) => path.resolve(d) === path.resolve(pluginsDir)
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
if (!already) {
|
|
234
|
+
settings.pluginDirectories.push(pluginsDir);
|
|
235
|
+
writeSettings(settingsPath, settings);
|
|
236
|
+
log(`${green}✓${reset} Registered in ${dim}${settingsPath}${reset}`);
|
|
237
|
+
} else {
|
|
238
|
+
log(`${dim}→ Already registered in ${settingsPath}${reset}`);
|
|
239
|
+
}
|
|
240
|
+
} catch (e) {
|
|
241
|
+
warn(`Could not update settings.json: ${e.message}`);
|
|
242
|
+
log();
|
|
243
|
+
log(`Add this to ${yellow}${settingsPath}${reset} manually:`);
|
|
244
|
+
log(` ${dim}{ "pluginDirectories": ["${pluginsDir}"] }${reset}`);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// 3. Done
|
|
248
|
+
log();
|
|
249
|
+
log(`${bold}Done.${reset} Restart Claude Code, then:`);
|
|
250
|
+
log(` ${cyan}/human${reset} ${dim}— route to the right skill from all 93${reset}`);
|
|
251
|
+
log(` ${cyan}/ethics${reset} ${dim}— ethical analysis${reset}`);
|
|
252
|
+
log(` ${cyan}/logic${reset} ${dim}— validate and pressure-test reasoning${reset}`);
|
|
253
|
+
log(` ${cyan}/creativity${reset} ${dim}— de Bono suite + brainstorm${reset}`);
|
|
254
|
+
log(` ${cyan}/decision${reset} ${dim}— premortem, criteria weighting, option mapping${reset}`);
|
|
255
|
+
log();
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
// Entry
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
|
|
262
|
+
(async () => {
|
|
263
|
+
if (args.includes('--uninstall')) {
|
|
264
|
+
await uninstall();
|
|
265
|
+
} else {
|
|
266
|
+
await install();
|
|
267
|
+
}
|
|
268
|
+
})().catch((e) => {
|
|
269
|
+
err(e.message);
|
|
270
|
+
process.exit(1);
|
|
271
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@human-avatar/skills-for-humanity",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "93 structured thinking tools for Claude Code — logic, ethics, creativity, decision-making, systems thinking, and more.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"claude-code",
|
|
7
|
+
"claude-code-plugin",
|
|
8
|
+
"thinking-tools",
|
|
9
|
+
"mental-models",
|
|
10
|
+
"reasoning",
|
|
11
|
+
"decision-making",
|
|
12
|
+
"cognitive-frameworks",
|
|
13
|
+
"problem-solving",
|
|
14
|
+
"systems-thinking",
|
|
15
|
+
"ethics",
|
|
16
|
+
"creativity",
|
|
17
|
+
"ai-tools"
|
|
18
|
+
],
|
|
19
|
+
"homepage": "https://github.com/human-avatar/skills-for-humanity",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/human-avatar/skills-for-humanity.git"
|
|
23
|
+
},
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/human-avatar/skills-for-humanity/issues"
|
|
26
|
+
},
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"author": "Finn Fitzsimons <fitzsimons.finn@gmail.com>",
|
|
29
|
+
"bin": {
|
|
30
|
+
"skills-for-humanity": "./bin/install.js"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"skills/",
|
|
34
|
+
"bin/",
|
|
35
|
+
"README.md",
|
|
36
|
+
".claude-plugin/"
|
|
37
|
+
],
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=18"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aesthetic
|
|
3
|
+
description: "Entry point for the aesthetic toolkit. Routes to the right aesthetic skill based on your situation. Use when you say 'aesthetic', 'check the design', 'does this feel right', 'is this elegant', 'is this too complex', 'what pattern is this', 'find the simpler version', or want an aesthetic lens applied without knowing which specific tool fits."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Aesthetic
|
|
7
|
+
|
|
8
|
+
Applies aesthetic reasoning to any artifact — design, writing, code, product, argument. Diagnoses what kind of aesthetic question is being asked and applies the right tool.
|
|
9
|
+
|
|
10
|
+
## Which tool fits
|
|
11
|
+
|
|
12
|
+
| You need to... | Tool |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Check whether parts form a unified whole | coherence-check |
|
|
15
|
+
| Test whether something is more complex than it needs to be | elegance-testing |
|
|
16
|
+
| Name the underlying structural pattern at work | pattern-detection |
|
|
17
|
+
| Find the simpler version while preserving what matters | simplicity-analysis |
|
|
18
|
+
|
|
19
|
+
## Routing Decision
|
|
20
|
+
|
|
21
|
+
- **Something feels off, jarring, or inconsistent** → coherence-check
|
|
22
|
+
- **Something feels over-engineered or baroque** → elegance-testing
|
|
23
|
+
- **You want to understand *why* something works (or doesn't)** → pattern-detection
|
|
24
|
+
- **You want to strip something back to its core** → simplicity-analysis
|
|
25
|
+
- **Unclear** → start with coherence-check; it usually surfaces which other question needs answering
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Confirm Direction
|
|
30
|
+
|
|
31
|
+
After diagnosing which tool fits, present the recommendation before executing:
|
|
32
|
+
|
|
33
|
+
> My read: **[diagnosed tool]** — one sentence on why it fits.
|
|
34
|
+
|
|
35
|
+
- **A) Yes, run that tool**
|
|
36
|
+
- **B) Show me all options** — list every skill in this category with one-line descriptions
|
|
37
|
+
- **C) Quick version** — lighter-weight alternative for this situation, if one exists
|
|
38
|
+
- **D) Re-diagnose** — describe the situation differently for a second read
|
|
39
|
+
|
|
40
|
+
Wait for their selection before proceeding.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Coherence Check
|
|
45
|
+
|
|
46
|
+
*Tests whether the parts form a unified whole.*
|
|
47
|
+
|
|
48
|
+
Map all major elements of the artifact. For each: what design decision does it express? Ask: are these decisions speaking the same language — or were they made independently, without reference to each other? Name each incoherence specifically. Classify: surface incoherence (fixable with small changes) vs. structural incoherence (requires rethinking something fundamental).
|
|
49
|
+
|
|
50
|
+
**Output:** List of incoherences ranked by severity. For each: what it is, where it appears, what it conflicts with, and how to resolve it.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Elegance Testing
|
|
55
|
+
|
|
56
|
+
*Tests whether something is more complex than it needs to be.*
|
|
57
|
+
|
|
58
|
+
Separate necessary complexity (required by the problem) from accidental complexity (accreted over time, added as hedging, or left over from old requirements). For each layer of complexity: could the same job be done without it? What would be lost? Apply the minimum surface principle — is every part earning its place?
|
|
59
|
+
|
|
60
|
+
**Output:** Complexity audit — each complex element classified as necessary or accidental, with a cost estimate for removing it.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Pattern Detection
|
|
65
|
+
|
|
66
|
+
*Identifies the underlying formal pattern.*
|
|
67
|
+
|
|
68
|
+
Look past the surface. What structural form does this follow? Name candidate patterns. Test each: does the structure actually match, or just superficially resemble it? Once identified: what does naming the pattern unlock? What's the established playbook for this form?
|
|
69
|
+
|
|
70
|
+
**Output:** Named pattern, evidence for the identification, what the pattern predicts or implies, and the playbook it suggests.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Simplicity Analysis
|
|
75
|
+
|
|
76
|
+
*Finds the simpler version while preserving what matters.*
|
|
77
|
+
|
|
78
|
+
First: what is the core? The irreducible thing this artifact must do or be. Now audit everything else against that core: does each element serve it, or distract from it? For everything that doesn't serve the core, ask whether it was added for a reason that's still valid.
|
|
79
|
+
|
|
80
|
+
**Output:** What the core is. What can go. What should stay but be simplified. The simplest version that still does the full job.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aesthetic-coherence-check
|
|
3
|
+
description: "Tests whether the parts of something form a unified whole — finding the jarring inconsistencies that accumulate when different contributors work without a shared vision. TRIGGERS: 'coherence check', 'does this feel unified', 'something feels off', 'inconsistent', 'check the whole', 'does this hang together'."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Aesthetic Coherence Check
|
|
7
|
+
|
|
8
|
+
Incoherence is the default product of collaboration without a shared vision. Each part
|
|
9
|
+
may be locally defensible — sensible in isolation, reasonable given what that contributor
|
|
10
|
+
was optimising for — while the whole communicates nothing clearly. A perceptive reader
|
|
11
|
+
or user feels this before they can name it. This skill makes the incoherence legible
|
|
12
|
+
so it can be fixed.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Your Process
|
|
17
|
+
|
|
18
|
+
**Step 1: State the Artefact and Its Intended Identity**
|
|
19
|
+
What is being examined — a product, document, strategy, brand, presentation, process?
|
|
20
|
+
What identity or effect is it supposed to produce? "Should feel authoritative but
|
|
21
|
+
approachable" or "Should communicate a single strategic bet" or "Should make a
|
|
22
|
+
first-time user feel capable in under three minutes." The intended identity is the
|
|
23
|
+
standard everything else will be measured against.
|
|
24
|
+
|
|
25
|
+
**Step 2: Examine Each Part**
|
|
26
|
+
Break the artefact into its major components. For each: what does it communicate?
|
|
27
|
+
What does it prioritise implicitly — speed vs depth, confidence vs humility,
|
|
28
|
+
complexity vs accessibility? What does it assume about the audience or context?
|
|
29
|
+
Extract these qualities as observations, not evaluations.
|
|
30
|
+
|
|
31
|
+
**Step 3: Compare Parts to Each Other**
|
|
32
|
+
Where do assumptions conflict across parts? A section written for technical readers
|
|
33
|
+
next to one written for executives. A formal tone in one component, casual in another.
|
|
34
|
+
A design that prioritises simplicity in navigation but complexity in content. Name
|
|
35
|
+
the specific conflict, not just that something feels inconsistent.
|
|
36
|
+
|
|
37
|
+
**Step 4: Compare Parts to the Whole**
|
|
38
|
+
Which parts are faithful to the intended identity? Which stray — and in what
|
|
39
|
+
direction? Is the straying random (different contributors with different instincts)
|
|
40
|
+
or directional (a competing version of what the thing should be is quietly winning
|
|
41
|
+
in parts of it)?
|
|
42
|
+
|
|
43
|
+
**Step 5: Identify the Most Jarring Inconsistencies**
|
|
44
|
+
Find 2-3 specific moments where the lack of coherence is most damaging — where a
|
|
45
|
+
perceptive reader or user would feel something is wrong, even if they can't say why.
|
|
46
|
+
Prioritise by impact on the intended identity.
|
|
47
|
+
|
|
48
|
+
**Step 6: Recommended Adjustments**
|
|
49
|
+
For each jarring inconsistency: what specific change — to which part, in which
|
|
50
|
+
direction — would bring it into alignment with the intended identity?
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Human Check-in
|
|
55
|
+
|
|
56
|
+
Before proceeding, ask the user:
|
|
57
|
+
|
|
58
|
+
**How do you want to run this?**
|
|
59
|
+
|
|
60
|
+
- **A) Full analysis** — complete all steps, reasoning shown throughout
|
|
61
|
+
- **B) Key findings only** — bottom-line output, skip step-by-step detail
|
|
62
|
+
- **C) Incoherence only** — where the parts fail to form a whole, skip confirming what works
|
|
63
|
+
- **D) Refine the framing** — adjust what we're analyzing before starting
|
|
64
|
+
|
|
65
|
+
Proceed based on their choice.
|
|
66
|
+
|
|
67
|
+
## Output Format
|
|
68
|
+
|
|
69
|
+
**Intended Identity:** [what the artefact is supposed to be/feel/communicate]
|
|
70
|
+
|
|
71
|
+
**Parts Assessed**
|
|
72
|
+
|
|
73
|
+
| Part | What It Communicates | What It Prioritises | What It Assumes |
|
|
74
|
+
|---|---|---|---|
|
|
75
|
+
| [component] | [signal it sends] | [implicit value] | [audience/context assumption] |
|
|
76
|
+
|
|
77
|
+
**Inconsistencies**
|
|
78
|
+
|
|
79
|
+
| Inconsistency | What Conflicts | Why It Jars | Recommended Adjustment |
|
|
80
|
+
|---|---|---|---|
|
|
81
|
+
| [name it precisely] | [the specific conflict] | [effect on the reader/user] | [what to change] |
|
|
82
|
+
|
|
83
|
+
**Overall Coherence Assessment:** [unified / partially coherent / incoherent + rationale]
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Notes
|
|
88
|
+
|
|
89
|
+
Coherence is not uniformity — contrast and tension can serve a unified vision. The
|
|
90
|
+
question is whether every element is working toward the same intended identity, even
|
|
91
|
+
if they take different forms to do it. The most common source of incoherence is not
|
|
92
|
+
bad judgment but absent shared vision — people optimised locally for different things.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aesthetic-elegance-testing
|
|
3
|
+
description: "Tests whether a solution is more complex than it needs to be — distinguishing necessary complexity from accidental complexity that accreted over time. TRIGGERS: 'elegance test', 'is this too complex', 'over-engineered', 'is there a simpler way', 'does this feel right'."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Aesthetic Elegance Testing
|
|
7
|
+
|
|
8
|
+
Complexity is the default outcome of design by committee, incremental revision, and
|
|
9
|
+
deference to edge cases. Each addition is locally defensible. The cumulative result is
|
|
10
|
+
a system no one would have designed on purpose. Elegance is not simplicity for its own
|
|
11
|
+
sake — it is the property of a solution where every element earns its place and nothing
|
|
12
|
+
obscures the core. This skill tests for that property.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Your Process
|
|
17
|
+
|
|
18
|
+
**Step 1: State the Solution**
|
|
19
|
+
Describe the design, plan, system, or solution in enough detail to evaluate its parts.
|
|
20
|
+
If it's a process, name the steps. If it's a system, name the components. If it's a
|
|
21
|
+
strategy, name the moves.
|
|
22
|
+
|
|
23
|
+
**Step 2: Define the Irreducible Core**
|
|
24
|
+
What is the minimum that does the job? State in one sentence what the solution must
|
|
25
|
+
accomplish to succeed. Every element that doesn't directly serve this core is a
|
|
26
|
+
candidate for removal. If you can't state the core in one sentence, the solution may
|
|
27
|
+
not have one — which is itself a finding.
|
|
28
|
+
|
|
29
|
+
**Step 3: Element Audit**
|
|
30
|
+
For each component, mechanism, layer, or step: is it necessary for the core job, or
|
|
31
|
+
did it accrete over time to handle edge cases, satisfy stakeholder requests, hedge
|
|
32
|
+
against unlikely scenarios, or address problems that may not exist? Label each
|
|
33
|
+
clearly: **necessary** or **accreted**.
|
|
34
|
+
|
|
35
|
+
**Step 4: Concept Count**
|
|
36
|
+
How many distinct concepts must a new person learn to understand and use this
|
|
37
|
+
solution fully? Elegant solutions have fewer. Count them explicitly. Compare against
|
|
38
|
+
the irreducible minimum — the number of concepts required if every accreted element
|
|
39
|
+
were removed. The gap is the complexity overhead.
|
|
40
|
+
|
|
41
|
+
**Step 5: Thirty-Second Explanation Test**
|
|
42
|
+
Can you explain the solution in 30 seconds to someone intelligent but unfamiliar
|
|
43
|
+
with it? Attempt the explanation. If it requires more than 30 seconds, complexity
|
|
44
|
+
may be genuine — or it may be a sign the design hasn't been thought through clearly
|
|
45
|
+
enough to be simple. Both are worth knowing.
|
|
46
|
+
|
|
47
|
+
**Step 6: Sources of Unnecessary Complexity**
|
|
48
|
+
For each accreted element: what introduced it, and what would removing it cost? Some
|
|
49
|
+
removals are free — the element was pure noise. Some involve real trade-offs — the
|
|
50
|
+
element serves a secondary purpose worth naming. Distinguish them explicitly.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Human Check-in
|
|
55
|
+
|
|
56
|
+
Before proceeding, ask the user:
|
|
57
|
+
|
|
58
|
+
**How do you want to run this?**
|
|
59
|
+
|
|
60
|
+
- **A) Full analysis** — complete all steps, reasoning shown throughout
|
|
61
|
+
- **B) Key findings only** — bottom-line output, skip step-by-step detail
|
|
62
|
+
- **C) Accidental complexity only** — what could be removed without losing anything that matters
|
|
63
|
+
- **D) Refine the framing** — adjust what we're analyzing before starting
|
|
64
|
+
|
|
65
|
+
Proceed based on their choice.
|
|
66
|
+
|
|
67
|
+
## Output Format
|
|
68
|
+
|
|
69
|
+
**Core Job:** [one sentence — what the solution must accomplish to succeed]
|
|
70
|
+
|
|
71
|
+
**Element Audit**
|
|
72
|
+
|
|
73
|
+
| Element | Necessary or Accreted | Rationale |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| [component/mechanism/step] | [necessary / accreted] | [why it does or doesn't serve the core] |
|
|
76
|
+
|
|
77
|
+
**Concept Count:** [n currently required] vs [n at irreducible minimum] — overhead: [gap]
|
|
78
|
+
|
|
79
|
+
**30-Second Explanation Test:** [pass / fail — include the actual attempt]
|
|
80
|
+
|
|
81
|
+
**Sources of Unnecessary Complexity**
|
|
82
|
+
|
|
83
|
+
| Accreted Element | How It Was Introduced | Cost of Removal |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| [element] | [origin] | [what is lost if removed] |
|
|
86
|
+
|
|
87
|
+
**Recommended Simplifications:** [specific removals or reductions, with trade-offs named]
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Notes
|
|
92
|
+
|
|
93
|
+
The question is not "can we defend every element" but "does every element earn its
|
|
94
|
+
place." Elements that can be defended are not the same as elements that are necessary
|
|
95
|
+
— hold the higher bar. Elegance is achieved not when there is nothing left to add,
|
|
96
|
+
but when there is nothing left to remove.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aesthetic-pattern-detection
|
|
3
|
+
description: "Identifies the underlying formal pattern at work — because most successful designs, arguments, and solutions share deep structural patterns, and naming the pattern unlocks the playbook. TRIGGERS: 'what pattern is this', 'pattern recognition', 'why does this work', 'identify the form', 'what structure is at play', 'what archetype is this'."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Aesthetic Pattern Detection
|
|
7
|
+
|
|
8
|
+
Surface features differ — colours, words, technologies, industries. Formal patterns
|
|
9
|
+
recur across all of them. The same structural moves that make a symphony compelling
|
|
10
|
+
make a strategy compelling. The same tension-and-resolution arc that drives a thriller
|
|
11
|
+
drives a great pitch. Naming the pattern reveals options that surface-level analysis
|
|
12
|
+
cannot, because once the pattern is named, its full playbook becomes available.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Your Process
|
|
17
|
+
|
|
18
|
+
**Step 1: Describe the Thing**
|
|
19
|
+
What does it do and how does it feel to engage with it? Focus on behaviour and
|
|
20
|
+
effect, not surface features — not "it uses blue and white" but "it creates calm
|
|
21
|
+
authority that builds confidence incrementally." Describe the experience of it.
|
|
22
|
+
|
|
23
|
+
**Step 2: Identify Formal Patterns Present**
|
|
24
|
+
Work through this list systematically — multiple patterns often operate simultaneously:
|
|
25
|
+
- **Repetition/Rhythm** — recurring elements that create expectation, then satisfy
|
|
26
|
+
or productively subvert it
|
|
27
|
+
- **Symmetry/Asymmetry** — balance creates stability and trust; deliberate
|
|
28
|
+
asymmetry creates tension and dynamism
|
|
29
|
+
- **Hierarchy** — clear ordering from most to least important, large to small,
|
|
30
|
+
general to specific; guides attention
|
|
31
|
+
- **Contrast** — sharp differences that create definition, focus attention, and
|
|
32
|
+
make meaning by comparison
|
|
33
|
+
- **Tension/Resolution** — a problem introduced and resolved, a question posed and
|
|
34
|
+
answered; the engine of narrative
|
|
35
|
+
- **Figure/Ground** — a subject made vivid and clear by what surrounds and recedes
|
|
36
|
+
- **Part/Whole** — components that build into something greater than their sum
|
|
37
|
+
|
|
38
|
+
**Step 3: Match to Domain Archetypes**
|
|
39
|
+
Which archetypes from design, storytelling, architecture, or music does this
|
|
40
|
+
resemble? The hero's journey. The fugue. The golden section. Thesis-antithesis-
|
|
41
|
+
synthesis. Call and response. Name the archetype and its source domain.
|
|
42
|
+
|
|
43
|
+
**Step 4: Name the Pattern**
|
|
44
|
+
Give the dominant pattern a precise name. Test: does naming it make the thing more
|
|
45
|
+
legible? Does it reveal why certain elements work and why others feel off? A good
|
|
46
|
+
pattern name is generative — it produces new options, not just descriptions.
|
|
47
|
+
|
|
48
|
+
**Step 5: Apply the Pattern**
|
|
49
|
+
What does the pattern imply for what should come next? What is currently in the
|
|
50
|
+
artefact that violates the pattern — and is that violation intentional (productive
|
|
51
|
+
tension) or accidental (incoherence)?
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Human Check-in
|
|
56
|
+
|
|
57
|
+
Before proceeding, ask the user:
|
|
58
|
+
|
|
59
|
+
**How do you want to run this?**
|
|
60
|
+
|
|
61
|
+
- **A) Full analysis** — complete all steps, reasoning shown throughout
|
|
62
|
+
- **B) Key findings only** — bottom-line output, skip step-by-step detail
|
|
63
|
+
- **C) Pattern name only** — identify and name the underlying structure, skip full analysis
|
|
64
|
+
- **D) Refine the framing** — adjust what we're analyzing before starting
|
|
65
|
+
|
|
66
|
+
Proceed based on their choice.
|
|
67
|
+
|
|
68
|
+
## Output Format
|
|
69
|
+
|
|
70
|
+
**Formal Patterns Present:** [list each pattern with one sentence on how it manifests]
|
|
71
|
+
|
|
72
|
+
**Archetype Match:** [closest domain archetype + which domain it comes from]
|
|
73
|
+
|
|
74
|
+
**Pattern Name:** [precise name for the dominant pattern]
|
|
75
|
+
|
|
76
|
+
**What Naming It Reveals:** [what becomes visible or legible that wasn't before]
|
|
77
|
+
|
|
78
|
+
**Pattern Implications**
|
|
79
|
+
|
|
80
|
+
| Implication | Description |
|
|
81
|
+
|---|---|
|
|
82
|
+
| What should come next | [the move the pattern calls for] |
|
|
83
|
+
| What is violating the pattern | [specific elements that break it] |
|
|
84
|
+
| Intentional or accidental | [productive subversion or incoherence] |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Notes
|
|
89
|
+
|
|
90
|
+
Not every successful thing follows a single pattern cleanly — most operate with
|
|
91
|
+
several simultaneously. Identify the dominant pattern first; note secondary patterns
|
|
92
|
+
separately. The test of a good pattern name is whether it generates new options
|
|
93
|
+
rather than just describing what's already there.
|