claude-access-for-all 0.2.0 → 0.3.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/README.md +47 -2
- package/bin/claude-access.js +5 -3
- package/docs/images/active-session-example.png +0 -0
- package/docs/images/logo.png +0 -0
- package/docs/images/pro-subscription-example.png +0 -0
- package/docs/privacy-inspector.md +1 -1
- package/package.json +1 -1
- package/tools/desktop_shortcut.py +70 -0
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
<h1><img src="docs/images/logo.png" width="36" height="36" align="absmiddle" alt="" /> Claude Access for All</h1>
|
|
2
2
|
|
|
3
3
|
**Frontier intelligence should serve humanity, in every corner of the world.**
|
|
4
4
|
|
|
@@ -35,6 +35,22 @@ Open knowledge can reduce confusion, expose misleading promises, help people pro
|
|
|
35
35
|
| Local tools | Offline diagnostics, scoped launchers, browser signal inspector, and calendar reminder |
|
|
36
36
|
| Evidence | Dated official sources and a contribution standard |
|
|
37
37
|
|
|
38
|
+
## Session location example
|
|
39
|
+
|
|
40
|
+
An example of an account's active-session view showing a reported location:
|
|
41
|
+
|
|
42
|
+

|
|
43
|
+
|
|
44
|
+
The displayed location is provided by the service. A process timezone setting alone does not change the network exit IP or guarantee a particular session location.
|
|
45
|
+
|
|
46
|
+
## Claude Pro subscription example
|
|
47
|
+
|
|
48
|
+
An example of the Claude Desktop usage screen after subscribing to Pro:
|
|
49
|
+
|
|
50
|
+

