@yukioa2z/visa-apply 3.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.
- package/LICENSE +21 -0
- package/README.md +49 -0
- package/bin/install.js +67 -0
- package/package.json +34 -0
- package/skill/SKILL.md +80 -0
- package/skill/agents/openai.yaml +7 -0
- package/skill/assets/visa-dossier-template.html +601 -0
- package/skill/references/adapter-schema.md +55 -0
- package/skill/references/core-intake.md +66 -0
- package/skill/references/countries/au.md +149 -0
- package/skill/references/countries/ca.md +124 -0
- package/skill/references/countries/jp.md +133 -0
- package/skill/references/countries/schengen.md +183 -0
- package/skill/references/countries/uk.md +144 -0
- package/skill/references/countries/us.md +134 -0
- package/skill/references/jurisdictions.json +1538 -0
- package/skill/references/live-route-check.md +76 -0
- package/skill/references/official-sources.json +1861 -0
- package/skill/references/pipeline.md +104 -0
- package/skill/references/quality-gates.md +52 -0
- package/skill/scripts/create_dossier.py +140 -0
- package/skill/scripts/source_registry.py +386 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yukioa2z
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Visa Apply Skill
|
|
2
|
+
|
|
3
|
+
Research, prepare, review, and track visa applications with current official sources and a local HTML dossier as the single source of truth.
|
|
4
|
+
|
|
5
|
+
[Website](https://yukioa2z.github.io/visa-apply/) · [Source](https://github.com/Yukioa2z/visa-apply)
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npx --yes @yukioa2z/visa-apply
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Then invoke. To just check whether you need a visa:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
Use $visa-apply: I hold an X passport, live in Y, and want to visit Z for two weeks — do I need a visa?
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Many trips end there with a visa-free or ETA answer. To prepare a full application:
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
Use $visa-apply to help me prepare a visa application for my destination and visa type.
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The installer copies the skill to `~/.codex/skills/visa-apply`. For Claude Code, Hermes, OpenClaw, or another agent with a different skill directory:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
npx --yes @yukioa2z/visa-apply -- --dest ~/.claude/skills
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Pipeline
|
|
30
|
+
|
|
31
|
+
1. Resolve destination, passport/status, residence, application location, purpose, dates, arrival mode, and every transit.
|
|
32
|
+
2. Perform a fresh official-source check for visa-free, ETA, eVisa, visa on arrival, consular visa, transit authorization, or residence route.
|
|
33
|
+
3. Build a country and visa-type question path.
|
|
34
|
+
4. Collect raw answers and normalized final values into the HTML dossier.
|
|
35
|
+
5. Build and review the document checklist.
|
|
36
|
+
6. Assist with portal entry after applicant review.
|
|
37
|
+
7. Backfill application IDs, fees, appointments/biometrics, decision, and passport return status.
|
|
38
|
+
|
|
39
|
+
## Coverage
|
|
40
|
+
|
|
41
|
+
The searchable directory contains 250 ISO countries/areas, including the commonly used XK code for Kosovo. Cached official starting sources cover 40 destinations plus the Schengen route area; every other destination triggers live official-source discovery. Full country adapters (rules and document checklist verified against official sources) exist for the United States (DS-160), Schengen (Type C), Canada (IRCC), the United Kingdom, Australia, and Japan; every other destination uses a source-seeded or live-discovered adapter.
|
|
42
|
+
|
|
43
|
+
No cached source stores a visa-free or visa-required answer. Every case must be checked against current destination-government rules for the exact travel document, residence, purpose, date, duration, arrival mode, and transit itinerary. IATA Travel Centre/Timatic or the operating carrier is used as a boarding-document cross-check, not as legal authority.
|
|
44
|
+
|
|
45
|
+
Government immigration, foreign-ministry, and embassy pages are the rule authority. Delegated visa application centres are used only for appointment and submission logistics.
|
|
46
|
+
|
|
47
|
+
The applicant model is global. It keeps citizenship, travel-document issuer, legal residence, current location, consular application location, and transit route separate, including dual nationals, third-country applicants, minors, and holders of refugee or other non-passport travel documents.
|
|
48
|
+
|
|
49
|
+
This skill is not legal advice. The applicant must review all information and handle applicant-only declarations, signatures, certifications, CAPTCHA, and submission.
|
package/bin/install.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const os = require("os");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
|
|
7
|
+
const skillName = "visa-apply";
|
|
8
|
+
const packageRoot = path.resolve(__dirname, "..");
|
|
9
|
+
const sourceDir = path.join(packageRoot, "skill");
|
|
10
|
+
|
|
11
|
+
function usage() {
|
|
12
|
+
console.log(`Install ${skillName}
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
npx @yukioa2z/visa-apply
|
|
16
|
+
npx @yukioa2z/visa-apply -- --dest ~/.claude/skills
|
|
17
|
+
|
|
18
|
+
Options:
|
|
19
|
+
--dest <path> Skill root directory. Defaults to $CODEX_HOME/skills or ~/.codex/skills.
|
|
20
|
+
--dry-run Print the destination without copying files.
|
|
21
|
+
--help Show this help message.
|
|
22
|
+
`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function expandHome(value) {
|
|
26
|
+
if (!value) return value;
|
|
27
|
+
if (value === "~") return os.homedir();
|
|
28
|
+
if (value.startsWith("~/")) return path.join(os.homedir(), value.slice(2));
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function readOption(name) {
|
|
33
|
+
const args = process.argv.slice(2);
|
|
34
|
+
const index = args.indexOf(name);
|
|
35
|
+
if (index === -1) return undefined;
|
|
36
|
+
return args[index + 1];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const args = process.argv.slice(2);
|
|
40
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
41
|
+
usage();
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!fs.existsSync(sourceDir)) {
|
|
46
|
+
console.error(`Skill source not found: ${sourceDir}`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const defaultRoot = process.env.CODEX_HOME
|
|
51
|
+
? path.join(process.env.CODEX_HOME, "skills")
|
|
52
|
+
: path.join(os.homedir(), ".codex", "skills");
|
|
53
|
+
|
|
54
|
+
const destRoot = path.resolve(expandHome(readOption("--dest") || defaultRoot));
|
|
55
|
+
const destDir = path.join(destRoot, skillName);
|
|
56
|
+
|
|
57
|
+
if (args.includes("--dry-run")) {
|
|
58
|
+
console.log(destDir);
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
fs.mkdirSync(destRoot, { recursive: true });
|
|
63
|
+
fs.rmSync(destDir, { recursive: true, force: true });
|
|
64
|
+
fs.cpSync(sourceDir, destDir, { recursive: true });
|
|
65
|
+
|
|
66
|
+
console.log(`Installed ${skillName} to ${destDir}`);
|
|
67
|
+
console.log(`Try: Use $${skillName} to check your visa need and prepare an application dossier.`);
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yukioa2z/visa-apply",
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "Install a global visa-need research and application filing skill.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"visa",
|
|
8
|
+
"immigration",
|
|
9
|
+
"agent",
|
|
10
|
+
"skill",
|
|
11
|
+
"claude-code",
|
|
12
|
+
"codex",
|
|
13
|
+
"ds-160"
|
|
14
|
+
],
|
|
15
|
+
"homepage": "https://yukioa2z.github.io/visa-apply/",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/Yukioa2z/visa-apply.git"
|
|
19
|
+
},
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://github.com/Yukioa2z/visa-apply/issues"
|
|
22
|
+
},
|
|
23
|
+
"bin": {
|
|
24
|
+
"visa-apply": "./bin/install.js"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"bin",
|
|
28
|
+
"skill",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18"
|
|
33
|
+
}
|
|
34
|
+
}
|
package/skill/SKILL.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: visa-apply
|
|
3
|
+
description: Use when checking whether a traveler needs a visa, ETA, eVisa, visa on arrival, or transit authorization, or when researching, preparing, reviewing, tracking, or filling an entry application for any destination. Supports a 250-destination directory, mandatory current official-source verification for the exact passport/residence/itinerary, country and visa-type branching, a local HTML dossier as the single source of truth, and assisted browser/computer form entry after applicant review.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Visa Apply
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Create and maintain a local HTML dossier as the single source of truth for a visa application. Resolve the correct country and visa route from current official sources, collect applicant facts with a country/visa-specific question path, prepare a final form preview and document checklist, then assist with portal entry after applicant review.
|
|
11
|
+
|
|
12
|
+
The most common entry point is a lightweight question — "I hold an X passport, live in Y, want to visit Z for two weeks: do I need a visa?" Answer that first by running the live route check (step 3). Many trips end there with a visa-free or ETA verdict and never need a full application; only continue to detailed intake when a visa is actually required.
|
|
13
|
+
|
|
14
|
+
This skill is not legal advice. The applicant must review every answer and handle any applicant-only declaration, signature, certification, CAPTCHA, and submission.
|
|
15
|
+
|
|
16
|
+
## Required Workflow
|
|
17
|
+
|
|
18
|
+
1. Keep all applicant data local. Personal data collected for the application lives only in the local HTML dossier on the user's machine. Never transmit it to any external service, log it outside the dossier, or use it for any purpose other than this application. This is a hard constraint, not a user setting.
|
|
19
|
+
2. Collect routing facts only: destination, all nationalities or stateless/refugee status, travel-document type and issuing country, legal residence and residence status, actual application location, purpose, dates/duration, and relevant existing visas or residence permits.
|
|
20
|
+
- First, ask whether the trip is a single destination or involves multiple countries or transit. Most applicants are single-destination; assume that unless the user says otherwise. If multiple countries or transit are involved, treat each leg as its own route and run the live check (step 3) separately per leg; a `mixed` verdict means the legs resolve to different routes.
|
|
21
|
+
- Never infer nationality, residence, consular jurisdiction, or form language from the user's location or preferred language.
|
|
22
|
+
- Treat citizenship, legal residence, current physical location, and application location as separate facts.
|
|
23
|
+
3. Run the mandatory live visa-need check before detailed intake.
|
|
24
|
+
- Read `references/live-route-check.md`.
|
|
25
|
+
- Resolve the destination in `references/jurisdictions.json`; cached starting sources are in `references/official-sources.json`.
|
|
26
|
+
- Run `python3 scripts/source_registry.py live-check-plan <country> ...` when useful.
|
|
27
|
+
- Browse current destination-government and responsible-mission sources for the exact passport, residence, purpose, dates, duration, entries, arrival mode, and transit itinerary.
|
|
28
|
+
- Cross-check IATA Travel Centre/Timatic or the operating carrier for boarding requirements. Treat it as operational evidence, not legal authority.
|
|
29
|
+
- Never reuse a static visa-free, ETA, eVisa, visa-on-arrival, or visa-required verdict.
|
|
30
|
+
- If live browsing is unavailable, leave the verdict unresolved and stop; do not substitute model memory.
|
|
31
|
+
4. Stop at the route gate. Record the verdict, conditions, effective dates, transit result, sources, checked timestamp, conflicts, and recheck deadline in the HTML. If unresolved, keep it unresolved and name the next verification action.
|
|
32
|
+
5. Build the question path.
|
|
33
|
+
- Load `references/core-intake.md`.
|
|
34
|
+
- Load the matching full adapter from `references/countries/` when available.
|
|
35
|
+
- For a source-seeded or unsupported destination, use `references/adapter-schema.md` to create a temporary adapter from official sources before detailed intake.
|
|
36
|
+
6. Use the `grill-me` interview pattern. If available, read `/Users/yuuue/.agents/skills/grill-me/SKILL.md`. Ask one question at a time by default and provide a recommended answer format. Use compact, numbered batches only when the user asks for fewer turns.
|
|
37
|
+
7. Update the HTML after every answer batch and milestone.
|
|
38
|
+
- Raw answers and provenance go under `Source: Collected Answers`.
|
|
39
|
+
- Normalized final values go under `Final Visa Application Preview`.
|
|
40
|
+
- Required evidence goes under `Document Checklist`.
|
|
41
|
+
- Uncertainty stays visible under `Open Issues`.
|
|
42
|
+
- No chat note or scratch file may become more authoritative than the HTML.
|
|
43
|
+
8. Run `references/quality-gates.md`, then stop at the applicant review gate before portal entry. Call out inferred values, stale sources, missing documents, expiring evidence, and unresolved conflicts.
|
|
44
|
+
9. Assist with form entry using Browser or Computer Use after review.
|
|
45
|
+
- In non-Codex environments, use the equivalent browser/computer capability, such as Peekaboo or the runtime's supported automation skill.
|
|
46
|
+
- Never bypass CAPTCHA or security controls, invent data, or perform an applicant-only signature/certification.
|
|
47
|
+
10. Backfill application IDs, receipts, appointments/biometrics, document requests, decision status, and passport/visa return details into the HTML.
|
|
48
|
+
|
|
49
|
+
## Dossier Creation
|
|
50
|
+
|
|
51
|
+
Create a dossier from `assets/visa-dossier-template.html` with:
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
python3 scripts/create_dossier.py /path/to/visa-dossier.html \
|
|
55
|
+
--country ca \
|
|
56
|
+
--visa-type "Visitor visa" \
|
|
57
|
+
--form-name "IRCC Portal application" \
|
|
58
|
+
--application-location "Japan, Tokyo" \
|
|
59
|
+
--nationality "Brazil" \
|
|
60
|
+
--travel-document-issuer "Brazil" \
|
|
61
|
+
--legal-residence "Japan" \
|
|
62
|
+
--residence-status "Work permit holder" \
|
|
63
|
+
--purpose "Tourism" \
|
|
64
|
+
--arrival-date "2026-10-01" \
|
|
65
|
+
--duration "14 days" \
|
|
66
|
+
--entries "Single" \
|
|
67
|
+
--arrival-mode "Air" \
|
|
68
|
+
--transit "Singapore, airside"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## References
|
|
72
|
+
|
|
73
|
+
- Full pipeline and source freshness rules: `references/pipeline.md`
|
|
74
|
+
- Universal intake sections: `references/core-intake.md`
|
|
75
|
+
- Country adapter format: `references/adapter-schema.md`
|
|
76
|
+
- Mandatory live visa-need check: `references/live-route-check.md`
|
|
77
|
+
- Submission, document, timing, and privacy gates: `references/quality-gates.md`
|
|
78
|
+
- Searchable destination directory: `references/jurisdictions.json`
|
|
79
|
+
- Official source registry: `references/official-sources.json`
|
|
80
|
+
- Full country adapters: `references/countries/` — United States DS-160 (`us.md`), Schengen Type C (`schengen.md`), Canada IRCC (`ca.md`), United Kingdom (`uk.md`), Australia (`au.md`), Japan (`jp.md`). Every other destination uses a source-seeded or live-discovered adapter.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Visa Apply"
|
|
3
|
+
short_description: "Check visa need, prepare, and track applications."
|
|
4
|
+
default_prompt: "Use $visa-apply to check my current entry route and prepare a local visa application dossier if needed."
|
|
5
|
+
|
|
6
|
+
policy:
|
|
7
|
+
allow_implicit_invocation: true
|