@knowledgine/cli 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/dist/commands/capture.d.ts +13 -0
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +113 -12
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/demo.d.ts.map +1 -1
- package/dist/commands/demo.js +23 -19
- package/dist/commands/demo.js.map +1 -1
- package/dist/commands/deprecation-check.d.ts +7 -0
- package/dist/commands/deprecation-check.d.ts.map +1 -0
- package/dist/commands/deprecation-check.js +75 -0
- package/dist/commands/deprecation-check.js.map +1 -0
- package/dist/commands/explain.d.ts +10 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +252 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/feedback-suggest.d.ts +8 -0
- package/dist/commands/feedback-suggest.d.ts.map +1 -0
- package/dist/commands/feedback-suggest.js +43 -0
- package/dist/commands/feedback-suggest.js.map +1 -0
- package/dist/commands/feedback.d.ts +9 -0
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +57 -21
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/ingest.d.ts +1 -0
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +96 -19
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +126 -61
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/plugins.d.ts.map +1 -1
- package/dist/commands/plugins.js +14 -13
- package/dist/commands/plugins.js.map +1 -1
- package/dist/commands/recall.d.ts +10 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +199 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +55 -13
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/serve.d.ts +8 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +60 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/setup-rules.d.ts +27 -0
- package/dist/commands/setup-rules.d.ts.map +1 -0
- package/dist/commands/setup-rules.js +309 -0
- package/dist/commands/setup-rules.js.map +1 -0
- package/dist/commands/setup-skills.d.ts +55 -0
- package/dist/commands/setup-skills.d.ts.map +1 -0
- package/dist/commands/setup-skills.js +356 -0
- package/dist/commands/setup-skills.js.map +1 -0
- package/dist/commands/setup.d.ts +62 -5
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +358 -104
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +27 -20
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +81 -53
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/suggest.d.ts +11 -0
- package/dist/commands/suggest.d.ts.map +1 -0
- package/dist/commands/suggest.js +255 -0
- package/dist/commands/suggest.js.map +1 -0
- package/dist/commands/tool.d.ts.map +1 -1
- package/dist/commands/tool.js +5 -5
- package/dist/commands/tool.js.map +1 -1
- package/dist/commands/undeprecate.d.ts +5 -0
- package/dist/commands/undeprecate.d.ts.map +1 -0
- package/dist/commands/undeprecate.js +27 -0
- package/dist/commands/undeprecate.js.map +1 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +64 -18
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/index.js +92 -20
- package/dist/index.js.map +1 -1
- package/dist/lib/content-extractor.d.ts +8 -0
- package/dist/lib/content-extractor.d.ts.map +1 -0
- package/dist/lib/content-extractor.js +50 -0
- package/dist/lib/content-extractor.js.map +1 -0
- package/dist/lib/diff-parser.d.ts +14 -0
- package/dist/lib/diff-parser.d.ts.map +1 -0
- package/dist/lib/diff-parser.js +108 -0
- package/dist/lib/diff-parser.js.map +1 -0
- package/dist/lib/entity-extractor.d.ts +17 -0
- package/dist/lib/entity-extractor.d.ts.map +1 -0
- package/dist/lib/entity-extractor.js +23 -0
- package/dist/lib/entity-extractor.js.map +1 -0
- package/dist/lib/formatter.d.ts.map +1 -1
- package/dist/lib/formatter.js +31 -32
- package/dist/lib/formatter.js.map +1 -1
- package/dist/lib/indexer.d.ts +2 -0
- package/dist/lib/indexer.d.ts.map +1 -1
- package/dist/lib/indexer.js +2 -0
- package/dist/lib/indexer.js.map +1 -1
- package/dist/lib/ingest-watcher.d.ts.map +1 -1
- package/dist/lib/ingest-watcher.js +2 -0
- package/dist/lib/ingest-watcher.js.map +1 -1
- package/dist/lib/plugin-loader.d.ts.map +1 -1
- package/dist/lib/plugin-loader.js +3 -1
- package/dist/lib/plugin-loader.js.map +1 -1
- package/dist/lib/progress.d.ts +8 -0
- package/dist/lib/progress.d.ts.map +1 -1
- package/dist/lib/progress.js +45 -6
- package/dist/lib/progress.js.map +1 -1
- package/dist/lib/ui/box.d.ts +7 -0
- package/dist/lib/ui/box.d.ts.map +1 -0
- package/dist/lib/ui/box.js +19 -0
- package/dist/lib/ui/box.js.map +1 -0
- package/dist/lib/ui/error-formatter.d.ts +8 -0
- package/dist/lib/ui/error-formatter.d.ts.map +1 -0
- package/dist/lib/ui/error-formatter.js +19 -0
- package/dist/lib/ui/error-formatter.js.map +1 -0
- package/dist/lib/ui/index.d.ts +7 -0
- package/dist/lib/ui/index.d.ts.map +1 -0
- package/dist/lib/ui/index.js +7 -0
- package/dist/lib/ui/index.js.map +1 -0
- package/dist/lib/ui/output.d.ts +2 -0
- package/dist/lib/ui/output.d.ts.map +1 -0
- package/dist/lib/ui/output.js +4 -0
- package/dist/lib/ui/output.js.map +1 -0
- package/dist/lib/ui/spinner.d.ts +4 -0
- package/dist/lib/ui/spinner.d.ts.map +1 -0
- package/dist/lib/ui/spinner.js +5 -0
- package/dist/lib/ui/spinner.js.map +1 -0
- package/dist/lib/ui/table.d.ts +9 -0
- package/dist/lib/ui/table.d.ts.map +1 -0
- package/dist/lib/ui/table.js +28 -0
- package/dist/lib/ui/table.js.map +1 -0
- package/dist/lib/ui/theme.d.ts +21 -0
- package/dist/lib/ui/theme.d.ts.map +1 -0
- package/dist/lib/ui/theme.js +29 -0
- package/dist/lib/ui/theme.js.map +1 -0
- package/dist/lib/unknown-command-handler.d.ts +14 -0
- package/dist/lib/unknown-command-handler.d.ts.map +1 -0
- package/dist/lib/unknown-command-handler.js +25 -0
- package/dist/lib/unknown-command-handler.js.map +1 -0
- package/dist/lib/url-validator.d.ts.map +1 -1
- package/dist/lib/url-validator.js +5 -1
- package/dist/lib/url-validator.js.map +1 -1
- package/dist/templates/rules/antigravity.d.ts +6 -0
- package/dist/templates/rules/antigravity.d.ts.map +1 -0
- package/dist/templates/rules/antigravity.js +30 -0
- package/dist/templates/rules/antigravity.js.map +1 -0
- package/dist/templates/rules/claude-code.d.ts +6 -0
- package/dist/templates/rules/claude-code.d.ts.map +1 -0
- package/dist/templates/rules/claude-code.js +32 -0
- package/dist/templates/rules/claude-code.js.map +1 -0
- package/dist/templates/rules/cline.d.ts +6 -0
- package/dist/templates/rules/cline.d.ts.map +1 -0
- package/dist/templates/rules/cline.js +35 -0
- package/dist/templates/rules/cline.js.map +1 -0
- package/dist/templates/rules/codex.d.ts +6 -0
- package/dist/templates/rules/codex.d.ts.map +1 -0
- package/dist/templates/rules/codex.js +37 -0
- package/dist/templates/rules/codex.js.map +1 -0
- package/dist/templates/rules/continue.d.ts +6 -0
- package/dist/templates/rules/continue.d.ts.map +1 -0
- package/dist/templates/rules/continue.js +31 -0
- package/dist/templates/rules/continue.js.map +1 -0
- package/dist/templates/rules/core-rules.d.ts +6 -0
- package/dist/templates/rules/core-rules.d.ts.map +1 -0
- package/dist/templates/rules/core-rules.js +33 -0
- package/dist/templates/rules/core-rules.js.map +1 -0
- package/dist/templates/rules/cursor.d.ts +6 -0
- package/dist/templates/rules/cursor.d.ts.map +1 -0
- package/dist/templates/rules/cursor.js +29 -0
- package/dist/templates/rules/cursor.js.map +1 -0
- package/dist/templates/rules/gemini.d.ts +6 -0
- package/dist/templates/rules/gemini.d.ts.map +1 -0
- package/dist/templates/rules/gemini.js +30 -0
- package/dist/templates/rules/gemini.js.map +1 -0
- package/dist/templates/rules/github-copilot.d.ts +6 -0
- package/dist/templates/rules/github-copilot.d.ts.map +1 -0
- package/dist/templates/rules/github-copilot.js +42 -0
- package/dist/templates/rules/github-copilot.js.map +1 -0
- package/dist/templates/rules/index.d.ts +13 -0
- package/dist/templates/rules/index.d.ts.map +1 -0
- package/dist/templates/rules/index.js +13 -0
- package/dist/templates/rules/index.js.map +1 -0
- package/dist/templates/rules/opencode.d.ts +6 -0
- package/dist/templates/rules/opencode.d.ts.map +1 -0
- package/dist/templates/rules/opencode.js +30 -0
- package/dist/templates/rules/opencode.js.map +1 -0
- package/dist/templates/rules/windsurf.d.ts +6 -0
- package/dist/templates/rules/windsurf.d.ts.map +1 -0
- package/dist/templates/rules/windsurf.js +24 -0
- package/dist/templates/rules/windsurf.js.map +1 -0
- package/dist/templates/rules/zed.d.ts +6 -0
- package/dist/templates/rules/zed.d.ts.map +1 -0
- package/dist/templates/rules/zed.js +34 -0
- package/dist/templates/rules/zed.js.map +1 -0
- package/dist/templates/skills/index.d.ts +26 -0
- package/dist/templates/skills/index.d.ts.map +1 -0
- package/dist/templates/skills/index.js +75 -0
- package/dist/templates/skills/index.js.map +1 -0
- package/dist/templates/skills/knowledgine-capture/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-capture/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-capture/references.js +414 -0
- package/dist/templates/skills/knowledgine-capture/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-capture/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-capture/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-capture/skill-md.js +97 -0
- package/dist/templates/skills/knowledgine-capture/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-debrief/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-debrief/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-debrief/references.js +140 -0
- package/dist/templates/skills/knowledgine-debrief/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-debrief/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-debrief/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-debrief/skill-md.js +74 -0
- package/dist/templates/skills/knowledgine-debrief/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-explain/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-explain/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-explain/references.js +183 -0
- package/dist/templates/skills/knowledgine-explain/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.js +89 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-feedback/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-feedback/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-feedback/references.js +214 -0
- package/dist/templates/skills/knowledgine-feedback/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-feedback/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-feedback/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-feedback/skill-md.js +107 -0
- package/dist/templates/skills/knowledgine-feedback/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-ingest/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-ingest/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-ingest/references.js +243 -0
- package/dist/templates/skills/knowledgine-ingest/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-ingest/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-ingest/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-ingest/skill-md.js +80 -0
- package/dist/templates/skills/knowledgine-ingest/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-recall/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-recall/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-recall/references.js +207 -0
- package/dist/templates/skills/knowledgine-recall/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.js +86 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-suggest/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/references.js +121 -0
- package/dist/templates/skills/knowledgine-suggest/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.js +94 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.js.map +1 -0
- package/fixtures/demo/notes/api-design-decisions.md +7 -2
- package/fixtures/demo/notes/auth-debugging.md +8 -0
- package/fixtures/demo/notes/ci-cd-pipeline.md +7 -0
- package/fixtures/demo/notes/code-review-notes.md +7 -0
- package/fixtures/demo/notes/database-optimization.md +8 -0
- package/fixtures/demo/notes/docker-troubleshooting.md +7 -1
- package/fixtures/demo/notes/react-performance.md +7 -6
- package/fixtures/demo/notes/typescript-migration.md +13 -4
- package/package.json +13 -4
|
@@ -6,20 +6,23 @@ tags:
|
|
|
6
6
|
author: demo-user
|
|
7
7
|
project: backend-api
|
|
8
8
|
---
|
|
9
|
+
|
|
9
10
|
# REST API Design Decisions
|
|
10
11
|
|
|
11
12
|
## Issue: Pagination Strategy
|
|
13
|
+
|
|
12
14
|
Needed to decide between offset-based and cursor-based pagination
|
|
13
15
|
for the search results endpoint.
|
|
14
16
|
|
|
15
17
|
### Decision: Cursor-based pagination
|
|
18
|
+
|
|
16
19
|
Offset pagination breaks when items are inserted/deleted during browsing.
|
|
17
20
|
|
|
18
21
|
```typescript
|
|
19
22
|
// Cursor-based pagination
|
|
20
23
|
interface PaginatedResponse<T> {
|
|
21
24
|
data: T[];
|
|
22
|
-
cursor: string | null;
|
|
25
|
+
cursor: string | null; // null means no more pages
|
|
23
26
|
hasMore: boolean;
|
|
24
27
|
}
|
|
25
28
|
|
|
@@ -31,7 +34,7 @@ app.get("/api/notes", (req, res) => {
|
|
|
31
34
|
`SELECT * FROM notes
|
|
32
35
|
WHERE ($1::text IS NULL OR id < $1)
|
|
33
36
|
ORDER BY id DESC LIMIT $2`,
|
|
34
|
-
[decoded?.id, limit + 1]
|
|
37
|
+
[decoded?.id, limit + 1],
|
|
35
38
|
);
|
|
36
39
|
|
|
37
40
|
const hasMore = notes.length > limit;
|
|
@@ -46,6 +49,7 @@ app.get("/api/notes", (req, res) => {
|
|
|
46
49
|
```
|
|
47
50
|
|
|
48
51
|
## Issue: Error Response Format
|
|
52
|
+
|
|
49
53
|
Standardized error responses across all endpoints.
|
|
50
54
|
|
|
51
55
|
### Solution: RFC 7807 Problem Details
|
|
@@ -73,6 +77,7 @@ app.use((err, req, res, _next) => {
|
|
|
73
77
|
```
|
|
74
78
|
|
|
75
79
|
## Learnings
|
|
80
|
+
|
|
76
81
|
- Cursor-based pagination is more reliable for real-time data
|
|
77
82
|
- Consistent error formats reduce client-side error handling complexity
|
|
78
83
|
- Always version your API from the start (`/v1/`)
|
|
@@ -6,14 +6,17 @@ tags:
|
|
|
6
6
|
author: demo-user
|
|
7
7
|
project: backend-api
|
|
8
8
|
---
|
|
9
|
+
|
|
9
10
|
# Authentication Debugging Session
|
|
10
11
|
|
|
11
12
|
## Problem
|
|
13
|
+
|
|
12
14
|
JWT token validation was failing intermittently in production.
|
|
13
15
|
Users reported being logged out randomly after 10-15 minutes,
|
|
14
16
|
even though the token expiry was set to 1 hour.
|
|
15
17
|
|
|
16
18
|
### Error Log
|
|
19
|
+
|
|
17
20
|
```
|
|
18
21
|
Error: TokenExpiredError: jwt expired
|
|
19
22
|
at /app/middleware/auth.ts:42:11
|
|
@@ -21,11 +24,13 @@ Error: TokenExpiredError: jwt expired
|
|
|
21
24
|
```
|
|
22
25
|
|
|
23
26
|
## Investigation
|
|
27
|
+
|
|
24
28
|
- Checked server clock sync — NTP was configured correctly
|
|
25
29
|
- Compared token `iat` (issued at) timestamps with server time
|
|
26
30
|
- Found a 45-minute clock skew between API server and auth service
|
|
27
31
|
|
|
28
32
|
## Solution
|
|
33
|
+
|
|
29
34
|
The auth service was running in a container with a drifted system clock.
|
|
30
35
|
|
|
31
36
|
```typescript
|
|
@@ -36,17 +41,20 @@ const decoded = jwt.verify(token, SECRET, {
|
|
|
36
41
|
```
|
|
37
42
|
|
|
38
43
|
Also fixed the root cause by enabling NTP sync in the Docker container:
|
|
44
|
+
|
|
39
45
|
```dockerfile
|
|
40
46
|
RUN apt-get update && apt-get install -y ntpdate
|
|
41
47
|
CMD ntpdate -s pool.ntp.org && node server.js
|
|
42
48
|
```
|
|
43
49
|
|
|
44
50
|
## Learnings
|
|
51
|
+
|
|
45
52
|
- Always configure clock tolerance for distributed JWT validation
|
|
46
53
|
- Container clocks can drift if the host NTP is not propagated
|
|
47
54
|
- Add monitoring for clock skew between services
|
|
48
55
|
- The `clockTolerance` option is safer than extending token expiry
|
|
49
56
|
|
|
50
57
|
## Time Spent
|
|
58
|
+
|
|
51
59
|
Investigation: 2 hours
|
|
52
60
|
Fix + deployment: 30 minutes
|
|
@@ -6,14 +6,18 @@ tags:
|
|
|
6
6
|
author: demo-user
|
|
7
7
|
project: infrastructure
|
|
8
8
|
---
|
|
9
|
+
|
|
9
10
|
# CI/CD Pipeline Setup and Debugging
|
|
10
11
|
|
|
11
12
|
## Problem
|
|
13
|
+
|
|
12
14
|
The CI pipeline was taking 25 minutes per push, blocking the
|
|
13
15
|
development workflow. Flaky tests caused unnecessary re-runs.
|
|
14
16
|
|
|
15
17
|
## Investigation
|
|
18
|
+
|
|
16
19
|
Analyzed GitHub Actions run logs:
|
|
20
|
+
|
|
17
21
|
- Dependency install: 4 minutes (no caching)
|
|
18
22
|
- Build: 3 minutes
|
|
19
23
|
- Tests: 15 minutes (sequential, with 3 flaky tests)
|
|
@@ -59,6 +63,7 @@ jobs:
|
|
|
59
63
|
```
|
|
60
64
|
|
|
61
65
|
### Flaky Test Fix
|
|
66
|
+
|
|
62
67
|
```typescript
|
|
63
68
|
// Before: timing-dependent test
|
|
64
69
|
it("should debounce input", async () => {
|
|
@@ -78,11 +83,13 @@ it("should debounce input", () => {
|
|
|
78
83
|
```
|
|
79
84
|
|
|
80
85
|
## Results
|
|
86
|
+
|
|
81
87
|
- Pipeline time: 25 min → 8 min (68% reduction)
|
|
82
88
|
- Flaky test rate: 15% → 0%
|
|
83
89
|
- Developer satisfaction significantly improved
|
|
84
90
|
|
|
85
91
|
## Learnings
|
|
92
|
+
|
|
86
93
|
- Cache dependencies aggressively in CI
|
|
87
94
|
- Run lint and tests in parallel jobs
|
|
88
95
|
- Flaky tests erode trust — fix them immediately
|
|
@@ -6,15 +6,18 @@ tags:
|
|
|
6
6
|
author: demo-user
|
|
7
7
|
project: team-process
|
|
8
8
|
---
|
|
9
|
+
|
|
9
10
|
# Code Review Guidelines and Common Issues
|
|
10
11
|
|
|
11
12
|
## Problem
|
|
13
|
+
|
|
12
14
|
Code reviews were inconsistent. Some PRs got rubber-stamped while
|
|
13
15
|
others received 50+ nitpick comments. Reviews took 2-3 days on average.
|
|
14
16
|
|
|
15
17
|
## Solution: Review Checklist
|
|
16
18
|
|
|
17
19
|
### What to Check
|
|
20
|
+
|
|
18
21
|
1. **Correctness**: Does the code do what the PR description says?
|
|
19
22
|
2. **Edge cases**: Null handling, empty arrays, boundary conditions
|
|
20
23
|
3. **Security**: Input validation, SQL injection, XSS
|
|
@@ -24,6 +27,7 @@ others received 50+ nitpick comments. Reviews took 2-3 days on average.
|
|
|
24
27
|
### Common Issues Found in Reviews
|
|
25
28
|
|
|
26
29
|
#### Error handling gaps
|
|
30
|
+
|
|
27
31
|
```typescript
|
|
28
32
|
// Bad: swallows errors silently
|
|
29
33
|
try {
|
|
@@ -42,6 +46,7 @@ try {
|
|
|
42
46
|
```
|
|
43
47
|
|
|
44
48
|
#### Missing input validation
|
|
49
|
+
|
|
45
50
|
```typescript
|
|
46
51
|
// Bad: trusts external input
|
|
47
52
|
app.post("/api/users", (req, res) => {
|
|
@@ -59,12 +64,14 @@ app.post("/api/users", (req, res) => {
|
|
|
59
64
|
```
|
|
60
65
|
|
|
61
66
|
## Process Improvements
|
|
67
|
+
|
|
62
68
|
- Max review turnaround: 4 hours for small PRs, 1 day for large
|
|
63
69
|
- Use "Request changes" only for blocking issues
|
|
64
70
|
- Prefix comments: `nit:`, `question:`, `suggestion:`, `blocking:`
|
|
65
71
|
- Author should self-review before requesting review
|
|
66
72
|
|
|
67
73
|
## Learnings
|
|
74
|
+
|
|
68
75
|
- Checklists reduce review inconsistency
|
|
69
76
|
- Small PRs (< 300 lines) get better reviews and faster merges
|
|
70
77
|
- Automate what you can (linting, formatting, type checking)
|
|
@@ -6,13 +6,16 @@ tags:
|
|
|
6
6
|
author: demo-user
|
|
7
7
|
project: backend-api
|
|
8
8
|
---
|
|
9
|
+
|
|
9
10
|
# SQL Query Optimization and Indexing
|
|
10
11
|
|
|
11
12
|
## Problem
|
|
13
|
+
|
|
12
14
|
The notes search endpoint was timing out with 100k+ rows.
|
|
13
15
|
Average query time was 4.2 seconds, causing user-visible latency.
|
|
14
16
|
|
|
15
17
|
### Slow Query
|
|
18
|
+
|
|
16
19
|
```sql
|
|
17
20
|
SELECT n.*, COUNT(p.id) as pattern_count
|
|
18
21
|
FROM notes n
|
|
@@ -25,7 +28,9 @@ LIMIT 20;
|
|
|
25
28
|
```
|
|
26
29
|
|
|
27
30
|
## Investigation
|
|
31
|
+
|
|
28
32
|
Used `EXPLAIN ANALYZE` to identify bottlenecks:
|
|
33
|
+
|
|
29
34
|
```sql
|
|
30
35
|
EXPLAIN ANALYZE SELECT ...;
|
|
31
36
|
-- Seq Scan on notes (cost=0.00..12847.00 rows=100234 width=412)
|
|
@@ -50,6 +55,7 @@ CREATE INDEX idx_patterns_note_id ON patterns (note_id);
|
|
|
50
55
|
```
|
|
51
56
|
|
|
52
57
|
### Rewritten Query
|
|
58
|
+
|
|
53
59
|
```sql
|
|
54
60
|
SELECT n.*, COUNT(p.id) as pattern_count
|
|
55
61
|
FROM notes n
|
|
@@ -62,10 +68,12 @@ LIMIT 20;
|
|
|
62
68
|
```
|
|
63
69
|
|
|
64
70
|
## Results
|
|
71
|
+
|
|
65
72
|
- Query time: 4.2s → 18ms (233x improvement)
|
|
66
73
|
- Index storage overhead: ~45MB (acceptable for 100k rows)
|
|
67
74
|
|
|
68
75
|
## Learnings
|
|
76
|
+
|
|
69
77
|
- `LIKE '%term%'` cannot use indexes — always use full-text search
|
|
70
78
|
- `EXPLAIN ANALYZE` is the first tool to reach for
|
|
71
79
|
- Covering indexes avoid table lookups for frequently joined columns
|
|
@@ -6,9 +6,11 @@ tags:
|
|
|
6
6
|
author: demo-user
|
|
7
7
|
project: microservices
|
|
8
8
|
---
|
|
9
|
+
|
|
9
10
|
# Docker Container Networking Issues
|
|
10
11
|
|
|
11
12
|
## Problem
|
|
13
|
+
|
|
12
14
|
Containers in docker-compose could not communicate with each other.
|
|
13
15
|
The API service failed to connect to the database container.
|
|
14
16
|
|
|
@@ -17,11 +19,13 @@ Error: connect ECONNREFUSED 127.0.0.1:5432
|
|
|
17
19
|
```
|
|
18
20
|
|
|
19
21
|
## Investigation
|
|
22
|
+
|
|
20
23
|
- Verified both containers were running: `docker ps` showed healthy status
|
|
21
24
|
- Checked network: `docker network ls` showed custom bridge network
|
|
22
25
|
- The API was using `localhost` instead of the service name
|
|
23
26
|
|
|
24
27
|
## Solution
|
|
28
|
+
|
|
25
29
|
Docker containers have their own network namespace. Use the service
|
|
26
30
|
name as the hostname, not `localhost`.
|
|
27
31
|
|
|
@@ -32,7 +36,7 @@ services:
|
|
|
32
36
|
build: ./api
|
|
33
37
|
environment:
|
|
34
38
|
# Wrong: DB_HOST=localhost
|
|
35
|
-
DB_HOST: postgres
|
|
39
|
+
DB_HOST: postgres # Use service name
|
|
36
40
|
DB_PORT: 5432
|
|
37
41
|
depends_on:
|
|
38
42
|
postgres:
|
|
@@ -48,6 +52,7 @@ services:
|
|
|
48
52
|
```
|
|
49
53
|
|
|
50
54
|
## Additional Fix: DNS Resolution Timing
|
|
55
|
+
|
|
51
56
|
Even with correct hostnames, the API started before DNS was ready.
|
|
52
57
|
|
|
53
58
|
```typescript
|
|
@@ -68,6 +73,7 @@ async function connectWithRetry(maxRetries = 5): Promise<Pool> {
|
|
|
68
73
|
```
|
|
69
74
|
|
|
70
75
|
## Learnings
|
|
76
|
+
|
|
71
77
|
- Never use `localhost` for inter-container communication
|
|
72
78
|
- Use `depends_on` with health checks, not just service ordering
|
|
73
79
|
- Add connection retry logic for resilience
|
|
@@ -6,13 +6,16 @@ tags:
|
|
|
6
6
|
author: demo-user
|
|
7
7
|
project: dashboard-app
|
|
8
8
|
---
|
|
9
|
+
|
|
9
10
|
# React Performance Optimization
|
|
10
11
|
|
|
11
12
|
## Issue
|
|
13
|
+
|
|
12
14
|
The dashboard page was taking 3+ seconds to render with 500 items.
|
|
13
15
|
React DevTools Profiler showed excessive re-renders on every state change.
|
|
14
16
|
|
|
15
17
|
## Root Cause Analysis
|
|
18
|
+
|
|
16
19
|
1. Parent component state changes triggered full list re-render
|
|
17
20
|
2. Inline arrow functions in JSX created new references each render
|
|
18
21
|
3. Large bundle size from importing entire icon library
|
|
@@ -21,14 +24,10 @@ React DevTools Profiler showed excessive re-renders on every state change.
|
|
|
21
24
|
|
|
22
25
|
```tsx
|
|
23
26
|
// Before: re-renders on every parent state change
|
|
24
|
-
const ListItem = ({ item, onClick }) => (
|
|
25
|
-
<div onClick={() => onClick(item.id)}>{item.name}</div>
|
|
26
|
-
);
|
|
27
|
+
const ListItem = ({ item, onClick }) => <div onClick={() => onClick(item.id)}>{item.name}</div>;
|
|
27
28
|
|
|
28
29
|
// After: memoized with stable callback
|
|
29
|
-
const ListItem = React.memo(({ item, onClick }) =>
|
|
30
|
-
<div onClick={onClick}>{item.name}</div>
|
|
31
|
-
));
|
|
30
|
+
const ListItem = React.memo(({ item, onClick }) => <div onClick={onClick}>{item.name}</div>);
|
|
32
31
|
|
|
33
32
|
// Parent: stable callback reference
|
|
34
33
|
const handleClick = useCallback((id: string) => {
|
|
@@ -55,11 +54,13 @@ function Dashboard() {
|
|
|
55
54
|
```
|
|
56
55
|
|
|
57
56
|
## Results
|
|
57
|
+
|
|
58
58
|
- Initial render: 3.2s → 0.8s (75% improvement)
|
|
59
59
|
- Re-render on selection: 450ms → 12ms
|
|
60
60
|
- Bundle size: 1.2MB → 680KB
|
|
61
61
|
|
|
62
62
|
## Learnings
|
|
63
|
+
|
|
63
64
|
- Profile before optimizing — measure actual bottlenecks
|
|
64
65
|
- React.memo only helps when props are actually stable
|
|
65
66
|
- Lazy loading is most effective for below-the-fold content
|
|
@@ -6,17 +6,21 @@ tags:
|
|
|
6
6
|
author: demo-user
|
|
7
7
|
project: legacy-app
|
|
8
8
|
---
|
|
9
|
+
|
|
9
10
|
# JavaScript to TypeScript Migration
|
|
10
11
|
|
|
11
12
|
## Problem
|
|
13
|
+
|
|
12
14
|
The legacy Express app (50+ files) had no type safety. Runtime errors
|
|
13
15
|
were discovered only in production, and onboarding new developers
|
|
14
16
|
took weeks due to lack of type documentation.
|
|
15
17
|
|
|
16
18
|
## Migration Strategy
|
|
19
|
+
|
|
17
20
|
Adopted an incremental approach instead of a big-bang rewrite.
|
|
18
21
|
|
|
19
22
|
### Phase 1: Setup (Day 1)
|
|
23
|
+
|
|
20
24
|
```jsonc
|
|
21
25
|
// tsconfig.json - permissive start
|
|
22
26
|
{
|
|
@@ -25,13 +29,14 @@ Adopted an incremental approach instead of a big-bang rewrite.
|
|
|
25
29
|
"checkJs": false,
|
|
26
30
|
"strict": false,
|
|
27
31
|
"outDir": "dist",
|
|
28
|
-
"rootDir": "src"
|
|
32
|
+
"rootDir": "src",
|
|
29
33
|
},
|
|
30
|
-
"include": ["src/**/*"]
|
|
34
|
+
"include": ["src/**/*"],
|
|
31
35
|
}
|
|
32
36
|
```
|
|
33
37
|
|
|
34
38
|
### Phase 2: Rename files (Week 1)
|
|
39
|
+
|
|
35
40
|
```bash
|
|
36
41
|
# Renamed .js → .ts one directory at a time
|
|
37
42
|
# Started with utility files that had no dependencies
|
|
@@ -39,6 +44,7 @@ find src/utils -name "*.js" -exec bash -c 'mv "$0" "${0%.js}.ts"' {} \;
|
|
|
39
44
|
```
|
|
40
45
|
|
|
41
46
|
### Phase 3: Add types gradually (Week 2-4)
|
|
47
|
+
|
|
42
48
|
```typescript
|
|
43
49
|
// Before: implicit any everywhere
|
|
44
50
|
function processUser(user) {
|
|
@@ -58,21 +64,24 @@ function processUser(user: User): { name: string; role: string } {
|
|
|
58
64
|
```
|
|
59
65
|
|
|
60
66
|
### Phase 4: Enable strict mode (Week 5)
|
|
67
|
+
|
|
61
68
|
```jsonc
|
|
62
69
|
{
|
|
63
70
|
"compilerOptions": {
|
|
64
71
|
"strict": true,
|
|
65
|
-
"noUncheckedIndexedAccess": true
|
|
66
|
-
}
|
|
72
|
+
"noUncheckedIndexedAccess": true,
|
|
73
|
+
},
|
|
67
74
|
}
|
|
68
75
|
```
|
|
69
76
|
|
|
70
77
|
## Results
|
|
78
|
+
|
|
71
79
|
- Runtime type errors: 12/month → 0/month
|
|
72
80
|
- Onboarding time: 3 weeks → 1 week
|
|
73
81
|
- Refactoring confidence: significantly improved with IDE support
|
|
74
82
|
|
|
75
83
|
## Learnings
|
|
84
|
+
|
|
76
85
|
- Incremental migration is key — never stop shipping features
|
|
77
86
|
- Start with leaf files (utilities), move inward to core logic
|
|
78
87
|
- `@ts-expect-error` is better than `any` for tracking tech debt
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knowledgine/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -14,11 +14,20 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
+
"@clack/prompts": "^1.1.0",
|
|
18
|
+
"@hono/node-server": "^1.19.11",
|
|
19
|
+
"boxen": "^8.0.1",
|
|
20
|
+
"chalk": "^5.6.2",
|
|
17
21
|
"chokidar": "^5.0.0",
|
|
22
|
+
"cli-table3": "^0.6.5",
|
|
18
23
|
"commander": "^14.0.3",
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
24
|
+
"hono": "^4.12.9",
|
|
25
|
+
"log-symbols": "^7.0.1",
|
|
26
|
+
"ora": "^9.3.0",
|
|
27
|
+
"smol-toml": "^1.6.0",
|
|
28
|
+
"@knowledgine/core": "0.3.0",
|
|
29
|
+
"@knowledgine/ingest": "0.3.0",
|
|
30
|
+
"@knowledgine/mcp-server": "0.3.0"
|
|
22
31
|
},
|
|
23
32
|
"files": [
|
|
24
33
|
"dist",
|