|
|
51
|
+
|
|
52
|
+
Plan availability and usage limits depend on your account and the provider's current terms.
|
|
53
|
+
|
|
38
54
|
## Install and run
|
|
39
55
|
|
|
40
56
|
Requires macOS, Node.js 18+, Python 3.9+, and Git for the GitHub install. Install Claude Code or Claude Desktop separately when needed. Install the CLI from the npm registry or directly from GitHub.
|
|
@@ -52,7 +68,36 @@ npm install -g claude-access-for-all
|
|
|
52
68
|
claude-access
|
|
53
69
|
```
|
|
54
70
|
|
|
55
|
-
|
|
71
|
+
## Command reference
|
|
72
|
+
|
|
73
|
+
Run `claude-access` without arguments to open the interactive menu, or use a command directly:
|
|
74
|
+
|
|
75
|
+
| Command | What it does |
|
|
76
|
+
| --- | --- |
|
|
77
|
+
| `claude-access` or `claude-access menu` | Open the interactive menu for diagnostics, launching clients, and reminders. |
|
|
78
|
+
| `claude-access score` | Score the current terminal's timezone and UTC offset using a partial, offline heuristic. Browser-only signals are not measured. |
|
|
79
|
+
| `claude-access doctor` | Check the system, Claude Code installation, and whether common environment variables are set. |
|
|
80
|
+
| `claude-access audit` | Inspect the current terminal's timezone names and whether locale, proxy, endpoint, and authentication variables are set. |
|
|
81
|
+
| `claude-access cli` | Launch Claude Code with process-scoped settings, requesting the Los Angeles timezone by default. |
|
|
82
|
+
| `claude-access app` | Request a new Claude Desktop instance with process-scoped settings and the Los Angeles timezone by default. |
|
|
83
|
+
| `claude-access desktop-shortcut` | Create a standalone macOS launcher in the current directory that requests the same Desktop settings. |
|
|
84
|
+
| `claude-access web` | Open Claude in a separate Chrome profile, requesting the Los Angeles timezone by default; use `--browser edge` for Microsoft Edge. |
|
|
85
|
+
| `claude-access inspect` | Open the local browser signal inspector in the default browser. |
|
|
86
|
+
| `claude-access reminder --renewal YYYY-MM-DD` | Print a one-time renewal-review calendar event. Redirect the output to an `.ics` file and import it into Calendar. |
|
|
87
|
+
| `claude-access guide` | Open the English privacy and access guide. |
|
|
88
|
+
| `claude-access help` | Show the command list and examples. |
|
|
89
|
+
| `claude-access version` | Show the installed package version. |
|
|
90
|
+
|
|
91
|
+
The score is not a complete browser score, a ban prediction, or an eligibility check. Desktop and browsers may not honor the requested timezone. For available options, run a supported subcommand with `--help`, such as `claude-access web --help`.
|
|
92
|
+
|
|
93
|
+
## Open Claude from the Dock
|
|
94
|
+
|
|
95
|
+
Run `claude-access desktop-shortcut` to create `Claude Access Launcher.app` in the current directory. Quit Claude first, then double-click the launcher. Drag the launcher to the Dock for future launches; after Claude opens, use Command-Tab to switch to it as usual. The launcher is a separate app, and does not replace or modify Claude. An existing Claude instance may reuse state or services; the launcher cannot change an already-running process. It requests the Los Angeles timezone and English locale, but Claude or its services may read system settings independently. No change to network routing or account eligibility is made.
|
|
96
|
+
|
|
97
|
+
Run `claude-access desktop-shortcut --help` to select a different output path, timezone, or locale. The launcher refuses to overwrite an existing path. To remove it, quit it and delete its `.app` bundle.
|
|
98
|
+
|
|
99
|
+
## Examples
|
|
100
|
+
|
|
56
101
|
|
|
57
102
|
```sh
|
|
58
103
|
claude-access doctor
|
package/bin/claude-access.js
CHANGED
|
@@ -16,6 +16,7 @@ Usage: claude-access [command] [options]
|
|
|
16
16
|
score Score locally observable timezone signals
|
|
17
17
|
cli [options] [-- ...] Launch Claude Code with scoped locale settings
|
|
18
18
|
app [options] Launch Claude Desktop with scoped locale settings
|
|
19
|
+
desktop-shortcut Create a standalone macOS launcher app
|
|
19
20
|
web [options] Launch Claude in a separate browser profile
|
|
20
21
|
inspect Open the local browser signal inspector
|
|
21
22
|
reminder [options] Write a one-time calendar event to stdout
|
|
@@ -49,6 +50,7 @@ function dispatch(command, args = []) {
|
|
|
49
50
|
case 'doctor': return run('python3', [join(root, 'tools/access.py'), 'doctor', ...args]);
|
|
50
51
|
case 'audit': return run('python3', [join(root, 'tools/privacy.py'), 'audit', ...args]);
|
|
51
52
|
case 'score': return run('python3', [join(root, 'tools/score.py'), ...args]);
|
|
53
|
+
case 'desktop-shortcut': return run('python3', [join(root, 'tools/desktop_shortcut.py'), ...args]);
|
|
52
54
|
case 'cli': case 'app': case 'web':
|
|
53
55
|
return run('python3', [join(root, 'tools/privacy.py'), command, ...args]);
|
|
54
56
|
case 'reminder': return run('python3', [join(root, 'tools/access.py'), 'reminder', ...args]);
|
|
@@ -71,10 +73,10 @@ async function menu() {
|
|
|
71
73
|
}
|
|
72
74
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
73
75
|
try {
|
|
74
|
-
console.log(`\nClaude Access for All\n\n 1 Check local environment\n 2 Inspect CLI signals\n 3 Start Claude Code\n 4 Start Claude Desktop\n 5 Start Claude in a separate browser profile\n 6 Open browser signal inspector\n 7 Open the privacy guide\n 8 Create a renewal calendar file\n 9 Score local timezone signals\n 0 Exit\n`);
|
|
76
|
+
console.log(`\nClaude Access for All\n\n 1 Check local environment\n 2 Inspect CLI signals\n 3 Start Claude Code\n 4 Start Claude Desktop\n 5 Start Claude in a separate browser profile\n 6 Open browser signal inspector\n 7 Open the privacy guide\n 8 Create a renewal calendar file\n 9 Score local timezone signals\n 10 Create a macOS desktop launcher\n 0 Exit\n`);
|
|
75
77
|
const choice = (await rl.question('Choose an option: ')).trim();
|
|
76
78
|
if (choice === '0') return 0;
|
|
77
|
-
const simple = { '1': 'doctor', '2': 'audit', '3': 'cli', '4': 'app', '6': 'inspect', '7': 'guide', '9': 'score' };
|
|
79
|
+
const simple = { '1': 'doctor', '2': 'audit', '3': 'cli', '4': 'app', '6': 'inspect', '7': 'guide', '9': 'score', '10': 'desktop-shortcut' };
|
|
78
80
|
if (simple[choice]) { rl.close(); return dispatch(simple[choice]); }
|
|
79
81
|
if (choice === '5') {
|
|
80
82
|
const browser = (await rl.question('Browser (chrome/edge) [chrome]: ')).trim() || 'chrome';
|
|
@@ -95,7 +97,7 @@ async function menu() {
|
|
|
95
97
|
console.log(`Created ${output}. Import it into Calendar and check notification settings.`);
|
|
96
98
|
return 0;
|
|
97
99
|
}
|
|
98
|
-
console.error('Unknown option. Run the menu again to choose 0–
|
|
100
|
+
console.error('Unknown option. Run the menu again to choose 0–10.');
|
|
99
101
|
return 2;
|
|
100
102
|
} finally { rl.close(); }
|
|
101
103
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -29,7 +29,7 @@ python3 tools/privacy.py app --timezone America/Los_Angeles --locale en_US.UTF-8
|
|
|
29
29
|
python3 tools/privacy.py app --app '/Applications/Claude.app'
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
This asks macOS Launch Services to open a new app instance with the specified environment values. Desktop may read OS preferences directly, reuse existing services, or use app-managed settings instead; these process overrides are an experiment, not a verified masking mechanism. Browser-based sign-in runs in its own browser process. Verify Desktop-specific behavior separately and use [official network settings](https://code.claude.com/docs/en/network-config) for network configuration.
|
|
32
|
+
This asks macOS Launch Services to open a new app instance with the specified environment values. To create a clickable launcher, run `claude-access desktop-shortcut`, quit Claude, and open the newly created `Claude Access Launcher.app`. Add it to the Dock for later launches; Command-Tab switches to Claude after it is open. Desktop may read OS preferences directly, reuse existing services, or use app-managed settings instead; these process overrides are an experiment, not a verified masking mechanism. Browser-based sign-in runs in its own browser process. Verify Desktop-specific behavior separately and use [official network settings](https://code.claude.com/docs/en/network-config) for network configuration.
|
|
33
33
|
|
|
34
34
|
## 3. Claude on the web
|
|
35
35
|
|
package/package.json
CHANGED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Create a standalone macOS app that requests the Claude Access environment."""
|
|
3
|
+
import argparse
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import plistlib
|
|
6
|
+
import shlex
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
from privacy import validate_locale, validate_timezone
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def create_bundle(destination, timezone, locale):
|
|
13
|
+
"""Create a new app bundle, refusing to overwrite an existing path."""
|
|
14
|
+
destination = Path(destination).expanduser().absolute()
|
|
15
|
+
destination.mkdir(parents=False, exist_ok=False)
|
|
16
|
+
try:
|
|
17
|
+
contents = destination / 'Contents'
|
|
18
|
+
macos = contents / 'MacOS'
|
|
19
|
+
macos.mkdir(parents=True)
|
|
20
|
+
info = {
|
|
21
|
+
'CFBundleIdentifier': 'org.claudeaccess.launcher',
|
|
22
|
+
'CFBundleName': 'Claude Access Launcher',
|
|
23
|
+
'CFBundleDisplayName': 'Claude Access Launcher',
|
|
24
|
+
'CFBundleExecutable': 'launch-claude',
|
|
25
|
+
'CFBundlePackageType': 'APPL',
|
|
26
|
+
'CFBundleShortVersionString': '1.0',
|
|
27
|
+
'LSMinimumSystemVersion': '13.0',
|
|
28
|
+
'LSUIElement': True,
|
|
29
|
+
}
|
|
30
|
+
(contents / 'Info.plist').write_bytes(plistlib.dumps(info))
|
|
31
|
+
args = ['/usr/bin/open', '-n', '-a', 'Claude',
|
|
32
|
+
'--env', 'TZ=' + timezone, '--env', 'LANG=' + locale,
|
|
33
|
+
'--env', 'LC_ALL=' + locale]
|
|
34
|
+
script = '#!/bin/sh\n# Launch Claude with explicitly scoped environment requests.\nexec ' + ' '.join(shlex.quote(arg) for arg in args) + '\n'
|
|
35
|
+
executable = macos / 'launch-claude'
|
|
36
|
+
executable.write_text(script, encoding='utf-8')
|
|
37
|
+
executable.chmod(0o755)
|
|
38
|
+
except BaseException:
|
|
39
|
+
# Only remove files created by this call; no pre-existing target is touched.
|
|
40
|
+
import shutil
|
|
41
|
+
shutil.rmtree(destination)
|
|
42
|
+
raise
|
|
43
|
+
return destination
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def main():
|
|
47
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
48
|
+
parser.add_argument('--output', type=Path, default=Path('Claude Access Launcher.app'),
|
|
49
|
+
help='New .app path; parent must exist. Defaults to the current directory.')
|
|
50
|
+
parser.add_argument('--timezone', type=validate_timezone, default='America/Los_Angeles')
|
|
51
|
+
parser.add_argument('--locale', type=validate_locale, default='en_US.UTF-8')
|
|
52
|
+
args = parser.parse_args()
|
|
53
|
+
if sys.platform != 'darwin':
|
|
54
|
+
parser.error('The launcher requires macOS.')
|
|
55
|
+
if args.output.suffix != '.app':
|
|
56
|
+
parser.error('Output must end in .app.')
|
|
57
|
+
try:
|
|
58
|
+
bundle = create_bundle(args.output, args.timezone, args.locale)
|
|
59
|
+
except FileExistsError:
|
|
60
|
+
parser.error(f'Target already exists: {args.output}. Choose a different --output path.')
|
|
61
|
+
except OSError as error:
|
|
62
|
+
parser.error(str(error))
|
|
63
|
+
print(f'Created: {bundle}')
|
|
64
|
+
print('Quit Claude first, then open the launcher. You can drag it to the Dock.')
|
|
65
|
+
print('Switch to the launched Claude app with Command-Tab.')
|
|
66
|
+
print('Launch Services requests process settings; Claude may use existing services or system settings.')
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
if __name__ == '__main__':
|
|
70
|
+
main()
|