@lpenguin/notion-cli 1.0.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 (134) hide show
  1. package/README.md +245 -0
  2. package/dist/commands/database/create.d.ts +8 -0
  3. package/dist/commands/database/create.d.ts.map +1 -0
  4. package/dist/commands/database/create.js +71 -0
  5. package/dist/commands/database/create.js.map +1 -0
  6. package/dist/commands/database/delete.d.ts +10 -0
  7. package/dist/commands/database/delete.d.ts.map +1 -0
  8. package/dist/commands/database/delete.js +83 -0
  9. package/dist/commands/database/delete.js.map +1 -0
  10. package/dist/commands/database/export.d.ts +11 -0
  11. package/dist/commands/database/export.d.ts.map +1 -0
  12. package/dist/commands/database/export.js +74 -0
  13. package/dist/commands/database/export.js.map +1 -0
  14. package/dist/commands/database/insert.d.ts +11 -0
  15. package/dist/commands/database/insert.d.ts.map +1 -0
  16. package/dist/commands/database/insert.js +93 -0
  17. package/dist/commands/database/insert.js.map +1 -0
  18. package/dist/commands/database/list.d.ts +10 -0
  19. package/dist/commands/database/list.d.ts.map +1 -0
  20. package/dist/commands/database/list.js +80 -0
  21. package/dist/commands/database/list.js.map +1 -0
  22. package/dist/commands/database/query.d.ts +10 -0
  23. package/dist/commands/database/query.d.ts.map +1 -0
  24. package/dist/commands/database/query.js +77 -0
  25. package/dist/commands/database/query.js.map +1 -0
  26. package/dist/commands/database/schema.d.ts +11 -0
  27. package/dist/commands/database/schema.d.ts.map +1 -0
  28. package/dist/commands/database/schema.js +76 -0
  29. package/dist/commands/database/schema.js.map +1 -0
  30. package/dist/commands/database/update.d.ts +11 -0
  31. package/dist/commands/database/update.d.ts.map +1 -0
  32. package/dist/commands/database/update.js +105 -0
  33. package/dist/commands/database/update.js.map +1 -0
  34. package/dist/commands/page/create.d.ts +11 -0
  35. package/dist/commands/page/create.d.ts.map +1 -0
  36. package/dist/commands/page/create.js +102 -0
  37. package/dist/commands/page/create.js.map +1 -0
  38. package/dist/commands/page/list.d.ts +10 -0
  39. package/dist/commands/page/list.d.ts.map +1 -0
  40. package/dist/commands/page/list.js +87 -0
  41. package/dist/commands/page/list.js.map +1 -0
  42. package/dist/commands/page/patch.d.ts +21 -0
  43. package/dist/commands/page/patch.d.ts.map +1 -0
  44. package/dist/commands/page/patch.js +156 -0
  45. package/dist/commands/page/patch.js.map +1 -0
  46. package/dist/commands/page/read.d.ts +10 -0
  47. package/dist/commands/page/read.d.ts.map +1 -0
  48. package/dist/commands/page/read.js +86 -0
  49. package/dist/commands/page/read.js.map +1 -0
  50. package/dist/commands/page/write-properties.d.ts +15 -0
  51. package/dist/commands/page/write-properties.d.ts.map +1 -0
  52. package/dist/commands/page/write-properties.js +128 -0
  53. package/dist/commands/page/write-properties.js.map +1 -0
  54. package/dist/commands/page/write.d.ts +14 -0
  55. package/dist/commands/page/write.d.ts.map +1 -0
  56. package/dist/commands/page/write.js +109 -0
  57. package/dist/commands/page/write.js.map +1 -0
  58. package/dist/commands/search.d.ts +18 -0
  59. package/dist/commands/search.d.ts.map +1 -0
  60. package/dist/commands/search.js +129 -0
  61. package/dist/commands/search.js.map +1 -0
  62. package/dist/index.d.ts +37 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +121 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/lib/block-patch.d.ts +61 -0
  67. package/dist/lib/block-patch.d.ts.map +1 -0
  68. package/dist/lib/block-patch.js +181 -0
  69. package/dist/lib/block-patch.js.map +1 -0
  70. package/dist/lib/client.d.ts +17 -0
  71. package/dist/lib/client.d.ts.map +1 -0
  72. package/dist/lib/client.js +63 -0
  73. package/dist/lib/client.js.map +1 -0
  74. package/dist/lib/config.d.ts +19 -0
  75. package/dist/lib/config.d.ts.map +1 -0
  76. package/dist/lib/config.js +65 -0
  77. package/dist/lib/config.js.map +1 -0
  78. package/dist/lib/csv.d.ts +45 -0
  79. package/dist/lib/csv.d.ts.map +1 -0
  80. package/dist/lib/csv.js +262 -0
  81. package/dist/lib/csv.js.map +1 -0
  82. package/dist/lib/db-properties.d.ts +11 -0
  83. package/dist/lib/db-properties.d.ts.map +1 -0
  84. package/dist/lib/db-properties.js +25 -0
  85. package/dist/lib/db-properties.js.map +1 -0
  86. package/dist/lib/errors.d.ts +34 -0
  87. package/dist/lib/errors.d.ts.map +1 -0
  88. package/dist/lib/errors.js +86 -0
  89. package/dist/lib/errors.js.map +1 -0
  90. package/dist/lib/file-upload.d.ts +25 -0
  91. package/dist/lib/file-upload.d.ts.map +1 -0
  92. package/dist/lib/file-upload.js +90 -0
  93. package/dist/lib/file-upload.js.map +1 -0
  94. package/dist/lib/markdown.d.ts +79 -0
  95. package/dist/lib/markdown.d.ts.map +1 -0
  96. package/dist/lib/markdown.js +320 -0
  97. package/dist/lib/markdown.js.map +1 -0
  98. package/dist/lib/output.d.ts +20 -0
  99. package/dist/lib/output.d.ts.map +1 -0
  100. package/dist/lib/output.js +67 -0
  101. package/dist/lib/output.js.map +1 -0
  102. package/dist/lib/patch.d.ts +23 -0
  103. package/dist/lib/patch.d.ts.map +1 -0
  104. package/dist/lib/patch.js +72 -0
  105. package/dist/lib/patch.js.map +1 -0
  106. package/dist/lib/rate-limit.d.ts +9 -0
  107. package/dist/lib/rate-limit.d.ts.map +1 -0
  108. package/dist/lib/rate-limit.js +67 -0
  109. package/dist/lib/rate-limit.js.map +1 -0
  110. package/dist/lib/safety.d.ts +17 -0
  111. package/dist/lib/safety.d.ts.map +1 -0
  112. package/dist/lib/safety.js +60 -0
  113. package/dist/lib/safety.js.map +1 -0
  114. package/dist/lib/types.d.ts +138 -0
  115. package/dist/lib/types.d.ts.map +1 -0
  116. package/dist/lib/types.js +13 -0
  117. package/dist/lib/types.js.map +1 -0
  118. package/dist/lib/validator.d.ts +33 -0
  119. package/dist/lib/validator.d.ts.map +1 -0
  120. package/dist/lib/validator.js +68 -0
  121. package/dist/lib/validator.js.map +1 -0
  122. package/dist/utils/id.d.ts +14 -0
  123. package/dist/utils/id.d.ts.map +1 -0
  124. package/dist/utils/id.js +33 -0
  125. package/dist/utils/id.js.map +1 -0
  126. package/dist/utils/logger.d.ts +20 -0
  127. package/dist/utils/logger.d.ts.map +1 -0
  128. package/dist/utils/logger.js +43 -0
  129. package/dist/utils/logger.js.map +1 -0
  130. package/dist/utils/string.d.ts +14 -0
  131. package/dist/utils/string.d.ts.map +1 -0
  132. package/dist/utils/string.js +37 -0
  133. package/dist/utils/string.js.map +1 -0
  134. package/package.json +64 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Safety module — confirmation prompts, dry-run, and write guards.
