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.
- package/LICENSE +21 -0
- package/README.md +196 -0
- package/VERSION +1 -0
- package/adapters/antigravity.sh +14 -0
- package/adapters/claude-code.sh +160 -0
- package/adapters/codex.sh +13 -0
- package/adapters/copilot.sh +13 -0
- package/adapters/cursor.sh +13 -0
- package/adapters/gemini.sh +13 -0
- package/adapters/lib/__pycache__/modules.cpython-312.pyc +0 -0
- package/adapters/lib/modules.py +592 -0
- package/adapters/lib/shared.sh +83 -0
- package/adapters/lib/sync_plugins.py +113 -0
- package/adapters/windsurf.sh +15 -0
- package/bin/100xprism.js +29 -0
- package/get.sh +24 -0
- package/install-project.sh +82 -0
- package/install.sh +281 -0
- package/lib/adapters/windows.js +429 -0
- package/lib/bootstrap.js +33 -0
- package/lib/init.js +19 -0
- package/lib/install.js +18 -0
- package/lib/migrate.js +52 -0
- package/lib/platform.js +22 -0
- package/lib/update.js +29 -0
- package/modules/_lib/reference.md +77 -0
- package/modules/a11y-auditor/SKILL.md +151 -0
- package/modules/ab-test-setup/SKILL.md +266 -0
- package/modules/ab-test-setup/evals/evals.json +105 -0
- package/modules/ab-test-setup/references/sample-size-guide.md +263 -0
- package/modules/ab-test-setup/references/test-templates.md +277 -0
- package/modules/ad-creative/SKILL.md +362 -0
- package/modules/ad-creative/evals/evals.json +90 -0
- package/modules/ad-creative/references/generative-tools.md +637 -0
- package/modules/ad-creative/references/platform-specs.md +213 -0
- package/modules/ai-seo/SKILL.md +398 -0
- package/modules/ai-seo/evals/evals.json +90 -0
- package/modules/ai-seo/references/content-patterns.md +285 -0
- package/modules/ai-seo/references/platform-ranking-factors.md +152 -0
- package/modules/analytics-tracking/SKILL.md +309 -0
- package/modules/analytics-tracking/evals/evals.json +90 -0
- package/modules/analytics-tracking/references/event-library.md +260 -0
- package/modules/analytics-tracking/references/ga4-implementation.md +300 -0
- package/modules/analytics-tracking/references/gtm-implementation.md +390 -0
- package/modules/architect/SKILL.md +282 -0
- package/modules/branch/SKILL.md +105 -0
- package/modules/churn-prevention/SKILL.md +424 -0
- package/modules/churn-prevention/evals/evals.json +93 -0
- package/modules/churn-prevention/references/cancel-flow-patterns.md +316 -0
- package/modules/churn-prevention/references/dunning-playbook.md +408 -0
- package/modules/cloud-security/SKILL.md +240 -0
- package/modules/cold-email/SKILL.md +178 -0
- package/modules/cold-email/evals/evals.json +94 -0
- package/modules/cold-email/references/benchmarks.md +83 -0
- package/modules/cold-email/references/follow-up-sequences.md +81 -0
- package/modules/cold-email/references/frameworks.md +90 -0
- package/modules/cold-email/references/personalization.md +79 -0
- package/modules/cold-email/references/subject-lines.md +53 -0
- package/modules/commit/SKILL.md +195 -0
- package/modules/competitor-alternatives/SKILL.md +256 -0
- package/modules/competitor-alternatives/evals/evals.json +93 -0
- package/modules/competitor-alternatives/references/content-architecture.md +271 -0
- package/modules/competitor-alternatives/references/templates.md +223 -0
- package/modules/connect/SKILL.md +894 -0
- package/modules/content-strategy/SKILL.md +359 -0
- package/modules/content-strategy/evals/evals.json +90 -0
- package/modules/context-dump/SKILL.md +67 -0
- package/modules/copy-editing/SKILL.md +447 -0
- package/modules/copy-editing/evals/evals.json +89 -0
- package/modules/copy-editing/references/plain-english-alternatives.md +394 -0
- package/modules/copywriting/SKILL.md +271 -0
- package/modules/copywriting/evals/evals.json +111 -0
- package/modules/copywriting/references/cold-email-benchmarks.md +83 -0
- package/modules/copywriting/references/cold-email-follow-ups.md +81 -0
- package/modules/copywriting/references/cold-email-frameworks.md +90 -0
- package/modules/copywriting/references/cold-email-personalization.md +79 -0
- package/modules/copywriting/references/cold-email-subject-lines.md +53 -0
- package/modules/copywriting/references/copy-frameworks.md +344 -0
- package/modules/copywriting/references/email-copy-guidelines.md +113 -0
- package/modules/copywriting/references/email-types.md +515 -0
- package/modules/copywriting/references/natural-transitions.md +272 -0
- package/modules/copywriting/references/sequence-templates.md +168 -0
- package/modules/data-query/SKILL.md +58 -0
- package/modules/data-viz/SKILL.md +225 -0
- package/modules/db/SKILL.md +205 -0
- package/modules/db/db-engines/_router.md +24 -0
- package/modules/db/db-engines/athena.md +16 -0
- package/modules/db/db-engines/cloud-sql.md +16 -0
- package/modules/db/db-engines/databricks.md +14 -0
- package/modules/db/db-engines/oracle.md +14 -0
- package/modules/db/db-engines/postgres.md +15 -0
- package/modules/db/db-engines/presto.md +14 -0
- package/modules/db/db-engines/snowflake.md +14 -0
- package/modules/docs/SKILL.md +100 -0
- package/modules/email-sequence/SKILL.md +309 -0
- package/modules/email-sequence/evals/evals.json +93 -0
- package/modules/email-sequence/references/copy-guidelines.md +113 -0
- package/modules/email-sequence/references/email-types.md +515 -0
- package/modules/email-sequence/references/sequence-templates.md +168 -0
- package/modules/enterprise-design/SKILL.md +75 -0
- package/modules/eval/SKILL.md +105 -0
- package/modules/figma-translator/SKILL.md +49 -0
- package/modules/fix-bugs/SKILL.md +104 -0
- package/modules/form-cro/SKILL.md +429 -0
- package/modules/form-cro/evals/evals.json +90 -0
- package/modules/free-tool-strategy/SKILL.md +178 -0
- package/modules/free-tool-strategy/evals/evals.json +90 -0
- package/modules/free-tool-strategy/references/tool-types.md +217 -0
- package/modules/gate/SKILL.md +232 -0
- package/modules/grill-me/SKILL.md +59 -0
- package/modules/interaction-engineer/SKILL.md +49 -0
- package/modules/issue/SKILL.md +272 -0
- package/modules/launch/SKILL.md +345 -0
- package/modules/launch-strategy/SKILL.md +353 -0
- package/modules/launch-strategy/evals/evals.json +91 -0
- package/modules/lint/SKILL.md +126 -0
- package/modules/marketing-ideas/SKILL.md +167 -0
- package/modules/marketing-ideas/evals/evals.json +90 -0
- package/modules/marketing-ideas/references/ideas-by-category.md +366 -0
- package/modules/marketing-psychology/SKILL.md +455 -0
- package/modules/marketing-psychology/evals/evals.json +88 -0
- package/modules/motion-designer/SKILL.md +214 -0
- package/modules/onboarding-cro/SKILL.md +220 -0
- package/modules/onboarding-cro/evals/evals.json +92 -0
- package/modules/onboarding-cro/references/experiments.md +258 -0
- package/modules/orchestrate/SKILL.md +77 -0
- package/modules/page-cro/SKILL.md +182 -0
- package/modules/page-cro/evals/evals.json +111 -0
- package/modules/page-cro/references/experiments.md +248 -0
- package/modules/page-cro/references/paywall-experiments.md +164 -0
- package/modules/paid-ads/SKILL.md +315 -0
- package/modules/paid-ads/evals/evals.json +90 -0
- package/modules/paid-ads/references/ad-copy-templates.md +207 -0
- package/modules/paid-ads/references/audience-targeting.md +243 -0
- package/modules/paid-ads/references/platform-setup-checklists.md +277 -0
- package/modules/paywall-upgrade-cro/SKILL.md +227 -0
- package/modules/paywall-upgrade-cro/evals/evals.json +93 -0
- package/modules/paywall-upgrade-cro/references/experiments.md +164 -0
- package/modules/popup-cro/SKILL.md +453 -0
- package/modules/popup-cro/evals/evals.json +94 -0
- package/modules/pr/SKILL.md +203 -0
- package/modules/pricing-strategy/SKILL.md +231 -0
- package/modules/pricing-strategy/evals/evals.json +90 -0
- package/modules/pricing-strategy/references/research-methods.md +152 -0
- package/modules/pricing-strategy/references/tier-structure.md +232 -0
- package/modules/product-marketing-context/SKILL.md +241 -0
- package/modules/product-marketing-context/evals/evals.json +85 -0
- package/modules/programmatic-seo/SKILL.md +238 -0
- package/modules/programmatic-seo/evals/evals.json +94 -0
- package/modules/programmatic-seo/references/playbooks.md +308 -0
- package/modules/push/SKILL.md +202 -0
- package/modules/referral-program/SKILL.md +255 -0
- package/modules/referral-program/evals/evals.json +89 -0
- package/modules/referral-program/references/affiliate-programs.md +164 -0
- package/modules/referral-program/references/program-examples.md +143 -0
- package/modules/release/SKILL.md +293 -0
- package/modules/revops/SKILL.md +343 -0
- package/modules/revops/evals/evals.json +91 -0
- package/modules/revops/references/automation-playbooks.md +290 -0
- package/modules/revops/references/lifecycle-definitions.md +278 -0
- package/modules/revops/references/routing-rules.md +203 -0
- package/modules/revops/references/scoring-models.md +247 -0
- package/modules/sales-enablement/SKILL.md +349 -0
- package/modules/sales-enablement/evals/evals.json +91 -0
- package/modules/sales-enablement/references/deck-frameworks.md +263 -0
- package/modules/sales-enablement/references/demo-scripts.md +355 -0
- package/modules/sales-enablement/references/objection-library.md +270 -0
- package/modules/sales-enablement/references/one-pager-templates.md +208 -0
- package/modules/schema-markup/SKILL.md +179 -0
- package/modules/schema-markup/evals/evals.json +87 -0
- package/modules/schema-markup/references/schema-examples.md +398 -0
- package/modules/security/SKILL.md +138 -0
- package/modules/seo-audit/SKILL.md +412 -0
- package/modules/seo-audit/evals/evals.json +136 -0
- package/modules/seo-audit/references/ai-writing-detection.md +200 -0
- package/modules/seo-audit/references/content-patterns.md +285 -0
- package/modules/seo-audit/references/platform-ranking-factors.md +152 -0
- package/modules/signup-flow-cro/SKILL.md +359 -0
- package/modules/signup-flow-cro/evals/evals.json +88 -0
- package/modules/site-architecture/SKILL.md +357 -0
- package/modules/site-architecture/evals/evals.json +88 -0
- package/modules/site-architecture/references/mermaid-templates.md +216 -0
- package/modules/site-architecture/references/navigation-patterns.md +305 -0
- package/modules/site-architecture/references/site-type-templates.md +293 -0
- package/modules/social-content/SKILL.md +278 -0
- package/modules/social-content/evals/evals.json +92 -0
- package/modules/social-content/references/platforms.md +170 -0
- package/modules/social-content/references/post-templates.md +177 -0
- package/modules/social-content/references/reverse-engineering.md +195 -0
- package/modules/spec/SKILL.md +81 -0
- package/modules/subagents/SKILL.md +123 -0
- package/modules/techdebt/SKILL.md +71 -0
- package/modules/terminal-setup/SKILL.md +49 -0
- package/modules/test/SKILL.md +493 -0
- package/modules/test/references/e2e-patterns.md +294 -0
- package/modules/update-claude-md/SKILL.md +52 -0
- package/modules/visual-system-architect/SKILL.md +53 -0
- package/package.json +44 -0
- package/plugins/plugins.json +43 -0
- package/shell/aliases.sh +24 -0
- package/shell/check-update.sh +212 -0
- package/templates/.env.example +199 -0
- package/templates/docker-compose.md +46 -0
- package/templates/node-frontend.md +56 -0
- package/templates/node-fullstack.md +59 -0
- package/templates/python-api.md +57 -0
- 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
|
package/bin/100xprism.js
ADDED
|
@@ -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 ""
|