reinvent-compass 0.0.1 → 0.1.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.
Files changed (63) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +14 -0
  3. package/README.md +224 -3
  4. package/THIRD-PARTY-NOTICES.txt +311 -0
  5. package/dist/bin.js +64152 -0
  6. package/dist/data/venues.json +418 -0
  7. package/dist/fixtures/api/associate-favorites/error-401-expired-token.json +6 -0
  8. package/dist/fixtures/api/associate-favorites/error-429.json +9 -0
  9. package/dist/fixtures/api/associate-favorites/partial-failure-unknown-code.json +14 -0
  10. package/dist/fixtures/api/associate-favorites/success.json +9 -0
  11. package/dist/fixtures/api/cancel-reservation/error-401-expired-token.json +6 -0
  12. package/dist/fixtures/api/cancel-reservation/error-409.json +6 -0
  13. package/dist/fixtures/api/cancel-reservation/error-429.json +9 -0
  14. package/dist/fixtures/api/cancel-reservation/success.json +3 -0
  15. package/dist/fixtures/api/create-personal-time/error-401-expired-token.json +6 -0
  16. package/dist/fixtures/api/create-personal-time/error-429.json +9 -0
  17. package/dist/fixtures/api/create-personal-time/success.json +3 -0
  18. package/dist/fixtures/api/delete-personal-time/error-401-expired-token.json +6 -0
  19. package/dist/fixtures/api/delete-personal-time/error-429.json +9 -0
  20. package/dist/fixtures/api/delete-personal-time/success.json +3 -0
  21. package/dist/fixtures/api/disassociate-favorite/error-401-expired-token.json +6 -0
  22. package/dist/fixtures/api/disassociate-favorite/error-429.json +9 -0
  23. package/dist/fixtures/api/disassociate-favorite/success.json +3 -0
  24. package/dist/fixtures/api/get-event/success.json +16 -0
  25. package/dist/fixtures/api/get-schedule/error-401-expired-token.json +6 -0
  26. package/dist/fixtures/api/get-schedule/error-401.json +6 -0
  27. package/dist/fixtures/api/get-schedule/error-429.json +9 -0
  28. package/dist/fixtures/api/get-schedule/error-500.json +6 -0
  29. package/dist/fixtures/api/get-schedule/success.json +18 -0
  30. package/dist/fixtures/api/get-session/error-401-expired-token.json +6 -0
  31. package/dist/fixtures/api/get-session/error-404.json +6 -0
  32. package/dist/fixtures/api/get-session/error-429.json +9 -0
  33. package/dist/fixtures/api/get-session/success.json +30 -0
  34. package/dist/fixtures/api/list-events/success.json +18 -0
  35. package/dist/fixtures/api/list-sessions/error-401-expired-token.json +6 -0
  36. package/dist/fixtures/api/list-sessions/error-429.json +9 -0
  37. package/dist/fixtures/api/list-sessions/page-1.json +1254 -0
  38. package/dist/fixtures/api/list-sessions/page-2.json +1259 -0
  39. package/dist/fixtures/api/list-sessions/page-3.json +508 -0
  40. package/dist/fixtures/api/list-sessions/success.json +1254 -0
  41. package/dist/fixtures/api/reserve-sessions/error-400.json +6 -0
  42. package/dist/fixtures/api/reserve-sessions/error-401-expired-token.json +6 -0
  43. package/dist/fixtures/api/reserve-sessions/error-403.json +6 -0
  44. package/dist/fixtures/api/reserve-sessions/error-429.json +9 -0
  45. package/dist/fixtures/api/reserve-sessions/error-503.json +6 -0
  46. package/dist/fixtures/api/reserve-sessions/partial-failure-unknown-code.json +18 -0
  47. package/dist/fixtures/api/reserve-sessions/success.json +9 -0
  48. package/dist/fixtures/api/update-personal-time/error-401-expired-token.json +6 -0
  49. package/dist/fixtures/api/update-personal-time/error-429.json +9 -0
  50. package/dist/fixtures/api/update-personal-time/success.json +3 -0
  51. package/dist/fixtures/synthetic/catalog.json +3237 -0
  52. package/dist/fixtures/synthetic/index.json +126 -0
  53. package/dist/github-scan-worker.js +22231 -0
  54. package/dist/sample-repo/README.md +14 -0
  55. package/dist/sample-repo/cdk/stack.mts +10 -0
  56. package/dist/sample-repo/infra/main.tf +21 -0
  57. package/dist/sample-repo/package.json +12 -0
  58. package/dist/sample-repo/requirements.txt +1 -0
  59. package/dist/sample-repo/src/storage.mts +9 -0
  60. package/dist/sample-repo/src/table.mts +7 -0
  61. package/dist/sample-repo/tools/report.py +8 -0
  62. package/dist/scan-worker.js +2183 -0
  63. package/package.json +39 -12
