@laitszkin/apollo-toolkit 3.10.0 → 3.11.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/CHANGELOG.md +37 -0
- package/analyse-app-logs/scripts/__pycache__/filter_logs_by_time.cpython-312.pyc +0 -0
- package/analyse-app-logs/scripts/__pycache__/log_cli_utils.cpython-312.pyc +0 -0
- package/analyse-app-logs/scripts/__pycache__/search_logs.cpython-312.pyc +0 -0
- package/docs-to-voice/scripts/__pycache__/docs_to_voice.cpython-312.pyc +0 -0
- package/generate-spec/SKILL.md +17 -15
- package/generate-spec/agents/openai.yaml +1 -1
- package/generate-spec/references/TEMPLATE_SPEC.md +103 -84
- package/generate-spec/scripts/__pycache__/create-specscpython-312.pyc +0 -0
- package/init-project-html/SKILL.md +117 -125
- package/init-project-html/agents/openai.yaml +18 -9
- package/init-project-html/lib/atlas/assets/architecture.css +161 -0
- package/init-project-html/lib/atlas/assets/viewer.client.js +136 -0
- package/init-project-html/lib/atlas/cli.js +1023 -0
- package/init-project-html/lib/atlas/layout.js +330 -0
- package/init-project-html/lib/atlas/render.js +583 -0
- package/init-project-html/lib/atlas/schema.js +347 -0
- package/init-project-html/lib/atlas/state.js +402 -0
- package/init-project-html/references/TEMPLATE_SPEC.md +140 -83
- package/init-project-html/sample-demo/resources/project-architecture/assets/architecture.css +160 -1058
- package/init-project-html/sample-demo/resources/project-architecture/assets/viewer.client.js +136 -0
- package/init-project-html/sample-demo/resources/project-architecture/atlas/atlas.index.yaml +34 -0
- package/init-project-html/sample-demo/resources/project-architecture/atlas/features/get-invite-codes.yaml +172 -0
- package/init-project-html/sample-demo/resources/project-architecture/atlas/features/invite-code-registration.yaml +160 -0
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/index.html +67 -52
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/invite-code-generator.html +64 -163
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/invite-issuance-service.html +102 -196
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/postgresql.html +82 -163
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/public-api.html +88 -150
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/web-get-invite-ui.html +83 -138
- package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/index.html +61 -51
- package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/postgresql.html +84 -159
- package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/public-api.html +81 -143
- package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/registration-service.html +98 -188
- package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/web-register-ui.html +83 -138
- package/init-project-html/sample-demo/resources/project-architecture/index.html +256 -335
- package/init-project-html/scripts/architecture.js +65 -247
- package/katex/scripts/__pycache__/render_katex.cpython-312.pyc +0 -0
- package/open-github-issue/scripts/__pycache__/open_github_issue.cpython-312.pyc +0 -0
- package/package.json +6 -2
- package/read-github-issue/scripts/__pycache__/find_issues.cpython-312.pyc +0 -0
- package/read-github-issue/scripts/__pycache__/read_issue.cpython-312.pyc +0 -0
- package/resolve-review-comments/scripts/__pycache__/review_threads.cpython-312.pyc +0 -0
- package/spec-to-project-html/SKILL.md +74 -67
- package/spec-to-project-html/agents/openai.yaml +14 -8
- package/spec-to-project-html/references/TEMPLATE_SPEC.md +98 -83
- package/text-to-short-video/scripts/__pycache__/enforce_video_aspect_ratio.cpython-312.pyc +0 -0
|
@@ -1,140 +1,85 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
|
-
<html lang="
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
<
|
|
14
|
-
</
|
|
15
|
-
<
|
|
16
|
-
<
|
|
17
|
-
<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
<
|
|
28
|
-
<
|
|
29
|
-
<
|
|
30
|
-
<
|
|
31
|
-
<
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
</
|
|
70
|
-
</
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
<
|
|
76
|
-
|
|
77
|
-
<
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
<td class="sub-vars__name">isLoading</td>
|
|
86
|
-
<td class="sub-vars__type">boolean</td>
|
|
87
|
-
<td><span class="sub-vars__scope sub-vars__scope--instance">instance</span></td>
|
|
88
|
-
<td>生成 API 進行中旗標;防止連按重複生成造成額度被無意義消耗。</td>
|
|
89
|
-
</tr>
|
|
90
|
-
<tr>
|
|
91
|
-
<td class="sub-vars__name">retryAfter</td>
|
|
92
|
-
<td class="sub-vars__type">number seconds | null</td>
|
|
93
|
-
<td><span class="sub-vars__scope sub-vars__scope--instance">instance</span></td>
|
|
94
|
-
<td>後端 429 帶回的下次可生成時間;按鈕禁用倒數的依據,業務上提示使用者「節流而非系統故障」。</td>
|
|
95
|
-
</tr>
|
|
96
|
-
<tr>
|
|
97
|
-
<td class="sub-vars__name">Result</td>
|
|
98
|
-
<td class="sub-vars__type">{ok: NewCode} | {err: UiError}</td>
|
|
99
|
-
<td><span class="sub-vars__scope sub-vars__scope--call">call</span></td>
|
|
100
|
-
<td>一次「生成」呼叫結果;驅動是否要把新碼樂觀插入 <code>list</code>,或顯示錯誤 banner。</td>
|
|
101
|
-
</tr>
|
|
102
|
-
<tr>
|
|
103
|
-
<td class="sub-vars__name">UiMessage</td>
|
|
104
|
-
<td class="sub-vars__type">{lang_tag, text}</td>
|
|
105
|
-
<td><span class="sub-vars__scope sub-vars__scope--call">call</span></td>
|
|
106
|
-
<td>額度/網路錯誤的本地化呈現;使用者透過此訊息知道是自己的額度問題還是系統暫時不可用。</td>
|
|
107
|
-
</tr>
|
|
108
|
-
</tbody>
|
|
109
|
-
</table>
|
|
110
|
-
</section>
|
|
111
|
-
|
|
112
|
-
<section class="sub-dataflow">
|
|
113
|
-
<h2>內部資料流</h2>
|
|
114
|
-
<ol>
|
|
115
|
-
<li>頁面掛載 → <code>useInviteCodes</code> 取得 <code>list</code> 顯示。</li>
|
|
116
|
-
<li>使用者點生成 → <code>createInviteCode</code>:UI <code>idle → loading</code>。</li>
|
|
117
|
-
<li><code>Result.ok</code> → 把 <code>NewCode</code> prepend 到 <code>list</code>(保持其餘元素穩定)。</li>
|
|
118
|
-
<li><code>Result.err</code> 為 quota → <code>formatQuotaError</code> 顯示 <code>UiMessage</code>,<code>list</code> 不變。</li>
|
|
119
|
-
<li>使用者選擇 <code>copyCodeToClipboard(code)</code>,不影響資料模型。</li>
|
|
120
|
-
</ol>
|
|
121
|
-
</section>
|
|
122
|
-
|
|
123
|
-
<section class="sub-errors">
|
|
124
|
-
<h2>本子模組可暴露的錯誤</h2>
|
|
125
|
-
<table>
|
|
126
|
-
<thead><tr><th>來源</th><th>UI 行為</th></tr></thead>
|
|
127
|
-
<tbody>
|
|
128
|
-
<tr><td>未登入(401)</td><td>路由守衛攔截 → 導向登入;本子模組不顯示業務錯誤。</td></tr>
|
|
129
|
-
<tr><td>quota(429)</td><td><code>formatQuotaError</code> banner;按鈕短暫禁用至 <code>retryAfter</code>。</td></tr>
|
|
130
|
-
<tr><td>網路錯誤</td><td>泛用提示;可重試。</td></tr>
|
|
131
|
-
</tbody>
|
|
132
|
-
</table>
|
|
133
|
-
</section>
|
|
134
|
-
|
|
135
|
-
<footer class="atlas-meta" style="margin-top: 2rem">
|
|
136
|
-
<p><a href="../../index.html">← 宏觀架構</a> · <a href="./index.html">← 功能總覽</a></p>
|
|
137
|
-
</footer>
|
|
138
|
-
</main>
|
|
139
|
-
</body>
|
|
2
|
+
<html lang="en" data-atlas-page="submodule">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>Get invite codes · web-get-invite-ui</title>
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
7
|
+
<link rel="stylesheet" href="../../assets/architecture.css">
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<header class="submodule-header">
|
|
11
|
+
<nav class="submodule-breadcrumb"><a href="../../index.html">← Atlas</a> · <a href="index.html">← Get invite codes</a></nav>
|
|
12
|
+
<h1>web-get-invite-ui <small class="submodule-kind submodule-kind--ui">UI</small></h1>
|
|
13
|
+
<p class="submodule-role">React page that lets a signed-in member request a new invite code.</p>
|
|
14
|
+
</header>
|
|
15
|
+
<main class="submodule-main">
|
|
16
|
+
<section class="sub-io" aria-label="Function I/O">
|
|
17
|
+
<h2>Function I/O</h2>
|
|
18
|
+
<table class="sub-table">
|
|
19
|
+
<thead><tr><th scope="col">Name</th><th scope="col">In</th><th scope="col">Out</th><th scope="col">Side</th><th scope="col">Purpose</th></tr></thead>
|
|
20
|
+
<tbody>
|
|
21
|
+
<tr><td>handleGenerate</td><td>MouseEvent</td><td>void</td><td>io</td><td>Calls POST /api/invites and renders the returned code.</td></tr>
|
|
22
|
+
</tbody>
|
|
23
|
+
</table>
|
|
24
|
+
</section>
|
|
25
|
+
<section class="sub-vars" aria-label="Variables">
|
|
26
|
+
<h2>Variables</h2>
|
|
27
|
+
<table class="sub-table">
|
|
28
|
+
<thead><tr><th scope="col">Name</th><th scope="col">Type</th><th scope="col">Scope</th><th scope="col">Purpose</th></tr></thead>
|
|
29
|
+
<tbody>
|
|
30
|
+
<tr><td>userId</td><td>string</td><td>call</td><td>Identifies the member who will own the new invite row.</td></tr>
|
|
31
|
+
<tr><td>code</td><td>string</td><td>instance</td><td>Last issued code shown to the member.</td></tr>
|
|
32
|
+
</tbody>
|
|
33
|
+
</table>
|
|
34
|
+
</section>
|
|
35
|
+
<section class="sub-dataflow" aria-label="Internal data flow">
|
|
36
|
+
<h2>Internal data flow</h2>
|
|
37
|
+
<div class="sub-dataflow__canvas" data-pan-zoom-container>
|
|
38
|
+
<div class="sub-dataflow__toolbar" role="toolbar" aria-label="Diagram controls">
|
|
39
|
+
<button type="button" data-pan-zoom="zoom-in" aria-label="Zoom in">+</button>
|
|
40
|
+
<button type="button" data-pan-zoom="zoom-out" aria-label="Zoom out">−</button>
|
|
41
|
+
<button type="button" data-pan-zoom="fit" aria-label="Reset view">Fit</button>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="sub-dataflow__viewport" data-pan-zoom-viewport>
|
|
44
|
+
<svg class="sub-dataflow__svg" data-atlas-svg="sub-dataflow" viewBox="0 0 628 368" role="img" aria-label="Internal dataflow">
|
|
45
|
+
<defs>
|
|
46
|
+
<marker id="sub-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="9" markerHeight="9" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 Z" /></marker>
|
|
47
|
+
</defs>
|
|
48
|
+
<g class="sub-dataflow__step">
|
|
49
|
+
<circle class="sub-dataflow__badge" cx="42" cy="68" r="18" />
|
|
50
|
+
<text class="sub-dataflow__badge-text" x="42" y="73" text-anchor="middle">1</text>
|
|
51
|
+
<rect class="sub-dataflow__box" x="80" y="32" width="520" height="72" rx="14" ry="14" />
|
|
52
|
+
<text class="sub-dataflow__text" x="340" y="74" text-anchor="middle">Read userId from auth context.</text>
|
|
53
|
+
</g>
|
|
54
|
+
<line class="sub-dataflow__arrow" x1="340" y1="110" x2="340" y2="140" marker-end="url(#sub-arrow)" />
|
|
55
|
+
<g class="sub-dataflow__step">
|
|
56
|
+
<circle class="sub-dataflow__badge" cx="42" cy="184" r="18" />
|
|
57
|
+
<text class="sub-dataflow__badge-text" x="42" y="189" text-anchor="middle">2</text>
|
|
58
|
+
<rect class="sub-dataflow__box" x="80" y="148" width="520" height="72" rx="14" ry="14" />
|
|
59
|
+
<text class="sub-dataflow__text" x="340" y="190" text-anchor="middle">POST /api/invites with userId.</text>
|
|
60
|
+
</g>
|
|
61
|
+
<line class="sub-dataflow__arrow" x1="340" y1="226" x2="340" y2="256" marker-end="url(#sub-arrow)" />
|
|
62
|
+
<g class="sub-dataflow__step">
|
|
63
|
+
<circle class="sub-dataflow__badge" cx="42" cy="300" r="18" />
|
|
64
|
+
<text class="sub-dataflow__badge-text" x="42" y="305" text-anchor="middle">3</text>
|
|
65
|
+
<rect class="sub-dataflow__box" x="80" y="264" width="520" height="72" rx="14" ry="14" />
|
|
66
|
+
<text class="sub-dataflow__text" x="340" y="306" text-anchor="middle">Render returned code or surface error.</text>
|
|
67
|
+
</g>
|
|
68
|
+
</svg>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</section>
|
|
72
|
+
<section class="sub-errors" aria-label="Errors">
|
|
73
|
+
<h2>Errors</h2>
|
|
74
|
+
<table class="sub-table">
|
|
75
|
+
<thead><tr><th scope="col">Name</th><th scope="col">When</th><th scope="col">Means</th></tr></thead>
|
|
76
|
+
<tbody>
|
|
77
|
+
<tr><td>ErrUnauthenticated</td><td>Session is missing on the client.</td><td>Redirect to sign-in.</td></tr>
|
|
78
|
+
<tr><td>ErrIssuanceFailed</td><td>API returns 500.</td><td>Show retry banner.</td></tr>
|
|
79
|
+
</tbody>
|
|
80
|
+
</table>
|
|
81
|
+
</section>
|
|
82
|
+
</main>
|
|
83
|
+
<script src="../../assets/viewer.client.js" defer></script>
|
|
84
|
+
</body>
|
|
140
85
|
</html>
|
|
@@ -1,53 +1,63 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
|
-
<html lang="
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
<
|
|
14
|
-
</
|
|
15
|
-
<
|
|
16
|
-
<
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
<
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
</
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
</
|
|
45
|
-
</
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
2
|
+
<html lang="en" data-atlas-page="feature">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>Invite-code registration</title>
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
7
|
+
<link rel="stylesheet" href="../../assets/architecture.css">
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<header class="feature-header">
|
|
11
|
+
<nav class="feature-breadcrumb"><a href="../../index.html">← Atlas</a></nav>
|
|
12
|
+
<h1>Invite-code registration</h1>
|
|
13
|
+
<p class="feature-depends">Depends on: <a href="../get-invite-codes/index.html">get-invite-codes</a></p>
|
|
14
|
+
</header>
|
|
15
|
+
<main class="feature-main">
|
|
16
|
+
<section class="feature-story"><p>A visitor holding an invite code submits email/password plus the code. The registration service validates the code inside a single transaction; on success it creates a new user and consumes the invite_codes row issued earlier by `get-invite-codes`.</p></section>
|
|
17
|
+
<section class="feature-submodules" aria-label="Submodules">
|
|
18
|
+
<h2>Submodules</h2>
|
|
19
|
+
<ul class="submodule-nav">
|
|
20
|
+
<li class="submodule-card">
|
|
21
|
+
<a class="submodule-card__link" href="web-register-ui.html">
|
|
22
|
+
<span class="submodule-card__name">web-register-ui</span>
|
|
23
|
+
<span class="submodule-card__kind submodule-card__kind--ui">UI</span>
|
|
24
|
+
</a>
|
|
25
|
+
<p class="submodule-card__role">React page that captures email, password, and invite code.</p>
|
|
26
|
+
</li>
|
|
27
|
+
<li class="submodule-card">
|
|
28
|
+
<a class="submodule-card__link" href="public-api.html">
|
|
29
|
+
<span class="submodule-card__name">public-api</span>
|
|
30
|
+
<span class="submodule-card__kind submodule-card__kind--api">API</span>
|
|
31
|
+
</a>
|
|
32
|
+
<p class="submodule-card__role">HTTP boundary for `/api/register` POST requests.</p>
|
|
33
|
+
</li>
|
|
34
|
+
<li class="submodule-card">
|
|
35
|
+
<a class="submodule-card__link" href="registration-service.html">
|
|
36
|
+
<span class="submodule-card__name">registration-service</span>
|
|
37
|
+
<span class="submodule-card__kind submodule-card__kind--service">Service</span>
|
|
38
|
+
</a>
|
|
39
|
+
<p class="submodule-card__role">Owns the registration transaction (consumer side of the invite_codes data row).</p>
|
|
40
|
+
</li>
|
|
41
|
+
<li class="submodule-card">
|
|
42
|
+
<a class="submodule-card__link" href="postgresql.html">
|
|
43
|
+
<span class="submodule-card__name">postgresql</span>
|
|
44
|
+
<span class="submodule-card__kind submodule-card__kind--db">DB</span>
|
|
45
|
+
</a>
|
|
46
|
+
<p class="submodule-card__role">Stores `users` rows and applies invite-code state transitions inside the registration tx.</p>
|
|
47
|
+
</li>
|
|
48
|
+
</ul>
|
|
49
|
+
</section>
|
|
50
|
+
<section class="feature-edges" aria-label="Intra-feature edges">
|
|
51
|
+
<h2>Intra-feature edges</h2>
|
|
52
|
+
<ul class="feature-edges__list">
|
|
53
|
+
<li class="feature-edges__item feature-edges__item--call"><span class="feature-edges__endpoints">web-register-ui → public-api</span><span class="feature-edges__kind">call</span><span class="feature-edges__label">POST /api/register</span></li>
|
|
54
|
+
<li class="feature-edges__item feature-edges__item--call"><span class="feature-edges__endpoints">public-api → registration-service</span><span class="feature-edges__kind">call</span><span class="feature-edges__label">RegisterWithInvite(ctx, RegisterInput)</span></li>
|
|
55
|
+
<li class="feature-edges__item feature-edges__item--call"><span class="feature-edges__endpoints">registration-service → postgresql</span><span class="feature-edges__kind">call</span><span class="feature-edges__label">SELECT invite_codes FOR UPDATE</span></li>
|
|
56
|
+
<li class="feature-edges__item feature-edges__item--call"><span class="feature-edges__endpoints">registration-service → postgresql</span><span class="feature-edges__kind">call</span><span class="feature-edges__label">INSERT users</span></li>
|
|
57
|
+
<li class="feature-edges__item feature-edges__item--call"><span class="feature-edges__endpoints">registration-service → postgresql</span><span class="feature-edges__kind">call</span><span class="feature-edges__label">UPDATE invite_codes.consumed_at</span></li>
|
|
58
|
+
<li class="feature-edges__item feature-edges__item--return"><span class="feature-edges__endpoints">postgresql → registration-service</span><span class="feature-edges__kind">return</span><span class="feature-edges__label">row | rows_affected</span></li>
|
|
59
|
+
</ul>
|
|
60
|
+
</section>
|
|
61
|
+
</main>
|
|
62
|
+
</body>
|
|
53
63
|
</html>
|