@ngockhoale/ukit 1.3.0 → 1.3.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 CHANGED
@@ -4,6 +4,16 @@ All notable changes to UKit are documented here.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 1.3.1 - 2026-05-06
8
+
9
+ ### Fixed
10
+
11
+ - Fixed `ukit install` failing with `ENOENT` when a published/global package is missing optional `templates/.gitignore`; install now uses a built-in fallback.
12
+
13
+ ### Tests
14
+
15
+ - Added a regression test for package artifacts without `templates/.gitignore`.
16
+
7
17
  ## 1.3.0 - 2026-05-06
8
18
 
9
19
  ### Added
package/README.md CHANGED
@@ -68,7 +68,7 @@ If maintainers roll out a newer CLI build, the in-project workflow still stays t
68
68
  - `.ukit/` — hidden shared runtime storage for config, cache, and cross-agent memory
69
69
  - `docs/` — PROJECT / MEMORY / STATUS / TASKS / WORKLOG baseline
70
70
 
71
- ## UKit v1.3.0 Runtime
71
+ ## UKit v1.3.1 Runtime
72
72
 
73
73
  UKit now installs a hidden shared local runtime at `.ukit/` for production-oriented state that should survive across agent sessions:
74
74
 
@@ -86,7 +86,7 @@ When long sessions approach the compact threshold, UKit now uses a conservative
86
86
  - compact only safe-zone history/noise
87
87
  - preserve active task, rules, decisions, and current code focus
88
88
 
89
- UKit v1.3.0 keeps the same shared runtime contract while adding Safe Patch Protocol guardrails and the local AI task queue alongside living project status routing:
89
+ UKit v1.3.1 keeps the same shared runtime contract while adding Safe Patch Protocol guardrails and the local AI task queue alongside living project status routing:
90
90
 
91
91
  - install globally with `npm install -g @ngockhoale/ukit`
92
92
  - keep using the exact same human workflow inside projects: `ukit install`
@@ -98,7 +98,7 @@ UKit v1.3.0 keeps the same shared runtime contract while adding Safe Patch Proto
98
98
  - keep concrete debug/implementation/review prompts primary, so project status never replaces source/index-first task work
99
99
  - quietly guard risky AI edits with Safe Patch Protocol: stale/ambiguous specs are blocked, shared-risk whole-file writes are discouraged, and internal helpers preserve UTF-8 BOM/no-BOM plus LF/CRLF for multilingual text
100
100
 
101
- UKit v1.3.0 also keeps the fast path improvements from the recent runtime releases:
101
+ UKit v1.3.1 also keeps the fast path improvements from the recent runtime releases:
102
102
 
103
103
  - Vietnamese prompts now normalize more effectively for English-heavy code symbols and paths
104
104
  - localized simple direct-target lanes skip extra previous-context / recent-output work when it would not change the next action
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngockhoale/ukit",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "Install/update an index-first AI workspace for Claude Code, Antigravity, OpenAI Codex, and OpenCode.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,6 +25,14 @@ const BINARY_TEMPLATE_EXTENSIONS = new Set([
25
25
  '.pdf',
26
26
  ]);
27
27
 