package/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
package/NOTICE ADDED
@@ -0,0 +1,14 @@
1
+ re:Invent Compass
2
+ Copyright 2026 Hennie Francis
3
+
4
+ This product was created by Hennie Francis and is licensed under the
5
+ Apache License, Version 2.0 (see LICENSE).
6
+
7
+ The name "re:Invent Compass" and its logo identify the original project.
8
+ In line with Section 6 of the Apache License, no rights are granted to use
9
+ them for derivative works. Forks are welcome under a different name.
10
+
11
+ re:Invent Compass is an independent community project. It is not affiliated
12
+ with, endorsed by, or sponsored by Amazon Web Services, Inc. or its
13
+ affiliates. "AWS" and "re:Invent" are trademarks of Amazon.com, Inc. or its
14
+ affiliates and are used here only to describe compatibility.
package/README.md CHANGED
@@ -1,7 +1,228 @@
1
1
  # reinvent-compass
2
2
 
3
- This version (0.0.1) is a placeholder that reserves the package name. It contains no code.
3
+ Plan your AWS re:Invent week from your own code, book it safely, and get Boarding Passes on your phone.
4
4
 
5
- re:Invent Compass is a Kiro Power and a local MCP server that plans a first-timer's AWS re:Invent week. The first real release follows. Source: https://github.com/henniefrancis/aws-re_invent-compass
5
+ **Unofficial. Your badge is your ticket.** Reinvent Compass is an independent community project. It is not affiliated with, endorsed by or sponsored by AWS or Amazon.
6
6
 
