diff --git a/README.md b/README.md
index 954c873..6c461c9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,7 @@
-# vit manifesto
+[](https://v-it.org)
+[](https://v-it.org)
+
+# v̇it manifesto
vit is a **social system for personalized software** where the unit of exchange is not pull requests, not screenshots, not diffs, not even git.
diff --git a/docs/badge/social-open-source.svg b/docs/badge/social-open-source.svg
new file mode 100644
index 0000000..f86cbde
--- /dev/null
+++ b/docs/badge/social-open-source.svg
@@ -0,0 +1,21 @@
+
diff --git a/docs/badge/vit-enabled-flat.svg b/docs/badge/vit-enabled-flat.svg
new file mode 100644
index 0000000..29a7ae3
--- /dev/null
+++ b/docs/badge/vit-enabled-flat.svg
@@ -0,0 +1,14 @@
+
diff --git a/docs/badge/vit-enabled.svg b/docs/badge/vit-enabled.svg
new file mode 100644
index 0000000..fbb914f
--- /dev/null
+++ b/docs/badge/vit-enabled.svg
@@ -0,0 +1,21 @@
+
diff --git a/docs/badge/vit-icon-only.svg b/docs/badge/vit-icon-only.svg
new file mode 100644
index 0000000..4fb8463
--- /dev/null
+++ b/docs/badge/vit-icon-only.svg
@@ -0,0 +1,12 @@
+
diff --git a/docs/brand/vit-mark-dark.svg b/docs/brand/vit-mark-dark.svg
new file mode 100644
index 0000000..5643cac
--- /dev/null
+++ b/docs/brand/vit-mark-dark.svg
@@ -0,0 +1,5 @@
+
diff --git a/docs/brand/vit-mark-white.svg b/docs/brand/vit-mark-white.svg
new file mode 100644
index 0000000..7363027
--- /dev/null
+++ b/docs/brand/vit-mark-white.svg
@@ -0,0 +1,5 @@
+
diff --git a/docs/brand/vit-mark.svg b/docs/brand/vit-mark.svg
new file mode 100644
index 0000000..41c71c2
--- /dev/null
+++ b/docs/brand/vit-mark.svg
@@ -0,0 +1,5 @@
+
diff --git a/docs/brand/vit-wordmark.svg b/docs/brand/vit-wordmark.svg
new file mode 100644
index 0000000..5bd3208
--- /dev/null
+++ b/docs/brand/vit-wordmark.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/cmd/adopt.js b/src/cmd/adopt.js
index 28e2d04..af1b97a 100644
--- a/src/cmd/adopt.js
+++ b/src/cmd/adopt.js
@@ -7,6 +7,7 @@ import { execFileSync } from 'node:child_process';
import { parseGitUrl, toBeacon, beaconToHttps } from '../lib/beacon.js';
import { requireNotAgent } from '../lib/agent.js';
import { which } from '../lib/compat.js';
+import { mark, brand } from '../lib/brand.js';
export default function register(program) {
program
@@ -19,7 +20,7 @@ export default function register(program) {
try {
const gate = requireNotAgent();
if (!gate.ok) {
- console.error('vit adopt must be run by a human. run it in your own terminal.');
+ console.error(`${brand} adopt must be run by a human. run it in your own terminal.`);
process.exitCode = 1;
return;
}
@@ -78,11 +79,11 @@ export default function register(program) {
}
// success output
- console.log(`beacon: ${beaconUri}`);
- console.log(`directory: ${dirName}`);
+ console.log(`${mark} beacon: ${beaconUri}`);
+ console.log(`${mark} directory: ${dirName}`);
console.log(`run: cd ${dirName}`);
console.log('');
- console.log("next: start your agent and ask it to run 'vit init'");
+ console.log(`next: start your agent and ask it to run '${brand} init'`);
} catch (err) {
console.error(err instanceof Error ? err.message : String(err));
process.exitCode = 1;
diff --git a/src/cmd/follow.js b/src/cmd/follow.js
index 0d34b7c..bc4ab7d 100644
--- a/src/cmd/follow.js
+++ b/src/cmd/follow.js
@@ -4,6 +4,7 @@
import { requireDid } from '../lib/config.js';
import { restoreAgent } from '../lib/oauth.js';
import { readFollowing, writeFollowing } from '../lib/vit-dir.js';
+import { mark } from '../lib/brand.js';
export default function register(program) {
program
@@ -37,7 +38,7 @@ export default function register(program) {
list.push({ handle, did: targetDid, followedAt: new Date().toISOString() });
writeFollowing(list);
- console.log(`following ${handle} (${targetDid})`);
+ console.log(`${mark} following ${handle} (${targetDid})`);
} catch (err) {
console.error(err instanceof Error ? err.message : String(err));
process.exitCode = 1;
@@ -64,7 +65,7 @@ export default function register(program) {
writeFollowing(filtered);
if (verbose) console.log(`[verbose] removed ${handle} from following list`);
- console.log(`unfollowed ${handle}`);
+ console.log(`${mark} unfollowed ${handle}`);
} catch (err) {
console.error(err instanceof Error ? err.message : String(err));
process.exitCode = 1;
diff --git a/src/cmd/remix.js b/src/cmd/remix.js
index b919a31..52c7cce 100644
--- a/src/cmd/remix.js
+++ b/src/cmd/remix.js
@@ -7,6 +7,7 @@ import { restoreAgent } from '../lib/oauth.js';
import { readProjectConfig, readFollowing, readLog } from '../lib/vit-dir.js';
import { requireAgent } from '../lib/agent.js';
import { resolveRef, REF_PATTERN } from '../lib/cap-ref.js';
+import { brand } from '../lib/brand.js';
export default function register(program) {
program
@@ -19,8 +20,8 @@ export default function register(program) {
try {
const gate = requireAgent();
if (!gate.ok) {
- console.error('vit remix should be run by a coding agent (e.g. claude code, gemini cli).');
- console.error("open your agent and ask it to run 'vit remix' for you.");
+ console.error(`${brand} remix should be run by a coding agent (e.g. claude code, gemini cli).`);
+ console.error(`open your agent and ask it to run '${brand} remix' for you.`);
process.exitCode = 1;
return;
}
@@ -40,7 +41,7 @@ export default function register(program) {
const projectConfig = readProjectConfig();
const beacon = projectConfig.beacon;
if (!beacon) {
- console.error("no beacon set. run 'vit init' in a project directory first.");
+ console.error(`no beacon set. run '${brand} init' in a project directory first.`);
process.exitCode = 1;
return;
}
@@ -103,7 +104,7 @@ export default function register(program) {
const description = record.description || '';
const text = record.text || '';
- console.log(`# remix: ${title}`);
+ console.log(`# ${brand} remix: ${title}`);
console.log('');
console.log(`ref: ${ref}`);
console.log(`author: ${author}`);
diff --git a/src/cmd/vet.js b/src/cmd/vet.js
index fa6de46..a296a69 100644
--- a/src/cmd/vet.js
+++ b/src/cmd/vet.js
@@ -7,6 +7,7 @@ import { restoreAgent } from '../lib/oauth.js';
import { appendLog, readProjectConfig, readFollowing } from '../lib/vit-dir.js';
import { requireNotAgent } from '../lib/agent.js';
import { resolveRef, REF_PATTERN } from '../lib/cap-ref.js';
+import { mark, brand } from '../lib/brand.js';
export default function register(program) {
program
@@ -20,7 +21,7 @@ export default function register(program) {
try {
const gate = requireNotAgent();
if (!gate.ok) {
- console.error('vit vet must be run by a human. run it in your own terminal.');
+ console.error(`${brand} vet must be run by a human. run it in your own terminal.`);
console.error('');
console.error('cap vetting requires human review for safety.');
console.error('ask your user to run this command in their terminal:');
@@ -51,7 +52,7 @@ export default function register(program) {
const projectConfig = readProjectConfig();
const beacon = projectConfig.beacon;
if (!beacon) {
- console.error("no beacon set. run 'vit init' in a project directory first.");
+ console.error(`no beacon set. run '${brand} init' in a project directory first.`);
process.exitCode = 1;
return;
}
@@ -103,7 +104,7 @@ export default function register(program) {
uri: match.uri,
trustedAt: new Date().toISOString(),
});
- console.log(`trusted: ${ref}`);
+ console.log(`${mark} trusted: ${ref}`);
return;
}
@@ -112,7 +113,7 @@ export default function register(program) {
const description = record.description || '';
const text = record.text || '';
- console.log('=== Cap Review ===');
+ console.log(`=== ${brand} cap review ===`);
console.log('Review this cap carefully before trusting it.');
console.log('');
console.log(` Ref: ${ref}`);
diff --git a/src/cmd/vouch.js b/src/cmd/vouch.js
index 455678b..5fcacf0 100644
--- a/src/cmd/vouch.js
+++ b/src/cmd/vouch.js
@@ -6,6 +6,7 @@ import { CAP_COLLECTION } from '../lib/constants.js';
import { restoreAgent } from '../lib/oauth.js';
import { appendLog, readProjectConfig, readFollowing, readLog } from '../lib/vit-dir.js';
import { resolveRef, REF_PATTERN } from '../lib/cap-ref.js';
+import { mark, brand } from '../lib/brand.js';
export default function register(program) {
program
@@ -31,7 +32,7 @@ export default function register(program) {
const projectConfig = readProjectConfig();
const beacon = projectConfig.beacon;
if (!beacon) {
- console.error("no beacon set. run 'vit init' in a project directory first.");
+ console.error(`no beacon set. run '${brand} init' in a project directory first.`);
process.exitCode = 1;
return;
}
@@ -117,7 +118,7 @@ export default function register(program) {
}
if (verbose) console.log('[verbose] logged to vouched.jsonl');
- console.log(`vouched: ${ref} (${match.uri})`);
+ console.log(`${mark} vouched: ${ref} (${match.uri})`);
} catch (err) {
console.error(err instanceof Error ? err.message : String(err));
process.exitCode = 1;
diff --git a/test/init.test.js b/test/init.test.js
index 6daaacc..da6c799 100644
--- a/test/init.test.js
+++ b/test/init.test.js
@@ -23,7 +23,7 @@ describe('vit init', () => {
test('writes beacon from HTTPS URL', () => {
const result = run('init --beacon https://github.com/solpbc/vit.git', tmpDir, { CLAUDECODE: '1' });
expect(result.exitCode).toBe(0);
- expect(result.stdout).toBe('beacon: vit:github.com/solpbc/vit');
+ expect(result.stdout).toContain('beacon: vit:github.com/solpbc/vit');
const content = readFileSync(join(tmpDir, '.vit', 'config.json'), 'utf-8');
expect(JSON.parse(content).beacon).toBe('vit:github.com/solpbc/vit');
@@ -32,7 +32,7 @@ describe('vit init', () => {
test('writes beacon from SSH URL', () => {
const result = run('init --beacon git@github.com:solpbc/vit.git', tmpDir, { CLAUDECODE: '1' });
expect(result.exitCode).toBe(0);
- expect(result.stdout).toBe('beacon: vit:github.com/solpbc/vit');
+ expect(result.stdout).toContain('beacon: vit:github.com/solpbc/vit');
const content = readFileSync(join(tmpDir, '.vit', 'config.json'), 'utf-8');
expect(JSON.parse(content).beacon).toBe('vit:github.com/solpbc/vit');
@@ -44,6 +44,13 @@ describe('vit init', () => {
expect(existsSync(join(tmpDir, '.vit'))).toBe(true);
});
+ test('generates .vit/README.md on init', () => {
+ run('init --beacon https://github.com/solpbc/vit.git', tmpDir, { CLAUDECODE: '1' });
+ const readme = readFileSync(join(tmpDir, '.vit', 'README.md'), 'utf-8');
+ expect(readme).toContain('social open source network');
+ expect(readme).toContain('v-it.org');
+ });
+
test('overwrites existing beacon silently', () => {
run('init --beacon https://github.com/old/repo.git', tmpDir, { CLAUDECODE: '1' });
run('init --beacon https://github.com/solpbc/vit.git', tmpDir, { CLAUDECODE: '1' });
@@ -59,7 +66,7 @@ describe('vit init', () => {
const result = run('init --beacon .', tmpDir, { CLAUDECODE: '1' });
expect(result.exitCode).toBe(0);
- expect(result.stdout).toBe('beacon: vit:github.com/solpbc/vit');
+ expect(result.stdout).toContain('beacon: vit:github.com/solpbc/vit');
});
test('errors when --beacon . has no git remote', () => {
@@ -150,7 +157,7 @@ describe('vit init', () => {
const result = run('init --beacon .', tmpDir, { CLAUDECODE: '1' });
expect(result.exitCode).toBe(0);
- expect(result.stdout).toBe('beacon: vit:github.com/solpbc/vit');
+ expect(result.stdout).toContain('beacon: vit:github.com/solpbc/vit');
});
test('shows guidance for already initialized repo', () => {