28
+ const FALLBACK_ROOT_GITIGNORE_TEMPLATE = 'node_modules/\n.env\n*.log\n.DS_Store\n';
29
+
30
+ function isRootGitignoreItem(item) {
31
+ return item?.id === 'gitignore-root'
32
+ && item?.sourceTemplate === '.gitignore'
33
+ && item?.targetPath === '.gitignore';
34
+ }
35
+
28
36
  function safeResolve(basePath, relativePath) {
29
37
  const resolvedPath = path.resolve(basePath, relativePath);
30
38
  const relativeToBase = path.relative(basePath, resolvedPath);
@@ -118,7 +126,27 @@ export async function buildInstallPlan({
118
126
  });
119
127
  } else {
120
128
  const sourcePath = safeResolve(templatesRoot, item.sourceTemplate);
121
- const stat = await fs.stat(sourcePath);
129
+ let stat;
130
+ try {
131
+ stat = await fs.stat(sourcePath);
132
+ } catch (error) {
133
+ if (error?.code === 'ENOENT' && isRootGitignoreItem(item)) {
134
+ const targetPath = safeResolve(projectRoot, item.targetPath);
135
+ explicitTargetPaths.add(targetPath);
136
+ planEntries.push({
137
+ id: item.id,
138
+ type: item.type,
139
+ sourcePath: null,
140
+ targetPath,
141
+ mergeStrategy: item.mergeStrategy,
142
+ renderedContent: FALLBACK_ROOT_GITIGNORE_TEMPLATE,
143
+ requires: item.requires ?? [],
144
+ mode: 0o644,
145
+ });
146
+ continue;
147
+ }
148
+ throw error;
149
+ }
122
150
  if (stat.isDirectory()) {
123
151
  const nestedFiles = await walkDirectory(sourcePath);
124
152
  const nestedStats = await Promise.all(nestedFiles.map((filePath) => fs.stat(filePath)));
@@ -49,7 +49,7 @@ export function buildDefaultRuntimeConfig(overrides = {}) {
49
49
  const safeOverrides = isPlainObject(overrides) ? overrides : {};
50
50
 
51
51
  return mergeObjects({
52
- version: '1.3.0',
52
+ version: '1.3.1',
53
53
  agent: 'claude-code',
54
54
  compact: {
55
55
  enabled: true,
@@ -12,7 +12,7 @@ Auto-generated by UKit for OpenAI Codex.
12
12
  - Do not make end users memorize skill names, helper scripts, or routing internals unless they are debugging UKit itself.
13
13
  - **Treat helper commands as internal orchestration. Do not ask end users to run them.**
14
14
 
15
- ## UKit v1.3.0 Shared Runtime
15
+ ## UKit v1.3.1 Shared Runtime
16
16
 
17
17
  - Shared runtime state lives in `.ukit/storage/`.
18
18
  - Treat `.ukit/storage/config.json` as the source of compact, token-pipeline, router, memory, validation, and Safe Patch guardrail toggles.
@@ -43,7 +43,7 @@
43
43
  - If a concrete verification lane is needed, prefer `node .claude/ukit/index/verify-context.mjs ...`.
44
44
  - These helper/index commands are internal orchestration. Run them yourself when needed; never turn them into required end-user workflow.
45
45
 
46
- ## UKit v1.3.0 Shared Runtime
46
+ ## UKit v1.3.1 Shared Runtime
47
47
 
48
48
  - Shared runtime state lives in `.ukit/storage/`.
49
49
  - Treat `.ukit/storage/config.json` as the source of runtime toggles for compact, token pipeline, router, memory, validation, and Safe Patch behavior.
@@ -42,7 +42,7 @@
42
42
  - **Do not ask normal contributors to run internal helper commands**; run them yourself or tell them to rerun `ukit install`.
43
43
  - Do not ask normal contributors to memorize `ukit doctor`, `ukit diff`, `ukit uninstall`, or `ukit index ...` unless they explicitly need maintainer/debug help.
44
44
 
45
- ## UKit v1.3.0 Shared Runtime
45
+ ## UKit v1.3.1 Shared Runtime
46
46
 
47
47
  - Shared runtime state lives in `.ukit/storage/`.
48
48
  - Treat `.ukit/storage/config.json` as the source of runtime toggles for compact, token pipeline, router, memory, validation, and Safe Patch behavior.
@@ -1,6 +1,6 @@
1
1
  # UKit Shared Runtime
2
2
 
3
- This folder stores shared UKit runtime state for v1.3.0 features.
3
+ This folder stores shared UKit runtime state for v1.3.1 features.
4
4
 
5
5
  - `storage/config.json` — runtime feature flags and defaults
6
6
  - `storage/cache/` — prompt-cache, compact history, compact pressure state, output summaries, and preserved raw tool outputs under `storage/cache/tee/`
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.3.0",
2
+ "version": "1.3.1",
3
3
  "agent": "claude-code",
4
4
  "compact": {
5
5
  "enabled": true,