7
- Unofficial community project, not affiliated with or endorsed by Amazon Web Services.
7
+ ## What it does
8
+
9
+ Compass is a local MCP server and a Kiro Power. Your AI assistant uses it to:
10
+
11
+ - read the session catalog and search it on your machine,
12
+ - scan a folder of yours, or a dev folder of git repositories (read-only), to see which AWS services you use and how deeply, and which other technology you use (.NET, Node.js, Python, React, Docker and more),
13
+ - read your GitHub repositories the same way, read-only and only after you confirm the list,
14
+ - keep that tech list on your machine, answer "What tech do I work on (the most)?" and find sessions on a technology ("Find me sessions on .NET"),
15
+ - plan a week of sessions that fits your tech, and write the plan as a Kiro spec in your workspace,
16
+ - check every booking against your real schedule before it is made, and block clashes,
17
+ - swap a booking for its repeat safely (it reserves the repeat first and cancels the original after),
18
+ - issue unofficial Boarding Passes and hand them to your phone with a short-lived QR code.
19
+
20
+ The guardrail that checks bookings runs inside the Compass server. It runs in every client, with or without hooks.
21
+
22
+ ## Install
23
+
24
+ You need Node.js 24 or newer. Compass starts with `npx --yes reinvent-compass@0.1.0`, which downloads the package on first use.
25
+
26
+ ### Kiro (the Power)
27
+
28
+ The Power is the `power/` folder of the repository: `plugin.json` and a matching `POWER.md` (Kiro needs one of the two at the root), `mcp.json`, three skills and a hook template.
29
+
30
+ 0. Kiro starts no MCP server until you allow it: in Settings, set "Kiro Agent: Configure MCP" to Enabled.
31
+ 1. In Kiro, open the Powers panel and choose Add Custom Power.
32
+ 2. Choose Import power from GitHub and give it the repository URL: `https://github.com/henniefrancis/aws-re_invent-compass`.
33
+ 3. If Kiro does not find the Power at the repository root, give it the subfolder URL instead: `https://github.com/henniefrancis/aws-re_invent-compass/tree/main/power`.
34
+
35
+ Both forms are listed because it is not yet recorded which one Kiro accepts. You can also import `power/` from a folder after cloning the repository. A folder import registers the Power under the folder name, so its server is called `power-power-compass`, whatever `plugin.json` says; the hooks accept both `compass` and that name.
36
+
37
+ Without the Power, add the server to `.kiro/settings/mcp.json` (this workspace) or `~/.kiro/settings/mcp.json` (all workspaces). Kiro reloads the file when you save it:
38
+
39
+ ```json
40
+ {
41
+ "mcpServers": {
42
+ "compass": {
43
+ "command": "npx",
44
+ "args": ["--yes", "reinvent-compass@0.1.0"],
45
+ "autoApprove": ["refresh_catalog", "find_sessions", "check_itinerary"]
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ Kiro documentation: https://kiro.dev/docs/mcp/configuration/ (checked 17 October 2026).
52
+
53
+ ### Claude Desktop
54
+
55
+ Open the Claude menu, then Settings, then Developer, then Edit Config. The file is `~/Library/Application Support/Claude/claude_desktop_config.json` on macOS and `%APPDATA%\Claude\claude_desktop_config.json` on Windows. Add:
56
+
57
+ ```json
58
+ {
59
+ "mcpServers": {
60
+ "compass": {
61
+ "command": "npx",
62
+ "args": ["--yes", "reinvent-compass@0.1.0"]
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ Quit Claude Desktop completely and start it again. Documentation: https://modelcontextprotocol.io/docs/develop/connect-local-servers (checked 17 October 2026).
69
+
70
+ ### VS Code
71
+
72
+ Create `.vscode/mcp.json` in the workspace, or run MCP: Open User Configuration for your profile. VS Code uses a `servers` object:
73
+
74
+ ```json
75
+ {
76
+ "servers": {
77
+ "compass": {
78
+ "type": "stdio",
79
+ "command": "npx",
80
+ "args": ["--yes", "reinvent-compass@0.1.0"]
81
+ }
82
+ }
83
+ }
84
+ ```
85
+
86
+ VS Code asks you to trust a server the first time it starts, and can ask you to confirm each tool call. Documentation: https://code.visualstudio.com/docs/copilot/customization/mcp-servers (checked 17 October 2026).
87
+
88
+ ### Kiro CLI
89
+
90
+ The Kiro CLI uses the same `mcpServers` JSON as the IDE; use the snippet from the Kiro section. The CLI also has `kiro-cli mcp add`, `list`, `remove`, `import` and `status` commands with a `workspace` or `global` scope. Run `kiro-cli mcp --help` for the exact options of your version. Documentation: https://kiro.dev/docs/mcp/ and https://kiro.dev/docs/reference/cli-commands/ (checked 17 October 2026).
91
+
92
+ Every command here names the exact version of this package. Pinning it is deliberate: see the threat model below. Change it only to a version you have looked up on the npm page.
93
+
94
+ ## The tools
95
+
96
+ | Tool | Class | What it does |
97
+ | --------------------------- | ------------ | -------------------------------------------------------------------------------------------------------------- |
98
+ | `sign_in` | local action | Signs you in with your AWS Builder ID. Opens your browser. |
99
+ | `sign_out` | local action | Revokes your sign-in and clears the stored tokens. |
100
+ | `refresh_catalog` | read | Loads the session catalog into a private local cache. |
101
+ | `find_sessions` | read | Searches and filters the cached catalog. |
102
+ | `scan_repo` | read | Scans a folder (or a dev folder of repos) read-only for AWS services and tech. |
103
+ | `show_my_tech` | read | Lists your tech list on this machine: AWS services first, then other technology. |
104
+ | `find_sessions_by_tech` | read | Finds catalog sessions on a technology, or on the tech you use the most. |
105
+ | `connect_github` | local action | Connects the read-only Compass GitHub App. Shows a code to enter on GitHub. |
106
+ | `scan_github` | read | Reads your GitHub repositories, read-only, after you confirm the list. |
107
+ | `disconnect_github` | local action | Deletes the GitHub sign-in on this machine. |
108
+ | `check_itinerary` | read | Runs the guardrail over proposed sessions. Writes nothing. |
109
+ | `show_schedule` | read | Lists your reservations, standby list and layovers with their ids. Writes nothing. |
110
+ | `plan_week` | local action | Plans a week and writes it as a Kiro spec in the workspace, after you confirm. |
111
+ | `export_calendar` | local action | Writes an `.ics` calendar file of your schedule. |
112
+ | `reserve_with_guardrails` | write | Reserves 1 to 10 sessions after the guardrail passes. Changes your real schedule. |
113
+ | `cancel_reservation` | write | Cancels a reservation, with the safe swap rule. Changes your real schedule. |
114
+ | `add_standby` | write | Favourites sessions as backups. Changes your real schedule. |
115
+ | `remove_standby` | write | Removes a favourite. Changes your real schedule. |
116
+ | `add_layover` | write | Creates, changes or deletes personal time. Changes your real schedule. |
117
+ | `issue_all_boarding_passes` | write | Creates unofficial Boarding Passes for all your reserved sessions; approving the call is the one confirmation. |
118
+ | `issue_boarding_pass` | write | Creates one Boarding Pass for a session you hold; without a session it asks which. |
119
+ | `send_to_phone` | write | Makes a 15-minute link for your passes: shown as a link, a QR code in your browser, or both. |
120
+ | `sync_passes` | write | Makes the passes match your schedule. It can void passes. |
121
+ | `forget_me` | write | Deletes your pass data on the server and on this machine. |
122
+
123
+ ## Approvals
124
+
125
+ Only three read tools may be auto-approved: `refresh_catalog`, `find_sessions` and `check_itinerary`. They change nothing and read nothing of yours. `scan_repo` is read-only too, but it reads a folder on your machine, so approve each scan yourself. It scans freely only inside the folder Compass was started in; for any other folder it asks you to confirm first, and a client that cannot ask cannot scan one. A scan never changes where the plan is written: that is always the folder Compass was started in. `show_schedule` is read-only as well, but it reads your schedule, so approve each call yourself. It takes no input and lists your reserved sessions, standby list and layovers with the ids that `cancel_reservation`, `remove_standby` and `add_layover` take. `show_my_tech` and `find_sessions_by_tech` read your tech list on this machine, so approve them per call too. `connect_github`, `scan_github` and `disconnect_github` touch your GitHub account: approve each call yourself. `scan_github` also asks you to confirm the repositories before it reads any, and a client that cannot ask cannot run it.
126
+
127
+ **Write tools must never be auto-approved.** That means every tool marked write above, including `sync_passes`, which can void passes. Approve each call yourself. Where your client supports it, Compass also asks you to confirm in the client before it changes your schedule, listing the session ids, codes, titles and any warnings. Declining writes nothing.
128
+
129
+ The Power does not ship an `autoApprove` list. If you add one in your own configuration, list only those three read tools.
130
+
131
+ ## Hooks (Kiro only)
132
+
133
+ Hooks are an extra check that only Kiro runs. The Power includes a hook template, and the `install-hooks` skill writes it to `.kiro/hooks/reinvent-compass.json` after you say yes.
134
+
135
+ - Kiro sends every Power tool call as one built-in tool, `kiro_powers`. The first hook matches it, and `pre-write-guardrail` picks out the Compass booking calls inside it, runs the same check as the server against your last read schedule and the cached catalog, and blocks the call when the guardrail blocks it.
136
+ - The second hook blocks any write through the remote `awsevents` server, so bookings go through Compass. Its matcher is lower case, because Kiro matches regular expressions against the lower-cased tool name.
137
+ - A hook can only block, with exit code 2. Anything a hook prints when it lets a call through never reaches the agent, so there is no sync reminder hook: the Compass tool results say when to run `sync_passes`.
138
+
139
+ The server checks every booking again, so nothing is unsafe in a client without hooks. A hook reads its input from stdin only, makes no network call and starts no other program. If it cannot judge a call, it says so and lets the call through. `npx --yes reinvent-compass@0.1.0 hook <name>` accepts only the names `pre-write-guardrail` and `post-write-sync` (the template uses only the first), and exits with code 0 or 2.
140
+
141
+ ## The official AWS Events server (read only)
142
+
143
+ AWS publishes its own MCP server at `https://api.awsevents.com/mcp` (https://docs.aws.amazon.com/events/latest/devguide/mcp-server.html). It is fine for reading events and sessions. Do not use its write tools (ReserveSessions, CancelReservation, AssociateFavorites, DisassociateFavorite, CreatePersonalTime, UpdatePersonalTime, DeletePersonalTime): they skip the Compass guardrail. If you add it yourself, add it to the workspace `.kiro/settings/mcp.json` (not to a Power) and list those seven in `disabledTools` by their full names: `AWSEventsPublicApi-Mcp-prod___ReserveSessions`, `AWSEventsPublicApi-Mcp-prod___CancelReservation`, `AWSEventsPublicApi-Mcp-prod___AssociateFavorites`, `AWSEventsPublicApi-Mcp-prod___DisassociateFavorite`, `AWSEventsPublicApi-Mcp-prod___CreatePersonalTime`, `AWSEventsPublicApi-Mcp-prod___UpdatePersonalTime` and `AWSEventsPublicApi-Mcp-prod___DeletePersonalTime`. A bare name such as `ReserveSessions` hides nothing. The Power does not bundle the server, because Kiro does not honour `disabledTools` inside a Power (ADR-024), and the hook template blocks the seven write tools as a second layer.
144
+
145
+ ## Read-only by default
146
+
147
+ Compass never changes your re:Invent schedule unless you ask it to in its settings. Signed in with your Builder ID, it reads the live catalog and your real reservations, standby list and layovers, and runs the booking guardrail as usual. By default the schedule write tools (`reserve_with_guardrails`, `cancel_reservation`, `add_standby`, `remove_standby` and `add_layover`) ask nothing and reply with what they would have done, that nothing changed, and that you can make the change in the re:Invent app. Underneath, every Events API write is refused before any request, so no path can change your schedule by accident. Boarding Passes still work, because they live on the Compass pass service, not in your re:Invent schedule.
148
+
149
+ To let Compass make changes, each one still confirmed by you first, set `COMPASS_ALLOW_WRITES=1` in the environment of the Compass MCP server. In Kiro that is the `env` of the server in your MCP settings: the `compass` entry for a manual install, or the Compass server the Power added (shown as `power-power-compass` when imported from a folder). While writes are on, every schedule reply in the chat starts with "Writes are on", and the server also logs one line. Only you should change this setting; the Power tells the agent never to.
150
+
151
+ ```json
152
+ "env": { "COMPASS_ALLOW_WRITES": "1" }
153
+ ```
154
+
155
+ Simulated mode never calls the Events API, so its made-up bookings work without the setting.
156
+
157
+ ## Passes on your phone
158
+
159
+ `send_to_phone` takes `show`: `link` gives a 15-minute link in the chat, `qr` opens a page with a QR code in your browser for your phone camera to scan (the chat then shows no link), and `both` does both. Without `show` it creates nothing and asks, and the Power tells your assistant to ask "Link or QR code?" first. The QR page is a static file in a new private folder in your temp folder (file mode 0600 on macOS and Linux; on Windows your own `%TEMP%` folder protects it), with no script and nothing loaded from outside. Compass deletes it when the link expires, when it shows a newer one, when `forget_me` runs and when the server stops, and clears out any page a crashed server left behind. If the browser cannot be opened, the QR code comes back in the chat instead. If no page appears, ask for a link.
160
+
161
+ ## Simulated mode and the demo
162
+
163
+ Set `COMPASS_MODE=simulated` to run the whole server on made-up data: a synthetic catalog, a signed-in attendee, a pinned clock, and an in-process pass service. No browser opens, no sign-in happens and nothing is sent anywhere. Every result starts with `SIMULATED MODE: no real data.` Simulated files live in a `simulated` folder, apart from real data. Simulated mode is refused when `NODE_ENV=production` unless `COMPASS_ALLOW_SIMULATED=1` is set.
164
+
165
+ Try the whole flow in one command:
166
+
167
+ ```
168
+ npx --yes reinvent-compass@0.1.0 demo
169
+ ```
170
+
171
+ It forces simulated mode and runs ten steps through the real tools on a copy of a sample repo: sign in and load the catalog, scan the repo, plan the week, a clash that is blocked, a safe swap, reserve the session that clashed, issue passes, hand them to a phone with a QR code, cancel a session, and void its pass. It prints which step failed and exits 1 if one does. `demo --repo <folder>` scans a folder of yours instead (a copy is used, so your folder is not changed).
172
+
173
+ ## Your tech list and GitHub
174
+
175
+ Every scan adds to one tech list on your machine: the AWS services you use (with depth) and the other technology you use, such as .NET, C#, Node.js, TypeScript, Python, Java, Go, React, Angular, Docker, Kubernetes and Terraform. Ask "What tech do I work on?" or "What do I use the most?" (`show_my_tech`), and "Find me sessions on .NET" (`find_sessions_by_tech`, which also knows "dotnet" and "C#"). `plan_week` ranks sessions by the whole list.
176
+
177
+ - **A dev folder.** Point `scan_repo` at a folder of projects. Each git repository one or two levels down is scanned on its own, up to 50, and the reply says how many it scanned and skipped.
178
+ - **The AWS SDK for .NET** counts as AWS evidence: `AWSSDK.*` package references in `.csproj` files and `new Amazon<Name>Client(` in C#.
179
+ - **GitHub, read-only.** `connect_github` signs you in to the Compass GitHub App with a code you enter on github.com. The app has only Contents: read and Metadata: read, so it can never change your code. When you install it on GitHub you choose which accounts, organisations and repositories it may read; an organisation's owner must approve it there. `scan_github` lists the repositories it is about to read and reads nothing until you confirm. Forks are left out unless you ask (`includeForks`). Each repository is downloaded as an archive into memory, scanned under a time and size limit and dropped; nothing is written to disk.
180
+ - **Disconnect.** `disconnect_github` (or `forget_me`) deletes the GitHub sign-in on this machine. To remove the app on GitHub as well, uninstall it at https://github.com/settings/installations and revoke it at https://github.com/settings/apps/authorizations.
181
+
182
+ ## What leaves your machine
183
+
184
+ - **Your sign-in tokens** stay in your operating system keychain (or in memory only, if there is no keychain). The access token goes only to `api.awsevents.com`, the refresh token only to `oauth.awsevents.com`, and the ID token only to the Compass pass service.
185
+ - **Your repository** is read on your machine. Only service and technology names, a depth per service and counts are used; no file name, path or content leaves the scanner.
186
+ - **Your tech list** is kept in your app-data folder (mode 0600) and removed by `forget_me`. Each project is stored under a one-way hash, so no folder path or repository name is kept. It is never sent anywhere.
187
+ - **GitHub**: the GitHub tokens stay in your operating system keychain (or in memory only) and go only to `github.com` and `api.github.com`. Repository archives come from `codeload.github.com` without the token, are read in memory and are never saved. Nothing about your repositories goes to Compass or to AWS.
188
+ - **Your schedule** is read from the AWS Events service. A copy is kept in your app-data folder (mode 0600) and removed by `forget_me`.
189
+ - **Session text** from the catalog is shown to your assistant as labelled data, never as instructions. Session abstracts are never passed on.
190
+ - **Boarding Passes**: when you issue passes, the pass fields (session code, title, times, room and an optional name you type yourself) go to the Compass pass service. Apple or Google receive them if you add a pass to a wallet. The ID token is checked and never stored.
191
+ - **Nothing is logged** that holds a token, an email address, a link or a file path. Logs go to stderr, never to stdout.
192
+ - **The week spec** is written into your workspace folder, after you confirm the folder. If the folder is a public repository the plan would show where you will be and when, so Compass offers to add it to `.gitignore`.
193
+
194
+ ## How depth is worked out
195
+
196
+ Other technology gets a score instead of a depth: 1 for each file of its language, plus 5 for each manifest or package that declares it. `show_my_tech` ranks it by the number of projects that use it, then by score.
197
+
198
+ The scanner counts evidence per AWS service from Terraform, CDK (TypeScript), AWS SDK for JavaScript v3, boto3 (Python), the AWS SDK for .NET (`.csproj` and C#) and package manifests.
199
+
200
+ - `none`: no evidence.
201
+ - `exploring`: only imports, or packages listed as dependencies.
202
+ - `building`: any real resource, construct, client or command.
203
+ - `production`: building, with both infrastructure and code usage, and either a score of 12 or more or a production marker in the repository.
204
+
205
+ The score is 2 for each resource, construct or client, plus 1 for each command, import or dependency. A depth maps to a suggested session level: exploring is level 100 (200 with more evidence), building is 300 and production is 400. A boto3 client or resource call counts like an SDK client.
206
+
207
+ ## Threat model
208
+
209
+ | Risk | What Compass does |
210
+ | ----------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
211
+ | A session title or a file in your repo tries to talk to the assistant (prompt injection) | Catalog text comes back as labelled JSON data. Write tools are never auto-approved. The guardrail runs in the server. |
212
+ | Another program on your machine steals tokens | Tokens live in the OS keychain. The sign-in server binds to 127.0.0.1, takes one request and closes. |
213
+ | A token or email ends up in a log | A redacting logger on stderr, and tests that prove no token or email reaches a log or an error. |
214
+ | Someone books through the remote `awsevents` server and skips the guardrail | Do not use its write tools. The hook template blocks them in Kiro. |
215
+ | The wrong program runs when you start Compass with `npx` (the local copy risk) | `npx` can prefer a copy of a package from the folder you are in. Pin the version (`reinvent-compass@0.1.0`), do not start Compass from inside a repository you do not trust, and prefer a global install of a pinned version. |
216
+ | Someone else publishes a package under the same npm name before the owner does (name squatting) | The owner must claim the npm package name `reinvent-compass` (and any scope used) before the first publish, and publish from the owner's account with provenance. Until the name is claimed, install only from the repository. This is an owner action, not something the code can do. |
217
+ | A hostile repository (a slow pattern, a huge archive, a deep or `..` path, links) | Every scan runs in a worker with a hard time budget. Archives stop at 100 MB compressed or 500 MB unpacked, files over 1 MB and binary files are skipped, links and `..` paths are never followed, and nothing is written to disk. |
218
+ | A GitHub token is stolen or misused | The Compass GitHub App can only read code. Tokens live in the OS keychain, are redacted from every log and error, go only to `github.com` and `api.github.com`, and are never sent on the archive redirect. `disconnect_github` deletes them. |
219
+ | A workspace edits the hook to skip the check | The hook is a convenience. The server runs the same check. |
220
+ | Supply chain | Exact version pins in the Power and in the hook template. |
221
+
222
+ ## Troubleshooting
223
+
224
+ - **"No OS keychain is available" (tokens held in memory only)**: on Linux, tokens need the Secret Service (for example GNOME Keyring). Without it, Compass holds them in memory and you sign in again each session.
225
+ - **Sign-in does not open a browser**: Compass prints the sign-in address on stderr. Open it by hand. Sign-in uses a local port from 8484 to 8489, so make sure one of them is free.
226
+ - **"Run refresh_catalog first"**: the catalog cache is empty. Run `refresh_catalog`.
227
+ - **A hook says Compass could not check a call**: nothing is wrong. The server checks it.
228
+ - **A write says it is unconfirmed**: the request went out, but the schedule could not be read back. Check your schedule before trying again. Compass does not send it twice.