3
+ *
4
+ * This is the single point of control for write safety.
5
+ */
6
+ import chalk from 'chalk';
7
+ import { createTwoFilesPatch } from 'diff';
8
+ import * as logger from '../utils/logger.js';
9
+ /**
10
+ * Guard for dry-run mode.
11
+ * Returns true if we should skip the actual write (dry-run is active).
12
+ */
13
+ export function isDryRun(dryRun) {
14
+ if (dryRun === true) {
15
+ logger.info(chalk.cyan('[DRY RUN] No changes will be made.'));
16
+ return true;
17
+ }
18
+ return false;
19
+ }
20
+ /**
21
+ * Display a diff preview before applying changes.
22
+ *
23
+ * Shows a colored unified diff of the changes.
24
+ */
25
+ export function showDiffPreview(before, after) {
26
+ const diffHunk = buildDiffHunk(before, after);
27
+ if (diffHunk === '') {
28
+ process.stderr.write(chalk.gray('\nNo changes detected.\n\n'));
29
+ return;
30
+ }
31
+ process.stderr.write(`\n${chalk.bold('Changes preview:')}\n`);
32
+ const lines = diffHunk.split('\n');
33
+ for (const line of lines) {
34
+ if (line.startsWith('+') && !line.startsWith('+++')) {
35
+ process.stderr.write(`${chalk.green(line)}\n`);
36
+ }
37
+ else if (line.startsWith('-') && !line.startsWith('---')) {
38
+ process.stderr.write(`${chalk.red(line)}\n`);
39
+ }
40
+ else if (line.startsWith('@@')) {
41
+ process.stderr.write(`${chalk.cyan(line)}\n`);
42
+ }
43
+ else if (line.startsWith('---') || line.startsWith('+++')) {
44
+ // Skip file headers
45
+ }
46
+ else {
47
+ process.stderr.write(` ${line}\n`);
48
+ }
49
+ }
50
+ process.stderr.write('\n');
51
+ }
52
+ /**
53
+ * Build a unified diff hunk with context.
54
+ */
55
+ function buildDiffHunk(before, after) {
56
+ return createTwoFilesPatch('original', 'patched', before, after, '', '', {
57
+ context: 3,
58
+ });
59
+ }
60
+ //# sourceMappingURL=safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/lib/safety.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAgB;IACvC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,KAAa;IAC3D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,oBAAoB;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,MAAc,EAAE,KAAa;IAClD,OAAO,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;QACvE,OAAO,EAAE,CAAC;KACX,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Shared types for the Notion CLI.
3
+ */
4
+ /** Standard JSON output envelope for AI agent consumption. */
5
+ export interface CliSuccessResponse<T = unknown> {
6
+ readonly ok: true;
7
+ readonly data: T;
8
+ readonly meta?: ResponseMeta;
9
+ }
10
+ export interface CliErrorResponse {
11
+ readonly ok: false;
12
+ readonly error: {
13
+ readonly code: string;
14
+ readonly message: string;
15
+ readonly details?: unknown;
16
+ };
17
+ }
18
+ export type CliResponse<T = unknown> = CliSuccessResponse<T> | CliErrorResponse;
19
+ export interface ResponseMeta {
20
+ readonly cursor?: string;
21
+ readonly hasMore?: boolean;
22
+ readonly totalCount?: number;
23
+ }
24
+ /** Exit codes mapped to error categories. */
25
+ export declare const ExitCode: {
26
+ readonly SUCCESS: 0;
27
+ readonly GENERAL_ERROR: 1;
28
+ readonly VALIDATION_ERROR: 2;
29
+ readonly AUTH_ERROR: 3;
30
+ readonly NOT_FOUND: 4;
31
+ readonly RATE_LIMITED: 5;
32
+ };
33
+ export type ExitCodeValue = (typeof ExitCode)[keyof typeof ExitCode];
34
+ /** Global CLI options available on every command. */
35
+ export interface GlobalOptions {
36
+ readonly json?: boolean;
37
+ readonly token?: string;
38
+ readonly dryRun?: boolean;
39
+ readonly verbose?: boolean;
40
+ }
41
+ /** Page read result. */
42
+ export interface PageReadResult {
43
+ readonly pageId: string;
44
+ readonly parentId?: string;
45
+ readonly title: string;
46
+ readonly markdown: string;
47
+ readonly lastEditedTime: string;
48
+ }
49
+ /** Page write result. */
50
+ export interface PageWriteResult {
51
+ readonly pageId: string;
52
+ readonly blocksWritten: number;
53
+ }
54
+ /** Page patch result. */
55
+ export interface PagePatchResult {
56
+ readonly pageId: string;
57
+ readonly linesChanged: number;
58
+ readonly diff: string;
59
+ }
60
+ /** Search result item. */
61
+ export interface SearchResultItem {
62
+ readonly id: string;
63
+ readonly type: 'page' | 'database';
64
+ readonly title: string;
65
+ readonly url: string;
66
+ readonly lastEditedTime: string;
67
+ }
68
+ /** Search results. */
69
+ export interface SearchResults {
70
+ readonly results: readonly SearchResultItem[];
71
+ readonly hasMore: boolean;
72
+ readonly nextCursor?: string;
73
+ }
74
+ /** Database schema property. */
75
+ export interface DbPropertySchema {
76
+ readonly name: string;
77
+ readonly type: string;
78
+ readonly options?: readonly string[];
79
+ }
80
+ /** Database schema. */
81
+ export interface DbSchema {
82
+ readonly databaseId: string;
83
+ readonly title: string;
84
+ readonly properties: readonly DbPropertySchema[];
85
+ }
86
+ /** Patch mode options. */
87
+ export interface PatchLineRange {
88
+ readonly mode: 'lines';
89
+ readonly start: number;
90
+ readonly end: number;
91
+ readonly content: string;
92
+ }
93
+ export type PatchOperation = PatchLineRange;
94
+ /** Block-to-line mapping for surgical patching. */
95
+ export interface BlockLineMapping {
96
+ /** Notion block UUID. */
97
+ readonly blockId: string;
98
+ /** Block type (paragraph, heading_1, etc.). */
99
+ readonly type: string;
100
+ /** 1-indexed start line (inclusive). */
101
+ readonly startLine: number;
102
+ /** 1-indexed end line (inclusive). */
103
+ readonly endLine: number;
104
+ /** The markdown content for this block. */
105
+ readonly markdown: string;
106
+ /** Child block mappings (for nested blocks). */
107
+ readonly children: readonly BlockLineMapping[];
108
+ }
109
+ /** Result of building a block-line map. */
110
+ export interface BlockLineMapResult {
111
+ /** The full markdown content. */
112
+ readonly markdown: string;
113
+ /** Mapping of blocks to line ranges. */
114
+ readonly mappings: readonly BlockLineMapping[];
115
+ }
116
+ /** A plan for surgical block patching. */
117
+ export interface PatchPlan {
118
+ /** Block IDs to delete entirely. */
119
+ readonly blocksToDelete: readonly string[];
120
+ /** New blocks to insert. */
121
+ readonly blocksToInsert: readonly BlockInsert[];
122
+ }
123
+ /** A block insertion operation. */
124
+ export interface BlockInsert {
125
+ /** Insert after this block ID. null = insert at start of page/parent. */
126
+ readonly afterId: string | null;
127
+ /** The markdown content to convert to blocks and insert. */
128
+ readonly markdown: string;
129
+ /** If set, insert as children of this block instead of at the page level. */
130
+ readonly parentBlockId?: string;
131
+ }
132
+ /** Config file shape. */
133
+ export interface CliConfig {
134
+ readonly token?: string;
135
+ readonly defaultDatabase?: string;
136
+ readonly confirmBeforeWrite?: boolean;
137
+ }
138
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shared types for the Notion CLI.
3
+ */
4
+ /** Exit codes mapped to error categories. */
5
+ export const ExitCode = {
6
+ SUCCESS: 0,
7
+ GENERAL_ERROR: 1,
8
+ VALIDATION_ERROR: 2,
9
+ AUTH_ERROR: 3,
10
+ NOT_FOUND: 4,
11
+ RATE_LIMITED: 5,
12
+ };
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,CAAC;IAChB,gBAAgB,EAAE,CAAC;IACnB,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,YAAY,EAAE,CAAC;CACP,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Zod schemas for input validation.
3
+ * All user inputs are validated before hitting the Notion API.
4
+ */
5
+ import { z } from 'zod';
6
+ export declare const notionIdSchema: z.ZodString;
7
+ /** Normalize a Notion ID to dashed UUID format. */
8
+ export declare function normalizeId(id: string): string;
9
+ /** Notion token: must start with ntn_ or secret_. */
10
+ export declare const tokenSchema: z.ZodEffects<z.ZodString, string, string>;
11
+ /** Line range: "START:END" where both are positive integers. */
12
+ export declare const lineRangeSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodString, {
13
+ start: number;
14
+ end: number;
15
+ }, string>, {
16
+ start: number;
17
+ end: number;
18
+ }, string>, {
19
+ start: number;
20
+ end: number;
21
+ }, string>, {
22
+ start: number;
23
+ end: number;
24
+ }, string>;
25
+ /** Search query: non-empty string, max 100 chars. */
26
+ export declare const searchQuerySchema: z.ZodString;
27
+ /** Limit: positive integer, max 100. */
28
+ export declare const limitSchema: z.ZodNumber;
29
+ /** File path: non-empty string. */
30
+ export declare const filePathSchema: z.ZodString;
31
+ /** JSON filter/sort string: must parse as valid JSON. */
32
+ export declare const jsonStringSchema: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, unknown, string>;
33
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/lib/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,cAAc,aAEyD,CAAC;AAErF,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAS9C;AAED,qDAAqD;AACrD,eAAO,MAAM,WAAW,2CAMrB,CAAC;AAEJ,gEAAgE;AAChE,eAAO,MAAM,eAAe;;;;;;;;;;;;UAWyC,CAAC;AAEtE,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,aAGwB,CAAC;AAEvD,wCAAwC;AACxC,eAAO,MAAM,WAAW,aAIY,CAAC;AAErC,mCAAmC;AACnC,eAAO,MAAM,cAAc,aAEY,CAAC;AAExC,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,0EAagB,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Zod schemas for input validation.
3
+ * All user inputs are validated before hitting the Notion API.
4
+ */
5
+ import { z } from 'zod';
6
+ /** Notion ID: UUID with or without dashes (32 hex chars). */
7
+ const NOTION_ID_REGEX = /^[a-f0-9]{8}-?[a-f0-9]{4}-?[a-f0-9]{4}-?[a-f0-9]{4}-?[a-f0-9]{12}$/i;
8
+ export const notionIdSchema = z
9
+ .string()
10
+ .regex(NOTION_ID_REGEX, 'Invalid Notion ID. Expected a UUID (32 hex characters).');
11
+ /** Normalize a Notion ID to dashed UUID format. */
12
+ export function normalizeId(id) {
13
+ const clean = id.replace(/-/g, '');
14
+ return [
15
+ clean.slice(0, 8),
16
+ clean.slice(8, 12),
17
+ clean.slice(12, 16),
18
+ clean.slice(16, 20),
19
+ clean.slice(20, 32),
20
+ ].join('-');
21
+ }
22
+ /** Notion token: must start with ntn_ or secret_. */
23
+ export const tokenSchema = z
24
+ .string()
25
+ .min(1, 'Token cannot be empty.')
26
+ .refine((t) => t.startsWith('ntn_') || t.startsWith('secret_'), 'Token must start with "ntn_" or "secret_".');
27
+ /** Line range: "START:END" where both are positive integers. */
28
+ export const lineRangeSchema = z
29
+ .string()
30
+ .regex(/^\d+:\d+$/, 'Line range must be in format START:END (e.g., "192:256"). Both start and end are required.')
31
+ .transform((val) => {
32
+ const [startStr, endStr] = val.split(':');
33
+ const start = parseInt(startStr ?? '0', 10);
34
+ const end = parseInt(endStr ?? '0', 10);
35
+ return { start, end };
36
+ })
37
+ .refine((r) => r.start >= 1, 'Start line must be >= 1.')
38
+ .refine((r) => r.end >= 1, 'End line must be >= 1.')
39
+ .refine((r) => r.end >= r.start, 'End line must be >= start line.');
40
+ /** Search query: non-empty string, max 100 chars. */
41
+ export const searchQuerySchema = z
42
+ .string()
43
+ .min(1, 'Search query cannot be empty.')
44
+ .max(100, 'Search query must be <= 100 characters.');
45
+ /** Limit: positive integer, max 100. */
46
+ export const limitSchema = z
47
+ .number()
48
+ .int()
49
+ .min(1, 'Limit must be >= 1.')
50
+ .max(100, 'Limit must be <= 100.');
51
+ /** File path: non-empty string. */
52
+ export const filePathSchema = z
53
+ .string()
54
+ .min(1, 'File path cannot be empty.');
55
+ /** JSON filter/sort string: must parse as valid JSON. */
56
+ export const jsonStringSchema = z
57
+ .string()
58
+ .refine((s) => {
59
+ try {
60
+ JSON.parse(s);
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }, 'Invalid JSON string.')
67
+ .transform((s) => JSON.parse(s));
68
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/lib/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Notion ID parsing, validation, and extraction utilities.
3
+ */
4
+ /**
5
+ * Parse and validate a Notion ID from user input.
6
+ * Accepts:
7
+ * - Raw UUIDs (with or without dashes)
8
+ * - Notion URLs (https://notion.so/page-title-abc123...)
9
+ * - Notion API IDs
10
+ *
11
+ * Returns a normalized dashed UUID.
12
+ */
13
+ export declare function parseNotionId(input: string): string;
14
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBnD"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Notion ID parsing, validation, and extraction utilities.
3
+ */
4
+ import { notionIdSchema, normalizeId } from '../lib/validator.js';
5
+ import { ValidationError } from '../lib/errors.js';
6
+ /**
7
+ * Parse and validate a Notion ID from user input.
8
+ * Accepts:
9
+ * - Raw UUIDs (with or without dashes)
10
+ * - Notion URLs (https://notion.so/page-title-abc123...)
11
+ * - Notion API IDs
12
+ *
13
+ * Returns a normalized dashed UUID.
14
+ */
15
+ export function parseNotionId(input) {
16
+ // Try to extract ID from a Notion URL
17
+ const urlMatch = /([a-f0-9]{32})(?:\?|$)/i.exec(input);
18
+ if (urlMatch?.[1] !== undefined) {
19
+ return normalizeId(urlMatch[1]);
20
+ }
21
+ // Try to extract dashed UUID from URL path
22
+ const dashedMatch = /([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i.exec(input);
23
+ if (dashedMatch?.[1] !== undefined) {
24
+ return normalizeId(dashedMatch[1]);
25
+ }
26
+ // Validate as raw ID
27
+ const result = notionIdSchema.safeParse(input);
28
+ if (!result.success) {
29
+ throw new ValidationError(`Invalid Notion ID: "${input}". Expected a UUID or Notion URL.`);
30
+ }
31
+ return normalizeId(result.data);
32
+ }
33
+ //# sourceMappingURL=id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,sCAAsC;IACtC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,2CAA2C;IAC3C,MAAM,WAAW,GACf,iEAAiE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChF,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CAAC,uBAAuB,KAAK,mCAAmC,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Structured logger — all status/progress goes to stderr.
3
+ * Data output goes to stdout (handled by output.ts).
4
+ * This ensures clean piping for AI agents.
5
+ */
6
+ export declare function setVerbose(enabled: boolean): void;
7
+ export declare function isVerbose(): boolean;
8
+ /** Log informational message to stderr. */
9
+ export declare function info(message: string): void;
10
+ /** Log success message to stderr. */
11
+ export declare function success(message: string): void;
12
+ /** Log warning message to stderr. */
13
+ export declare function warn(message: string): void;
14
+ /** Log error message to stderr. */
15
+ export declare function error(message: string): void;
16
+ /** Log debug message to stderr (only when --verbose). */
17
+ export declare function debug(message: string): void;
18
+ /** Mask a token for safe logging. Shows first 4 and last 4 chars. */
19
+ export declare function maskToken(token: string): string;
20
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,2CAA2C;AAC3C,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,qCAAqC;AACrC,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,qCAAqC;AACrC,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,mCAAmC;AACnC,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,yDAAyD;AACzD,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI3C;AAED,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK/C"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Structured logger — all status/progress goes to stderr.
3
+ * Data output goes to stdout (handled by output.ts).
4
+ * This ensures clean piping for AI agents.
5
+ */
6
+ import chalk from 'chalk';
7
+ let verboseEnabled = false;
8
+ export function setVerbose(enabled) {
9
+ verboseEnabled = enabled;
10
+ }
11
+ export function isVerbose() {
12
+ return verboseEnabled;
13
+ }
14
+ /** Log informational message to stderr. */
15
+ export function info(message) {
16
+ process.stderr.write(`${chalk.blue('ℹ')} ${message}\n`);
17
+ }
18
+ /** Log success message to stderr. */
19
+ export function success(message) {
20
+ process.stderr.write(`${chalk.green('✔')} ${message}\n`);
21
+ }
22
+ /** Log warning message to stderr. */
23
+ export function warn(message) {
24
+ process.stderr.write(`${chalk.yellow('⚠')} ${message}\n`);
25
+ }
26
+ /** Log error message to stderr. */
27
+ export function error(message) {
28
+ process.stderr.write(`${chalk.red('✖')} ${message}\n`);
29
+ }
30
+ /** Log debug message to stderr (only when --verbose). */
31
+ export function debug(message) {
32
+ if (verboseEnabled) {
33
+ process.stderr.write(`${chalk.gray('⋯')} ${message}\n`);
34
+ }
35
+ }
36
+ /** Mask a token for safe logging. Shows first 4 and last 4 chars. */
37
+ export function maskToken(token) {
38
+ if (token.length <= 12) {
39
+ return '****';
40
+ }
41
+ return `${token.slice(0, 4)}...${token.slice(-4)}`;
42
+ }
43
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,cAAc,GAAG,OAAO,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Unescape string sequences like \n, \t, \r from command line arguments.
3
+ */
4
+ export declare function unescapeString(str: string): string;
5
+ /**
6
+ * Remove the common leading whitespace from every line in a string.
7
+ *
8
+ * Blank lines are ignored when calculating the common indent.
9
+ * Useful when nested Notion blocks produce indented markdown that
10
+ * must be fed back to a Markdown→Notion converter without the
11
+ * cosmetic indentation being misinterpreted as a code block.
12
+ */
13
+ export declare function dedentMarkdown(text: string): string;
14
+ //# sourceMappingURL=string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsBnD"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Unescape string sequences like \n, \t, \r from command line arguments.
3
+ */
4
+ export function unescapeString(str) {
5
+ return str
6
+ .replace(/\\n/g, '\n')
7
+ .replace(/\\t/g, '\t')
8
+ .replace(/\\r/g, '\r')
9
+ .replace(/\\"/g, '"')
10
+ .replace(/\\\\/g, '\\');
11
+ }
12
+ /**
13
+ * Remove the common leading whitespace from every line in a string.
14
+ *
15
+ * Blank lines are ignored when calculating the common indent.
16
+ * Useful when nested Notion blocks produce indented markdown that
17
+ * must be fed back to a Markdown→Notion converter without the
18
+ * cosmetic indentation being misinterpreted as a code block.
19
+ */
20
+ export function dedentMarkdown(text) {
21
+ const lines = text.split('\n');
22
+ const nonEmptyLines = lines.filter((l) => l.trim().length > 0);
23
+ if (nonEmptyLines.length === 0) {
24
+ return text;
25
+ }
26
+ const minIndent = Math.min(...nonEmptyLines.map((l) => {
27
+ const match = /^(\s*)/.exec(l);
28
+ return match?.[1]?.length ?? 0;
29
+ }));
30
+ if (minIndent === 0) {
31
+ return text;
32
+ }
33
+ return lines
34
+ .map((l) => (l.trim().length === 0 ? l : l.slice(minIndent)))
35
+ .join('\n');
36
+ }
37
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,GAAG;SACP,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CACH,CAAC;IAEF,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;SAC5D,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@lpenguin/notion-cli",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool for reading and editing Notion entries through Markdown and CSV. AI agent friendly.",
5
+ "type": "module",
6
+ "bin": {
7
+ "notion-md-csv-cli": "dist/index.js",
8
+ "notion-cli": "dist/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "files": [
12
+ "dist/**/*",
13
+ "README.md"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsx src/index.ts",
18
+ "lint": "eslint src/ tests/",
19
+ "lint:fix": "eslint src/ tests/ --fix",
20
+ "format": "prettier --write \"src/**/*.ts\"",
21
+ "format:check": "prettier --check \"src/**/*.ts\"",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest",
24
+ "test:coverage": "vitest run --coverage",
25
+ "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.test.json",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "keywords": [
29
+ "notion",
30
+ "markdown",
31
+ "csv",
32
+ "cli",
33
+ "ai-agent"
34
+ ],
35
+ "license": "MIT",
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "dependencies": {
40
+ "@notionhq/client": "^5.9.0",
41
+ "@tryfabric/martian": "^1.2.4",
42
+ "chalk": "^5.3.0",
43
+ "commander": "^12.1.0",
44
+ "csv-parse": "^5.5.6",
45
+ "csv-stringify": "^6.5.1",
46
+ "diff": "^7.0.0",
47
+ "dotenv": "^16.4.5",
48
+ "notion-to-md": "^3.1.1",
49
+ "ora": "^8.1.0",
50
+ "p-queue": "^9.1.0",
51
+ "zod": "^3.23.8"
52
+ },
53
+ "devDependencies": {
54
+ "@types/diff": "^6.0.0",
55
+ "@types/node": "^22.10.0",
56
+ "@typescript-eslint/eslint-plugin": "^8.16.0",
57
+ "@typescript-eslint/parser": "^8.16.0",
58
+ "eslint": "^9.15.0",
59
+ "prettier": "^3.4.1",
60
+ "tsx": "^4.19.2",
61
+ "typescript": "^5.7.2",
62
+ "vitest": "^2.1.8"
63
+ }
64
+ }