@aligndottech/cli 0.54.0 → 0.55.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/context.d.ts +6 -0
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +16 -2
- package/dist/commands/context.js.map +1 -1
- package/dist/lib/brand.d.ts +14 -7
- package/dist/lib/brand.d.ts.map +1 -1
- package/dist/lib/brand.js +56 -35
- package/dist/lib/brand.js.map +1 -1
- package/dist/lib/context-local-only.d.ts +5 -0
- package/dist/lib/context-local-only.d.ts.map +1 -0
- package/dist/lib/context-local-only.js +47 -0
- package/dist/lib/context-local-only.js.map +1 -0
- package/dist/lib/decisions-context.d.ts +29 -1
- package/dist/lib/decisions-context.d.ts.map +1 -1
- package/dist/lib/decisions-context.js +61 -2
- package/dist/lib/decisions-context.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
* separate owned file makes augment-never-overwrite structural, so no marker
|
|
10
10
|
* parser exists to get wrong).
|
|
11
11
|
*
|
|
12
|
+
* For a LOCAL graph that path is usually a symlink to `~/.align/contexts/...` (ALI-1668),
|
|
13
|
+
* never a real file - see decisions-context.ts's file header for why gitignore alone was not
|
|
14
|
+
* enough. Every reader here (CLAUDE.md's import, `inject` below, the gitignore/tracked-by-git
|
|
15
|
+
* checks) resolves the relative path transparently either way, so nothing in this file needs
|
|
16
|
+
* to know which case it is.
|
|
17
|
+
*
|
|
12
18
|
* This module is only the wiring: fetch, map, write, say what happened. It
|
|
13
19
|
* must stay non-interactive - it is exactly the kind of command that ends up
|
|
14
20
|
* in a hook or a CI step, which is where an unguarded prompt hangs (the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+H7D"}
|
package/dist/commands/context.js
CHANGED
|
@@ -6,6 +6,7 @@ import { createConfigStore } from '../lib/config.js';
|
|
|
6
6
|
import { createGatewayClient } from '../lib/gateway-client.js';
|
|
7
7
|
import { resolveEnv } from '../lib/resolve-env.js';
|
|
8
8
|
import { localCitationFor } from '../lib/commit-cite.js';
|
|
9
|
+
import { ensureGitignored, isTrackedByGit } from '../lib/context-local-only.js';
|
|
9
10
|
import { navigableSourceUrl } from '../lib/decision-links.js';
|
|
10
11
|
import { ALIGN_CONTEXT_PATH, ALIGN_IMPORT_LINE, writeDecisionsContext, } from '../lib/decisions-context.js';
|
|
11
12
|
export function registerContextCommand(program) {
|
|
@@ -22,7 +23,8 @@ export function registerContextCommand(program) {
|
|
|
22
23
|
// preferLocalEmbedded: the launch's flagship command must work for the
|
|
23
24
|
// no-account user it is pitched at - bare resolution sent them to an
|
|
24
25
|
// unauthenticated cloud 401 (ALI-675, the ALI-160/423 family).
|
|
25
|
-
const
|
|
26
|
+
const syncEnv = config.getEnvironment(resolveEnv(opts.env, { preferLocalEmbedded: true }));
|
|
27
|
+
const client = createGatewayClient(syncEnv);
|
|
26
28
|
const spinner = ora('Fetching decisions...').start();
|
|
27
29
|
// Fetch BEFORE writing anything: a failed fetch must not leave a
|
|
28
30
|
// plausible-looking "no decisions" file behind. An empty file and an
|
|
@@ -62,7 +64,9 @@ export function registerContextCommand(program) {
|
|
|
62
64
|
}
|
|
63
65
|
spinner.stop();
|
|
64
66
|
const repoRoot = process.cwd();
|
|
65
|
-
|
|
67
|
+
// external: true moves the LOCAL case's real bytes to ~/.align (ALI-1668) - a symlink is
|
|
68
|
+
// left at ALIGN_CONTEXT_PATH, so every read below (and align context inject) is unchanged.
|
|
69
|
+
const result = await writeDecisionsContext(repoRoot, decisions, { external: syncEnv.mode === 'local-embedded' });
|
|
66
70
|
console.log(`${chalk.green('Wrote')} ${result.contextPath} (${decisions.length} decision${decisions.length === 1 ? '' : 's'})`);
|
|
67
71
|
if (result.importAdded) {
|
|
68
72
|
console.log(`${chalk.green('Added')} ${ALIGN_IMPORT_LINE} import to CLAUDE.md`);
|
|
@@ -76,6 +80,16 @@ export function registerContextCommand(program) {
|
|
|
76
80
|
console.log(`No CLAUDE.md here - add this line to your agent's context file to load it:\n` +
|
|
77
81
|
` ${chalk.bold(ALIGN_IMPORT_LINE)}`);
|
|
78
82
|
}
|
|
83
|
+
// A local graph is private to this machine, so its decisions file stays out of git. Sharing with a team
|
|
84
|
+
// goes through `align share`; a team graph's file is already team content and is left alone.
|
|
85
|
+
if (syncEnv.mode === 'local-embedded') {
|
|
86
|
+
const status = ensureGitignored(repoRoot, ALIGN_CONTEXT_PATH);
|
|
87
|
+
console.log(chalk.dim(`${status === 'added' ? 'Kept out of git (added to .gitignore)' : 'Kept out of git'}: this comes from your local graph, which stays on this machine. ` +
|
|
88
|
+
`To bring decisions to your team, run ${chalk.bold('align share')}.`));
|
|
89
|
+
if (isTrackedByGit(repoRoot, ALIGN_CONTEXT_PATH)) {
|
|
90
|
+
console.log(chalk.yellow(`${ALIGN_CONTEXT_PATH} is already tracked by git, so it can reach your team. Stop tracking it: git rm --cached ${ALIGN_CONTEXT_PATH}`));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
79
93
|
console.log(chalk.dim('Re-run `align context sync` after new decisions land.'));
|
|
80
94
|
});
|
|
81
95
|
context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/brand.d.ts
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Align brand rendering for the terminal.
|
|
3
3
|
*
|
|
4
|
-
* The mark is
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* The mark is a small 'A' glyph (ALI-1649), not the vector Align mark: a deliberate
|
|
5
|
+
* brand-direction change, not a correction of the prior chevron art. It went through
|
|
6
|
+
* two mascot attempts first - a robot head (ALI-1642/ALI-1647), then an alien head -
|
|
7
|
+
* both of which Tom read as a skull on sight, in the robot's case through two
|
|
8
|
+
* different eye treatments (background-void eyes, then filled teal eyes: the
|
|
9
|
+
* shape - two separate bilateral marks - was the cue, not the colour). A plain
|
|
10
|
+
* geometric 'A' sidesteps the whole class of problem by not having a face to misread.
|
|
11
|
+
* It is authored at terminal resolution using only block and half-block glyphs - no
|
|
12
|
+
* shading characters (▓▒░), which read as dithered noise rather than a crisp
|
|
13
|
+
* silhouette at this size, and no quadrant characters, which were tried for the
|
|
14
|
+
* original triangular mark in 0.26.2 and render blurry and inset in many terminal
|
|
15
|
+
* fonts.
|
|
9
16
|
*
|
|
10
17
|
* On a dark terminal the navy strokes are rendered WHITE, following the brand pack's
|
|
11
18
|
* own knockout variant (F 4 R): navy on a dark background is invisible, which is why
|
|
@@ -15,8 +22,8 @@ export declare const BRAND: {
|
|
|
15
22
|
readonly teal: "#43b6ac";
|
|
16
23
|
readonly navy: "#022863";
|
|
17
24
|
};
|
|
18
|
-
export declare const LOGO_WIDTH =
|
|
19
|
-
export declare const LOGO_ROWS =
|
|
25
|
+
export declare const LOGO_WIDTH = 10;
|
|
26
|
+
export declare const LOGO_ROWS = 7;
|
|
20
27
|
/**
|
|
21
28
|
* The live positioning line, taken from align-frontend's hero (src/lib/seo.ts).
|
|
22
29
|
* 'Collaboration with clarity built in' is RETIRED - do not reintroduce it.
|
package/dist/lib/brand.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/lib/brand.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/lib/brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,eAAO,MAAM,KAAK;;;CAGR,CAAC;AAWX,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,SAAS,IAAI,CAAC;AAE3B;;;GAGG;AACH,eAAO,MAAM,aAAa,4EAGhB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAuDxD;;;;iFAIiF;AACjF,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iFAAiF;IACjF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAuCD,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,GAAE,aAAkB,GAAG,MAAM,EAAE,CAsB5D;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,OAAO,EAAE,MAAM,CAAC;CACjB;AAcD,wBAAgB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAgClD;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAK5E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAIxD"}
|
package/dist/lib/brand.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Align brand rendering for the terminal.
|
|
3
3
|
*
|
|
4
|
-
* The mark is
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* The mark is a small 'A' glyph (ALI-1649), not the vector Align mark: a deliberate
|
|
5
|
+
* brand-direction change, not a correction of the prior chevron art. It went through
|
|
6
|
+
* two mascot attempts first - a robot head (ALI-1642/ALI-1647), then an alien head -
|
|
7
|
+
* both of which Tom read as a skull on sight, in the robot's case through two
|
|
8
|
+
* different eye treatments (background-void eyes, then filled teal eyes: the
|
|
9
|
+
* shape - two separate bilateral marks - was the cue, not the colour). A plain
|
|
10
|
+
* geometric 'A' sidesteps the whole class of problem by not having a face to misread.
|
|
11
|
+
* It is authored at terminal resolution using only block and half-block glyphs - no
|
|
12
|
+
* shading characters (▓▒░), which read as dithered noise rather than a crisp
|
|
13
|
+
* silhouette at this size, and no quadrant characters, which were tried for the
|
|
14
|
+
* original triangular mark in 0.26.2 and render blurry and inset in many terminal
|
|
15
|
+
* fonts.
|
|
9
16
|
*
|
|
10
17
|
* On a dark terminal the navy strokes are rendered WHITE, following the brand pack's
|
|
11
18
|
* own knockout variant (F 4 R): navy on a dark background is invisible, which is why
|
|
@@ -22,8 +29,8 @@ const WHITE_RGB = [255, 255, 255];
|
|
|
22
29
|
const TEAL_256 = 79;
|
|
23
30
|
const NAVY_256 = 24;
|
|
24
31
|
const WHITE_256 = 231;
|
|
25
|
-
export const LOGO_WIDTH =
|
|
26
|
-
export const LOGO_ROWS =
|
|
32
|
+
export const LOGO_WIDTH = 10;
|
|
33
|
+
export const LOGO_ROWS = 7;
|
|
27
34
|
/**
|
|
28
35
|
* The live positioning line, taken from align-frontend's hero (src/lib/seo.ts).
|
|
29
36
|
* 'Collaboration with clarity built in' is RETIRED - do not reintroduce it.
|
|
@@ -39,41 +46,55 @@ export const TAGLINE_LINES = [
|
|
|
39
46
|
*/
|
|
40
47
|
export const TAGLINE_ACCENT = "don't know the company.";
|
|
41
48
|
/**
|
|
42
|
-
* The mark
|
|
49
|
+
* The 'A' mark: an apex that widens into a triangle, a full-width teal crossbar, and
|
|
50
|
+
* two legs with an open counter between them - a plain geometric letterform, chosen
|
|
51
|
+
* (ALI-1649) specifically because it has no face and so nothing on it can be misread
|
|
52
|
+
* as eyes. Tom: "kinda look like A or rocket" - the crossbar reads as a fuel-line
|
|
53
|
+
* stripe and the legs as fins/landing legs, which is a fair reading and not a
|
|
54
|
+
* contradiction of the brief.
|
|
43
55
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* RIGHT only, a teal bar that overhangs to the LEFT, two short teal segments, and two
|
|
49
|
-
* slanted navy feet. Earlier hand-drawn versions got every one of those details wrong,
|
|
50
|
-
* because they were reconstructed from memory instead of read off the asset. The one
|
|
51
|
-
* hand edit at this size is the feet row's COLOUR mask: the teal bar's lower edge
|
|
52
|
-
* bleeds into it when multiple source pixel rows are averaged into a single cell row at this scale, and the approved
|
|
53
|
-
* sprite's bottom row is navy feet throughout - coverage was left exactly as derived.
|
|
56
|
+
* Built from a 5-column LEFT HALF mirrored into the full 10-column row
|
|
57
|
+
* (`half + reverse(half)`), so left/right symmetry holds by construction instead of
|
|
58
|
+
* by eye - the original (20-wide) triangular mark's hand-balanced string got four
|
|
59
|
+
* rows wrong before this technique was adopted.
|
|
54
60
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
61
|
+
* A half-block terminal cell packs two pixel-rows into one glyph, and can only carry
|
|
62
|
+
* ONE colour: whichever pixel-row is present sets both the glyph (█/▀/▄) and the
|
|
63
|
+
* colour. So no cell may have a non-background colour on both its top and bottom
|
|
64
|
+
* pixel-row where those two colours differ. Every row-pair here uses an identical
|
|
65
|
+
* half pattern for both its pixel-rows, so the shape is clash-free without a
|
|
66
|
+
* hand-patched exception the way the original triangular mark's feet row needed one.
|
|
58
67
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
68
|
+
* Row budget: `banner()` places `ALIGN®`, the two tagline lines, and the version at
|
|
69
|
+
* `right[textTop]`..`right[textTop + 2]` and `right[textTop + 4]`; brand.test.ts
|
|
70
|
+
* asserts the two tagline rows are never teal from the mark, only from text. At
|
|
71
|
+
* `LOGO_ROWS=7` (`textTop=1`) that's rows 2 and 3 - this mark keeps its only teal
|
|
72
|
+
* (the apex tip and the crossbar) on rows 0 and 4, both outside that pair. A future
|
|
73
|
+
* resize must keep every teal cell off whichever rows map to the tagline.
|
|
74
|
+
*
|
|
75
|
+
* GLYPHS holds the shape, COLOURS names each cell's brand colour ('N' navy/white-
|
|
76
|
+
* knockout, 'T' teal, ' ' none); the two must agree cell for cell (space iff space).
|
|
77
|
+
* Both constants are private, so brand.test.ts checks this through the public
|
|
78
|
+
* `logoLines` output instead of importing them directly: every visible glyph
|
|
79
|
+
* character must carry a colour escape, and every space must carry none.
|
|
61
80
|
*/
|
|
62
81
|
const GLYPHS = [
|
|
63
|
-
'
|
|
64
|
-
'
|
|
65
|
-
'
|
|
66
|
-
'
|
|
67
|
-
'
|
|
68
|
-
'
|
|
82
|
+
' ██ ',
|
|
83
|
+
' ████ ',
|
|
84
|
+
' ██████ ',
|
|
85
|
+
' ████████ ',
|
|
86
|
+
'██████████',
|
|
87
|
+
'██ ██',
|
|
88
|
+
'█ █',
|
|
69
89
|
];
|
|
70
90
|
const COLOURS = [
|
|
71
|
-
'
|
|
72
|
-
'
|
|
73
|
-
'
|
|
74
|
-
'
|
|
75
|
-
'
|
|
76
|
-
'
|
|
91
|
+
' TT ',
|
|
92
|
+
' NNNN ',
|
|
93
|
+
' NNNNNN ',
|
|
94
|
+
' NNNNNNNN ',
|
|
95
|
+
'TTTTTTTTTT',
|
|
96
|
+
'NN NN',
|
|
97
|
+
'N N',
|
|
77
98
|
];
|
|
78
99
|
function resolveColor(o) {
|
|
79
100
|
if (typeof o.color === 'boolean')
|
package/dist/lib/brand.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../../src/lib/brand.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../../src/lib/brand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Adds `relPath` to the repo's `.gitignore` unless it is already ignored. Idempotent. */
|
|
2
|
+
export declare function ensureGitignored(repoRoot: string, relPath: string): 'added' | 'already';
|
|
3
|
+
/** Is `relPath` already tracked by git? False outside a repo, and never throws. */
|
|
4
|
+
export declare function isTrackedByGit(repoRoot: string, relPath: string): boolean;
|
|
5
|
+
//# sourceMappingURL=context-local-only.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-local-only.d.ts","sourceRoot":"","sources":["../../src/lib/context-local-only.ts"],"names":[],"mappings":"AAsBA,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAYvF;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAOzE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Keeps the decisions file written by `align context sync` on this machine when the graph behind it is local.
|
|
6
|
+
*
|
|
7
|
+
* A local graph is private: it is built with personal read-only tokens, and nothing in it leaves the machine
|
|
8
|
+
* until `align share`, which previews each decision, scans for secrets and needs a person's yes. The decisions
|
|
9
|
+
* file carries titles and source links, so a committed copy would reach every colleague and every agent in the
|
|
10
|
+
* repo without any of that. Ignoring it in git keeps the file useful to the agent on this machine, and leaves
|
|
11
|
+
* sharing to the one path that was built for it.
|
|
12
|
+
*/
|
|
13
|
+
/** The `.gitignore` lines that already cover `relPath` (an exact path, its directory, or the directory's contents). */
|
|
14
|
+
function covers(line, relPath) {
|
|
15
|
+
const t = line.trim().replace(/^\//, '');
|
|
16
|
+
if (t === '' || t.startsWith('#') || t.startsWith('!'))
|
|
17
|
+
return false;
|
|
18
|
+
const dir = path.posix.dirname(relPath);
|
|
19
|
+
return t === relPath || t === dir || t === `${dir}/` || t === `${dir}/*`;
|
|
20
|
+
}
|
|
21
|
+
/** Adds `relPath` to the repo's `.gitignore` unless it is already ignored. Idempotent. */
|
|
22
|
+
export function ensureGitignored(repoRoot, relPath) {
|
|
23
|
+
const file = path.join(repoRoot, '.gitignore');
|
|
24
|
+
let existing = '';
|
|
25
|
+
try {
|
|
26
|
+
existing = fs.readFileSync(file, 'utf8');
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// No .gitignore yet: the first line creates it.
|
|
30
|
+
}
|
|
31
|
+
if (existing.split('\n').some((l) => covers(l, relPath)))
|
|
32
|
+
return 'already';
|
|
33
|
+
const sep = existing === '' || existing.endsWith('\n') ? '' : '\n';
|
|
34
|
+
fs.writeFileSync(file, `${existing}${sep}${relPath}\n`);
|
|
35
|
+
return 'added';
|
|
36
|
+
}
|
|
37
|
+
/** Is `relPath` already tracked by git? False outside a repo, and never throws. */
|
|
38
|
+
export function isTrackedByGit(repoRoot, relPath) {
|
|
39
|
+
try {
|
|
40
|
+
execFileSync('git', ['-C', repoRoot, 'ls-files', '--error-unmatch', '--', relPath], { stdio: 'pipe' });
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=context-local-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-local-only.js","sourceRoot":"","sources":["../../src/lib/context-local-only.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;GAQG;AAEH,uHAAuH;AACvH,SAAS,MAAM,CAAC,IAAY,EAAE,OAAe;IAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC;AAC3E,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC/C,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3E,MAAM,GAAG,GAAG,QAAQ,KAAK,EAAE,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,QAAQ,GAAG,GAAG,GAAG,OAAO,IAAI,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAe;IAC9D,IAAI,CAAC;QACH,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACvG,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -15,6 +15,22 @@
|
|
|
15
15
|
* OPEN CORE. Nothing here selects or ranks anything. Which decisions are current, relevant and
|
|
16
16
|
* unsuperseded is a gateway query; this module formats a list and writes a file, which is
|
|
17
17
|
* plumbing.
|
|
18
|
+
*
|
|
19
|
+
* EXTERNAL STORAGE (ALI-1668). A LOCAL graph's content is personal (built with the user's own
|
|
20
|
+
* read-only tokens), so it must never be representable in the git working tree at all - not
|
|
21
|
+
* even gitignored, which is a convention a `git add -f`, an edited line, or a merge dropping it
|
|
22
|
+
* can all bypass silently. `{ external: true }` writes the real bytes to
|
|
23
|
+
* `~/.align/contexts/<hash>/decisions.md` (the same home-directory convention that already
|
|
24
|
+
* holds the saved connector tokens and the local graph DB itself - see private-files.ts) and
|
|
25
|
+
* leaves a SYMLINK at `.align/decisions.md` pointing there. Every existing reader - the
|
|
26
|
+
* CLAUDE.md import, `align context inject`, the gitignore/tracked-by-git checks in
|
|
27
|
+
* commands/context.ts - keeps working completely unchanged, because `fs.readFileSync` and
|
|
28
|
+
* `fs.existsSync` follow a symlink transparently; only the WRITE path needed to change.
|
|
29
|
+
*
|
|
30
|
+
* Symlinks need POSIX semantics Windows does not give an unprivileged process, so on win32 this
|
|
31
|
+
* falls back to the plain in-repo file - today's behaviour, unprotected beyond gitignore, but
|
|
32
|
+
* no worse than before. Best effort by platform, the same shape as every other
|
|
33
|
+
* platform-dependent hardening in private-files.ts.
|
|
18
34
|
*/
|
|
19
35
|
export interface ContextDecision {
|
|
20
36
|
title: string;
|
|
@@ -58,6 +74,13 @@ export interface WriteResult {
|
|
|
58
74
|
/** True only when this run added the import line, so a caller can say so once. */
|
|
59
75
|
importAdded: boolean;
|
|
60
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Where a LOCAL graph's decisions file lives outside the repo, keyed by the repo's resolved
|
|
79
|
+
* absolute path so two repos (or two worktrees of the same repo) never collide and never share
|
|
80
|
+
* a file. A regenerable cache, not identity-critical data: re-running `align context sync`
|
|
81
|
+
* rebuilds it, so a hash collision or a moved/renamed checkout costs a re-sync, not data loss.
|
|
82
|
+
*/
|
|
83
|
+
export declare function externalContextPath(repoRoot: string): string;
|
|
61
84
|
/**
|
|
62
85
|
* Write the owned context file, and add the import line to CLAUDE.md if it is there.
|
|
63
86
|
*
|
|
@@ -68,6 +91,11 @@ export interface WriteResult {
|
|
|
68
91
|
* Idempotent on disk, which is the acceptance test for the whole feature rather than a detail:
|
|
69
92
|
* a file that differs between runs turns every regeneration into a git diff in someone else's
|
|
70
93
|
* repo. The renderer carries no timestamp for exactly this reason.
|
|
94
|
+
*
|
|
95
|
+
* `opts.external`: the local-graph case (ALI-1668, see the file header). Every existing caller
|
|
96
|
+
* omits it and gets byte-for-byte the same plain-file behaviour as before this option existed.
|
|
71
97
|
*/
|
|
72
|
-
export declare function writeDecisionsContext(repoRoot: string, decisions: ContextDecision[]
|
|
98
|
+
export declare function writeDecisionsContext(repoRoot: string, decisions: ContextDecision[], opts?: {
|
|
99
|
+
external?: boolean;
|
|
100
|
+
}): Promise<WriteResult>;
|
|
73
101
|
//# sourceMappingURL=decisions-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decisions-context.d.ts","sourceRoot":"","sources":["../../src/lib/decisions-context.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"decisions-context.d.ts","sourceRoot":"","sources":["../../src/lib/decisions-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AASH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;qEAGiE;IACjE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AACxD,eAAO,MAAM,iBAAiB,yBAA2B,CAAC;AA6B1D;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,CAgCxE;AAED,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG5D;AAyBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,eAAe,EAAE,EAC5B,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,WAAW,CAAC,CAyBtB"}
|
|
@@ -15,10 +15,29 @@
|
|
|
15
15
|
* OPEN CORE. Nothing here selects or ranks anything. Which decisions are current, relevant and
|
|
16
16
|
* unsuperseded is a gateway query; this module formats a list and writes a file, which is
|
|
17
17
|
* plumbing.
|
|
18
|
+
*
|
|
19
|
+
* EXTERNAL STORAGE (ALI-1668). A LOCAL graph's content is personal (built with the user's own
|
|
20
|
+
* read-only tokens), so it must never be representable in the git working tree at all - not
|
|
21
|
+
* even gitignored, which is a convention a `git add -f`, an edited line, or a merge dropping it
|
|
22
|
+
* can all bypass silently. `{ external: true }` writes the real bytes to
|
|
23
|
+
* `~/.align/contexts/<hash>/decisions.md` (the same home-directory convention that already
|
|
24
|
+
* holds the saved connector tokens and the local graph DB itself - see private-files.ts) and
|
|
25
|
+
* leaves a SYMLINK at `.align/decisions.md` pointing there. Every existing reader - the
|
|
26
|
+
* CLAUDE.md import, `align context inject`, the gitignore/tracked-by-git checks in
|
|
27
|
+
* commands/context.ts - keeps working completely unchanged, because `fs.readFileSync` and
|
|
28
|
+
* `fs.existsSync` follow a symlink transparently; only the WRITE path needed to change.
|
|
29
|
+
*
|
|
30
|
+
* Symlinks need POSIX semantics Windows does not give an unprivileged process, so on win32 this
|
|
31
|
+
* falls back to the plain in-repo file - today's behaviour, unprotected beyond gitignore, but
|
|
32
|
+
* no worse than before. Best effort by platform, the same shape as every other
|
|
33
|
+
* platform-dependent hardening in private-files.ts.
|
|
18
34
|
*/
|
|
35
|
+
import { createHash } from 'node:crypto';
|
|
36
|
+
import fs from 'node:fs';
|
|
19
37
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
20
38
|
import path from 'node:path';
|
|
21
39
|
import { deciderLabel } from './decider-kind.js';
|
|
40
|
+
import { alignConfigDir, ensurePrivateDir, writePrivateFile } from './private-files.js';
|
|
22
41
|
export const ALIGN_CONTEXT_PATH = '.align/decisions.md';
|
|
23
42
|
export const ALIGN_IMPORT_LINE = `@${ALIGN_CONTEXT_PATH}`;
|
|
24
43
|
/**
|
|
@@ -98,6 +117,40 @@ export function appendImportLine(claudeMd) {
|
|
|
98
117
|
const separator = claudeMd.endsWith('\n') ? '' : '\n';
|
|
99
118
|
return `${claudeMd}${separator}\n${ALIGN_IMPORT_LINE}\n`;
|
|
100
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Where a LOCAL graph's decisions file lives outside the repo, keyed by the repo's resolved
|
|
122
|
+
* absolute path so two repos (or two worktrees of the same repo) never collide and never share
|
|
123
|
+
* a file. A regenerable cache, not identity-critical data: re-running `align context sync`
|
|
124
|
+
* rebuilds it, so a hash collision or a moved/renamed checkout costs a re-sync, not data loss.
|
|
125
|
+
*/
|
|
126
|
+
export function externalContextPath(repoRoot) {
|
|
127
|
+
const key = createHash('sha256').update(path.resolve(repoRoot)).digest('hex').slice(0, 16);
|
|
128
|
+
return path.join(alignConfigDir(), 'contexts', key, 'decisions.md');
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Best effort: write `rendered` to the external per-repo path and leave a symlink at
|
|
132
|
+
* `inRepoTarget` pointing there. Returns false (never throws) on any failure - a read-only
|
|
133
|
+
* filesystem, a POSIX symlink permission denied by an unusual mount, or simply win32, which
|
|
134
|
+
* this does not even attempt - so the caller can fall through to a plain in-repo file exactly
|
|
135
|
+
* as before this option existed.
|
|
136
|
+
*/
|
|
137
|
+
function tryWriteExternalAndLink(repoRoot, inRepoTarget, rendered) {
|
|
138
|
+
if (process.platform === 'win32')
|
|
139
|
+
return false;
|
|
140
|
+
try {
|
|
141
|
+
const external = externalContextPath(repoRoot);
|
|
142
|
+
ensurePrivateDir(path.dirname(external));
|
|
143
|
+
writePrivateFile(external, rendered);
|
|
144
|
+
// A prior run (plain file, or an old version's committed copy - the migration case) must
|
|
145
|
+
// not block the symlink: unlink whatever is there first, ENOENT included.
|
|
146
|
+
fs.rmSync(inRepoTarget, { force: true });
|
|
147
|
+
fs.symlinkSync(external, inRepoTarget);
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
101
154
|
/**
|
|
102
155
|
* Write the owned context file, and add the import line to CLAUDE.md if it is there.
|
|
103
156
|
*
|
|
@@ -108,11 +161,17 @@ export function appendImportLine(claudeMd) {
|
|
|
108
161
|
* Idempotent on disk, which is the acceptance test for the whole feature rather than a detail:
|
|
109
162
|
* a file that differs between runs turns every regeneration into a git diff in someone else's
|
|
110
163
|
* repo. The renderer carries no timestamp for exactly this reason.
|
|
164
|
+
*
|
|
165
|
+
* `opts.external`: the local-graph case (ALI-1668, see the file header). Every existing caller
|
|
166
|
+
* omits it and gets byte-for-byte the same plain-file behaviour as before this option existed.
|
|
111
167
|
*/
|
|
112
|
-
export async function writeDecisionsContext(repoRoot, decisions) {
|
|
168
|
+
export async function writeDecisionsContext(repoRoot, decisions, opts = {}) {
|
|
113
169
|
const target = path.join(repoRoot, ALIGN_CONTEXT_PATH);
|
|
114
170
|
await mkdir(path.dirname(target), { recursive: true });
|
|
115
|
-
|
|
171
|
+
const rendered = renderDecisionsFile(decisions);
|
|
172
|
+
const linked = opts.external ? tryWriteExternalAndLink(repoRoot, target, rendered) : false;
|
|
173
|
+
if (!linked)
|
|
174
|
+
await writeFile(target, rendered, 'utf8');
|
|
116
175
|
const claudePath = path.join(repoRoot, 'CLAUDE.md');
|
|
117
176
|
let importAdded = false;
|
|
118
177
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decisions-context.js","sourceRoot":"","sources":["../../src/lib/decisions-context.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"decisions-context.js","sourceRoot":"","sources":["../../src/lib/decisions-context.ts"],"names":[],"mappings":"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"}
|