100xprism 2.3.1

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.
Files changed (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +196 -0
  3. package/VERSION +1 -0
  4. package/adapters/antigravity.sh +14 -0
  5. package/adapters/claude-code.sh +160 -0
  6. package/adapters/codex.sh +13 -0
  7. package/adapters/copilot.sh +13 -0
  8. package/adapters/cursor.sh +13 -0
  9. package/adapters/gemini.sh +13 -0
  10. package/adapters/lib/__pycache__/modules.cpython-312.pyc +0 -0
  11. package/adapters/lib/modules.py +592 -0
  12. package/adapters/lib/shared.sh +83 -0
  13. package/adapters/lib/sync_plugins.py +113 -0
  14. package/adapters/windsurf.sh +15 -0
  15. package/bin/100xprism.js +29 -0
  16. package/get.sh +24 -0
  17. package/install-project.sh +82 -0
  18. package/install.sh +281 -0
  19. package/lib/adapters/windows.js +429 -0
  20. package/lib/bootstrap.js +33 -0
  21. package/lib/init.js +19 -0
  22. package/lib/install.js +18 -0
  23. package/lib/migrate.js +52 -0
  24. package/lib/platform.js +22 -0
  25. package/lib/update.js +29 -0
  26. package/modules/_lib/reference.md +77 -0
  27. package/modules/a11y-auditor/SKILL.md +151 -0
  28. package/modules/ab-test-setup/SKILL.md +266 -0
  29. package/modules/ab-test-setup/evals/evals.json +105 -0
  30. package/modules/ab-test-setup/references/sample-size-guide.md +263 -0
  31. package/modules/ab-test-setup/references/test-templates.md +277 -0
  32. package/modules/ad-creative/SKILL.md +362 -0
  33. package/modules/ad-creative/evals/evals.json +90 -0
  34. package/modules/ad-creative/references/generative-tools.md +637 -0
  35. package/modules/ad-creative/references/platform-specs.md +213 -0
  36. package/modules/ai-seo/SKILL.md +398 -0
  37. package/modules/ai-seo/evals/evals.json +90 -0
  38. package/modules/ai-seo/references/content-patterns.md +285 -0
  39. package/modules/ai-seo/references/platform-ranking-factors.md +152 -0
  40. package/modules/analytics-tracking/SKILL.md +309 -0
  41. package/modules/analytics-tracking/evals/evals.json +90 -0
  42. package/modules/analytics-tracking/references/event-library.md +260 -0
  43. package/modules/analytics-tracking/references/ga4-implementation.md +300 -0
  44. package/modules/analytics-tracking/references/gtm-implementation.md +390 -0
  45. package/modules/architect/SKILL.md +282 -0
  46. package/modules/branch/SKILL.md +105 -0
  47. package/modules/churn-prevention/SKILL.md +424 -0
  48. package/modules/churn-prevention/evals/evals.json +93 -0
  49. package/modules/churn-prevention/references/cancel-flow-patterns.md +316 -0
  50. package/modules/churn-prevention/references/dunning-playbook.md +408 -0
  51. package/modules/cloud-security/SKILL.md +240 -0
  52. package/modules/cold-email/SKILL.md +178 -0
  53. package/modules/cold-email/evals/evals.json +94 -0
  54. package/modules/cold-email/references/benchmarks.md +83 -0
  55. package/modules/cold-email/references/follow-up-sequences.md +81 -0
  56. package/modules/cold-email/references/frameworks.md +90 -0
  57. package/modules/cold-email/references/personalization.md +79 -0
  58. package/modules/cold-email/references/subject-lines.md +53 -0
  59. package/modules/commit/SKILL.md +195 -0
  60. package/modules/competitor-alternatives/SKILL.md +256 -0
  61. package/modules/competitor-alternatives/evals/evals.json +93 -0
  62. package/modules/competitor-alternatives/references/content-architecture.md +271 -0
  63. package/modules/competitor-alternatives/references/templates.md +223 -0
  64. package/modules/connect/SKILL.md +894 -0
  65. package/modules/content-strategy/SKILL.md +359 -0
  66. package/modules/content-strategy/evals/evals.json +90 -0
  67. package/modules/context-dump/SKILL.md +67 -0
  68. package/modules/copy-editing/SKILL.md +447 -0
  69. package/modules/copy-editing/evals/evals.json +89 -0
  70. package/modules/copy-editing/references/plain-english-alternatives.md +394 -0
  71. package/modules/copywriting/SKILL.md +271 -0
  72. package/modules/copywriting/evals/evals.json +111 -0
  73. package/modules/copywriting/references/cold-email-benchmarks.md +83 -0
  74. package/modules/copywriting/references/cold-email-follow-ups.md +81 -0
  75. package/modules/copywriting/references/cold-email-frameworks.md +90 -0
  76. package/modules/copywriting/references/cold-email-personalization.md +79 -0
  77. package/modules/copywriting/references/cold-email-subject-lines.md +53 -0
  78. package/modules/copywriting/references/copy-frameworks.md +344 -0
  79. package/modules/copywriting/references/email-copy-guidelines.md +113 -0
  80. package/modules/copywriting/references/email-types.md +515 -0
  81. package/modules/copywriting/references/natural-transitions.md +272 -0
  82. package/modules/copywriting/references/sequence-templates.md +168 -0
  83. package/modules/data-query/SKILL.md +58 -0
  84. package/modules/data-viz/SKILL.md +225 -0
  85. package/modules/db/SKILL.md +205 -0
  86. package/modules/db/db-engines/_router.md +24 -0
  87. package/modules/db/db-engines/athena.md +16 -0
  88. package/modules/db/db-engines/cloud-sql.md +16 -0
  89. package/modules/db/db-engines/databricks.md +14 -0
  90. package/modules/db/db-engines/oracle.md +14 -0
  91. package/modules/db/db-engines/postgres.md +15 -0
  92. package/modules/db/db-engines/presto.md +14 -0
  93. package/modules/db/db-engines/snowflake.md +14 -0
  94. package/modules/docs/SKILL.md +100 -0
  95. package/modules/email-sequence/SKILL.md +309 -0
  96. package/modules/email-sequence/evals/evals.json +93 -0
  97. package/modules/email-sequence/references/copy-guidelines.md +113 -0
  98. package/modules/email-sequence/references/email-types.md +515 -0
  99. package/modules/email-sequence/references/sequence-templates.md +168 -0
  100. package/modules/enterprise-design/SKILL.md +75 -0
  101. package/modules/eval/SKILL.md +105 -0
  102. package/modules/figma-translator/SKILL.md +49 -0
  103. package/modules/fix-bugs/SKILL.md +104 -0
  104. package/modules/form-cro/SKILL.md +429 -0
  105. package/modules/form-cro/evals/evals.json +90 -0
  106. package/modules/free-tool-strategy/SKILL.md +178 -0
  107. package/modules/free-tool-strategy/evals/evals.json +90 -0
  108. package/modules/free-tool-strategy/references/tool-types.md +217 -0
  109. package/modules/gate/SKILL.md +232 -0
  110. package/modules/grill-me/SKILL.md +59 -0
  111. package/modules/interaction-engineer/SKILL.md +49 -0
  112. package/modules/issue/SKILL.md +272 -0
  113. package/modules/launch/SKILL.md +345 -0
  114. package/modules/launch-strategy/SKILL.md +353 -0
  115. package/modules/launch-strategy/evals/evals.json +91 -0
  116. package/modules/lint/SKILL.md +126 -0
  117. package/modules/marketing-ideas/SKILL.md +167 -0
  118. package/modules/marketing-ideas/evals/evals.json +90 -0
  119. package/modules/marketing-ideas/references/ideas-by-category.md +366 -0
  120. package/modules/marketing-psychology/SKILL.md +455 -0
  121. package/modules/marketing-psychology/evals/evals.json +88 -0
  122. package/modules/motion-designer/SKILL.md +214 -0
  123. package/modules/onboarding-cro/SKILL.md +220 -0
  124. package/modules/onboarding-cro/evals/evals.json +92 -0
  125. package/modules/onboarding-cro/references/experiments.md +258 -0
  126. package/modules/orchestrate/SKILL.md +77 -0
  127. package/modules/page-cro/SKILL.md +182 -0
  128. package/modules/page-cro/evals/evals.json +111 -0
  129. package/modules/page-cro/references/experiments.md +248 -0
  130. package/modules/page-cro/references/paywall-experiments.md +164 -0
  131. package/modules/paid-ads/SKILL.md +315 -0
  132. package/modules/paid-ads/evals/evals.json +90 -0
  133. package/modules/paid-ads/references/ad-copy-templates.md +207 -0
  134. package/modules/paid-ads/references/audience-targeting.md +243 -0
  135. package/modules/paid-ads/references/platform-setup-checklists.md +277 -0
  136. package/modules/paywall-upgrade-cro/SKILL.md +227 -0
  137. package/modules/paywall-upgrade-cro/evals/evals.json +93 -0
  138. package/modules/paywall-upgrade-cro/references/experiments.md +164 -0
  139. package/modules/popup-cro/SKILL.md +453 -0
  140. package/modules/popup-cro/evals/evals.json +94 -0
  141. package/modules/pr/SKILL.md +203 -0
  142. package/modules/pricing-strategy/SKILL.md +231 -0
  143. package/modules/pricing-strategy/evals/evals.json +90 -0
  144. package/modules/pricing-strategy/references/research-methods.md +152 -0
  145. package/modules/pricing-strategy/references/tier-structure.md +232 -0
  146. package/modules/product-marketing-context/SKILL.md +241 -0
  147. package/modules/product-marketing-context/evals/evals.json +85 -0
  148. package/modules/programmatic-seo/SKILL.md +238 -0
  149. package/modules/programmatic-seo/evals/evals.json +94 -0
  150. package/modules/programmatic-seo/references/playbooks.md +308 -0
  151. package/modules/push/SKILL.md +202 -0
  152. package/modules/referral-program/SKILL.md +255 -0
  153. package/modules/referral-program/evals/evals.json +89 -0
  154. package/modules/referral-program/references/affiliate-programs.md +164 -0
  155. package/modules/referral-program/references/program-examples.md +143 -0
  156. package/modules/release/SKILL.md +293 -0
  157. package/modules/revops/SKILL.md +343 -0
  158. package/modules/revops/evals/evals.json +91 -0
  159. package/modules/revops/references/automation-playbooks.md +290 -0
  160. package/modules/revops/references/lifecycle-definitions.md +278 -0
  161. package/modules/revops/references/routing-rules.md +203 -0
  162. package/modules/revops/references/scoring-models.md +247 -0
  163. package/modules/sales-enablement/SKILL.md +349 -0
  164. package/modules/sales-enablement/evals/evals.json +91 -0
  165. package/modules/sales-enablement/references/deck-frameworks.md +263 -0
  166. package/modules/sales-enablement/references/demo-scripts.md +355 -0
  167. package/modules/sales-enablement/references/objection-library.md +270 -0
  168. package/modules/sales-enablement/references/one-pager-templates.md +208 -0
  169. package/modules/schema-markup/SKILL.md +179 -0
  170. package/modules/schema-markup/evals/evals.json +87 -0
  171. package/modules/schema-markup/references/schema-examples.md +398 -0
  172. package/modules/security/SKILL.md +138 -0
  173. package/modules/seo-audit/SKILL.md +412 -0
  174. package/modules/seo-audit/evals/evals.json +136 -0
  175. package/modules/seo-audit/references/ai-writing-detection.md +200 -0
  176. package/modules/seo-audit/references/content-patterns.md +285 -0
  177. package/modules/seo-audit/references/platform-ranking-factors.md +152 -0
  178. package/modules/signup-flow-cro/SKILL.md +359 -0
  179. package/modules/signup-flow-cro/evals/evals.json +88 -0
  180. package/modules/site-architecture/SKILL.md +357 -0
  181. package/modules/site-architecture/evals/evals.json +88 -0
  182. package/modules/site-architecture/references/mermaid-templates.md +216 -0
  183. package/modules/site-architecture/references/navigation-patterns.md +305 -0
  184. package/modules/site-architecture/references/site-type-templates.md +293 -0
  185. package/modules/social-content/SKILL.md +278 -0
  186. package/modules/social-content/evals/evals.json +92 -0
  187. package/modules/social-content/references/platforms.md +170 -0
  188. package/modules/social-content/references/post-templates.md +177 -0
  189. package/modules/social-content/references/reverse-engineering.md +195 -0
  190. package/modules/spec/SKILL.md +81 -0
  191. package/modules/subagents/SKILL.md +123 -0
  192. package/modules/techdebt/SKILL.md +71 -0
  193. package/modules/terminal-setup/SKILL.md +49 -0
  194. package/modules/test/SKILL.md +493 -0
  195. package/modules/test/references/e2e-patterns.md +294 -0
  196. package/modules/update-claude-md/SKILL.md +52 -0
  197. package/modules/visual-system-architect/SKILL.md +53 -0
  198. package/package.json +44 -0
  199. package/plugins/plugins.json +43 -0
  200. package/shell/aliases.sh +24 -0
  201. package/shell/check-update.sh +212 -0
  202. package/templates/.env.example +199 -0
  203. package/templates/docker-compose.md +46 -0
  204. package/templates/node-frontend.md +56 -0
  205. package/templates/node-fullstack.md +59 -0
  206. package/templates/python-api.md +57 -0
  207. package/update.sh +231 -0
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env python3
2
+ """Reconcile ~/.claude/settings.json with plugins/plugins.json.
3
+
4
+ Unlike a naive add-only sync, this ADDS newly-declared plugins and REMOVES ones
5
+ 100xprism previously installed but has since dropped from plugins.json (e.g. a
6
+ deduplicated/removed plugin) — without ever touching plugins the user enabled
7
+ themselves, and without flipping an entry the user explicitly turned on/off.
8
+
9
+ "Managed" plugins (the set 100xprism owns) are tracked in a sidecar state file so
10
+ settings.json stays clean. On the very first run (no state yet) the managed set
11
+ is seeded from the current intersection of declared ∧ enabled, so nothing is
12
+ removed until a subsequent run observes an actual drop.
13
+
14
+ Usage:
15
+ sync_plugins.py --settings <settings.json> --plugins <plugins.json>
16
+ [--state <state.json>] [--session-hook <command>]
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import argparse
21
+ import json
22
+ import os
23
+ from pathlib import Path
24
+
25
+
26
+ def _load(path: Path, default):
27
+ try:
28
+ return json.loads(path.read_text())
29
+ except (OSError, ValueError):
30
+ return default
31
+
32
+
33
+ def main() -> int:
34
+ ap = argparse.ArgumentParser()
35
+ ap.add_argument("--settings", required=True)
36
+ ap.add_argument("--plugins", required=True)
37
+ ap.add_argument("--state", default="")
38
+ ap.add_argument("--session-hook", default="")
39
+ args = ap.parse_args()
40
+
41
+ settings_file = Path(args.settings)
42
+ # State lives beside settings.json so it tracks that specific install (and so
43
+ # tests against a temp settings file stay self-contained).
44
+ state_file = Path(args.state) if args.state else settings_file.parent / ".100xprism-plugins.json"
45
+ repo_data = _load(Path(args.plugins), {})
46
+ settings = _load(settings_file, {})
47
+ if not isinstance(settings, dict):
48
+ settings = {}
49
+
50
+ desired = list(repo_data.get("plugins", []))
51
+ desired_set = set(desired)
52
+ enabled = settings.setdefault("enabledPlugins", {})
53
+
54
+ state = _load(state_file, {})
55
+ first_run = "managed" not in state
56
+ managed = set(state.get("managed", []))
57
+ if first_run:
58
+ # Seed: only claim plugins we can see are both declared and already enabled.
59
+ # Nothing is removed on this run.
60
+ managed = {p for p in desired if p in enabled}
61
+
62
+ added = 0
63
+ for p in desired:
64
+ if p not in enabled: # never flip an existing True/False
65
+ enabled[p] = True
66
+ added += 1
67
+
68
+ removed = []
69
+ for p in sorted(managed):
70
+ if p not in desired_set: # we installed it before; it's gone now
71
+ if enabled.pop(p, None) is not None:
72
+ removed.append(p)
73
+
74
+ # We now own exactly the declared set.
75
+ new_state = {"managed": sorted(desired_set)}
76
+
77
+ # Merge marketplaces (additive — never drop a marketplace the user may rely on).
78
+ extra = repo_data.get("extraKnownMarketplaces", {})
79
+ if extra:
80
+ settings.setdefault("extraKnownMarketplaces", {}).update(extra)
81
+
82
+ # Optionally ensure the SessionStart update-check hook is present (idempotent).
83
+ if args.session_hook:
84
+ hooks = settings.setdefault("hooks", {})
85
+ session_start = hooks.setdefault("SessionStart", [])
86
+ present = any(
87
+ h.get("command") == args.session_hook
88
+ for entry in session_start
89
+ for h in entry.get("hooks", [])
90
+ )
91
+ if not present:
92
+ session_start.append({"matcher": "", "hooks": [{"type": "command", "command": args.session_hook}]})
93
+ print(" Added SessionStart update-check hook ✓")
94
+
95
+ settings_file.parent.mkdir(parents=True, exist_ok=True)
96
+ settings_file.write_text(json.dumps(settings, indent=2) + "\n")
97
+ state_file.parent.mkdir(parents=True, exist_ok=True)
98
+ state_file.write_text(json.dumps(new_state, indent=2) + "\n")
99
+
100
+ bits = []
101
+ if added:
102
+ bits.append(f"added {added}")
103
+ if removed:
104
+ bits.append(f"removed {len(removed)} ({', '.join(removed)})")
105
+ if bits:
106
+ print(f" Plugins: {', '.join(bits)} ✓")
107
+ else:
108
+ print(" Plugins: settings already up to date ✓")
109
+ return 0
110
+
111
+
112
+ if __name__ == "__main__":
113
+ raise SystemExit(main())
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ # shellcheck disable=SC1091
5
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/shared.sh"
6
+
7
+ # Windsurf has a tight rules file size limit, so we emit index-only mode
8
+ # (one line per module) instead of full bodies.
9
+ install_project() {
10
+ _run_concat "${1:-.}" ".windsurfrules" "Windsurf" "index"
11
+ }
12
+
13
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
14
+ install_project "${1:-.}"
15
+ fi
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ 'use strict'
3
+
4
+ const HELP = `
5
+ Usage: 100xprism <command>
6
+
7
+ Commands:
8
+ install Global setup — copy workflows to ~/.claude/commands/, install plugins
9
+ init Per-project setup — run from your project root
10
+ update Pull latest workflows and regenerate tracked projects
11
+ check Check for a newer version without applying
12
+
13
+ Examples:
14
+ npm install -g 100xprism && 100xprism install
15
+ cd my-project && 100xprism init
16
+ 100xprism update
17
+ `.trimStart()
18
+
19
+ const [,, cmd, ...args] = process.argv
20
+
21
+ switch (cmd) {
22
+ case 'install': require('../lib/install').run(args); break
23
+ case 'init': require('../lib/init').run(args); break
24
+ case 'update': require('../lib/update').run(args); break
25
+ case 'check': require('../lib/update').run(['--check-only']); break
26
+ default:
27
+ process.stdout.write(HELP)
28
+ process.exit(cmd ? 1 : 0)
29
+ }
package/get.sh ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ INSTALL_DIR="$HOME/100xprism"
5
+ LEGACY_DIR="$HOME/100x-dev"
6
+
7
+ # Migrate a legacy 100x-dev clone to the new name before anything else (rebrand).
8
+ if [ -d "$LEGACY_DIR/.git" ] && [ ! -d "$INSTALL_DIR" ]; then
9
+ echo "Migrating ~/100x-dev → ~/100xprism (rebrand)..."
10
+ mv "$LEGACY_DIR" "$INSTALL_DIR"
11
+ git -C "$INSTALL_DIR" remote set-url origin https://github.com/rajitsaha/100xprism.git 2>/dev/null || true
12
+ fi
13
+
14
+ if [ -d "$INSTALL_DIR/.git" ]; then
15
+ echo "100xprism already installed — pulling latest..."
16
+ git -C "$INSTALL_DIR" pull --rebase origin main --quiet \
17
+ || { echo "Error: git pull failed. Check your network or resolve any conflicts in $INSTALL_DIR."; exit 1; }
18
+ else
19
+ echo "Installing 100xprism..."
20
+ git clone https://github.com/rajitsaha/100xprism.git "$INSTALL_DIR" --quiet \
21
+ || { echo "Error: git clone failed. Check your network and try again."; exit 1; }
22
+ fi
23
+
24
+ exec bash "$INSTALL_DIR/install.sh" "$@"
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ PROJECT_PATH="$(cd "${1:-$PWD}" && pwd)"
6
+
7
+ GREEN='\033[0;32m'
8
+ YELLOW='\033[1;33m'
9
+ CYAN='\033[0;36m'
10
+ NC='\033[0m'
11
+
12
+ echo ""
13
+ echo "╔══════════════════════════════════════╗"
14
+ echo "║ 100x Dev — Project Setup ║"
15
+ echo "╚══════════════════════════════════════╝"
16
+ echo ""
17
+ echo " Project: $PROJECT_PATH"
18
+ echo ""
19
+
20
+ TOOL_CLAUDE=false
21
+ TOOL_CURSOR=false
22
+ TOOL_CODEX=false
23
+ TOOL_WINDSURF=false
24
+ TOOL_COPILOT=false
25
+ TOOL_GEMINI=false
26
+ TOOL_ANTIGRAVITY=false
27
+
28
+ select_tools() {
29
+ echo "Which AI coding tools do you use in this project?"
30
+ echo " (Enter numbers to toggle, then press Enter with no input to confirm)"
31
+ echo ""
32
+
33
+ while true; do
34
+ echo " [$([ "$TOOL_CLAUDE" = true ] && echo "x" || echo " ")] 1) Claude Code"
35
+ echo " [$([ "$TOOL_CURSOR" = true ] && echo "x" || echo " ")] 2) Cursor"
36
+ echo " [$([ "$TOOL_CODEX" = true ] && echo "x" || echo " ")] 3) Codex (OpenAI)"
37
+ echo " [$([ "$TOOL_WINDSURF" = true ] && echo "x" || echo " ")] 4) Windsurf"
38
+ echo " [$([ "$TOOL_COPILOT" = true ] && echo "x" || echo " ")] 5) Copilot CLI"
39
+ echo " [$([ "$TOOL_GEMINI" = true ] && echo "x" || echo " ")] 6) Gemini CLI"
40
+ echo " [$([ "$TOOL_ANTIGRAVITY" = true ] && echo "x" || echo " ")] 7) Antigravity"
41
+ echo ""
42
+ read -rp " Toggle (1-7) or press Enter to confirm: " choice || true
43
+ case "$choice" in
44
+ 1) TOOL_CLAUDE=$([ "$TOOL_CLAUDE" = true ] && echo false || echo true) ;;
45
+ 2) TOOL_CURSOR=$([ "$TOOL_CURSOR" = true ] && echo false || echo true) ;;
46
+ 3) TOOL_CODEX=$([ "$TOOL_CODEX" = true ] && echo false || echo true) ;;
47
+ 4) TOOL_WINDSURF=$([ "$TOOL_WINDSURF" = true ] && echo false || echo true) ;;
48
+ 5) TOOL_COPILOT=$([ "$TOOL_COPILOT" = true ] && echo false || echo true) ;;
49
+ 6) TOOL_GEMINI=$([ "$TOOL_GEMINI" = true ] && echo false || echo true) ;;
50
+ 7) TOOL_ANTIGRAVITY=$([ "$TOOL_ANTIGRAVITY" = true ] && echo false || echo true) ;;
51
+ "") break ;;
52
+ *) echo " Invalid choice. Enter 1-7." ;;
53
+ esac
54
+ echo ""
55
+ done
56
+
57
+ if [ "$TOOL_CLAUDE" = false ] && [ "$TOOL_CURSOR" = false ] && [ "$TOOL_CODEX" = false ] && \
58
+ [ "$TOOL_WINDSURF" = false ] && [ "$TOOL_COPILOT" = false ] && [ "$TOOL_GEMINI" = false ] && \
59
+ [ "$TOOL_ANTIGRAVITY" = false ]; then
60
+ echo -e " ${YELLOW}No tools selected. Exiting.${NC}"
61
+ exit 1
62
+ fi
63
+ }
64
+
65
+ select_tools
66
+
67
+ if [ "$TOOL_CLAUDE" = true ]; then
68
+ source "$REPO_DIR/adapters/claude-code.sh"
69
+ install_project "$PROJECT_PATH"
70
+ fi
71
+
72
+ [ "$TOOL_CURSOR" = true ] && bash "$REPO_DIR/adapters/cursor.sh" "$PROJECT_PATH"
73
+ [ "$TOOL_CODEX" = true ] && bash "$REPO_DIR/adapters/codex.sh" "$PROJECT_PATH"
74
+ [ "$TOOL_WINDSURF" = true ] && bash "$REPO_DIR/adapters/windsurf.sh" "$PROJECT_PATH"
75
+ [ "$TOOL_COPILOT" = true ] && bash "$REPO_DIR/adapters/copilot.sh" "$PROJECT_PATH"
76
+ [ "$TOOL_GEMINI" = true ] && bash "$REPO_DIR/adapters/gemini.sh" "$PROJECT_PATH"
77
+ [ "$TOOL_ANTIGRAVITY" = true ] && bash "$REPO_DIR/adapters/antigravity.sh" "$PROJECT_PATH"
78
+
79
+ echo ""
80
+ echo -e "${GREEN}✓ Project set up!${NC}"
81
+ echo -e "${CYAN} Run 100xprism update any time to pull latest workflows.${NC}"
82
+ echo ""
package/install.sh ADDED
@@ -0,0 +1,281 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ TEMPLATES_DIR="$HOME/100x-templates"
6
+ VERSION="$(cat "$REPO_DIR/VERSION" 2>/dev/null | tr -d '[:space:]')"
7
+ RC_FILE=""
8
+
9
+ # Migrate the legacy 100x-dev config/cache dir (rebrand → 100xPrism). The clone
10
+ # dir itself is migrated earlier (get.sh / npm bootstrap) before this runs.
11
+ if [ -d "$HOME/.100x-dev" ] && [ ! -d "$HOME/.100xprism" ]; then
12
+ mv "$HOME/.100x-dev" "$HOME/.100xprism"
13
+ echo " → Migrated ~/.100x-dev → ~/.100xprism"
14
+ fi
15
+
16
+ # Colors
17
+ GREEN='\033[0;32m'
18
+ YELLOW='\033[1;33m'
19
+ CYAN='\033[0;36m'
20
+ NC='\033[0m'
21
+
22
+ echo ""
23
+ echo "╔══════════════════════════════════════╗"
24
+ echo "║ 100xPrism Setup — Installer ║"
25
+ [ -n "$VERSION" ] && printf "║ %-36s║\n" "version v$VERSION"
26
+ echo "╚══════════════════════════════════════╝"
27
+ echo ""
28
+
29
+ # ── Tool selection ──────────────────────────────────────────────────────────
30
+
31
+ TOOL_CLAUDE=false
32
+
33
+ select_tools() {
34
+ echo "This installs 100xPrism globally for Claude Code."
35
+ echo "To set up Cursor, Codex, Windsurf, Copilot, Gemini, or Antigravity in a project,"
36
+ echo "run 100xprism init from that project directory after this completes."
37
+ echo ""
38
+ read -rp " Install for Claude Code? [Y/n]: " yn || true
39
+ yn="${yn:-Y}"
40
+ if [[ "$yn" =~ ^[Yy]$ ]]; then
41
+ TOOL_CLAUDE=true
42
+ else
43
+ echo " Nothing to install. Exiting."
44
+ exit 0
45
+ fi
46
+ }
47
+
48
+ # ── Component selection ─────────────────────────────────────────────────────
49
+
50
+ INSTALL_MODULES=true
51
+ INSTALL_PLUGINS=true
52
+ INSTALL_SHELL=true
53
+ INSTALL_TEMPLATES=true
54
+ INSTALL_HOOKS=false # enforcing hooks are opt-in (they change commit behavior)
55
+
56
+ select_components() {
57
+ echo ""
58
+ echo "What would you like to install?"
59
+ echo " (Enter numbers to toggle, then press Enter with no input to confirm)"
60
+ echo ""
61
+
62
+ while true; do
63
+ echo " [$([ "$INSTALL_MODULES" = true ] && echo "x" || echo " ")] 1) Modules — 66 modules (lifecycle, quality, engineering, marketing, …)"
64
+ if [ "$TOOL_CLAUDE" = true ]; then
65
+ echo " [$([ "$INSTALL_PLUGINS" = true ] && echo "x" || echo " ")] 2) Plugins — Claude Code only: superpowers, hookify, claude-mem, ..."
66
+ fi
67
+ echo " [$([ "$INSTALL_SHELL" = true ] && echo "x" || echo " ")] 3) Shell — aliases + shortcuts (cc, ccc, 100x-update, ...)"
68
+ echo " [$([ "$INSTALL_TEMPLATES" = true ] && echo "x" || echo " ")] 4) Templates — project starters (node, python, docker)"
69
+ if [ "$TOOL_CLAUDE" = true ]; then
70
+ echo " [$([ "$INSTALL_HOOKS" = true ] && echo "x" || echo " ")] 5) Hooks — Claude Code only: enforce the gate on commit + secret-scan (opt-in)"
71
+ fi
72
+ echo ""
73
+ read -rp " Toggle (1-5) or press Enter to confirm: " choice || true
74
+
75
+ case "$choice" in
76
+ 1) INSTALL_MODULES=$([ "$INSTALL_MODULES" = true ] && echo false || echo true) ;;
77
+ 2) [ "$TOOL_CLAUDE" = true ] && INSTALL_PLUGINS=$([ "$INSTALL_PLUGINS" = true ] && echo false || echo true) ;;
78
+ 3) INSTALL_SHELL=$([ "$INSTALL_SHELL" = true ] && echo false || echo true) ;;
79
+ 4) INSTALL_TEMPLATES=$([ "$INSTALL_TEMPLATES" = true ] && echo false || echo true) ;;
80
+ 5) [ "$TOOL_CLAUDE" = true ] && INSTALL_HOOKS=$([ "$INSTALL_HOOKS" = true ] && echo false || echo true) ;;
81
+ "") break ;;
82
+ *) echo " Invalid choice." ;;
83
+ esac
84
+ echo ""
85
+ done
86
+ }
87
+
88
+ # ── Install workflows ───────────────────────────────────────────────────────
89
+
90
+ install_modules() {
91
+ if [ "$TOOL_CLAUDE" = true ]; then
92
+ source "$REPO_DIR/adapters/claude-code.sh"
93
+ install_global
94
+ fi
95
+ }
96
+
97
+ # ── Install plugins (Claude Code only) ──────────────────────────────────────
98
+
99
+ do_install_plugins() {
100
+ if [ "$TOOL_CLAUDE" = true ]; then
101
+ source "$REPO_DIR/adapters/claude-code.sh"
102
+ install_plugins
103
+ _install_session_hook
104
+ fi
105
+ }
106
+
107
+ _install_session_hook() {
108
+ local settings_file="$HOME/.claude/settings.json"
109
+ [[ -f "$settings_file" ]] || return 0
110
+
111
+ SETTINGS_FILE="$settings_file" python3 - <<'PYEOF'
112
+ import json, os
113
+
114
+ settings_file = os.environ['SETTINGS_FILE']
115
+ hook_cmd = os.path.expanduser('~/100xprism/shell/check-update.sh') + ' --claude-hook'
116
+
117
+ with open(settings_file) as f:
118
+ settings = json.load(f)
119
+
120
+ hooks = settings.setdefault('hooks', {})
121
+ session_start = hooks.setdefault('SessionStart', [])
122
+
123
+ # Drop any stale hook pointing at the legacy ~/100x-dev path (rebrand cleanup).
124
+ for entry in session_start:
125
+ entry['hooks'] = [
126
+ h for h in entry.get('hooks', [])
127
+ if '100x-dev/shell/check-update.sh' not in h.get('command', '')
128
+ ]
129
+ session_start[:] = [e for e in session_start if e.get('hooks')]
130
+
131
+ already_exists = any(
132
+ h.get('command') == hook_cmd
133
+ for entry in session_start
134
+ for h in entry.get('hooks', [])
135
+ )
136
+
137
+ if not already_exists:
138
+ session_start.append({
139
+ 'matcher': '',
140
+ 'hooks': [{'type': 'command', 'command': hook_cmd}]
141
+ })
142
+ print(' Added SessionStart update-check hook ✓')
143
+ else:
144
+ print(' SessionStart hook: already configured ✓')
145
+
146
+ with open(settings_file, 'w') as f:
147
+ json.dump(settings, f, indent=2)
148
+ PYEOF
149
+ }
150
+
151
+ # ── Install enforcing hooks (Claude Code only) ──────────────────────────────
152
+
153
+ install_hooks() {
154
+ [ "$TOOL_CLAUDE" = true ] || return 0
155
+ echo ""
156
+ echo "Installing enforcing hooks for Claude Code..."
157
+ echo " These run via ~/.claude/settings.json. Pick which to enable:"
158
+ echo ""
159
+
160
+ # Defaults mirror hooks/hooks.manifest.json: gate + secret on, lint + router off.
161
+ local H_GATE=true H_SECRET=true H_LINT=false H_ROUTER=false
162
+ while true; do
163
+ echo " [$([ "$H_GATE" = true ] && echo "x" || echo " ")] 1) gate-on-commit — block git commit/push unless /gate passed for the tree"
164
+ echo " [$([ "$H_SECRET" = true ] && echo "x" || echo " ")] 2) secret-scan — block writes containing obvious credentials"
165
+ echo " [$([ "$H_LINT" = true ] && echo "x" || echo " ")] 3) lint-on-save — advisory lint after each edit (never blocks)"
166
+ echo " [$([ "$H_ROUTER" = true ] && echo "x" || echo " ")] 4) permission-router — auto-approve known read-only Bash commands"
167
+ echo ""
168
+ read -rp " Toggle (1-4) or press Enter to confirm: " hchoice || true
169
+ case "$hchoice" in
170
+ 1) H_GATE=$([ "$H_GATE" = true ] && echo false || echo true) ;;
171
+ 2) H_SECRET=$([ "$H_SECRET" = true ] && echo false || echo true) ;;
172
+ 3) H_LINT=$([ "$H_LINT" = true ] && echo false || echo true) ;;
173
+ 4) H_ROUTER=$([ "$H_ROUTER" = true ] && echo false || echo true) ;;
174
+ "") break ;;
175
+ *) echo " Invalid choice." ;;
176
+ esac
177
+ echo ""
178
+ done
179
+
180
+ HOOK_GATE="$H_GATE" HOOK_SECRET="$H_SECRET" HOOK_LINT="$H_LINT" HOOK_ROUTER="$H_ROUTER" \
181
+ python3 "$REPO_DIR/adapters/lib/modules.py" emit-hooks
182
+
183
+ echo -e " ${GREEN}→ Hooks merged into ~/.claude/settings.json ✓${NC}"
184
+ echo -e " ${CYAN}→ Restart Claude Code to load hooks${NC}"
185
+ }
186
+
187
+ # ── Install shell aliases ───────────────────────────────────────────────────
188
+
189
+ install_shell() {
190
+ echo ""
191
+ echo "Installing shell aliases..."
192
+
193
+ SOURCE_LINE="source $REPO_DIR/shell/aliases.sh"
194
+
195
+ if [ -f "$HOME/.zshrc" ]; then
196
+ RC_FILE="$HOME/.zshrc"
197
+ SHELL_NAME="zsh"
198
+ elif [ -f "$HOME/.bashrc" ]; then
199
+ RC_FILE="$HOME/.bashrc"
200
+ SHELL_NAME="bash"
201
+ else
202
+ RC_FILE="$HOME/.bashrc"
203
+ SHELL_NAME="bash"
204
+ touch "$RC_FILE"
205
+ fi
206
+
207
+ # Remove old claude-dev-setup source line if present
208
+ if grep -qF "claude-dev-setup/shell/claude-aliases.sh" "$RC_FILE" 2>/dev/null; then
209
+ grep -v "claude-dev-setup/shell/claude-aliases.sh" "$RC_FILE" > "$RC_FILE.tmp" && mv "$RC_FILE.tmp" "$RC_FILE"
210
+ echo -e " ${YELLOW}→ Removed old claude-dev-setup alias line${NC}"
211
+ fi
212
+
213
+ # Remove the legacy 100x-dev source line + comment if present (rebrand cleanup)
214
+ if grep -qE "100x-dev/shell/aliases.sh|# 100x Dev aliases" "$RC_FILE" 2>/dev/null; then
215
+ grep -vE "100x-dev/shell/aliases.sh|# 100x Dev aliases" "$RC_FILE" > "$RC_FILE.tmp" && mv "$RC_FILE.tmp" "$RC_FILE"
216
+ echo -e " ${YELLOW}→ Removed legacy 100x-dev alias line${NC}"
217
+ fi
218
+
219
+ if grep -qF "$SOURCE_LINE" "$RC_FILE" 2>/dev/null; then
220
+ echo -e " ${YELLOW}→ Already sourced in ~/${RC_FILE##*/} (no change)${NC}"
221
+ else
222
+ { echo ""; echo "# 100xPrism aliases"; echo "$SOURCE_LINE"; } >> "$RC_FILE"
223
+ echo -e " ${GREEN}→ Added source line to ~/${RC_FILE##*/} ($SHELL_NAME) ✓${NC}"
224
+ fi
225
+
226
+ echo -e " ${CYAN}→ Run: source ~/${RC_FILE##*/} to activate now${NC}"
227
+ }
228
+
229
+ # ── Install templates ───────────────────────────────────────────────────────
230
+
231
+ install_templates() {
232
+ echo ""
233
+ echo "Installing templates..."
234
+ mkdir -p "$TEMPLATES_DIR"
235
+
236
+ count=0
237
+ for f in "$REPO_DIR/templates/"*.md; do
238
+ cp "$f" "$TEMPLATES_DIR/"
239
+ count=$((count + 1))
240
+ done
241
+
242
+ echo -e " ${GREEN}→ Copied $count templates to ~/100x-templates/ ✓${NC}"
243
+ echo ""
244
+ echo " Copy a template into your project and rename for your tool:"
245
+ echo " Claude Code → CLAUDE.md"
246
+ echo " Cursor → .cursorrules"
247
+ echo " Codex → AGENTS.md"
248
+ echo " Windsurf → .windsurfrules"
249
+ echo " Copilot → .github/copilot-instructions.md"
250
+ echo " Gemini CLI → GEMINI.md"
251
+ }
252
+
253
+ # ── Main ─────────────────────────────────────────────────────────────────────
254
+
255
+ select_tools
256
+ select_components
257
+
258
+ echo ""
259
+ echo "──────────────────────────────────────"
260
+
261
+ [ "$INSTALL_MODULES" = true ] && install_modules
262
+ [ "$INSTALL_PLUGINS" = true ] && [ "$TOOL_CLAUDE" = true ] && do_install_plugins
263
+ [ "$INSTALL_HOOKS" = true ] && [ "$TOOL_CLAUDE" = true ] && install_hooks
264
+ [ "$INSTALL_SHELL" = true ] && install_shell
265
+ [ "$INSTALL_TEMPLATES" = true ] && install_templates
266
+
267
+ echo ""
268
+ echo "──────────────────────────────────────"
269
+ echo -e "${GREEN}✓ Done!${NC}"
270
+ echo ""
271
+ if [ "$TOOL_CLAUDE" = true ]; then
272
+ echo -e " ${CYAN}In Claude Code:${NC}"
273
+ echo -e " Restart Claude Code to load modules and plugins."
274
+ echo ""
275
+ fi
276
+ echo -e " ${CYAN}In your terminal:${NC}"
277
+ if [ -n "$RC_FILE" ]; then
278
+ echo -e " source ~/${RC_FILE##*/} # reload shell aliases"
279
+ fi
280
+ echo -e " cd your-project && ${YELLOW}100xprism init${NC} # set up a project"
281
+ echo ""